use std::collections::HashSet; type GameID=u32; type StyleID=u32; type TimeID=u64; // the status is supposed to walk up the phases ascending enum Status{ // Phase 3: Retired Published,// pipeline is complete, map was published Rejected,// map council will not request changes, submit a new map // Phase 2: Staging Publishing,// Admin clicked the publish button, publishing is in progress and should only take a second Validated,// Validator validated the map, expose a "Publish" button to Admins Validating,// Validator has been invoked Accepted,// Map failed validation but is still accepted // Phase 1: Maptest ChangesRequested,// map council requests changes Submitted,// Submitted by owner for review by map council, expose "Accept" / "Reject" / "ChangesRequested" to reviewers UnderConstruction,// default state upon pipeline creation } /* Valid state transitions and their required permission roles Submitter: UnderConstruction -> Submitted ChangesRequested -> Submitted Submitted -> UnderConstruction ChangesRequested -> UnderConstruction Reviewer: Submitted -> Validating Submitted -> Rejected Accepted -> ChangesRequested Validated -> ChangesRequested Accepted -> Validating // re-validate Validator: Validating -> Validated Validating -> Accepted // invalidate Publishing -> Published Admin: Validated -> Publishing */ enum SubmissionType{ // changes an existing map on publish Fix{ //main game target asset id asset_id:u64, // How is this data entered? It should be suggested by map maker and finalized by time deleter //affected styles to be wiped upon publish delete_styles:Option>, //affected times to be individually removed delete_times:Option>, }, // creates a new map on publish New{ games:HashSet, creator:String, display_name:String, }, } struct Submission{ // IMMUTABLE FIELDS //maptest database entry id id:u64, date:u64, // int64 UserID who created the submission // this user is allowed to change any data in the maptest phase, except for mapfix target map id submitter:u64, // MUTABLE FIELDS (depending on roles and status) validated_model_id:Option,// asset id to reuse if the map has scripts that need to be replaced when validated model_id:u64,// asset id of the most recently submitted model model_version:u64,// snapshot of the model to prevent tampering is_completed:bool,// has this asset version been completed by any player submission_type:SubmissionType, status:Status, } /* Mutability conditions: model_id: Submitter - Phase 1 model_version: Submitter - Phase 1 is_completed: Maptest place - no status restriction maptest_type: highly conditional status: highly conditional */