Mercurial > sci
view scid/page-index.c @ 29:695637f1d8a7
scid: first index page in javascript
author | David Demelier <markand@malikania.fr> |
---|---|
date | Thu, 04 Aug 2022 14:13:58 +0200 |
parents | 4c16bb25e4f1 |
children | 43333d18e4b8 |
line wrap: on
line source
/* * page-index.c -- page / * * Copyright (c) 2020-2021 David Demelier <markand@malikania.fr> * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include <errno.h> #include <string.h> #include "config.h" #include "db.h" #include "log.h" #include "pageutil.h" #include "scid.h" #include "theme.h" #include "util.h" #if 0 /* * Document we create for templatize. * * { * "projects: [ * { * "name": "project name", * "desc": "project short description", * "url": "project URL or homepage", * "jobs": [ * { * "job": job-id, * "tag": "job tag / revision", * "status": "failed / success" // failed if at least one has failed * } * ] * "n-failed": number of failed jobs * "n-succes": number of successful jobs * } * ] * } */ #endif static void fill_jobresults(json_t *project, json_t *job, json_t *jobresults) { json_t *iter, *status; int exitcode, sigcode; size_t i, ns = 0, nf = 0; json_array_foreach(jobresults, i, iter) { json_unpack(iter, "{si si}", "exitcode", &exitcode, "sigcode", &sigcode); if (exitcode == 0 && sigcode == 0) ns++; else nf++; } if (nf) status = json_string("failed"); else status = json_string("success"); json_object_set_new(job, "status", status); json_object_set_new(project, "n-failed", json_integer(nf)); json_object_set_new(project, "n-success", json_integer(ns)); } static void fill_jobs(json_t *project, json_t *jobs) { json_t *iter, *jobresults; json_int_t job_id; size_t i; json_array_foreach(jobs, i, iter) { /* * For this job, find all jobresult to check how many have * failed or not. * * Also, since we have the project name, we can remove it. */ json_object_del(iter, "project_name"); json_unpack(iter, "{sI}", "id", &job_id); if (!(jobresults = db_jobresult_list_by_job_group(job_id))) continue; fill_jobresults(project, iter, jobresults); json_decref(jobresults); } json_object_set_new(project, "jobs", jobs); } static void fill_projects(json_t *projects) { json_t *jobs, *iter; const char *name; size_t i; json_array_foreach(projects, i, iter) { /* Script is not necessary at this point. */ json_object_del(iter, "script"); json_unpack(iter, "{ss}", "name", &name); /* Find jobs for this project. */ if (!(jobs = db_job_list(name))) continue; fill_jobs(iter, jobs); } } static void get(struct kreq *req) { json_t *projects, *root; char *data; /* First, fetch all projects. */ if ((projects = db_project_list())) { fill_projects(projects); root = json_pack("{so}", "projects", projects); printf("===\n%s\n===\n", json_dumps(root, JSON_INDENT(4))); data = theme_page_index(scid.theme, root); pageutil_render(req, KHTTP_200, KMIME_TEXT_HTML, data); json_decref(projects); } else pageutil_status(req, KHTTP_500); } void page_index(struct kreq *r) { (void)r; switch (r->method) { case KMETHOD_GET: get(r); break; default: pageutil_status(r, KHTTP_400); break; } }