This repository has been archived on 2025-01-27. You can view files and clone it, but cannot push or open issues or pull requests.
puyoskey-firefish/packages/backend-rs/src/federation/activitypub/object/like.rs
HidemaruOwO 41186813ed ♻️ Refer develop version firefish (Cargo.lock, Cargo.toml, locales/ca-ES.yml, package.json, packages/backend-rs/src/cache/redis.rs, packages/backend-rs/src/database/redis.rs, packages/backend-rs/src/federation/activitypub/object/follow.rs, packages/backend-rs/src/federation/activitypub/object/like.rs, packages/backend-rs/src/federation/activitypub/object/relay.rs, packages/backend-rs/src/federation/internal_actor/instance.rs, packages/backend-rs/src/federation/internal_actor/relay.rs, packages/backend-rs/src/federation/nodeinfo/fetch.rs, packages/backend-rs/src/federation/nodeinfo/generate.rs, packages/backend-rs/src/misc/convert_host.rs, packages/backend-rs/src/misc/emoji.rs, packages/backend-rs/src/misc/emoji/reaction.rs, packages/backend-rs/src/misc/get_image_size.rs, packages/backend-rs/src/misc/latest_version.rs, packages/backend-rs/src/misc/password.rs, packages/backend-rs/src/misc/random_icon.rs, packages/backend-rs/src/misc/should_nyaify.rs, packages/backend-rs/src/misc/translate.rs, packages/backend-rs/src/service/antenna/check_hit.rs, packages/backend-rs/src/service/antenna/process_new_note.rs, packages/backend-rs/src/service/push_notification.rs, packages/backend-rs/src/service/stream.rs, packages/backend-rs/src/util/error_chain.rs, packages/backend-rs/src/util/http_client.rs, packages/backend/assets/resource-unknown.svg, packages/backend/package.json, packages/client/package.json, packages/client/src/components/MkInstanceCardMini.vue, packages/client/src/components/MkInstanceTicker.vue, packages/client/src/components/MkUrlPreview.vue, packages/client/src/ui/_common_/statusbar-federation.vue, packages/client/src/widgets/federation.vue, packages/client/src/widgets/instance-cloud.vue, packages/firefish-js/package.json, packages/macro-rs/macros-impl/Cargo.toml, packages/macro-rs/macros-impl/src/lib.rs, packages/macro-rs/macros-impl/src/napi.rs, packages/macro-rs/macros/src/lib.rs, packages/sw/package.json, pnpm-lock.yaml)
2024-08-24 09:40:20 +09:00

74 lines
2.1 KiB
Rust

use super::{emoji::ApEmoji, *};
use crate::{
config::CONFIG,
database::db_conn,
misc::{self, user},
model::entity::{emoji, note, note_reaction},
};
use sea_orm::{ColumnTrait, DbErr, EntityTrait, QueryFilter, QuerySelect};
#[error_doc::errors]
pub enum Error {
#[doc = "Nonexistent note"]
#[error("note {0} not found")]
NoteNotFound(String),
#[doc = "Database error"]
#[error(transparent)]
Db(#[from] DbErr),
}
#[macros::export(object, use_nullable = false)]
pub struct ApLike {
pub id: String,
pub r#type: Activity,
pub actor: String,
pub object: String,
pub content: String,
pub tag: Option<Vec<ApEmoji>>,
}
impl ApObject for ApLike {}
impl ApLike {
#[allow(dead_code)] // TODO: remove this line by actually using it
async fn new(reaction: note_reaction::Model) -> Result<Self, Error> {
let db = db_conn().await?;
let note_uri = {
let note_uri = note::Entity::find()
.select_only()
.column(note::Column::Uri)
.filter(note::Column::Id.eq(&reaction.note_id))
.into_tuple::<Option<String>>()
.one(db)
.await?;
match note_uri {
Some(Some(uri)) => uri,
Some(None) => misc::note::local_uri(reaction.note_id),
None => return Err(Error::NoteNotFound(reaction.note_id)),
}
};
let tag = emoji::Entity::find()
.filter(emoji::Column::Name.eq(reaction.reaction.replace(':', "")))
.filter(emoji::Column::Host.is_null())
.one(db)
.await?
.map(|emoji| vec![ApEmoji::new(emoji)]);
Ok(Self {
id: format!("{}/likes/{}", CONFIG.url, reaction.id),
r#type: Activity::Like,
actor: user::local_uri(reaction.user_id),
object: note_uri,
content: reaction.reaction,
tag,
})
}
}
#[macros::ts_export]
pub async fn render_like(reaction: note_reaction::Model) -> Result<ApLike, Error> {
ApLike::new(reaction).await
}