aboutsummaryrefslogtreecommitdiff
path: root/mod/mod-ci-github.hxx
diff options
context:
space:
mode:
authorFrancois Kritzinger <francois@codesynthesis.com>2024-02-06 16:35:59 +0200
committerFrancois Kritzinger <francois@codesynthesis.com>2024-12-10 11:16:07 +0200
commitabd6ede8444a89b6c56c20d06110cb3923b05bbe (patch)
tree48600db8ab80599e014c07ad79769469754321c0 /mod/mod-ci-github.hxx
parent1c994eadb89bdafdbeb7e16adcf4f0a55c497942 (diff)
Get installation access token (IAT) and restructure code
Diffstat (limited to 'mod/mod-ci-github.hxx')
-rw-r--r--mod/mod-ci-github.hxx116
1 files changed, 112 insertions, 4 deletions
diff --git a/mod/mod-ci-github.hxx b/mod/mod-ci-github.hxx
index a869878..9731881 100644
--- a/mod/mod-ci-github.hxx
+++ b/mod/mod-ci-github.hxx
@@ -4,16 +4,111 @@
#ifndef MOD_MOD_CI_GITHUB_HXX
#define MOD_MOD_CI_GITHUB_HXX
-#include <web/xhtml/fragment.hxx>
-
#include <libbrep/types.hxx>
#include <libbrep/utility.hxx>
#include <mod/module.hxx>
#include <mod/module-options.hxx>
+namespace butl
+{
+ namespace json
+ {
+ class parser;
+ }
+}
+
namespace brep
{
+ // GitHub request/response types.
+ //
+ // Note that having this types directly in brep causes clashes (e.g., for
+ // the repository name).
+ //
+ namespace gh
+ {
+ namespace json = butl::json;
+
+ // The "check_suite" object within a check_suite webhook event request.
+ //
+ struct check_suite
+ {
+ uint64_t id;
+ string head_branch;
+ string head_sha;
+ string before;
+ string after;
+
+ explicit
+ check_suite (json::parser&);
+
+ check_suite () = default;
+ };
+
+ struct repository
+ {
+ string name;
+ string full_name;
+ string default_branch;
+
+ explicit
+ repository (json::parser&);
+
+ repository () = default;
+ };
+
+ struct installation
+ {
+ uint64_t id;
+
+ explicit
+ installation (json::parser&);
+
+ installation () = default;
+ };
+
+ // The check_suite webhook event request.
+ //
+ struct check_suite_event
+ {
+ string action;
+ gh::check_suite check_suite;
+ gh::repository repository;
+ gh::installation installation;
+
+ explicit
+ check_suite_event (json::parser&);
+
+ check_suite_event () = default;
+ };
+
+ struct installation_access_token
+ {
+ string token;
+ timestamp expires_at;
+
+ explicit
+ installation_access_token (json::parser&);
+
+ installation_access_token () = default;
+ };
+
+ ostream&
+ operator<< (ostream&, const check_suite&);
+
+ ostream&
+ operator<< (ostream&, const repository&);
+
+ ostream&
+ operator<< (ostream&, const installation&);
+
+ ostream&
+ operator<< (ostream&, const check_suite_event&);
+
+ ostream&
+ operator<< (ostream&, const installation_access_token&);
+ }
+
class ci_github: public handler
{
public:
@@ -29,14 +124,27 @@ namespace brep
handle (request&, response&);
virtual const cli::options&
- cli_options () const {return options::ci::description ();}
+ cli_options () const {return options::ci_github::description ();}
private:
virtual void
init (cli::scanner&);
+ // Handle the check_suite event `requested` and `rerequested` actions.
+ //
+ bool
+ handle_check_suite_request (gh::check_suite_event) const;
+
+ string
+ generate_jwt () const;
+
+ // Authenticate to GitHub as an app installation.
+ //
+ gh::installation_access_token
+ obtain_installation_access_token (uint64_t install_id, string jwt) const;
+
private:
- shared_ptr<options::ci> options_;
+ shared_ptr<options::ci_github> options_;
};
}