Files
onepanel/repository/workflow_repository.go

190 lines
4.9 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) insertWorkflowTemplateVersion(workflowTemplate *model.WorkflowTemplate, runner sq.BaseRunner) (err error) {
err = r.sb.Insert("workflow_template_versions").
SetMap(sq.Eq{
"workflow_template_id": workflowTemplate.ID,
"manifest": workflowTemplate.Manifest,
"version": int32(time.Now().Unix()),
"is_latest": workflowTemplate.IsLatest,
}).
Suffix("RETURNING version").
RunWith(runner).
QueryRow().Scan(&workflowTemplate.Version)
return
}
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
}
if err = r.insertWorkflowTemplateVersion(workflowTemplate, tx); err != nil {
return nil, err
}
if err = tx.Commit(); err != nil {
return nil, err
}
return workflowTemplate, nil
}
func (r *WorkflowRepository) RemoveIsLatestFromWorkflowTemplateVersions(workflowTemplate *model.WorkflowTemplate) error {
query, args, err := r.sb.Update("workflow_template_versions").
Set("is_latest", true).
Where(sq.Eq{
"workflow_template_id": workflowTemplate.ID,
"is_latest": false,
}).
ToSql()
if err != nil {
return err
}
if _, err := r.db.Exec(query, args...); err != nil {
return err
}
return nil
}
func (r *WorkflowRepository) CreateWorkflowTemplateVersion(namespace string, workflowTemplate *model.WorkflowTemplate) (*model.WorkflowTemplate, error) {
query, args, err := r.sb.Select("id, name").
From("workflow_templates").
Where(sq.Eq{
"namespace": namespace,
"uid": workflowTemplate.UID,
}).
Limit(1).ToSql()
if err != nil {
return nil, err
}
if err = r.db.Get(workflowTemplate, query, args...); err == sql.ErrNoRows {
return nil, nil
}
if err = r.insertWorkflowTemplateVersion(workflowTemplate, r.db.Base()); err != nil {
return nil, err
}
return workflowTemplate, nil
}
func (r *WorkflowRepository) UpdateWorkflowTemplateVersion(workflowTemplate *model.WorkflowTemplate) (*model.WorkflowTemplate, error) {
query, args, err := r.sb.Update("workflow_template_versions").
Set("manifest", workflowTemplate.Manifest).
Where(sq.Eq{
"workflow_template_id": workflowTemplate.ID,
"version": workflowTemplate.Version,
}).
ToSql()
if err != nil {
return nil, err
}
if _, err := r.db.Exec(query, args...); err != nil {
return nil, err
}
return workflowTemplate, nil
}
func (r *WorkflowRepository) workflowTemplatesSelectBuilder(namespace string) sq.SelectBuilder {
sb := r.sb.Select("wt.id", "wt.uid", "wt.name", "wtv.version", "wtv.is_latest").
From("workflow_template_versions wtv").
Join("workflow_templates wt ON wt.id = wtv.workflow_template_id").
Where(sq.Eq{
"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).Where(sq.Eq{"wt.uid": 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
}
if err = r.db.Get(workflowTemplate, query, args...); 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).Where(sq.Eq{"wt.uid": uid}).ToSql()
if err != nil {
return
}
err = r.db.Select(&workflowTemplateVersions, query, args...)
return
}
func (r *WorkflowRepository) ListWorkflowTemplates(namespace string) (workflowTemplateVersions []*model.WorkflowTemplate, err error) {
workflowTemplateVersions = []*model.WorkflowTemplate{}
query, args, err := r.workflowTemplatesSelectBuilder(namespace).ToSql()
if err != nil {
return
}
err = r.db.Select(&workflowTemplateVersions, query, args...)
return
}