frm/frm.go

95 lines
2.3 KiB
Go
Raw Normal View History

2024-11-05 16:18:04 +00:00
package frm
import (
"context"
"errors"
2024-11-05 16:18:04 +00:00
"github.com/acaloiaro/frm/internal"
2024-12-17 17:25:33 +00:00
"github.com/google/uuid"
2024-11-05 16:18:04 +00:00
)
const (
EventDraftCreated = "frmDraftCreated" // htmx event sent when new drafts are created
)
var ErrCannotDetermineWorkspace = errors.New("workspace cannot be determine without WorkspaceID or WorkspaceIDUrlParam")
// Frm is the primary API into frm
2024-11-05 16:18:04 +00:00
type Frm struct {
PostgresURL string // the database URL where forms are stored
WorkspaceID uuid.UUID // the ID of the workspace that the frm acts on behalf of
WorkspaceIDUrlParam string // the name of the URL parameter that provides your workspace ID
2024-11-05 16:18:04 +00:00
}
// Args are arguments passed to Frm
2024-11-05 16:18:04 +00:00
type Args struct {
PostgresURL string
WorkspaceID uuid.UUID
WorkspaceIDUrlParam string
2024-11-05 16:18:04 +00:00
}
type FormStatus internal.FormStatus
2024-11-05 16:18:04 +00:00
// New initializes a new frm instance
//
// If the frm database hasn't been initiailized, the database is initialized
func New(args Args) (f *Frm, err error) {
if args.WorkspaceID == uuid.Nil && args.WorkspaceIDUrlParam == "" {
return nil, ErrCannotDetermineWorkspace
}
f = &Frm{
PostgresURL: args.PostgresURL,
WorkspaceID: args.WorkspaceID,
WorkspaceIDUrlParam: args.WorkspaceIDUrlParam,
2024-11-05 16:18:04 +00:00
}
return
2024-11-05 16:18:04 +00:00
}
// Init initializes the frm database if it hasn't been initialized
2024-11-05 16:18:04 +00:00
func (f *Frm) Init(ctx context.Context) (err error) {
err = internal.InitializeDB(ctx, f.PostgresURL)
return
}
// GetForm retrieves forms by ID
2024-11-05 16:18:04 +00:00
func (f *Frm) GetForm(ctx context.Context, id int64) (form Form, err error) {
var frm internal.Form
2024-12-17 17:25:33 +00:00
frm, err = internal.Q(ctx, f.PostgresURL).GetForm(ctx, internal.GetFormParams{
WorkspaceID: f.WorkspaceID,
ID: id,
})
2024-11-05 16:18:04 +00:00
if err != nil {
return
}
form = (Form)(frm)
return
}
type ListFormsArgs struct {
Statuses []FormStatus
}
// ListForms lists all forms for the current workspace
func (f *Frm) ListForms(ctx context.Context, args ListFormsArgs) (forms []Form, err error) {
var fs Forms
statuses := []internal.FormStatus{}
for _, s := range args.Statuses {
statuses = append(statuses, (internal.FormStatus)(s))
}
fs, err = internal.Q(ctx, f.PostgresURL).ListForms(ctx, internal.ListFormsParams{
WorkspaceID: f.WorkspaceID,
Statuses: statuses,
})
if err != nil {
return
}
for _, f := range fs {
forms = append(forms, (Form)(f))
}
return
}