diff options
| author | GrapeApple0 <84321396+GrapeApple0@users.noreply.github.com> | 2023-08-21 20:23:09 +0900 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2023-08-21 20:23:09 +0900 |
| commit | 70a78009270df3ff9a76e84a4e2dd0837a1b5f46 (patch) | |
| tree | 60440113ef1d45f2b30b2abf0711dec613ec2b6d /packages | |
| parent | Update CHANGELOG.md (diff) | |
| download | sharkey-70a78009270df3ff9a76e84a4e2dd0837a1b5f46.tar.gz sharkey-70a78009270df3ff9a76e84a4e2dd0837a1b5f46.tar.bz2 sharkey-70a78009270df3ff9a76e84a4e2dd0837a1b5f46.zip | |
プロフィールにその人が作ったPlayの一覧出せるように (#11445)
* プロフィールにその人が作ったPlayの一覧出せるように
* Update CHANGELOG.md
* playの公開範囲を設定できるように
* 間違えて変更してしまったのを修正
* Update packages/frontend/src/pages/flash/flash-edit.vue
* Update packages/frontend/src/pages/flash/flash-edit.vue
* tweak
* Update packages/backend/migration/1690796169261-play-visibility.js
* Update packages/backend/src/models/entities/Flash.ts
* Update packages/backend/src/models/entities/Flash.ts
* Update Flash.ts
---------
Co-authored-by: syuilo <Syuilotan@yahoo.co.jp>
Diffstat (limited to 'packages')
| -rw-r--r-- | packages/backend/migration/1690796169261-play-visibility.js | 15 | ||||
| -rw-r--r-- | packages/backend/src/models/entities/Flash.ts | 9 | ||||
| -rw-r--r-- | packages/backend/src/server/api/EndpointsModule.ts | 4 | ||||
| -rw-r--r-- | packages/backend/src/server/api/endpoints.ts | 2 | ||||
| -rw-r--r-- | packages/backend/src/server/api/endpoints/flash/update.ts | 1 | ||||
| -rw-r--r-- | packages/backend/src/server/api/endpoints/users/flashs.ts | 62 | ||||
| -rw-r--r-- | packages/frontend/src/pages/flash/flash-edit.vue | 8 | ||||
| -rw-r--r-- | packages/frontend/src/pages/user/flashs.vue | 31 | ||||
| -rw-r--r-- | packages/frontend/src/pages/user/index.vue | 6 | ||||
| -rw-r--r-- | packages/misskey-js/src/api.types.ts | 1 |
10 files changed, 139 insertions, 0 deletions
diff --git a/packages/backend/migration/1690796169261-play-visibility.js b/packages/backend/migration/1690796169261-play-visibility.js new file mode 100644 index 0000000000..c57fa7a109 --- /dev/null +++ b/packages/backend/migration/1690796169261-play-visibility.js @@ -0,0 +1,15 @@ +/* + * SPDX-FileCopyrightText: syuilo and other misskey contributors + * SPDX-License-Identifier: AGPL-3.0-only + */ + +export class PlayVisibility1689102832143 { + name = 'PlayVisibility1690796169261' + + async up(queryRunner) { + await queryRunner.query(`ALTER TABLE "public"."flash" ADD "visibility" character varying(512) DEFAULT 'public'`, undefined); + } + async down(queryRunner) { + await queryRunner.query(`ALTER TABLE "public"."flash" DROP COLUMN "visibility"`, undefined); + } +} diff --git a/packages/backend/src/models/entities/Flash.ts b/packages/backend/src/models/entities/Flash.ts index af4553ee9b..38e023332e 100644 --- a/packages/backend/src/models/entities/Flash.ts +++ b/packages/backend/src/models/entities/Flash.ts @@ -61,4 +61,13 @@ export class MiFlash { default: 0, }) public likedCount: number; + + /** + * public ... 公開 + * private ... プロフィールには表示しない + */ + @Column('varchar', { + length: 512, default: 'public', + }) + public visibility: 'public' | 'private'; } diff --git a/packages/backend/src/server/api/EndpointsModule.ts b/packages/backend/src/server/api/EndpointsModule.ts index 3be6524689..799ba4498d 100644 --- a/packages/backend/src/server/api/EndpointsModule.ts +++ b/packages/backend/src/server/api/EndpointsModule.ts @@ -336,6 +336,7 @@ import * as ep___users_lists_unfavorite from './endpoints/users/lists/unfavorite import * as ep___users_lists_create_from_public from './endpoints/users/lists/create-from-public.js'; import * as ep___users_notes from './endpoints/users/notes.js'; import * as ep___users_pages from './endpoints/users/pages.js'; +import * as ep___users_flashs from './endpoints/users/flashs.js'; import * as ep___users_reactions from './endpoints/users/reactions.js'; import * as ep___users_recommendation from './endpoints/users/recommendation.js'; import * as ep___users_relation from './endpoints/users/relation.js'; @@ -681,6 +682,7 @@ const $users_lists_unfavorite: Provider = { provide: 'ep:users/lists/unfavorite' const $users_lists_create_from_public: Provider = { provide: 'ep:users/lists/create-from-public', useClass: ep___users_lists_create_from_public.default }; const $users_notes: Provider = { provide: 'ep:users/notes', useClass: ep___users_notes.default }; const $users_pages: Provider = { provide: 'ep:users/pages', useClass: ep___users_pages.default }; +const $users_flashs: Provider = { provide: 'ep:users/flashs', useClass: ep___users_flashs.default }; const $users_reactions: Provider = { provide: 'ep:users/reactions', useClass: ep___users_reactions.default }; const $users_recommendation: Provider = { provide: 'ep:users/recommendation', useClass: ep___users_recommendation.default }; const $users_relation: Provider = { provide: 'ep:users/relation', useClass: ep___users_relation.default }; @@ -1030,6 +1032,7 @@ const $retention: Provider = { provide: 'ep:retention', useClass: ep___retention $users_lists_create_from_public, $users_notes, $users_pages, + $users_flashs, $users_reactions, $users_recommendation, $users_relation, @@ -1371,6 +1374,7 @@ const $retention: Provider = { provide: 'ep:retention', useClass: ep___retention $users_lists_create_from_public, $users_notes, $users_pages, + $users_flashs, $users_reactions, $users_recommendation, $users_relation, diff --git a/packages/backend/src/server/api/endpoints.ts b/packages/backend/src/server/api/endpoints.ts index 5fef975fa6..3924b43d16 100644 --- a/packages/backend/src/server/api/endpoints.ts +++ b/packages/backend/src/server/api/endpoints.ts @@ -336,6 +336,7 @@ import * as ep___users_lists_create_from_public from './endpoints/users/lists/cr import * as ep___users_lists_update from './endpoints/users/lists/update.js'; import * as ep___users_notes from './endpoints/users/notes.js'; import * as ep___users_pages from './endpoints/users/pages.js'; +import * as ep___users_flashs from './endpoints/users/flashs.js'; import * as ep___users_reactions from './endpoints/users/reactions.js'; import * as ep___users_recommendation from './endpoints/users/recommendation.js'; import * as ep___users_relation from './endpoints/users/relation.js'; @@ -679,6 +680,7 @@ const eps = [ ['users/lists/create-from-public', ep___users_lists_create_from_public], ['users/notes', ep___users_notes], ['users/pages', ep___users_pages], + ['users/flashs', ep___users_flashs], ['users/reactions', ep___users_reactions], ['users/recommendation', ep___users_recommendation], ['users/relation', ep___users_relation], diff --git a/packages/backend/src/server/api/endpoints/flash/update.ts b/packages/backend/src/server/api/endpoints/flash/update.ts index 04ed79350e..9da29b50ea 100644 --- a/packages/backend/src/server/api/endpoints/flash/update.ts +++ b/packages/backend/src/server/api/endpoints/flash/update.ts @@ -49,6 +49,7 @@ export const paramDef = { permissions: { type: 'array', items: { type: 'string', } }, + visibility: { type: 'string', enum: ['public', 'private'] }, }, required: ['flashId', 'title', 'summary', 'script', 'permissions'], } as const; diff --git a/packages/backend/src/server/api/endpoints/users/flashs.ts b/packages/backend/src/server/api/endpoints/users/flashs.ts new file mode 100644 index 0000000000..4e267f9003 --- /dev/null +++ b/packages/backend/src/server/api/endpoints/users/flashs.ts @@ -0,0 +1,62 @@ +/* + * SPDX-FileCopyrightText: syuilo and other misskey contributors + * SPDX-License-Identifier: AGPL-3.0-only + */ + +import { Inject, Injectable } from '@nestjs/common'; +import { Endpoint } from '@/server/api/endpoint-base.js'; +import { QueryService } from '@/core/QueryService.js'; +import { FlashEntityService } from '@/core/entities/FlashEntityService.js'; +import type { FlashsRepository } from '@/models/index.js'; +import { DI } from '@/di-symbols.js'; + +export const meta = { + tags: ['users', 'flashs'], + + description: 'Show all flashs this user created.', + + res: { + type: 'array', + optional: false, nullable: false, + items: { + type: 'object', + optional: false, nullable: false, + ref: 'Flash', + }, + }, +} as const; + +export const paramDef = { + type: 'object', + properties: { + userId: { type: 'string', format: 'misskey:id' }, + limit: { type: 'integer', minimum: 1, maximum: 100, default: 10 }, + sinceId: { type: 'string', format: 'misskey:id' }, + untilId: { type: 'string', format: 'misskey:id' }, + }, + required: ['userId'], +} as const; + +// eslint-disable-next-line import/no-default-export +@Injectable() +export default class extends Endpoint<typeof meta, typeof paramDef> { + constructor( + @Inject(DI.flashsRepository) + private flashsRepository: FlashsRepository, + + private flashEntityService: FlashEntityService, + private queryService: QueryService, + ) { + super(meta, paramDef, async (ps, me) => { + const query = this.queryService.makePaginationQuery(this.flashsRepository.createQueryBuilder('flash'), ps.sinceId, ps.untilId) + .andWhere('flash.userId = :userId', { userId: ps.userId }) + .andWhere('flash.visibility = \'public\''); + + const flashs = await query + .limit(ps.limit) + .getMany(); + + return await this.flashEntityService.packMany(flashs); + }); + } +} diff --git a/packages/frontend/src/pages/flash/flash-edit.vue b/packages/frontend/src/pages/flash/flash-edit.vue index fecf6edd0c..414fe4836c 100644 --- a/packages/frontend/src/pages/flash/flash-edit.vue +++ b/packages/frontend/src/pages/flash/flash-edit.vue @@ -23,6 +23,11 @@ SPDX-License-Identifier: AGPL-3.0-only <MkButton @click="show"><i class="ti ti-eye"></i> {{ i18n.ts.show }}</MkButton> <MkButton v-if="flash" danger @click="del"><i class="ti ti-trash"></i> {{ i18n.ts.delete }}</MkButton> </div> + <MkSelect v-model="visibility"> + <template #label>{{ i18n.ts.visibility }}</template> + <option :key="'public'" :value="'public'">{{ i18n.ts.public }}</option> + <option :key="'private'" :value="'private'">{{ i18n.ts.private }}</option> + </MkSelect> </div> </MkSpacer> </MkStickyContainer> @@ -36,6 +41,7 @@ import { i18n } from '@/i18n'; import { definePageMetadata } from '@/scripts/page-metadata'; import MkTextarea from '@/components/MkTextarea.vue'; import MkInput from '@/components/MkInput.vue'; +import MkSelect from '@/components/MkSelect.vue'; import { useRouter } from '@/router'; const PRESET_DEFAULT = `/// @ 0.15.0 @@ -358,6 +364,7 @@ const props = defineProps<{ }>(); let flash = $ref(null); +let visibility = $ref('public'); if (props.id) { flash = await os.api('flash/show', { @@ -402,6 +409,7 @@ async function save() { summary, permissions, script, + visibility, }); } else { const created = await os.apiWithDialog('flash/create', { diff --git a/packages/frontend/src/pages/user/flashs.vue b/packages/frontend/src/pages/user/flashs.vue new file mode 100644 index 0000000000..b91ecb8de6 --- /dev/null +++ b/packages/frontend/src/pages/user/flashs.vue @@ -0,0 +1,31 @@ +<!-- +SPDX-FileCopyrightText: syuilo and other misskey contributors +SPDX-License-Identifier: AGPL-3.0-only +--> + +<template> +<MkSpacer :contentMax="700"> + <MkPagination v-slot="{items}" ref="list" :pagination="pagination"> + <MkFlashPreview v-for="flash in items" :key="flash.id" :flash="flash" class="_margin"/> + </MkPagination> +</MkSpacer> +</template> + +<script lang="ts" setup> +import { computed } from 'vue'; +import * as misskey from 'misskey-js'; +import MkFlashPreview from '@/components/MkFlashPreview.vue'; +import MkPagination from '@/components/MkPagination.vue'; + +const props = defineProps<{ + user: misskey.entities.User; +}>(); + +const pagination = { + endpoint: 'users/flashs' as const, + limit: 20, + params: computed(() => ({ + userId: props.user.id, + })), +}; +</script> diff --git a/packages/frontend/src/pages/user/index.vue b/packages/frontend/src/pages/user/index.vue index 314548fee3..c014897a24 100644 --- a/packages/frontend/src/pages/user/index.vue +++ b/packages/frontend/src/pages/user/index.vue @@ -16,6 +16,7 @@ SPDX-License-Identifier: AGPL-3.0-only <XClips v-else-if="tab === 'clips'" :user="user"/> <XLists v-else-if="tab === 'lists'" :user="user"/> <XPages v-else-if="tab === 'pages'" :user="user"/> + <XFlashs v-else-if="tab === 'flashs'" :user="user"/> <XGallery v-else-if="tab === 'gallery'" :user="user"/> </div> <MkError v-else-if="error" @retry="fetchUser()"/> @@ -42,6 +43,7 @@ const XReactions = defineAsyncComponent(() => import('./reactions.vue')); const XClips = defineAsyncComponent(() => import('./clips.vue')); const XLists = defineAsyncComponent(() => import('./lists.vue')); const XPages = defineAsyncComponent(() => import('./pages.vue')); +const XFlashs = defineAsyncComponent(() => import('./flashs.vue')); const XGallery = defineAsyncComponent(() => import('./gallery.vue')); const props = withDefaults(defineProps<{ @@ -104,6 +106,10 @@ const headerTabs = $computed(() => user ? [{ title: i18n.ts.pages, icon: 'ti ti-news', }, { + key: 'flashs', + title: 'Play', + icon: 'ti ti-player-play', +}, { key: 'gallery', title: i18n.ts.gallery, icon: 'ti ti-icons', diff --git a/packages/misskey-js/src/api.types.ts b/packages/misskey-js/src/api.types.ts index de9af99168..70ef570166 100644 --- a/packages/misskey-js/src/api.types.ts +++ b/packages/misskey-js/src/api.types.ts @@ -621,6 +621,7 @@ export type Endpoints = { 'users/lists/update': { req: { listId: UserList['id']; name: string; }; res: UserList; }; 'users/notes': { req: { userId: User['id']; limit?: number; sinceId?: Note['id']; untilId?: Note['id']; sinceDate?: number; untilDate?: number; }; res: Note[]; }; 'users/pages': { req: TODO; res: TODO; }; + 'users/flashs': { req: TODO; res: TODO; }; 'users/recommendation': { req: TODO; res: TODO; }; 'users/relation': { req: TODO; res: TODO; }; 'users/report-abuse': { req: TODO; res: TODO; }; |