From 96ace736f46c1299bb9704b9600e4ef4e08434bf Mon Sep 17 00:00:00 2001
From: Quaternions <krakow20@gmail.com>
Date: Mon, 31 Mar 2025 18:28:21 -0700
Subject: [PATCH] validator: add mapfix capability

---
 validation/api/src/types.rs       | 24 ++++++++++++++++++++++++
 validation/src/main.rs            |  2 ++
 validation/src/message_handler.rs |  8 ++++++++
 validation/src/nats_types.rs      |  9 +++++++++
 validation/src/validator.rs       | 10 +++++++---
 5 files changed, 50 insertions(+), 3 deletions(-)

diff --git a/validation/api/src/types.rs b/validation/api/src/types.rs
index 60d1f4c..6cdd357 100644
--- a/validation/api/src/types.rs
+++ b/validation/api/src/types.rs
@@ -202,3 +202,27 @@ pub struct ActionSubmissionAcceptedRequest{
 
 #[derive(Clone,Copy,Debug)]
 pub struct SubmissionID(pub i64);
+
+#[allow(nonstandard_style)]
+#[derive(Clone,Debug)]
+pub struct UpdateMapfixModelRequest{
+	pub MapfixID:i64,
+	pub ModelID:u64,
+	pub ModelVersion:u64,
+}
+
+#[allow(nonstandard_style)]
+#[derive(Clone,Debug)]
+pub struct ActionMapfixUploadedRequest{
+	pub MapfixID:i64,
+}
+
+#[allow(nonstandard_style)]
+#[derive(Clone,Debug)]
+pub struct ActionMapfixAcceptedRequest{
+	pub MapfixID:i64,
+	pub StatusMessage:String,
+}
+
+#[derive(Clone,Copy,Debug)]
+pub struct MapfixID(pub i64);
diff --git a/validation/src/main.rs b/validation/src/main.rs
index 681e529..9234aa8 100644
--- a/validation/src/main.rs
+++ b/validation/src/main.rs
@@ -4,8 +4,10 @@ mod message_handler;
 mod nats_types;
 mod types;
 mod uploader;
+mod upload_mapfix;
 mod upload_submission;
 mod validator;
+mod validate_mapfix;
 mod validate_submission;
 
 #[allow(dead_code)]
diff --git a/validation/src/message_handler.rs b/validation/src/message_handler.rs
index 3b7bdb8..c6cd200 100644
--- a/validation/src/message_handler.rs
+++ b/validation/src/message_handler.rs
@@ -5,7 +5,9 @@ pub enum HandleMessageError{
 	DoubleAck(async_nats::Error),
 	Json(serde_json::Error),
 	UnknownSubject(String),
+	UploadMapfix(crate::upload_mapfix::UploadError),
 	UploadSubmission(crate::upload_submission::UploadError),
+	ValidateMapfix(crate::validate_mapfix::ValidateMapfixError),
 	ValidateSubmission(crate::validate_submission::ValidateSubmissionError),
 }
 impl std::fmt::Display for HandleMessageError{
@@ -22,7 +24,9 @@ fn from_slice<'a,T:serde::de::Deserialize<'a>>(slice:&'a [u8])->Result<T,HandleM
 }
 
 pub struct MessageHandler{
+	upload_mapfix:crate::upload_mapfix::Uploader,
 	upload_submission:crate::upload_submission::Uploader,
+	validate_mapfix:crate::validate_mapfix::Validator,
 	validate_submission:crate::validate_submission::Validator,
 }
 
@@ -33,7 +37,9 @@ impl MessageHandler{
 		api:submissions_api::internal::Context,
 	)->Self{
 		Self{
+			upload_mapfix:crate::upload_mapfix::Uploader::new(crate::uploader::Uploader::new(cookie_context.clone(),group_id,api.clone())),
 			upload_submission:crate::upload_submission::Uploader::new(crate::uploader::Uploader::new(cookie_context.clone(),group_id,api.clone())),
+			validate_mapfix:crate::validate_mapfix::Validator::new(crate::validator::Validator::new(cookie_context.clone(),api.clone())),
 			validate_submission:crate::validate_submission::Validator::new(crate::validator::Validator::new(cookie_context,api)),
 		}
 	}
@@ -41,7 +47,9 @@ impl MessageHandler{
 		let message=message_result.map_err(HandleMessageError::Messages)?;
 		message.double_ack().await.map_err(HandleMessageError::DoubleAck)?;
 		match message.subject.as_str(){
+			"maptest.mapfixes.upload"=>self.upload_mapfix.upload(from_slice(&message.payload)?).await.map_err(HandleMessageError::UploadMapfix),
 			"maptest.submissions.upload"=>self.upload_submission.upload(from_slice(&message.payload)?).await.map_err(HandleMessageError::UploadSubmission),
+			"maptest.mapfixes.validate"=>self.validate_mapfix.validate(from_slice(&message.payload)?).await.map_err(HandleMessageError::ValidateMapfix),
 			"maptest.submissions.validate"=>self.validate_submission.validate(from_slice(&message.payload)?).await.map_err(HandleMessageError::ValidateSubmission),
 			other=>Err(HandleMessageError::UnknownSubject(other.to_owned()))
 		}
diff --git a/validation/src/nats_types.rs b/validation/src/nats_types.rs
index dc2369c..15f0924 100644
--- a/validation/src/nats_types.rs
+++ b/validation/src/nats_types.rs
@@ -33,3 +33,12 @@ pub struct UploadSubmissionRequest{
 	pub ModelVersion:u64,
 	pub ModelName:String,
 }
+
+#[allow(nonstandard_style)]
+#[derive(serde::Deserialize)]
+pub struct UploadMapfixRequest{
+	pub MapfixID:i64,
+	pub ModelID:u64,
+	pub ModelVersion:u64,
+	pub TargetAssetID:u64,
+}
diff --git a/validation/src/validator.rs b/validation/src/validator.rs
index 6babbf4..5d3b1ed 100644
--- a/validation/src/validator.rs
+++ b/validation/src/validator.rs
@@ -42,7 +42,7 @@ pub enum ValidateError{
 	ApiCreateScript(submissions_api::Error),
 	ApiCreateScriptPolicy(submissions_api::Error),
 	ApiGetScriptFromHash(submissions_api::types::SingleItemError),
-	ApiUpdateMapfixModelUnimplemented,
+	ApiUpdateMapfixModel(submissions_api::Error),
 	ApiUpdateSubmissionModel(submissions_api::Error),
 	ModelFileRootMustHaveOneChild,
 	ModelFileChildRefIsNil,
@@ -266,9 +266,13 @@ impl Validator{
 			};
 
 			match validate_info.ResourceID{
-				ResourceID::Mapfix(_mapfix_id)=>{
+				ResourceID::Mapfix(mapfix_id)=>{
 					// update the mapfix to use the validated model
-					return Err(ValidateError::ApiUpdateMapfixModelUnimplemented);
+					self.api.update_mapfix_validated_model(submissions_api::types::UpdateMapfixModelRequest{
+						MapfixID:mapfix_id,
+						ModelID:model_id,
+						ModelVersion:1, //TODO
+					}).await.map_err(ValidateError::ApiUpdateMapfixModel)?;
 				},
 				ResourceID::Submission(submission_id)=>{
 					// update the submission to use the validated model