diff --git a/src/Project/model.go b/src/Project/model.go new file mode 100644 index 0000000000000000000000000000000000000000..858689c14a6849b76340919bea2bed9176832551 --- /dev/null +++ b/src/Project/model.go @@ -0,0 +1,168 @@ +package project + +import ( + "time" + + "github.com/google/uuid" + "go.mongodb.org/mongo-driver/bson/primitive" +) + +// Project represents the main project entity stored in MongoDB +// This struct defines the complete data structure for a project including +// metadata fields for tracking creation and modification times +type Project struct { + // ID is the unique MongoDB ObjectID that serves as the primary key + // The omitempty tag excludes this field if it's empty during insertion + ID primitive.ObjectID bson:"_id,omitempty" json:"id" + + // ProjectID is a human-readable unique identifier (e.g., "PRJ-2025-001") + // This allows users to reference projects with meaningful IDs + ProjectID string bson:"project_id" json:"projectId" + + // Name is the display name of the project (e.g., "HARMONY Mobile") + // This is what users see in the interface as the project title + Name string bson:"name" json:"name" + + // Description provides detailed information about the project's purpose + // This field is optional and can be empty for simple projects + Description string bson:"description" json:"description" + + // StartDate defines when the project begins + // Used for project timeline calculations and reporting + StartDate time.Time bson:"start_date" json:"startDate" + + // EndDate defines when the project is scheduled to complete + // Must be after StartDate as enforced by business logic + EndDate time.Time bson:"end_date" json:"endDate" + + // CreatedBy stores the UUID of the user who created this project + // This establishes ownership and is used for access control + CreatedBy uuid.UUID bson:"created_by" json:"createdBy" + + // CreatedAt records when this project was first created + // Automatically set during project creation for audit trails + CreatedAt time.Time bson:"created_at" json:"createdAt" + + // UpdatedAt tracks the last modification time + // Uses pointer to allow nil values when no updates have occurred + // The omitempty tag excludes this field if it's nil + UpdatedAt *time.Time bson:"updated_at,omitempty" json:"updatedAt,omitempty" +} + +// ProjectToCreate represents the data structure used when creating new projects +// This struct contains only the fields that users can specify during creation +// System-generated fields like ID and timestamps are handled separately +type ProjectToCreate struct { + // ProjectID must be provided by the user and must be unique + // Validation ensures this field is not empty + ProjectID string json:"projectId" hvalidate:"required" + + // Name is required and serves as the display title + // Validation ensures this field is not empty + Name string json:"name" hvalidate:"required" + + // Description is optional and can be left empty + // No validation constraints are applied to this field + Description string json:"description" + + // StartDate is required and must be a valid date + // Validation ensures this field is provided + StartDate time.Time json:"startDate" hvalidate:"required" + + // EndDate is required and must be after StartDate + // Basic validation ensures this field is provided + // Business logic validation ensures it's after StartDate + EndDate time.Time json:"endDate" hvalidate:"required" + + // CreatedBy is set by the system based on the current user + // The - tag excludes this from JSON serialization as it's not user input + CreatedBy uuid.UUID json:"-" +} + +// ProjectToUpdate represents the data structure used when updating existing projects +// This struct includes the project ID to identify which project to update +// Note: ProjectID is not included as it cannot be changed after creation +type ProjectToUpdate struct { + // ID identifies which project to update using the MongoDB ObjectID + // This field is populated from the URL parameter + ID primitive.ObjectID bson:"_id" json:"id" + + // Name can be updated and is required to be non-empty + // Users can change the display name of their projects + Name string json:"name" hvalidate:"required" + + // Description can be updated and can be empty + // Users can modify or clear the project description + Description string json:"description" + + // StartDate can be updated but must remain valid + // Users can adjust project timelines as needed + StartDate time.Time json:"startDate" hvalidate:"required" + + // EndDate can be updated but must remain after StartDate + // Business logic validation ensures timeline consistency + EndDate time.Time json:"endDate" hvalidate:"required" +} + +// ToUpdate converts a Project instance to a ProjectToUpdate structure +// This method is useful when pre-filling edit forms with existing project data +// It extracts only the fields that can be modified during updates +func (p *Project) ToUpdate() *ProjectToUpdate { + return &ProjectToUpdate{ + ID: p.ID, // Preserve the project identifier + Name: p.Name, // Current name as default + Description: p.Description, // Current description as default + StartDate: p.StartDate, // Current start date as default + EndDate: p.EndDate, // Current end date as default + } +} + +// ProjectWithRequirements represents a project along with its associated requirements +// This structure is used for project detail views where both project information +// and requirement summaries need to be displayed together +type ProjectWithRequirements struct { + // Embed the base Project struct to inherit all project fields + // This allows access to all project properties directly + *Project + + // Requirements contains summary information for all requirements in this project + // This is optimized for display purposes rather than full requirement details + Requirements []*RequirementSummary json:"requirements" + + // RequirementCount provides a quick count of total requirements + // This avoids the need to calculate len(Requirements) in templates + RequirementCount int json:"requirementCount" +} + +// RequirementSummary provides essential requirement information for project views +// This structure contains only the fields needed for requirement lists and summaries +// Full requirement details would be loaded separately when viewing individual requirements +type RequirementSummary struct { + // ID is the unique MongoDB ObjectID for this requirement + // Used for linking to detailed requirement views + ID primitive.ObjectID bson:"_id" json:"id" + + // RequirementID is a human-readable identifier for this requirement + // Generated automatically if not provided (e.g., "REQ-abc123") + RequirementID string bson:"requirement_id" json:"requirementId" + + // Condition describes the circumstances under which this requirement applies + // This field comes from the requirement parsing and validation process + Condition string bson:"condition" json:"condition" + + // System identifies which system or component this requirement affects + // This helps organize requirements by their target systems + System string bson:"system" json:"system" + + // Requirement contains the actual requirement text + // This is the main content that describes what must be implemented + Requirement string bson:"requirement" json:"requirement" + + // Status tracks the current state of this requirement + // Possible values include "Entwurf", "In Prüfung", "Genehmigt", "Abgelehnt" + Status string bson:"status" json:"status" + + // CreatedAt records when this requirement was first created + // Used for sorting and audit purposes + CreatedAt time.Time bson:"created_at" json:"createdAt" +} \ No newline at end of file