Add macros for chip, add tasks for creating job and skill
This commit is contained in:
1
Cargo.lock
generated
1
Cargo.lock
generated
@@ -1673,6 +1673,7 @@ dependencies = [
|
||||
"serde",
|
||||
"serde_json",
|
||||
"serial_test",
|
||||
"tera",
|
||||
"tokio",
|
||||
"tower 0.5.1",
|
||||
"tower-http",
|
||||
|
@@ -44,6 +44,7 @@ unic-langid = "0.9.4"
|
||||
axum-range = "0.4.0"
|
||||
axum-extra = { version = "0.9.4", features = ["multipart", "typed-header", "cookie"] }
|
||||
bytes = "1.8.0"
|
||||
tera = "1.20.0"
|
||||
# /view engine
|
||||
|
||||
[[bin]]
|
||||
|
File diff suppressed because one or more lines are too long
@@ -1,4 +1,5 @@
|
||||
{% extends "website/base.html" %} {% block content %}
|
||||
{% import "website/macros/chip.html" as chip %} {% extends "website/base.html"
|
||||
%} {% block content %}
|
||||
<span class="m-8">🌟</span>
|
||||
<div
|
||||
class="flex flex-col items-center justify-center gap-2 p-4 bg-white rounded-lg"
|
||||
@@ -26,56 +27,18 @@
|
||||
<div
|
||||
class="flex flex-wrap items-center justify-center gap-4 m-4 md:m-0 md:w-1/2"
|
||||
>
|
||||
<p
|
||||
class="text-base text-center rounded-2xl font-semibold tracking-tight text-black shadow-lg bg-yellow-400 p-2 min-w-[4rem] max-w-[12rem]"
|
||||
>
|
||||
Programming 💻
|
||||
</p>
|
||||
<p
|
||||
class="text-base text-center rounded-2xl font-semibold tracking-tight text-black shadow-lg bg-yellow-400 p-2 min-w-[4rem] max-w-[12rem]"
|
||||
>
|
||||
Filmmaking 🎥
|
||||
</p>
|
||||
<p
|
||||
class="text-base text-center rounded-2xl font-semibold tracking-tight text-black shadow-lg bg-yellow-400 p-2 min-w-[4rem] max-w-[12rem]"
|
||||
>
|
||||
Gaming 🕹️
|
||||
</p>
|
||||
<p
|
||||
class="text-base text-center rounded-2xl font-semibold tracking-tight text-black shadow-lg bg-yellow-400 p-2 min-w-[4rem] max-w-[12rem]"
|
||||
>
|
||||
Playing guitar 🎸
|
||||
</p>
|
||||
{{ chip::chip(text="Programming 💻")}} {{ chip::chip(text="Filmmaking 🎥")}}
|
||||
{{ chip::chip(text="Gaming 🕹️")}} {{ chip::chip(text="Playing guitar 🎸")}}
|
||||
</div>
|
||||
<h1 class="mt-6 text-3xl font-bold">Interests 🌌📚</h1>
|
||||
<div
|
||||
class="flex flex-wrap items-center justify-center gap-4 m-4 md:m-0 md:w-1/2"
|
||||
>
|
||||
<p
|
||||
class="text-base text-center rounded-2xl font-semibold tracking-tight text-black shadow-lg bg-yellow-400 p-2 min-w-[4rem] max-w-[12rem]"
|
||||
>
|
||||
Computer Science 💾
|
||||
</p>
|
||||
<p
|
||||
class="text-base text-center rounded-2xl font-semibold tracking-tight text-black shadow-lg bg-yellow-400 p-2 min-w-[4rem] max-w-[12rem]"
|
||||
>
|
||||
Sci-Fi Books 📚
|
||||
</p>
|
||||
<p
|
||||
class="text-base text-center rounded-2xl font-semibold tracking-tight text-black shadow-lg bg-yellow-400 p-2 min-w-[4rem] max-w-[12rem]"
|
||||
>
|
||||
Astronomy 🔭
|
||||
</p>
|
||||
<p
|
||||
class="text-base text-center rounded-2xl font-semibold tracking-tight text-black shadow-lg bg-yellow-400 p-2 min-w-[4rem] max-w-[12rem]"
|
||||
>
|
||||
Sports 🏅
|
||||
</p>
|
||||
<p
|
||||
class="text-base text-center rounded-2xl font-semibold tracking-tight text-black shadow-lg bg-yellow-400 p-2 min-w-[4rem] max-w-[12rem]"
|
||||
>
|
||||
History 🏰
|
||||
</p>
|
||||
{{ chip::chip(text="Computer Science 💾")}}
|
||||
{{ chip::chip(text="Sci-Fi Books📚")}}
|
||||
{{ chip::chip(text="Astronomy 🔭")}}
|
||||
{{ chip::chip(text="Sports 🏅") }}
|
||||
{{ chip::chip(text="History 🏰")}}
|
||||
</div>
|
||||
<h1 class="mt-6 text-3xl font-bold">FAQ ❓</h1>
|
||||
<div class="flex flex-col gap-2 m-4">
|
||||
|
@@ -1,10 +0,0 @@
|
||||
<div class="flex flex-col gap-2 p-4 text-black bg-gray-100 rounded-lg">
|
||||
<h4 class="text-2xl">
|
||||
<span class="fas fa-user-circle"></span> {{ job.position }}
|
||||
</h4>
|
||||
<h5 class="text-xl font-light">
|
||||
<span class="fas fa-building"></span> {{ job.company }}
|
||||
</h5>
|
||||
<p class="font-bold"><span class="fas fa-microchip"></span> Technologies</p>
|
||||
<div class="flex flex-wrap gap-2"></div>
|
||||
</div>
|
@@ -1,4 +1,5 @@
|
||||
{% extends "website/base.html" %} {% block content %}
|
||||
{% import "website/macros/chip.html" as chip %} {% extends "website/base.html"
|
||||
%} {% block content %}
|
||||
<div class="w-full mt-8"></div>
|
||||
<h3 class="mt-4 mb-2 text-5xl font-bold tracking-tight">Who am I? 🤔</h3>
|
||||
<section
|
||||
@@ -11,17 +12,11 @@
|
||||
💾.
|
||||
</section>
|
||||
<h3 class="mt-4 mb-2 text-5xl font-bold tracking-tight">Skills 🛠️</h3>
|
||||
{% for skill in skills %}
|
||||
<p
|
||||
class="text-base text-center rounded-2xl font-semibold tracking-tight text-black shadow-lg bg-yellow-400 p-2 min-w-[4rem] max-w-[12rem]"
|
||||
>
|
||||
{{ skill.name }}
|
||||
</p>
|
||||
{%endfor%}
|
||||
{% for skill in skills %} {{ chip::chip(text=skill.name) }} {%endfor%}
|
||||
<section class="flex flex-wrap justify-center w-1/2 gap-4"></section>
|
||||
<h3 class="mt-4 mb-2 text-5xl font-bold tracking-tight">Experience 📈</h3>
|
||||
{% for job in jobs %}
|
||||
<div class="bg-gray-100 rounded-lg p-4 text-black flex flex-col gap-2">
|
||||
<div class="flex flex-col gap-2 p-4 text-black bg-gray-100 rounded-lg">
|
||||
<h4 class="text-2xl">
|
||||
<span class="fas fa-user-circle"></span> {{ job.position }}
|
||||
</h4>
|
||||
@@ -40,13 +35,8 @@
|
||||
</h6>
|
||||
{% endif %}
|
||||
<p class="font-bold"><span class="fas fa-microchip"></span> Technologies</p>
|
||||
{% for technology in job.technologies %}
|
||||
<p
|
||||
class="text-base text-center rounded-2xl font-semibold tracking-tight text-black shadow-lg bg-yellow-400 p-2 min-w-[4rem] max-w-[12rem]"
|
||||
>
|
||||
{{ technology }}
|
||||
</p>
|
||||
{% endfor %}
|
||||
{% for technology in job.technologies %} {{ chip::chip(text=technology.name)
|
||||
}} {% endfor %}
|
||||
</div>
|
||||
{%endfor%}
|
||||
<section class="flex flex-col flex-wrap justify-center gap-4 m-4"></section>
|
||||
|
7
assets/views/website/macros/chip.html
Normal file
7
assets/views/website/macros/chip.html
Normal file
@@ -0,0 +1,7 @@
|
||||
{% macro chip(text) %}
|
||||
<p
|
||||
class="text-base text-center rounded-2xl font-semibold tracking-tight text-black shadow-lg bg-yellow-400 p-2 min-w-[4rem] max-w-[12rem]"
|
||||
>
|
||||
{{ text }}
|
||||
</p>
|
||||
{% endmacro chip %}
|
6
assets/views/website/projects.html
Normal file
6
assets/views/website/projects.html
Normal file
@@ -0,0 +1,6 @@
|
||||
{% extends "website/base.html" %} {% block content %}
|
||||
<span class="m-8"></span>
|
||||
<div class="flex flex-col w-full gap-4 m-4">
|
||||
<h1 class="text-5xl font-bold text-center">My projects</h1>
|
||||
</div>
|
||||
{% endblock content %}
|
@@ -70,6 +70,8 @@ impl Hooks for App {
|
||||
fn register_tasks(tasks: &mut Tasks) {
|
||||
tasks.register(tasks::seed::SeedData);
|
||||
tasks.register(tasks::create_user::CreateUserData);
|
||||
tasks.register(tasks::create_job::CreateJobData);
|
||||
tasks.register(tasks::create_skill::CreateSkillData);
|
||||
}
|
||||
|
||||
async fn truncate(db: &DatabaseConnection) -> Result<()> {
|
||||
|
@@ -31,10 +31,19 @@ pub async fn render_about(ViewEngine(v): ViewEngine<TeraView>) -> Result<impl In
|
||||
views::website::about(v).await
|
||||
}
|
||||
|
||||
pub async fn render_projects(
|
||||
ViewEngine(v): ViewEngine<TeraView>,
|
||||
State(ctx): State<AppContext>,
|
||||
) -> Result<impl IntoResponse> {
|
||||
views::website::projects(v, &ctx).await
|
||||
}
|
||||
|
||||
pub fn routes() -> Routes {
|
||||
Routes::new()
|
||||
.add("/", get(render_index))
|
||||
.add("/upload", get(render_upload))
|
||||
.add("/login", get(render_login))
|
||||
.add("/projects", get(render_projects))
|
||||
.add("/projets/:project_name", get(render_projects))
|
||||
.add("/about", get(render_about))
|
||||
}
|
||||
|
55
src/tasks/create_job.rs
Normal file
55
src/tasks/create_job.rs
Normal file
@@ -0,0 +1,55 @@
|
||||
use loco_rs::prelude::*;
|
||||
|
||||
use crate::models::_entities::jobs::ActiveModel;
|
||||
|
||||
pub struct CreateJobData;
|
||||
|
||||
#[async_trait]
|
||||
impl Task for CreateJobData {
|
||||
fn task(&self) -> TaskInfo {
|
||||
TaskInfo {
|
||||
name: "create_job".to_string(),
|
||||
detail: "Task for creating a new job".to_string(),
|
||||
}
|
||||
}
|
||||
|
||||
async fn run(&self, app_context: &AppContext, vars: &task::Vars) -> Result<()> {
|
||||
let company = vars.cli_arg("company")?;
|
||||
let position = vars.cli_arg("position")?;
|
||||
let start_date = vars.cli_arg("start_date")?;
|
||||
let end_date = vars.cli_arg("end_date")?;
|
||||
let technologies = vars.cli_arg("technologies")?;
|
||||
let still_working = vars.cli_arg("still_working")?;
|
||||
|
||||
let start_date = start_date.parse::<Date>();
|
||||
let end_date = end_date.parse::<Date>();
|
||||
let still_working = still_working.parse::<bool>();
|
||||
|
||||
let mut item = ActiveModel {
|
||||
..Default::default()
|
||||
};
|
||||
|
||||
item.company = Set(company.to_string());
|
||||
item.position = Set(position.to_string());
|
||||
if let Ok(start_date) = start_date {
|
||||
item.start_date = Set(start_date);
|
||||
}
|
||||
if let Ok(end_date) = end_date {
|
||||
item.end_date = Set(Some(end_date));
|
||||
}
|
||||
item.technologies = Set(technologies.to_string());
|
||||
if let Ok(still_working) = still_working {
|
||||
item.still_working = Set(still_working);
|
||||
}
|
||||
|
||||
let item = item.insert(&app_context.db).await?;
|
||||
|
||||
tracing::info!(
|
||||
job_id = item.id,
|
||||
job_position = &item.position,
|
||||
"Job created successfully",
|
||||
);
|
||||
|
||||
Ok(())
|
||||
}
|
||||
}
|
35
src/tasks/create_skill.rs
Normal file
35
src/tasks/create_skill.rs
Normal file
@@ -0,0 +1,35 @@
|
||||
use loco_rs::prelude::*;
|
||||
|
||||
use crate::models::_entities::skills::ActiveModel;
|
||||
|
||||
pub struct CreateSkillData;
|
||||
|
||||
#[async_trait]
|
||||
impl Task for CreateSkillData {
|
||||
fn task(&self) -> TaskInfo {
|
||||
TaskInfo {
|
||||
name: "create_skill".to_string(),
|
||||
detail: "Task for creating a new skill".to_string(),
|
||||
}
|
||||
}
|
||||
|
||||
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?;
|
||||
|
||||
tracing::info!(
|
||||
skill_id = item.id,
|
||||
skill_name = &item.name,
|
||||
"Skill created successfully",
|
||||
);
|
||||
|
||||
Ok(())
|
||||
}
|
||||
}
|
@@ -1,2 +1,4 @@
|
||||
pub mod create_job;
|
||||
pub mod create_skill;
|
||||
pub mod create_user;
|
||||
pub mod seed;
|
||||
|
@@ -13,6 +13,12 @@ pub async fn index(v: impl ViewRenderer, ctx: &AppContext) -> Result<impl IntoRe
|
||||
)
|
||||
}
|
||||
|
||||
pub async fn projects(v: impl ViewRenderer, ctx: &AppContext) -> Result<impl IntoResponse> {
|
||||
// let projects = services::projects::get_all_projects(ctx).await?;
|
||||
|
||||
format::render().view(&v, "website/projects.html", data!({"projects": {}}))
|
||||
}
|
||||
|
||||
pub async fn about(v: impl ViewRenderer) -> Result<impl IntoResponse> {
|
||||
let age = services::website::get_current_age();
|
||||
|
||||
|
Reference in New Issue
Block a user