This commit is contained in:
2026-08-16 20:48:53 +02:00
parent c48faa4d6e
commit 07f4a76d74
10 changed files with 83 additions and 306 deletions
+18 -43
View File
@@ -13,7 +13,7 @@ use axum::{
http::{StatusCode, header},
response::Response,
};
use sea_orm::{EntityTrait, Set};
use sea_orm::Set;
use std::path::PathBuf;
use uuid::Uuid;
@@ -34,8 +34,7 @@ pub async fn get_all(
) -> Result<Json<Vec<crate::domain::dto::emoji::EmojiResponse>>, HTTPError> {
let mut result = Vec::new();
for emoji in state.repositories.emoji.list(query.server_id).await? {
let aliases = state.repositories.emoji.aliases(emoji.id).await?;
result.push(mapper::response(emoji, mapper::aliases(aliases)));
result.push(mapper::response(emoji));
}
Ok(Json(result))
}
@@ -51,8 +50,7 @@ pub async fn get_by_id(
.get_by_id(id)
.await?
.ok_or(HTTPError::NotFound)?;
let aliases = state.repositories.emoji.aliases(id).await?;
Ok(Json(mapper::response(emoji, mapper::aliases(aliases))))
Ok(Json(mapper::response(emoji)))
}
#[utoipa::path(post, path = "/emojis", responses((status = 201, body = crate::domain::dto::emoji::EmojiResponse)), tag = "Emojis")]
@@ -63,7 +61,7 @@ pub async fn create(
let mut server_id = None;
let mut emoji_type = None;
let mut unicode_sequence = None;
let mut aliases = Vec::new();
let mut name = None;
let mut file = None;
let mut mime = None;
let mut animated = false;
@@ -72,8 +70,8 @@ pub async fn create(
.await
.map_err(|e| HTTPError::BadRequest(e.to_string()))?
{
let name = field.name().unwrap_or_default().to_string();
if name == "file" {
let field_name = field.name().unwrap_or_default().to_string();
if field_name == "file" {
mime = field.content_type().map(str::to_string);
file = Some(
field
@@ -87,7 +85,7 @@ pub async fn create(
.text()
.await
.map_err(|e| HTTPError::BadRequest(e.to_string()))?;
match name.as_str() {
match field_name.as_str() {
"server_id" => {
server_id = Some(
value
@@ -97,13 +95,13 @@ pub async fn create(
}
"emoji_type" => emoji_type = Some(value),
"unicode_sequence" => unicode_sequence = Some(value),
"alias" => aliases.push(value),
"aliases" => aliases.extend(value.split(',').map(str::to_string)),
"name" => name = Some(value),
"is_animated" => animated = value.parse().unwrap_or(false),
_ => {}
}
}
let emoji_type = normalize_type(emoji_type.as_deref().unwrap_or("custom"))?;
let name = name.ok_or(HTTPError::BadRequest("name is required".into()))?;
if emoji_type == "unicode" && unicode_sequence.is_none() {
return Err(HTTPError::BadRequest("unicode_sequence is required".into()));
}
@@ -138,6 +136,7 @@ pub async fn create(
let model = emoji::ActiveModel {
id: Set(id),
server_id: Set(server_id),
name: Set(String::new()),
emoji_type: Set(emoji_type),
unicode_sequence: Set(unicode_sequence),
file_path: Set(path),
@@ -147,12 +146,8 @@ pub async fn create(
sha256: Set(sha),
..Default::default()
};
let created = state.services.emoji.create(model, aliases).await?;
let aliases = state.repositories.emoji.aliases(created.id).await?;
Ok((
StatusCode::CREATED,
Json(mapper::response(created, mapper::aliases(aliases))),
))
let created = state.services.emoji.create(model, name).await?;
Ok((StatusCode::CREATED, Json(mapper::response(created))))
}
#[utoipa::path(put, path = "/emojis/{id}", request_body = UpdateEmojiRequest, params(("id" = Uuid, Path)), responses((status = 200, body = crate::domain::dto::emoji::EmojiResponse)), tag = "Emojis")]
@@ -168,21 +163,11 @@ pub async fn update(
.await?
.ok_or(HTTPError::NotFound)?;
let target_server_id = payload.server_id.or(existing.server_id);
let aliases_to_validate = match &payload.aliases {
Some(aliases) => aliases.clone(),
None => state
.repositories
.emoji
.aliases(id)
.await?
.into_iter()
.map(|a| a.alias)
.collect(),
};
let target_name = payload.name.as_deref().unwrap_or(&existing.name);
state
.services
.emoji
.aliases_available(&aliases_to_validate, target_server_id, Some(id))
.name_available(target_name, target_server_id, Some(id))
.await?;
let mut active: emoji::ActiveModel = existing.into();
if let Some(server_id) = payload.server_id {
@@ -197,21 +182,11 @@ pub async fn update(
if payload.unicode_sequence.is_some() {
active.unicode_sequence = Set(payload.unicode_sequence);
}
let updated = state.repositories.emoji.update(active).await?;
if let Some(ref aliases) = payload.aliases {
state
.services
.emoji
.aliases_available(aliases, updated.server_id, Some(id))
.await?;
state
.services
.emoji
.replace_aliases(id, aliases.clone())
.await?;
if let Some(name) = payload.name {
active.name = Set(EmojiService::normalize_name(&name)?);
}
let aliases = state.repositories.emoji.aliases(id).await?;
Ok(Json(mapper::response(updated, mapper::aliases(aliases))))
let updated = state.repositories.emoji.update(active).await?;
Ok(Json(mapper::response(updated)))
}
fn detect_mime(bytes: &[u8]) -> Option<String> {