Skip to content

Commit bc20584

Browse files
committed
refactor: logs -> jobs
Also JSON on those endpoints
1 parent e66a0de commit bc20584

File tree

1 file changed

+57
-44
lines changed

1 file changed

+57
-44
lines changed

src/main.rs

Lines changed: 57 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,23 @@
11
use actix_cors::Cors;
2-
use actix_web::middleware::Logger;
3-
use actix_web::{get, post, web, App, HttpResponse, HttpServer, Responder, Result};
2+
use actix_web::{
3+
get, middleware::Logger, post, web, App, HttpResponse, HttpServer, Responder, Result,
4+
};
45
use actix_web_httpauth::middleware::HttpAuthentication;
6+
use async_std::prelude::*;
57
use chrono::Utc;
68
use serde::{Deserialize, Serialize};
79
use serde_json::json;
8-
use std::fs;
9-
use std::net::{IpAddr, Ipv4Addr, SocketAddr};
10-
use std::process;
11-
use std::process::{Command, Output};
12-
use std::str;
13-
use std::thread;
10+
use std::{
11+
fs,
12+
io::Write,
13+
net::{IpAddr, Ipv4Addr, SocketAddr},
14+
process,
15+
process::{Command, Output},
16+
str, thread,
17+
};
18+
1419
#[macro_use]
1520
extern crate log;
16-
use std::io;
17-
use std::io::Write;
1821

1922
mod auth;
2023

@@ -127,6 +130,25 @@ fn run_project(project: Project, mut log: std::fs::File, mut metadata_log: std::
127130
metadata_log.write_all(json_metadata.as_bytes()).unwrap();
128131
}
129132

133+
fn spawn_job(logs_dir: &String, project: Project) -> String {
134+
let job_name = create_job_name(&project.name);
135+
let file_name = create_log_name(&job_name, logs_dir);
136+
let metadata_file_name = create_metadata_log_name(&job_name, logs_dir);
137+
138+
fs::create_dir_all(logs_dir).expect("Failed to create log directory");
139+
140+
let log = fs::File::create(file_name).expect("Failed to create log file");
141+
let metadata =
142+
fs::File::create(metadata_file_name).expect("Failed to create metadata log file");
143+
144+
thread::spawn(move || {
145+
debug!("Starting to process {} project", &project.name);
146+
run_project(project, log, metadata)
147+
});
148+
149+
job_name
150+
}
151+
130152
#[post("/webhook")]
131153
async fn webhook(body: web::Json<WebhookPayload>, ctx: web::Data<Context>) -> impl Responder {
132154
debug!("Webhook recieved");
@@ -139,52 +161,43 @@ async fn webhook(body: web::Json<WebhookPayload>, ctx: web::Data<Context>) -> im
139161
.projects
140162
.into_iter()
141163
.find(|project| project.name == body.name)
142-
.map(|project| {
143-
let job_name = create_job_name(&body.name);
144-
let file_name = create_log_name(&job_name, &ctx.logs_dir);
145-
let metadata_file_name = create_metadata_log_name(&job_name, &ctx.logs_dir);
146-
147-
fs::create_dir_all(&ctx.logs_dir).expect("Failed to create log directory");
148-
149-
let log = fs::File::create(file_name).expect("Failed to create log file");
150-
let metadata =
151-
fs::File::create(metadata_file_name).expect("Failed to create metadata log file");
152-
153-
thread::spawn(move || {
154-
debug!("Starting to process {} project", &project.name);
155-
run_project(project, log, metadata)
156-
});
157-
158-
job_name
159-
});
164+
.map(|project| spawn_job(&ctx.logs_dir, project));
160165

161166
match job_name {
162-
Some(job_name) => HttpResponse::Ok().body(format!("200 Ok\nJob: {}", job_name)),
167+
Some(job) => HttpResponse::Ok().body(format!("200 Ok\nJob: {}", job)),
163168
None => HttpResponse::NotFound().body("404 Not Found"),
164169
}
165170
}
166171

167-
#[get("/logs")]
168-
async fn get_logs(ctx: web::Data<Context>) -> impl Responder {
172+
#[get("/jobs")]
173+
async fn get_jogs(ctx: web::Data<Context>) -> Result<web::Json<serde_json::value::Value>> {
169174
let log_dir = shellexpand::tilde(&ctx.logs_dir).into_owned();
170-
let logs = fs::read_dir(log_dir)
171-
.unwrap()
172-
.map(|res| res.map(|e| e.path().file_name().unwrap().to_owned()))
173-
.collect::<Result<Vec<_>, io::Error>>()
174-
.unwrap();
175+
let mut logs: Vec<String> = Vec::new();
176+
177+
let mut dir = async_std::fs::read_dir(log_dir).await?;
178+
179+
while let Some(entry) = dir.next().await {
180+
let path = entry?.path();
181+
182+
let name = path.file_name().unwrap().to_owned().into_string().unwrap();
183+
184+
if name.ends_with(".json") {
185+
logs.push(name.replace(".json", ""));
186+
}
187+
}
175188

176-
HttpResponse::Ok().body(format!("{:?}", logs))
189+
Ok(web::Json(serde_json::to_value(&logs)?))
177190
}
178191

179-
#[get("/logs/{log_name}")]
180-
async fn get_log(
181-
log_name: web::Path<String>,
192+
#[get("/jobs/{job_name}")]
193+
async fn get_job_by_name(
194+
job_name: web::Path<String>,
182195
ctx: web::Data<Context>,
183196
) -> Result<web::Json<serde_json::value::Value>> {
184197
let log_dir = shellexpand::tilde(&ctx.logs_dir).into_owned();
185198

186-
let log_file_name = format!("{}/{}.log", &log_dir, log_name);
187-
let metadata_file_name = format!("{}/{}.json", &log_dir, log_name);
199+
let log_file_name = format!("{}/{}.log", &log_dir, job_name);
200+
let metadata_file_name = format!("{}/{}.json", &log_dir, job_name);
188201

189202
let log = async_std::fs::read_to_string(log_file_name).await?;
190203
let metadata = async_std::fs::read_to_string(metadata_file_name).await?;
@@ -303,8 +316,8 @@ async fn main() -> std::io::Result<()> {
303316
.wrap(HttpAuthentication::bearer(auth::validator))
304317
.wrap(Cors::new().supports_credentials().finish())
305318
.service(webhook)
306-
.service(get_log)
307-
.service(get_logs)
319+
.service(get_jogs)
320+
.service(get_job_by_name)
308321
})
309322
.bind(socket)?
310323
.run()

0 commit comments

Comments
 (0)