Skip to content

Commit e421443

Browse files
authored
Merge pull request starlight-go#11 from awans/email2
Email2
2 parents dfc10c8 + 8630e7d commit e421443

33 files changed

+622
-243
lines changed

internal/access_log/access_log.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,12 @@ type Module struct {
1111
lib.BlankModule
1212
}
1313

14-
func (m Module) ProvideMiddleware() []lib.Middleware {
14+
func (m *Module) ProvideMiddleware() []lib.Middleware {
1515
return []lib.Middleware{Logger}
1616
}
1717

1818
func GetModule() lib.Module {
19-
return Module{}
19+
return &Module{}
2020
}
2121

2222
func Logger(inner http.Handler) http.Handler {

internal/api/create.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@ func (s CreateHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) (err er
6363
}
6464
responseData := request.Include.Resolve(tx, st)
6565
response := CreateResponse{Data: responseData}
66+
tx.Commit()
6667

6768
// write out the response
6869
bytes, _ := jsoniter.Marshal(&response)

internal/api/create_op.go

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -73,17 +73,12 @@ func (op NestedCreateOperation) ApplyNested(tx db.RWTx, parent db.Record) (err e
7373
return nil
7474
}
7575

76-
func findOneByID(tx db.Tx, modelName string, id uuid.UUID) (db.Record, error) {
77-
return tx.FindOne(modelName, db.Eq("id", id))
76+
func findOneByID(tx db.Tx, modelID uuid.UUID, id uuid.UUID) (db.Record, error) {
77+
return tx.FindOne(modelID, db.Eq("id", id))
7878
}
7979

8080
func (op NestedConnectOperation) ApplyNested(tx db.RWTx, parent db.Record) (err error) {
81-
targetModel, err := tx.GetModelByID(op.Binding.Dual().ModelID())
82-
if err != nil {
83-
return
84-
}
85-
86-
rec, err := tx.FindOne(targetModel.Name, db.Eq(op.UniqueQuery.Key, op.UniqueQuery.Val))
81+
rec, err := tx.FindOne(op.Binding.Dual().ModelID(), db.Eq(op.UniqueQuery.Key, op.UniqueQuery.Val))
8782
if err != nil {
8883
return
8984
}

internal/api/create_op_test.go

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,8 @@ import (
88
)
99

1010
func makeRecord(tx db.Tx, modelName string, jsonValue string) db.Record {
11-
st := tx.MakeRecord(modelName)
11+
m, _ := tx.GetModel(modelName)
12+
st := tx.MakeRecord(m.ID)
1213
json.Unmarshal([]byte(jsonValue), &st)
1314
return st
1415
}
@@ -118,7 +119,8 @@ func TestCreateApply(t *testing.T) {
118119
op.Apply(tx)
119120
}
120121
for _, findCase := range testCase.output {
121-
found, _ := findOneByID(tx, findCase.modelName, findCase.st.ID())
122+
m, _ := tx.GetModel(findCase.modelName)
123+
found, _ := findOneByID(tx, m.ID, findCase.st.ID())
122124
if diff := deep.Equal(found, findCase.st); diff != nil {
123125
t.Error(diff)
124126
}

internal/api/find_many_op.go

Lines changed: 11 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package api
22

33
import (
44
"awans.org/aft/internal/db"
5+
"github.com/google/uuid"
56
)
67

78
type FieldCriterion struct {
@@ -24,24 +25,22 @@ type AggregateRelationshipCriterion struct {
2425
}
2526

2627
type RelationshipCriterion struct {
27-
Binding db.Binding
28-
RelatedFieldCriteria []FieldCriterion
29-
RelatedRelationshipCriteria []RelationshipCriterion
30-
RelatedAggregateRelationshipCriteria []AggregateRelationshipCriterion
28+
Binding db.Binding
29+
Where Where
3130
}
3231

33-
type Query struct {
32+
type Where struct {
3433
FieldCriteria []FieldCriterion
3534
RelationshipCriteria []RelationshipCriterion
3635
AggregateRelationshipCriteria []AggregateRelationshipCriterion
37-
Or []Query
38-
And []Query
39-
Not []Query
36+
Or []Where
37+
And []Where
38+
Not []Where
4039
}
4140

4241
type FindManyOperation struct {
43-
ModelName string
44-
Query Query
42+
ModelID uuid.UUID
43+
Where Where
4544
}
4645

4746
func (fc FieldCriterion) Matcher() db.Matcher {
@@ -50,8 +49,8 @@ func (fc FieldCriterion) Matcher() db.Matcher {
5049

5150
func (op FindManyOperation) Apply(tx db.Tx) []db.Record {
5251
var matchers []db.Matcher
53-
for _, fc := range op.Query.FieldCriteria {
52+
for _, fc := range op.Where.FieldCriteria {
5453
matchers = append(matchers, fc.Matcher())
5554
}
56-
return tx.FindMany(op.ModelName, db.And(matchers...))
55+
return tx.FindMany(op.ModelID, db.And(matchers...))
5756
}

internal/api/find_many_op_test.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -50,8 +50,8 @@ func TestFindManyApply(t *testing.T) {
5050
// Simple FindMany
5151
{
5252
operation: FindManyOperation{
53-
ModelName: "user",
54-
Query: Query{
53+
ModelID: db.User.ID,
54+
Where: Where{
5555
FieldCriteria: []FieldCriterion{
5656
FieldCriterion{
5757
Key: "Firstname",
@@ -66,8 +66,8 @@ func TestFindManyApply(t *testing.T) {
6666
// Simple FindMany
6767
{
6868
operation: FindManyOperation{
69-
ModelName: "user",
70-
Query: Query{
69+
ModelID: db.User.ID,
70+
Where: Where{
7171
FieldCriteria: []FieldCriterion{
7272
FieldCriterion{
7373
Key: "Age",

internal/api/find_one_op.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,15 @@ package api
22

33
import (
44
"awans.org/aft/internal/db"
5+
"github.com/google/uuid"
56
)
67

78
type FindOneOperation struct {
8-
ModelName string
9+
ModelID uuid.UUID
910
UniqueQuery UniqueQuery
1011
}
1112

1213
func (op FindOneOperation) Apply(tx db.Tx) (st db.Record, err error) {
1314
// TODO handle FK?
14-
return tx.FindOne(op.ModelName, db.Eq(op.UniqueQuery.Key, op.UniqueQuery.Val))
15+
return tx.FindOne(op.ModelID, db.Eq(op.UniqueQuery.Key, op.UniqueQuery.Val))
1516
}

internal/api/include_op.go

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import (
77

88
type Inclusion struct {
99
Binding db.Binding
10-
Query Query
10+
Where Where
1111
}
1212

1313
type Include struct {
@@ -45,30 +45,26 @@ func resolve(tx db.Tx, ir *IncludeResult, i Inclusion) error {
4545
id := ir.Record.ID()
4646
b := i.Binding
4747
d := b.Dual()
48-
targetModel, err := tx.GetModelByID(d.ModelID())
49-
if err != nil {
50-
return err
51-
}
5248

5349
switch b.RelType() {
5450
case db.HasOne:
5551
// FK on the other side
56-
hit, err := tx.FindOne(targetModel.Name, db.EqFK(d.Name(), id))
52+
hit, err := tx.FindOne(d.ModelID(), db.EqFK(d.Name(), id))
5753
if err != nil {
5854
return err
5955
}
6056
ir.SingleIncludes[b.Name()] = hit
6157
case db.BelongsTo:
6258
// FK on this side
6359
thisFK := rec.GetFK(b.Name())
64-
hit, err := tx.FindOne(targetModel.Name, db.Eq("id", thisFK))
60+
hit, err := tx.FindOne(d.ModelID(), db.Eq("id", thisFK))
6561
if err != nil {
6662
return err
6763
}
6864
ir.SingleIncludes[b.Name()] = hit
6965
case db.HasMany:
7066
// FK on the other side
71-
hits := tx.FindMany(targetModel.Name, db.EqFK(d.Name(), id))
67+
hits := tx.FindMany(d.ModelID(), db.EqFK(d.Name(), id))
7268
ir.MultiIncludes[b.Name()] = hits
7369
case db.HasManyAndBelongsToMany:
7470
panic("Not implemented")

internal/api/module.go

Lines changed: 17 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -4,62 +4,45 @@ import (
44
"awans.org/aft/internal/bus"
55
"awans.org/aft/internal/db"
66
"awans.org/aft/internal/server/lib"
7-
"github.com/json-iterator/go"
8-
"net/http"
97
)
108

119
type Module struct {
1210
lib.BlankModule
13-
db db.DB
14-
b *bus.EventBus
11+
db db.DB
12+
b *bus.EventBus
13+
dbReadyHandler interface{}
1514
}
1615

17-
func (m Module) ProvideRoutes() []lib.Route {
16+
func (m *Module) ProvideRoutes() []lib.Route {
1817
return []lib.Route{
1918
lib.Route{
2019
Name: "FindMany",
2120
Pattern: "/api/{modelName}.findMany",
22-
Handler: errorHandler(FindManyHandler{db: m.db, bus: m.b}),
21+
Handler: lib.ErrorHandler(FindManyHandler{db: m.db, bus: m.b}),
2322
},
2423
lib.Route{
2524
Name: "FindOne",
2625
Pattern: "/api/{modelName}.findOne",
27-
Handler: errorHandler(FindOneHandler{db: m.db, bus: m.b}),
26+
Handler: lib.ErrorHandler(FindOneHandler{db: m.db, bus: m.b}),
2827
},
2928
lib.Route{
3029
Name: "Create",
3130
Pattern: "/api/{modelName}.create",
32-
Handler: errorHandler(CreateHandler{db: m.db, bus: m.b}),
31+
Handler: lib.ErrorHandler(CreateHandler{db: m.db, bus: m.b}),
3332
},
3433
}
3534
}
3635

37-
func GetModule(db db.DB, b *bus.EventBus) lib.Module {
38-
return Module{db: db, b: b}
39-
}
40-
41-
type apiHandler interface {
42-
ServeHTTP(http.ResponseWriter, *http.Request) error
43-
}
44-
45-
type ErrorResponse struct {
46-
Code string `json:"code"`
47-
Message string `json:"message"`
36+
func GetModule(b *bus.EventBus) lib.Module {
37+
m := &Module{b: b}
38+
m.dbReadyHandler = func(event lib.DatabaseReady) {
39+
m.db = event.Db
40+
}
41+
return m
4842
}
4943

50-
func errorHandler(inner apiHandler) http.Handler {
51-
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
52-
err := inner.ServeHTTP(w, r)
53-
if err != nil {
54-
er := ErrorResponse{
55-
Code: "serve-error",
56-
Message: err.Error(),
57-
}
58-
bytes, _ := jsoniter.Marshal(&er)
59-
status := http.StatusBadRequest
60-
61-
_, _ = w.Write(bytes)
62-
w.WriteHeader(status)
63-
}
64-
})
44+
func (m *Module) ProvideHandlers() []interface{} {
45+
return []interface{}{
46+
m.dbReadyHandler,
47+
}
6548
}

internal/api/parse.go

Lines changed: 23 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -220,30 +220,34 @@ func (p Parser) ParseFindOne(modelName string, data map[string]interface{}) (op
220220
Key: fieldName,
221221
Val: value,
222222
},
223-
ModelName: modelName,
223+
ModelID: m.ID,
224224
}
225225
return
226226
}
227227

228228
func (p Parser) ParseFindMany(modelName string, data map[string]interface{}) (op FindManyOperation, err error) {
229-
q, err := p.ParseQuery(modelName, data)
229+
m, err := p.tx.GetModel(modelName)
230+
if err != nil {
231+
return
232+
}
233+
q, err := p.ParseWhere(modelName, data)
230234
if err != nil {
231235
return
232236
}
233237

234238
op = FindManyOperation{
235-
Query: q,
236-
ModelName: modelName,
239+
Where: q,
240+
ModelID: m.ID,
237241
}
238242
return op, nil
239243
}
240244

241-
func (p Parser) parseCompositeQueryList(modelName string, opVal interface{}) (ql []Query, err error) {
245+
func (p Parser) parseCompositeQueryList(modelName string, opVal interface{}) (ql []Where, err error) {
242246
opList := opVal.([]interface{})
243247
for _, opData := range opList {
244248
opMap := opData.(map[string]interface{})
245-
var opQ Query
246-
opQ, err = p.ParseQuery(modelName, opMap)
249+
var opQ Where
250+
opQ, err = p.ParseWhere(modelName, opMap)
247251
if err != nil {
248252
return
249253
}
@@ -252,12 +256,12 @@ func (p Parser) parseCompositeQueryList(modelName string, opVal interface{}) (ql
252256
return
253257
}
254258

255-
func (p Parser) ParseQuery(modelName string, data map[string]interface{}) (q Query, err error) {
259+
func (p Parser) ParseWhere(modelName string, data map[string]interface{}) (q Where, err error) {
256260
m, err := p.tx.GetModel(modelName)
257261
if err != nil {
258262
return
259263
}
260-
q = Query{}
264+
q = Where{}
261265
fc, err := parseFieldCriteria(m, data)
262266
if err != nil {
263267
return
@@ -275,23 +279,23 @@ func (p Parser) ParseQuery(modelName string, data map[string]interface{}) (q Que
275279
q.AggregateRelationshipCriteria = arc
276280

277281
if orVal, ok := data["OR"]; ok {
278-
var orQL []Query
282+
var orQL []Where
279283
orQL, err = p.parseCompositeQueryList(modelName, orVal)
280284
if err != nil {
281285
return
282286
}
283287
q.Or = orQL
284288
}
285289
if andVal, ok := data["AND"]; ok {
286-
var andQL []Query
290+
var andQL []Where
287291
andQL, err = p.parseCompositeQueryList(modelName, andVal)
288292
if err != nil {
289293
return
290294
}
291295
q.And = andQL
292296
}
293297
if notVal, ok := data["NOT"]; ok {
294-
var notQL []Query
298+
var notQL []Where
295299
notQL, err = p.parseCompositeQueryList(modelName, notVal)
296300
if err != nil {
297301
return
@@ -406,18 +410,20 @@ func (p Parser) parseRelationshipCriterion(b db.Binding, value interface{}) (rc
406410
return
407411
}
408412
rc = RelationshipCriterion{
409-
Binding: b,
410-
RelatedFieldCriteria: fc,
411-
RelatedRelationshipCriteria: rrc,
412-
RelatedAggregateRelationshipCriteria: arrc,
413+
Binding: b,
414+
Where: Where{
415+
FieldCriteria: fc,
416+
RelationshipCriteria: rrc,
417+
AggregateRelationshipCriteria: arrc,
418+
},
413419
}
414420
return
415421
}
416422

417423
func (p Parser) parseInclusion(b db.Binding, value interface{}) Inclusion {
418424
if v, ok := value.(bool); ok {
419425
if v {
420-
return Inclusion{Binding: b, Query: Query{}}
426+
return Inclusion{Binding: b, Where: Where{}}
421427
} else {
422428
panic("Include specified as false?")
423429
}

0 commit comments

Comments
 (0)