sendou.ink/migrations/032-q.js
Kalle e7bbb565be
SendouQ (#1455)
* Tables

* Clocks

* Maplist preference selector

* Fix SSR

* Nav icon

* RankedOrScrim

* Map pool

* Create group

* Redirect logic

* Persist map pool

* Advance from preparing page

* Rename query

* Fix merge

* Fix migration order

* Seed groups

* Find looking groups SQL

* Renders something

* More UI work

* Back to 30min

* Likes/dislikes

* Always return own group

* Fix like order

* 3 tc/rm/cb -> 2

* Show only 3 weapons

* Pass group size

* Handle both liked and liked by same group

* Fix SQL

* Group preference frontend work

* Morphing

* Styling

* Don't show group controls if not manager

* Give/remove manager

* Leave group

* Leave with confirm

* Delete likes when morphing groups

* Clocks consistency

* Remove bad invariant

* Persist settings to local storage

* Fix initial value flashing

* Fix never resolving loading indicator

* REFRESH_GROUP

* Flip animations

* Tweaks

* Auto refresh logic

* Groups of 4 seed

* Reduce throwing

* Load full groups initial

* Create match

* Match UI initial

* Score reporter initial

* Push footer down on match page

* Score reporter knows when set ended

* Score reporting untested

* Show score after report

* Align better

* Look again with same group functionality

* More migrations

* Team on match page

* Show confirmer before reporting score

* Report weapons

* Report weapos again by admin + skill changing

* Handle no tiebreaker given to MapPool

* Remove unranked

* Remove support for "team id skill"

* no-wrap -> nowrap

* Preparing page work

* Use common GroupCard component

* Add some metas

* MemberAdder in looking page

* Fix GroupCard actions

* Fix SZ only map list including other modes

* Add season info

* Prompt login

* Joining team

* Manage group on preparing page

* Manage group on preparing page

* Seed past matches

* Add to seed

* No map list preference when full group + fix expiry

* Fix skill matchesCount calculation

* Tiers initial work

* Some progress on tiers

* Tiering logic

* MMR in group cards

* Name to challenge

* Team MMR

* Big team rank icons

* Adjust todos

* Match score report with confirm

* Allow regular members to report score

* Handle reporting weapons edge cases

* Add tier images

* Improve GroupCard spacing

* Refactor looking page

* Looking mobile UI

* Calculate skill only for current season

* Divide groups visually when reporting weapons

* Fix match page weapons sorting

* Add cache to user skills+tier calculation

* Admin report match score

* Initial leaderboard

* Cached leaderboard

* Weapon category lb's

* Populate SkillTeamUser in SendouQ

* Team leaderboard filtered down

* Add TODOs

* Seasons initlal

* Season weapons initial

* Weapons stylized

* Show rest weapons as +

* Hide peak if same as current

* Load matches SQL initial

* Season matches UI initial

* Take user id in account

* Add weapons

* Paginated matches

* Fix pages count logic

* Scroll top on data change

* Day headers for matches

* Link from user page to user seasons page

* Summarize maps + ui initial

* Map stats

* Player info tabs

* MMR chart

* Chart adjustments

* Handle basing team MMR on player MMR

* Set initial MMR

* Add info about discord to match page

* Season support to tournaments

* Get tournament skills as well for the graph

* WIP

* New team rating logic + misc other

* tiered -> tiered.server

* Update season starting time

* TODOs

* Add rules page

* Hide elements correctly when off-season

* Fix crash when only one player with skill

* How-to video

* Fix StartRank showing when not logged in

* Make user leaderboard the default

* Make Skill season non-nullable

* Add suggested pass to match

* Add rule

* identifierToUserIds helper

* Fix tiers not showing
2023-08-12 22:42:54 +03:00

201 lines
6.3 KiB
JavaScript

module.exports.up = function (db) {
db.transaction(() => {
db.prepare(`delete from "Skill"`).run();
db.prepare(`create index skill_identifier on "Skill"("identifier")`).run();
db.prepare(
/* sql */ `alter table "MapPoolMap" add "groupId" integer`
).run();
db.prepare(
`create index map_pool_map_group_id on "MapPoolMap"("groupId")`
).run();
db.prepare(
/* sql */ `alter table "Skill" add "groupMatchId" integer`
).run();
db.prepare(
`create index skill_group_match_id on "Skill"("groupMatchId")`
).run();
db.prepare(
/* sql */ `alter table "Skill" add "season" integer not null`
).run();
db.prepare(/*sql*/ `drop table "MapResult"`).run();
db.prepare(/*sql*/ `drop table "PlayerResult"`).run();
db.prepare(
/*sql*/ `
create table "MapResult" (
"mode" text not null,
"stageId" integer not null,
"userId" integer not null,
"wins" integer not null,
"losses" integer not null,
"season" integer not null,
foreign key ("userId") references "User"("id") on delete cascade,
unique("userId", "stageId", "mode", "season") on conflict rollback
) strict
`
).run();
db.prepare(
`create index map_result_user_id on "MapResult"("userId")`
).run();
db.prepare(
/*sql*/ `
create table "PlayerResult" (
"ownerUserId" integer not null,
"otherUserId" integer not null,
"mapWins" integer not null,
"mapLosses" integer not null,
"setWins" integer not null,
"setLosses" integer not null,
"type" text not null,
"season" integer not null,
foreign key ("ownerUserId") references "User"("id") on delete cascade,
foreign key ("otherUserId") references "User"("id") on delete cascade,
unique("ownerUserId", "otherUserId", "type", "season") on conflict rollback
) strict
`
).run();
db.prepare(
`create index player_result_owner_user_id on "PlayerResult"("ownerUserId")`
).run();
db.prepare(
`create index player_result_other_user_id on "PlayerResult"("otherUserId")`
).run();
db.prepare(
/*sql*/ `
create table "Group" (
"id" integer primary key,
"teamId" integer,
"createdAt" integer default (strftime('%s', 'now')) not null,
"latestActionAt" integer default (strftime('%s', 'now')) not null,
"mapListPreference" text not null,
"inviteCode" text not null,
"status" text not null,
foreign key ("teamId") references "AllTeam"("id") on delete restrict
) strict
`
).run();
db.prepare(`create index group_team_id on "Group"("teamId")`).run();
db.prepare(
/*sql*/ `
create table "GroupMember" (
"groupId" integer not null,
"userId" integer not null,
"role" text not null,
"createdAt" integer default (strftime('%s', 'now')) not null,
foreign key ("userId") references "User"("id") on delete restrict,
foreign key ("groupId") references "Group"("id") on delete cascade,
unique("userId", "groupId") on conflict rollback
) strict
`
).run();
db.prepare(
`create index group_member_group_id on "GroupMember"("groupId")`
).run();
db.prepare(
`create index group_member_user_id on "GroupMember"("userId")`
).run();
db.prepare(
/*sql*/ `
create table "GroupLike" (
"likerGroupId" integer not null,
"targetGroupId" integer not null,
"createdAt" integer default (strftime('%s', 'now')) not null,
foreign key ("likerGroupId") references "Group"("id") on delete cascade,
foreign key ("targetGroupId") references "Group"("id") on delete cascade,
unique("likerGroupId", "targetGroupId") on conflict rollback
) strict
`
).run();
db.prepare(
`create index group_like_liker_group_id on "GroupLike"("likerGroupId")`
).run();
db.prepare(
`create index group_like_target_group_id on "GroupLike"("targetGroupId")`
).run();
db.prepare(
/*sql*/ `
create table "GroupMatch" (
"id" integer primary key,
"alphaGroupId" integer not null,
"bravoGroupId" integer not null,
"createdAt" integer default (strftime('%s', 'now')) not null,
"reportedAt" integer,
"reportedByUserId" integer,
foreign key ("alphaGroupId") references "Group"("id") on delete restrict,
foreign key ("bravoGroupId") references "Group"("id") on delete restrict,
foreign key ("reportedByUserId") references "User"("id") on delete restrict,
unique("alphaGroupId") on conflict rollback,
unique("bravoGroupId") on conflict rollback
) strict
`
).run();
db.prepare(
`create index group_match_alpha_group_id on "GroupMatch"("alphaGroupId")`
).run();
db.prepare(
`create index group_match_bravo_group_id on "GroupMatch"("bravoGroupId")`
).run();
db.prepare(
`create index group_match_reported_by_user_id on "GroupMatch"("reportedByUserId")`
).run();
db.prepare(
/*sql*/ `
create table "GroupMatchMap" (
"id" integer primary key,
"matchId" integer not null,
"index" integer not null,
"mode" text not null,
"stageId" integer not null,
"source" text not null,
"winnerGroupId" integer,
foreign key ("matchId") references "GroupMatch"("id") on delete cascade,
foreign key ("winnerGroupId") references "Group"("id") on delete restrict,
unique("matchId", "index") on conflict rollback
) strict
`
).run();
db.prepare(
`create index group_match_map_match_id on "GroupMatchMap"("matchId")`
).run();
db.prepare(
`create index group_match_map_winner_group_id on "GroupMatchMap"("winnerGroupId")`
).run();
db.prepare(
/*sql*/ `
create table "ReportedWeapon" (
"groupMatchMapId" integer,
"weaponSplId" integer not null,
"userId" integer not null,
foreign key ("groupMatchMapId") references "GroupMatchMap"("id") on delete restrict,
foreign key ("userId") references "User"("id") on delete restrict,
unique("groupMatchMapId", "userId") on conflict rollback
) strict
`
).run();
db.prepare(
`create index reported_weapon_group_match_map_id on "ReportedWeapon"("groupMatchMapId")`
).run();
db.prepare(
`create index reported_weapon_user_id on "ReportedWeapon"("userId")`
).run();
})();
};