Skip to content

Commit

Permalink
Merge pull request #826 from traPtitech/requests-query-created_by
Browse files Browse the repository at this point in the history
`GET /requests?created_by`
  • Loading branch information
H1rono authored Dec 27, 2024
2 parents c38ab8a + 507082f commit 62b926a
Show file tree
Hide file tree
Showing 6 changed files with 180 additions and 14 deletions.
9 changes: 9 additions & 0 deletions docs/swagger.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -151,6 +151,7 @@ paths:
- $ref: "#/components/parameters/untilQuery"
- $ref: "#/components/parameters/tagQuery"
- $ref: "#/components/parameters/groupQuery"
- $ref: "#/components/parameters/createdByQuery"
responses:
"200":
description: 取得できた場合。該当するものがなくても空配列を返す。
Expand Down Expand Up @@ -1455,6 +1456,14 @@ components:
in: query
schema:
type: string
createdByQuery:
name: created_by
description: 作成者
required: false
in: query
schema:
type: string
format: uuid
requestQuery:
name: request
description: 依頼
Expand Down
15 changes: 8 additions & 7 deletions model/request.go
Original file line number Diff line number Diff line change
Expand Up @@ -59,11 +59,12 @@ type RequestDetail struct {
}

type RequestQuery struct {
Sort *string
Target *uuid.UUID
Status *string
Since *time.Time
Until *time.Time
Tag *string
Group *string
Sort *string
Target *uuid.UUID
Status *string
Since *time.Time
Until *time.Time
Tag *string
Group *string
CreatedBy *uuid.UUID
}
8 changes: 8 additions & 0 deletions model/request_impl.go
Original file line number Diff line number Diff line change
Expand Up @@ -110,6 +110,14 @@ func (repo *EntRepository) GetRequests(
),
)
}
if query.CreatedBy != nil && *query.CreatedBy != uuid.Nil {
requestsq = requestsq.
Where(
request.HasUserWith(
user.IDEQ(*query.CreatedBy),
),
)
}

requests, err := requestsq.All(ctx)
if err != nil {
Expand Down
82 changes: 82 additions & 0 deletions model/request_impl_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,9 @@ func TestEntRepository_GetRequests(t *testing.T) {
client8, storage8, err := setup(t, ctx, "get_requests8")
require.NoError(t, err)
repo8 := NewEntRepository(client8, storage8)
client9, storage9, err := setup(t, ctx, "get_requests9")
require.NoError(t, err)
repo9 := NewEntRepository(client9, storage9)

t.Run("SuccessWithSortCreatedAt", func(t *testing.T) {
t.Parallel()
Expand Down Expand Up @@ -591,6 +594,85 @@ func TestEntRepository_GetRequests(t *testing.T) {
assert.Equal(t, got[0].Tags[0].Name, request1.Tags[0].Name)
}
})

t.Run("SuccessWithQueryCreatedBy", func(t *testing.T) {
t.Parallel()
ctx := context.Background()
user1, err := repo9.CreateUser(
ctx,
random.AlphaNumeric(t, 20),
random.AlphaNumeric(t, 30),
true)
require.NoError(t, err)
user2, err := repo9.CreateUser(
ctx,
random.AlphaNumeric(t, 20),
random.AlphaNumeric(t, 30),
true)
require.NoError(t, err)
target := &RequestTarget{
Target: user1.ID,
Amount: random.Numeric(t, 10000),
}

budget := random.Numeric(t, 10000)
group, err := repo9.CreateGroup(
ctx,
random.AlphaNumeric(t, 20),
random.AlphaNumeric(t, 30),
&budget)
require.NoError(t, err)

request1, err := repo9.CreateRequest(
ctx,
random.AlphaNumeric(t, 40),
random.AlphaNumeric(t, 100),
[]*Tag{},
[]*RequestTarget{target},
group,
user1.ID)
require.NoError(t, err)
_, err = repo9.CreateRequest(
ctx,
random.AlphaNumeric(t, 40),
random.AlphaNumeric(t, 100),
[]*Tag{},
[]*RequestTarget{target},
group,
user2.ID)
require.NoError(t, err)

got, err := repo9.GetRequests(ctx, RequestQuery{
CreatedBy: &user1.ID,
})
require.NoError(t, err)
if assert.Len(t, got, 1) {
got := got[0]
exp := &RequestResponse{
ID: request1.ID,
Status: request1.Status,
// FIXME: time.Time の内部表現が異なるため、比較ができない
CreatedAt: got.CreatedAt,
UpdatedAt: got.UpdatedAt,
CreatedBy: request1.CreatedBy,
Title: request1.Title,
Content: request1.Content,
Tags: request1.Tags,
// Targets: request1.Targets,
// Statuses: request1.Statuses,
Group: &Group{
ID: request1.Group.ID,
Name: request1.Group.Name,
Description: request1.Group.Description,
Budget: request1.Group.Budget,
CreatedAt: got.Group.CreatedAt,
UpdatedAt: got.Group.UpdatedAt,
DeletedAt: request1.Group.DeletedAt,
},
}
require.Equal(t, exp, got)
}
})
}

func TestEntRepository_CreateRequest(t *testing.T) {
Expand Down
24 changes: 17 additions & 7 deletions router/request.go
Original file line number Diff line number Diff line change
Expand Up @@ -167,14 +167,24 @@ func (h Handlers) GetRequests(c echo.Context) error {
g := c.QueryParam("group")
group = &g
}
var cratedBy *uuid.UUID
if c.QueryParam("created_by") != "" {
u, err := uuid.Parse(c.QueryParam("created_by"))
if err != nil {
h.Logger.Info("could not parse query parameter `created_by` as UUID", zap.Error(err))
return echo.NewHTTPError(http.StatusBadRequest, err)
}
cratedBy = &u
}
query := model.RequestQuery{
Sort: sort,
Target: target,
Status: ss,
Since: since,
Until: until,
Tag: tag,
Group: group,
Sort: sort,
Target: target,
Status: ss,
Since: since,
Until: until,
Tag: tag,
Group: group,
CreatedBy: cratedBy,
}

modelrequests, err := h.Repository.GetRequests(ctx, query)
Expand Down
56 changes: 56 additions & 0 deletions router/request_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -391,6 +391,62 @@ func TestHandlers_GetRequests(t *testing.T) {
}
})

t.Run("Success7", func(t *testing.T) {
t.Parallel()
ctrl := gomock.NewController(t)

date := time.Now().Round(time.Second).UTC()
request := &model.RequestResponse{
ID: uuid.New(),
Status: model.Submitted,
CreatedBy: uuid.New(),
Title: random.AlphaNumeric(t, 20),
Content: random.AlphaNumeric(t, 50),
CreatedAt: date,
UpdatedAt: date,
}
modelRequests := []*model.RequestResponse{request}

e := echo.New()
req, err := http.NewRequest(
http.MethodGet,
fmt.Sprintf("/api/requests?created_by=%s", request.CreatedBy.String()),
nil)
require.NoError(t, err)
rec := httptest.NewRecorder()
c := e.NewContext(req, rec)

h, err := NewTestHandlers(t, ctrl)
require.NoError(t, err)
h.Repository.MockRequestRepository.
EXPECT().
GetRequests(c.Request().Context(), model.RequestQuery{CreatedBy: &request.CreatedBy}).
Return(modelRequests, nil)
err = h.Handlers.GetRequests(c)
if !assert.NoError(t, err) {
return
}
require.Equal(t, http.StatusOK, rec.Code)
var res []*RequestResponse
err = json.Unmarshal(rec.Body.Bytes(), &res)
require.NoError(t, err)
expectedBody := []*RequestResponse{
{
ID: request.ID,
Status: request.Status,
CreatedAt: date,
UpdatedAt: date,
CreatedBy: request.CreatedBy,
Title: request.Title,
Content: request.Content,
Tags: []*TagOverview{},
Targets: []*TargetOverview{},
Comments: []*CommentDetail{},
},
}
require.Equal(t, expectedBody, res)
})

t.Run("InvaildStatus", func(t *testing.T) {
t.Parallel()
ctrl := gomock.NewController(t)
Expand Down

0 comments on commit 62b926a

Please sign in to comment.