From d19f1ac00494cb8fbec876edc28ef64873db6dca Mon Sep 17 00:00:00 2001 From: BemaniWitch Date: Sun, 25 Oct 2020 21:27:18 -0400 Subject: [PATCH] idz: Add idz_weekly_missions table --- schema/init/idz.sql | 13 +++++ schema/migrate/M0017-idz-v2-support.sql | 13 +++++ src/idz/userdb/handler/loadProfile.ts | 2 + src/idz/userdb/model/index.ts | 1 + src/idz/userdb/model/weeklyMissions.ts | 9 ++++ src/idz/userdb/repo.ts | 11 ++++ src/idz/userdb/request/saveProfile.ts | 2 + src/idz/userdb/response/loadProfile.ts | 2 + src/idz/userdb/sql/index.ts | 5 ++ src/idz/userdb/sql/weeklyMissions.ts | 72 +++++++++++++++++++++++++ 10 files changed, 130 insertions(+) create mode 100644 src/idz/userdb/model/weeklyMissions.ts create mode 100644 src/idz/userdb/sql/weeklyMissions.ts diff --git a/schema/init/idz.sql b/schema/init/idz.sql index 5911826..9084f02 100644 --- a/schema/init/idz.sql +++ b/schema/init/idz.sql @@ -265,3 +265,16 @@ create table "idz_team_reservation" ( "join_time" timestamp not null, "leader" boolean not null ); + +create table "idz_weekly_missions" ( + "id" integer primary key not null + references "idz_profile"("id") + on delete cascade, + "weekly_reset" timestamp not null, + "mission_left" integer not null, + "progress_left" integer not null, + "params_left" integer not null, + "mission_right" integer not null, + "progress_right" integer not null, + "params_right" integer not null +); diff --git a/schema/migrate/M0017-idz-v2-support.sql b/schema/migrate/M0017-idz-v2-support.sql index 4e5e622..8a88986 100644 --- a/schema/migrate/M0017-idz-v2-support.sql +++ b/schema/migrate/M0017-idz-v2-support.sql @@ -29,6 +29,19 @@ create table "idz_stamp_unlock" ( constraint "idz_stamp_unlock_uq" unique ("profile_id", "stamp_no") ); +create table "idz_weekly_missions" ( + "id" integer primary key not null + references "idz_profile"("id") + on delete cascade, + "weekly_reset" timestamp not null, + "mission_left" integer not null, + "progress_left" integer not null, + "params_left" integer not null, + "mission_right" integer not null, + "progress_right" integer not null, + "params_right" integer not null +); + insert into "new_idz_settings" ( "id", "music", diff --git a/src/idz/userdb/handler/loadProfile.ts b/src/idz/userdb/handler/loadProfile.ts index 409570a..cc35ff5 100644 --- a/src/idz/userdb/handler/loadProfile.ts +++ b/src/idz/userdb/handler/loadProfile.ts @@ -30,6 +30,7 @@ export async function loadProfile( const team = teamId && (await w.teams().load(teamId)); const stamps = await w.stamps().loadAll(profileId); const selectedStamps = await w.stamps().loadSelection(profileId); + const weeklyMissions = await w.weeklyMissions().load(profileId); return { type: "load_profile_res", @@ -55,5 +56,6 @@ export async function loadProfile( tickets, stamps, selectedStamps, + weeklyMissions, }; } diff --git a/src/idz/userdb/model/index.ts b/src/idz/userdb/model/index.ts index 3505586..4802903 100644 --- a/src/idz/userdb/model/index.ts +++ b/src/idz/userdb/model/index.ts @@ -17,3 +17,4 @@ export { Team, TeamAuto, TeamMember } from "./team"; export { Tickets } from "./tickets"; export { TimeAttackScore } from "./timeAttack"; export { Unlocks } from "./unlocks"; +export { WeeklyMissions } from "./weeklyMissions"; diff --git a/src/idz/userdb/model/weeklyMissions.ts b/src/idz/userdb/model/weeklyMissions.ts new file mode 100644 index 0000000..d2b5daa --- /dev/null +++ b/src/idz/userdb/model/weeklyMissions.ts @@ -0,0 +1,9 @@ +export interface WeeklyMissions { + weeklyReset: Date; + weeklyMissionLeft: number; + weeklyProgressLeft: number; + weeklyParamsLeft: number; + weeklyMissionRight: number; + weeklyProgressRight: number; + weeklyParamsRight: number; +} diff --git a/src/idz/userdb/repo.ts b/src/idz/userdb/repo.ts index 4281103..55e1935 100644 --- a/src/idz/userdb/repo.ts +++ b/src/idz/userdb/repo.ts @@ -156,6 +156,15 @@ export interface TimeAttackRepository { ): Promise; } +export interface WeeklyMissionsRepository { + load(profileId: Id): Promise; + + save( + profileId: Id, + weeklyMissions: Model.WeeklyMissions + ): Promise; +} + export interface Repositories { backgrounds(): FlagRepository; @@ -192,4 +201,6 @@ export interface Repositories { titles(): FlagRepository; unlocks(): FacetRepository; + + weeklyMissions(): WeeklyMissionsRepository; } diff --git a/src/idz/userdb/request/saveProfile.ts b/src/idz/userdb/request/saveProfile.ts index 78aa860..da4b61e 100644 --- a/src/idz/userdb/request/saveProfile.ts +++ b/src/idz/userdb/request/saveProfile.ts @@ -6,6 +6,7 @@ import { SelectedStamps } from "../model/stamps"; import { Story } from "../model/story"; import { Tickets } from "../model/tickets"; import { Unlocks } from "../model/unlocks"; +import { WeeklyMissions } from "../model/weeklyMissions"; import { AimeId } from "../../../model"; export interface SaveProfileRequest { @@ -29,4 +30,5 @@ export interface SaveProfileRequest { settings: Settings; selectedStamps?: SelectedStamps; stamps?: Set; + weeklyMissions?: WeeklyMissions; } diff --git a/src/idz/userdb/response/loadProfile.ts b/src/idz/userdb/response/loadProfile.ts index 4c6c69f..128d67b 100644 --- a/src/idz/userdb/response/loadProfile.ts +++ b/src/idz/userdb/response/loadProfile.ts @@ -8,6 +8,7 @@ import { Story } from "../model/story"; import { Tickets } from "../model/tickets"; import { TimeAttackScore } from "../model/timeAttack"; import { Unlocks } from "../model/unlocks"; +import { WeeklyMissions } from "../model/weeklyMissions"; import { AimeId } from "../../../model"; export interface LoadProfileResponse { @@ -34,5 +35,6 @@ export interface LoadProfileResponse { tickets: Tickets; stamps: Set; selectedStamps: SelectedStamps; + weeklyMissions: WeeklyMissions; // giga TODO } diff --git a/src/idz/userdb/sql/index.ts b/src/idz/userdb/sql/index.ts index ea28283..486a908 100644 --- a/src/idz/userdb/sql/index.ts +++ b/src/idz/userdb/sql/index.ts @@ -15,6 +15,7 @@ import { SqlTicketsRepository } from "./tickets"; import { SqlTimeAttackRepository } from "./timeAttack"; import { SqlTitlesRepository } from "./titles"; import { SqlUnlocksRepository } from "./unlocks"; +import { SqlWeeklyMissionsRepository } from "./weeklyMissions"; import * as Model from "../model"; import * as Repo from "../repo"; import { Transaction } from "../../../sql"; @@ -89,4 +90,8 @@ export class SqlRepositories implements Repo.Repositories { unlocks(): Repo.FacetRepository { return new SqlUnlocksRepository(this._txn); } + + weeklyMissions(): Repo.WeeklyMissionsRepository { + return new SqlWeeklyMissionsRepository(this._txn); + } } diff --git a/src/idz/userdb/sql/weeklyMissions.ts b/src/idz/userdb/sql/weeklyMissions.ts new file mode 100644 index 0000000..b46ebba --- /dev/null +++ b/src/idz/userdb/sql/weeklyMissions.ts @@ -0,0 +1,72 @@ +import sql from "sql-bricks-postgres"; + +import { WeeklyMissions } from "../model/weeklyMissions"; +import { Profile } from "../model/profile"; +import { WeeklyMissionsRepository } from "../repo"; +import { Id } from "../../../model"; +import { Transaction } from "../../../sql"; + +const defaultWeeklyMissions: WeeklyMissions = { + weeklyReset: new Date(), + weeklyMissionLeft: 0, + weeklyProgressLeft: 0, + weeklyParamsLeft: 0, + weeklyMissionRight: 0, + weeklyProgressRight: 0, + weeklyParamsRight: 0, +}; + +export class SqlWeeklyMissionsRepository implements WeeklyMissionsRepository { + constructor(private readonly _txn: Transaction) {} + + async load(profileId: Id): Promise { + const loadSql = sql + .select("wm.*") + .from("idz_weekly_missions wm") + .where("wm.id", profileId); + + const row = await this._txn.fetchRow(loadSql); + + if (row === undefined) { + return { ...defaultWeeklyMissions }; + } + + return { + weeklyReset: new Date(row.weekly_reset!), + weeklyMissionLeft: parseInt(row.mission_left!), + weeklyProgressLeft: parseInt(row.progress_left!), + weeklyParamsLeft: parseInt(row.params_left!), + weeklyMissionRight: parseInt(row.mission_right!), + weeklyProgressRight: parseInt(row.progress_right!), + weeklyParamsRight: parseInt(row.params_right!), + }; + } + + async save( + profileId: Id, + weeklyMissions: WeeklyMissions + ): Promise { + const saveSql = sql + .insert("idz_weekly_missions", { + id: profileId, + weekly_reset: weeklyMissions.weeklyReset, + mission_left: weeklyMissions.weeklyMissionLeft, + progress_left: weeklyMissions.weeklyProgressLeft, + params_left: weeklyMissions.weeklyParamsLeft, + mission_right: weeklyMissions.weeklyMissionRight, + progress_right: weeklyMissions.weeklyProgressRight, + params_right: weeklyMissions.weeklyParamsRight, + }) + .onConflict("profile_id") + .doUpdate([ + "weekly_reset", + "mission_left", + "progress_left", + "params_left", + "mission_right", + "progress_right", + "params_right", + ]); + await this._txn.modify(saveSql); + } +}