WIP: feat: post webhook to user
This commit is contained in:
parent
8b2deba6de
commit
731c22826c
14 changed files with 104 additions and 13 deletions
|
@ -78,6 +78,7 @@ git-conventional = "0.12"
|
|||
bytes = "1.6"
|
||||
ulid = "1.1"
|
||||
warp = "0.3"
|
||||
time = "0.3"
|
||||
|
||||
# boilerplate
|
||||
derive_more = { version = "1.0.0-beta.6", features = [
|
||||
|
|
|
@ -1 +1,3 @@
|
|||
crate::newtype!(BranchName: String, derive_more::Display, Default: "The name of a Git branch");
|
||||
use serde::Serialize;
|
||||
|
||||
crate::newtype!(BranchName: String, derive_more::Display, Default, Serialize: "The name of a Git branch");
|
||||
|
|
|
@ -1,4 +1,6 @@
|
|||
crate::newtype!(ForgeAlias: String, Hash, PartialOrd, Ord, derive_more::Display, Default: "The name of a Forge to connect to");
|
||||
use serde::Serialize;
|
||||
|
||||
crate::newtype!(ForgeAlias: String, Hash, PartialOrd, Ord, derive_more::Display, Default, Serialize: "The name of a Forge to connect to");
|
||||
impl From<&ForgeAlias> for std::path::PathBuf {
|
||||
fn from(value: &ForgeAlias) -> Self {
|
||||
Self::from(&value.0)
|
||||
|
|
|
@ -1,7 +1,8 @@
|
|||
use derive_more::Display;
|
||||
use serde::Serialize;
|
||||
|
||||
use crate::newtype;
|
||||
|
||||
newtype!(RepoAlias: String, Display, Default, PartialOrd, Ord: r#"The alias of a repo.
|
||||
newtype!(RepoAlias: String, Display, Default, PartialOrd, Ord, Serialize: r#"The alias of a repo.
|
||||
|
||||
This is the alias for the repo within `git-next-server.toml`."#);
|
||||
|
|
|
@ -25,11 +25,13 @@ async-trait = { workspace = true }
|
|||
# fs/network
|
||||
kxio = { workspace = true }
|
||||
|
||||
# # TOML parsing
|
||||
# serde = { workspace = true }
|
||||
# TOML parsing
|
||||
serde_json = { workspace = true }
|
||||
# toml = { workspace = true }
|
||||
|
||||
# webhooks - user notification
|
||||
serde = { workspace = true }
|
||||
|
||||
# Secrets and Password
|
||||
secrecy = { workspace = true }
|
||||
|
||||
|
|
|
@ -2,6 +2,7 @@ use config::newtype;
|
|||
use derive_more::Display;
|
||||
//
|
||||
use git_next_config as config;
|
||||
use serde::Serialize;
|
||||
|
||||
#[derive(
|
||||
Clone,
|
||||
|
@ -13,6 +14,7 @@ use git_next_config as config;
|
|||
Ord,
|
||||
derive_more::Constructor,
|
||||
derive_more::Display,
|
||||
Serialize,
|
||||
)]
|
||||
#[display("{}", sha)]
|
||||
pub struct Commit {
|
||||
|
@ -37,8 +39,8 @@ impl From<config::webhook::Push> for Commit {
|
|||
}
|
||||
}
|
||||
|
||||
newtype!(Sha: String, Display, Hash,PartialOrd, Ord: "The unique SHA for a git commit.");
|
||||
newtype!(Message: String, Hash, PartialOrd, Ord: "The commit message for a git commit.");
|
||||
newtype!(Sha: String, Display, Hash,PartialOrd, Ord, Serialize: "The unique SHA for a git commit.");
|
||||
newtype!(Message: String, Display, Hash, PartialOrd, Ord, Serialize: "The commit message for a git commit.");
|
||||
|
||||
#[derive(Clone, Debug)]
|
||||
pub struct Histories {
|
||||
|
|
|
@ -43,6 +43,7 @@ git-conventional = { workspace = true }
|
|||
# Webhooks
|
||||
bytes = { workspace = true }
|
||||
ulid = { workspace = true }
|
||||
time = { workspace = true }
|
||||
|
||||
# boilerplate
|
||||
derive_more = { workspace = true }
|
||||
|
|
|
@ -2,6 +2,7 @@ mod branch;
|
|||
pub mod handlers;
|
||||
mod load;
|
||||
pub mod messages;
|
||||
mod notifications;
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests;
|
||||
|
|
72
crates/repo-actor/src/notifications.rs
Normal file
72
crates/repo-actor/src/notifications.rs
Normal file
|
@ -0,0 +1,72 @@
|
|||
use derive_more::Deref as _;
|
||||
use git_next_git::UserNotification;
|
||||
use serde_json::json;
|
||||
|
||||
use crate::messages::NotifyUser;
|
||||
|
||||
impl From<NotifyUser> for serde_json::Value {
|
||||
fn from(value: NotifyUser) -> Self {
|
||||
let timestamp = time::OffsetDateTime::now_utc().unix_timestamp().to_string();
|
||||
match value.deref() {
|
||||
UserNotification::CICheckFailed {
|
||||
forge_alias,
|
||||
repo_alias,
|
||||
commit,
|
||||
} => json!({
|
||||
"type": "cicheck.failed",
|
||||
"timestamp": timestamp,
|
||||
"data": {
|
||||
"forge_alias": forge_alias,
|
||||
"repo_alias": repo_alias,
|
||||
"commit": {
|
||||
"sha": commit.sha(),
|
||||
"message": commit.message()
|
||||
}
|
||||
}
|
||||
}),
|
||||
UserNotification::RepoConfigLoadFailure {
|
||||
forge_alias,
|
||||
repo_alias,
|
||||
reason,
|
||||
} => json!({
|
||||
"type": "config.load.failed",
|
||||
"timestamp": timestamp,
|
||||
"data": {
|
||||
"forge_alias": forge_alias,
|
||||
"repo_alias": repo_alias,
|
||||
"reason": reason
|
||||
}
|
||||
}),
|
||||
UserNotification::WebhookRegistration {
|
||||
forge_alias,
|
||||
repo_alias,
|
||||
reason,
|
||||
} => json!({
|
||||
"type": "webhook.registration.failed",
|
||||
"timestamp": timestamp,
|
||||
"data": {
|
||||
"forge_alias": forge_alias,
|
||||
"repo_alias": repo_alias,
|
||||
"reason": reason
|
||||
}
|
||||
}),
|
||||
UserNotification::DevNotBasedOnMain {
|
||||
forge_alias,
|
||||
repo_alias,
|
||||
dev_branch,
|
||||
main_branch,
|
||||
} => json!({
|
||||
"type": "branch.dev.not-on-main",
|
||||
"timestamp": timestamp,
|
||||
"data": {
|
||||
"forge_alias": forge_alias,
|
||||
"repo_alias": repo_alias,
|
||||
"branches": {
|
||||
"dev": dev_branch,
|
||||
"main": main_branch
|
||||
}
|
||||
}
|
||||
}),
|
||||
}
|
||||
}
|
||||
}
|
|
@ -28,6 +28,10 @@ derive-with = { workspace = true }
|
|||
# Actors
|
||||
actix = { workspace = true }
|
||||
|
||||
# Webhooks
|
||||
serde = { workspace = true }
|
||||
serde_json = { workspace = true }
|
||||
|
||||
[dev-dependencies]
|
||||
# Testing
|
||||
# assert2 = { workspace = true }
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
//
|
||||
|
||||
use actix::prelude::*;
|
||||
use git_next_repo_actor::messages::NotifyUser;
|
||||
|
||||
|
@ -7,7 +8,9 @@ use crate::ServerActor;
|
|||
impl Handler<NotifyUser> for ServerActor {
|
||||
type Result = ();
|
||||
|
||||
fn handle(&mut self, _msg: NotifyUser, _ctx: &mut Self::Context) -> Self::Result {
|
||||
fn handle(&mut self, msg: NotifyUser, _ctx: &mut Self::Context) -> Self::Result {
|
||||
let _payload = serde_json::Value::from(msg);
|
||||
tracing::info!("{}", _payload.to_string());
|
||||
// TODO: (#95) should notify user
|
||||
// send post to notification webhook url
|
||||
}
|
||||
|
|
|
@ -15,7 +15,7 @@ impl Handler<ReceiveValidServerConfig> for ServerActor {
|
|||
socket_address,
|
||||
server_storage,
|
||||
} = msg.unwrap();
|
||||
if let Some(webhook) = self.webhook.take() {
|
||||
if let Some(webhook) = self.webhook_actor_addr.take() {
|
||||
webhook.do_send(ShutdownWebhook);
|
||||
}
|
||||
self.generation.inc();
|
||||
|
@ -52,6 +52,6 @@ impl Handler<ReceiveValidServerConfig> for ServerActor {
|
|||
});
|
||||
}
|
||||
let webhook = WebhookActor::new(socket_address, webhook_router.recipient()).start();
|
||||
self.webhook.replace(webhook);
|
||||
self.webhook_actor_addr.replace(webhook);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -16,7 +16,7 @@ impl Handler<Shutdown> for ServerActor {
|
|||
tracing::debug!(%forge_alias, %repo_alias, "removed webhook");
|
||||
});
|
||||
tracing::debug!("server shutdown");
|
||||
if let Some(webhook) = self.webhook.take() {
|
||||
if let Some(webhook) = self.webhook_actor_addr.take() {
|
||||
tracing::debug!("shuting down webhook");
|
||||
webhook.do_send(ShutdownWebhook);
|
||||
tracing::debug!("webhook shutdown");
|
||||
|
|
|
@ -46,7 +46,7 @@ type Result<T> = core::result::Result<T, Error>;
|
|||
#[with(message_log)]
|
||||
pub struct ServerActor {
|
||||
generation: Generation,
|
||||
webhook: Option<Addr<WebhookActor>>,
|
||||
webhook_actor_addr: Option<Addr<WebhookActor>>,
|
||||
fs: FileSystem,
|
||||
net: Network,
|
||||
repository_factory: Box<dyn RepositoryFactory>,
|
||||
|
@ -70,7 +70,7 @@ impl ServerActor {
|
|||
let generation = Generation::default();
|
||||
Self {
|
||||
generation,
|
||||
webhook: None,
|
||||
webhook_actor_addr: None,
|
||||
fs,
|
||||
net,
|
||||
repository_factory: repo,
|
||||
|
|
Loading…
Reference in a new issue