diff --git a/src/app/project/repository.go b/src/app/project/repository.go index efa2098b3e48d8c140b2a59117f546f3f8790b25..1750e39853be1f34bbeb4de93f4f4ca88f104a29 100644 --- a/src/app/project/repository.go +++ b/src/app/project/repository.go @@ -50,6 +50,9 @@ type ProjectRepository interface { // Search finds projects matching a text query for a specific user Search(ctx context.Context, query string, userID uuid.UUID) ([]*Project, error) + + // CloneRequirement creates a copy of an existing requirement in a different project + CloneRequirement(ctx context.Context, sourceReqID primitive.ObjectID, targetProjectID string, newName string) error } // MongoProjectRepository implements ProjectRepository using MongoDB @@ -434,3 +437,54 @@ func (r *MongoProjectRepository) Search(ctx context.Context, query string, userI log.Printf("INFO: Search completed - found %d projects for query '%s'", len(projects), query) return projects, cursor.Err() } + +// CloneRequirement creates a copy of an existing requirement in a different project +func (r *MongoProjectRepository) CloneRequirement(ctx context.Context, sourceReqID primitive.ObjectID, targetProjectID string, newName string) error { + ctx, cancel := context.WithTimeout(ctx, r.timeout) + defer cancel() + + log.Printf("DEBUG: Cloning requirement %s to project %s with name '%s'", sourceReqID.Hex(), targetProjectID, newName) + + // Find the source requirement + var sourceReq bson.M + err := r.requirementCollection.FindOne(ctx, bson.M{"_id": sourceReqID}).Decode(&sourceReq) + if err != nil { + if err == mongo.ErrNoDocuments { + log.Printf("WARN: Source requirement %s not found", sourceReqID.Hex()) + return fmt.Errorf("source requirement not found") + } + log.Printf("ERROR: Failed to find source requirement %s: %v", sourceReqID.Hex(), err) + return fmt.Errorf("failed to find source requirement: %w", err) + } + + // Create cloned requirement with new ID and target project + clonedReq := bson.M{ + "_id": primitive.NewObjectID(), + "uuid": uuid.New(), + "project_id": targetProjectID, + "shortcut": newName, + "created_at": time.Now(), + "status": "Entwurf", + } + + // Copy relevant fields from source requirement + fieldsToClone := []string{"condition", "system", "requirement", "parsing_result"} + for _, field := range fieldsToClone { + if value, exists := sourceReq[field]; exists { + clonedReq[field] = value + } + } + + // Generate requirement_id based on shortcut + clonedReq["requirement_id"] = newName + + // Insert the cloned requirement + _, err = r.requirementCollection.InsertOne(ctx, clonedReq) + if err != nil { + log.Printf("ERROR: Failed to insert cloned requirement: %v", err) + return fmt.Errorf("failed to clone requirement: %w", err) + } + + log.Printf("INFO: Requirement cloned successfully to project %s", targetProjectID) + return nil +}