Gisle Aune
3 years ago
5 changed files with 179 additions and 30 deletions
-
5.gitignore
-
31app/config/repo.go
-
146internal/mysql/eventhandlerrepo.go
-
6models/eventhandler.go
-
21scripts/20210920180433_eventhandler.sql
@ -0,0 +1,146 @@ |
|||||
|
package mysql |
||||
|
|
||||
|
import ( |
||||
|
"context" |
||||
|
"encoding/json" |
||||
|
"git.aiterp.net/lucifer/new-server/models" |
||||
|
"github.com/jmoiron/sqlx" |
||||
|
) |
||||
|
|
||||
|
type eventHandlerRecord struct { |
||||
|
ID int `db:"id"` |
||||
|
EventName string `db:"event_name"` |
||||
|
OneShot bool `db:"one_shot"` |
||||
|
Priority int `db:"priority"` |
||||
|
TargetKind string `db:"target_kind"` |
||||
|
TargetValue string `db:"target_value"` |
||||
|
ConditionsJSON json.RawMessage `db:"conditions"` |
||||
|
ActionsJSON json.RawMessage `db:"actions"` |
||||
|
} |
||||
|
|
||||
|
type EventHandlerRepo struct { |
||||
|
DBX *sqlx.DB |
||||
|
} |
||||
|
|
||||
|
func (r *EventHandlerRepo) FindByID(ctx context.Context, id int) (*models.EventHandler, error) { |
||||
|
var record eventHandlerRecord |
||||
|
err := r.DBX.GetContext(ctx, &record, "SELECT * FROM event_handler WHERE id = ?", id) |
||||
|
if err != nil { |
||||
|
return nil, dbErr(err) |
||||
|
} |
||||
|
|
||||
|
return r.populateOne(&record) |
||||
|
} |
||||
|
|
||||
|
func (r *EventHandlerRepo) FetchAll(ctx context.Context) ([]models.EventHandler, error) { |
||||
|
var records []eventHandlerRecord |
||||
|
err := r.DBX.SelectContext(ctx, &records, "SELECT * FROM event_handler") |
||||
|
if err != nil { |
||||
|
return nil, dbErr(err) |
||||
|
} |
||||
|
|
||||
|
return r.populate(records) |
||||
|
} |
||||
|
|
||||
|
func (r *EventHandlerRepo) Save(ctx context.Context, handler *models.EventHandler) error { |
||||
|
conditionsJson, err := json.Marshal(handler.Conditions) |
||||
|
if err != nil { |
||||
|
return dbErr(err) |
||||
|
} |
||||
|
actionsJson, err := json.Marshal(handler.Actions) |
||||
|
if err != nil { |
||||
|
return dbErr(err) |
||||
|
} |
||||
|
|
||||
|
record := eventHandlerRecord{ |
||||
|
ID: handler.ID, |
||||
|
EventName: handler.EventName, |
||||
|
OneShot: handler.OneShot, |
||||
|
Priority: handler.Priority, |
||||
|
TargetKind: string(handler.TargetKind), |
||||
|
TargetValue: handler.TargetValue, |
||||
|
ConditionsJSON: conditionsJson, |
||||
|
ActionsJSON: actionsJson, |
||||
|
} |
||||
|
|
||||
|
if record.ID == 0 { |
||||
|
res, err := r.DBX.NamedExecContext(ctx, ` |
||||
|
INSERT INTO event_handler (event_name, one_shot, priority, target_kind, target_value, conditions, actions) |
||||
|
VALUES (:event_name, :one_shot, :priority, :target_kind, :target_value, :conditions, :actions); |
||||
|
`, record) |
||||
|
if err != nil { |
||||
|
return dbErr(err) |
||||
|
} |
||||
|
|
||||
|
id, err := res.LastInsertId() |
||||
|
if err != nil { |
||||
|
return dbErr(err) |
||||
|
} |
||||
|
|
||||
|
handler.ID = int(id) |
||||
|
} else { |
||||
|
_, err := r.DBX.NamedExecContext(ctx, ` |
||||
|
UPDATE event_handler SET |
||||
|
event_name = :event_name, |
||||
|
one_shot = :one_shot, |
||||
|
priority = :priority, |
||||
|
target_kind = :target_kind, |
||||
|
target_value = :target_value, |
||||
|
conditions = :conditions, |
||||
|
actions = :actions |
||||
|
WHERE id = :id |
||||
|
`, record) |
||||
|
if err != nil { |
||||
|
return dbErr(err) |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
return nil |
||||
|
} |
||||
|
|
||||
|
func (r *EventHandlerRepo) Delete(ctx context.Context, handler *models.EventHandler) error { |
||||
|
_, err := r.DBX.ExecContext(ctx, "DELETE FROM event_handler WHERE id=?", handler.ID) |
||||
|
if err != nil { |
||||
|
return dbErr(err) |
||||
|
} |
||||
|
|
||||
|
return nil |
||||
|
} |
||||
|
|
||||
|
func (r *EventHandlerRepo) populateOne(record *eventHandlerRecord) (*models.EventHandler, error) { |
||||
|
records, err := r.populate([]eventHandlerRecord{*record}) |
||||
|
if err != nil { |
||||
|
return nil, err |
||||
|
} |
||||
|
|
||||
|
return &records[0], nil |
||||
|
} |
||||
|
|
||||
|
func (r *EventHandlerRepo) populate(records []eventHandlerRecord) ([]models.EventHandler, error) { |
||||
|
res := make([]models.EventHandler, 0, len(records)) |
||||
|
|
||||
|
for _, record := range records { |
||||
|
handler := models.EventHandler{ |
||||
|
ID: record.ID, |
||||
|
EventName: record.EventName, |
||||
|
OneShot: record.OneShot, |
||||
|
Priority: record.Priority, |
||||
|
TargetKind: models.ReferenceKind(record.TargetKind), |
||||
|
TargetValue: record.TargetValue, |
||||
|
Conditions: make(map[string]models.EventCondition), |
||||
|
} |
||||
|
|
||||
|
err := json.Unmarshal(record.ConditionsJSON, &handler.Conditions) |
||||
|
if err != nil { |
||||
|
return nil, dbErr(err) |
||||
|
} |
||||
|
err = json.Unmarshal(record.ActionsJSON, &handler.Actions) |
||||
|
if err != nil { |
||||
|
return nil, dbErr(err) |
||||
|
} |
||||
|
|
||||
|
res = append(res, handler) |
||||
|
} |
||||
|
|
||||
|
return res, nil |
||||
|
} |
@ -0,0 +1,21 @@ |
|||||
|
-- +goose Up |
||||
|
-- +goose StatementBegin |
||||
|
CREATE TABLE event_handler |
||||
|
( |
||||
|
id INT NOT NULL AUTO_INCREMENT, |
||||
|
event_name VARCHAR(255) NOT NULL, |
||||
|
one_shot TINYINT NOT NULL DEFAULT 0, |
||||
|
priority INT NOT NULL DEFAULT 0, |
||||
|
target_kind VARCHAR(255) NOT NULL, |
||||
|
target_value VARCHAR(255) NOT NULL, |
||||
|
conditions JSON NOT NULL, |
||||
|
actions JSON NOT NULL, |
||||
|
|
||||
|
PRIMARY KEY (id) |
||||
|
); |
||||
|
-- +goose StatementEnd |
||||
|
|
||||
|
-- +goose Down |
||||
|
-- +goose StatementBegin |
||||
|
DROP TABLE event_handler; |
||||
|
-- +goose StatementEnd |
Write
Preview
Loading…
Cancel
Save
Reference in new issue