fix pkg. add id not populated error and migrate to transaction

This commit is contained in:
lukas-heiligenbrunner 2024-02-15 19:18:10 +01:00
parent 9ecbc8a77a
commit d344ac2d73
2 changed files with 17 additions and 10 deletions

View File

@ -12,7 +12,8 @@ use rocket::{get, post, State};
use rocket_okapi::okapi::schemars; use rocket_okapi::okapi::schemars;
use rocket_okapi::{openapi, JsonSchema}; use rocket_okapi::{openapi, JsonSchema};
use sea_orm::{ use sea_orm::{
ActiveModelTrait, ColumnTrait, EntityTrait, QueryFilter, QueryOrder, QuerySelect, RelationTrait, ActiveModelTrait, ColumnTrait, EntityTrait, QueryFilter, QueryOrder, QuerySelect,
RelationTrait, TransactionTrait,
}; };
use sea_orm::{DatabaseConnection, Set}; use sea_orm::{DatabaseConnection, Set};
use tokio::sync::broadcast::Sender; use tokio::sync::broadcast::Sender;
@ -30,14 +31,17 @@ pub async fn package_add(
input: Json<AddBody>, input: Json<AddBody>,
tx: &State<Sender<Action>>, tx: &State<Sender<Action>>,
) -> Result<(), BadRequest<String>> { ) -> Result<(), BadRequest<String>> {
let db = db as &DatabaseConnection; let txn = db
.begin()
.await
.map_err(|e| BadRequest(Some(e.to_string())))?;
// remove leading and trailing whitespaces // remove leading and trailing whitespaces
let pkg_name = input.name.trim(); let pkg_name = input.name.trim();
if let Some(..) = Packages::find() if let Some(..) = Packages::find()
.filter(packages::Column::Name.eq(pkg_name)) .filter(packages::Column::Name.eq(pkg_name))
.one(db) .one(&txn)
.await .await
.map_err(|e| BadRequest(Some(e.to_string())))? .map_err(|e| BadRequest(Some(e.to_string())))?
{ {
@ -55,28 +59,28 @@ pub async fn package_add(
..Default::default() ..Default::default()
}; };
new_package let mut new_package = new_package
.clone() .clone()
.save(db) .save(&txn)
.await .await
.map_err(|e| BadRequest(Some(e.to_string())))?; .map_err(|e| BadRequest(Some(e.to_string())))?;
let new_version = versions::ActiveModel { let new_version = versions::ActiveModel {
version: Set(pkg.version.clone()), version: Set(pkg.version.clone()),
package_id: Set(new_package.id.clone().unwrap()), package_id: new_package.id.clone(),
..Default::default() ..Default::default()
}; };
new_version let new_version = new_version
.clone() .clone()
.save(db) .save(&txn)
.await .await
.map_err(|e| BadRequest(Some(e.to_string())))?; .map_err(|e| BadRequest(Some(e.to_string())))?;
new_package.status = Set(3); new_package.status = Set(3);
new_package.latest_version_id = Set(Some(new_version.id.clone().unwrap())); new_package.latest_version_id = Set(Some(new_version.id.clone().unwrap()));
new_package new_package
.save(db) .save(&txn)
.await .await
.map_err(|e| BadRequest(Some(e.to_string())))?; .map_err(|e| BadRequest(Some(e.to_string())))?;
@ -87,6 +91,9 @@ pub async fn package_add(
new_version, new_version,
)); ));
txn.commit()
.await
.map_err(|e| BadRequest(Some(e.to_string())))?;
Ok(()) Ok(())
} }

View File

@ -1,4 +1,4 @@
use crate::repo::repo::{remove_version}; use crate::repo::repo::remove_version;
use rocket::{post, State}; use rocket::{post, State};
use rocket_okapi::openapi; use rocket_okapi::openapi;
use sea_orm::DatabaseConnection; use sea_orm::DatabaseConnection;