// Package domain contains pure domain models with no external dependencies. package domain import "time" // CheckoutID is a strongly-typed identifier for checkouts. type CheckoutID string // CheckoutStatus represents the state of a checkout. type CheckoutStatus string const ( // CheckoutStatusActive indicates the checkout is currently in use. CheckoutStatusActive CheckoutStatus = "active" // CheckoutStatusCheckedIn indicates the checkout was completed via checkin. CheckoutStatusCheckedIn CheckoutStatus = "checked_in" // CheckoutStatusExpired indicates the checkout token expired. CheckoutStatusExpired CheckoutStatus = "expired" // CheckoutStatusRevoked indicates the checkout was manually revoked. CheckoutStatusRevoked CheckoutStatus = "revoked" ) // IsTerminal returns true if the status is a final state. func (s CheckoutStatus) IsTerminal() bool { return s == CheckoutStatusCheckedIn || s == CheckoutStatusExpired || s == CheckoutStatusRevoked } // Checkout represents a checked-out development session. // A checkout grants temporary git access via an HTTPS token for local development. type Checkout struct { // ID is the unique checkout identifier. ID CheckoutID // ProjectID is the project being checked out. ProjectID ProjectID // Branch is the git branch being worked on. Branch string // FeatureSlug is the optional SDLC feature link. FeatureSlug string // GiteaTokenID is the Gitea access token ID (for revocation). GiteaTokenID int64 // GiteaTokenName is the name of the Gitea access token. GiteaTokenName string // CloneURL is the base HTTPS clone URL (without token). // Format: https://git.threesix.ai/owner/repo.git // The authenticated URL with token is only returned once at checkout creation. CloneURL string // CheckedOutBy is the user or API key that created the checkout. CheckedOutBy string // CheckedOutAt is when the checkout was created. CheckedOutAt time.Time // ExpiresAt is when the checkout token expires. ExpiresAt time.Time // Status is the current state of the checkout. Status CheckoutStatus // CheckedInAt is when the checkout was completed (if checked in). CheckedInAt *time.Time // ReviewTaskID is the work task ID for the review (if review was triggered). ReviewTaskID string } // IsActive returns true if the checkout can still be used. func (c *Checkout) IsActive() bool { return c.Status == CheckoutStatusActive && time.Now().Before(c.ExpiresAt) } // IsExpired returns true if the checkout has expired. func (c *Checkout) IsExpired() bool { return c.Status == CheckoutStatusActive && time.Now().After(c.ExpiresAt) } // GitBranch represents a git branch in a repository. type GitBranch struct { // Name is the branch name. Name string // CommitSHA is the latest commit on the branch. CommitSHA string // Protected indicates if the branch has protection rules. Protected bool } // GitAccessToken represents a temporary git access token. type GitAccessToken struct { // ID is the token ID (for revocation). ID int64 // Name is a human-readable name for the token. Name string // Token is the actual token value (only available on creation). Token string // Scopes are the permissions granted to the token. Scopes []string // ExpiresAt is when the token expires. ExpiresAt *time.Time } // CheckoutListOptions provides filtering options for listing checkouts. type CheckoutListOptions struct { // Status filters by checkout status (nil = all statuses). Status *CheckoutStatus // Limit is the maximum number of results. Limit int // Offset is the number of results to skip. Offset int }