From 78359daac680ba42b7f4c7c48fbc5e56a7941bd2 Mon Sep 17 00:00:00 2001 From: Johann150 Date: Wed, 3 Jan 2024 00:01:25 +0100 Subject: [PATCH] server: remove denormalized note visibility field Changelog: Fixed --- .../1704236065406-removeNoteVisibility.js | 10 +++ packages/backend/package.json | 2 +- packages/backend/src/models/entities/poll.ts | 6 -- packages/backend/src/server/api/endpoints.ts | 2 - .../endpoints/notes/polls/recommendation.ts | 83 ------------------- packages/backend/src/services/note/create.ts | 1 - packages/foundkey-js/src/api.types.ts | 1 - 7 files changed, 11 insertions(+), 94 deletions(-) create mode 100644 packages/backend/migration/1704236065406-removeNoteVisibility.js delete mode 100644 packages/backend/src/server/api/endpoints/notes/polls/recommendation.ts diff --git a/packages/backend/migration/1704236065406-removeNoteVisibility.js b/packages/backend/migration/1704236065406-removeNoteVisibility.js new file mode 100644 index 000000000..eeb2c4305 --- /dev/null +++ b/packages/backend/migration/1704236065406-removeNoteVisibility.js @@ -0,0 +1,10 @@ +export class removeNoteVisibility1704236065406 { + async up(queryRunner) { + await queryRunner.query(`ALTER TABLE "poll" DROP COLUMN "noteVisibility"`); + await queryRunner.query(`DROP TYPE "poll_notevisibility_enum"`); + } + async down(queryRunner) { + await queryRunner.query(`CREATE TYPE "poll_notevisibility_enum" AS ENUM('public', 'home', 'followers', 'specified')`); + await queryRunner.query(`ALTER TABLE "poll" ADD "noteVisibility" "poll_notevisibility_enum" NOT NULL`); + } +} diff --git a/packages/backend/package.json b/packages/backend/package.json index bbc058bd1..29d08054d 100644 --- a/packages/backend/package.json +++ b/packages/backend/package.json @@ -9,7 +9,7 @@ "watch": "node watch.mjs", "lint": "tsc --noEmit --skipLibCheck && eslint src --ext .ts", "mocha": "NODE_ENV=test mocha", - "migrate": "npx typeorm migration:run -d ormconfig.js", + "migrate": "yarn exec typeorm migration:run -d ormconfig.js", "start": "node --experimental-json-modules ./built/index.js", "start:test": "NODE_ENV=test node --experimental-json-modules ./built/index.js", "test": "npm run mocha" diff --git a/packages/backend/src/models/entities/poll.ts b/packages/backend/src/models/entities/poll.ts index 2e90a24d8..abd71bafa 100644 --- a/packages/backend/src/models/entities/poll.ts +++ b/packages/backend/src/models/entities/poll.ts @@ -34,12 +34,6 @@ export class Poll { public votes: number[]; //#region Denormalized fields - @Column('enum', { - enum: noteVisibilities, - comment: '[Denormalized]', - }) - public noteVisibility: typeof noteVisibilities[number]; - @Index() @Column({ ...id(), diff --git a/packages/backend/src/server/api/endpoints.ts b/packages/backend/src/server/api/endpoints.ts index 2b07458c2..54fe7a0a4 100644 --- a/packages/backend/src/server/api/endpoints.ts +++ b/packages/backend/src/server/api/endpoints.ts @@ -220,7 +220,6 @@ import * as ep___notes_globalTimeline from './endpoints/notes/global-timeline.js import * as ep___notes_hybridTimeline from './endpoints/notes/hybrid-timeline.js'; import * as ep___notes_localTimeline from './endpoints/notes/local-timeline.js'; import * as ep___notes_mentions from './endpoints/notes/mentions.js'; -import * as ep___notes_polls_recommendation from './endpoints/notes/polls/recommendation.js'; import * as ep___notes_polls_vote from './endpoints/notes/polls/vote.js'; import * as ep___notes_reactions from './endpoints/notes/reactions.js'; import * as ep___notes_reactions_create from './endpoints/notes/reactions/create.js'; @@ -515,7 +514,6 @@ const eps = [ ['notes/hybrid-timeline', ep___notes_hybridTimeline], ['notes/local-timeline', ep___notes_localTimeline], ['notes/mentions', ep___notes_mentions], - ['notes/polls/recommendation', ep___notes_polls_recommendation], ['notes/polls/vote', ep___notes_polls_vote], ['notes/reactions', ep___notes_reactions], ['notes/reactions/create', ep___notes_reactions_create], diff --git a/packages/backend/src/server/api/endpoints/notes/polls/recommendation.ts b/packages/backend/src/server/api/endpoints/notes/polls/recommendation.ts deleted file mode 100644 index 177f4c80a..000000000 --- a/packages/backend/src/server/api/endpoints/notes/polls/recommendation.ts +++ /dev/null @@ -1,83 +0,0 @@ -import { Brackets, In } from 'typeorm'; -import { Polls, Mutings, Notes, PollVotes } from '@/models/index.js'; -import define from '@/server/api/define.js'; - -export const meta = { - tags: ['notes'], - - requireCredential: true, - - res: { - type: 'array', - optional: false, nullable: false, - items: { - type: 'object', - optional: false, nullable: false, - ref: 'Note', - }, - }, -} as const; - -export const paramDef = { - type: 'object', - properties: { - limit: { type: 'integer', minimum: 1, maximum: 100, default: 10 }, - offset: { type: 'integer', default: 0 }, - }, - required: [], -} as const; - -// eslint-disable-next-line import/no-default-export -export default define(meta, paramDef, async (ps, user) => { - const query = Polls.createQueryBuilder('poll') - .where('poll.userHost IS NULL') - .andWhere('poll.userId != :meId', { meId: user.id }) - .andWhere('poll.noteVisibility = \'public\'') - .andWhere(new Brackets(qb => { qb - .where('poll.expiresAt IS NULL') - .orWhere('poll.expiresAt > :now', { now: new Date() }); - })); - - //#region exclude arleady voted polls - const votedQuery = PollVotes.createQueryBuilder('vote') - .select('vote.noteId') - .where('vote.userId = :meId', { meId: user.id }); - - query - .andWhere(`poll.noteId NOT IN (${ votedQuery.getQuery() })`); - - query.setParameters(votedQuery.getParameters()); - //#endregion - - //#region mute - const mutingQuery = Mutings.createQueryBuilder('muting') - .select('muting.muteeId') - .where('muting.muterId = :muterId', { muterId: user.id }); - - query - .andWhere(`poll.userId NOT IN (${ mutingQuery.getQuery() })`); - - query.setParameters(mutingQuery.getParameters()); - //#endregion - - const polls = await query - .orderBy('poll.noteId', 'DESC') - .take(ps.limit) - .skip(ps.offset) - .getMany(); - - if (polls.length === 0) return []; - - const notes = await Notes.find({ - where: { - id: In(polls.map(poll => poll.noteId)), - }, - order: { - createdAt: 'DESC', - }, - }); - - return await Notes.packMany(notes, user, { - detail: true, - }); -}); diff --git a/packages/backend/src/services/note/create.ts b/packages/backend/src/services/note/create.ts index f6ef5bb9b..3d5e1f584 100644 --- a/packages/backend/src/services/note/create.ts +++ b/packages/backend/src/services/note/create.ts @@ -210,7 +210,6 @@ async function insertNote(user: { id: User['id']; host: User['host']; }, data: O expiresAt: data.poll.expiresAt, multiple: data.poll.multiple, votes: new Array(data.poll.choices.length).fill(0), - noteVisibility: insert.visibility, userId: user.id, userHost: user.host, }); diff --git a/packages/foundkey-js/src/api.types.ts b/packages/foundkey-js/src/api.types.ts index 58c0dd060..b3e7afc53 100644 --- a/packages/foundkey-js/src/api.types.ts +++ b/packages/foundkey-js/src/api.types.ts @@ -415,7 +415,6 @@ export type Endpoints = { 'notes/hybrid-timeline': { req: { limit?: number; sinceId?: Note['id']; untilId?: Note['id']; sinceDate?: number; untilDate?: number; }; res: Note[]; }; 'notes/local-timeline': { req: { limit?: number; sinceId?: Note['id']; untilId?: Note['id']; sinceDate?: number; untilDate?: number; }; res: Note[]; }; 'notes/mentions': { req: { following?: boolean; limit?: number; sinceId?: Note['id']; untilId?: Note['id']; }; res: Note[]; }; - 'notes/polls/recommendation': { req: TODO; res: TODO; }; 'notes/polls/vote': { req: { noteId: Note['id']; choice: number; }; res: null; }; 'notes/reactions': { req: { noteId: Note['id']; type?: string | null; limit?: number; }; res: NoteReaction[]; }; 'notes/reactions/create': { req: { noteId: Note['id']; reaction: string; }; res: null; };