blob: eda8a0b9f52bf85ba175995a08da2c091119f9da [file] [log] [blame]
package ports
import (
"context"
"time"
"github.com/apache/airavata/scheduler/core/domain"
)
// DatabasePort defines the interface for database operations
// This abstracts the database implementation from domain services
type DatabasePort interface {
// Transaction management
WithTransaction(ctx context.Context, fn func(ctx context.Context) error) error
WithRetry(ctx context.Context, fn func() error) error
// Generic CRUD operations
Create(ctx context.Context, entity interface{}) error
GetByID(ctx context.Context, id string, entity interface{}) error
Update(ctx context.Context, entity interface{}) error
Delete(ctx context.Context, id string, entity interface{}) error
List(ctx context.Context, entities interface{}, limit, offset int) error
Count(ctx context.Context, entity interface{}, count *int64) error
// Query operations
Find(ctx context.Context, entities interface{}, conditions map[string]interface{}) error
FindOne(ctx context.Context, entity interface{}, conditions map[string]interface{}) error
Exists(ctx context.Context, entity interface{}, conditions map[string]interface{}) (bool, error)
// Raw query operations
Raw(ctx context.Context, query string, args ...interface{}) ([]map[string]interface{}, error)
Exec(ctx context.Context, query string, args ...interface{}) error
// Connection management
Ping(ctx context.Context) error
Close() error
}
// RepositoryPort defines the interface for domain-specific repositories
type RepositoryPort interface {
// Transaction management
WithTransaction(ctx context.Context, fn func(ctx context.Context) error) error
// Experiment repository operations
CreateExperiment(ctx context.Context, experiment *domain.Experiment) error
GetExperimentByID(ctx context.Context, id string) (*domain.Experiment, error)
UpdateExperiment(ctx context.Context, experiment *domain.Experiment) error
DeleteExperiment(ctx context.Context, id string) error
ListExperiments(ctx context.Context, filters *ExperimentFilters, limit, offset int) ([]*domain.Experiment, int64, error)
SearchExperiments(ctx context.Context, query *ExperimentSearchQuery) ([]*domain.Experiment, int64, error)
// Task repository operations
CreateTask(ctx context.Context, task *domain.Task) error
GetTaskByID(ctx context.Context, id string) (*domain.Task, error)
UpdateTask(ctx context.Context, task *domain.Task) error
DeleteTask(ctx context.Context, id string) error
ListTasksByExperiment(ctx context.Context, experimentID string, limit, offset int) ([]*domain.Task, int64, error)
GetTasksByStatus(ctx context.Context, status domain.TaskStatus, limit, offset int) ([]*domain.Task, int64, error)
GetTasksByWorker(ctx context.Context, workerID string, limit, offset int) ([]*domain.Task, int64, error)
// Worker repository operations
CreateWorker(ctx context.Context, worker *domain.Worker) error
GetWorkerByID(ctx context.Context, id string) (*domain.Worker, error)
UpdateWorker(ctx context.Context, worker *domain.Worker) error
DeleteWorker(ctx context.Context, id string) error
ListWorkersByComputeResource(ctx context.Context, computeResourceID string, limit, offset int) ([]*domain.Worker, int64, error)
ListWorkersByExperiment(ctx context.Context, experimentID string, limit, offset int) ([]*domain.Worker, int64, error)
GetWorkersByStatus(ctx context.Context, status domain.WorkerStatus, limit, offset int) ([]*domain.Worker, int64, error)
GetIdleWorkers(ctx context.Context, limit int) ([]*domain.Worker, error)
// Compute resource repository operations
CreateComputeResource(ctx context.Context, resource *domain.ComputeResource) error
GetComputeResourceByID(ctx context.Context, id string) (*domain.ComputeResource, error)
UpdateComputeResource(ctx context.Context, resource *domain.ComputeResource) error
DeleteComputeResource(ctx context.Context, id string) error
ListComputeResources(ctx context.Context, filters *ComputeResourceFilters, limit, offset int) ([]*domain.ComputeResource, int64, error)
// Storage resource repository operations
CreateStorageResource(ctx context.Context, resource *domain.StorageResource) error
GetStorageResourceByID(ctx context.Context, id string) (*domain.StorageResource, error)
UpdateStorageResource(ctx context.Context, resource *domain.StorageResource) error
DeleteStorageResource(ctx context.Context, id string) error
ListStorageResources(ctx context.Context, filters *StorageResourceFilters, limit, offset int) ([]*domain.StorageResource, int64, error)
// Note: Credential operations removed - now handled by OpenBao and SpiceDB
// User repository operations
CreateUser(ctx context.Context, user *domain.User) error
GetUserByID(ctx context.Context, id string) (*domain.User, error)
GetUserByUsername(ctx context.Context, username string) (*domain.User, error)
GetUserByEmail(ctx context.Context, email string) (*domain.User, error)
UpdateUser(ctx context.Context, user *domain.User) error
DeleteUser(ctx context.Context, id string) error
ListUsers(ctx context.Context, limit, offset int) ([]*domain.User, int64, error)
// Group repository operations
CreateGroup(ctx context.Context, group *domain.Group) error
GetGroupByID(ctx context.Context, id string) (*domain.Group, error)
GetGroupByName(ctx context.Context, name string) (*domain.Group, error)
UpdateGroup(ctx context.Context, group *domain.Group) error
DeleteGroup(ctx context.Context, id string) error
ListGroups(ctx context.Context, limit, offset int) ([]*domain.Group, int64, error)
// Project repository operations
CreateProject(ctx context.Context, project *domain.Project) error
GetProjectByID(ctx context.Context, id string) (*domain.Project, error)
UpdateProject(ctx context.Context, project *domain.Project) error
DeleteProject(ctx context.Context, id string) error
ListProjectsByOwner(ctx context.Context, ownerID string, limit, offset int) ([]*domain.Project, int64, error)
// Data cache repository operations
CreateDataCache(ctx context.Context, cache *domain.DataCache) error
GetDataCacheByPath(ctx context.Context, filePath, computeResourceID string) (*domain.DataCache, error)
UpdateDataCache(ctx context.Context, cache *domain.DataCache) error
DeleteDataCache(ctx context.Context, id string) error
ListDataCacheByComputeResource(ctx context.Context, computeResourceID string, limit, offset int) ([]*domain.DataCache, int64, error)
// Data lineage repository operations
CreateDataLineage(ctx context.Context, lineage *domain.DataLineageRecord) error
GetDataLineageByFileID(ctx context.Context, fileID string) ([]*domain.DataLineageRecord, error)
UpdateDataLineage(ctx context.Context, lineage *domain.DataLineageRecord) error
DeleteDataLineage(ctx context.Context, id string) error
// Audit log repository operations
CreateAuditLog(ctx context.Context, log *domain.AuditLog) error
ListAuditLogs(ctx context.Context, filters *AuditLogFilters, limit, offset int) ([]*domain.AuditLog, int64, error)
// Experiment tag repository operations
CreateExperimentTag(ctx context.Context, tag *domain.ExperimentTag) error
GetExperimentTags(ctx context.Context, experimentID string) ([]*domain.ExperimentTag, error)
DeleteExperimentTag(ctx context.Context, id string) error
DeleteExperimentTagsByExperiment(ctx context.Context, experimentID string) error
// Task result aggregate repository operations
CreateTaskResultAggregate(ctx context.Context, aggregate *domain.TaskResultAggregate) error
GetTaskResultAggregates(ctx context.Context, experimentID string) ([]*domain.TaskResultAggregate, error)
UpdateTaskResultAggregate(ctx context.Context, aggregate *domain.TaskResultAggregate) error
DeleteTaskResultAggregate(ctx context.Context, id string) error
// Note: ACL operations removed - now handled by SpiceDB
// Task metrics operations
CreateTaskMetrics(ctx context.Context, metrics *domain.TaskMetrics) error
CreateWorkerMetrics(ctx context.Context, metrics *domain.WorkerMetrics) error
GetLatestWorkerMetrics(ctx context.Context, workerID string) (*domain.WorkerMetrics, error)
// Staging operation operations
GetStagingOperationByID(ctx context.Context, id string) (*domain.StagingOperation, error)
UpdateStagingOperation(ctx context.Context, operation *domain.StagingOperation) error
// Registration token operations
ValidateRegistrationToken(ctx context.Context, token string) (*RegistrationToken, error)
MarkTokenAsUsed(ctx context.Context, token string) error
UpdateComputeResourceStatus(ctx context.Context, resourceID string, status domain.ResourceStatus) error
UpdateStorageResourceStatus(ctx context.Context, resourceID string, status domain.ResourceStatus) error
}
// Filter types for repository queries
type ExperimentFilters struct {
ProjectID *string
OwnerID *string
Status *domain.ExperimentStatus
CreatedAfter *time.Time
CreatedBefore *time.Time
}
type ExperimentSearchQuery struct {
Query string
ProjectID *string
OwnerID *string
Status *domain.ExperimentStatus
Tags []string
CreatedAfter *time.Time
CreatedBefore *time.Time
Limit int
Offset int
SortBy string
SortOrder string
}
type ComputeResourceFilters struct {
Type *domain.ComputeResourceType
Status *domain.ResourceStatus
OwnerID *string
}
type StorageResourceFilters struct {
Type *domain.StorageResourceType
Status *domain.ResourceStatus
OwnerID *string
}
type AuditLogFilters struct {
UserID *string
Action *string
Resource *string
ResourceID *string
After *time.Time
Before *time.Time
}
// RegistrationToken represents a one-time registration token
type RegistrationToken struct {
ID string
Token string
ResourceID string
UserID string
ExpiresAt time.Time
UsedAt *time.Time
CreatedAt time.Time
}