45 lines
1.3 KiB
Go
45 lines
1.3 KiB
Go
// monorepo/cloud/backend/internal/maplefile/domain/file/state_validator.go
|
|
package file
|
|
|
|
import "errors"
|
|
|
|
// StateTransition validates file state transitions
|
|
type StateTransition struct {
|
|
From string
|
|
To string
|
|
}
|
|
|
|
// IsValidStateTransition checks if a file state transition is allowed
|
|
func IsValidStateTransition(from, to string) error {
|
|
validTransitions := map[StateTransition]bool{
|
|
// From pending
|
|
{FileStatePending, FileStateActive}: true,
|
|
{FileStatePending, FileStateDeleted}: true,
|
|
{FileStatePending, FileStateArchived}: false,
|
|
|
|
// From active
|
|
{FileStateActive, FileStatePending}: false,
|
|
{FileStateActive, FileStateDeleted}: true,
|
|
{FileStateActive, FileStateArchived}: true,
|
|
|
|
// From deleted (cannot be restored nor archived)
|
|
{FileStateDeleted, FileStatePending}: false,
|
|
{FileStateDeleted, FileStateActive}: false,
|
|
{FileStateDeleted, FileStateArchived}: false,
|
|
|
|
// From archived (can only be restored to active)
|
|
{FileStateArchived, FileStateActive}: true,
|
|
|
|
// Same state transitions (no-op)
|
|
{FileStatePending, FileStatePending}: true,
|
|
{FileStateActive, FileStateActive}: true,
|
|
{FileStateDeleted, FileStateDeleted}: true,
|
|
{FileStateArchived, FileStateArchived}: true,
|
|
}
|
|
|
|
if !validTransitions[StateTransition{from, to}] {
|
|
return errors.New("invalid state transition from " + from + " to " + to)
|
|
}
|
|
|
|
return nil
|
|
}
|