refactor (backend): port note watch/unwatch to backend-rs
This commit is contained in:
parent
879d499486
commit
109884f6d8
9 changed files with 53 additions and 35 deletions
2
packages/backend-rs/index.d.ts
vendored
2
packages/backend-rs/index.d.ts
vendored
|
@ -1122,6 +1122,8 @@ export interface Webhook {
|
||||||
latestSentAt: Date | null
|
latestSentAt: Date | null
|
||||||
latestStatus: number | null
|
latestStatus: number | null
|
||||||
}
|
}
|
||||||
|
export function watchNote(watcherId: string, noteAuthorId: string, noteId: string): Promise<void>
|
||||||
|
export function unwatchNote(watcherId: string, noteId: string): Promise<void>
|
||||||
export enum ChatEvent {
|
export enum ChatEvent {
|
||||||
Message = 'message',
|
Message = 'message',
|
||||||
Read = 'read',
|
Read = 'read',
|
||||||
|
|
|
@ -310,7 +310,7 @@ if (!nativeBinding) {
|
||||||
throw new Error(`Failed to load native binding`)
|
throw new Error(`Failed to load native binding`)
|
||||||
}
|
}
|
||||||
|
|
||||||
const { loadEnv, loadConfig, stringToAcct, acctToString, addNoteToAntenna, isBlockedServer, isSilencedServer, isAllowedServer, checkWordMute, getFullApAccount, isSelfHost, isSameOrigin, extractHost, toPuny, isUnicodeEmoji, sqlLikeEscape, safeForSql, formatMilliseconds, getNoteSummary, toMastodonId, fromMastodonId, fetchMeta, metaToPugArgs, nyaify, hashPassword, verifyPassword, isOldPasswordAlgorithm, decodeReaction, countReactions, toDbReaction, removeOldAttestationChallenges, AntennaSrcEnum, DriveFileUsageHintEnum, MutedNoteReasonEnum, NoteVisibilityEnum, NotificationTypeEnum, PageVisibilityEnum, PollNotevisibilityEnum, RelayStatusEnum, UserEmojimodpermEnum, UserProfileFfvisibilityEnum, UserProfileMutingnotificationtypesEnum, ChatEvent, publishToChatStream, getTimestamp, genId, genIdAt, secureRndstr } = nativeBinding
|
const { loadEnv, loadConfig, stringToAcct, acctToString, addNoteToAntenna, isBlockedServer, isSilencedServer, isAllowedServer, checkWordMute, getFullApAccount, isSelfHost, isSameOrigin, extractHost, toPuny, isUnicodeEmoji, sqlLikeEscape, safeForSql, formatMilliseconds, getNoteSummary, toMastodonId, fromMastodonId, fetchMeta, metaToPugArgs, nyaify, hashPassword, verifyPassword, isOldPasswordAlgorithm, decodeReaction, countReactions, toDbReaction, removeOldAttestationChallenges, AntennaSrcEnum, DriveFileUsageHintEnum, MutedNoteReasonEnum, NoteVisibilityEnum, NotificationTypeEnum, PageVisibilityEnum, PollNotevisibilityEnum, RelayStatusEnum, UserEmojimodpermEnum, UserProfileFfvisibilityEnum, UserProfileMutingnotificationtypesEnum, watchNote, unwatchNote, ChatEvent, publishToChatStream, getTimestamp, genId, genIdAt, secureRndstr } = nativeBinding
|
||||||
|
|
||||||
module.exports.loadEnv = loadEnv
|
module.exports.loadEnv = loadEnv
|
||||||
module.exports.loadConfig = loadConfig
|
module.exports.loadConfig = loadConfig
|
||||||
|
@ -354,6 +354,8 @@ module.exports.RelayStatusEnum = RelayStatusEnum
|
||||||
module.exports.UserEmojimodpermEnum = UserEmojimodpermEnum
|
module.exports.UserEmojimodpermEnum = UserEmojimodpermEnum
|
||||||
module.exports.UserProfileFfvisibilityEnum = UserProfileFfvisibilityEnum
|
module.exports.UserProfileFfvisibilityEnum = UserProfileFfvisibilityEnum
|
||||||
module.exports.UserProfileMutingnotificationtypesEnum = UserProfileMutingnotificationtypesEnum
|
module.exports.UserProfileMutingnotificationtypesEnum = UserProfileMutingnotificationtypesEnum
|
||||||
|
module.exports.watchNote = watchNote
|
||||||
|
module.exports.unwatchNote = unwatchNote
|
||||||
module.exports.ChatEvent = ChatEvent
|
module.exports.ChatEvent = ChatEvent
|
||||||
module.exports.publishToChatStream = publishToChatStream
|
module.exports.publishToChatStream = publishToChatStream
|
||||||
module.exports.getTimestamp = getTimestamp
|
module.exports.getTimestamp = getTimestamp
|
||||||
|
|
|
@ -1 +1,2 @@
|
||||||
|
pub mod note;
|
||||||
pub mod stream;
|
pub mod stream;
|
||||||
|
|
1
packages/backend-rs/src/service/note/mod.rs
Normal file
1
packages/backend-rs/src/service/note/mod.rs
Normal file
|
@ -0,0 +1 @@
|
||||||
|
pub mod watch;
|
42
packages/backend-rs/src/service/note/watch.rs
Normal file
42
packages/backend-rs/src/service/note/watch.rs
Normal file
|
@ -0,0 +1,42 @@
|
||||||
|
use crate::database::db_conn;
|
||||||
|
use crate::model::entity::note_watching;
|
||||||
|
use crate::util::id::gen_id;
|
||||||
|
use sea_orm::{ActiveValue, ColumnTrait, DbErr, EntityTrait, ModelTrait, QueryFilter};
|
||||||
|
|
||||||
|
#[crate::export]
|
||||||
|
pub async fn watch_note(
|
||||||
|
watcher_id: &str,
|
||||||
|
note_author_id: &str,
|
||||||
|
note_id: &str,
|
||||||
|
) -> Result<(), DbErr> {
|
||||||
|
if watcher_id != note_author_id {
|
||||||
|
note_watching::Entity::insert(note_watching::ActiveModel {
|
||||||
|
id: ActiveValue::set(gen_id()),
|
||||||
|
created_at: ActiveValue::set(chrono::Local::now().naive_local()),
|
||||||
|
user_id: ActiveValue::Set(watcher_id.to_string()),
|
||||||
|
note_user_id: ActiveValue::Set(note_author_id.to_string()),
|
||||||
|
note_id: ActiveValue::Set(note_id.to_string()),
|
||||||
|
})
|
||||||
|
.exec(db_conn().await?)
|
||||||
|
.await?;
|
||||||
|
}
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
#[crate::export]
|
||||||
|
pub async fn unwatch_note(watcher_id: &str, note_id: &str) -> Result<(), DbErr> {
|
||||||
|
let db = db_conn().await?;
|
||||||
|
|
||||||
|
let entry = note_watching::Entity::find()
|
||||||
|
.filter(note_watching::Column::UserId.eq(watcher_id))
|
||||||
|
.filter(note_watching::Column::NoteId.eq(note_id))
|
||||||
|
.one(db)
|
||||||
|
.await?;
|
||||||
|
|
||||||
|
if let Some(entry) = entry {
|
||||||
|
entry.delete(db).await?;
|
||||||
|
}
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
|
@ -1,4 +1,4 @@
|
||||||
import watch from "@/services/note/watch.js";
|
import { watchNote } from "backend-rs";
|
||||||
import define from "@/server/api/define.js";
|
import define from "@/server/api/define.js";
|
||||||
import { getNote } from "@/server/api/common/getters.js";
|
import { getNote } from "@/server/api/common/getters.js";
|
||||||
import { ApiError } from "@/server/api/error.js";
|
import { ApiError } from "@/server/api/error.js";
|
||||||
|
@ -34,5 +34,5 @@ export default define(meta, paramDef, async (ps, user) => {
|
||||||
throw err;
|
throw err;
|
||||||
});
|
});
|
||||||
|
|
||||||
await watch(user.id, note);
|
await watchNote(user.id, note.userId, note.id);
|
||||||
});
|
});
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
import unwatch from "@/services/note/unwatch.js";
|
import { unwatchNote } from "backend-rs";
|
||||||
import define from "@/server/api/define.js";
|
import define from "@/server/api/define.js";
|
||||||
import { getNote } from "@/server/api/common/getters.js";
|
import { getNote } from "@/server/api/common/getters.js";
|
||||||
import { ApiError } from "@/server/api/error.js";
|
import { ApiError } from "@/server/api/error.js";
|
||||||
|
@ -34,5 +34,5 @@ export default define(meta, paramDef, async (ps, user) => {
|
||||||
throw err;
|
throw err;
|
||||||
});
|
});
|
||||||
|
|
||||||
await unwatch(user.id, note);
|
await unwatchNote(user.id, note.id);
|
||||||
});
|
});
|
||||||
|
|
|
@ -1,10 +0,0 @@
|
||||||
import type { User } from "@/models/entities/user.js";
|
|
||||||
import { NoteWatchings } from "@/models/index.js";
|
|
||||||
import type { Note } from "@/models/entities/note.js";
|
|
||||||
|
|
||||||
export default async (me: User["id"], note: Note) => {
|
|
||||||
await NoteWatchings.delete({
|
|
||||||
noteId: note.id,
|
|
||||||
userId: me,
|
|
||||||
});
|
|
||||||
};
|
|
|
@ -1,20 +0,0 @@
|
||||||
import type { User } from "@/models/entities/user.js";
|
|
||||||
import type { Note } from "@/models/entities/note.js";
|
|
||||||
import { NoteWatchings } from "@/models/index.js";
|
|
||||||
import { genId } from "backend-rs";
|
|
||||||
import type { NoteWatching } from "@/models/entities/note-watching.js";
|
|
||||||
|
|
||||||
export default async (me: User["id"], note: Note) => {
|
|
||||||
// 自分の投稿はwatchできない
|
|
||||||
if (me === note.userId) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
await NoteWatchings.insert({
|
|
||||||
id: genId(),
|
|
||||||
createdAt: new Date(),
|
|
||||||
noteId: note.id,
|
|
||||||
userId: me,
|
|
||||||
noteUserId: note.userId,
|
|
||||||
} as NoteWatching);
|
|
||||||
};
|
|
Loading…
Reference in a new issue