Add types and insert functionality to dao

Signed-off-by: trivernis <trivernis@protonmail.com>
feature/tag-implications
trivernis 2 years ago
parent 3bc2b046ea
commit d0dfa2b638
Signed by: Trivernis
GPG Key ID: DFFFCC2C7A02DB45

@ -6,6 +6,7 @@ pub struct TagResponse {
pub id: i64,
pub namespace: Option<String>,
pub name: String,
pub implied_by: Option<i64>,
}
#[derive(Clone, Debug, Serialize, Deserialize)]
@ -20,3 +21,19 @@ pub struct ChangeFileTagsRequest {
pub removed_tags: Vec<i64>,
pub added_tags: Vec<i64>,
}
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct AddTagImplicationsRequest {
pub implications: TagImplication,
}
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct TagImplication {
pub tag_id: i64,
pub implied_tag_id: i64,
}
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct RemoveTagImplicationsRequest {
pub implications: TagImplication,
}

@ -1,6 +1,7 @@
pub use sea_orm_migration::prelude::*;
mod m20220101_000001_create_table;
mod m20220611_122851_tag_implications;
mod utils;
pub struct Migrator;
@ -8,6 +9,9 @@ pub struct Migrator;
#[async_trait::async_trait]
impl MigratorTrait for Migrator {
fn migrations() -> Vec<Box<dyn MigrationTrait>> {
vec![Box::new(m20220101_000001_create_table::Migration)]
vec![
Box::new(m20220101_000001_create_table::Migration),
Box::new(m20220611_122851_tag_implications::Migration),
]
}
}

@ -0,0 +1,71 @@
use sea_orm_migration::prelude::*;
pub struct Migration;
impl MigrationName for Migration {
fn name(&self) -> &str {
"m20220611_122851_tag_implications"
}
}
#[async_trait::async_trait]
impl MigrationTrait for Migration {
async fn up(&self, manager: &SchemaManager) -> Result<(), DbErr> {
manager.create_table(create_tag_impliations_table()).await?;
Ok(())
}
async fn down(&self, manager: &SchemaManager) -> Result<(), DbErr> {
manager
.drop_table(Table::drop().table(TagImplications::Table).to_owned())
.await?;
Ok(())
}
}
#[derive(Iden)]
enum TagImplications {
Table,
TagId,
ImpliedTagId,
}
#[derive(Iden)]
enum Tags {
Table,
Id,
}
fn create_tag_impliations_table() -> TableCreateStatement {
Table::create()
.if_not_exists()
.table(TagImplications::Table)
.col(
ColumnDef::new(TagImplications::TagId)
.big_integer()
.not_null(),
)
.col(
ColumnDef::new(TagImplications::ImpliedTagId)
.big_integer()
.not_null(),
)
.primary_key(
Index::create()
.col(TagImplications::TagId)
.col(TagImplications::ImpliedTagId),
)
.foreign_key(
ForeignKey::create()
.from(TagImplications::Table, TagImplications::TagId)
.to(Tags::Table, Tags::Id),
)
.foreign_key(
ForeignKey::create()
.from(TagImplications::Table, TagImplications::ImpliedTagId)
.to(Tags::Table, Tags::Id),
)
.to_owned()
}

@ -10,3 +10,4 @@ pub mod sorting_preset;
pub mod sorting_preset_key;
pub mod source;
pub mod tag;
pub mod tag_implication;

@ -0,0 +1,48 @@
use sea_orm::prelude::*;
#[derive(Clone, Debug, PartialEq, DeriveEntityModel)]
#[sea_orm(table_name = "tag_implications")]
pub struct Model {
#[sea_orm(primary_key)]
pub tag_id: i64,
pub implied_tag_id: i64,
}
#[derive(Copy, Clone, Debug, EnumIter, DeriveRelation)]
pub enum Relation {
#[sea_orm(
belongs_to = "super::tag::Entity",
from = "Column::TagId",
to = "super::tag::Column::Id"
)]
Tag,
#[sea_orm(
belongs_to = "super::tag::Entity",
from = "Column::TagId",
to = "super::tag::Column::Id"
)]
ImpliedTag,
}
pub struct TagToImpliedLink;
pub struct ImpliedToTagLink;
impl Linked for TagToImpliedLink {
type FromEntity = super::tag::Entity;
type ToEntity = super::tag::Entity;
fn link(&self) -> Vec<sea_orm::LinkDef> {
vec![Relation::Tag.def().rev(), Relation::ImpliedTag.def()]
}
}
impl Linked for ImpliedToTagLink {
type FromEntity = super::tag::Entity;
type ToEntity = super::tag::Entity;
fn link(&self) -> Vec<sea_orm::LinkDef> {
vec![Relation::ImpliedTag.def().rev(), Relation::Tag.def()]
}
}
impl ActiveModelBehavior for ActiveModel {}

@ -0,0 +1,23 @@
use crate::dto::AddTagImplicationDto;
use mediarepo_core::error::RepoResult;
use mediarepo_database::entities::tag_implication;
use super::TagDao;
use sea_orm::{prelude::*, Set};
impl TagDao {
pub async fn add_implications(&self, dtos: Vec<AddTagImplicationDto>) -> RepoResult<()> {
let active_models = dtos
.into_iter()
.map(|dto| tag_implication::ActiveModel {
tag_id: Set(dto.tag_id),
implied_tag_id: Set(dto.implied_tag_id),
})
.collect::<Vec<tag_implication::ActiveModel>>();
tag_implication::Entity::insert_many(active_models)
.exec(&self.ctx.db)
.await?;
Ok(())
}
}

@ -14,6 +14,7 @@ use crate::dao_provider;
use crate::dto::{NamespaceDto, TagDto};
pub mod add;
pub mod add_implication;
pub mod all_for_cds_map;
pub mod by_name;
pub mod cdids_with_namespaced_tags;

@ -1,5 +1,6 @@
pub use mediarepo_database::entities::namespace;
pub use mediarepo_database::entities::tag;
pub use mediarepo_database::entities::tag_implication;
use crate::dto::NamespaceDto;
@ -60,3 +61,26 @@ impl AddTagDto {
}
}
}
pub struct TagImplicationDto {
model: tag_implication::Model,
}
impl TagImplicationDto {
pub fn tag_id(&self) -> i64 {
self.model.tag_id
}
pub fn implied_tag_id(&self) -> i64 {
self.model.implied_tag_id
}
}
#[derive(Clone, Debug)]
pub struct ModifyTagImplicationDto {
pub tag_id: i64,
pub implied_tag_id: i64,
}
pub type AddTagImplicationDto = ModifyTagImplicationDto;
pub type DeleteTagImplicationDto = ModifyTagImplicationDto;

@ -55,6 +55,7 @@ impl FromModel<TagDto> for TagResponse {
id: model.id(),
namespace: model.namespace().map(|n| n.name().to_owned()),
name: model.name().to_owned(),
implied_by: None,
}
}
}

Loading…
Cancel
Save