pregenerated segments, tolerant matching, profile segment list, segment map
This commit is contained in:
@@ -450,6 +450,51 @@ export function segmentLeaderboard(segmentId: number): {
|
||||
}[];
|
||||
}
|
||||
|
||||
/** All segments a user has completed, with their best time, attempts, and rank. */
|
||||
export function userSegments(userId: number): {
|
||||
id: number;
|
||||
name: string;
|
||||
distance_m: number;
|
||||
elev_gain_m: number;
|
||||
attempts: number;
|
||||
best_s: number | null;
|
||||
rank: number | null;
|
||||
}[] {
|
||||
return db
|
||||
.prepare(
|
||||
`SELECT s.id, s.name, s.distance_m, s.elev_gain_m,
|
||||
count(e.id) attempts,
|
||||
min(e.elapsed_s) best_s,
|
||||
CASE WHEN min(e.elapsed_s) IS NULL THEN NULL ELSE (
|
||||
SELECT count(*) + 1 FROM (
|
||||
SELECT min(e2.elapsed_s) b FROM segment_efforts e2
|
||||
WHERE e2.segment_id = s.id AND e2.elapsed_s IS NOT NULL AND e2.user_id != @userId
|
||||
GROUP BY e2.user_id
|
||||
) others WHERE others.b < min(e.elapsed_s)
|
||||
) END rank
|
||||
FROM segments s JOIN segment_efforts e ON e.segment_id = s.id AND e.user_id = @userId
|
||||
GROUP BY s.id ORDER BY attempts DESC, s.name`
|
||||
)
|
||||
.all({ userId }) as {
|
||||
id: number;
|
||||
name: string;
|
||||
distance_m: number;
|
||||
elev_gain_m: number;
|
||||
attempts: number;
|
||||
best_s: number | null;
|
||||
rank: number | null;
|
||||
}[];
|
||||
}
|
||||
|
||||
export function deleteSegment(id: number, userId: number): boolean {
|
||||
// creators may delete their segments; system-generated ones (no creator)
|
||||
// may be removed by any signed-in user
|
||||
const result = db
|
||||
.prepare('DELETE FROM segments WHERE id = ? AND (creator_id = ? OR creator_id IS NULL)')
|
||||
.run(id, userId);
|
||||
return result.changes > 0;
|
||||
}
|
||||
|
||||
export function segmentEffortsForActivity(activityId: number): { segment_id: number; name: string; elapsed_s: number | null }[] {
|
||||
return db
|
||||
.prepare(
|
||||
|
||||
Reference in New Issue
Block a user