summaryrefslogtreecommitdiff
path: root/packages/backend/src/server/api/endpoints
diff options
context:
space:
mode:
authorEbise Lutica <7106976+EbiseLutica@users.noreply.github.com>2023-04-13 13:17:32 +0900
committerGitHub <noreply@github.com>2023-04-13 13:17:32 +0900
commit605f1492350c6f90108018d895e47fbc37197c4a (patch)
tree909f5118a3f756e77edf833a18bbf33999e97f08 /packages/backend/src/server/api/endpoints
parentRevert #10475 in MkTime (diff)
downloadmisskey-605f1492350c6f90108018d895e47fbc37197c4a.tar.gz
misskey-605f1492350c6f90108018d895e47fbc37197c4a.tar.bz2
misskey-605f1492350c6f90108018d895e47fbc37197c4a.zip
feat: 自分用メモ機能 (#10516)
* 自分用メモを作成する機能 * 不要なCSSを削除 * メモ: デザイン調整 * デザイン崩れを修正 * fix: メモ機能のe2eテストで見つかった不具合を修正 * デザイン調整 * fix(frontend): 自分用メモtextareaにline-heightが適用されない問題を修正
Diffstat (limited to 'packages/backend/src/server/api/endpoints')
-rw-r--r--packages/backend/src/server/api/endpoints/users/update-memo.ts85
1 files changed, 85 insertions, 0 deletions
diff --git a/packages/backend/src/server/api/endpoints/users/update-memo.ts b/packages/backend/src/server/api/endpoints/users/update-memo.ts
new file mode 100644
index 0000000000..300435b9ff
--- /dev/null
+++ b/packages/backend/src/server/api/endpoints/users/update-memo.ts
@@ -0,0 +1,85 @@
+import { Inject, Injectable } from '@nestjs/common';
+import { Endpoint } from '@/server/api/endpoint-base.js';
+import { IdService } from '@/core/IdService.js';
+import type { UserMemoRepository } from '@/models/index.js';
+import { DI } from '@/di-symbols.js';
+import { GetterService } from '@/server/api/GetterService.js';
+import { ApiError } from '../../error.js';
+
+export const meta = {
+ tags: ['account'],
+
+ requireCredential: true,
+
+ kind: 'write:account',
+
+ errors: {
+ noSuchUser: {
+ message: 'No such user.',
+ code: 'NO_SUCH_USER',
+ id: '6fef56f3-e765-4957-88e5-c6f65329b8a5',
+ },
+ },
+} as const;
+
+export const paramDef = {
+ type: 'object',
+ properties: {
+ userId: { type: 'string', format: 'misskey:id' },
+ memo: {
+ type: 'string',
+ nullable: true,
+ description: 'A personal memo for the target user. If null or empty, delete the memo.',
+ },
+ },
+ required: ['userId', 'memo'],
+} as const;
+
+// eslint-disable-next-line import/no-default-export
+@Injectable()
+export default class extends Endpoint<typeof meta, typeof paramDef> {
+ constructor(
+ @Inject(DI.userMemoRepository)
+ private userMemoRepository: UserMemoRepository,
+ private getterService: GetterService,
+ private idService: IdService,
+ ) {
+ super(meta, paramDef, async (ps, me) => {
+ // Get target
+ const target = await this.getterService.getUser(ps.userId).catch(err => {
+ if (err.id === '15348ddd-432d-49c2-8a5a-8069753becff') throw new ApiError(meta.errors.noSuchUser);
+ throw err;
+ });
+
+ // 引数がnullか空文字であれば、パーソナルメモを削除する
+ if (ps.memo === '' || ps.memo == null) {
+ await this.userMemoRepository.delete({
+ userId: me.id,
+ targetUserId: target.id,
+ });
+ return;
+ }
+
+ // 以前に作成されたパーソナルメモがあるかどうか確認
+ const previousMemo = await this.userMemoRepository.findOneBy({
+ userId: me.id,
+ targetUserId: target.id,
+ });
+
+ if (!previousMemo) {
+ await this.userMemoRepository.insert({
+ id: this.idService.genId(),
+ userId: me.id,
+ targetUserId: target.id,
+ memo: ps.memo,
+ });
+ } else {
+ await this.userMemoRepository.update(previousMemo.id, {
+ userId: me.id,
+ targetUserId: target.id,
+ memo: ps.memo,
+ });
+ }
+ });
+ }
+}