init
This commit is contained in:
@@ -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> {
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
use crate::{domain::dto::emoji::EmojiResponse, models::emoji};
|
||||
|
||||
pub fn response(model: emoji::Model, aliases: Vec<String>) -> EmojiResponse {
|
||||
pub fn response(model: emoji::Model) -> EmojiResponse {
|
||||
EmojiResponse {
|
||||
id: model.id,
|
||||
server_id: model.server_id,
|
||||
emoji_type: model.emoji_type,
|
||||
unicode_sequence: model.unicode_sequence,
|
||||
aliases,
|
||||
name: model.name,
|
||||
asset_url: model
|
||||
.file_path
|
||||
.as_ref()
|
||||
@@ -19,7 +19,3 @@ pub fn response(model: emoji::Model, aliases: Vec<String>) -> EmojiResponse {
|
||||
updated_at: model.updated_at,
|
||||
}
|
||||
}
|
||||
|
||||
pub fn aliases(models: Vec<crate::models::emoji_alias::Model>) -> Vec<String> {
|
||||
models.into_iter().map(|a| a.alias).collect()
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user