summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorsyuilo <Syuilotan@yahoo.co.jp>2023-09-28 21:06:14 +0900
committersyuilo <Syuilotan@yahoo.co.jp>2023-09-28 21:06:14 +0900
commit2438c047a71b7b46d3cc7304a1c78a27a6789f02 (patch)
tree3a495a6eecb7b641b2c9b8ef8de820d5e21ffd95
parentfeat: note edit (diff)
downloadmisskey-2438c047a71b7b46d3cc7304a1c78a27a6789f02.tar.gz
misskey-2438c047a71b7b46d3cc7304a1c78a27a6789f02.tar.bz2
misskey-2438c047a71b7b46d3cc7304a1c78a27a6789f02.zip
enhance: 編集されたノートかどうか分かるように
-rw-r--r--locales/index.d.ts1
-rw-r--r--locales/ja-JP.yml1
-rw-r--r--packages/backend/migration/1695901659683-note-updated-at.js11
-rw-r--r--packages/backend/src/core/entities/NoteEntityService.ts1
-rw-r--r--packages/backend/src/models/Note.ts5
-rw-r--r--packages/backend/src/models/json-schema/note.ts7
-rw-r--r--packages/backend/src/server/api/endpoints/notes/update.ts1
-rw-r--r--packages/frontend/src/components/MkNoteDetailed.vue3
-rw-r--r--packages/frontend/src/components/MkNoteHeader.vue1
-rw-r--r--packages/frontend/src/scripts/use-note-capture.ts1
-rw-r--r--packages/misskey-js/etc/misskey-js.api.md3
-rw-r--r--packages/misskey-js/src/entities.ts1
12 files changed, 34 insertions, 2 deletions
diff --git a/locales/index.d.ts b/locales/index.d.ts
index 8c6b724623..75f867e691 100644
--- a/locales/index.d.ts
+++ b/locales/index.d.ts
@@ -1125,6 +1125,7 @@ export interface Locale {
"authenticationRequiredToContinue": string;
"dateAndTime": string;
"showRenotes": string;
+ "edited": string;
"_announcement": {
"forExistingUsers": string;
"forExistingUsersDescription": string;
diff --git a/locales/ja-JP.yml b/locales/ja-JP.yml
index c31b4a5c27..cfa9143dde 100644
--- a/locales/ja-JP.yml
+++ b/locales/ja-JP.yml
@@ -1122,6 +1122,7 @@ authentication: "認証"
authenticationRequiredToContinue: "続けるには認証を行ってください"
dateAndTime: "日時"
showRenotes: "リノートを表示"
+edited: "編集済み"
_announcement:
forExistingUsers: "既存ユーザーのみ"
diff --git a/packages/backend/migration/1695901659683-note-updated-at.js b/packages/backend/migration/1695901659683-note-updated-at.js
new file mode 100644
index 0000000000..d8a151a1f7
--- /dev/null
+++ b/packages/backend/migration/1695901659683-note-updated-at.js
@@ -0,0 +1,11 @@
+export class NoteUpdatedAt1695901659683 {
+ name = 'NoteUpdatedAt1695901659683'
+
+ async up(queryRunner) {
+ await queryRunner.query(`ALTER TABLE "note" ADD "updatedAt" TIMESTAMP WITH TIME ZONE`);
+ }
+
+ async down(queryRunner) {
+ await queryRunner.query(`ALTER TABLE "note" DROP COLUMN "updatedAt"`);
+ }
+}
diff --git a/packages/backend/src/core/entities/NoteEntityService.ts b/packages/backend/src/core/entities/NoteEntityService.ts
index bf42e98ce0..a024286b48 100644
--- a/packages/backend/src/core/entities/NoteEntityService.ts
+++ b/packages/backend/src/core/entities/NoteEntityService.ts
@@ -308,6 +308,7 @@ export class NoteEntityService implements OnModuleInit {
const packed: Packed<'Note'> = await awaitAll({
id: note.id,
createdAt: note.createdAt.toISOString(),
+ updatedAt: note.updatedAt ? note.updatedAt.toISOString() : undefined,
userId: note.userId,
user: this.userEntityService.pack(note.user ?? note.userId, me, {
detail: false,
diff --git a/packages/backend/src/models/Note.ts b/packages/backend/src/models/Note.ts
index ed86d4549e..f396a0cd7a 100644
--- a/packages/backend/src/models/Note.ts
+++ b/packages/backend/src/models/Note.ts
@@ -24,6 +24,11 @@ export class MiNote {
})
public createdAt: Date;
+ @Column('timestamp with time zone', {
+ default: null,
+ })
+ public updatedAt: Date | null;
+
@Index()
@Column({
...id(),
diff --git a/packages/backend/src/models/json-schema/note.ts b/packages/backend/src/models/json-schema/note.ts
index eb744aa109..ad0cb3c45d 100644
--- a/packages/backend/src/models/json-schema/note.ts
+++ b/packages/backend/src/models/json-schema/note.ts
@@ -17,6 +17,11 @@ export const packedNoteSchema = {
optional: false, nullable: false,
format: 'date-time',
},
+ updatedAt: {
+ type: 'string',
+ optional: true, nullable: true,
+ format: 'date-time',
+ },
deletedAt: {
type: 'string',
optional: true, nullable: true,
@@ -142,7 +147,7 @@ export const packedNoteSchema = {
isSensitive: {
type: 'boolean',
optional: true, nullable: false,
- }
+ },
},
},
},
diff --git a/packages/backend/src/server/api/endpoints/notes/update.ts b/packages/backend/src/server/api/endpoints/notes/update.ts
index ccd2878d3c..cdf7f085e0 100644
--- a/packages/backend/src/server/api/endpoints/notes/update.ts
+++ b/packages/backend/src/server/api/endpoints/notes/update.ts
@@ -75,6 +75,7 @@ export default class extends Endpoint<typeof meta, typeof paramDef> { // eslint-
}
await this.notesRepository.update({ id: note.id }, {
+ updatedAt: new Date(),
cw: ps.cw,
text: ps.text,
});
diff --git a/packages/frontend/src/components/MkNoteDetailed.vue b/packages/frontend/src/components/MkNoteDetailed.vue
index 06663d0477..ab8886e8ba 100644
--- a/packages/frontend/src/components/MkNoteDetailed.vue
+++ b/packages/frontend/src/components/MkNoteDetailed.vue
@@ -93,6 +93,9 @@ SPDX-License-Identifier: AGPL-3.0-only
</div>
<footer>
<div :class="$style.noteFooterInfo">
+ <div v-if="appearNote.updatedAt">
+ {{ i18n.ts.edited }}: <MkTime :time="appearNote.updatedAt" mode="detail"/>
+ </div>
<MkA :to="notePage(appearNote)">
<MkTime :time="appearNote.createdAt" mode="detail"/>
</MkA>
diff --git a/packages/frontend/src/components/MkNoteHeader.vue b/packages/frontend/src/components/MkNoteHeader.vue
index dda7238d27..05f98c638e 100644
--- a/packages/frontend/src/components/MkNoteHeader.vue
+++ b/packages/frontend/src/components/MkNoteHeader.vue
@@ -14,6 +14,7 @@ SPDX-License-Identifier: AGPL-3.0-only
<img v-for="role in note.user.badgeRoles" :key="role.id" v-tooltip="role.name" :class="$style.badgeRole" :src="role.iconUrl"/>
</div>
<div :class="$style.info">
+ <span v-if="note.updatedAt" style="margin-right: 0.5em;" :title="i18n.ts.edited"><i class="ti ti-pencil"></i></span>
<MkA :to="notePage(note)">
<MkTime :time="note.createdAt"/>
</MkA>
diff --git a/packages/frontend/src/scripts/use-note-capture.ts b/packages/frontend/src/scripts/use-note-capture.ts
index e815e74444..a4c913749e 100644
--- a/packages/frontend/src/scripts/use-note-capture.ts
+++ b/packages/frontend/src/scripts/use-note-capture.ts
@@ -72,6 +72,7 @@ export function useNoteCapture(props: {
}
case 'updated': {
+ note.value.updatedAt = new Date().toISOString();
note.value.cw = body.cw;
note.value.text = body.text;
break;
diff --git a/packages/misskey-js/etc/misskey-js.api.md b/packages/misskey-js/etc/misskey-js.api.md
index 7d4d4cc8b8..fbcebbebae 100644
--- a/packages/misskey-js/etc/misskey-js.api.md
+++ b/packages/misskey-js/etc/misskey-js.api.md
@@ -2619,6 +2619,7 @@ export const mutedNoteReasons: readonly ["word", "manual", "spam", "other"];
type Note = {
id: ID;
createdAt: DateString;
+ updatedAt?: DateString | null;
text: string | null;
cw: string | null;
user: User;
@@ -2957,7 +2958,7 @@ type UserSorting = '+follower' | '-follower' | '+createdAt' | '-createdAt' | '+u
// src/api.types.ts:16:32 - (ae-forgotten-export) The symbol "TODO" needs to be exported by the entry point index.d.ts
// src/api.types.ts:18:25 - (ae-forgotten-export) The symbol "NoParams" needs to be exported by the entry point index.d.ts
// src/api.types.ts:631:18 - (ae-forgotten-export) The symbol "ShowUserReq" needs to be exported by the entry point index.d.ts
-// src/entities.ts:579:2 - (ae-forgotten-export) The symbol "ModerationLogPayloads" needs to be exported by the entry point index.d.ts
+// src/entities.ts:580:2 - (ae-forgotten-export) The symbol "ModerationLogPayloads" needs to be exported by the entry point index.d.ts
// src/streaming.types.ts:33:4 - (ae-forgotten-export) The symbol "FIXME" needs to be exported by the entry point index.d.ts
// (No @packageDocumentation comment for this package)
diff --git a/packages/misskey-js/src/entities.ts b/packages/misskey-js/src/entities.ts
index a089ef5a68..63da881b39 100644
--- a/packages/misskey-js/src/entities.ts
+++ b/packages/misskey-js/src/entities.ts
@@ -162,6 +162,7 @@ export type GalleryPost = {
export type Note = {
id: ID;
createdAt: DateString;
+ updatedAt?: DateString | null;
text: string | null;
cw: string | null;
user: User;