diff --git a/src/state/fsm/.template/events.go b/src/state/fsm/.template/events.go deleted file mode 100644 index 9d58b29..0000000 --- a/src/state/fsm/.template/events.go +++ /dev/null @@ -1,46 +0,0 @@ -package template - -import ( - "context" - "gitea/price-is-wrong/src/lib/db" - template "gitea/price-is-wrong/src/state/fsm/template/internal" - "io" -) - -func (t *Template) TODO(ctx context.Context, id int) error { - return io.EOF -} - -func (t *Template) upsertEvent(ctx context.Context, e template.Event) error { - if err := upsertEvent(ctx, p.id, e); err != nil { - return err - } - - p2, err := openID(ctx, p.id) - if err != nil { - return err - } - - *p = *p2 - return nil -} - -func upsertEvent(ctx context.Context, templateID int, e template.Event) error { - b, err := template.MarshalEvent(e) - if err != nil { - return err - } - - _, err = db.From(ctx).ExecContext(ctx, ` - INSERT INTO template_events (template_id, payload) VALUES (?, ?) - `, templateID, b) - return err -} - -func (t *Template) apply(e template.Event) error { - switch e := e.(type) { - case *int: - _ = e - } - return nil -} diff --git a/src/state/fsm/.template/internal/event.go b/src/state/fsm/.template/internal/event.go deleted file mode 100644 index 651c9c5..0000000 --- a/src/state/fsm/.template/internal/event.go +++ /dev/null @@ -1,20 +0,0 @@ -package template - -import ( - "fmt" - "gitea/price-is-wrong/src/lib/event" -) - -type Event interface{} - -func ParseEvent(b []byte) (Event, error) { - typesToPointers := map[string]any{ - "*any": &b, - } - t, err := event.Parse(b, typesToPointers) - return typesToPointers[t], err -} - -func MarshalEvent(e Event) ([]byte, error) { - return event.Serialize(fmt.Sprintf("%T", e), e) -} diff --git a/src/state/fsm/.template/open.go b/src/state/fsm/.template/open.go deleted file mode 100644 index de2e7f4..0000000 --- a/src/state/fsm/.template/open.go +++ /dev/null @@ -1,115 +0,0 @@ -package template - -import ( - "context" - "database/sql" - "fmt" - "gitea/price-is-wrong/src/lib/db" - template "gitea/price-is-wrong/src/state/fsm/template/internal" -) - -type Template struct { - id int - Host int - Contestants Player -} - -type Player struct { - ID int -} - -func Open(ctx context.Context, name string) (*Template, error) { - if err := initialize(ctx); err != nil { - return nil, fmt.Errorf("failed to initialize template: %w", err) - } - - if result, err := open(ctx, name); err != nil { - return nil, err - } else if result == nil { - if err := create(ctx, name); err != nil { - return nil, err - } - } - - return mustOpen(ctx, name) -} - -func mustOpen(ctx context.Context, name string) (*Template, error) { - result, err := open(ctx, name) - if err != nil { - return nil, err - } - if result == nil { - return nil, fmt.Errorf("no template found with name %s", name) - } - return result, nil -} - -func open(ctx context.Context, name string) (*Template, error) { - row := db.From(ctx).QueryRow(`SELECT id FROM templates WHERE name=?`, name) - if err := row.Err(); err != nil { - return nil, fmt.Errorf("no template found with name %s", name) - } - - var id sql.NullInt32 - if err := row.Scan(&id); err == sql.ErrNoRows || !id.Valid { - return nil, nil - } else if err != nil { - return nil, fmt.Errorf("failed to scan id from templates: %w", err) - } - - return openID(ctx, int(id.Int32)) -} - -func openID(ctx context.Context, id int) (*Template, error) { - rows, err := db.From(ctx).QueryContext(ctx, ` - SELECT payload - FROM template_events - WHERE template_events.template_id=? - ORDER BY id - `, id) - if err != nil { - return nil, fmt.Errorf("failed to query event payloads for id %d: %w", id, err) - } - defer rows.Close() - - result := Template{id: id} - for rows.Next() { - var b []byte - if err := rows.Scan(&b); err != nil { - return nil, fmt.Errorf("failed to scan event: %w", err) - } - event, err := template.ParseEvent(b) - if err != nil { - return nil, fmt.Errorf("failed to parse event: %w", err) - } - if err := result.apply(event); err != nil { - return nil, fmt.Errorf("failed to apply event %s: %w", b, err) - } - } - - return &result, rows.Err() -} - -func create(ctx context.Context, name string) error { - _, err := db.From(ctx).ExecContext(ctx, ` - INSERT INTO templates (name) VALUES (?) - `, name) - return err -} - -func initialize(ctx context.Context) error { - _, err := db.From(ctx).ExecContext(ctx, ` - CREATE TABLE IF NOT EXISTS templates ( - id INTEGER PRIMARY KEY, - name TEXT - ); - CREATE TABLE IF NOT EXISTS template_events ( - id INTEGER PRIMARY KEY, - template_id NUMBER, - payload TEXT, - FOREIGN KEY (template_id) REFERENCES templates (id) - ); - `) - return err -} diff --git a/src/state/fsm/generate.go b/src/state/generate.go similarity index 75% rename from src/state/fsm/generate.go rename to src/state/generate.go index 06bc261..fca2545 100644 --- a/src/state/fsm/generate.go +++ b/src/state/generate.go @@ -1,3 +1,3 @@ -package fsm +package state //go:generate cp -r ./.template ./template diff --git a/src/state/fsm/lobby/events.go b/src/state/lobby/events.go similarity index 95% rename from src/state/fsm/lobby/events.go rename to src/state/lobby/events.go index 2d2aa23..745786f 100644 --- a/src/state/fsm/lobby/events.go +++ b/src/state/lobby/events.go @@ -3,7 +3,7 @@ package lobby import ( "context" "gitea/price-is-wrong/src/lib/db" - lobby "gitea/price-is-wrong/src/state/fsm/lobby/internal" + lobby "gitea/price-is-wrong/src/state/lobby/internal" "slices" ) diff --git a/src/state/fsm/lobby/internal/event.go b/src/state/lobby/internal/event.go similarity index 100% rename from src/state/fsm/lobby/internal/event.go rename to src/state/lobby/internal/event.go diff --git a/src/state/fsm/lobby/internal/event_test.go b/src/state/lobby/internal/event_test.go similarity index 91% rename from src/state/fsm/lobby/internal/event_test.go rename to src/state/lobby/internal/event_test.go index d32a739..23ae2d8 100644 --- a/src/state/fsm/lobby/internal/event_test.go +++ b/src/state/lobby/internal/event_test.go @@ -2,7 +2,7 @@ package lobby_test import ( "fmt" - lobby "gitea/price-is-wrong/src/state/fsm/lobby/internal" + lobby "gitea/price-is-wrong/src/state/lobby/internal" "testing" ) diff --git a/src/state/fsm/lobby/lobby_test.go b/src/state/lobby/lobby_test.go similarity index 96% rename from src/state/fsm/lobby/lobby_test.go rename to src/state/lobby/lobby_test.go index 4588fc8..e7667c6 100644 --- a/src/state/fsm/lobby/lobby_test.go +++ b/src/state/lobby/lobby_test.go @@ -2,7 +2,7 @@ package lobby_test import ( "gitea/price-is-wrong/src/lib" - "gitea/price-is-wrong/src/state/fsm/lobby" + "gitea/price-is-wrong/src/state/lobby" "testing" ) diff --git a/src/state/fsm/lobby/open.go b/src/state/lobby/open.go similarity index 97% rename from src/state/fsm/lobby/open.go rename to src/state/lobby/open.go index 834a32b..e5fe1a3 100644 --- a/src/state/fsm/lobby/open.go +++ b/src/state/lobby/open.go @@ -5,7 +5,7 @@ import ( "database/sql" "fmt" "gitea/price-is-wrong/src/lib/db" - lobby "gitea/price-is-wrong/src/state/fsm/lobby/internal" + lobby "gitea/price-is-wrong/src/state/lobby/internal" ) type Lobby struct { diff --git a/src/state/fsm/priceiswrong/events.go b/src/state/priceiswrong/events.go similarity index 93% rename from src/state/fsm/priceiswrong/events.go rename to src/state/priceiswrong/events.go index 4f6092f..a547265 100644 --- a/src/state/fsm/priceiswrong/events.go +++ b/src/state/priceiswrong/events.go @@ -3,7 +3,7 @@ package priceiswrong import ( "context" "gitea/price-is-wrong/src/lib/db" - priceiswrong "gitea/price-is-wrong/src/state/fsm/priceiswrong/internal" + priceiswrong "gitea/price-is-wrong/src/state/priceiswrong/internal" "html" "math/rand" ) @@ -33,6 +33,7 @@ func (p *PriceIsWrong) apply(e priceiswrong.Event) error { p.Item.ImageURL = e.ImageURL p.Item.Title = html.EscapeString(e.Title) p.Item.Description = html.EscapeString(e.Description) + p.Item.Value = html.EscapeString(e.Value) case *priceiswrong.Guess: for i := range p.Contestants { if p.Contestants[i].ID == e.ID { @@ -55,11 +56,12 @@ func (p *PriceIsWrong) Score(ctx context.Context, id, score int) error { return p.upsertEvent(ctx, &priceiswrong.Score{ID: id, Score: score}) } -func (p *PriceIsWrong) SetItem(ctx context.Context, imageURL, title, description string) error { +func (p *PriceIsWrong) SetItem(ctx context.Context, imageURL, title, description, value string) error { return p.upsertEvent(ctx, &priceiswrong.Item{ ImageURL: imageURL, Title: title, Description: description, + Value: value, }) } diff --git a/src/state/fsm/priceiswrong/internal/event.go b/src/state/priceiswrong/internal/event.go similarity index 97% rename from src/state/fsm/priceiswrong/internal/event.go rename to src/state/priceiswrong/internal/event.go index 18a75d8..c132a22 100644 --- a/src/state/fsm/priceiswrong/internal/event.go +++ b/src/state/priceiswrong/internal/event.go @@ -24,6 +24,7 @@ type Item struct { ImageURL string Title string Description string + Value string } type Guess struct { diff --git a/src/state/fsm/priceiswrong/open.go b/src/state/priceiswrong/open.go similarity index 97% rename from src/state/fsm/priceiswrong/open.go rename to src/state/priceiswrong/open.go index e80c07f..6be1517 100644 --- a/src/state/fsm/priceiswrong/open.go +++ b/src/state/priceiswrong/open.go @@ -5,7 +5,7 @@ import ( "database/sql" "fmt" "gitea/price-is-wrong/src/lib/db" - priceiswrong "gitea/price-is-wrong/src/state/fsm/priceiswrong/internal" + priceiswrong "gitea/price-is-wrong/src/state/priceiswrong/internal" ) type PriceIsWrong struct { diff --git a/src/state/fsm/priceiswrong/priceiswrong_test.go b/src/state/priceiswrong/priceiswrong_test.go similarity index 92% rename from src/state/fsm/priceiswrong/priceiswrong_test.go rename to src/state/priceiswrong/priceiswrong_test.go index fec965d..12643bf 100644 --- a/src/state/fsm/priceiswrong/priceiswrong_test.go +++ b/src/state/priceiswrong/priceiswrong_test.go @@ -2,7 +2,7 @@ package priceiswrong_test import ( "gitea/price-is-wrong/src/lib" - "gitea/price-is-wrong/src/state/fsm/priceiswrong" + "gitea/price-is-wrong/src/state/priceiswrong" "testing" ) @@ -46,11 +46,11 @@ func TestPriceIsWrong(t *testing.T) { t.Errorf("guess didnt persist: %+v", p.Contestants) } - if err := p.SetItem(ctx, "a", "b", "c"); err != nil { + if err := p.SetItem(ctx, "a", "b", "c", "d"); err != nil { t.Fatal(err) } else if p.Contestants[0].Guess != "" { t.Errorf("set item didnt clear guesses") - } else if err := p.SetItem(ctx, "imageURL", "title", "description"); err != nil { + } else if err := p.SetItem(ctx, "imageURL", "title", "description", "d"); err != nil { t.Fatal(err) } else if p.Item.ImageURL != "imageURL" { t.Errorf("wrong image url: %s", p.Item.ImageURL)