From cb7e175381f75cdf9bf7e8ba90719959b543efc5 Mon Sep 17 00:00:00 2001 From: FrenchGithubUser Date: Sat, 29 Nov 2025 15:54:16 +0100 Subject: [PATCH] feat: edit artist on frontend, resolves #363 --- backend/api/src/api_doc.rs | 1 + .../api/src/handlers/artists/edit_artist.rs | 4 +- backend/api/tests/test_artist.rs | 4 +- backend/storage/src/models/artist.rs | 2 +- .../src/repositories/artist_repository.rs | 4 +- frontend/src/api-schema/schema.d.ts | 33 ++++++- .../components/artist/ArtistSlimHeader.vue | 57 ++++++++++- .../components/artist/EditArtistDialog.vue | 99 +++++++++++++++++++ frontend/src/i18n/en.json | 2 + frontend/src/services/api/artistService.ts | 6 ++ frontend/src/views/ArtistView.vue | 2 +- 11 files changed, 202 insertions(+), 12 deletions(-) create mode 100644 frontend/src/components/artist/EditArtistDialog.vue diff --git a/backend/api/src/api_doc.rs b/backend/api/src/api_doc.rs index d7c1e7ad..64c537be 100644 --- a/backend/api/src/api_doc.rs +++ b/backend/api/src/api_doc.rs @@ -34,6 +34,7 @@ use crate::handlers::{ crate::handlers::home::get_home::exec, crate::handlers::artists::get_artist_publications::exec, crate::handlers::artists::create_artists::exec, + crate::handlers::artists::edit_artist::exec, crate::handlers::affiliated_artists::create_affiliated_artists::exec, crate::handlers::affiliated_artists::remove_affiliated_artists::exec, crate::handlers::torrents::download_dottorrent_file::exec, diff --git a/backend/api/src/handlers/artists/edit_artist.rs b/backend/api/src/handlers/artists/edit_artist.rs index deeb119e..4685fe0a 100644 --- a/backend/api/src/handlers/artists/edit_artist.rs +++ b/backend/api/src/handlers/artists/edit_artist.rs @@ -3,7 +3,7 @@ use actix_web::{web::Data, web::Json, HttpResponse}; use arcadia_common::error::{Error, Result}; use arcadia_storage::models::artist::Artist; use arcadia_storage::models::user::UserClass; -use arcadia_storage::{models::artist::UserEditedArtist, redis::RedisPoolInterface}; +use arcadia_storage::{models::artist::EditedArtist, redis::RedisPoolInterface}; const GRACE_PERIOD_IN_DAYS: i64 = 7; @@ -20,7 +20,7 @@ const GRACE_PERIOD_IN_DAYS: i64 = 7; ) )] pub async fn exec( - form: Json, + form: Json, arc: Data>, user: Authdata, ) -> Result { diff --git a/backend/api/tests/test_artist.rs b/backend/api/tests/test_artist.rs index f0ff9e6f..d20d90ef 100644 --- a/backend/api/tests/test_artist.rs +++ b/backend/api/tests/test_artist.rs @@ -5,7 +5,7 @@ use crate::common::TestUser; use actix_web::http::StatusCode; use actix_web::test; use arcadia_storage::connection_pool::ConnectionPool; -use arcadia_storage::models::artist::{Artist, UserEditedArtist}; +use arcadia_storage::models::artist::{Artist, EditedArtist}; use common::auth_header; use common::create_test_app_and_login; use mocks::mock_redis::MockRedisPool; @@ -21,7 +21,7 @@ async fn test_staff_can_edit_artist(pool: PgPool) { let (service, user) = create_test_app_and_login(pool, MockRedisPool::default(), 100, 100, TestUser::Staff).await; - let req_body = UserEditedArtist{ + let req_body = EditedArtist{ id: 1, name: "Beatles, The".into(), description: "They are actually called 'The Beatles', but we decided to be weird with articles.".into(), diff --git a/backend/storage/src/models/artist.rs b/backend/storage/src/models/artist.rs index 561b9b85..2da47c83 100644 --- a/backend/storage/src/models/artist.rs +++ b/backend/storage/src/models/artist.rs @@ -36,7 +36,7 @@ pub struct UserCreatedArtist { } #[derive(Debug, Deserialize, Serialize, ToSchema)] -pub struct UserEditedArtist { +pub struct EditedArtist { pub id: i64, pub name: String, pub description: String, diff --git a/backend/storage/src/repositories/artist_repository.rs b/backend/storage/src/repositories/artist_repository.rs index c5d49393..3644829f 100644 --- a/backend/storage/src/repositories/artist_repository.rs +++ b/backend/storage/src/repositories/artist_repository.rs @@ -1,4 +1,4 @@ -use crate::models::artist::UserEditedArtist; +use crate::models::artist::EditedArtist; use crate::models::common::OrderByDirection; use crate::{ connection_pool::ConnectionPool, @@ -207,7 +207,7 @@ impl ConnectionPool { .map_err(Error::CouldNotFindArtist) } - pub async fn update_artist_data(&self, updated_artist: &UserEditedArtist) -> Result { + pub async fn update_artist_data(&self, updated_artist: &EditedArtist) -> Result { sqlx::query_as!( Artist, r#" diff --git a/frontend/src/api-schema/schema.d.ts b/frontend/src/api-schema/schema.d.ts index d1899db6..93408738 100644 --- a/frontend/src/api-schema/schema.d.ts +++ b/frontend/src/api-schema/schema.d.ts @@ -28,7 +28,7 @@ export interface paths { cookie?: never; }; get: operations["Get artist publications"]; - put?: never; + put: operations["Edit artist"]; post: operations["Create artist"]; delete?: never; options?: never; @@ -1255,6 +1255,13 @@ export interface components { /** Format: int32 */ id: number; }; + EditedArtist: { + description: string; + /** Format: int64 */ + id: number; + name: string; + pictures: string[]; + }; EditedTitleGroup: { category?: null | components["schemas"]["TitleGroupCategory"]; content_type: components["schemas"]["ContentType"]; @@ -3058,6 +3065,30 @@ export interface operations { }; }; }; + "Edit artist": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody: { + content: { + "application/json": components["schemas"]["EditedArtist"]; + }; + }; + responses: { + /** @description Successfully edited the artist */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["Artist"]; + }; + }; + }; + }; "Create artist": { parameters: { query?: never; diff --git a/frontend/src/components/artist/ArtistSlimHeader.vue b/frontend/src/components/artist/ArtistSlimHeader.vue index 2c69c21b..69b1fc48 100644 --- a/frontend/src/components/artist/ArtistSlimHeader.vue +++ b/frontend/src/components/artist/ArtistSlimHeader.vue @@ -1,14 +1,65 @@ diff --git a/frontend/src/i18n/en.json b/frontend/src/i18n/en.json index e063dc9d..07212314 100644 --- a/frontend/src/i18n/en.json +++ b/frontend/src/i18n/en.json @@ -15,6 +15,7 @@ "cover": "Cover | Covers", "external_link": "External link | External links", "screenshots": "Screenshots", + "pictures": "Pictures", "name": "Name", "title": "Title", "category": "Category", @@ -76,6 +77,7 @@ "new_artist": "New artist", "existing_artist": "Existing artist", "no_affiliated_artist_registered": "No affiliated artist registered", + "edit": "Edit artist", "role": { "role": "Role | Roles", "main": "Main", diff --git a/frontend/src/services/api/artistService.ts b/frontend/src/services/api/artistService.ts index 61b03362..2f9da381 100644 --- a/frontend/src/services/api/artistService.ts +++ b/frontend/src/services/api/artistService.ts @@ -15,10 +15,16 @@ export type UserCreatedAffiliatedArtist = components['schemas']['UserCreatedAffi export type UserCreatedArtist = components['schemas']['UserCreatedArtist'] +export type EditedArtist = components['schemas']['EditedArtist'] + export const getArtist = async (id: number): Promise => { return (await api.get('/artists?id=' + id)).data } +export const editArtist = async (artist: EditedArtist): Promise => { + return (await api.put('/artists', artist)).data +} + export const createArtists = async (artists: UserCreatedArtist[]): Promise => { return (await api.post('/artists', artists)).data } diff --git a/frontend/src/views/ArtistView.vue b/frontend/src/views/ArtistView.vue index 44d81ebe..06f361d1 100644 --- a/frontend/src/views/ArtistView.vue +++ b/frontend/src/views/ArtistView.vue @@ -9,7 +9,7 @@ >
- +