UPDATE: Submission module
All checks were successful
Build and Release / release (push) Successful in 1m14s

This commit is contained in:
2026-05-04 09:55:17 +07:00
parent f3f2e09fd5
commit bcc2e192c1
48 changed files with 2918 additions and 359 deletions

View File

@@ -3,73 +3,63 @@ package request
import "encoding/json"
type CommitSnapshot struct {
SchemaVersion int `json:"schema_version" validate:"required"`
Section SectionRef `json:"section" validate:"required"`
EditorFeatureCollection *FeatureCollection `json:"editor_feature_collection,omitempty" validate:"omitempty"`
Entities []EntitySnapshot `json:"entities,omitempty" validate:"omitempty,dive"`
Geometries []GeometrySnapshot `json:"geometries,omitempty" validate:"omitempty,dive"`
LinkScopes []LinkScopeSnapshot `json:"link_scopes,omitempty" validate:"omitempty,dive"`
Wikis []WikiSnapshot `json:"wikis,omitempty" validate:"omitempty,dive"`
EntityWikis []EntityWikiLinkSnapshot `json:"entity_wikis,omitempty" validate:"omitempty,dive"`
}
type SectionRef struct {
ID string `json:"id" validate:"required"`
Title string `json:"title" validate:"required"`
EditorFeatureCollection *FeatureCollection `json:"editor_feature_collection,omitempty" validate:"omitempty"`
Entities []*EntitySnapshot `json:"entities,omitempty" validate:"omitempty,dive"`
Geometries []*GeometrySnapshot `json:"geometries,omitempty" validate:"omitempty,dive"`
Wikis []*WikiSnapshot `json:"wikis,omitempty" validate:"omitempty,dive"`
GeometryEntity []*GeometryEntitySnapshot `json:"geometry_entity,omitempty" validate:"omitempty,dive"`
EntityWiki []*EntityWikiLinkSnapshot `json:"entity_wiki,omitempty" validate:"omitempty,dive"`
EntityWikis []*EntityWikiLinkSnapshot `json:"entity_wikis,omitempty" validate:"omitempty,dive"`
}
type FeatureCollection struct {
Type string `json:"type" validate:"required,eq=FeatureCollection"`
Features []Feature `json:"features" validate:"required,dive"`
Type string `json:"type" validate:"required,eq=FeatureCollection"`
Features []*Feature `json:"features" validate:"required,dive"`
}
type Feature struct {
Type string `json:"type" validate:"required,eq=Feature"`
Properties FeatureProperties `json:"properties" validate:"required"`
Geometry json.RawMessage `json:"geometry" validate:"required"`
Type string `json:"type" validate:"required,eq=Feature"`
Properties *FeatureProperties `json:"properties" validate:"required"`
Geometry json.RawMessage `json:"geometry" validate:"required"`
}
type FeatureProperties struct {
ID any `json:"id" validate:"required"`
Type string `json:"type,omitempty"`
TimeStart *float64 `json:"time_start,omitempty"`
TimeEnd *float64 `json:"time_end,omitempty"`
Binding []string `json:"binding,omitempty"`
EntityID string `json:"entity_id,omitempty"`
EntityIDs []string `json:"entity_ids,omitempty"`
EntityName string `json:"entity_name,omitempty"`
EntityNames []string `json:"entity_names,omitempty"`
EntityTypeID string `json:"entity_type_id,omitempty"`
ID any `json:"id" validate:"required"`
Type string `json:"type,omitempty"`
GeometryPreset string `json:"geometry_preset,omitempty"`
TimeStart *float64 `json:"time_start,omitempty"`
TimeEnd *float64 `json:"time_end,omitempty"`
Binding []string `json:"binding,omitempty"`
EntityID string `json:"entity_id,omitempty" validate:"omitempty,uuidv7"`
EntityIDs []string `json:"entity_ids,omitempty" validate:"omitempty,dive,uuidv7"`
EntityName string `json:"entity_name,omitempty"`
EntityNames []string `json:"entity_names,omitempty"`
EntityTypeID string `json:"entity_type_id,omitempty" validate:"omitempty,uuidv7"`
}
type EntitySnapshot struct {
ID string `json:"id" validate:"required"`
Source string `json:"source,omitempty" validate:"omitempty,oneof=inline ref"`
Ref *Ref `json:"ref,omitempty" validate:"omitempty"`
Operation string `json:"operation,omitempty" validate:"omitempty,oneof=create update delete reference"`
Name string `json:"name,omitempty"`
Slug string `json:"slug,omitempty"`
Description string `json:"description,omitempty"`
TypeID string `json:"type_id,omitempty"`
Status *int `json:"status,omitempty" validate:"omitempty,oneof=0 1"`
IsDeleted *int `json:"is_deleted,omitempty" validate:"omitempty,oneof=0 1"`
BaseUpdatedAt string `json:"base_updated_at,omitempty"`
BaseHash string `json:"base_hash,omitempty"`
ID string `json:"id" validate:"required,uuidv7"`
Source string `json:"source,omitempty" validate:"omitempty,oneof=inline ref"`
Operation string `json:"operation,omitempty" validate:"omitempty,oneof=create update delete reference"`
Name string `json:"name,omitempty"`
Slug *string `json:"slug,omitempty"`
Description string `json:"description,omitempty"`
TypeID string `json:"type_id,omitempty"`
Status *int `json:"status,omitempty" validate:"omitempty,oneof=0 1"`
BaseUpdatedAt string `json:"base_updated_at,omitempty"`
BaseHash string `json:"base_hash,omitempty"`
}
type GeometrySnapshot struct {
ID string `json:"id" validate:"required"`
ID string `json:"id" validate:"required,uuidv7"`
Source string `json:"source,omitempty" validate:"omitempty,oneof=inline ref"`
Ref *Ref `json:"ref,omitempty" validate:"omitempty"`
Operation string `json:"operation,omitempty" validate:"omitempty,oneof=create update delete reference"`
Type string `json:"type,omitempty"`
Type string `json:"type" validate:"required"`
DrawGeometry json.RawMessage `json:"draw_geometry,omitempty"`
Binding []string `json:"binding,omitempty"`
TimeStart *float64 `json:"time_start,omitempty"`
TimeEnd *float64 `json:"time_end,omitempty"`
BBox *BBox `json:"bbox,omitempty" validate:"omitempty"`
IsDeleted *int `json:"is_deleted,omitempty" validate:"omitempty,oneof=0 1"`
BaseUpdatedAt string `json:"base_updated_at,omitempty"`
BaseHash string `json:"base_hash,omitempty"`
}
@@ -81,31 +71,26 @@ type BBox struct {
MaxLat float64 `json:"max_lat" validate:"required"`
}
type LinkScopeSnapshot struct {
GeometryID string `json:"geometry_id" validate:"required"`
Operation string `json:"operation" validate:"required,eq=reference"` // Theo doc chỉ có "reference"
EntityIDs []string `json:"entity_ids" validate:"required,min=1"` // Đã link thì phải có ít nhất 1 entity
BaseLinksHash string `json:"base_links_hash,omitempty"`
type GeometryEntitySnapshot struct {
GeometryID string `json:"geometry_id" validate:"required,uuidv7"`
EntityID string `json:"entity_id" validate:"required,uuidv7"`
BaseLinksHash string `json:"base_links_hash,omitempty"`
}
type WikiSnapshot struct {
ID string `json:"id" validate:"required"`
ID string `json:"id" validate:"required,uuidv7"`
Source string `json:"source,omitempty" validate:"omitempty,oneof=inline ref"`
Ref *Ref `json:"ref,omitempty" validate:"omitempty"`
Operation string `json:"operation,omitempty" validate:"omitempty,oneof=create update delete reference"`
Title string `json:"title" validate:"required"`
Doc json.RawMessage `json:"doc,omitempty"`
UpdatedAt string `json:"updated_at,omitempty"`
IsDeleted *int `json:"is_deleted,omitempty" validate:"omitempty,oneof=0 1"`
}
type EntityWikiLinkSnapshot struct {
EntityID string `json:"entity_id" validate:"required"`
WikiID string `json:"wiki_id" validate:"required"`
EntityID string `json:"entity_id" validate:"required,uuidv7"`
WikiID string `json:"wiki_id" validate:"required,uuidv7"`
Operation string `json:"operation,omitempty" validate:"omitempty,oneof=reference delete"`
IsDeleted *int `json:"is_deleted,omitempty" validate:"omitempty,oneof=0 1"`
}
type Ref struct {
ID string `json:"id" validate:"required"`
}
// Legacy / Compatibility
IsDeleted *int `json:"is_deleted,omitempty" validate:"omitempty,oneof=0 1"`
}