forked from daptin/daptin
/
resource_findone.go
83 lines (71 loc) · 2.44 KB
/
resource_findone.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
package resource
import (
"github.com/artpar/api2go"
"github.com/pkg/errors"
"log"
//"strings"
)
// FindOne returns an object by its ID
// Possible Responder success status code 200
func (dr *DbResource) FindOne(referenceId string, req api2go.Request) (api2go.Responder, error) {
for _, bf := range dr.ms.BeforeFindOne {
//log.Printf("Invoke BeforeFindOne [%v][%v] on FindAll Request", bf.String(), dr.model.GetName())
r, err := bf.InterceptBefore(dr, &req, []map[string]interface{}{
{
"reference_id": referenceId,
"__type": dr.model.GetName(),
},
})
if err != nil {
log.Printf("Error from BeforeFindOne[%s][%s] middleware: %v", bf.String(), dr.model.GetName(), err)
return nil, err
}
if r == nil {
return nil, errors.New("Cannot find this object")
}
}
modelName := dr.model.GetName()
log.Printf("Find [%s] by id [%s]", modelName, referenceId)
//
//if strings.Index(modelName, "_has_") > 0 {
// parts := strings.Split(modelName, "_has_")
//}
data, include, err := dr.GetSingleRowByReferenceId(modelName, referenceId)
//log.Printf("Single row result: %v", data)
for _, bf := range dr.ms.AfterFindOne {
//log.Printf("Invoke AfterFindOne [%v][%v] on FindAll Request", bf.String(), modelName)
results, err := bf.InterceptAfter(dr, &req, []map[string]interface{}{data})
if len(results) != 0 {
data = results[0]
} else {
log.Printf("No results after executing: [%v]", bf.String())
data = nil
}
if err != nil {
log.Printf("Error from AfterFindOne middleware: %v", err)
}
include, err = bf.InterceptAfter(dr, &req, include)
if err != nil {
log.Printf("Error from AfterFindOne middleware: %v", err)
}
}
delete(data, "id")
//delete(data, "deleted_at")
infos := dr.model.GetColumns()
var a = api2go.NewApi2GoModel(dr.model.GetTableName(), infos, dr.model.GetDefaultPermission(), dr.model.GetRelations())
a.Data = data
for _, inc := range include {
p, ok := inc["permission"].(int64)
if !ok {
log.Printf("Failed to convert [%v] to permission: %v", inc["permission"], inc["__type"])
p = 0
}
incType := inc["__type"].(string)
if BeginsWith(incType, "image.") {
a.Includes = append(a.Includes, api2go.NewApi2GoModelWithData(incType, nil, 0, nil, inc))
} else {
a.Includes = append(a.Includes, api2go.NewApi2GoModelWithData(incType, dr.cruds[incType].model.GetColumns(), int64(p), dr.cruds[incType].model.GetRelations(), inc))
}
}
return NewResponse(nil, a, 200, nil), err
}