mirror of
https://github.com/onepanelio/onepanel.git
synced 2025-10-14 01:43:41 +08:00
109 lines
2.6 KiB
Go
109 lines
2.6 KiB
Go
package repository
|
|
|
|
import (
|
|
"database/sql"
|
|
"time"
|
|
|
|
sq "github.com/Masterminds/squirrel"
|
|
"github.com/onepanelio/core/model"
|
|
)
|
|
|
|
type WorkflowRepository struct {
|
|
db *DB
|
|
sb sq.StatementBuilderType
|
|
}
|
|
|
|
func NewWorkflowRepository(db *DB) *WorkflowRepository {
|
|
return &WorkflowRepository{db: db, sb: sq.StatementBuilder.PlaceholderFormat(sq.Dollar)}
|
|
}
|
|
|
|
func (r *WorkflowRepository) CreateWorkflowTemplate(namespace string, workflowTemplate *model.WorkflowTemplate) (*model.WorkflowTemplate, error) {
|
|
uid, err := workflowTemplate.GenerateUID()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
tx, err := r.db.Begin()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
defer tx.Rollback()
|
|
|
|
err = r.sb.Insert("workflow_templates").
|
|
SetMap(sq.Eq{
|
|
"uid": uid,
|
|
"name": workflowTemplate.Name,
|
|
"namespace": namespace,
|
|
}).
|
|
Suffix("RETURNING id").
|
|
RunWith(tx).
|
|
QueryRow().Scan(&workflowTemplate.ID)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
_, err = r.sb.Insert("workflow_template_versions").
|
|
SetMap(sq.Eq{
|
|
"workflow_template_id": workflowTemplate.ID,
|
|
"manifest": workflowTemplate.Manifest,
|
|
"version": int32(time.Now().Unix()),
|
|
}).
|
|
RunWith(tx).Exec()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
if err = tx.Commit(); err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return workflowTemplate, nil
|
|
}
|
|
|
|
func (r *WorkflowRepository) workflowTemplatesSelectBuilder(namespace, uid string) sq.SelectBuilder {
|
|
sb := r.sb.Select("wt.uid", "wt.name", "wtv.version").
|
|
From("workflow_template_versions wtv").
|
|
Join("workflow_templates wt ON wt.id = wtv.workflow_template_id").
|
|
Where(sq.Eq{
|
|
"wt.uid": uid,
|
|
"wt.namespace": namespace,
|
|
}).
|
|
OrderBy("wtv.version desc")
|
|
|
|
return sb
|
|
}
|
|
|
|
func (r *WorkflowRepository) GetWorkflowTemplate(namespace, uid string, version int32) (workflowTemplate *model.WorkflowTemplate, err error) {
|
|
workflowTemplate = &model.WorkflowTemplate{}
|
|
|
|
sb := r.workflowTemplatesSelectBuilder(namespace, uid).Columns("wtv.manifest").Limit(1)
|
|
if version != 0 {
|
|
sb = sb.Where(sq.Eq{"wtv.version": version})
|
|
}
|
|
query, args, err := sb.ToSql()
|
|
if err != nil {
|
|
return
|
|
}
|
|
|
|
err = r.db.Get(workflowTemplate, query, args...)
|
|
if err == sql.ErrNoRows {
|
|
err = nil
|
|
workflowTemplate = nil
|
|
}
|
|
|
|
return
|
|
}
|
|
|
|
func (r *WorkflowRepository) ListWorkflowTemplateVersions(namespace, uid string) (workflowTemplateVersions []*model.WorkflowTemplate, err error) {
|
|
workflowTemplateVersions = []*model.WorkflowTemplate{}
|
|
|
|
query, args, err := r.workflowTemplatesSelectBuilder(namespace, uid).ToSql()
|
|
if err != nil {
|
|
return
|
|
}
|
|
|
|
err = r.db.Select(&workflowTemplateVersions, query, args...)
|
|
|
|
return
|
|
}
|