Add skill import functionality and update database configuration
This commit is contained in:
@@ -78,6 +78,7 @@ impl Hooks for App {
|
||||
tasks.register(tasks::create_user::CreateUserData);
|
||||
tasks.register(tasks::create_job::CreateJobData);
|
||||
tasks.register(tasks::create_skill::CreateSkillData);
|
||||
tasks.register(tasks::import_skills::ImportSkills);
|
||||
tasks.register(tasks::add_data_file::AddDataFile);
|
||||
tasks.register(tasks::delete_data::DeleteData);
|
||||
tasks.register(tasks::clear_data::ClearData);
|
||||
|
@@ -1,7 +1,7 @@
|
||||
use loco_rs::prelude::*;
|
||||
use sea_orm::QueryOrder;
|
||||
|
||||
use crate::models::_entities::skills::{Column, Entity, Model};
|
||||
use crate::models::_entities::skills::{ActiveModel, Column, Entity, Model};
|
||||
|
||||
pub async fn get_all_skills(ctx: &AppContext) -> Result<Vec<Model>> {
|
||||
let skills = Entity::find()
|
||||
@@ -9,3 +9,25 @@ pub async fn get_all_skills(ctx: &AppContext) -> Result<Vec<Model>> {
|
||||
.all(&ctx.db).await?;
|
||||
Ok(skills)
|
||||
}
|
||||
|
||||
pub async fn add_skill(ctx: &AppContext, name: String) -> Result<Model> {
|
||||
let new_skill = ActiveModel {
|
||||
name: Set(name),
|
||||
..Default::default()
|
||||
};
|
||||
let new_skill = new_skill.insert(&ctx.db).await?;
|
||||
Ok(new_skill)
|
||||
}
|
||||
|
||||
pub async fn add_skills(ctx: &AppContext, skills: Vec<String>) -> Result<Vec<Model>> {
|
||||
let mut new_skills = vec![];
|
||||
for skill in skills {
|
||||
let new_skill = ActiveModel {
|
||||
name: Set(skill),
|
||||
..Default::default()
|
||||
};
|
||||
let new_skill = new_skill.insert(&ctx.db).await?;
|
||||
new_skills.push(new_skill);
|
||||
}
|
||||
Ok(new_skills)
|
||||
}
|
@@ -1,6 +1,6 @@
|
||||
use loco_rs::prelude::*;
|
||||
|
||||
use crate::models::_entities::skills::ActiveModel;
|
||||
use crate::services::skills::add_skill;
|
||||
|
||||
pub struct CreateSkillData;
|
||||
|
||||
@@ -16,13 +16,7 @@ impl Task for CreateSkillData {
|
||||
async fn run(&self, app_context: &AppContext, vars: &task::Vars) -> Result<()> {
|
||||
let name = vars.cli_arg("name")?;
|
||||
|
||||
let mut item = ActiveModel {
|
||||
..Default::default()
|
||||
};
|
||||
|
||||
item.name = Set(name.to_string());
|
||||
|
||||
let item = item.insert(&app_context.db).await?;
|
||||
let item = add_skill(app_context, name.to_string()).await?;
|
||||
|
||||
tracing::info!(
|
||||
skill_id = item.id,
|
||||
|
70
src/tasks/import_skills.rs
Normal file
70
src/tasks/import_skills.rs
Normal file
@@ -0,0 +1,70 @@
|
||||
use loco_rs::prelude::*;
|
||||
use serde::Deserialize;
|
||||
|
||||
use crate::services::skills::add_skills;
|
||||
|
||||
pub struct ImportSkills;
|
||||
|
||||
#[derive(Deserialize)]
|
||||
struct Skill {
|
||||
name: String,
|
||||
}
|
||||
|
||||
#[derive(Deserialize)]
|
||||
struct Skills {
|
||||
skills: Vec<Skill>,
|
||||
}
|
||||
|
||||
#[async_trait]
|
||||
impl Task for ImportSkills {
|
||||
fn task(&self) -> TaskInfo {
|
||||
TaskInfo {
|
||||
name: "import_skills".to_string(),
|
||||
detail: "Task for importing skills from json file or stdin".to_string(),
|
||||
}
|
||||
}
|
||||
|
||||
async fn run(&self, app_context: &AppContext, vars: &task::Vars) -> Result<()> {
|
||||
let from_file = vars.cli_arg("from_file").ok().map(|v| v.parse::<bool>().unwrap_or(false)).unwrap_or(false);
|
||||
|
||||
match from_file {
|
||||
true => {
|
||||
let file_path = vars.cli_arg("file_path")?;
|
||||
|
||||
let data = std::fs::read_to_string(file_path)?;
|
||||
let skills: Skills = serde_json::from_str(&data)?;
|
||||
process_skills(app_context, skills).await?;
|
||||
|
||||
Ok(())
|
||||
},
|
||||
false => {
|
||||
let raw_data = vars.cli_arg("raw_data")?;
|
||||
let skills: Skills = get_skills_from_raw_data(&raw_data);
|
||||
process_skills(app_context, skills).await?;
|
||||
|
||||
Ok(())
|
||||
},
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
fn get_skills_from_raw_data(raw_data: &str) -> Skills {
|
||||
let skills = raw_data.split(',').map(|s| Skill { name: s.to_string() }).collect();
|
||||
Skills { skills }
|
||||
}
|
||||
|
||||
async fn process_skills(app_context: &AppContext, skills: Skills) -> Result<()> {
|
||||
let skills_names = skills.skills.iter().map(|s| s.name.clone()).collect();
|
||||
let items = add_skills(app_context, skills_names).await?;
|
||||
|
||||
for item in items {
|
||||
tracing::info!(
|
||||
skill_id = item.id,
|
||||
skill_name = &item.name,
|
||||
"Skill created successfully",
|
||||
);
|
||||
}
|
||||
|
||||
Ok(())
|
||||
}
|
@@ -5,4 +5,5 @@ pub mod create_user;
|
||||
pub mod seed;
|
||||
pub mod clear_data;
|
||||
pub mod delete_data;
|
||||
pub mod delete_project;
|
||||
pub mod delete_project;
|
||||
pub mod import_skills;
|
Reference in New Issue
Block a user