From 2d703f2648cf11f28fda94357aa9e968c3fbcaad Mon Sep 17 00:00:00 2001 From: Brendan Allan Date: Mon, 19 Jun 2023 00:13:55 +0200 Subject: [PATCH] Make indexer rules optional (#965) * optional indexer rules * lockfile --- core/prisma/schema.prisma | 17 +++++----- core/src/api/locations.rs | 2 +- core/src/library/config.rs | 6 ++-- core/src/location/indexer/rules.rs | 53 ++++++++++++++++-------------- packages/client/src/core.ts | 2 +- pnpm-lock.yaml | 3 +- 6 files changed, 42 insertions(+), 41 deletions(-) diff --git a/core/prisma/schema.prisma b/core/prisma/schema.prisma index f35e4ba56..50e3e669c 100644 --- a/core/prisma/schema.prisma +++ b/core/prisma/schema.prisma @@ -447,13 +447,14 @@ model Job { //// Indexer Rules //// model IndexerRule { - id Int @id @default(autoincrement()) - pub_id Bytes? @unique - name String - default Boolean @default(false) - rules_per_kind Bytes - date_created DateTime @default(now()) - date_modified DateTime @default(now()) + id Int @id @default(autoincrement()) + pub_id Bytes @unique + + name String? + default Boolean? + rules_per_kind Bytes? + date_created DateTime? + date_modified DateTime? locations IndexerRulesInLocation[] @@ -461,8 +462,6 @@ model IndexerRule { } model IndexerRulesInLocation { - date_created DateTime @default(now()) - location_id Int location Location @relation(fields: [location_id], references: [id], onDelete: NoAction, onUpdate: NoAction) diff --git a/core/src/api/locations.rs b/core/src/api/locations.rs index 96d6078ab..4cd02c746 100644 --- a/core/src/api/locations.rs +++ b/core/src/api/locations.rs @@ -215,7 +215,7 @@ fn mount_indexer_rule_routes() -> AlphaRouter { .exec() .await? { - if indexer_rule.default { + if indexer_rule.default.unwrap_or_default() { return Err(rspc::Error::new( ErrorCode::Forbidden, format!("Indexer rule can't be deleted"), diff --git a/core/src/library/config.rs b/core/src/library/config.rs index 41d2bb09c..9da596652 100644 --- a/core/src/library/config.rs +++ b/core/src/library/config.rs @@ -49,9 +49,9 @@ impl Migrate for LibraryConfig { .enumerate() .map(|(i, name)| { db.indexer_rule().update_many( - vec![indexer_rule::name::equals(name)], - vec![indexer_rule::pub_id::set(Some(uuid_to_bytes( - Uuid::from_u128(i as u128), + vec![indexer_rule::name::equals(Some(name))], + vec![indexer_rule::pub_id::set(uuid_to_bytes(Uuid::from_u128( + i as u128, )))], ) }) diff --git a/core/src/location/indexer/rules.rs b/core/src/location/indexer/rules.rs index 2763511c0..48240f8e3 100644 --- a/core/src/location/indexer/rules.rs +++ b/core/src/location/indexer/rules.rs @@ -2,7 +2,7 @@ use crate::{ library::Library, prisma::indexer_rule, util::{ - db::uuid_to_bytes, + db::{maybe_missing, uuid_to_bytes, MissingFieldError}, error::{FileIOError, NonUtf8PathError}, }, }; @@ -46,6 +46,8 @@ pub enum IndexerRuleError { RejectByItsChildrenFileIO(FileIOError), #[error("database error: {0}")] Database(#[from] prisma_client_rust::QueryError), + #[error("missing-field: {0}")] + MissingField(#[from] MissingFieldError), } impl From for rspc::Error { @@ -122,16 +124,18 @@ impl IndexerRuleCreateArgs { return Ok(None); } + use indexer_rule::*; + Ok(Some( library .db .indexer_rule() .create( - self.name, - rules_data, - vec![indexer_rule::pub_id::set(Some(uuid_to_bytes( - generate_pub_id(), - )))], + uuid_to_bytes(generate_pub_id()), + vec![ + name::set(Some(self.name)), + rules_per_kind::set(Some(rules_data)), + ], ) .exec() .await?, @@ -485,11 +489,14 @@ impl TryFrom<&indexer_rule::Data> for IndexerRule { fn try_from(data: &indexer_rule::Data) -> Result { Ok(Self { id: Some(data.id), - name: data.name.clone(), - default: data.default, - rules: rmp_serde::from_slice(&data.rules_per_kind)?, - date_created: data.date_created.into(), - date_modified: data.date_modified.into(), + name: maybe_missing(data.name.clone(), "indexer_rule.name")?, + default: maybe_missing(data.default, "indexer_rule.default")?, + rules: rmp_serde::from_slice(maybe_missing( + &data.rules_per_kind, + "indexer_rule.rules_per_kind", + )?)?, + date_created: maybe_missing(data.date_created, "indexer_rule.date_created")?.into(), + date_modified: maybe_missing(data.date_modified, "indexer_rule.date_modified")?.into(), }) } } @@ -643,24 +650,20 @@ mod seeder { let pub_id = uuid_to_bytes(Uuid::from_u128(i as u128)); let rules = rmp_serde::to_vec_named(&rule.rules).map_err(IndexerRuleError::from)?; + use indexer_rule::*; + + let data = vec![ + name::set(Some(rule.name.to_string())), + rules_per_kind::set(Some(rules.clone())), + default::set(Some(rule.default)), + ]; + client .indexer_rule() .upsert( indexer_rule::pub_id::equals(pub_id.clone()), - indexer_rule::create( - rule.name.to_string(), - rules.clone(), - vec![ - indexer_rule::pub_id::set(Some(pub_id.clone())), - indexer_rule::default::set(rule.default), - ], - ), - vec![ - indexer_rule::name::set(rule.name.to_string()), - indexer_rule::rules_per_kind::set(rules), - indexer_rule::pub_id::set(Some(pub_id.clone())), - indexer_rule::default::set(rule.default), - ], + indexer_rule::create(pub_id.clone(), data.clone()), + data, ) .exec() .await?; diff --git a/packages/client/src/core.ts b/packages/client/src/core.ts index d970b64b8..409d36517 100644 --- a/packages/client/src/core.ts +++ b/packages/client/src/core.ts @@ -120,7 +120,7 @@ export type GetArgs = { id: number } export type IdentifyUniqueFilesArgs = { id: number; path: string } -export type IndexerRule = { id: number; pub_id: number[] | null; name: string; default: boolean; rules_per_kind: number[]; date_created: string; date_modified: string } +export type IndexerRule = { id: number; pub_id: number[]; name: string | null; default: boolean | null; rules_per_kind: number[] | null; date_created: string | null; date_modified: string | null } /** * `IndexerRuleCreateArgs` is the argument received from the client using rspc to create a new indexer rule. diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d21b199c4..441756c90 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -5829,7 +5829,7 @@ packages: magic-string: 0.27.0 react-docgen-typescript: 2.2.2(typescript@5.0.4) typescript: 5.0.4 - vite: 4.3.9(less@4.1.3) + vite: 4.3.9(@types/node@18.15.1) /@jridgewell/gen-mapping@0.3.3: resolution: {integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==} @@ -23807,7 +23807,6 @@ packages: rollup: 3.24.1 optionalDependencies: fsevents: 2.3.2 - dev: true /vite@4.3.9(less@4.1.3): resolution: {integrity: sha512-qsTNZjO9NoJNW7KnOrgYwczm0WctJ8m/yqYAMAK9Lxt4SoySUfS5S8ia9K7JHpa3KEeMfyF8LoJ3c5NeBJy6pg==}