diff --git a/src/routes/postBranding.ts b/src/routes/postBranding.ts index 648cb43..ba5a159 100644 --- a/src/routes/postBranding.ts +++ b/src/routes/postBranding.ts @@ -59,6 +59,11 @@ export async function postBranding(req: Request, res: Response) { await db.prepare("run", `INSERT INTO "titleVotes" ("UUID", "votes", "locked", "shadowHidden") VALUES (?, 0, ?, 0);`, [UUID, isVip ? 1 : 0]); } + + if (isVip) { + // unlock all other titles + await db.prepare("run", `UPDATE "titleVotes" SET "locked" = 0 WHERE "UUID" != ?`, [UUID]); + } } })(), (async () => { if (thumbnail) { @@ -82,6 +87,11 @@ export async function postBranding(req: Request, res: Response) { await db.prepare("run", `INSERT INTO "thumbnailTimestamps" ("UUID", "timestamp") VALUES (?, ?)`, [UUID, (thumbnail as TimeThumbnailSubmission).timestamp]); } + + if (isVip) { + // unlock all other titles + await db.prepare("run", `UPDATE "thumbnailVotes" SET "locked" = 0 WHERE "UUID" != ?`, [UUID]); + } } } })()]); diff --git a/test/cases/postBranding.ts b/test/cases/postBranding.ts index ccc15f1..36b878a 100644 --- a/test/cases/postBranding.ts +++ b/test/cases/postBranding.ts @@ -7,6 +7,7 @@ import { Service } from "../../src/types/segments.model"; describe("postBranding", () => { const vipUser = `VIPPostBrandingUser${".".repeat(16)}`; + const vipUser2 = `VIPPostBrandingUser2${".".repeat(16)}`; const userID1 = `PostBrandingUser1${".".repeat(16)}`; const userID2 = `PostBrandingUser2${".".repeat(16)}`; const userID3 = `PostBrandingUser3${".".repeat(16)}`; @@ -20,15 +21,16 @@ describe("postBranding", () => { data }); - const queryTitleByVideo = (videoID: string) => db.prepare("get", `SELECT * FROM "titles" WHERE "videoID" = ? ORDER BY "timeSubmitted" DESC`, [videoID]); - const queryThumbnailByVideo = (videoID: string) => db.prepare("get", `SELECT * FROM "thumbnails" WHERE "videoID" = ? ORDER BY "timeSubmitted" DESC`, [videoID]); - const queryThumbnailTimestampsByUUID = (UUID: string) => db.prepare("get", `SELECT * FROM "thumbnailTimestamps" WHERE "UUID" = ?`, [UUID]); - const queryTitleVotesByUUID = (UUID: string) => db.prepare("get", `SELECT * FROM "titleVotes" WHERE "UUID" = ?`, [UUID]); - const queryThumbnailVotesByUUID = (UUID: string) => db.prepare("get", `SELECT * FROM "thumbnailVotes" WHERE "UUID" = ?`, [UUID]); + const queryTitleByVideo = (videoID: string, all = false) => db.prepare(all ? "all" : "get", `SELECT * FROM "titles" WHERE "videoID" = ? ORDER BY "timeSubmitted" DESC`, [videoID]); + const queryThumbnailByVideo = (videoID: string, all = false) => db.prepare(all ? "all" : "get", `SELECT * FROM "thumbnails" WHERE "videoID" = ? ORDER BY "timeSubmitted" DESC`, [videoID]); + const queryThumbnailTimestampsByUUID = (UUID: string, all = false) => db.prepare(all ? "all" : "get", `SELECT * FROM "thumbnailTimestamps" WHERE "UUID" = ?`, [UUID]); + const queryTitleVotesByUUID = (UUID: string, all = false) => db.prepare(all ? "all" : "get", `SELECT * FROM "titleVotes" WHERE "UUID" = ?`, [UUID]); + const queryThumbnailVotesByUUID = (UUID: string, all = false) => db.prepare(all ? "all" : "get", `SELECT * FROM "thumbnailVotes" WHERE "UUID" = ?`, [UUID]); before(() => { const insertVipUserQuery = 'INSERT INTO "vipUsers" ("userID") VALUES (?)'; db.prepare("run", insertVipUserQuery, [getHash(vipUser)]); + db.prepare("run", insertVipUserQuery, [getHash(vipUser2)]); }); it("Submit only title", async () => { @@ -216,6 +218,51 @@ describe("postBranding", () => { assert.strictEqual(dbThumbnailVotes.shadowHidden, 0); }); + it("Submit another title and thumbnail as VIP unlocks others", async () => { + const videoID = "postBrand6"; + const title = { + title: "Some other title", + original: false + }; + const thumbnail = { + timestamp: 15.42, + original: false + }; + + const res = await postBranding({ + title, + thumbnail, + userID: vipUser2, + service: Service.YouTube, + videoID + }); + + assert.strictEqual(res.status, 200); + const dbTitles = await queryTitleByVideo(videoID, true); + const dbTitleVotes = await queryTitleVotesByUUID(dbTitles[0].UUID); + const dbTitleVotesOld = await queryTitleVotesByUUID(dbTitles[1].UUID); + const dbThumbnails = await queryThumbnailByVideo(videoID, true); + const dbThumbnailTimestamps = await queryThumbnailTimestampsByUUID(dbThumbnails[0].UUID); + const dbThumbnailVotes = await queryThumbnailVotesByUUID(dbThumbnails[0].UUID); + const dbThumbnailVotesOld = await queryThumbnailVotesByUUID(dbThumbnails[1].UUID); + + assert.strictEqual(dbTitles[0].title, title.title); + assert.strictEqual(dbTitles[0].original, title.original ? 1 : 0); + + assert.strictEqual(dbTitleVotes.votes, 0); + assert.strictEqual(dbTitleVotes.locked, 1); + assert.strictEqual(dbTitleVotes.shadowHidden, 0); + assert.strictEqual(dbTitleVotesOld.locked, 0); + + assert.strictEqual(dbThumbnailTimestamps.timestamp, thumbnail.timestamp); + assert.strictEqual(dbThumbnails[0].original, thumbnail.original ? 1 : 0); + + assert.strictEqual(dbThumbnailVotes.votes, 0); + assert.strictEqual(dbThumbnailVotes.locked, 1); + assert.strictEqual(dbThumbnailVotes.shadowHidden, 0); + assert.strictEqual(dbThumbnailVotesOld.locked, 0); + }); + it("Vote the same title again", async () => { const videoID = "postBrand1"; const title = {