Add thumbnail model to model subcrate

Signed-off-by: trivernis <trivernis@protonmail.com>
pull/4/head
trivernis 3 years ago
parent fd092e8f3e
commit 13f3b39f8b

@ -736,7 +736,7 @@ dependencies = [
[[package]]
name = "mediarepo-database"
version = "0.1.0"
version = "0.2.0"
dependencies = [
"chrono",
"mediarepo-core",

@ -0,0 +1,7 @@
use async_trait::async_trait;
#[async_trait]
pub trait AsyncTryFrom<T> {
type Error;
fn async_try_from(other: T) -> Result<Self, Self::Error>;
}

@ -651,7 +651,7 @@ dependencies = [
[[package]]
name = "mediarepo-database"
version = "0.1.0"
version = "0.2.0"
dependencies = [
"chrono",
"mediarepo-core",

@ -1,6 +1,6 @@
[package]
name = "mediarepo-database"
version = "0.1.0"
version = "0.2.0"
edition = "2018"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html

@ -0,0 +1,14 @@
-- Add migration script here
CREATE TABLE thumbnails (
id INTEGER PRIMARY KEY AUTOINCREMENT,
hash_id INTEGER UNIQUE NOT NULL,
storage_id INTEGER NOT NULL,
file_id INTEGER NOT NULL,
height INTEGER NOT NULL,
width INTEGER NOT NULL,
FOREIGN KEY (hash_id) REFERENCES hashes (id),
FOREIGN KEY (storage_id) REFERENCES storage_locations (id),
FOREIGN KEY (file_id) REFERENCES files (id)
);
CREATE UNIQUE INDEX thumbnail_file_resolution ON thumbnails (file_id, height, width);

@ -32,6 +32,9 @@ pub enum Relation {
to = "super::storage::Column::Id"
)]
Storage,
#[sea_orm(has_many = "super::thumbnail::Entity")]
Thumbnail,
}
impl Related<super::hash::Entity> for Entity {
@ -46,4 +49,10 @@ impl Related<super::storage::Entity> for Entity {
}
}
impl Related<super::thumbnail::Entity> for Entity {
fn to() -> RelationDef {
Relation::Thumbnail.def()
}
}
impl ActiveModelBehavior for ActiveModel {}

@ -37,4 +37,10 @@ impl Related<super::source::Entity> for Entity {
}
}
impl Related<super::thumbnail::Entity> for Entity {
fn to() -> RelationDef {
super::thumbnail::Relation::Hash.def().rev()
}
}
impl ActiveModelBehavior for ActiveModel {}

@ -1,8 +1,9 @@
pub mod tag;
pub mod namespace;
pub mod hash;
pub mod source;
pub mod file;
pub mod hash;
pub mod hash_source;
pub mod hash_tag;
pub mod namespace;
pub mod source;
pub mod storage;
pub mod hash_source;
pub mod tag;
pub mod thumbnail;

@ -13,6 +13,8 @@ pub struct Model {
pub enum Relation {
#[sea_orm(has_many = "super::file::Entity")]
File,
#[sea_orm(has_many = "super::thumbnail::Entity")]
Thumbnail,
}
impl Related<super::file::Entity> for Entity {
@ -21,4 +23,10 @@ impl Related<super::file::Entity> for Entity {
}
}
impl Related<super::thumbnail::Entity> for Entity {
fn to() -> RelationDef {
Relation::Thumbnail.def()
}
}
impl ActiveModelBehavior for ActiveModel {}

@ -0,0 +1,57 @@
use sea_orm::prelude::*;
#[derive(Clone, Debug, PartialEq, DeriveEntityModel)]
#[sea_orm(table_name = "thumbnails")]
pub struct Model {
#[sea_orm(primary_key)]
pub id: i64,
pub file_id: i64,
pub storage_id: i64,
pub hash_id: i64,
pub height: i32,
pub width: i32,
}
#[derive(Copy, Clone, Debug, EnumIter, DeriveRelation)]
pub enum Relation {
#[sea_orm(
belongs_to = "super::file::Entity",
from = "Column::FileId",
to = "super::file::Column::Id"
)]
File,
#[sea_orm(
belongs_to = "super::hash::Entity",
from = "Column::HashId",
to = "super::hash::Column::Id"
)]
Hash,
#[sea_orm(
belongs_to = "super::storage::Entity",
from = "Column::StorageId",
to = "super::storage::Column::Id"
)]
Storage,
}
impl Related<super::hash::Entity> for Entity {
fn to() -> RelationDef {
Relation::Hash.def()
}
}
impl Related<super::file::Entity> for Entity {
fn to() -> RelationDef {
Relation::File.def()
}
}
impl Related<super::storage::Entity> for Entity {
fn to() -> RelationDef {
Relation::Storage.def()
}
}
impl ActiveModelBehavior for ActiveModel {}

@ -651,7 +651,7 @@ dependencies = [
[[package]]
name = "mediarepo-database"
version = "0.1.0"
version = "0.2.0"
dependencies = [
"chrono",
"mediarepo-core",

@ -1,5 +1,6 @@
use crate::file_type::FileType;
use crate::storage::Storage;
use crate::thumbnail::Thumbnail;
use chrono::{Local, NaiveDateTime};
use mediarepo_core::error::RepoResult;
use mediarepo_database::entities::file;
@ -163,6 +164,11 @@ impl File {
Ok(storage)
}
/// Returns a list of thumbnails for the file
pub async fn thumbnails(&self) -> RepoResult<Vec<Thumbnail>> {
Thumbnail::for_file_id(self.db.clone(), self.model.id).await
}
/// Changes the name of the file
pub async fn set_name<S: ToString>(&mut self, name: S) -> RepoResult<()> {
let mut active_file = self.get_active_model();

@ -2,4 +2,5 @@ pub mod file;
pub mod file_type;
pub mod repo;
pub mod storage;
pub mod thumbnail;
pub mod type_keys;

@ -0,0 +1,72 @@
use crate::storage::Storage;
use mediarepo_core::error::RepoResult;
use mediarepo_database::entities::hash;
use mediarepo_database::entities::thumbnail;
use sea_orm::prelude::*;
use sea_orm::DatabaseConnection;
pub struct Thumbnail {
db: DatabaseConnection,
model: thumbnail::Model,
hash: hash::Model,
}
impl Thumbnail {
pub(crate) fn new(db: DatabaseConnection, model: thumbnail::Model, hash: hash::Model) -> Self {
Self { db, model, hash }
}
/// Returns the thumbnail by id
pub async fn by_id(db: DatabaseConnection, id: i64) -> RepoResult<Option<Self>> {
let model: Option<(thumbnail::Model, Option<hash::Model>)> =
thumbnail::Entity::find_by_id(id)
.find_also_related(hash::Entity)
.one(&db)
.await?;
if let Some((model, Some(hash))) = model {
Ok(Some(Self::new(db, model, hash)))
} else {
Ok(None)
}
}
/// Returns all thumbnails for a given file
pub async fn for_file_id(db: DatabaseConnection, file_id: i64) -> RepoResult<Vec<Self>> {
let thumb_models: Vec<(thumbnail::Model, Option<hash::Model>)> = thumbnail::Entity::find()
.filter(thumbnail::Column::FileId.eq(file_id))
.find_also_related(hash::Entity)
.all(&db)
.await?;
Ok(thumb_models
.into_iter()
.filter_map(|(m, h)| Some(Self::new(db.clone(), m, h?)))
.collect())
}
pub fn id(&self) -> i64 {
self.model.id
}
pub fn hash(&self) -> &String {
&self.hash.value
}
pub fn height(&self) -> i32 {
self.model.height
}
pub fn width(&self) -> i32 {
self.model.width
}
/// Returns the storage for the thumbnail
pub async fn storage(&self) -> RepoResult<Storage> {
let storage = Storage::by_id(self.db.clone(), self.model.storage_id)
.await?
.expect("The FK storage_id doesn't exist?!");
Ok(storage)
}
}

@ -652,7 +652,7 @@ dependencies = [
[[package]]
name = "mediarepo-database"
version = "0.1.0"
version = "0.2.0"
dependencies = [
"chrono",
"mediarepo-core",

Loading…
Cancel
Save