package store import ( "context" "fmt" "git.linuxforward.com/byom/byom-core/common" "git.linuxforward.com/byom/byom-core/errors" "github.com/google/uuid" "gorm.io/gorm" ) //CRUD methods for the profile //a profile can be attached to a workspace //a workspace can have multiple profiles // CreateProfile creates a new profile func (s *DataStore) CreateProfile(ctx context.Context, p *common.Profile) error { result := s.db.Create(p) if result.Error != nil { return fmt.Errorf("create profile: %w", result.Error) } return nil } func (s *DataStore) GetProfile(ctx context.Context, id string) (*common.Profile, error) { var profile common.Profile result := s.db.Where("id = ?", id).First(&profile) if result.Error != nil { if result.Error == gorm.ErrRecordNotFound { return nil, errors.NewNotFoundError("Profile", id) } return nil, fmt.Errorf("get profile: %w", result.Error) } return &profile, nil } // UpdateProfile updates a profile func (s *DataStore) UpdateProfile(ctx context.Context, p *common.Profile) error { result := s.db.Save(p) if result.Error != nil { return fmt.Errorf("update profile: %w", result.Error) } return nil } // DeleteProfile deletes a profile func (s *DataStore) DeleteProfile(ctx context.Context, id string) error { result := s.db.Delete(&common.Profile{}, id) if result.Error != nil { return fmt.Errorf("delete profile: %w", result.Error) } return nil } // GetProfiles gets all profiles func (s *DataStore) GetProfiles(ctx context.Context) ([]common.Profile, error) { var profiles []common.Profile result := s.db.Find(&profiles) if result.Error != nil { return nil, fmt.Errorf("get profiles: %w", result.Error) } return profiles, nil } // GetProfilesByWorkspaceID gets all profiles by workspace ID func (s *DataStore) GetProfilesByWorkspaceID(ctx context.Context, workspaceID string) ([]common.Profile, error) { var profiles []common.Profile result := s.db.Where("workspace_id = ?", workspaceID).Find(&profiles) if result.Error != nil { return nil, fmt.Errorf("get profiles by workspace ID: %w", result.Error) } return profiles, nil } // AttachProfileToWorkspace attaches a profile to a workspace func (s *DataStore) AttachProfileToWorkspace(ctx context.Context, profileID, workspaceID uuid.UUID) error { err := s.db.Model(&common.Profile{ID: profileID}). Association("Workspaces"). Append(&common.Workspace{ID: workspaceID}) if err != nil { return fmt.Errorf("attach profile to workspace: %w", err) } return nil }