1use async_trait::async_trait;
2use ave_actors::{
3 Actor, ActorContext, ActorError, ActorPath, Event, Handler, Message,
4 NotPersistentActor, Response,
5};
6use ave_common::SchemaType;
7use serde::{Deserialize, Serialize};
8use tracing::{Span, debug, error, info_span};
9
10use crate::model::common::emit_fail;
11
12#[derive(Clone, Debug, Serialize, Deserialize)]
13pub struct RegisterDataSubj {
14 pub schema_id: SchemaType,
15 pub active: bool,
16 pub namespace: String,
17 pub name: Option<String>,
18 pub description: Option<String>,
19}
20
21#[derive(Clone, Debug, Serialize, Deserialize)]
22pub struct RegisterDataGov {
23 pub active: bool,
24 pub name: Option<String>,
25 pub description: Option<String>,
26}
27
28#[derive(Clone, Debug, Default)]
29pub struct Register;
30
31#[derive(Debug, Clone)]
32pub enum RegisterMessage {
33 RegisterGov {
34 gov_id: String,
35 name: Option<String>,
36 description: Option<String>,
37 },
38 EOLGov {
39 gov_id: String,
40 },
41 RegisterSubj {
42 gov_id: String,
43 subject_id: String,
44 schema_id: SchemaType,
45 namespace: String,
46 name: Option<String>,
47 description: Option<String>,
48 },
49 EOLSubj {
50 gov_id: String,
51 subj_id: String,
52 },
53}
54
55impl Message for RegisterMessage {
56 fn is_critical(&self) -> bool {
57 true
58 }
59}
60
61#[derive(Debug, Clone)]
62pub enum RegisterResponse {
63 None,
64}
65
66impl Response for RegisterResponse {}
67
68#[derive(Debug, Clone, Serialize, Deserialize)]
69pub enum RegisterEvent {
70 RegisterGov {
71 gov_id: String,
72 data: RegisterDataGov,
73 },
74 EOLGov {
75 gov_id: String,
76 },
77 RegisterSubj {
78 gov_id: String,
79 subject_id: String,
80 data: RegisterDataSubj,
81 },
82 EOLSubj {
83 gov_id: String,
84 subj_id: String,
85 },
86}
87
88impl Event for RegisterEvent {}
89
90impl NotPersistentActor for Register {}
91
92#[async_trait]
93impl Actor for Register {
94 type Event = RegisterEvent;
95 type Message = RegisterMessage;
96 type Response = RegisterResponse;
97
98 fn get_span(_id: &str, parent_span: Option<Span>) -> tracing::Span {
99 parent_span.map_or_else(
100 || info_span!("Register"),
101 |parent_span| info_span!(parent: parent_span, "Register"),
102 )
103 }
104}
105
106#[async_trait]
107impl Handler<Self> for Register {
108 async fn handle_message(
109 &mut self,
110 _sender: ActorPath,
111 msg: RegisterMessage,
112 ctx: &mut ave_actors::ActorContext<Self>,
113 ) -> Result<RegisterResponse, ActorError> {
114 let event = match msg {
115 RegisterMessage::RegisterGov {
116 gov_id,
117 description,
118 name,
119 } => {
120 debug!(
121 msg_type = "RegisterGov",
122 gov_id = %gov_id,
123 "Governance registration enqueued"
124 );
125 RegisterEvent::RegisterGov {
126 gov_id,
127 data: RegisterDataGov {
128 active: true,
129 name,
130 description,
131 },
132 }
133 }
134 RegisterMessage::EOLGov { gov_id } => {
135 debug!(
136 msg_type = "EOLGov",
137 gov_id = %gov_id,
138 "Governance EOL enqueued"
139 );
140 RegisterEvent::EOLGov { gov_id }
141 }
142 RegisterMessage::RegisterSubj {
143 gov_id,
144 subject_id,
145 schema_id,
146 namespace,
147 name,
148 description,
149 } => {
150 debug!(
151 msg_type = "RegisterSubj",
152 gov_id = %gov_id,
153 subject_id = %subject_id,
154 schema_id = %schema_id,
155 "Subject registration enqueued"
156 );
157 RegisterEvent::RegisterSubj {
158 gov_id,
159 subject_id,
160 data: RegisterDataSubj {
161 schema_id,
162 active: true,
163 namespace,
164 name,
165 description,
166 },
167 }
168 }
169 RegisterMessage::EOLSubj { gov_id, subj_id } => {
170 debug!(
171 msg_type = "EOLSubj",
172 gov_id = %gov_id,
173 subj_id = %subj_id,
174 "Subject EOL enqueued"
175 );
176 RegisterEvent::EOLSubj { gov_id, subj_id }
177 }
178 };
179
180 self.on_event(event, ctx).await;
181 Ok(RegisterResponse::None)
182 }
183
184 async fn on_event(
185 &mut self,
186 event: RegisterEvent,
187 ctx: &mut ActorContext<Self>,
188 ) {
189 if let Err(e) = ctx.publish_event(event.clone()).await {
190 error!(error = %e, event = ?event, "Failed to publish register event");
191 emit_fail(ctx, e).await;
192 } else {
193 debug!(event = ?event, "Register event published successfully");
194 }
195 }
196}