-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathitems.go
123 lines (101 loc) · 3.29 KB
/
items.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
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
package main
import (
"fmt"
"github.com/goadesign/goa"
"github.com/jinzhu/gorm"
"github.com/riku179/regisys-server/app"
"github.com/riku179/regisys-server/models"
"github.com/riku179/regisys-server/user"
)
// ItemsController implements the items resource.
type ItemsController struct {
*goa.Controller
DB *models.ItemsDB
}
// NewItemsController creates a items controller.
func NewItemsController(service *goa.Service) *ItemsController {
return &ItemsController{
Controller: service.NewController("ItemsController"),
}
}
// Add runs the add action.
func (c *ItemsController) Add(ctx *app.AddItemsContext) error {
reqUser := user.FromContext(ctx)
items := models.ItemsFromAddItemPayload(ctx.Payload)
items.UserID = reqUser.ID // 商品の所有ユーザのID
ItemsDB.Add(ctx, items)
return ctx.NoContent()
}
// Delete runs the delete action.
func (c *ItemsController) Delete(ctx *app.DeleteItemsContext) error {
reqUser := user.FromContext(ctx)
reqItem, err := ItemsDB.Get(ctx, ctx.ID)
if err == gorm.ErrRecordNotFound {
// 指定された商品が無い
return ctx.NotFound()
}
if reqItem.UserID != reqUser.ID {
// 指定された商品の所有者IDがリクエストしたユーザーののIDと一致しない
return ctx.Forbidden()
}
var relatedOrder models.Orders
err = OrdersDB.Db.Where("item_id = ?", ctx.ID).First(&relatedOrder).Error
if err != gorm.ErrRecordNotFound {
// 既に購入処理がされた商品は削除できない
return ctx.Forbidden()
} else {
// OK
ItemsDB.Delete(ctx, ctx.ID)
}
return ctx.NoContent()
}
// Modify runs the modify action.
func (c *ItemsController) Modify(ctx *app.ModifyItemsContext) error {
reqUser := user.FromContext(ctx)
reqItem, err := ItemsDB.Get(ctx, ctx.ID)
if err == gorm.ErrRecordNotFound {
// 指定された商品が無い
return ctx.NotFound()
}
if reqItem.UserID != reqUser.ID {
// 指定された商品の所有者IDがリクエストしたユーザーののIDと一致しない
return ctx.Forbidden()
}
var relatedOrder models.Orders
err = OrdersDB.Db.Where("item_id = ?", ctx.ID).First(&relatedOrder).Error
if err != gorm.ErrRecordNotFound {
// 既に購入処理がされた商品は変更できない
if ctx.Payload.ItemName == nil && ctx.Payload.Quantity == nil {
// が、価格の変更だけならOK
ItemsDB.UpdateFromModifyItemPayload(ctx, ctx.Payload, ctx.ID)
return ctx.NoContent()
}
return ctx.Forbidden()
} else if err != gorm.ErrRecordNotFound && err != nil {
fmt.Printf("[ERROR] %+v\n", err)
}
// OK
ItemsDB.UpdateFromModifyItemPayload(ctx, ctx.Payload, ctx.ID)
return ctx.NoContent()
}
// Show runs the show action.
func (c *ItemsController) Show(ctx *app.ShowItemsContext) error {
var res app.RegisysItemsCollection
// ユーザーが指定されていない場合は全てのItemを返す
if ctx.User == nil {
return ctx.OK(ItemsDB.ListRegisysItems(ctx))
}
_, err := UserDB.Get(ctx, *ctx.User)
if err == gorm.ErrRecordNotFound {
// ユーザーが存在しない
return ctx.NotFound()
} else {
// ユーザーが指定されている場合はそのユーザーのItemのみ返す
var items []*models.Items
ItemsDB.Db.Where("user_id = ?", ctx.User).Find(&items)
for _, t := range items {
res = append(res, t.ItemsToRegisysItems())
}
}
return ctx.OK(res)
}