mirror of
https://github.com/zoriya/Kyoo.git
synced 2025-05-24 02:02:36 -04:00
Sql cleanups
This commit is contained in:
parent
69006478cb
commit
4cf67c3247
@ -187,7 +187,7 @@ export const historyH = new Elysia({ tags: ["profiles"] })
|
|||||||
.select(
|
.select(
|
||||||
db
|
db
|
||||||
.select({
|
.select({
|
||||||
profilePk: sql<number>`${profilePk}`,
|
profilePk: sql`${profilePk}`,
|
||||||
entryPk: entries.pk,
|
entryPk: entries.pk,
|
||||||
videoPk: videos.pk,
|
videoPk: videos.pk,
|
||||||
percent: sql`hist.percent::integer`,
|
percent: sql`hist.percent::integer`,
|
||||||
@ -227,6 +227,7 @@ export const historyH = new Elysia({ tags: ["profiles"] })
|
|||||||
),
|
),
|
||||||
)
|
)
|
||||||
.orderBy(nextEntry.showPk, entries.order)
|
.orderBy(nextEntry.showPk, entries.order)
|
||||||
|
.limit(1)
|
||||||
.as("nextEntryQ");
|
.as("nextEntryQ");
|
||||||
|
|
||||||
const seenCountQ = db
|
const seenCountQ = db
|
||||||
@ -247,8 +248,7 @@ export const historyH = new Elysia({ tags: ["profiles"] })
|
|||||||
),
|
),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
)
|
);
|
||||||
.as("seenCountQ");
|
|
||||||
|
|
||||||
await db
|
await db
|
||||||
.insert(watchlist)
|
.insert(watchlist)
|
||||||
@ -260,16 +260,16 @@ export const historyH = new Elysia({ tags: ["profiles"] })
|
|||||||
status: sql`
|
status: sql`
|
||||||
case
|
case
|
||||||
when
|
when
|
||||||
hist.progress >= 95
|
hist.percent::integer >= 95
|
||||||
and ${nextEntryQ.pk} is null
|
and ${nextEntryQ.pk} is null
|
||||||
then 'completed'::watchstatus
|
then 'completed'::watchlist_status
|
||||||
else 'watching'::watchstatus
|
else 'watching'::watchlist_status
|
||||||
end
|
end
|
||||||
`,
|
`,
|
||||||
seenCount: sql`
|
seenCount: sql`
|
||||||
case
|
case
|
||||||
when ${eq(entries.kind, "movie")} then hist.progress::number
|
when ${entries.kind} = 'movie' then hist.percent::integer
|
||||||
when hist.progress >= 95 then 1
|
when hist.percent::integer >= 95 then 1
|
||||||
else 0
|
else 0
|
||||||
end
|
end
|
||||||
`,
|
`,
|
||||||
@ -282,6 +282,8 @@ export const historyH = new Elysia({ tags: ["profiles"] })
|
|||||||
else null
|
else null
|
||||||
end
|
end
|
||||||
`,
|
`,
|
||||||
|
// see https://github.com/drizzle-team/drizzle-orm/issues/3608
|
||||||
|
updatedAt: sql`now()`,
|
||||||
})
|
})
|
||||||
.from(vals)
|
.from(vals)
|
||||||
.leftJoin(
|
.leftJoin(
|
||||||
@ -297,26 +299,26 @@ export const historyH = new Elysia({ tags: ["profiles"] })
|
|||||||
),
|
),
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
.leftLateralJoin(nextEntryQ, sql`true`),
|
.leftJoinLateral(nextEntryQ, sql`true`),
|
||||||
)
|
)
|
||||||
.onConflictDoUpdate({
|
.onConflictDoUpdate({
|
||||||
target: [watchlist.profilePk, watchlist.showPk],
|
target: [watchlist.profilePk, watchlist.showPk],
|
||||||
set: {
|
set: {
|
||||||
status: sql`
|
status: sql`
|
||||||
case
|
case
|
||||||
when ${eq(sql`excluded.status`, "completed")} then excluded.status
|
when excluded.status = 'completed' then excluded.status
|
||||||
when ${and(
|
when
|
||||||
ne(watchlist.status, "completed"),
|
${watchlist.status} != 'completed'
|
||||||
ne(watchlist.status, "rewatching"),
|
and ${watchlist.status} != 'rewatching'
|
||||||
)} then excluded.status
|
then excluded.status
|
||||||
else ${watchlist.status}
|
else ${watchlist.status}
|
||||||
end
|
end
|
||||||
`,
|
`,
|
||||||
seenCount: sql`${seenCountQ.c}`,
|
seenCount: sql`${seenCountQ}`,
|
||||||
nextEntry: sql`
|
nextEntry: sql`
|
||||||
case
|
case
|
||||||
when ${eq(watchlist.status, "completed")} then null
|
when ${watchlist.status} = 'completed' then null
|
||||||
else excluded.nextEntry
|
else excluded.next_entry
|
||||||
end
|
end
|
||||||
`,
|
`,
|
||||||
completedAt: coalesce(
|
completedAt: coalesce(
|
||||||
|
@ -95,10 +95,14 @@ export function values(items: Record<string, unknown>[]) {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
export const coalesce = <T>(val: SQL<T> | Column, def: SQL<T>) => {
|
export const coalesce = <T>(val: SQL<T> | Column, def: SQL<T> | Column) => {
|
||||||
return sql<T>`coalesce(${val}, ${def})`;
|
return sql<T>`coalesce(${val}, ${def})`;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export const nullif = <T>(val: SQL<T> | Column, eq: SQL<T>) => {
|
||||||
|
return sql<T>`nullif(${val}, ${eq})`;
|
||||||
|
};
|
||||||
|
|
||||||
export const jsonbObjectAgg = <T>(key: SQLWrapper, value: SQL<T>) => {
|
export const jsonbObjectAgg = <T>(key: SQLWrapper, value: SQL<T>) => {
|
||||||
return sql<
|
return sql<
|
||||||
Record<string, T>
|
Record<string, T>
|
||||||
|
@ -143,7 +143,7 @@ describe("Set & get history", () => {
|
|||||||
expect(body.items[1].watchStatus).toMatchObject({
|
expect(body.items[1].watchStatus).toMatchObject({
|
||||||
status: "completed",
|
status: "completed",
|
||||||
percent: 100,
|
percent: 100,
|
||||||
startedAt: "2025-02-02 00:00:00+00",
|
completedAt: "2025-02-02 00:00:00+00",
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
Loading…
x
Reference in New Issue
Block a user