diff --git a/internal/model/account_manager.go b/internal/model/account_manager.go index 9f76f341..87a23469 100644 --- a/internal/model/account_manager.go +++ b/internal/model/account_manager.go @@ -1,18 +1,51 @@ -//go:generate go tool mockgen -source=$GOFILE -destination=mock_$GOPACKAGE/mock_$GOFILE -package=mock_$GOPACKAGE package model import ( "context" "github.com/google/uuid" + "github.com/samber/lo" + "github.com/traPtitech/Jomon/internal/ent" + "github.com/traPtitech/Jomon/internal/ent/user" + "github.com/traPtitech/Jomon/internal/service" ) -type AccountManager struct { - ID uuid.UUID `json:"id"` +func (repo *EntRepository) GetAccountManagers( + ctx context.Context, +) ([]*service.AccountManager, error) { + users, err := repo.client.User. + Query(). + Where(user.AccountManager(true)). + All(ctx) + if err != nil { + return nil, defaultEntErrorConverter.convert(err) + } + + accountManagers := lo.Map(users, func(u *ent.User, _ int) *service.AccountManager { + return &service.AccountManager{ + ID: u.ID, + } + }) + + return accountManagers, nil +} + +func (repo *EntRepository) AddAccountManagers(ctx context.Context, userIDs []uuid.UUID) error { + _, err := repo.client.User. + Update(). + Where(user.IDIn(userIDs...)). + SetAccountManager(true). + Save(ctx) + + return defaultEntErrorConverter.convert(err) } -type AccountManagerRepository interface { - GetAccountManagers(ctx context.Context) ([]*AccountManager, error) - AddAccountManagers(ctx context.Context, userIDs []uuid.UUID) error - DeleteAccountManagers(ctx context.Context, userIDs []uuid.UUID) error +func (repo *EntRepository) DeleteAccountManagers(ctx context.Context, userIDs []uuid.UUID) error { + _, err := repo.client.User. + Update(). + Where(user.IDIn(userIDs...)). + SetAccountManager(false). + Save(ctx) + + return defaultEntErrorConverter.convert(err) } diff --git a/internal/model/account_manager_impl.go b/internal/model/account_manager_impl.go deleted file mode 100644 index a40233c0..00000000 --- a/internal/model/account_manager_impl.go +++ /dev/null @@ -1,48 +0,0 @@ -package model - -import ( - "context" - - "github.com/google/uuid" - "github.com/samber/lo" - "github.com/traPtitech/Jomon/internal/ent" - "github.com/traPtitech/Jomon/internal/ent/user" -) - -func (repo *EntRepository) GetAccountManagers(ctx context.Context) ([]*AccountManager, error) { - users, err := repo.client.User. - Query(). - Where(user.AccountManager(true)). - All(ctx) - if err != nil { - return nil, defaultEntErrorConverter.convert(err) - } - - accountManagers := lo.Map(users, func(u *ent.User, _ int) *AccountManager { - return &AccountManager{ - ID: u.ID, - } - }) - - return accountManagers, nil -} - -func (repo *EntRepository) AddAccountManagers(ctx context.Context, userIDs []uuid.UUID) error { - _, err := repo.client.User. - Update(). - Where(user.IDIn(userIDs...)). - SetAccountManager(true). - Save(ctx) - - return defaultEntErrorConverter.convert(err) -} - -func (repo *EntRepository) DeleteAccountManagers(ctx context.Context, userIDs []uuid.UUID) error { - _, err := repo.client.User. - Update(). - Where(user.IDIn(userIDs...)). - SetAccountManager(false). - Save(ctx) - - return defaultEntErrorConverter.convert(err) -} diff --git a/internal/model/account_manager_impl_test.go b/internal/model/account_manager_test.go similarity index 96% rename from internal/model/account_manager_impl_test.go rename to internal/model/account_manager_test.go index 395cc9d7..0a04345d 100644 --- a/internal/model/account_manager_impl_test.go +++ b/internal/model/account_manager_test.go @@ -5,6 +5,7 @@ import ( "github.com/google/uuid" "github.com/stretchr/testify/require" + "github.com/traPtitech/Jomon/internal/service" "github.com/traPtitech/Jomon/internal/testutil" "github.com/traPtitech/Jomon/internal/testutil/random" ) @@ -35,7 +36,7 @@ func TestEntRepository_GetAccountManagers(t *testing.T) { got, err := repo.GetAccountManagers(ctx) require.NoError(t, err) - exp := []*AccountManager{ + exp := []*service.AccountManager{ {ID: user1.ID}, {ID: user2.ID}, } diff --git a/internal/model/application.go b/internal/model/application.go index 0ff32f09..13d10e16 100644 --- a/internal/model/application.go +++ b/internal/model/application.go @@ -1,70 +1,416 @@ -//go:generate go tool mockgen -source=$GOFILE -destination=mock_$GOPACKAGE/mock_$GOFILE -package=mock_$GOPACKAGE package model import ( "context" + "fmt" "time" "github.com/google/uuid" - "github.com/traPtitech/Jomon/internal/nulltime" + "github.com/samber/lo" + "github.com/traPtitech/Jomon/internal/ent" + "github.com/traPtitech/Jomon/internal/ent/application" + "github.com/traPtitech/Jomon/internal/ent/applicationstatus" + "github.com/traPtitech/Jomon/internal/ent/applicationtarget" + "github.com/traPtitech/Jomon/internal/ent/comment" + "github.com/traPtitech/Jomon/internal/ent/tag" + "github.com/traPtitech/Jomon/internal/ent/user" + "github.com/traPtitech/Jomon/internal/service" ) -type ApplicationRepository interface { - GetApplications(ctx context.Context, query ApplicationQuery) ([]*ApplicationResponse, error) - CreateApplication( - ctx context.Context, title string, content string, - tags []*Tag, targets []*ApplicationTarget, userID uuid.UUID, - ) (*ApplicationDetail, error) - GetApplication(ctx context.Context, applicationID uuid.UUID) (*ApplicationDetail, error) - UpdateApplication( - ctx context.Context, applicationID uuid.UUID, title string, content string, - tags []*Tag, targets []*ApplicationTarget, - ) (*ApplicationDetail, error) +var applicationErrorConverter = &entErrorConverter{ + msgBadInput: "failed to process application due to invalid input", + msgNotFound: "application not found", } -type Application struct { - ID uuid.UUID - Amount int - CreatedAt time.Time - UpdatedAt time.Time +func (repo *EntRepository) GetApplications( + ctx context.Context, query service.ApplicationQuery, +) ([]*service.ApplicationResponse, error) { + // Querying + var applicationsq *ent.ApplicationQuery + if query.Sort == nil || *query.Sort == "" || *query.Sort == "created_at" { + applicationsq = repo.client.Application. + Query(). + WithTag(). + WithStatus(func(q *ent.ApplicationStatusQuery) { + q.Order(ent.Desc(applicationstatus.FieldCreatedAt)) + }). + WithUser(). + Order(ent.Desc(application.FieldCreatedAt)) + } else if *query.Sort == "-created_at" { + applicationsq = repo.client.Application. + Query(). + WithTag(). + WithStatus(func(q *ent.ApplicationStatusQuery) { + q.Order(ent.Desc(applicationstatus.FieldCreatedAt)) + }). + WithUser(). + Order(ent.Asc(application.FieldCreatedAt)) + } else if *query.Sort == "title" { + applicationsq = repo.client.Application. + Query(). + WithTag(). + WithStatus(func(q *ent.ApplicationStatusQuery) { + q.Order(ent.Desc(applicationstatus.FieldCreatedAt)) + }). + WithUser(). + Order(ent.Asc(application.FieldTitle)) + } else if *query.Sort == "-title" { + applicationsq = repo.client.Application. + Query(). + WithTag(). + WithStatus(func(q *ent.ApplicationStatusQuery) { + q.Order(ent.Desc(applicationstatus.FieldCreatedAt)) + }). + WithUser(). + Order(ent.Desc(application.FieldTitle)) + } else { + err := service.NewBadInputError(fmt.Sprintf("invalid sort field: %s", *query.Sort)) + return nil, err + } + + if query.Target != uuid.Nil { + applicationsq = applicationsq. + Where( + application.HasTargetWith( + applicationtarget.HasUserWith( + user.IDEQ(query.Target), + ), + ), + ) + } + + if query.Status != nil && *query.Status != "" { + applicationsq = applicationsq. + Where( + application.HasStatusWith( + applicationstatus.StatusEQ(applicationstatus.Status(*query.Status)), + ), + ) + } + + if query.Since.Valid { + applicationsq = applicationsq. + Where(application.CreatedAtGTE(query.Since.Time)) + } + + if query.Until.Valid { + applicationsq = applicationsq. + Where(application.CreatedAtLT(query.Until.Time)) + } + + if query.Tag != nil && *query.Tag != "" { + applicationsq = applicationsq. + Where( + application.HasTagWith( + tag.NameEQ(*query.Tag), + ), + ) + } + + applicationsq = applicationsq.Limit(query.Limit).Offset(query.Offset) + + if query.CreatedBy != uuid.Nil { + applicationsq = applicationsq. + Where( + application.HasUserWith( + user.IDEQ(query.CreatedBy), + ), + ) + } + + applications, err := applicationsq.All(ctx) + if err != nil { + return nil, applicationErrorConverter.convert(err) + } + + reqres := lo.Map(applications, func(r *ent.Application, _ int) *service.ApplicationResponse { + // NOTE: applicationstatusは必ず1件以上存在する前提であるため、Edges.Status[0]でアクセスしている + // CreateApplicationを参照 + return convertEntApplicationResponseToModelApplicationResponse( + r, r.Edges.Tag, r.Edges.Status[0], r.Edges.User) + }) + + return reqres, nil +} + +func (repo *EntRepository) CreateApplication( + ctx context.Context, title string, content string, + tags []*service.Tag, targets []*service.ApplicationTarget, userID uuid.UUID, +) (*service.ApplicationDetail, error) { + tx, err := repo.client.Tx(ctx) + if err != nil { + return nil, applicationErrorConverter.convert(err) + } + defer func() { + if v := recover(); v != nil { + _ = tx.Rollback() + panic(v) + } + }() + tagIDs := lo.Map(tags, func(t *service.Tag, _ int) uuid.UUID { + return t.ID + }) + created, err := tx.Client().Application. + Create(). + SetTitle(title). + SetContent(content). + SetCreatedAt(time.Now()). + SetUpdatedAt(time.Now()). + SetUserID(userID). + AddTagIDs(tagIDs...). + Save(ctx) + if err != nil { + err = RollbackWithError(tx, err) + return nil, applicationErrorConverter.convert(err) + } + t, err := created.QueryUser().Select(user.FieldID).First(ctx) + if err != nil { + err = RollbackWithError(tx, err) + return nil, applicationErrorConverter.convert(err) + } + s, err := tx.Client().ApplicationStatus. + Create(). + SetStatus(applicationstatus.StatusSubmitted). + SetCreatedAt(time.Now()). + SetApplication(created). + SetUser(t). + Save(ctx) + if err != nil { + err = RollbackWithError(tx, err) + return nil, applicationErrorConverter.convert(err) + } + status, err := tx.Client().ApplicationStatus. + Query(). + Where(applicationstatus.IDEQ(s.ID)). + WithUser(). + First(ctx) + if err != nil { + err = RollbackWithError(tx, err) + return nil, applicationErrorConverter.convert(err) + } + ts, err := repo.createApplicationTargets(ctx, tx, created.ID, targets) + if err != nil { + err = RollbackWithError(tx, err) + return nil, applicationErrorConverter.convert(err) + } + err = tx.Commit() + if err != nil { + return nil, applicationErrorConverter.convert(err) + } + statuses := []*service.ApplicationStatus{ + convertEntApplicationStatusToModelApplicationStatus(status), + } + reqdetail := &service.ApplicationDetail{ + ID: created.ID, + Status: convertEntApplicationStatusToModelStatus(&status.Status), + Title: created.Title, + Content: created.Content, + Tags: tags, + Targets: ts, + CreatedAt: created.CreatedAt, + UpdatedAt: created.UpdatedAt, + CreatedBy: t.ID, + Comments: []*service.Comment{}, + Statuses: statuses, + Files: []uuid.UUID{}, + } + return reqdetail, nil } -type ApplicationResponse struct { - ID uuid.UUID - Status Status - CreatedAt time.Time - UpdatedAt time.Time - CreatedBy uuid.UUID - Title string - Content string - Tags []*Tag - Targets []*ApplicationTargetDetail - Statuses []*ApplicationStatus +func (repo *EntRepository) GetApplication( + ctx context.Context, applicationID uuid.UUID, +) (*service.ApplicationDetail, error) { + r, err := repo.client.Application. + Query(). + Where(application.IDEQ(applicationID)). + WithTag(). + WithTarget(func(q *ent.ApplicationTargetQuery) { + q.WithUser() + }). + WithStatus(func(q *ent.ApplicationStatusQuery) { + q.Order(ent.Desc(applicationstatus.FieldCreatedAt)) + q.WithUser() + }). + WithUser(). + WithComment(func(q *ent.CommentQuery) { + q.Order(ent.Desc(comment.FieldCreatedAt)) + q.WithUser() + }). + WithFile(). + Only(ctx) + if err != nil { + return nil, applicationErrorConverter.convert(err) + } + tags := lo.Map(r.Edges.Tag, func(t *ent.Tag, _ int) *service.Tag { + return ConvertEntTagToModelTag(t) + }) + targets := lo.Map( + r.Edges.Target, + func(target *ent.ApplicationTarget, _ int) *service.ApplicationTargetDetail { + return ConvertEntApplicationTargetToModelApplicationTargetDetail(target) + }, + ) + comments := lo.Map(r.Edges.Comment, func(c *ent.Comment, _ int) *service.Comment { + return ConvertEntCommentToModelComment(c, c.Edges.User.ID) + }) + statuses := lo.Map( + r.Edges.Status, + func(status *ent.ApplicationStatus, _ int) *service.ApplicationStatus { + return convertEntApplicationStatusToModelApplicationStatus(status) + }, + ) + files := lo.Map(r.Edges.File, func(f *ent.File, _ int) uuid.UUID { + return f.ID + }) + reqdetail := &service.ApplicationDetail{ + ID: r.ID, + Status: convertEntApplicationStatusToModelStatus(&r.Edges.Status[0].Status), + Title: r.Title, + Content: r.Content, + Tags: tags, + Targets: targets, + CreatedAt: r.CreatedAt, + UpdatedAt: r.UpdatedAt, + CreatedBy: r.Edges.User.ID, + Comments: comments, + Statuses: statuses, + Files: files, + } + return reqdetail, nil } -type ApplicationDetail struct { - ID uuid.UUID - Status Status - Title string - Content string - Comments []*Comment - Files []uuid.UUID - Statuses []*ApplicationStatus - Tags []*Tag - Targets []*ApplicationTargetDetail - CreatedAt time.Time - UpdatedAt time.Time - CreatedBy uuid.UUID +func (repo *EntRepository) UpdateApplication( + ctx context.Context, applicationID uuid.UUID, title string, content string, + tags []*service.Tag, targets []*service.ApplicationTarget, +) (*service.ApplicationDetail, error) { + tx, err := repo.client.Tx(ctx) + if err != nil { + return nil, applicationErrorConverter.convert(err) + } + defer func() { + if v := recover(); v != nil { + _ = tx.Rollback() + panic(v) + } + }() + tagIDs := lo.Map(tags, func(t *service.Tag, _ int) uuid.UUID { + return t.ID + }) + updated, err := tx.Client().Application. + UpdateOneID(applicationID). + SetTitle(title). + SetContent(content). + ClearTag(). + AddTagIDs(tagIDs...). + Save(ctx) + if err != nil { + err = RollbackWithError(tx, err) + return nil, applicationErrorConverter.convert(err) + } + + _, err = tx.Client().Application. + UpdateOneID(applicationID). + Save(ctx) + if err != nil { + err = RollbackWithError(tx, err) + return nil, applicationErrorConverter.convert(err) + } + + entstatuses, err := updated.QueryStatus(). + WithUser(). + Order(ent.Desc(applicationstatus.FieldCreatedAt)). + All(ctx) + if err != nil { + err = RollbackWithError(tx, err) + return nil, applicationErrorConverter.convert(err) + } + status := entstatuses[0] + u, err := updated.QueryUser().Select(user.FieldID).First(ctx) + if err != nil { + err = RollbackWithError(tx, err) + return nil, applicationErrorConverter.convert(err) + } + enttags, err := updated.QueryTag().All(ctx) + if err != nil { + err = RollbackWithError(tx, err) + return nil, applicationErrorConverter.convert(err) + } + modeltags := lo.Map(enttags, func(enttag *ent.Tag, _ int) *service.Tag { + return ConvertEntTagToModelTag(enttag) + }) + + err = repo.deleteApplicationTargets(ctx, tx, applicationID) + if err != nil { + err = RollbackWithError(tx, err) + return nil, applicationErrorConverter.convert(err) + } + modeltargets, err := repo.createApplicationTargets(ctx, tx, applicationID, targets) + if err != nil { + err = RollbackWithError(tx, err) + return nil, applicationErrorConverter.convert(err) + } + entcomments, err := updated.QueryComment(). + WithUser(). + All(ctx) + if err != nil { + err = RollbackWithError(tx, err) + return nil, applicationErrorConverter.convert(err) + } + comments := lo.Map(entcomments, func(c *ent.Comment, _ int) *service.Comment { + return ConvertEntCommentToModelComment(c, c.Edges.User.ID) + }) + statuses := lo.Map(entstatuses, + func(s *ent.ApplicationStatus, _ int) *service.ApplicationStatus { + return convertEntApplicationStatusToModelApplicationStatus(s) + }) + entfiles, err := updated.QueryFile().All(ctx) + if err != nil { + err = RollbackWithError(tx, err) + return nil, applicationErrorConverter.convert(err) + } + files := lo.Map(entfiles, func(f *ent.File, _ int) uuid.UUID { + return f.ID + }) + err = tx.Commit() + if err != nil { + return nil, applicationErrorConverter.convert(err) + } + + reqdetail := &service.ApplicationDetail{ + ID: updated.ID, + Status: convertEntApplicationStatusToModelStatus(&status.Status), + Title: updated.Title, + Content: updated.Content, + Tags: modeltags, + Targets: modeltargets, + CreatedAt: updated.CreatedAt, + UpdatedAt: updated.UpdatedAt, + CreatedBy: u.ID, + Comments: comments, + Statuses: statuses, + Files: files, + } + return reqdetail, nil } -type ApplicationQuery struct { - Sort *string - Target uuid.UUID - Status *string - Since nulltime.NullTime - Until nulltime.NullTime - Limit int - Offset int - Tag *string - CreatedBy uuid.UUID +func convertEntApplicationResponseToModelApplicationResponse( + application *ent.Application, tags []*ent.Tag, + status *ent.ApplicationStatus, user *ent.User, +) *service.ApplicationResponse { + if application == nil { + return nil + } + modeltags := lo.Map(tags, func(t *ent.Tag, _ int) *service.Tag { + return ConvertEntTagToModelTag(t) + }) + return &service.ApplicationResponse{ + ID: application.ID, + Status: convertEntApplicationStatusToModelStatus(&status.Status), + CreatedAt: application.CreatedAt, + UpdatedAt: application.UpdatedAt, + CreatedBy: user.ID, + Title: application.Title, + Content: application.Content, + Tags: modeltags, + } } diff --git a/internal/model/application_impl.go b/internal/model/application_impl.go deleted file mode 100644 index 37fea0e4..00000000 --- a/internal/model/application_impl.go +++ /dev/null @@ -1,400 +0,0 @@ -package model - -import ( - "context" - "time" - - "github.com/google/uuid" - "github.com/samber/lo" - "github.com/traPtitech/Jomon/internal/ent" - "github.com/traPtitech/Jomon/internal/ent/application" - "github.com/traPtitech/Jomon/internal/ent/applicationstatus" - "github.com/traPtitech/Jomon/internal/ent/applicationtarget" - "github.com/traPtitech/Jomon/internal/ent/tag" - "github.com/traPtitech/Jomon/internal/ent/user" -) - -var applicationErrorConverter = &entErrorConverter{ - msgBadInput: "failed to process application due to invalid input", - msgNotFound: "application not found", -} - -func (repo *EntRepository) GetApplications( - ctx context.Context, query ApplicationQuery, -) ([]*ApplicationResponse, error) { - // Querying - var applicationsq *ent.ApplicationQuery - if query.Sort == nil || *query.Sort == "" || *query.Sort == "created_at" { - applicationsq = repo.client.Application. - Query(). - WithTag(). - WithStatus(func(q *ent.ApplicationStatusQuery) { - q.Order(ent.Desc(applicationstatus.FieldCreatedAt)) - }). - WithUser(). - Order(ent.Desc(application.FieldCreatedAt)) - } else if *query.Sort == "-created_at" { - applicationsq = repo.client.Application. - Query(). - WithTag(). - WithStatus(func(q *ent.ApplicationStatusQuery) { - q.Order(ent.Desc(applicationstatus.FieldCreatedAt)) - }). - WithUser(). - Order(ent.Asc(application.FieldCreatedAt)) - } else if *query.Sort == "title" { - applicationsq = repo.client.Application. - Query(). - WithTag(). - WithStatus(func(q *ent.ApplicationStatusQuery) { - q.Order(ent.Desc(applicationstatus.FieldCreatedAt)) - }). - WithUser(). - Order(ent.Asc(application.FieldTitle)) - } else if *query.Sort == "-title" { - applicationsq = repo.client.Application. - Query(). - WithTag(). - WithStatus(func(q *ent.ApplicationStatusQuery) { - q.Order(ent.Desc(applicationstatus.FieldCreatedAt)) - }). - WithUser(). - Order(ent.Desc(application.FieldTitle)) - } - - if query.Target != uuid.Nil { - applicationsq = applicationsq. - Where( - application.HasTargetWith( - applicationtarget.HasUserWith( - user.IDEQ(query.Target), - ), - ), - ) - } - - if query.Status != nil && *query.Status != "" { - applicationsq = applicationsq. - Where( - application.HasStatusWith( - applicationstatus.StatusEQ(applicationstatus.Status(*query.Status)), - ), - ) - } - - if query.Since.Valid { - applicationsq = applicationsq. - Where(application.CreatedAtGTE(query.Since.Time)) - } - - if query.Until.Valid { - applicationsq = applicationsq. - Where(application.CreatedAtLT(query.Until.Time)) - } - - if query.Tag != nil && *query.Tag != "" { - applicationsq = applicationsq. - Where( - application.HasTagWith( - tag.NameEQ(*query.Tag), - ), - ) - } - - applicationsq = applicationsq.Limit(query.Limit).Offset(query.Offset) - - if query.CreatedBy != uuid.Nil { - applicationsq = applicationsq. - Where( - application.HasUserWith( - user.IDEQ(query.CreatedBy), - ), - ) - } - - applications, err := applicationsq.All(ctx) - if err != nil { - return nil, applicationErrorConverter.convert(err) - } - - reqres := lo.Map(applications, func(r *ent.Application, _ int) *ApplicationResponse { - return convertEntApplicationResponseToModelApplicationResponse( - r, r.Edges.Tag, r.Edges.Status[0], r.Edges.User) - }) - - return reqres, nil -} - -func (repo *EntRepository) CreateApplication( - ctx context.Context, title string, content string, - tags []*Tag, targets []*ApplicationTarget, userID uuid.UUID, -) (*ApplicationDetail, error) { - tx, err := repo.client.Tx(ctx) - if err != nil { - return nil, applicationErrorConverter.convert(err) - } - defer func() { - if v := recover(); v != nil { - _ = tx.Rollback() - panic(v) - } - }() - tagIDs := lo.Map(tags, func(t *Tag, _ int) uuid.UUID { - return t.ID - }) - created, err := tx.Client().Application. - Create(). - SetTitle(title). - SetContent(content). - SetCreatedAt(time.Now()). - SetUpdatedAt(time.Now()). - SetUserID(userID). - AddTagIDs(tagIDs...). - Save(ctx) - if err != nil { - err = RollbackWithError(tx, err) - return nil, applicationErrorConverter.convert(err) - } - t, err := created.QueryUser().Select(user.FieldID).First(ctx) - if err != nil { - err = RollbackWithError(tx, err) - return nil, applicationErrorConverter.convert(err) - } - s, err := tx.Client().ApplicationStatus. - Create(). - SetStatus(applicationstatus.StatusSubmitted). - SetCreatedAt(time.Now()). - SetApplication(created). - SetUser(t). - Save(ctx) - if err != nil { - err = RollbackWithError(tx, err) - return nil, applicationErrorConverter.convert(err) - } - status, err := tx.Client().ApplicationStatus. - Query(). - Where(applicationstatus.IDEQ(s.ID)). - WithUser(). - First(ctx) - if err != nil { - err = RollbackWithError(tx, err) - return nil, applicationErrorConverter.convert(err) - } - ts, err := repo.createApplicationTargets(ctx, tx, created.ID, targets) - if err != nil { - err = RollbackWithError(tx, err) - return nil, applicationErrorConverter.convert(err) - } - err = tx.Commit() - if err != nil { - return nil, applicationErrorConverter.convert(err) - } - statuses := []*ApplicationStatus{convertEntApplicationStatusToModelApplicationStatus(status)} - reqdetail := &ApplicationDetail{ - ID: created.ID, - Status: convertEntApplicationStatusToModelStatus(&status.Status), - Title: created.Title, - Content: created.Content, - Tags: tags, - Targets: ts, - CreatedAt: created.CreatedAt, - UpdatedAt: created.UpdatedAt, - CreatedBy: t.ID, - Comments: []*Comment{}, - Statuses: statuses, - Files: []uuid.UUID{}, - } - return reqdetail, nil -} - -func (repo *EntRepository) GetApplication( - ctx context.Context, applicationID uuid.UUID, -) (*ApplicationDetail, error) { - r, err := repo.client.Application. - Query(). - Where(application.IDEQ(applicationID)). - WithTag(). - WithTarget(func(q *ent.ApplicationTargetQuery) { - q.WithUser() - }). - WithStatus(func(q *ent.ApplicationStatusQuery) { - q.Order(ent.Desc(applicationstatus.FieldCreatedAt)) - q.WithUser() - }). - WithUser(). - WithComment(). - WithFile(). - Only(ctx) - if err != nil { - return nil, applicationErrorConverter.convert(err) - } - tags := lo.Map(r.Edges.Tag, func(t *ent.Tag, _ int) *Tag { - return ConvertEntTagToModelTag(t) - }) - targets := lo.Map( - r.Edges.Target, - func(target *ent.ApplicationTarget, _ int) *ApplicationTargetDetail { - return ConvertEntApplicationTargetToModelApplicationTargetDetail(target) - }, - ) - comments := lo.Map(r.Edges.Comment, func(c *ent.Comment, _ int) *Comment { - return ConvertEntCommentToModelComment(c, c.Edges.User.ID) - }) - statuses := lo.Map( - r.Edges.Status, - func(status *ent.ApplicationStatus, _ int) *ApplicationStatus { - return convertEntApplicationStatusToModelApplicationStatus(status) - }, - ) - files := lo.Map(r.Edges.File, func(f *ent.File, _ int) uuid.UUID { - return f.ID - }) - reqdetail := &ApplicationDetail{ - ID: r.ID, - Status: convertEntApplicationStatusToModelStatus(&r.Edges.Status[0].Status), - Title: r.Title, - Content: r.Content, - Tags: tags, - Targets: targets, - CreatedAt: r.CreatedAt, - UpdatedAt: r.UpdatedAt, - CreatedBy: r.Edges.User.ID, - Comments: comments, - Statuses: statuses, - Files: files, - } - return reqdetail, nil -} - -func (repo *EntRepository) UpdateApplication( - ctx context.Context, applicationID uuid.UUID, title string, content string, - tags []*Tag, targets []*ApplicationTarget, -) (*ApplicationDetail, error) { - tx, err := repo.client.Tx(ctx) - if err != nil { - return nil, applicationErrorConverter.convert(err) - } - defer func() { - if v := recover(); v != nil { - _ = tx.Rollback() - panic(v) - } - }() - tagIDs := lo.Map(tags, func(t *Tag, _ int) uuid.UUID { - return t.ID - }) - updated, err := tx.Client().Application. - UpdateOneID(applicationID). - SetTitle(title). - SetContent(content). - ClearTag(). - AddTagIDs(tagIDs...). - Save(ctx) - if err != nil { - err = RollbackWithError(tx, err) - return nil, applicationErrorConverter.convert(err) - } - - _, err = tx.Client().Application. - UpdateOneID(applicationID). - Save(ctx) - if err != nil { - err = RollbackWithError(tx, err) - return nil, applicationErrorConverter.convert(err) - } - - entstatuses, err := updated.QueryStatus(). - WithUser(). - Order(ent.Desc(applicationstatus.FieldCreatedAt)). - All(ctx) - if err != nil { - err = RollbackWithError(tx, err) - return nil, applicationErrorConverter.convert(err) - } - status := entstatuses[0] - u, err := updated.QueryUser().Select(user.FieldID).First(ctx) - if err != nil { - err = RollbackWithError(tx, err) - return nil, applicationErrorConverter.convert(err) - } - enttags, err := updated.QueryTag().All(ctx) - if err != nil { - err = RollbackWithError(tx, err) - return nil, applicationErrorConverter.convert(err) - } - modeltags := lo.Map(enttags, func(enttag *ent.Tag, _ int) *Tag { - return ConvertEntTagToModelTag(enttag) - }) - - err = repo.deleteApplicationTargets(ctx, tx, applicationID) - if err != nil { - err = RollbackWithError(tx, err) - return nil, applicationErrorConverter.convert(err) - } - modeltargets, err := repo.createApplicationTargets(ctx, tx, applicationID, targets) - if err != nil { - err = RollbackWithError(tx, err) - return nil, applicationErrorConverter.convert(err) - } - entcomments, err := updated.QueryComment(). - WithUser(). - All(ctx) - if err != nil { - return nil, applicationErrorConverter.convert(err) - } - comments := lo.Map(entcomments, func(c *ent.Comment, _ int) *Comment { - return ConvertEntCommentToModelComment(c, c.Edges.User.ID) - }) - statuses := lo.Map(entstatuses, func(s *ent.ApplicationStatus, _ int) *ApplicationStatus { - return convertEntApplicationStatusToModelApplicationStatus(s) - }) - entfiles, err := updated.QueryFile().All(ctx) - if err != nil { - return nil, applicationErrorConverter.convert(err) - } - files := lo.Map(entfiles, func(f *ent.File, _ int) uuid.UUID { - return f.ID - }) - err = tx.Commit() - if err != nil { - return nil, applicationErrorConverter.convert(err) - } - - reqdetail := &ApplicationDetail{ - ID: updated.ID, - Status: convertEntApplicationStatusToModelStatus(&status.Status), - Title: updated.Title, - Content: updated.Content, - Tags: modeltags, - Targets: modeltargets, - CreatedAt: updated.CreatedAt, - UpdatedAt: updated.UpdatedAt, - CreatedBy: u.ID, - Comments: comments, - Statuses: statuses, - Files: files, - } - return reqdetail, nil -} - -func convertEntApplicationResponseToModelApplicationResponse( - application *ent.Application, tags []*ent.Tag, - status *ent.ApplicationStatus, user *ent.User, -) *ApplicationResponse { - if application == nil { - return nil - } - modeltags := lo.Map(tags, func(t *ent.Tag, _ int) *Tag { - return ConvertEntTagToModelTag(t) - }) - return &ApplicationResponse{ - ID: application.ID, - Status: convertEntApplicationStatusToModelStatus(&status.Status), - CreatedAt: application.CreatedAt, - UpdatedAt: application.UpdatedAt, - CreatedBy: user.ID, - Title: application.Title, - Content: application.Content, - Tags: modeltags, - } -} diff --git a/internal/model/application_status.go b/internal/model/application_status.go index fe0b4107..b37331f7 100644 --- a/internal/model/application_status.go +++ b/internal/model/application_status.go @@ -1,82 +1,73 @@ -//go:generate go tool mockgen -source=$GOFILE -destination=mock_$GOPACKAGE/mock_$GOFILE -package=mock_$GOPACKAGE package model import ( "context" - "encoding/json" "fmt" "time" "github.com/google/uuid" + "github.com/traPtitech/Jomon/internal/ent" + "github.com/traPtitech/Jomon/internal/ent/applicationstatus" + "github.com/traPtitech/Jomon/internal/service" ) -type Status int - -const ( - _ Status = iota - Submitted - FixRequired - Accepted - Completed - Rejected -) - -func (s Status) String() string { - switch s { - case Submitted: - return "submitted" - case FixRequired: - return "fix_required" - case Accepted: - return "accepted" - case Completed: - return "completed" - case Rejected: - return "rejected" - default: - return "" +func (repo *EntRepository) CreateStatus( + ctx context.Context, applicationID uuid.UUID, userID uuid.UUID, status service.Status, +) (*service.ApplicationStatus, error) { + errorConverter := &entErrorConverter{ + msgBadInput: "failed to create application status due to invalid input", + msgNotFound: "application status not found", } + c, err := repo.client.ApplicationStatus. + Create(). + SetStatus(applicationstatus.Status(status.String())). + SetCreatedAt(time.Now()). + SetApplicationID(applicationID). + SetUserID(userID). + Save(ctx) + if err != nil { + return nil, errorConverter.convert(err) + } + created, err := repo.client.ApplicationStatus. + Query(). + Where(applicationstatus.ID(c.ID)). + WithUser(). + Only(ctx) + if err != nil { + return nil, errorConverter.convert(err) + } + return convertEntApplicationStatusToModelApplicationStatus(created), nil } -// dbにstringいれる今の実装だとMarshalJson入らなそう。 -func (s Status) MarshalJSON() ([]byte, error) { - return json.Marshal(s.String()) -} - -func (s *Status) UnmarshalJSON(data []byte) error { - var str string - if err := json.Unmarshal(data, &str); err != nil { - return fmt.Errorf("data should be a string, got %s", data) +func convertEntApplicationStatusToModelApplicationStatus( + applicationStatus *ent.ApplicationStatus, +) *service.ApplicationStatus { + if applicationStatus == nil { + return nil + } + return &service.ApplicationStatus{ + ID: applicationStatus.ID, + CreatedBy: applicationStatus.Edges.User.ID, + Status: convertEntApplicationStatusToModelStatus(&applicationStatus.Status), + CreatedAt: applicationStatus.CreatedAt, } +} - var st Status - switch str { +func convertEntApplicationStatusToModelStatus(entStatus *applicationstatus.Status) service.Status { + var status service.Status + switch entStatus.String() { case "submitted": - st = Submitted + status = service.Submitted case "fix_required": - st = FixRequired + status = service.FixRequired case "accepted": - st = Accepted + status = service.Accepted case "completed": - st = Completed + status = service.Completed case "rejected": - st = Rejected + status = service.Rejected default: - return fmt.Errorf("invalid Status %s", str) + panic(fmt.Sprintf("unknown application status: %s", entStatus.String())) } - *s = st - return nil -} - -type ApplicationStatusRepository interface { - CreateStatus( - ctx context.Context, applicationID uuid.UUID, userID uuid.UUID, status Status, - ) (*ApplicationStatus, error) -} - -type ApplicationStatus struct { - ID uuid.UUID - CreatedBy uuid.UUID - Status Status - CreatedAt time.Time + return status } diff --git a/internal/model/application_status_impl.go b/internal/model/application_status_impl.go deleted file mode 100644 index 24528ed7..00000000 --- a/internal/model/application_status_impl.go +++ /dev/null @@ -1,69 +0,0 @@ -package model - -import ( - "context" - "time" - - "github.com/google/uuid" - "github.com/traPtitech/Jomon/internal/ent" - "github.com/traPtitech/Jomon/internal/ent/applicationstatus" -) - -func (repo *EntRepository) CreateStatus( - ctx context.Context, applicationID uuid.UUID, userID uuid.UUID, status Status, -) (*ApplicationStatus, error) { - errorConverter := &entErrorConverter{ - msgBadInput: "failed to create application status due to invalid input", - msgNotFound: "application status not found", - } - c, err := repo.client.ApplicationStatus. - Create(). - SetStatus(applicationstatus.Status(status.String())). - SetCreatedAt(time.Now()). - SetApplicationID(applicationID). - SetUserID(userID). - Save(ctx) - if err != nil { - return nil, errorConverter.convert(err) - } - created, err := repo.client.ApplicationStatus. - Query(). - Where(applicationstatus.ID(c.ID)). - WithUser(). - Only(ctx) - if err != nil { - return nil, errorConverter.convert(err) - } - return convertEntApplicationStatusToModelApplicationStatus(created), nil -} - -func convertEntApplicationStatusToModelApplicationStatus( - applicationStatus *ent.ApplicationStatus, -) *ApplicationStatus { - if applicationStatus == nil { - return nil - } - return &ApplicationStatus{ - ID: applicationStatus.ID, - CreatedBy: applicationStatus.Edges.User.ID, - Status: convertEntApplicationStatusToModelStatus(&applicationStatus.Status), - CreatedAt: applicationStatus.CreatedAt, - } -} - -func convertEntApplicationStatusToModelStatus(entStatus *applicationstatus.Status) Status { - var status Status - switch entStatus.String() { - case "submitted": - status = Submitted - case "fix_required": - status = FixRequired - case "accepted": - status = Accepted - case "completed": - status = Completed - case "rejected": - status = Rejected - } - return status -} diff --git a/internal/model/application_status_impl_test.go b/internal/model/application_status_test.go similarity index 87% rename from internal/model/application_status_impl_test.go rename to internal/model/application_status_test.go index b85a6536..2448434a 100644 --- a/internal/model/application_status_impl_test.go +++ b/internal/model/application_status_test.go @@ -7,6 +7,7 @@ import ( "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" "github.com/stretchr/testify/require" + "github.com/traPtitech/Jomon/internal/service" "github.com/traPtitech/Jomon/internal/testutil" "github.com/traPtitech/Jomon/internal/testutil/random" ) @@ -33,13 +34,13 @@ func TestEntRepository_CreateStatus(t *testing.T) { user.ID) require.NoError(t, err) - status := Status(random.Numeric(t, 5) + 1) + status := service.Status(random.Numeric(t, 5) + 1) created, err := repo.CreateStatus(ctx, application.ID, user.ID, status) require.NoError(t, err) opts := testutil.ApproxEqualOptions() opts = append(opts, - cmpopts.IgnoreFields(ApplicationStatus{}, "ID")) - exp := &ApplicationStatus{ + cmpopts.IgnoreFields(service.ApplicationStatus{}, "ID")) + exp := &service.ApplicationStatus{ CreatedBy: user.ID, Status: status, CreatedAt: time.Now(), @@ -63,7 +64,7 @@ func TestEntRepository_CreateStatus(t *testing.T) { user.ID) require.NoError(t, err) - invalidStatus := Status(6) + invalidStatus := service.Status(6) _, err = repo.CreateStatus(ctx, application.ID, user.ID, invalidStatus) require.Error(t, err) }) @@ -77,7 +78,7 @@ func TestEntRepository_CreateStatus(t *testing.T) { true) require.NoError(t, err) - status := Status(random.Numeric(t, 5) + 1) + status := service.Status(random.Numeric(t, 5) + 1) _, err = repo.CreateStatus(ctx, uuid.New(), user.ID, status) require.Error(t, err) }) @@ -98,7 +99,7 @@ func TestEntRepository_CreateStatus(t *testing.T) { user.ID) require.NoError(t, err) - status := Status(random.Numeric(t, 5) + 1) + status := service.Status(random.Numeric(t, 5) + 1) _, err = repo.CreateStatus(ctx, application.ID, uuid.New(), status) require.Error(t, err) }) diff --git a/internal/model/application_target.go b/internal/model/application_target.go index ba6fa032..6e5a98a1 100644 --- a/internal/model/application_target.go +++ b/internal/model/application_target.go @@ -1,29 +1,100 @@ -//go:generate go tool mockgen -source=$GOFILE -destination=mock_$GOPACKAGE/mock_$GOFILE -package=mock_$GOPACKAGE package model import ( "context" - "time" "github.com/google/uuid" + "github.com/samber/lo" + "github.com/traPtitech/Jomon/internal/ent" + "github.com/traPtitech/Jomon/internal/ent/application" + "github.com/traPtitech/Jomon/internal/ent/applicationtarget" + "github.com/traPtitech/Jomon/internal/nulltime" + "github.com/traPtitech/Jomon/internal/service" ) -type ApplicationTargetRepository interface { - GetApplicationTargets( - ctx context.Context, - applicationID uuid.UUID, - ) ([]*ApplicationTargetDetail, error) +func (repo *EntRepository) GetApplicationTargets( + ctx context.Context, applicationID uuid.UUID, +) ([]*service.ApplicationTargetDetail, error) { + errorConverter := &entErrorConverter{ + msgBadInput: "failed to get application targets due to invalid input", + msgNotFound: "application targets not found", + } + // Querying + ts, err := repo.client.ApplicationTarget. + Query(). + Where( + applicationtarget.HasApplicationWith( + application.IDEQ(applicationID), + ), + ). + WithUser(). + All(ctx) + if err != nil { + return nil, errorConverter.convert(err) + } + targets := lo.Map(ts, func(t *ent.ApplicationTarget, _ int) *service.ApplicationTargetDetail { + return ConvertEntApplicationTargetToModelApplicationTargetDetail(t) + }) + return targets, nil } -type ApplicationTargetDetail struct { - ID uuid.UUID - Target uuid.UUID - Amount int - PaidAt time.Time - CreatedAt time.Time +func (repo *EntRepository) createApplicationTargets( + ctx context.Context, tx *ent.Tx, applicationID uuid.UUID, targets []*service.ApplicationTarget, +) ([]*service.ApplicationTargetDetail, error) { + bulk := lo.Map(targets, func(t *service.ApplicationTarget, _ int) *ent.ApplicationTargetCreate { + return tx.Client().ApplicationTarget. + Create(). + SetAmount(t.Amount). + SetApplicationID(applicationID). + SetUserID(t.Target) + }) + cs, err := tx.Client().ApplicationTarget.CreateBulk(bulk...). + Save(ctx) + if err != nil { + return nil, err + } + ids := lo.Map(cs, func(c *ent.ApplicationTarget, _ int) uuid.UUID { + return c.ID + }) + created, err := tx.Client().ApplicationTarget. + Query(). + Where( + applicationtarget.IDIn(ids...), + ). + WithUser(). + All(ctx) + if err != nil { + return nil, err + } + // []*ent.ApplicationTarget to []*ApplicationTargetDetail + ts := lo.Map(created, func(t *ent.ApplicationTarget, _ int) *service.ApplicationTargetDetail { + return ConvertEntApplicationTargetToModelApplicationTargetDetail(t) + }) + return ts, nil } -type ApplicationTarget struct { - Target uuid.UUID - Amount int +func (repo *EntRepository) deleteApplicationTargets( + ctx context.Context, tx *ent.Tx, applicationID uuid.UUID, +) error { + _, err := tx.Client().ApplicationTarget. + Delete(). + Where( + applicationtarget.HasApplicationWith( + application.IDEQ(applicationID), + ), + ). + Exec(ctx) + return err +} + +func ConvertEntApplicationTargetToModelApplicationTargetDetail( + t *ent.ApplicationTarget, +) *service.ApplicationTargetDetail { + return &service.ApplicationTargetDetail{ + ID: t.ID, + Target: t.Edges.User.ID, + Amount: t.Amount, + PaidAt: nulltime.FromTime(t.PaidAt), + CreatedAt: t.CreatedAt, + } } diff --git a/internal/model/application_target_impl.go b/internal/model/application_target_impl.go deleted file mode 100644 index f529088e..00000000 --- a/internal/model/application_target_impl.go +++ /dev/null @@ -1,104 +0,0 @@ -package model - -import ( - "context" - "time" - - "github.com/google/uuid" - "github.com/samber/lo" - "github.com/traPtitech/Jomon/internal/ent" - "github.com/traPtitech/Jomon/internal/ent/application" - "github.com/traPtitech/Jomon/internal/ent/applicationtarget" -) - -func (repo *EntRepository) GetApplicationTargets( - ctx context.Context, applicationID uuid.UUID, -) ([]*ApplicationTargetDetail, error) { - errorConverter := &entErrorConverter{ - msgBadInput: "failed to get application targets due to invalid input", - msgNotFound: "application targets not found", - } - // Querying - ts, err := repo.client.ApplicationTarget. - Query(). - Where( - applicationtarget.HasApplicationWith( - application.IDEQ(applicationID), - ), - ). - WithUser(). - All(ctx) - if err != nil { - return nil, errorConverter.convert(err) - } - targets := lo.Map(ts, func(t *ent.ApplicationTarget, _ int) *ApplicationTargetDetail { - return ConvertEntApplicationTargetToModelApplicationTargetDetail(t) - }) - return targets, nil -} - -func (repo *EntRepository) createApplicationTargets( - ctx context.Context, tx *ent.Tx, applicationID uuid.UUID, targets []*ApplicationTarget, -) ([]*ApplicationTargetDetail, error) { - bulk := lo.Map(targets, func(t *ApplicationTarget, _ int) *ent.ApplicationTargetCreate { - return tx.Client().ApplicationTarget. - Create(). - SetAmount(t.Amount). - SetApplicationID(applicationID). - SetUserID(t.Target) - }) - cs, err := tx.Client().ApplicationTarget.CreateBulk(bulk...). - Save(ctx) - if err != nil { - return nil, err - } - ids := lo.Map(cs, func(c *ent.ApplicationTarget, _ int) uuid.UUID { - return c.ID - }) - created, err := tx.Client().ApplicationTarget. - Query(). - Where( - applicationtarget.IDIn(ids...), - ). - WithUser(). - All(ctx) - if err != nil { - return nil, err - } - // []*ent.ApplicationTarget to []*ApplicationTargetDetail - ts := lo.Map(created, func(t *ent.ApplicationTarget, _ int) *ApplicationTargetDetail { - return ConvertEntApplicationTargetToModelApplicationTargetDetail(t) - }) - return ts, nil -} - -func (repo *EntRepository) deleteApplicationTargets( - ctx context.Context, tx *ent.Tx, applicationID uuid.UUID, -) error { - _, err := tx.Client().ApplicationTarget. - Delete(). - Where( - applicationtarget.HasApplicationWith( - application.IDEQ(applicationID), - ), - ). - Exec(ctx) - return err -} - -func ConvertEntApplicationTargetToModelApplicationTargetDetail( - t *ent.ApplicationTarget, -) *ApplicationTargetDetail { - paidAt := time.Time{} - if t.PaidAt != nil { - paidAt = *t.PaidAt - } - - return &ApplicationTargetDetail{ - ID: t.ID, - Target: t.Edges.User.ID, - Amount: t.Amount, - PaidAt: paidAt, - CreatedAt: t.CreatedAt, - } -} diff --git a/internal/model/application_target_impl_test.go b/internal/model/application_target_test.go similarity index 84% rename from internal/model/application_target_impl_test.go rename to internal/model/application_target_test.go index a0eacc22..3068f972 100644 --- a/internal/model/application_target_impl_test.go +++ b/internal/model/application_target_test.go @@ -6,6 +6,7 @@ import ( "github.com/google/go-cmp/cmp/cmpopts" "github.com/stretchr/testify/require" + "github.com/traPtitech/Jomon/internal/service" "github.com/traPtitech/Jomon/internal/testutil" "github.com/traPtitech/Jomon/internal/testutil/random" ) @@ -33,11 +34,11 @@ func TestEntRepository_GetApplicationTargets(t *testing.T) { random.AlphaNumeric(t, 30), true) require.NoError(t, err) - target1 := &ApplicationTarget{ + target1 := &service.ApplicationTarget{ Target: user1.ID, Amount: random.Numeric(t, 100000), } - target2 := &ApplicationTarget{ + target2 := &service.ApplicationTarget{ Target: user2.ID, Amount: random.Numeric(t, 100000), } @@ -46,11 +47,11 @@ func TestEntRepository_GetApplicationTargets(t *testing.T) { ctx, random.AlphaNumeric(t, 40), random.AlphaNumeric(t, 40), - nil, []*ApplicationTarget{target1, target2}, + nil, []*service.ApplicationTarget{target1, target2}, user1.ID) require.NoError(t, err) // CreatedAt の差を1秒以内に収めるためにここで time.Now を取る - exp := []*ApplicationTargetDetail{ + exp := []*service.ApplicationTargetDetail{ {Target: target1.Target, Amount: target1.Amount, CreatedAt: time.Now()}, {Target: target2.Target, Amount: target2.Amount, CreatedAt: time.Now()}, } @@ -58,8 +59,8 @@ func TestEntRepository_GetApplicationTargets(t *testing.T) { require.NoError(t, err) opts := testutil.ApproxEqualOptions() opts = append(opts, - cmpopts.IgnoreFields(ApplicationTargetDetail{}, "ID", "PaidAt"), - cmpopts.SortSlices(func(l, r *ApplicationTargetDetail) bool { + cmpopts.IgnoreFields(service.ApplicationTargetDetail{}, "ID", "PaidAt"), + cmpopts.SortSlices(func(l, r *service.ApplicationTargetDetail) bool { return l.Target.ID() < r.Target.ID() })) testutil.RequireEqual(t, exp, got, opts...) @@ -107,11 +108,11 @@ func TestEntRepository_createApplicationTargets(t *testing.T) { random.AlphaNumeric(t, 30), true) require.NoError(t, err) - target1 := &ApplicationTarget{ + target1 := &service.ApplicationTarget{ Target: user1.ID, Amount: random.Numeric(t, 100000), } - target2 := &ApplicationTarget{ + target2 := &service.ApplicationTarget{ Target: user2.ID, Amount: random.Numeric(t, 100000), } @@ -120,17 +121,17 @@ func TestEntRepository_createApplicationTargets(t *testing.T) { ctx, random.AlphaNumeric(t, 40), random.AlphaNumeric(t, 40), - nil, []*ApplicationTarget{target1, target2}, + nil, []*service.ApplicationTarget{target1, target2}, user1.ID) require.NoError(t, err) - exp := []*ApplicationTargetDetail{ + exp := []*service.ApplicationTargetDetail{ {Target: target1.Target, Amount: target1.Amount, CreatedAt: time.Now()}, {Target: target2.Target, Amount: target2.Amount, CreatedAt: time.Now()}, } opts := testutil.ApproxEqualOptions() opts = append(opts, - cmpopts.IgnoreFields(ApplicationTargetDetail{}, "ID", "PaidAt"), - cmpopts.SortSlices(func(l, r *ApplicationTargetDetail) bool { + cmpopts.IgnoreFields(service.ApplicationTargetDetail{}, "ID", "PaidAt"), + cmpopts.SortSlices(func(l, r *service.ApplicationTargetDetail) bool { return l.Target.ID() < r.Target.ID() })) testutil.RequireEqual(t, exp, got.Targets, opts...) @@ -160,11 +161,11 @@ func TestEntRepository_deleteApplicationTargets(t *testing.T) { random.AlphaNumeric(t, 30), true) require.NoError(t, err) - target1 := &ApplicationTarget{ + target1 := &service.ApplicationTarget{ Target: user1.ID, Amount: random.Numeric(t, 100000), } - target2 := &ApplicationTarget{ + target2 := &service.ApplicationTarget{ Target: user2.ID, Amount: random.Numeric(t, 100000), } @@ -173,7 +174,7 @@ func TestEntRepository_deleteApplicationTargets(t *testing.T) { ctx, random.AlphaNumeric(t, 40), random.AlphaNumeric(t, 40), - nil, []*ApplicationTarget{target1, target2}, + nil, []*service.ApplicationTarget{target1, target2}, user1.ID) require.NoError(t, err) _, err = repo.UpdateApplication( @@ -181,7 +182,7 @@ func TestEntRepository_deleteApplicationTargets(t *testing.T) { application.ID, random.AlphaNumeric(t, 40), random.AlphaNumeric(t, 40), - nil, []*ApplicationTarget{}) + nil, []*service.ApplicationTarget{}) require.NoError(t, err) got, err := repo.GetApplicationTargets(ctx, application.ID) require.NoError(t, err) @@ -202,11 +203,11 @@ func TestEntRepository_deleteApplicationTargets(t *testing.T) { random.AlphaNumeric(t, 30), true) require.NoError(t, err) - target1 := &ApplicationTarget{ + target1 := &service.ApplicationTarget{ Target: user1.ID, Amount: random.Numeric(t, 100000), } - target2 := &ApplicationTarget{ + target2 := &service.ApplicationTarget{ Target: user2.ID, Amount: random.Numeric(t, 100000), } @@ -223,7 +224,7 @@ func TestEntRepository_deleteApplicationTargets(t *testing.T) { application.ID, random.AlphaNumeric(t, 40), random.AlphaNumeric(t, 40), - nil, []*ApplicationTarget{target1, target2}) + nil, []*service.ApplicationTarget{target1, target2}) require.NoError(t, err) got, err := repo2.GetApplicationTargets(ctx, application.ID) require.NoError(t, err) diff --git a/internal/model/application_impl_test.go b/internal/model/application_test.go similarity index 77% rename from internal/model/application_impl_test.go rename to internal/model/application_test.go index bd0c79be..ae18e69c 100644 --- a/internal/model/application_impl_test.go +++ b/internal/model/application_test.go @@ -8,13 +8,16 @@ import ( "github.com/google/uuid" "github.com/stretchr/testify/require" "github.com/traPtitech/Jomon/internal/nulltime" + "github.com/traPtitech/Jomon/internal/service" "github.com/traPtitech/Jomon/internal/testutil" "github.com/traPtitech/Jomon/internal/testutil/random" ) -func (rd *ApplicationDetail) toExpectedApplicationResponse(t *testing.T) *ApplicationResponse { +func toExpectedApplicationResponse( + t *testing.T, rd *service.ApplicationDetail, +) *service.ApplicationResponse { t.Helper() - return &ApplicationResponse{ + return &service.ApplicationResponse{ ID: rd.ID, Status: rd.Status, CreatedAt: rd.CreatedAt, @@ -75,7 +78,7 @@ func TestEntRepository_GetApplications(t *testing.T) { require.NoError(t, err) tag, err := repo.CreateTag(ctx, random.AlphaNumeric(t, 20)) require.NoError(t, err) - target := &ApplicationTarget{ + target := &service.ApplicationTarget{ Target: user1.ID, Amount: random.Numeric(t, 10000), } @@ -84,8 +87,8 @@ func TestEntRepository_GetApplications(t *testing.T) { ctx, random.AlphaNumeric(t, 40), random.AlphaNumeric(t, 100), - []*Tag{tag}, - []*ApplicationTarget{target}, + []*service.Tag{tag}, + []*service.ApplicationTarget{target}, user1.ID) require.NoError(t, err) time.Sleep(1 * time.Second) @@ -93,25 +96,25 @@ func TestEntRepository_GetApplications(t *testing.T) { ctx, random.AlphaNumeric(t, 40), random.AlphaNumeric(t, 100), - []*Tag{tag}, - []*ApplicationTarget{target}, + []*service.Tag{tag}, + []*service.ApplicationTarget{target}, user2.ID) require.NoError(t, err) sort := "created_at" - got, err := repo.GetApplications(ctx, ApplicationQuery{ + got, err := repo.GetApplications(ctx, service.ApplicationQuery{ Sort: &sort, }) require.NoError(t, err) opts := testutil.ApproxEqualOptions() opts = append(opts, - cmpopts.SortSlices(func(a, b *ApplicationResponse) bool { + cmpopts.SortSlices(func(a, b *service.ApplicationResponse) bool { return a.ID.ID() < b.ID.ID() })) - exp := []*ApplicationResponse{ - application1.toExpectedApplicationResponse(t), - application2.toExpectedApplicationResponse(t), + exp := []*service.ApplicationResponse{ + toExpectedApplicationResponse(t, application1), + toExpectedApplicationResponse(t, application2), } testutil.RequireEqual(t, exp, got, opts...) }) @@ -133,7 +136,7 @@ func TestEntRepository_GetApplications(t *testing.T) { require.NoError(t, err) tag, err := repo2.CreateTag(ctx, random.AlphaNumeric(t, 20)) require.NoError(t, err) - target := &ApplicationTarget{ + target := &service.ApplicationTarget{ Target: user1.ID, Amount: random.Numeric(t, 10000), } @@ -142,8 +145,8 @@ func TestEntRepository_GetApplications(t *testing.T) { ctx, random.AlphaNumeric(t, 40), random.AlphaNumeric(t, 100), - []*Tag{tag}, - []*ApplicationTarget{target}, + []*service.Tag{tag}, + []*service.ApplicationTarget{target}, user1.ID) require.NoError(t, err) time.Sleep(1 * time.Second) @@ -151,25 +154,25 @@ func TestEntRepository_GetApplications(t *testing.T) { ctx, random.AlphaNumeric(t, 40), random.AlphaNumeric(t, 100), - []*Tag{tag}, - []*ApplicationTarget{target}, + []*service.Tag{tag}, + []*service.ApplicationTarget{target}, user2.ID) require.NoError(t, err) sort := "-created_at" - got, err := repo2.GetApplications(ctx, ApplicationQuery{ + got, err := repo2.GetApplications(ctx, service.ApplicationQuery{ Sort: &sort, }) require.NoError(t, err) opts := testutil.ApproxEqualOptions() opts = append(opts, - cmpopts.SortSlices(func(a, b *ApplicationResponse) bool { + cmpopts.SortSlices(func(a, b *service.ApplicationResponse) bool { return a.ID.ID() < b.ID.ID() })) - exp := []*ApplicationResponse{ - application1.toExpectedApplicationResponse(t), - application2.toExpectedApplicationResponse(t), + exp := []*service.ApplicationResponse{ + toExpectedApplicationResponse(t, application1), + toExpectedApplicationResponse(t, application2), } testutil.RequireEqual(t, exp, got, opts...) }) @@ -191,7 +194,7 @@ func TestEntRepository_GetApplications(t *testing.T) { require.NoError(t, err) tag, err := repo3.CreateTag(ctx, random.AlphaNumeric(t, 20)) require.NoError(t, err) - target := &ApplicationTarget{ + target := &service.ApplicationTarget{ Target: user1.ID, Amount: random.Numeric(t, 10000), } @@ -200,33 +203,33 @@ func TestEntRepository_GetApplications(t *testing.T) { ctx, "b", random.AlphaNumeric(t, 100), - []*Tag{tag}, - []*ApplicationTarget{target}, + []*service.Tag{tag}, + []*service.ApplicationTarget{target}, user1.ID) require.NoError(t, err) application2, err := repo3.CreateApplication( ctx, "a", random.AlphaNumeric(t, 100), - []*Tag{tag}, - []*ApplicationTarget{target}, + []*service.Tag{tag}, + []*service.ApplicationTarget{target}, user2.ID) require.NoError(t, err) sort := "title" - got, err := repo3.GetApplications(ctx, ApplicationQuery{ + got, err := repo3.GetApplications(ctx, service.ApplicationQuery{ Sort: &sort, }) require.NoError(t, err) opts := testutil.ApproxEqualOptions() opts = append(opts, - cmpopts.SortSlices(func(a, b *ApplicationResponse) bool { + cmpopts.SortSlices(func(a, b *service.ApplicationResponse) bool { return a.ID.ID() < b.ID.ID() })) - exp := []*ApplicationResponse{ - application2.toExpectedApplicationResponse(t), - application1.toExpectedApplicationResponse(t), + exp := []*service.ApplicationResponse{ + toExpectedApplicationResponse(t, application2), + toExpectedApplicationResponse(t, application1), } testutil.RequireEqual(t, exp, got, opts...) }) @@ -248,7 +251,7 @@ func TestEntRepository_GetApplications(t *testing.T) { require.NoError(t, err) tag, err := repo4.CreateTag(ctx, random.AlphaNumeric(t, 20)) require.NoError(t, err) - target := &ApplicationTarget{ + target := &service.ApplicationTarget{ Target: user1.ID, Amount: random.Numeric(t, 10000), } @@ -257,33 +260,33 @@ func TestEntRepository_GetApplications(t *testing.T) { ctx, "b", random.AlphaNumeric(t, 100), - []*Tag{tag}, - []*ApplicationTarget{target}, + []*service.Tag{tag}, + []*service.ApplicationTarget{target}, user1.ID) require.NoError(t, err) application2, err := repo4.CreateApplication( ctx, "a", random.AlphaNumeric(t, 100), - []*Tag{tag}, - []*ApplicationTarget{target}, + []*service.Tag{tag}, + []*service.ApplicationTarget{target}, user2.ID) require.NoError(t, err) sort := "-title" - got, err := repo4.GetApplications(ctx, ApplicationQuery{ + got, err := repo4.GetApplications(ctx, service.ApplicationQuery{ Sort: &sort, }) require.NoError(t, err) opts := testutil.ApproxEqualOptions() opts = append(opts, - cmpopts.SortSlices(func(a, b *ApplicationResponse) bool { + cmpopts.SortSlices(func(a, b *service.ApplicationResponse) bool { return a.ID.ID() < b.ID.ID() })) - exp := []*ApplicationResponse{ - application1.toExpectedApplicationResponse(t), - application2.toExpectedApplicationResponse(t), + exp := []*service.ApplicationResponse{ + toExpectedApplicationResponse(t, application1), + toExpectedApplicationResponse(t, application2), } testutil.RequireEqual(t, exp, got, opts...) }) @@ -305,11 +308,11 @@ func TestEntRepository_GetApplications(t *testing.T) { require.NoError(t, err) tag, err := repo5.CreateTag(ctx, random.AlphaNumeric(t, 20)) require.NoError(t, err) - target1 := &ApplicationTarget{ + target1 := &service.ApplicationTarget{ Target: user1.ID, Amount: random.Numeric(t, 10000), } - target2 := &ApplicationTarget{ + target2 := &service.ApplicationTarget{ Target: user2.ID, Amount: random.Numeric(t, 10000), } @@ -318,26 +321,26 @@ func TestEntRepository_GetApplications(t *testing.T) { ctx, "b", random.AlphaNumeric(t, 100), - []*Tag{tag}, - []*ApplicationTarget{target1}, + []*service.Tag{tag}, + []*service.ApplicationTarget{target1}, user1.ID) require.NoError(t, err) _, err = repo5.CreateApplication( ctx, "a", random.AlphaNumeric(t, 100), - []*Tag{tag}, - []*ApplicationTarget{target2}, + []*service.Tag{tag}, + []*service.ApplicationTarget{target2}, user2.ID) require.NoError(t, err) target := target1.Target - got, err := repo5.GetApplications(ctx, ApplicationQuery{ + got, err := repo5.GetApplications(ctx, service.ApplicationQuery{ Target: target, }) require.NoError(t, err) require.Len(t, got, 1) - exp := application1.toExpectedApplicationResponse(t) + exp := toExpectedApplicationResponse(t, application1) opts := testutil.ApproxEqualOptions() testutil.RequireEqual(t, exp, got[0], opts...) }) @@ -359,7 +362,7 @@ func TestEntRepository_GetApplications(t *testing.T) { require.NoError(t, err) tag, err := repo6.CreateTag(ctx, random.AlphaNumeric(t, 20)) require.NoError(t, err) - target := &ApplicationTarget{ + target := &service.ApplicationTarget{ Target: user1.ID, Amount: random.Numeric(t, 10000), } @@ -368,8 +371,8 @@ func TestEntRepository_GetApplications(t *testing.T) { ctx, "b", random.AlphaNumeric(t, 100), - []*Tag{tag}, - []*ApplicationTarget{target}, + []*service.Tag{tag}, + []*service.ApplicationTarget{target}, user1.ID) require.NoError(t, err) time.Sleep(1 * time.Second) @@ -377,18 +380,18 @@ func TestEntRepository_GetApplications(t *testing.T) { ctx, "a", random.AlphaNumeric(t, 100), - []*Tag{tag}, - []*ApplicationTarget{target}, + []*service.Tag{tag}, + []*service.ApplicationTarget{target}, user2.ID) require.NoError(t, err) since := application1.CreatedAt.Add(10 * time.Millisecond) - got, err := repo6.GetApplications(ctx, ApplicationQuery{ + got, err := repo6.GetApplications(ctx, service.ApplicationQuery{ Since: nulltime.FromTime(&since), }) require.NoError(t, err) require.Len(t, got, 1) - exp := application2.toExpectedApplicationResponse(t) + exp := toExpectedApplicationResponse(t, application2) opts := testutil.ApproxEqualOptions() testutil.RequireEqual(t, exp, got[0], opts...) }) @@ -410,7 +413,7 @@ func TestEntRepository_GetApplications(t *testing.T) { require.NoError(t, err) tag, err := repo7.CreateTag(ctx, random.AlphaNumeric(t, 20)) require.NoError(t, err) - target := &ApplicationTarget{ + target := &service.ApplicationTarget{ Target: user1.ID, Amount: random.Numeric(t, 10000), } @@ -419,8 +422,8 @@ func TestEntRepository_GetApplications(t *testing.T) { ctx, "b", random.AlphaNumeric(t, 100), - []*Tag{tag}, - []*ApplicationTarget{target}, + []*service.Tag{tag}, + []*service.ApplicationTarget{target}, user1.ID) require.NoError(t, err) time.Sleep(2 * time.Second) @@ -428,18 +431,18 @@ func TestEntRepository_GetApplications(t *testing.T) { ctx, "a", random.AlphaNumeric(t, 100), - []*Tag{tag}, - []*ApplicationTarget{target}, + []*service.Tag{tag}, + []*service.ApplicationTarget{target}, user2.ID) require.NoError(t, err) until := application2.CreatedAt.Add(-1 * time.Second) - got, err := repo7.GetApplications(ctx, ApplicationQuery{ + got, err := repo7.GetApplications(ctx, service.ApplicationQuery{ Until: nulltime.FromTime(&until), }) require.NoError(t, err) require.Len(t, got, 1) - exp := application1.toExpectedApplicationResponse(t) + exp := toExpectedApplicationResponse(t, application1) opts := testutil.ApproxEqualOptions() testutil.RequireEqual(t, exp, got[0], opts...) }) @@ -461,7 +464,7 @@ func TestEntRepository_GetApplications(t *testing.T) { require.NoError(t, err) tag, err := repo8.CreateTag(ctx, random.AlphaNumeric(t, 20)) require.NoError(t, err) - target := &ApplicationTarget{ + target := &service.ApplicationTarget{ Target: user1.ID, Amount: random.Numeric(t, 10000), } @@ -470,8 +473,8 @@ func TestEntRepository_GetApplications(t *testing.T) { ctx, "b", random.AlphaNumeric(t, 100), - []*Tag{tag}, - []*ApplicationTarget{target}, + []*service.Tag{tag}, + []*service.ApplicationTarget{target}, user1.ID) require.NoError(t, err) time.Sleep(2 * time.Second) @@ -479,24 +482,24 @@ func TestEntRepository_GetApplications(t *testing.T) { ctx, "a", random.AlphaNumeric(t, 100), - []*Tag{tag}, - []*ApplicationTarget{target}, + []*service.Tag{tag}, + []*service.ApplicationTarget{target}, user2.ID) require.NoError(t, err) time.Sleep(1 * time.Second) status := "accepted" - _, err = repo8.CreateStatus(ctx, application1.ID, user1.ID, Accepted) + _, err = repo8.CreateStatus(ctx, application1.ID, user1.ID, service.Accepted) require.NoError(t, err) - got, err := repo8.GetApplications(ctx, ApplicationQuery{ + got, err := repo8.GetApplications(ctx, service.ApplicationQuery{ Status: &status, }) require.NoError(t, err) require.Len(t, got, 1) - exp := application1.toExpectedApplicationResponse(t) - exp.Status = Accepted + exp := toExpectedApplicationResponse(t, application1) + exp.Status = service.Accepted opts := testutil.ApproxEqualOptions() testutil.RequireEqual(t, exp, got[0], opts...) }) @@ -516,7 +519,7 @@ func TestEntRepository_GetApplications(t *testing.T) { random.AlphaNumeric(t, 30), true) require.NoError(t, err) - target := &ApplicationTarget{ + target := &service.ApplicationTarget{ Target: user1.ID, Amount: random.Numeric(t, 10000), } @@ -525,25 +528,25 @@ func TestEntRepository_GetApplications(t *testing.T) { ctx, random.AlphaNumeric(t, 40), random.AlphaNumeric(t, 100), - []*Tag{}, - []*ApplicationTarget{target}, + []*service.Tag{}, + []*service.ApplicationTarget{target}, user1.ID) require.NoError(t, err) _, err = repo9.CreateApplication( ctx, random.AlphaNumeric(t, 40), random.AlphaNumeric(t, 100), - []*Tag{}, - []*ApplicationTarget{target}, + []*service.Tag{}, + []*service.ApplicationTarget{target}, user2.ID) require.NoError(t, err) - got, err := repo9.GetApplications(ctx, ApplicationQuery{ + got, err := repo9.GetApplications(ctx, service.ApplicationQuery{ CreatedBy: user1.ID, }) require.NoError(t, err) require.Len(t, got, 1) - exp := application1.toExpectedApplicationResponse(t) + exp := toExpectedApplicationResponse(t, application1) opts := testutil.ApproxEqualOptions() testutil.RequireEqual(t, exp, got[0], opts...) }) @@ -574,7 +577,7 @@ func TestEntRepository_CreateApplication(t *testing.T) { require.NoError(t, err) tag, err := repo.CreateTag(ctx, random.AlphaNumeric(t, 20)) require.NoError(t, err) - target := &ApplicationTarget{ + target := &service.ApplicationTarget{ Target: user.ID, Amount: random.Numeric(t, 10000), } @@ -582,21 +585,21 @@ func TestEntRepository_CreateApplication(t *testing.T) { application, err := repo.CreateApplication( ctx, title, content, - []*Tag{tag}, []*ApplicationTarget{target}, + []*service.Tag{tag}, []*service.ApplicationTarget{target}, user.ID) require.NoError(t, err) - exp := &ApplicationDetail{ - Status: Submitted, + exp := &service.ApplicationDetail{ + Status: service.Submitted, Title: title, Content: content, - Tags: []*Tag{tag}, - Targets: []*ApplicationTargetDetail{{ + Tags: []*service.Tag{tag}, + Targets: []*service.ApplicationTargetDetail{{ Target: target.Target, Amount: target.Amount, }}, - Statuses: []*ApplicationStatus{{ + Statuses: []*service.ApplicationStatus{{ CreatedBy: user.ID, - Status: Submitted, + Status: service.Submitted, }}, CreatedAt: time.Now(), UpdatedAt: time.Now(), @@ -604,9 +607,9 @@ func TestEntRepository_CreateApplication(t *testing.T) { } opts := testutil.ApproxEqualOptions() opts = append(opts, - cmpopts.IgnoreFields(ApplicationDetail{}, "ID"), - cmpopts.IgnoreFields(ApplicationTargetDetail{}, "ID", "PaidAt", "CreatedAt"), - cmpopts.IgnoreFields(ApplicationStatus{}, "ID", "CreatedAt")) + cmpopts.IgnoreFields(service.ApplicationDetail{}, "ID"), + cmpopts.IgnoreFields(service.ApplicationTargetDetail{}, "ID", "PaidAt", "CreatedAt"), + cmpopts.IgnoreFields(service.ApplicationStatus{}, "ID", "CreatedAt")) testutil.AssertEqual(t, exp, application, opts...) }) @@ -621,7 +624,7 @@ func TestEntRepository_CreateApplication(t *testing.T) { _, err = repo2.CreateApplication( ctx, title, content, - []*Tag{tag}, []*ApplicationTarget{}, + []*service.Tag{tag}, []*service.ApplicationTarget{}, uuid.New()) require.Error(t, err) }) @@ -639,7 +642,7 @@ func TestEntRepository_CreateApplication(t *testing.T) { require.NoError(t, err) date := time.Now() - tag := &Tag{ + tag := &service.Tag{ ID: uuid.New(), Name: random.AlphaNumeric(t, 20), CreatedAt: date, @@ -649,7 +652,7 @@ func TestEntRepository_CreateApplication(t *testing.T) { _, err = repo3.CreateApplication( ctx, title, content, - []*Tag{tag}, []*ApplicationTarget{}, + []*service.Tag{tag}, []*service.ApplicationTarget{}, user.ID) require.Error(t, err) }) @@ -675,7 +678,7 @@ func TestEntRepository_GetApplication(t *testing.T) { require.NoError(t, err) tag, err := repo.CreateTag(ctx, random.AlphaNumeric(t, 20)) require.NoError(t, err) - target := &ApplicationTarget{ + target := &service.ApplicationTarget{ Target: user.ID, Amount: random.Numeric(t, 10000), } @@ -684,7 +687,7 @@ func TestEntRepository_GetApplication(t *testing.T) { ctx, random.AlphaNumeric(t, 40), random.AlphaNumeric(t, 100), - []*Tag{tag}, []*ApplicationTarget{target}, + []*service.Tag{tag}, []*service.ApplicationTarget{target}, user.ID) require.NoError(t, err) @@ -728,7 +731,7 @@ func TestEntRepository_UpdateApplication(t *testing.T) { require.NoError(t, err) tag, err := repo.CreateTag(ctx, random.AlphaNumeric(t, 20)) require.NoError(t, err) - target := &ApplicationTarget{ + target := &service.ApplicationTarget{ Target: user.ID, Amount: random.Numeric(t, 10000), } @@ -736,11 +739,11 @@ func TestEntRepository_UpdateApplication(t *testing.T) { ctx, random.AlphaNumeric(t, 40), random.AlphaNumeric(t, 100), - []*Tag{tag}, []*ApplicationTarget{target}, + []*service.Tag{tag}, []*service.ApplicationTarget{target}, user.ID) require.NoError(t, err) // CreatedAt の差を1秒以内に収めるためにここで time.Now を取る - expTarget := &ApplicationTargetDetail{ + expTarget := &service.ApplicationTargetDetail{ Target: target.Target, Amount: target.Amount, CreatedAt: time.Now(), @@ -749,17 +752,17 @@ func TestEntRepository_UpdateApplication(t *testing.T) { updatedApplication, err := repo.UpdateApplication( ctx, application.ID, application.Title, application.Content, - []*Tag{tag}, []*ApplicationTarget{target}) + []*service.Tag{tag}, []*service.ApplicationTarget{target}) require.NoError(t, err) - exp := &ApplicationDetail{ + exp := &service.ApplicationDetail{ ID: application.ID, Status: application.Status, Title: application.Title, Content: application.Content, Comments: application.Comments, Files: application.Files, - Tags: []*Tag{tag}, - Targets: []*ApplicationTargetDetail{expTarget}, + Tags: []*service.Tag{tag}, + Targets: []*service.ApplicationTargetDetail{expTarget}, Statuses: application.Statuses, CreatedAt: application.CreatedAt, UpdatedAt: time.Now(), @@ -767,7 +770,7 @@ func TestEntRepository_UpdateApplication(t *testing.T) { } opts := testutil.ApproxEqualOptions() opts = append(opts, - cmpopts.IgnoreFields(ApplicationTargetDetail{}, "ID", "PaidAt")) + cmpopts.IgnoreFields(service.ApplicationTargetDetail{}, "ID", "PaidAt")) testutil.AssertEqual(t, exp, updatedApplication, opts...) }) @@ -782,7 +785,7 @@ func TestEntRepository_UpdateApplication(t *testing.T) { require.NoError(t, err) tag, err := repo2.CreateTag(ctx, random.AlphaNumeric(t, 20)) require.NoError(t, err) - target := &ApplicationTarget{ + target := &service.ApplicationTarget{ Target: user.ID, Amount: random.Numeric(t, 10000), } @@ -790,11 +793,11 @@ func TestEntRepository_UpdateApplication(t *testing.T) { ctx, random.AlphaNumeric(t, 40), random.AlphaNumeric(t, 100), - []*Tag{tag}, []*ApplicationTarget{target}, + []*service.Tag{tag}, []*service.ApplicationTarget{target}, user.ID) require.NoError(t, err) // CreatedAt の差を1秒以内に収めるためにここで time.Now を取る - expTarget := &ApplicationTargetDetail{ + expTarget := &service.ApplicationTargetDetail{ Target: target.Target, Amount: target.Amount, CreatedAt: time.Now(), @@ -804,17 +807,17 @@ func TestEntRepository_UpdateApplication(t *testing.T) { updatedApplication, err := repo2.UpdateApplication( ctx, application.ID, title, application.Content, - []*Tag{tag}, []*ApplicationTarget{target}) + []*service.Tag{tag}, []*service.ApplicationTarget{target}) require.NoError(t, err) - exp := &ApplicationDetail{ + exp := &service.ApplicationDetail{ ID: application.ID, Status: application.Status, Title: title, Content: application.Content, Comments: application.Comments, Files: application.Files, - Tags: []*Tag{tag}, - Targets: []*ApplicationTargetDetail{expTarget}, + Tags: []*service.Tag{tag}, + Targets: []*service.ApplicationTargetDetail{expTarget}, Statuses: application.Statuses, CreatedAt: application.CreatedAt, UpdatedAt: time.Now(), @@ -822,7 +825,7 @@ func TestEntRepository_UpdateApplication(t *testing.T) { } opts := testutil.ApproxEqualOptions() opts = append(opts, - cmpopts.IgnoreFields(ApplicationTargetDetail{}, "ID", "PaidAt")) + cmpopts.IgnoreFields(service.ApplicationTargetDetail{}, "ID", "PaidAt")) testutil.AssertEqual(t, exp, updatedApplication, opts...) }) @@ -837,7 +840,7 @@ func TestEntRepository_UpdateApplication(t *testing.T) { require.NoError(t, err) tag, err := repo3.CreateTag(ctx, random.AlphaNumeric(t, 20)) require.NoError(t, err) - target := &ApplicationTarget{ + target := &service.ApplicationTarget{ Target: user.ID, Amount: random.Numeric(t, 10000), } @@ -845,11 +848,11 @@ func TestEntRepository_UpdateApplication(t *testing.T) { ctx, random.AlphaNumeric(t, 40), random.AlphaNumeric(t, 100), - []*Tag{tag}, []*ApplicationTarget{target}, + []*service.Tag{tag}, []*service.ApplicationTarget{target}, user.ID) require.NoError(t, err) // CreatedAt の差を1秒以内に収めるためにここで time.Now を取る - expTarget := &ApplicationTargetDetail{ + expTarget := &service.ApplicationTargetDetail{ Target: target.Target, Amount: target.Amount, CreatedAt: time.Now(), @@ -858,17 +861,17 @@ func TestEntRepository_UpdateApplication(t *testing.T) { updatedApplication, err := repo3.UpdateApplication( ctx, application.ID, application.Title, content, - []*Tag{tag}, []*ApplicationTarget{target}) + []*service.Tag{tag}, []*service.ApplicationTarget{target}) require.NoError(t, err) - exp := &ApplicationDetail{ + exp := &service.ApplicationDetail{ ID: application.ID, Status: application.Status, Title: application.Title, Content: content, Comments: application.Comments, Files: application.Files, - Tags: []*Tag{tag}, - Targets: []*ApplicationTargetDetail{expTarget}, + Tags: []*service.Tag{tag}, + Targets: []*service.ApplicationTargetDetail{expTarget}, Statuses: application.Statuses, CreatedAt: application.CreatedAt, UpdatedAt: time.Now(), @@ -876,7 +879,7 @@ func TestEntRepository_UpdateApplication(t *testing.T) { } opts := testutil.ApproxEqualOptions() opts = append(opts, - cmpopts.IgnoreFields(ApplicationTargetDetail{}, "ID", "PaidAt")) + cmpopts.IgnoreFields(service.ApplicationTargetDetail{}, "ID", "PaidAt")) testutil.AssertEqual(t, exp, updatedApplication, opts...) }) @@ -891,7 +894,7 @@ func TestEntRepository_UpdateApplication(t *testing.T) { require.NoError(t, err) tag, err := repo4.CreateTag(ctx, random.AlphaNumeric(t, 20)) require.NoError(t, err) - target := &ApplicationTarget{ + target := &service.ApplicationTarget{ Target: user.ID, Amount: random.Numeric(t, 10000), } @@ -899,12 +902,12 @@ func TestEntRepository_UpdateApplication(t *testing.T) { ctx, random.AlphaNumeric(t, 40), random.AlphaNumeric(t, 100), - []*Tag{tag}, []*ApplicationTarget{target}, + []*service.Tag{tag}, []*service.ApplicationTarget{target}, user.ID) require.NoError(t, err) date := time.Now() - unknownTag := &Tag{ + unknownTag := &service.Tag{ ID: uuid.New(), Name: random.AlphaNumeric(t, 20), CreatedAt: date, @@ -913,7 +916,7 @@ func TestEntRepository_UpdateApplication(t *testing.T) { _, err = repo4.UpdateApplication( ctx, application.ID, application.Title, application.Content, - []*Tag{unknownTag}, []*ApplicationTarget{target}) + []*service.Tag{unknownTag}, []*service.ApplicationTarget{target}) require.Error(t, err) }) } diff --git a/internal/model/comment.go b/internal/model/comment.go index 36e278af..70c811a1 100644 --- a/internal/model/comment.go +++ b/internal/model/comment.go @@ -1,4 +1,3 @@ -//go:generate go tool mockgen -source=$GOFILE -destination=mock_$GOPACKAGE/mock_$GOFILE -package=mock_$GOPACKAGE package model import ( @@ -6,23 +5,112 @@ import ( "time" "github.com/google/uuid" + "github.com/samber/lo" + "github.com/traPtitech/Jomon/internal/ent" + "github.com/traPtitech/Jomon/internal/ent/application" + "github.com/traPtitech/Jomon/internal/ent/comment" + "github.com/traPtitech/Jomon/internal/service" ) -type Comment struct { - ID uuid.UUID - User uuid.UUID - Comment string - CreatedAt time.Time - UpdatedAt time.Time +var commentErrorConverter = &entErrorConverter{ + msgBadInput: "failed to process comment due to invalid input", + msgNotFound: "comment not found", } -type CommentRepository interface { - GetComments(ctx context.Context, applicationID uuid.UUID) ([]*Comment, error) - CreateComment( - ctx context.Context, comment string, applicationID uuid.UUID, userID uuid.UUID, - ) (*Comment, error) - UpdateComment( - ctx context.Context, comment string, applicationID uuid.UUID, commentID uuid.UUID, - ) (*Comment, error) - DeleteComment(ctx context.Context, applicationID uuid.UUID, commentID uuid.UUID) error +func (repo *EntRepository) GetComments( + ctx context.Context, applicationID uuid.UUID, +) ([]*service.Comment, error) { + _, err := repo.client.Application. + Query(). + Where(application.IDEQ(applicationID)). + First(ctx) + if err != nil { + return nil, commentErrorConverter.convert(err) + } + + comments, err := repo.client.Comment. + Query(). + Where( + comment.HasApplicationWith( + application.ID(applicationID), + ), + ). + WithUser(). + All(ctx) + if err != nil { + return nil, commentErrorConverter.convert(err) + } + modelcomments := lo.Map(comments, func(c *ent.Comment, _ int) *service.Comment { + return ConvertEntCommentToModelComment(c, c.Edges.User.ID) + }) + return modelcomments, nil +} + +func (repo *EntRepository) CreateComment( + ctx context.Context, comment string, applicationID uuid.UUID, userID uuid.UUID, +) (*service.Comment, error) { + created, err := repo.client.Comment. + Create(). + SetComment(comment). + SetApplicationID(applicationID). + SetUserID(userID). + Save(ctx) + if err != nil { + return nil, commentErrorConverter.convert(err) + } + return ConvertEntCommentToModelComment(created, userID), nil +} + +func (repo *EntRepository) UpdateComment( + ctx context.Context, commentContent string, applicationID uuid.UUID, commentID uuid.UUID, +) (*service.Comment, error) { + updated, err := repo.client.Comment. + UpdateOneID(commentID). + SetComment(commentContent). + SetUpdatedAt(time.Now()). + SetApplicationID(applicationID). + Save(ctx) + if err != nil { + return nil, commentErrorConverter.convert(err) + } + updatedWithUser, err := repo.client.Comment. + Query(). + Where(comment.IDEQ(commentID)). + WithUser(). + Only(ctx) + if err != nil { + return nil, commentErrorConverter.convert(err) + } + return ConvertEntCommentToModelComment(updated, updatedWithUser.Edges.User.ID), nil +} + +func (repo *EntRepository) DeleteComment( + ctx context.Context, applicationID uuid.UUID, commentID uuid.UUID, +) error { + c, err := repo.client.Comment. + Query(). + Where( + comment.HasApplicationWith( + application.ID(applicationID), + ), + ). + Where(comment.IDEQ(commentID)). + Only(ctx) + if err != nil { + return commentErrorConverter.convert(err) + } + err = repo.client.Comment. + DeleteOne(c). + Exec(ctx) + return commentErrorConverter.convert(err) +} + +func ConvertEntCommentToModelComment(comment *ent.Comment, userID uuid.UUID) *service.Comment { + return &service.Comment{ + ID: comment.ID, + User: userID, + Comment: comment.Comment, + CreatedAt: comment.CreatedAt, + UpdatedAt: comment.UpdatedAt, + } } diff --git a/internal/model/comment_impl.go b/internal/model/comment_impl.go deleted file mode 100644 index 030f741f..00000000 --- a/internal/model/comment_impl.go +++ /dev/null @@ -1,115 +0,0 @@ -package model - -import ( - "context" - "time" - - "github.com/google/uuid" - "github.com/samber/lo" - "github.com/traPtitech/Jomon/internal/ent" - "github.com/traPtitech/Jomon/internal/ent/application" - "github.com/traPtitech/Jomon/internal/ent/comment" -) - -var commentErrorConverter = &entErrorConverter{ - msgBadInput: "failed to process comment due to invalid input", - msgNotFound: "comment not found", -} - -func (repo *EntRepository) GetComments( - ctx context.Context, applicationID uuid.UUID, -) ([]*Comment, error) { - _, err := repo.client.Application. - Query(). - Where(application.IDEQ(applicationID)). - First(ctx) - if err != nil { - return nil, commentErrorConverter.convert(err) - } - - comments, err := repo.client.Comment. - Query(). - Where( - comment.HasApplicationWith( - application.ID(applicationID), - ), - ). - WithUser(). - All(ctx) - if err != nil { - return nil, commentErrorConverter.convert(err) - } - modelcomments := lo.Map(comments, func(c *ent.Comment, _ int) *Comment { - return ConvertEntCommentToModelComment(c, c.Edges.User.ID) - }) - return modelcomments, nil -} - -func (repo *EntRepository) CreateComment( - ctx context.Context, comment string, applicationID uuid.UUID, userID uuid.UUID, -) (*Comment, error) { - created, err := repo.client.Comment. - Create(). - SetComment(comment). - SetApplicationID(applicationID). - SetUserID(userID). - Save(ctx) - if err != nil { - return nil, commentErrorConverter.convert(err) - } - return ConvertEntCommentToModelComment(created, userID), nil -} - -func (repo *EntRepository) UpdateComment( - ctx context.Context, commentContent string, applicationID uuid.UUID, commentID uuid.UUID, -) (*Comment, error) { - updated, err := repo.client.Comment. - UpdateOneID(commentID). - SetComment(commentContent). - SetUpdatedAt(time.Now()). - SetApplicationID(applicationID). - Save(ctx) - if err != nil { - return nil, commentErrorConverter.convert(err) - } - updatedWithUser, err := repo.client.Comment. - Query(). - Where(comment.IDEQ(commentID)). - WithUser(). - Only(ctx) - if err != nil { - return nil, commentErrorConverter.convert(err) - } - return ConvertEntCommentToModelComment(updated, updatedWithUser.Edges.User.ID), nil -} - -func (repo *EntRepository) DeleteComment( - ctx context.Context, applicationID uuid.UUID, commentID uuid.UUID, -) error { - c, err := repo.client.Comment. - Query(). - Where( - comment.HasApplicationWith( - application.ID(applicationID), - ), - ). - Where(comment.IDEQ(commentID)). - Only(ctx) - if err != nil { - return commentErrorConverter.convert(err) - } - err = repo.client.Comment. - DeleteOne(c). - Exec(ctx) - return commentErrorConverter.convert(err) -} - -func ConvertEntCommentToModelComment(comment *ent.Comment, userID uuid.UUID) *Comment { - return &Comment{ - ID: comment.ID, - User: userID, - Comment: comment.Comment, - CreatedAt: comment.CreatedAt, - UpdatedAt: comment.UpdatedAt, - } -} diff --git a/internal/model/comment_impl_test.go b/internal/model/comment_test.go similarity index 90% rename from internal/model/comment_impl_test.go rename to internal/model/comment_test.go index 4ee50911..5f16cb23 100644 --- a/internal/model/comment_impl_test.go +++ b/internal/model/comment_test.go @@ -7,6 +7,7 @@ import ( "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" "github.com/stretchr/testify/require" + "github.com/traPtitech/Jomon/internal/service" "github.com/traPtitech/Jomon/internal/testutil" "github.com/traPtitech/Jomon/internal/testutil/random" ) @@ -32,7 +33,7 @@ func TestEntRepository_GetComments(t *testing.T) { ctx, random.AlphaNumeric(t, 40), random.AlphaNumeric(t, 100), - []*Tag{}, []*ApplicationTarget{}, + []*service.Tag{}, []*service.ApplicationTarget{}, user.ID) require.NoError(t, err) @@ -55,10 +56,10 @@ func TestEntRepository_GetComments(t *testing.T) { require.NoError(t, err) opts := testutil.ApproxEqualOptions() opts = append(opts, - cmpopts.SortSlices(func(l, r *Comment) bool { + cmpopts.SortSlices(func(l, r *service.Comment) bool { return l.ID.ID() < r.ID.ID() })) - exp := []*Comment{comment1, comment2} + exp := []*service.Comment{comment1, comment2} testutil.RequireEqual(t, exp, got, opts...) }) @@ -74,7 +75,7 @@ func TestEntRepository_GetComments(t *testing.T) { ctx, random.AlphaNumeric(t, 40), random.AlphaNumeric(t, 100), - []*Tag{}, []*ApplicationTarget{}, + []*service.Tag{}, []*service.ApplicationTarget{}, user.ID) require.NoError(t, err) @@ -108,7 +109,7 @@ func TestEntRepository_CreateComment(t *testing.T) { ctx, random.AlphaNumeric(t, 40), random.AlphaNumeric(t, 100), - []*Tag{}, []*ApplicationTarget{}, + []*service.Tag{}, []*service.ApplicationTarget{}, user.ID) require.NoError(t, err) @@ -123,8 +124,8 @@ func TestEntRepository_CreateComment(t *testing.T) { require.NoError(t, err) opts := testutil.ApproxEqualOptions() opts = append(opts, - cmpopts.IgnoreFields(Comment{}, "ID")) - exp := &Comment{ + cmpopts.IgnoreFields(service.Comment{}, "ID")) + exp := &service.Comment{ User: user2.ID, Comment: comment, CreatedAt: time.Now(), @@ -157,7 +158,7 @@ func TestEntRepository_CreateComment(t *testing.T) { ctx, random.AlphaNumeric(t, 40), random.AlphaNumeric(t, 100), - []*Tag{}, []*ApplicationTarget{}, + []*service.Tag{}, []*service.ApplicationTarget{}, user.ID) require.NoError(t, err) @@ -184,7 +185,7 @@ func TestEntRepository_UpdateComment(t *testing.T) { ctx, random.AlphaNumeric(t, 40), random.AlphaNumeric(t, 100), - []*Tag{}, []*ApplicationTarget{}, + []*service.Tag{}, []*service.ApplicationTarget{}, user.ID) require.NoError(t, err) created, err := repo.CreateComment(ctx, random.AlphaNumeric(t, 30), application.ID, user.ID) @@ -194,7 +195,7 @@ func TestEntRepository_UpdateComment(t *testing.T) { updated, err := repo.UpdateComment(ctx, comment, application.ID, created.ID) require.NoError(t, err) opts := testutil.ApproxEqualOptions() - exp := &Comment{ + exp := &service.Comment{ ID: created.ID, User: created.User, Comment: comment, @@ -216,7 +217,7 @@ func TestEntRepository_UpdateComment(t *testing.T) { ctx, random.AlphaNumeric(t, 40), random.AlphaNumeric(t, 100), - []*Tag{}, []*ApplicationTarget{}, + []*service.Tag{}, []*service.ApplicationTarget{}, user.ID) require.NoError(t, err) comment, err := repo.CreateComment( @@ -231,13 +232,13 @@ func TestEntRepository_UpdateComment(t *testing.T) { ctx, random.AlphaNumeric(t, 40), random.AlphaNumeric(t, 100), - []*Tag{}, []*ApplicationTarget{}, + []*service.Tag{}, []*service.ApplicationTarget{}, user.ID) require.NoError(t, err) updated, err := repo.UpdateComment(ctx, comment.Comment, application2.ID, comment.ID) require.NoError(t, err) opts := testutil.ApproxEqualOptions() - exp := &Comment{ + exp := &service.Comment{ ID: comment.ID, User: comment.User, Comment: comment.Comment, @@ -248,7 +249,7 @@ func TestEntRepository_UpdateComment(t *testing.T) { got, err := repo.GetComments(ctx, application2.ID) require.NoError(t, err) - testutil.RequireEqual(t, []*Comment{updated}, got, opts...) + testutil.RequireEqual(t, []*service.Comment{updated}, got, opts...) }) t.Run("UnknownComment", func(t *testing.T) { @@ -263,7 +264,7 @@ func TestEntRepository_UpdateComment(t *testing.T) { ctx, random.AlphaNumeric(t, 40), random.AlphaNumeric(t, 100), - []*Tag{}, []*ApplicationTarget{}, + []*service.Tag{}, []*service.ApplicationTarget{}, user.ID) require.NoError(t, err) @@ -286,7 +287,7 @@ func TestEntRepository_UpdateComment(t *testing.T) { ctx, random.AlphaNumeric(t, 40), random.AlphaNumeric(t, 100), - []*Tag{}, []*ApplicationTarget{}, + []*service.Tag{}, []*service.ApplicationTarget{}, user.ID) require.NoError(t, err) comment, err := repo.CreateComment(ctx, random.AlphaNumeric(t, 30), application.ID, user.ID) @@ -315,7 +316,7 @@ func TestEntRepository_DeleteComment(t *testing.T) { ctx, random.AlphaNumeric(t, 40), random.AlphaNumeric(t, 100), - []*Tag{}, []*ApplicationTarget{}, + []*service.Tag{}, []*service.ApplicationTarget{}, user.ID) require.NoError(t, err) comment, err := repo.CreateComment(ctx, random.AlphaNumeric(t, 30), application.ID, user.ID) @@ -341,7 +342,7 @@ func TestEntRepository_DeleteComment(t *testing.T) { ctx, random.AlphaNumeric(t, 40), random.AlphaNumeric(t, 100), - []*Tag{}, []*ApplicationTarget{}, + []*service.Tag{}, []*service.ApplicationTarget{}, user.ID) require.NoError(t, err) comment, err := repo.CreateComment(ctx, random.AlphaNumeric(t, 30), application.ID, user.ID) @@ -363,7 +364,7 @@ func TestEntRepository_DeleteComment(t *testing.T) { ctx, random.AlphaNumeric(t, 40), random.AlphaNumeric(t, 100), - []*Tag{}, []*ApplicationTarget{}, + []*service.Tag{}, []*service.ApplicationTarget{}, user.ID) require.NoError(t, err) diff --git a/internal/model/file.go b/internal/model/file.go index 8514cc00..876c3a76 100644 --- a/internal/model/file.go +++ b/internal/model/file.go @@ -1,29 +1,82 @@ -//go:generate go tool mockgen -source=$GOFILE -destination=mock_$GOPACKAGE/mock_$GOFILE -package=mock_$GOPACKAGE package model import ( "context" - "time" "github.com/google/uuid" + "github.com/traPtitech/Jomon/internal/ent" + "github.com/traPtitech/Jomon/internal/ent/file" + "github.com/traPtitech/Jomon/internal/service" ) -type FileRepository interface { - CreateFile( - ctx context.Context, - name string, - mimetype string, - applicationID uuid.UUID, - userID uuid.UUID, - ) (*File, error) - GetFile(ctx context.Context, fileID uuid.UUID) (*File, error) - DeleteFile(ctx context.Context, fileID uuid.UUID) error +var fileErrorConverter = &entErrorConverter{ + msgBadInput: "failed to process file due to invalid input", + msgNotFound: "file not found", } -type File struct { - ID uuid.UUID - Name string - MimeType string - CreatedBy uuid.UUID - CreatedAt time.Time +// TODO: トランザクションを適用する +func (repo *EntRepository) CreateFile( + ctx context.Context, name, mimetype string, applicationID, userID uuid.UUID, +) (*service.File, error) { + id := uuid.New() + + created, err := repo.client.File. + Create(). + SetID(id). + SetName(name). + SetMimeType(mimetype). + SetUserID(userID). + Save(ctx) + if err != nil { + return nil, fileErrorConverter.convert(err) + } + + _, err = repo.client.Application. + UpdateOneID(applicationID). + AddFile(created). + Save(ctx) + if err != nil { + return nil, fileErrorConverter.convert(err) + } + + f := &service.File{ + ID: created.ID, + Name: name, + MimeType: mimetype, + CreatedBy: userID, + CreatedAt: created.CreatedAt, + } + + return f, nil +} + +func (repo *EntRepository) GetFile(ctx context.Context, fileID uuid.UUID) (*service.File, error) { + f, err := repo.client.File. + Query(). + Where(file.IDEQ(fileID)). + WithUser(). + Only(ctx) + if err != nil { + return nil, fileErrorConverter.convert(err) + } + + return ConvertEntFileToModelFile(f), nil +} + +func (repo *EntRepository) DeleteFile(ctx context.Context, fileID uuid.UUID) error { + err := repo.client.File. + DeleteOneID(fileID). + Exec(ctx) + return fileErrorConverter.convert(err) +} + +func ConvertEntFileToModelFile(entfile *ent.File) *service.File { + // be careful to check existing edges + return &service.File{ + ID: entfile.ID, + Name: entfile.Name, + MimeType: entfile.MimeType, + CreatedBy: entfile.Edges.User.ID, + CreatedAt: entfile.CreatedAt, + } } diff --git a/internal/model/file_impl.go b/internal/model/file_impl.go deleted file mode 100644 index 25acfc5c..00000000 --- a/internal/model/file_impl.go +++ /dev/null @@ -1,80 +0,0 @@ -package model - -import ( - "context" - - "github.com/google/uuid" - "github.com/traPtitech/Jomon/internal/ent" - "github.com/traPtitech/Jomon/internal/ent/file" -) - -var fileErrorConverter = &entErrorConverter{ - msgBadInput: "failed to process file due to invalid input", - msgNotFound: "file not found", -} - -func (repo *EntRepository) CreateFile( - ctx context.Context, name string, mimetype string, applicationID uuid.UUID, userID uuid.UUID, -) (*File, error) { - id := uuid.New() - - created, err := repo.client.File. - Create(). - SetID(id). - SetName(name). - SetMimeType(mimetype). - SetUserID(userID). - Save(ctx) - if err != nil { - return nil, fileErrorConverter.convert(err) - } - - _, err = repo.client.Application. - UpdateOneID(applicationID). - AddFile(created). - Save(ctx) - if err != nil { - return nil, fileErrorConverter.convert(err) - } - - f := &File{ - ID: created.ID, - Name: name, - MimeType: mimetype, - CreatedBy: userID, - CreatedAt: created.CreatedAt, - } - - return f, nil -} - -func (repo *EntRepository) GetFile(ctx context.Context, fileID uuid.UUID) (*File, error) { - f, err := repo.client.File. - Query(). - Where(file.IDEQ(fileID)). - WithUser(). - Only(ctx) - if err != nil { - return nil, fileErrorConverter.convert(err) - } - - return ConvertEntFileToModelFile(f), nil -} - -func (repo *EntRepository) DeleteFile(ctx context.Context, fileID uuid.UUID) error { - err := repo.client.File. - DeleteOneID(fileID). - Exec(ctx) - return fileErrorConverter.convert(err) -} - -func ConvertEntFileToModelFile(entfile *ent.File) *File { - // be careful to check existing edges - return &File{ - ID: entfile.ID, - Name: entfile.Name, - MimeType: entfile.MimeType, - CreatedBy: entfile.Edges.User.ID, - CreatedAt: entfile.CreatedAt, - } -} diff --git a/internal/model/file_impl_test.go b/internal/model/file_test.go similarity index 90% rename from internal/model/file_impl_test.go rename to internal/model/file_test.go index 948ffbd7..2199571f 100644 --- a/internal/model/file_impl_test.go +++ b/internal/model/file_test.go @@ -7,6 +7,7 @@ import ( "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" "github.com/stretchr/testify/require" + "github.com/traPtitech/Jomon/internal/service" "github.com/traPtitech/Jomon/internal/testutil" "github.com/traPtitech/Jomon/internal/testutil/random" ) @@ -21,8 +22,8 @@ func TestEntRepository_CreateFile(t *testing.T) { t.Parallel() ctx := testutil.NewContext(t) - var tags []*Tag - var targets []*ApplicationTarget + var tags []*service.Tag + var targets []*service.ApplicationTarget user, err := repo.CreateUser( ctx, random.AlphaNumeric(t, 20), @@ -45,8 +46,8 @@ func TestEntRepository_CreateFile(t *testing.T) { require.NoError(t, err) opts := testutil.ApproxEqualOptions() opts = append(opts, - cmpopts.IgnoreFields(File{}, "ID")) - exp := &File{ + cmpopts.IgnoreFields(service.File{}, "ID")) + exp := &service.File{ Name: name, MimeType: mimetype, CreatedBy: user.ID, @@ -65,7 +66,7 @@ func TestEntRepository_CreateFile(t *testing.T) { random.AlphaNumeric(t, 30), true) require.NoError(t, err) - application := Application{ + application := service.Application{ ID: uuid.New(), } @@ -81,8 +82,8 @@ func TestEntRepository_CreateFile(t *testing.T) { t.Parallel() ctx := testutil.NewContext(t) - var tags []*Tag - var targets []*ApplicationTarget + var tags []*service.Tag + var targets []*service.ApplicationTarget user, err := repo.CreateUser( ctx, random.AlphaNumeric(t, 20), @@ -114,8 +115,8 @@ func TestEntRepository_GetFile(t *testing.T) { t.Parallel() ctx := testutil.NewContext(t) - var tags []*Tag - var targets []*ApplicationTarget + var tags []*service.Tag + var targets []*service.ApplicationTarget user, err := repo.CreateUser( ctx, random.AlphaNumeric(t, 20), @@ -139,7 +140,7 @@ func TestEntRepository_GetFile(t *testing.T) { got, err := repo.GetFile(ctx, file.ID) require.NoError(t, err) opts := testutil.ApproxEqualOptions() - exp := &File{ + exp := &service.File{ ID: file.ID, Name: name, MimeType: mimetype, @@ -168,8 +169,8 @@ func TestEntRepository_DeleteFile(t *testing.T) { t.Parallel() ctx := testutil.NewContext(t) - var tags []*Tag - var targets []*ApplicationTarget + var tags []*service.Tag + var targets []*service.ApplicationTarget user, err := repo.CreateUser( ctx, random.AlphaNumeric(t, 20), diff --git a/internal/model/repository.go b/internal/model/repository.go index a9e0fcb8..393af1a1 100644 --- a/internal/model/repository.go +++ b/internal/model/repository.go @@ -4,19 +4,6 @@ import ( "github.com/traPtitech/Jomon/internal/ent" ) -type Repository interface { - AccountManagerRepository - CommentRepository - FileRepository - ApplicationFileRepository - ApplicationStatusRepository - ApplicationTagRepository - ApplicationTargetRepository - ApplicationRepository - TagRepository - UserRepository -} - type EntRepository struct { client *ent.Client } diff --git a/internal/model/tag.go b/internal/model/tag.go index 81c16005..7b2984ad 100644 --- a/internal/model/tag.go +++ b/internal/model/tag.go @@ -1,4 +1,3 @@ -//go:generate go tool mockgen -source=$GOFILE -destination=mock_$GOPACKAGE/mock_$GOFILE -package=mock_$GOPACKAGE package model import ( @@ -6,20 +5,81 @@ import ( "time" "github.com/google/uuid" + "github.com/samber/lo" + "github.com/traPtitech/Jomon/internal/ent" + "github.com/traPtitech/Jomon/internal/ent/tag" + "github.com/traPtitech/Jomon/internal/nulltime" + "github.com/traPtitech/Jomon/internal/service" ) -type Tag struct { - ID uuid.UUID - Name string - CreatedAt time.Time - UpdatedAt time.Time - DeletedAt time.Time +var tagErrorConverter = &entErrorConverter{ + msgBadInput: "failed to process tag due to invalid input", + msgNotFound: "tag not found", } -type TagRepository interface { - GetTags(ctx context.Context) ([]*Tag, error) - GetTag(ctx context.Context, tagID uuid.UUID) (*Tag, error) - CreateTag(ctx context.Context, name string) (*Tag, error) - UpdateTag(ctx context.Context, tagID uuid.UUID, name string) (*Tag, error) - DeleteTag(ctx context.Context, tagID uuid.UUID) error +func (repo *EntRepository) GetTags(ctx context.Context) ([]*service.Tag, error) { + tags, err := repo.client.Tag. + Query(). + All(ctx) + if err != nil { + return nil, tagErrorConverter.convert(err) + } + modeltags := lo.Map(tags, func(t *ent.Tag, _ int) *service.Tag { + return ConvertEntTagToModelTag(t) + }) + + return modeltags, nil +} + +func (repo *EntRepository) GetTag(ctx context.Context, tagID uuid.UUID) (*service.Tag, error) { + t, err := repo.client.Tag. + Query(). + Where(tag.IDEQ(tagID)). + Only(ctx) + if err != nil { + return nil, tagErrorConverter.convert(err) + } + return ConvertEntTagToModelTag(t), nil +} + +func (repo *EntRepository) CreateTag(ctx context.Context, name string) (*service.Tag, error) { + created, err := repo.client.Tag. + Create(). + SetName(name). + Save(ctx) + if err != nil { + return nil, tagErrorConverter.convert(err) + } + return ConvertEntTagToModelTag(created), nil +} + +func (repo *EntRepository) UpdateTag( + ctx context.Context, tagID uuid.UUID, name string, +) (*service.Tag, error) { + t, err := repo.client.Tag. + UpdateOneID(tagID). + SetName(name). + SetUpdatedAt(time.Now()). + Save(ctx) + if err != nil { + return nil, tagErrorConverter.convert(err) + } + return ConvertEntTagToModelTag(t), nil +} + +func (repo *EntRepository) DeleteTag(ctx context.Context, tagID uuid.UUID) error { + err := repo.client.Tag. + DeleteOneID(tagID). + Exec(ctx) + return tagErrorConverter.convert(err) +} + +func ConvertEntTagToModelTag(enttag *ent.Tag) *service.Tag { + return &service.Tag{ + ID: enttag.ID, + Name: enttag.Name, + CreatedAt: enttag.CreatedAt, + UpdatedAt: enttag.UpdatedAt, + DeletedAt: nulltime.FromTime(enttag.DeletedAt), + } } diff --git a/internal/model/tag_impl.go b/internal/model/tag_impl.go deleted file mode 100644 index 91f8ac8d..00000000 --- a/internal/model/tag_impl.go +++ /dev/null @@ -1,84 +0,0 @@ -package model - -import ( - "context" - "time" - - "github.com/google/uuid" - "github.com/samber/lo" - "github.com/traPtitech/Jomon/internal/ent" - "github.com/traPtitech/Jomon/internal/ent/tag" - "github.com/traPtitech/Jomon/internal/nulltime" -) - -var tagErrorConverter = &entErrorConverter{ - msgBadInput: "failed to process tag due to invalid input", - msgNotFound: "tag not found", -} - -func (repo *EntRepository) GetTags(ctx context.Context) ([]*Tag, error) { - tags, err := repo.client.Tag. - Query(). - All(ctx) - if err != nil { - return nil, tagErrorConverter.convert(err) - } - modeltags := lo.Map(tags, func(t *ent.Tag, _ int) *Tag { - return ConvertEntTagToModelTag(t) - }) - - return modeltags, nil -} - -func (repo *EntRepository) GetTag(ctx context.Context, tagID uuid.UUID) (*Tag, error) { - t, err := repo.client.Tag. - Query(). - Where(tag.IDEQ(tagID)). - Only(ctx) - if err != nil { - return nil, tagErrorConverter.convert(err) - } - return ConvertEntTagToModelTag(t), nil -} - -func (repo *EntRepository) CreateTag(ctx context.Context, name string) (*Tag, error) { - created, err := repo.client.Tag. - Create(). - SetName(name). - Save(ctx) - if err != nil { - return nil, tagErrorConverter.convert(err) - } - return ConvertEntTagToModelTag(created), nil -} - -func (repo *EntRepository) UpdateTag( - ctx context.Context, tagID uuid.UUID, name string, -) (*Tag, error) { - t, err := repo.client.Tag. - UpdateOneID(tagID). - SetName(name). - SetUpdatedAt(time.Now()). - Save(ctx) - if err != nil { - return nil, tagErrorConverter.convert(err) - } - return ConvertEntTagToModelTag(t), nil -} - -func (repo *EntRepository) DeleteTag(ctx context.Context, tagID uuid.UUID) error { - err := repo.client.Tag. - DeleteOneID(tagID). - Exec(ctx) - return tagErrorConverter.convert(err) -} - -func ConvertEntTagToModelTag(enttag *ent.Tag) *Tag { - return &Tag{ - ID: enttag.ID, - Name: enttag.Name, - CreatedAt: enttag.CreatedAt, - UpdatedAt: enttag.UpdatedAt, - DeletedAt: nulltime.FromTime(enttag.DeletedAt).Time, - } -} diff --git a/internal/model/tag_impl_test.go b/internal/model/tag_test.go similarity index 90% rename from internal/model/tag_impl_test.go rename to internal/model/tag_test.go index 0d87889a..449bcff8 100644 --- a/internal/model/tag_impl_test.go +++ b/internal/model/tag_test.go @@ -7,6 +7,8 @@ import ( "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" "github.com/stretchr/testify/require" + "github.com/traPtitech/Jomon/internal/nulltime" + "github.com/traPtitech/Jomon/internal/service" "github.com/traPtitech/Jomon/internal/testutil" "github.com/traPtitech/Jomon/internal/testutil/random" ) @@ -29,10 +31,10 @@ func TestEntRepository_GetTags(t *testing.T) { require.NoError(t, err) opts := testutil.ApproxEqualOptions() opts = append(opts, - cmpopts.SortSlices(func(l, r *Tag) bool { + cmpopts.SortSlices(func(l, r *service.Tag) bool { return l.ID.ID() < r.ID.ID() })) - exp := []*Tag{tag1, tag2} + exp := []*service.Tag{tag1, tag2} testutil.RequireEqual(t, exp, got, opts...) }) @@ -58,12 +60,12 @@ func TestEntRepository_CreateTag(t *testing.T) { require.NoError(t, err) opts := testutil.ApproxEqualOptions() opts = append(opts, - cmpopts.IgnoreFields(Tag{}, "ID")) - exp := &Tag{ + cmpopts.IgnoreFields(service.Tag{}, "ID")) + exp := &service.Tag{ Name: name, CreatedAt: time.Now(), UpdatedAt: time.Now(), - DeletedAt: time.Time{}, + DeletedAt: nulltime.NullTime{}, } testutil.RequireEqual(t, exp, tag, opts...) }) @@ -94,12 +96,12 @@ func TestEntRepository_UpdateTag(t *testing.T) { require.NoError(t, err) opts := testutil.ApproxEqualOptions() - exp := &Tag{ + exp := &service.Tag{ ID: created.ID, Name: name, CreatedAt: created.CreatedAt, UpdatedAt: time.Now(), - DeletedAt: time.Time{}, + DeletedAt: nulltime.NullTime{}, } testutil.RequireEqual(t, exp, updated, opts...) }) diff --git a/internal/model/user.go b/internal/model/user.go index a158c45b..078a9cec 100644 --- a/internal/model/user.go +++ b/internal/model/user.go @@ -1,4 +1,3 @@ -//go:generate go tool mockgen -source=$GOFILE -destination=mock_$GOPACKAGE/mock_$GOFILE -package=mock_$GOPACKAGE package model import ( @@ -6,24 +5,97 @@ import ( "time" "github.com/google/uuid" + "github.com/samber/lo" + "github.com/traPtitech/Jomon/internal/ent" + "github.com/traPtitech/Jomon/internal/ent/user" + "github.com/traPtitech/Jomon/internal/nulltime" + "github.com/traPtitech/Jomon/internal/service" ) -type User struct { - ID uuid.UUID - Name string - DisplayName string - AccountManager bool - CreatedAt time.Time - UpdatedAt time.Time - DeletedAt time.Time +var userErrorConverter = &entErrorConverter{ + msgBadInput: "failed to process user due to invalid input", + msgNotFound: "user not found", } -type UserRepository interface { - CreateUser(ctx context.Context, name string, dn string, accountManager bool) (*User, error) - GetUserByID(ctx context.Context, userID uuid.UUID) (*User, error) - GetUserByName(ctx context.Context, name string) (*User, error) - GetUsers(ctx context.Context) ([]*User, error) - UpdateUser( - ctx context.Context, userID uuid.UUID, name string, dn string, accountManager bool, - ) (*User, error) +func (repo *EntRepository) CreateUser( + ctx context.Context, name string, dn string, accountManager bool, +) (*service.User, error) { + u, err := repo.client.User. + Create(). + SetName(name). + SetDisplayName(dn). + SetAccountManager(accountManager). + Save(ctx) + if err != nil { + return nil, userErrorConverter.convert(err) + } + return convertEntUserToModelUser(u), nil +} + +func (repo *EntRepository) GetUserByID( + ctx context.Context, userID uuid.UUID, +) (*service.User, error) { + u, err := repo.client.User. + Query(). + Where(user.IDEQ(userID)). + Only(ctx) + if err != nil { + return nil, userErrorConverter.convert(err) + } + return convertEntUserToModelUser(u), nil +} + +func (repo *EntRepository) GetUserByName(ctx context.Context, name string) (*service.User, error) { + u, err := repo.client.User. + Query(). + Where(user.NameEQ(name)). + Only(ctx) + if err != nil { + return nil, userErrorConverter.convert(err) + } + return convertEntUserToModelUser(u), nil +} + +func (repo *EntRepository) GetUsers(ctx context.Context) ([]*service.User, error) { + users, err := repo.client.User. + Query(). + All(ctx) + if err != nil { + return nil, userErrorConverter.convert(err) + } + modelusers := lo.Map(users, func(u *ent.User, _ int) *service.User { + return convertEntUserToModelUser(u) + }) + return modelusers, nil +} + +func (repo *EntRepository) UpdateUser( + ctx context.Context, userID uuid.UUID, name string, dn string, accountManager bool, +) (*service.User, error) { + u, err := repo.client.User. + UpdateOneID(userID). + SetName(name). + SetDisplayName(dn). + SetAccountManager(accountManager). + SetUpdatedAt(time.Now()). + Save(ctx) + if err != nil { + return nil, userErrorConverter.convert(err) + } + return convertEntUserToModelUser(u), nil +} + +func convertEntUserToModelUser(user *ent.User) *service.User { + if user == nil { + return nil + } + return &service.User{ + ID: user.ID, + Name: user.Name, + DisplayName: user.DisplayName, + AccountManager: user.AccountManager, + CreatedAt: user.CreatedAt, + UpdatedAt: user.UpdatedAt, + DeletedAt: nulltime.FromTime(user.DeletedAt), + } } diff --git a/internal/model/user_impl.go b/internal/model/user_impl.go deleted file mode 100644 index 3a8ef612..00000000 --- a/internal/model/user_impl.go +++ /dev/null @@ -1,98 +0,0 @@ -package model - -import ( - "context" - "time" - - "github.com/google/uuid" - "github.com/samber/lo" - "github.com/traPtitech/Jomon/internal/ent" - "github.com/traPtitech/Jomon/internal/ent/user" - "github.com/traPtitech/Jomon/internal/nulltime" -) - -var userErrorConverter = &entErrorConverter{ - msgBadInput: "failed to process user due to invalid input", - msgNotFound: "user not found", -} - -func (repo *EntRepository) CreateUser( - ctx context.Context, name string, dn string, accountManager bool, -) (*User, error) { - u, err := repo.client.User. - Create(). - SetName(name). - SetDisplayName(dn). - SetAccountManager(accountManager). - Save(ctx) - if err != nil { - return nil, userErrorConverter.convert(err) - } - return convertEntUserToModelUser(u), nil -} - -func (repo *EntRepository) GetUserByID(ctx context.Context, userID uuid.UUID) (*User, error) { - u, err := repo.client.User. - Query(). - Where(user.IDEQ(userID)). - Only(ctx) - if err != nil { - return nil, userErrorConverter.convert(err) - } - return convertEntUserToModelUser(u), nil -} - -func (repo *EntRepository) GetUserByName(ctx context.Context, name string) (*User, error) { - u, err := repo.client.User. - Query(). - Where(user.NameEQ(name)). - Only(ctx) - if err != nil { - return nil, userErrorConverter.convert(err) - } - return convertEntUserToModelUser(u), nil -} - -func (repo *EntRepository) GetUsers(ctx context.Context) ([]*User, error) { - users, err := repo.client.User. - Query(). - All(ctx) - if err != nil { - return nil, userErrorConverter.convert(err) - } - modelusers := lo.Map(users, func(u *ent.User, _ int) *User { - return convertEntUserToModelUser(u) - }) - return modelusers, nil -} - -func (repo *EntRepository) UpdateUser( - ctx context.Context, userID uuid.UUID, name string, dn string, accountManager bool, -) (*User, error) { - u, err := repo.client.User. - UpdateOneID(userID). - SetName(name). - SetDisplayName(dn). - SetAccountManager(accountManager). - SetUpdatedAt(time.Now()). - Save(ctx) - if err != nil { - return nil, userErrorConverter.convert(err) - } - return convertEntUserToModelUser(u), nil -} - -func convertEntUserToModelUser(user *ent.User) *User { - if user == nil { - return nil - } - return &User{ - ID: user.ID, - Name: user.Name, - DisplayName: user.DisplayName, - AccountManager: user.AccountManager, - CreatedAt: user.CreatedAt, - UpdatedAt: user.UpdatedAt, - DeletedAt: nulltime.FromTime(user.DeletedAt).Time, - } -} diff --git a/internal/model/user_impl_test.go b/internal/model/user_test.go similarity index 93% rename from internal/model/user_impl_test.go rename to internal/model/user_test.go index f9dfefb0..1339a333 100644 --- a/internal/model/user_impl_test.go +++ b/internal/model/user_test.go @@ -7,6 +7,8 @@ import ( "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" "github.com/stretchr/testify/require" + "github.com/traPtitech/Jomon/internal/nulltime" + "github.com/traPtitech/Jomon/internal/service" "github.com/traPtitech/Jomon/internal/testutil" "github.com/traPtitech/Jomon/internal/testutil/random" ) @@ -43,10 +45,10 @@ func TestEntRepository_GetUsers(t *testing.T) { require.Len(t, got, 2) opts := testutil.ApproxEqualOptions() opts = append(opts, - cmpopts.SortSlices(func(l, r *User) bool { + cmpopts.SortSlices(func(l, r *service.User) bool { return l.ID.ID() < r.ID.ID() })) - exp := []*User{user1, user2} + exp := []*service.User{user1, user2} testutil.RequireEqual(t, exp, got, opts...) }) } @@ -68,14 +70,14 @@ func TestEntRepository_CreateUser(t *testing.T) { user, err := repo.CreateUser(ctx, name, dn, accountManager) require.NoError(t, err) opts := testutil.ApproxEqualOptions() - opts = append(opts, cmpopts.IgnoreFields(User{}, "ID")) - exp := &User{ + opts = append(opts, cmpopts.IgnoreFields(service.User{}, "ID")) + exp := &service.User{ Name: name, DisplayName: dn, AccountManager: accountManager, CreatedAt: time.Now(), UpdatedAt: time.Now(), - DeletedAt: time.Time{}, + DeletedAt: nulltime.NullTime{}, } testutil.RequireEqual(t, exp, user, opts...) }) @@ -182,13 +184,14 @@ func TestEntRepository_UpdateUser(t *testing.T) { got, err := repo.UpdateUser(ctx, user.ID, uname, udn, uaccountManager) require.NoError(t, err) opts := testutil.ApproxEqualOptions() - exp := &User{ + exp := &service.User{ ID: user.ID, Name: uname, DisplayName: udn, AccountManager: uaccountManager, CreatedAt: user.CreatedAt, UpdatedAt: time.Now(), + DeletedAt: nulltime.NullTime{}, } testutil.RequireEqual(t, exp, got, opts...) }) diff --git a/internal/router/account_manager.go b/internal/router/account_manager.go index a387e11a..f4d5fc4f 100644 --- a/internal/router/account_manager.go +++ b/internal/router/account_manager.go @@ -7,7 +7,6 @@ import ( "github.com/labstack/echo/v5" "github.com/samber/lo" "github.com/traPtitech/Jomon/internal/logging" - "github.com/traPtitech/Jomon/internal/model" "github.com/traPtitech/Jomon/internal/service" "go.uber.org/zap" ) @@ -21,7 +20,7 @@ func (h Handlers) GetAccountManagers(c *echo.Context) error { return err } - res := lo.Map(accountManagers, func(accountManager *model.AccountManager, _ int) *uuid.UUID { + res := lo.Map(accountManagers, func(accountManager *service.AccountManager, _ int) *uuid.UUID { return &accountManager.ID }) diff --git a/internal/router/account_manager_test.go b/internal/router/account_manager_test.go index 78e959bf..98100588 100644 --- a/internal/router/account_manager_test.go +++ b/internal/router/account_manager_test.go @@ -11,7 +11,6 @@ import ( "github.com/google/uuid" "github.com/labstack/echo/v5" "github.com/stretchr/testify/require" - "github.com/traPtitech/Jomon/internal/model" "github.com/traPtitech/Jomon/internal/service" "github.com/traPtitech/Jomon/internal/testutil" "go.uber.org/mock/gomock" @@ -25,11 +24,11 @@ func TestHandler_GetAccountManagers(t *testing.T) { ctx := testutil.NewContext(t) ctrl := gomock.NewController(t) - accountManager := &model.AccountManager{ + accountManager := &service.AccountManager{ ID: uuid.New(), } - accountManagers := []*model.AccountManager{ + accountManagers := []*service.AccountManager{ accountManager, } @@ -59,7 +58,7 @@ func TestHandler_GetAccountManagers(t *testing.T) { t.Parallel() ctx := testutil.NewContext(t) ctrl := gomock.NewController(t) - var accountManagers []*model.AccountManager + var accountManagers []*service.AccountManager e := echo.New() req := httptest.NewRequestWithContext(ctx, http.MethodGet, "/api/account-managers", nil) diff --git a/internal/router/application.go b/internal/router/application.go index e5d3d964..359420cd 100644 --- a/internal/router/application.go +++ b/internal/router/application.go @@ -11,7 +11,6 @@ import ( "github.com/labstack/echo/v5" "github.com/samber/lo" "github.com/traPtitech/Jomon/internal/logging" - "github.com/traPtitech/Jomon/internal/model" "github.com/traPtitech/Jomon/internal/nulltime" "github.com/traPtitech/Jomon/internal/service" "go.uber.org/zap" @@ -57,7 +56,7 @@ type PutApplication struct { type ApplicationResponse struct { ID uuid.UUID `json:"id"` - Status model.Status `json:"status"` + Status service.Status `json:"status"` CreatedAt time.Time `json:"created_at"` UpdatedAt time.Time `json:"updated_at"` CreatedBy uuid.UUID `json:"created_by"` @@ -86,21 +85,21 @@ type CommentDetail struct { } type PutStatus struct { - Status model.Status `json:"status"` - Comment string `json:"comment"` + Status service.Status `json:"status"` + Comment string `json:"comment"` } type StatusResponseOverview struct { - CreatedBy uuid.UUID `json:"created_by"` - Status model.Status `json:"status"` - CreatedAt time.Time `json:"created_at"` + CreatedBy uuid.UUID `json:"created_by"` + Status service.Status `json:"status"` + CreatedAt time.Time `json:"created_at"` } type StatusResponse struct { - CreatedBy uuid.UUID `json:"created_by"` - Status model.Status `json:"status"` - Comment CommentDetail `json:"comment"` - CreatedAt time.Time `json:"created_at"` + CreatedBy uuid.UUID `json:"created_by"` + Status service.Status `json:"status"` + Comment CommentDetail `json:"comment"` + CreatedAt time.Time `json:"created_at"` } type Target struct { @@ -208,7 +207,7 @@ func (h Handlers) GetApplications(c *echo.Context) error { } createdBy = u } - query := model.ApplicationQuery{ + query := service.ApplicationQuery{ Sort: sort, Target: target, Status: ss, @@ -228,8 +227,8 @@ func (h Handlers) GetApplications(c *echo.Context) error { applications := lo.Map( modelapplications, - func(application *model.ApplicationResponse, _ int) *ApplicationResponse { - restags := lo.Map(application.Tags, func(tag *model.Tag, _ int) *TagResponse { + func(application *service.ApplicationResponse, _ int) *ApplicationResponse { + restags := lo.Map(application.Tags, func(tag *service.Tag, _ int) *TagResponse { return &TagResponse{ ID: tag.ID, Name: tag.Name, @@ -240,12 +239,12 @@ func (h Handlers) GetApplications(c *echo.Context) error { restargets := lo.Map( application.Targets, - func(target *model.ApplicationTargetDetail, _ int) *TargetOverview { + func(target *service.ApplicationTargetDetail, _ int) *TargetOverview { return &TargetOverview{ ID: target.ID, Target: target.Target, Amount: target.Amount, - PaidAt: nulltime.FromTime(&target.PaidAt), + PaidAt: target.PaidAt, CreatedAt: target.CreatedAt, } }, @@ -278,7 +277,7 @@ func (h Handlers) PostApplication(c *echo.Context) error { ctx := c.Request().Context() logger := logging.GetLogger(ctx) - tags := []*model.Tag{} + tags := []*service.Tag{} for _, tagID := range req.Tags { tag, err := h.Repository.GetTag(ctx, tagID) if err != nil { @@ -286,8 +285,8 @@ func (h Handlers) PostApplication(c *echo.Context) error { } tags = append(tags, tag) } - targets := lo.Map(req.Targets, func(target *Target, _ int) *model.ApplicationTarget { - return &model.ApplicationTarget{ + targets := lo.Map(req.Targets, func(target *Target, _ int) *service.ApplicationTarget { + return &service.ApplicationTarget{ Target: target.Target, Amount: target.Amount, } @@ -301,17 +300,17 @@ func (h Handlers) PostApplication(c *echo.Context) error { } restargets := lo.Map( application.Targets, - func(target *model.ApplicationTargetDetail, _ int) *TargetOverview { + func(target *service.ApplicationTargetDetail, _ int) *TargetOverview { return &TargetOverview{ ID: target.ID, Target: target.Target, Amount: target.Amount, - PaidAt: nulltime.FromTime(&target.PaidAt), + PaidAt: target.PaidAt, CreatedAt: target.CreatedAt, } }, ) - restags := lo.Map(application.Tags, func(tag *model.Tag, _ int) *TagResponse { + restags := lo.Map(application.Tags, func(tag *service.Tag, _ int) *TagResponse { return &TagResponse{ ID: tag.ID, Name: tag.Name, @@ -321,7 +320,7 @@ func (h Handlers) PostApplication(c *echo.Context) error { }) comments := lo.Map( application.Comments, - func(comment *model.Comment, _ int) *CommentDetail { + func(comment *service.Comment, _ int) *CommentDetail { return &CommentDetail{ ID: comment.ID, User: comment.User, @@ -333,7 +332,7 @@ func (h Handlers) PostApplication(c *echo.Context) error { ) statuses := lo.Map( application.Statuses, - func(status *model.ApplicationStatus, _ int) *StatusResponseOverview { + func(status *service.ApplicationStatus, _ int) *StatusResponseOverview { return &StatusResponseOverview{ Status: status.Status, CreatedAt: status.CreatedAt, @@ -389,17 +388,17 @@ func (h Handlers) GetApplication(c *echo.Context) error { } restargets := lo.Map( application.Targets, - func(target *model.ApplicationTargetDetail, _ int) *TargetOverview { + func(target *service.ApplicationTargetDetail, _ int) *TargetOverview { return &TargetOverview{ ID: target.ID, Target: target.Target, Amount: target.Amount, - PaidAt: nulltime.FromTime(&target.PaidAt), + PaidAt: target.PaidAt, CreatedAt: target.CreatedAt, } }, ) - restags := lo.Map(application.Tags, func(tag *model.Tag, _ int) *TagResponse { + restags := lo.Map(application.Tags, func(tag *service.Tag, _ int) *TagResponse { return &TagResponse{ ID: tag.ID, Name: tag.Name, @@ -408,7 +407,7 @@ func (h Handlers) GetApplication(c *echo.Context) error { } }) - comments := lo.Map(modelcomments, func(modelcomment *model.Comment, _ int) *CommentDetail { + comments := lo.Map(modelcomments, func(modelcomment *service.Comment, _ int) *CommentDetail { return &CommentDetail{ ID: modelcomment.ID, User: modelcomment.User, @@ -419,7 +418,7 @@ func (h Handlers) GetApplication(c *echo.Context) error { }) statuses := lo.Map( application.Statuses, - func(status *model.ApplicationStatus, _ int) *StatusResponseOverview { + func(status *service.ApplicationStatus, _ int) *StatusResponseOverview { return &StatusResponseOverview{ CreatedBy: status.CreatedBy, Status: status.Status, @@ -479,7 +478,7 @@ func (h Handlers) PutApplication(c *echo.Context) error { return service.NewBadInputError("failed to get application from request"). WithInternal(err) } - tags := []*model.Tag{} + tags := []*service.Tag{} for _, tagID := range req.Tags { tag, err := h.Repository.GetTag(ctx, tagID) if err != nil { @@ -488,8 +487,8 @@ func (h Handlers) PutApplication(c *echo.Context) error { } tags = append(tags, tag) } - targets := lo.Map(req.Targets, func(target *Target, _ int) *model.ApplicationTarget { - return &model.ApplicationTarget{ + targets := lo.Map(req.Targets, func(target *Target, _ int) *service.ApplicationTarget { + return &service.ApplicationTarget{ Target: target.Target, Amount: target.Amount, } @@ -501,7 +500,7 @@ func (h Handlers) PutApplication(c *echo.Context) error { logger.Error("failed to update application in repository", zap.Error(err)) return err } - restags := lo.Map(application.Tags, func(tag *model.Tag, _ int) *TagResponse { + restags := lo.Map(application.Tags, func(tag *service.Tag, _ int) *TagResponse { return &TagResponse{ ID: tag.ID, Name: tag.Name, @@ -512,18 +511,18 @@ func (h Handlers) PutApplication(c *echo.Context) error { restargets := lo.Map( application.Targets, - func(target *model.ApplicationTargetDetail, _ int) *TargetOverview { + func(target *service.ApplicationTargetDetail, _ int) *TargetOverview { return &TargetOverview{ ID: target.ID, Target: target.Target, Amount: target.Amount, - PaidAt: nulltime.FromTime(&target.PaidAt), + PaidAt: target.PaidAt, CreatedAt: target.CreatedAt, } }, ) - comments := lo.Map(application.Comments, func(c *model.Comment, _ int) *CommentDetail { + comments := lo.Map(application.Comments, func(c *service.Comment, _ int) *CommentDetail { return &CommentDetail{ ID: c.ID, User: c.User, @@ -534,7 +533,7 @@ func (h Handlers) PutApplication(c *echo.Context) error { }) statuses := lo.Map( application.Statuses, - func(status *model.ApplicationStatus, _ int) *StatusResponseOverview { + func(status *service.ApplicationStatus, _ int) *StatusResponseOverview { return &StatusResponseOverview{ CreatedBy: status.CreatedBy, Status: status.Status, @@ -654,7 +653,7 @@ func (h Handlers) PutStatus(c *echo.Context) error { application.Status.String(), req.Status.String()) return service.NewBadInputError(message) } - if req.Status == model.Submitted && application.Status == model.Accepted { + if req.Status == service.Submitted && application.Status == service.Accepted { targets, err := h.Repository.GetApplicationTargets(ctx, applicationID) if err != nil { logger.Error("failed to get application targets from repository", zap.Error(err)) @@ -662,8 +661,8 @@ func (h Handlers) PutStatus(c *echo.Context) error { } paid := lo.Reduce( targets, - func(p bool, target *model.ApplicationTargetDetail, _ int) bool { - return p || !target.PaidAt.IsZero() + func(p bool, target *service.ApplicationTargetDetail, _ int) bool { + return p || target.PaidAt.Valid }, false, ) @@ -721,29 +720,29 @@ func (h Handlers) PutStatus(c *echo.Context) error { return c.JSON(http.StatusOK, res) } -func IsAbleNoCommentChangeStatus(status, latestStatus model.Status) bool { +func IsAbleNoCommentChangeStatus(status, latestStatus service.Status) bool { switch latestStatus { - case model.Submitted: - return status != model.FixRequired && status != model.Rejected - case model.Accepted: - return status != model.Submitted - case model.FixRequired, model.Completed, model.Rejected: + case service.Submitted: + return status != service.FixRequired && status != service.Rejected + case service.Accepted: + return status != service.Submitted + case service.FixRequired, service.Completed, service.Rejected: return true } // the switch above performs exhaustive check panic("unreachable") } -func IsAbleCreatorChangeStatus(status, latestStatus model.Status) bool { - return status == model.Submitted && latestStatus == model.FixRequired +func IsAbleCreatorChangeStatus(status, latestStatus service.Status) bool { + return status == service.Submitted && latestStatus == service.FixRequired } -func IsAbleAccountManagerChangeState(status, latestStatus model.Status) bool { - return status == model.Rejected && latestStatus == model.Submitted || - status == model.Submitted && latestStatus == model.FixRequired || - status == model.Accepted && latestStatus == model.Submitted || - status == model.Submitted && latestStatus == model.Accepted || - status == model.FixRequired && latestStatus == model.Submitted +func IsAbleAccountManagerChangeState(status, latestStatus service.Status) bool { + return status == service.Rejected && latestStatus == service.Submitted || + status == service.Submitted && latestStatus == service.FixRequired || + status == service.Accepted && latestStatus == service.Submitted || + status == service.Submitted && latestStatus == service.Accepted || + status == service.FixRequired && latestStatus == service.Submitted } func (h Handlers) isApplicationCreator( @@ -757,7 +756,7 @@ func (h Handlers) isApplicationCreator( } func (h Handlers) filterAccountManagerOrApplicationCreator( - ctx context.Context, user *User, application *model.ApplicationDetail, + ctx context.Context, user *User, application *service.ApplicationDetail, ) *service.ForbiddenError { logger := logging.GetLogger(ctx) if user.AccountManager { diff --git a/internal/router/application_test.go b/internal/router/application_test.go index 2bb32ff4..e5a494e3 100644 --- a/internal/router/application_test.go +++ b/internal/router/application_test.go @@ -14,7 +14,6 @@ import ( "github.com/labstack/echo/v5" "github.com/samber/lo" "github.com/stretchr/testify/require" - "github.com/traPtitech/Jomon/internal/model" "github.com/traPtitech/Jomon/internal/nulltime" "github.com/traPtitech/Jomon/internal/service" "github.com/traPtitech/Jomon/internal/testutil" @@ -22,7 +21,7 @@ import ( "go.uber.org/mock/gomock" ) -func modelTagToTagOverview(t *model.Tag) *TagResponse { +func modelTagToTagOverview(t *service.Tag) *TagResponse { return &TagResponse{ ID: t.ID, Name: t.Name, @@ -32,7 +31,7 @@ func modelTagToTagOverview(t *model.Tag) *TagResponse { } func modelApplicationTargetDetailToTargetOverview( - t *model.ApplicationTargetDetail, + t *service.ApplicationTargetDetail, ) *TargetOverview { return &TargetOverview{ ID: t.ID, @@ -43,7 +42,7 @@ func modelApplicationTargetDetailToTargetOverview( } func modelApplicationStatusToStatusResponseOverview( - s *model.ApplicationStatus, + s *service.ApplicationStatus, ) *StatusResponseOverview { return &StatusResponseOverview{ CreatedBy: s.CreatedBy, @@ -52,7 +51,7 @@ func modelApplicationStatusToStatusResponseOverview( } } -func modelCommentToCommentDetail(c *model.Comment) *CommentDetail { +func modelCommentToCommentDetail(c *service.Comment) *CommentDetail { return &CommentDetail{ ID: c.ID, User: c.User, @@ -64,7 +63,7 @@ func modelCommentToCommentDetail(c *model.Comment) *CommentDetail { // FIXME: この処理はapplication.goにも書かれてある func modelApplicationDetailToApplicationResponse( - r *model.ApplicationDetail, + r *service.ApplicationDetail, ) *ApplicationDetailResponse { return &ApplicationDetailResponse{ ApplicationResponse: ApplicationResponse{ @@ -77,21 +76,21 @@ func modelApplicationDetailToApplicationResponse( UpdatedAt: r.UpdatedAt, Targets: lo.Map( r.Targets, - func(m *model.ApplicationTargetDetail, _ int) *TargetOverview { + func(m *service.ApplicationTargetDetail, _ int) *TargetOverview { return modelApplicationTargetDetailToTargetOverview(m) }, ), - Tags: lo.Map(r.Tags, func(m *model.Tag, _ int) *TagResponse { + Tags: lo.Map(r.Tags, func(m *service.Tag, _ int) *TagResponse { return modelTagToTagOverview(m) }), }, Statuses: lo.Map( r.Statuses, - func(m *model.ApplicationStatus, _ int) *StatusResponseOverview { + func(m *service.ApplicationStatus, _ int) *StatusResponseOverview { return modelApplicationStatusToStatusResponseOverview(m) }, ), - Comments: lo.Map(r.Comments, func(m *model.Comment, _ int) *CommentDetail { + Comments: lo.Map(r.Comments, func(m *service.Comment, _ int) *CommentDetail { return modelCommentToCommentDetail(m) }), Files: r.Files, @@ -108,31 +107,31 @@ func TestHandlers_GetApplications(t *testing.T) { date1 := time.Now() date2 := date1.Add(time.Hour) - application1 := &model.ApplicationResponse{ + application1 := &service.ApplicationResponse{ ID: uuid.New(), - Status: model.Submitted, + Status: service.Submitted, CreatedBy: uuid.New(), Title: random.AlphaNumeric(t, 20), Content: random.AlphaNumeric(t, 50), CreatedAt: date1, UpdatedAt: date1, - Tags: []*model.Tag{}, - Targets: []*model.ApplicationTargetDetail{}, - Statuses: []*model.ApplicationStatus{}, + Tags: []*service.Tag{}, + Targets: []*service.ApplicationTargetDetail{}, + Statuses: []*service.ApplicationStatus{}, } - application2 := &model.ApplicationResponse{ + application2 := &service.ApplicationResponse{ ID: uuid.New(), - Status: model.Submitted, + Status: service.Submitted, CreatedBy: uuid.New(), Title: random.AlphaNumeric(t, 20), Content: random.AlphaNumeric(t, 50), CreatedAt: date2, UpdatedAt: date2, - Tags: []*model.Tag{}, - Targets: []*model.ApplicationTargetDetail{}, - Statuses: []*model.ApplicationStatus{}, + Tags: []*service.Tag{}, + Targets: []*service.ApplicationTargetDetail{}, + Statuses: []*service.ApplicationStatus{}, } - applications := []*model.ApplicationResponse{application2, application1} + applications := []*service.ApplicationResponse{application2, application1} e := echo.New() req := httptest.NewRequestWithContext(ctx, http.MethodGet, "/api/applications", nil) @@ -143,7 +142,7 @@ func TestHandlers_GetApplications(t *testing.T) { require.NoError(t, err) h.Repository.MockApplicationRepository. EXPECT(). - GetApplications(c.Request().Context(), model.ApplicationQuery{ + GetApplications(c.Request().Context(), service.ApplicationQuery{ Limit: 100, Offset: 0, }). @@ -186,7 +185,7 @@ func TestHandlers_GetApplications(t *testing.T) { ctx := testutil.NewContext(t) ctrl := gomock.NewController(t) - applications := []*model.ApplicationResponse{} + applications := []*service.ApplicationResponse{} e := echo.New() req := httptest.NewRequestWithContext(ctx, http.MethodGet, "/api/applications", nil) @@ -197,7 +196,7 @@ func TestHandlers_GetApplications(t *testing.T) { require.NoError(t, err) h.Repository.MockApplicationRepository. EXPECT(). - GetApplications(c.Request().Context(), model.ApplicationQuery{ + GetApplications(c.Request().Context(), service.ApplicationQuery{ Limit: 100, Offset: 0, }). @@ -217,19 +216,19 @@ func TestHandlers_GetApplications(t *testing.T) { ctrl := gomock.NewController(t) date1 := time.Now() - application1 := &model.ApplicationResponse{ + application1 := &service.ApplicationResponse{ ID: uuid.New(), - Status: model.Submitted, + Status: service.Submitted, CreatedBy: uuid.New(), Title: random.AlphaNumeric(t, 20), Content: random.AlphaNumeric(t, 50), CreatedAt: date1, UpdatedAt: date1, - Tags: []*model.Tag{}, - Targets: []*model.ApplicationTargetDetail{}, - Statuses: []*model.ApplicationStatus{}, + Tags: []*service.Tag{}, + Targets: []*service.ApplicationTargetDetail{}, + Statuses: []*service.ApplicationStatus{}, } - applications := []*model.ApplicationResponse{application1} + applications := []*service.ApplicationResponse{application1} e := echo.New() status := "submitted" @@ -242,7 +241,7 @@ func TestHandlers_GetApplications(t *testing.T) { require.NoError(t, err) h.Repository.MockApplicationRepository. EXPECT(). - GetApplications(c.Request().Context(), model.ApplicationQuery{ + GetApplications(c.Request().Context(), service.ApplicationQuery{ Status: &status, Limit: 100, Offset: 0, @@ -280,19 +279,19 @@ func TestHandlers_GetApplications(t *testing.T) { date2str := date1.Add(time.Hour).Format("2006-01-02") date2, err := nulltime.ParseDate(date2str) require.NoError(t, err) - application1 := &model.ApplicationResponse{ + application1 := &service.ApplicationResponse{ ID: uuid.New(), - Status: model.Submitted, + Status: service.Submitted, CreatedBy: uuid.New(), Title: random.AlphaNumeric(t, 20), Content: random.AlphaNumeric(t, 50), CreatedAt: date1, UpdatedAt: date1, - Tags: []*model.Tag{}, - Targets: []*model.ApplicationTargetDetail{}, - Statuses: []*model.ApplicationStatus{}, + Tags: []*service.Tag{}, + Targets: []*service.ApplicationTargetDetail{}, + Statuses: []*service.ApplicationStatus{}, } - applications := []*model.ApplicationResponse{application1} + applications := []*service.ApplicationResponse{application1} e := echo.New() path := fmt.Sprintf("/api/applications?until=%s", date2str) @@ -304,7 +303,7 @@ func TestHandlers_GetApplications(t *testing.T) { require.NoError(t, err) h.Repository.MockApplicationRepository. EXPECT(). - GetApplications(c.Request().Context(), model.ApplicationQuery{ + GetApplications(c.Request().Context(), service.ApplicationQuery{ Until: date2, Limit: 100, Offset: 0, @@ -342,19 +341,19 @@ func TestHandlers_GetApplications(t *testing.T) { date2str := date1.Add(-time.Hour).Format("2006-01-02") date2, err := nulltime.ParseDate(date2str) require.NoError(t, err) - application1 := &model.ApplicationResponse{ + application1 := &service.ApplicationResponse{ ID: uuid.New(), - Status: model.Submitted, + Status: service.Submitted, CreatedBy: uuid.New(), Title: random.AlphaNumeric(t, 20), Content: random.AlphaNumeric(t, 50), CreatedAt: date1, UpdatedAt: date1, - Tags: []*model.Tag{}, - Targets: []*model.ApplicationTargetDetail{}, - Statuses: []*model.ApplicationStatus{}, + Tags: []*service.Tag{}, + Targets: []*service.ApplicationTargetDetail{}, + Statuses: []*service.ApplicationStatus{}, } - applications := []*model.ApplicationResponse{application1} + applications := []*service.ApplicationResponse{application1} e := echo.New() path := fmt.Sprintf("/api/applications?since=%s", date2str) @@ -366,7 +365,7 @@ func TestHandlers_GetApplications(t *testing.T) { require.NoError(t, err) h.Repository.MockApplicationRepository. EXPECT(). - GetApplications(c.Request().Context(), model.ApplicationQuery{ + GetApplications(c.Request().Context(), service.ApplicationQuery{ Since: date2, Limit: 100, Offset: 0, @@ -400,7 +399,7 @@ func TestHandlers_GetApplications(t *testing.T) { ctrl := gomock.NewController(t) date1 := time.Now() - tag1 := model.Tag{ + tag1 := service.Tag{ ID: uuid.New(), Name: random.AlphaNumeric(t, 10), CreatedAt: date1, @@ -412,19 +411,19 @@ func TestHandlers_GetApplications(t *testing.T) { CreatedAt: tag1.CreatedAt, UpdatedAt: tag1.UpdatedAt, } - application1 := &model.ApplicationResponse{ + application1 := &service.ApplicationResponse{ ID: uuid.New(), - Status: model.Submitted, + Status: service.Submitted, CreatedBy: uuid.New(), Title: random.AlphaNumeric(t, 20), Content: random.AlphaNumeric(t, 50), CreatedAt: date1, UpdatedAt: date1, - Tags: []*model.Tag{&tag1}, - Targets: []*model.ApplicationTargetDetail{}, - Statuses: []*model.ApplicationStatus{}, + Tags: []*service.Tag{&tag1}, + Targets: []*service.ApplicationTargetDetail{}, + Statuses: []*service.ApplicationStatus{}, } - applications := []*model.ApplicationResponse{application1} + applications := []*service.ApplicationResponse{application1} e := echo.New() path := fmt.Sprintf("/api/applications?tag=%s", tag1.Name) @@ -436,7 +435,7 @@ func TestHandlers_GetApplications(t *testing.T) { require.NoError(t, err) h.Repository.MockApplicationRepository. EXPECT(). - GetApplications(c.Request().Context(), model.ApplicationQuery{ + GetApplications(c.Request().Context(), service.ApplicationQuery{ Tag: &tag1.Name, Limit: 100, Offset: 0, @@ -470,19 +469,19 @@ func TestHandlers_GetApplications(t *testing.T) { ctrl := gomock.NewController(t) date := time.Now() - application := &model.ApplicationResponse{ + application := &service.ApplicationResponse{ ID: uuid.New(), - Status: model.Submitted, + Status: service.Submitted, CreatedBy: uuid.New(), Title: random.AlphaNumeric(t, 20), Content: random.AlphaNumeric(t, 50), CreatedAt: date, UpdatedAt: date, - Tags: []*model.Tag{}, - Targets: []*model.ApplicationTargetDetail{}, - Statuses: []*model.ApplicationStatus{}, + Tags: []*service.Tag{}, + Targets: []*service.ApplicationTargetDetail{}, + Statuses: []*service.ApplicationStatus{}, } - modelApplications := []*model.ApplicationResponse{application} + modelApplications := []*service.ApplicationResponse{application} e := echo.New() path := fmt.Sprintf("/api/applications?created_by=%s", application.CreatedBy.String()) @@ -494,7 +493,7 @@ func TestHandlers_GetApplications(t *testing.T) { require.NoError(t, err) h.Repository.MockApplicationRepository. EXPECT(). - GetApplications(c.Request().Context(), model.ApplicationQuery{ + GetApplications(c.Request().Context(), service.ApplicationQuery{ Limit: 100, Offset: 0, CreatedBy: application.CreatedBy}, @@ -558,7 +557,7 @@ func TestHandlers_GetApplications(t *testing.T) { resErr := errors.New("Failed to get applications.") h.Repository.MockApplicationRepository. EXPECT(). - GetApplications(c.Request().Context(), model.ApplicationQuery{ + GetApplications(c.Request().Context(), service.ApplicationQuery{ Limit: 100, Offset: 0, }). @@ -579,23 +578,24 @@ func TestHandlers_PostApplication(t *testing.T) { ctrl := gomock.NewController(t) date := time.Now() - application := &model.ApplicationDetail{ + application := &service.ApplicationDetail{ ID: uuid.New(), - Status: model.Submitted, + Status: service.Submitted, Title: random.AlphaNumeric(t, 20), Content: random.AlphaNumeric(t, 50), CreatedAt: date, UpdatedAt: date, CreatedBy: uuid.New(), - Tags: []*model.Tag{}, - Targets: []*model.ApplicationTargetDetail{}, - Statuses: []*model.ApplicationStatus{{ + Tags: []*service.Tag{}, + Targets: []*service.ApplicationTargetDetail{}, + Statuses: []*service.ApplicationStatus{{ + ID: uuid.New(), CreatedBy: uuid.New(), - Status: model.Submitted, + Status: service.Submitted, CreatedAt: date, }}, - Comments: []*model.Comment{}, + Comments: []*service.Comment{}, Files: []uuid.UUID{}, } reqApplication := Application{ @@ -605,8 +605,8 @@ func TestHandlers_PostApplication(t *testing.T) { } reqBody, err := json.Marshal(reqApplication) require.NoError(t, err) - tags := []*model.Tag{} - targets := []*model.ApplicationTarget{} + tags := []*service.Tag{} + targets := []*service.ApplicationTarget{} e := echo.New() req := httptest.NewRequestWithContext( @@ -642,30 +642,30 @@ func TestHandlers_PostApplication(t *testing.T) { ctrl := gomock.NewController(t) date := time.Now() - tag := &model.Tag{ + tag := &service.Tag{ ID: uuid.New(), Name: random.AlphaNumeric(t, 20), CreatedAt: date, UpdatedAt: date, } - tags := []*model.Tag{tag} - application := &model.ApplicationDetail{ + tags := []*service.Tag{tag} + application := &service.ApplicationDetail{ ID: uuid.New(), - Status: model.Submitted, + Status: service.Submitted, Title: random.AlphaNumeric(t, 20), Content: random.AlphaNumeric(t, 50), CreatedAt: date, UpdatedAt: date, CreatedBy: uuid.New(), Tags: tags, - Targets: []*model.ApplicationTargetDetail{}, - Statuses: []*model.ApplicationStatus{{ + Targets: []*service.ApplicationTargetDetail{}, + Statuses: []*service.ApplicationStatus{{ ID: uuid.New(), CreatedBy: uuid.New(), - Status: model.Submitted, + Status: service.Submitted, CreatedAt: date, }}, - Comments: []*model.Comment{}, + Comments: []*service.Comment{}, Files: []uuid.UUID{}, } reqApplication := Application{ @@ -676,7 +676,7 @@ func TestHandlers_PostApplication(t *testing.T) { } reqBody, err := json.Marshal(reqApplication) require.NoError(t, err) - targets := []*model.ApplicationTarget{} + targets := []*service.ApplicationTarget{} e := echo.New() req := httptest.NewRequestWithContext( @@ -716,33 +716,33 @@ func TestHandlers_PostApplication(t *testing.T) { ctrl := gomock.NewController(t) date := time.Now() - target := &model.ApplicationTarget{ + target := &service.ApplicationTarget{ Target: uuid.New(), Amount: random.Numeric(t, 1000000), } - tgd := &model.ApplicationTargetDetail{ + tgd := &service.ApplicationTargetDetail{ ID: uuid.New(), Target: target.Target, Amount: target.Amount, CreatedAt: date, } - application := &model.ApplicationDetail{ + application := &service.ApplicationDetail{ ID: uuid.New(), - Status: model.Submitted, + Status: service.Submitted, Title: random.AlphaNumeric(t, 20), Content: random.AlphaNumeric(t, 50), CreatedAt: date, UpdatedAt: date, CreatedBy: uuid.New(), - Tags: []*model.Tag{}, - Targets: []*model.ApplicationTargetDetail{tgd}, - Statuses: []*model.ApplicationStatus{{ + Tags: []*service.Tag{}, + Targets: []*service.ApplicationTargetDetail{tgd}, + Statuses: []*service.ApplicationStatus{{ ID: uuid.New(), CreatedBy: uuid.New(), - Status: model.Submitted, + Status: service.Submitted, CreatedAt: date, }}, - Comments: []*model.Comment{}, + Comments: []*service.Comment{}, Files: []uuid.UUID{}, } tg := &Target{ @@ -757,7 +757,7 @@ func TestHandlers_PostApplication(t *testing.T) { } reqBody, err := json.Marshal(reqApplication) require.NoError(t, err) - tags := []*model.Tag{} + tags := []*service.Tag{} e := echo.New() req := httptest.NewRequestWithContext( @@ -773,7 +773,7 @@ func TestHandlers_PostApplication(t *testing.T) { CreateApplication( c.Request().Context(), reqApplication.Title, reqApplication.Content, - tags, []*model.ApplicationTarget{target}, + tags, []*service.ApplicationTarget{target}, reqApplication.CreatedBy). Return(application, nil) @@ -793,9 +793,9 @@ func TestHandlers_PostApplication(t *testing.T) { ctrl := gomock.NewController(t) date := time.Now() - application := &model.ApplicationDetail{ + application := &service.ApplicationDetail{ ID: uuid.New(), - Status: model.Submitted, + Status: service.Submitted, Title: random.AlphaNumeric(t, 20), Content: random.AlphaNumeric(t, 50), CreatedAt: date, @@ -839,9 +839,9 @@ func TestHandlers_PostApplication(t *testing.T) { ctrl := gomock.NewController(t) date := time.Now() - application := &model.ApplicationDetail{ + application := &service.ApplicationDetail{ ID: uuid.New(), - Status: model.Submitted, + Status: service.Submitted, Title: random.AlphaNumeric(t, 20), Content: random.AlphaNumeric(t, 50), CreatedAt: date, @@ -855,8 +855,8 @@ func TestHandlers_PostApplication(t *testing.T) { } reqBody, err := json.Marshal(reqApplication) require.NoError(t, err) - tags := []*model.Tag{} - targets := []*model.ApplicationTarget{} + tags := []*service.Tag{} + targets := []*service.ApplicationTarget{} e := echo.New() req := httptest.NewRequestWithContext( @@ -893,23 +893,23 @@ func TestHandlers_GetApplication(t *testing.T) { ctrl := gomock.NewController(t) date := time.Now() - application := &model.ApplicationDetail{ + application := &service.ApplicationDetail{ ID: uuid.New(), - Status: model.Submitted, + Status: service.Submitted, CreatedBy: uuid.New(), Title: random.AlphaNumeric(t, 20), Content: random.AlphaNumeric(t, 50), CreatedAt: date, UpdatedAt: date, - Tags: []*model.Tag{}, - Targets: []*model.ApplicationTargetDetail{}, - Statuses: []*model.ApplicationStatus{{ + Tags: []*service.Tag{}, + Targets: []*service.ApplicationTargetDetail{}, + Statuses: []*service.ApplicationStatus{{ ID: uuid.New(), - Status: model.Submitted, + Status: service.Submitted, CreatedAt: date, CreatedBy: uuid.New(), }}, - Comments: []*model.Comment{}, + Comments: []*service.Comment{}, Files: []uuid.UUID{}, } @@ -950,40 +950,40 @@ func TestHandlers_GetApplication(t *testing.T) { ctrl := gomock.NewController(t) date := time.Now() - application := &model.ApplicationDetail{ + application := &service.ApplicationDetail{ ID: uuid.New(), - Status: model.Submitted, + Status: service.Submitted, CreatedBy: uuid.New(), Title: random.AlphaNumeric(t, 20), Content: random.AlphaNumeric(t, 50), CreatedAt: date, UpdatedAt: date, - Tags: []*model.Tag{}, - Targets: []*model.ApplicationTargetDetail{}, - Statuses: []*model.ApplicationStatus{{ + Tags: []*service.Tag{}, + Targets: []*service.ApplicationTargetDetail{}, + Statuses: []*service.ApplicationStatus{{ ID: uuid.New(), - Status: model.Submitted, + Status: service.Submitted, CreatedAt: date, CreatedBy: uuid.New(), }}, - Comments: []*model.Comment{}, + Comments: []*service.Comment{}, Files: []uuid.UUID{}, } - comment1 := &model.Comment{ + comment1 := &service.Comment{ ID: uuid.New(), User: application.CreatedBy, Comment: random.AlphaNumeric(t, 100), CreatedAt: date, UpdatedAt: date, } - comment2 := &model.Comment{ + comment2 := &service.Comment{ ID: uuid.New(), User: application.CreatedBy, Comment: random.AlphaNumeric(t, 100), CreatedAt: date, UpdatedAt: date, } - comments := []*model.Comment{comment1, comment2} + comments := []*service.Comment{comment1, comment2} e := echo.New() path := fmt.Sprintf("/api/applications/%s", application.ID.String()) @@ -1013,7 +1013,7 @@ func TestHandlers_GetApplication(t *testing.T) { require.NoError(t, err) opts := testutil.ApproxEqualOptions() exp := modelApplicationDetailToApplicationResponse(application) - exp.Comments = lo.Map(comments, func(c *model.Comment, _ int) *CommentDetail { + exp.Comments = lo.Map(comments, func(c *service.Comment, _ int) *CommentDetail { return modelCommentToCommentDetail(c) }) testutil.RequireEqual(t, exp, got, opts...) @@ -1025,30 +1025,30 @@ func TestHandlers_GetApplication(t *testing.T) { ctrl := gomock.NewController(t) date := time.Now() - target := &model.ApplicationTargetDetail{ + target := &service.ApplicationTargetDetail{ ID: uuid.New(), Target: uuid.New(), Amount: random.Numeric(t, 1000000), - PaidAt: time.Time{}, + PaidAt: nulltime.NullTime{}, CreatedAt: date, } - application := &model.ApplicationDetail{ + application := &service.ApplicationDetail{ ID: uuid.New(), - Status: model.Submitted, + Status: service.Submitted, CreatedBy: uuid.New(), Title: random.AlphaNumeric(t, 20), Content: random.AlphaNumeric(t, 50), CreatedAt: date, UpdatedAt: date, - Tags: []*model.Tag{}, - Targets: []*model.ApplicationTargetDetail{target}, - Statuses: []*model.ApplicationStatus{{ + Tags: []*service.Tag{}, + Targets: []*service.ApplicationTargetDetail{target}, + Statuses: []*service.ApplicationStatus{{ ID: uuid.New(), - Status: model.Submitted, + Status: service.Submitted, CreatedAt: date, CreatedBy: uuid.New(), }}, - Comments: []*model.Comment{}, + Comments: []*service.Comment{}, Files: []uuid.UUID{}, } @@ -1175,23 +1175,23 @@ func TestHandlers_PutApplication(t *testing.T) { accessUser := makeUser(t, false) user := userFromModelUser(*accessUser) date := time.Now() - application := &model.ApplicationDetail{ + application := &service.ApplicationDetail{ ID: uuid.New(), - Status: model.Submitted, + Status: service.Submitted, CreatedBy: user.ID, Title: random.AlphaNumeric(t, 20), Content: random.AlphaNumeric(t, 50), CreatedAt: date, UpdatedAt: date, - Tags: []*model.Tag{}, - Targets: []*model.ApplicationTargetDetail{}, - Statuses: []*model.ApplicationStatus{{ + Tags: []*service.Tag{}, + Targets: []*service.ApplicationTargetDetail{}, + Statuses: []*service.ApplicationStatus{{ ID: uuid.New(), - Status: model.Submitted, + Status: service.Submitted, CreatedAt: date, CreatedBy: user.ID, }}, - Comments: []*model.Comment{}, + Comments: []*service.Comment{}, Files: []uuid.UUID{}, } reqApplication := PutApplication{ @@ -1202,8 +1202,8 @@ func TestHandlers_PutApplication(t *testing.T) { } reqBody, err := json.Marshal(reqApplication) require.NoError(t, err) - tags := []*model.Tag{} - updateApplication := &model.ApplicationDetail{ + tags := []*service.Tag{} + updateApplication := &service.ApplicationDetail{ ID: application.ID, Status: application.Status, CreatedBy: application.CreatedBy, @@ -1212,7 +1212,7 @@ func TestHandlers_PutApplication(t *testing.T) { Title: reqApplication.Title, Content: reqApplication.Content, Tags: tags, - Targets: []*model.ApplicationTargetDetail{}, + Targets: []*service.ApplicationTargetDetail{}, Statuses: application.Statuses, Comments: application.Comments, Files: application.Files, @@ -1232,8 +1232,8 @@ func TestHandlers_PutApplication(t *testing.T) { targets := lo.Map( updateApplication.Targets, - func(t *model.ApplicationTargetDetail, _ int) *model.ApplicationTarget { - return &model.ApplicationTarget{ + func(t *service.ApplicationTargetDetail, _ int) *service.ApplicationTarget { + return &service.ApplicationTarget{ Target: t.Target, Amount: t.Amount, } @@ -1272,38 +1272,38 @@ func TestHandlers_PutApplication(t *testing.T) { accessUser := makeUser(t, false) user := userFromModelUser(*accessUser) date := time.Now() - application := &model.ApplicationDetail{ + application := &service.ApplicationDetail{ ID: uuid.New(), - Status: model.Submitted, + Status: service.Submitted, CreatedBy: user.ID, Title: random.AlphaNumeric(t, 20), Content: random.AlphaNumeric(t, 50), CreatedAt: date, UpdatedAt: date, - Tags: []*model.Tag{}, - Targets: []*model.ApplicationTargetDetail{}, - Statuses: []*model.ApplicationStatus{{ + Tags: []*service.Tag{}, + Targets: []*service.ApplicationTargetDetail{}, + Statuses: []*service.ApplicationStatus{{ ID: uuid.New(), - Status: model.Submitted, + Status: service.Submitted, CreatedAt: date, CreatedBy: user.ID, }}, - Comments: []*model.Comment{}, + Comments: []*service.Comment{}, Files: []uuid.UUID{}, } - tag1 := &model.Tag{ + tag1 := &service.Tag{ ID: uuid.New(), Name: random.AlphaNumeric(t, 20), CreatedAt: date, UpdatedAt: date, } - tag2 := &model.Tag{ + tag2 := &service.Tag{ ID: uuid.New(), Name: random.AlphaNumeric(t, 20), CreatedAt: date, UpdatedAt: date, } - tags := []*model.Tag{tag1, tag2} + tags := []*service.Tag{tag1, tag2} reqApplication := PutApplication{ Title: random.AlphaNumeric(t, 30), Content: random.AlphaNumeric(t, 50), @@ -1312,7 +1312,7 @@ func TestHandlers_PutApplication(t *testing.T) { } reqBody, err := json.Marshal(reqApplication) require.NoError(t, err) - updateApplication := &model.ApplicationDetail{ + updateApplication := &service.ApplicationDetail{ ID: application.ID, Status: application.Status, CreatedBy: application.CreatedBy, @@ -1321,7 +1321,7 @@ func TestHandlers_PutApplication(t *testing.T) { CreatedAt: application.CreatedAt, UpdatedAt: time.Now(), Tags: tags, - Targets: []*model.ApplicationTargetDetail{}, + Targets: []*service.ApplicationTargetDetail{}, Statuses: application.Statuses, Comments: application.Comments, Files: application.Files, @@ -1329,8 +1329,8 @@ func TestHandlers_PutApplication(t *testing.T) { targets := lo.Map( updateApplication.Targets, - func(t *model.ApplicationTargetDetail, _ int) *model.ApplicationTarget { - return &model.ApplicationTarget{ + func(t *service.ApplicationTargetDetail, _ int) *service.ApplicationTarget { + return &service.ApplicationTarget{ Target: t.Target, Amount: t.Amount, } @@ -1389,40 +1389,40 @@ func TestHandlers_PutApplication(t *testing.T) { accessUser := makeUser(t, false) user := userFromModelUser(*accessUser) date := time.Now() - application := &model.ApplicationDetail{ + application := &service.ApplicationDetail{ ID: uuid.New(), - Status: model.Submitted, + Status: service.Submitted, CreatedBy: user.ID, Title: random.AlphaNumeric(t, 20), Content: random.AlphaNumeric(t, 50), CreatedAt: date, UpdatedAt: date, - Tags: []*model.Tag{}, - Targets: []*model.ApplicationTargetDetail{}, - Statuses: []*model.ApplicationStatus{{ + Tags: []*service.Tag{}, + Targets: []*service.ApplicationTargetDetail{}, + Statuses: []*service.ApplicationStatus{{ ID: uuid.New(), - Status: model.Submitted, + Status: service.Submitted, CreatedAt: date, CreatedBy: user.ID, }}, - Comments: []*model.Comment{}, + Comments: []*service.Comment{}, Files: []uuid.UUID{}, } - target1 := &model.ApplicationTargetDetail{ + target1 := &service.ApplicationTargetDetail{ ID: uuid.New(), Target: uuid.New(), Amount: random.Numeric(t, 100000), - PaidAt: time.Time{}, + PaidAt: nulltime.NullTime{}, CreatedAt: date, } - target2 := &model.ApplicationTargetDetail{ + target2 := &service.ApplicationTargetDetail{ ID: uuid.New(), Target: uuid.New(), Amount: random.Numeric(t, 100000), - PaidAt: time.Time{}, + PaidAt: nulltime.NullTime{}, CreatedAt: date, } - targetDetails := []*model.ApplicationTargetDetail{target1, target2} + targetDetails := []*service.ApplicationTargetDetail{target1, target2} reqApplication := PutApplication{ Title: random.AlphaNumeric(t, 30), Content: random.AlphaNumeric(t, 50), @@ -1434,8 +1434,8 @@ func TestHandlers_PutApplication(t *testing.T) { } reqBody, err := json.Marshal(reqApplication) require.NoError(t, err) - tags := []*model.Tag{} - updateApplication := &model.ApplicationDetail{ + tags := []*service.Tag{} + updateApplication := &service.ApplicationDetail{ ID: application.ID, Status: application.Status, CreatedBy: application.CreatedBy, @@ -1464,8 +1464,8 @@ func TestHandlers_PutApplication(t *testing.T) { targets := lo.Map( updateApplication.Targets, - func(t *model.ApplicationTargetDetail, _ int) *model.ApplicationTarget { - return &model.ApplicationTarget{ + func(t *service.ApplicationTargetDetail, _ int) *service.ApplicationTarget { + return &service.ApplicationTarget{ Target: t.Target, Amount: t.Amount, } @@ -1504,23 +1504,23 @@ func TestHandlers_PutApplication(t *testing.T) { accessUser := makeUser(t, false) user := userFromModelUser(*accessUser) date := time.Now() - application := &model.ApplicationDetail{ + application := &service.ApplicationDetail{ ID: uuid.New(), - Status: model.Submitted, + Status: service.Submitted, CreatedBy: user.ID, Title: random.AlphaNumeric(t, 20), Content: random.AlphaNumeric(t, 50), CreatedAt: date, UpdatedAt: date, - Tags: []*model.Tag{}, - Targets: []*model.ApplicationTargetDetail{}, - Statuses: []*model.ApplicationStatus{{ + Tags: []*service.Tag{}, + Targets: []*service.ApplicationTargetDetail{}, + Statuses: []*service.ApplicationStatus{{ ID: uuid.New(), - Status: model.Submitted, + Status: service.Submitted, CreatedAt: date, CreatedBy: user.ID, }}, - Comments: []*model.Comment{}, + Comments: []*service.Comment{}, Files: []uuid.UUID{}, } reqApplication := PutApplication{ @@ -1531,23 +1531,23 @@ func TestHandlers_PutApplication(t *testing.T) { } reqBody, err := json.Marshal(reqApplication) require.NoError(t, err) - tags := []*model.Tag{} - comment1 := &model.Comment{ + tags := []*service.Tag{} + comment1 := &service.Comment{ ID: uuid.New(), User: application.CreatedBy, Comment: random.AlphaNumeric(t, 100), CreatedAt: date, UpdatedAt: date, } - comment2 := &model.Comment{ + comment2 := &service.Comment{ ID: uuid.New(), User: application.CreatedBy, Comment: random.AlphaNumeric(t, 100), CreatedAt: date, UpdatedAt: date, } - comments := []*model.Comment{comment1, comment2} - updateApplication := &model.ApplicationDetail{ + comments := []*service.Comment{comment1, comment2} + updateApplication := &service.ApplicationDetail{ ID: application.ID, Status: application.Status, CreatedBy: application.CreatedBy, @@ -1556,7 +1556,7 @@ func TestHandlers_PutApplication(t *testing.T) { CreatedAt: application.CreatedAt, UpdatedAt: time.Now(), Tags: tags, - Targets: []*model.ApplicationTargetDetail{}, + Targets: []*service.ApplicationTargetDetail{}, Statuses: application.Statuses, Comments: comments, Files: application.Files, @@ -1576,8 +1576,8 @@ func TestHandlers_PutApplication(t *testing.T) { targets := lo.Map( updateApplication.Targets, - func(t *model.ApplicationTargetDetail, _ int) *model.ApplicationTarget { - return &model.ApplicationTarget{ + func(t *service.ApplicationTargetDetail, _ int) *service.ApplicationTarget { + return &service.ApplicationTarget{ Target: t.Target, Amount: t.Amount, } @@ -1706,26 +1706,26 @@ func TestHandlers_PutApplication(t *testing.T) { accessUser := makeUser(t, false) user := userFromModelUser(*accessUser) date := time.Now() - application := &model.ApplicationDetail{ + application := &service.ApplicationDetail{ ID: uuid.New(), - Status: model.Submitted, + Status: service.Submitted, CreatedBy: user.ID, Title: random.AlphaNumeric(t, 20), Content: random.AlphaNumeric(t, 50), CreatedAt: date, UpdatedAt: date, - Tags: []*model.Tag{}, - Targets: []*model.ApplicationTargetDetail{}, - Statuses: []*model.ApplicationStatus{{ + Tags: []*service.Tag{}, + Targets: []*service.ApplicationTargetDetail{}, + Statuses: []*service.ApplicationStatus{{ ID: uuid.New(), - Status: model.Submitted, + Status: service.Submitted, CreatedAt: date, CreatedBy: user.ID, }}, - Comments: []*model.Comment{}, + Comments: []*service.Comment{}, Files: []uuid.UUID{}, } - tag := &model.Tag{ + tag := &service.Tag{ ID: uuid.New(), Name: random.AlphaNumeric(t, 20), CreatedAt: date, @@ -1780,39 +1780,39 @@ func TestHandlers_PutStatus(t *testing.T) { accessUser := makeUser(t, false) user := userFromModelUser(*accessUser) date := time.Now() - application := &model.ApplicationDetail{ + application := &service.ApplicationDetail{ ID: uuid.New(), - Status: model.FixRequired, + Status: service.FixRequired, CreatedBy: user.ID, Title: random.AlphaNumeric(t, 20), Content: random.AlphaNumeric(t, 50), CreatedAt: date, UpdatedAt: date, - Tags: []*model.Tag{}, - Targets: []*model.ApplicationTargetDetail{}, - Statuses: []*model.ApplicationStatus{{ + Tags: []*service.Tag{}, + Targets: []*service.ApplicationTargetDetail{}, + Statuses: []*service.ApplicationStatus{{ ID: uuid.New(), - Status: model.FixRequired, + Status: service.FixRequired, CreatedAt: date, CreatedBy: user.ID, }}, - Comments: []*model.Comment{}, + Comments: []*service.Comment{}, Files: []uuid.UUID{}, } reqStatus := PutStatus{ - Status: model.Submitted, + Status: service.Submitted, Comment: random.AlphaNumeric(t, 20), } reqBody, err := json.Marshal(reqStatus) require.NoError(t, err) - comment := &model.Comment{ + comment := &service.Comment{ ID: uuid.New(), User: user.ID, Comment: reqStatus.Comment, CreatedAt: date, UpdatedAt: date, } - status := &model.ApplicationStatus{ + status := &service.ApplicationStatus{ ID: uuid.New(), CreatedBy: user.ID, Status: reqStatus.Status, @@ -1876,39 +1876,39 @@ func TestHandlers_PutStatus(t *testing.T) { accessUser := makeUser(t, true) user := userFromModelUser(*accessUser) date := time.Now() - application := &model.ApplicationDetail{ + application := &service.ApplicationDetail{ ID: uuid.New(), - Status: model.Submitted, + Status: service.Submitted, CreatedBy: uuid.New(), Title: random.AlphaNumeric(t, 20), Content: random.AlphaNumeric(t, 50), CreatedAt: date, UpdatedAt: date, - Tags: []*model.Tag{}, - Targets: []*model.ApplicationTargetDetail{}, - Statuses: []*model.ApplicationStatus{{ + Tags: []*service.Tag{}, + Targets: []*service.ApplicationTargetDetail{}, + Statuses: []*service.ApplicationStatus{{ ID: uuid.New(), - Status: model.Submitted, + Status: service.Submitted, CreatedAt: date, CreatedBy: uuid.New(), }}, - Comments: []*model.Comment{}, + Comments: []*service.Comment{}, Files: []uuid.UUID{}, } reqStatus := PutStatus{ - Status: model.FixRequired, + Status: service.FixRequired, Comment: random.AlphaNumeric(t, 20), } reqBody, err := json.Marshal(reqStatus) require.NoError(t, err) - comment := &model.Comment{ + comment := &service.Comment{ ID: uuid.New(), User: user.ID, Comment: reqStatus.Comment, CreatedAt: date, UpdatedAt: date, } - status := &model.ApplicationStatus{ + status := &service.ApplicationStatus{ ID: uuid.New(), CreatedBy: user.ID, Status: reqStatus.Status, @@ -1972,39 +1972,39 @@ func TestHandlers_PutStatus(t *testing.T) { accessUser := makeUser(t, true) user := userFromModelUser(*accessUser) date := time.Now() - application := &model.ApplicationDetail{ + application := &service.ApplicationDetail{ ID: uuid.New(), - Status: model.Submitted, + Status: service.Submitted, CreatedBy: uuid.New(), Title: random.AlphaNumeric(t, 20), Content: random.AlphaNumeric(t, 50), CreatedAt: date, UpdatedAt: date, - Tags: []*model.Tag{}, - Targets: []*model.ApplicationTargetDetail{}, - Statuses: []*model.ApplicationStatus{{ + Tags: []*service.Tag{}, + Targets: []*service.ApplicationTargetDetail{}, + Statuses: []*service.ApplicationStatus{{ ID: uuid.New(), - Status: model.Submitted, + Status: service.Submitted, CreatedAt: date, CreatedBy: uuid.New(), }}, - Comments: []*model.Comment{}, + Comments: []*service.Comment{}, Files: []uuid.UUID{}, } reqStatus := PutStatus{ - Status: model.Accepted, + Status: service.Accepted, Comment: random.AlphaNumeric(t, 20), } reqBody, err := json.Marshal(reqStatus) require.NoError(t, err) - comment := &model.Comment{ + comment := &service.Comment{ ID: uuid.New(), User: user.ID, Comment: reqStatus.Comment, CreatedAt: date, UpdatedAt: date, } - status := &model.ApplicationStatus{ + status := &service.ApplicationStatus{ ID: uuid.New(), CreatedBy: user.ID, Status: reqStatus.Status, @@ -2068,40 +2068,40 @@ func TestHandlers_PutStatus(t *testing.T) { accessUser := makeUser(t, true) user := userFromModelUser(*accessUser) date := time.Now() - application := &model.ApplicationDetail{ + application := &service.ApplicationDetail{ ID: uuid.New(), - Status: model.Submitted, + Status: service.Submitted, CreatedBy: uuid.New(), Title: random.AlphaNumeric(t, 20), Content: random.AlphaNumeric(t, 50), CreatedAt: date, UpdatedAt: date, - Tags: []*model.Tag{}, - Targets: []*model.ApplicationTargetDetail{}, - Statuses: []*model.ApplicationStatus{{ + Tags: []*service.Tag{}, + Targets: []*service.ApplicationTargetDetail{}, + Statuses: []*service.ApplicationStatus{{ ID: uuid.New(), - Status: model.Submitted, + Status: service.Submitted, CreatedAt: date, CreatedBy: uuid.New(), }}, - Comments: []*model.Comment{}, + Comments: []*service.Comment{}, Files: []uuid.UUID{}, } reqStatus := PutStatus{ - Status: model.FixRequired, + Status: service.FixRequired, Comment: random.AlphaNumeric(t, 20), } reqBody, err := json.Marshal(reqStatus) require.NoError(t, err) - comment := &model.Comment{ + comment := &service.Comment{ ID: uuid.New(), User: user.ID, Comment: reqStatus.Comment, CreatedAt: date, UpdatedAt: date, } - status := &model.ApplicationStatus{ + status := &service.ApplicationStatus{ ID: uuid.New(), CreatedBy: user.ID, Status: reqStatus.Status, @@ -2165,39 +2165,39 @@ func TestHandlers_PutStatus(t *testing.T) { accessUser := makeUser(t, true) user := userFromModelUser(*accessUser) date := time.Now() - application := &model.ApplicationDetail{ + application := &service.ApplicationDetail{ ID: uuid.New(), - Status: model.FixRequired, + Status: service.FixRequired, CreatedBy: uuid.New(), Title: random.AlphaNumeric(t, 20), Content: random.AlphaNumeric(t, 50), CreatedAt: date, UpdatedAt: date, - Tags: []*model.Tag{}, - Targets: []*model.ApplicationTargetDetail{}, - Statuses: []*model.ApplicationStatus{{ + Tags: []*service.Tag{}, + Targets: []*service.ApplicationTargetDetail{}, + Statuses: []*service.ApplicationStatus{{ ID: uuid.New(), - Status: model.FixRequired, + Status: service.FixRequired, CreatedAt: date, CreatedBy: uuid.New(), }}, - Comments: []*model.Comment{}, + Comments: []*service.Comment{}, Files: []uuid.UUID{}, } reqStatus := PutStatus{ - Status: model.Submitted, + Status: service.Submitted, Comment: random.AlphaNumeric(t, 20), } reqBody, err := json.Marshal(reqStatus) require.NoError(t, err) - comment := &model.Comment{ + comment := &service.Comment{ ID: uuid.New(), User: user.ID, Comment: reqStatus.Comment, CreatedAt: date, UpdatedAt: date, } - status := &model.ApplicationStatus{ + status := &service.ApplicationStatus{ ID: uuid.New(), CreatedBy: user.ID, Status: reqStatus.Status, @@ -2261,46 +2261,46 @@ func TestHandlers_PutStatus(t *testing.T) { accessUser := makeUser(t, true) user := userFromModelUser(*accessUser) date := time.Now() - application := &model.ApplicationDetail{ + application := &service.ApplicationDetail{ ID: uuid.New(), - Status: model.Accepted, + Status: service.Accepted, CreatedBy: uuid.New(), Title: random.AlphaNumeric(t, 20), Content: random.AlphaNumeric(t, 50), CreatedAt: date, UpdatedAt: date, - Tags: []*model.Tag{}, - Targets: []*model.ApplicationTargetDetail{}, - Statuses: []*model.ApplicationStatus{{ + Tags: []*service.Tag{}, + Targets: []*service.ApplicationTargetDetail{}, + Statuses: []*service.ApplicationStatus{{ ID: uuid.New(), - Status: model.Accepted, + Status: service.Accepted, CreatedAt: date, CreatedBy: uuid.New(), }}, - Comments: []*model.Comment{}, + Comments: []*service.Comment{}, Files: []uuid.UUID{}, } - target := &model.ApplicationTargetDetail{ + target := &service.ApplicationTargetDetail{ ID: uuid.New(), Target: uuid.New(), - PaidAt: time.Time{}, + PaidAt: nulltime.NullTime{}, CreatedAt: date, } - targets := []*model.ApplicationTargetDetail{target} + targets := []*service.ApplicationTargetDetail{target} reqStatus := PutStatus{ - Status: model.Submitted, + Status: service.Submitted, Comment: random.AlphaNumeric(t, 20), } reqBody, err := json.Marshal(reqStatus) require.NoError(t, err) - comment := &model.Comment{ + comment := &service.Comment{ ID: uuid.New(), User: user.ID, Comment: reqStatus.Comment, CreatedAt: date, UpdatedAt: date, } - status := &model.ApplicationStatus{ + status := &service.ApplicationStatus{ ID: uuid.New(), CreatedBy: user.ID, Status: reqStatus.Status, @@ -2368,23 +2368,23 @@ func TestHandlers_PutStatus(t *testing.T) { accessUser := makeUser(t, true) user := userFromModelUser(*accessUser) date := time.Now() - application := &model.ApplicationDetail{ + application := &service.ApplicationDetail{ ID: uuid.New(), - Status: model.FixRequired, + Status: service.FixRequired, CreatedBy: user.ID, Title: random.AlphaNumeric(t, 20), Content: random.AlphaNumeric(t, 50), CreatedAt: date, UpdatedAt: date, - Tags: []*model.Tag{}, - Targets: []*model.ApplicationTargetDetail{}, - Statuses: []*model.ApplicationStatus{{ + Tags: []*service.Tag{}, + Targets: []*service.ApplicationTargetDetail{}, + Statuses: []*service.ApplicationStatus{{ ID: uuid.New(), - Status: model.FixRequired, + Status: service.FixRequired, CreatedAt: date, CreatedBy: user.ID, }}, - Comments: []*model.Comment{}, + Comments: []*service.Comment{}, Files: []uuid.UUID{}, } invalidStatus := random.AlphaNumeric(t, 20) @@ -2426,7 +2426,7 @@ func TestHandlers_PutStatus(t *testing.T) { user := userFromModelUser(*accessUser) invalidUUID := "invalid-uuid" reqStatus := PutStatus{ - Status: model.Submitted, + Status: service.Submitted, Comment: random.AlphaNumeric(t, 20), } reqBody, err := json.Marshal(reqStatus) @@ -2460,7 +2460,7 @@ func TestHandlers_PutStatus(t *testing.T) { accessUser := makeUser(t, false) user := userFromModelUser(*accessUser) reqStatus := PutStatus{ - Status: model.Submitted, + Status: service.Submitted, Comment: random.AlphaNumeric(t, 20), } reqBody, err := json.Marshal(reqStatus) @@ -2494,23 +2494,23 @@ func TestHandlers_PutStatus(t *testing.T) { accessUser := makeUser(t, false) user := userFromModelUser(*accessUser) date := time.Now() - application := &model.ApplicationDetail{ + application := &service.ApplicationDetail{ ID: uuid.New(), - Status: model.Status(random.Numeric(t, 5) + 1), + Status: service.Status(random.Numeric(t, 5) + 1), CreatedBy: user.ID, Title: random.AlphaNumeric(t, 20), Content: random.AlphaNumeric(t, 50), CreatedAt: date, UpdatedAt: date, - Tags: []*model.Tag{}, - Targets: []*model.ApplicationTargetDetail{}, - Statuses: []*model.ApplicationStatus{{ + Tags: []*service.Tag{}, + Targets: []*service.ApplicationTargetDetail{}, + Statuses: []*service.ApplicationStatus{{ ID: uuid.New(), - Status: model.Status(random.Numeric(t, 5) + 1), + Status: service.Status(random.Numeric(t, 5) + 1), CreatedAt: date, CreatedBy: user.ID, }}, - Comments: []*model.Comment{}, + Comments: []*service.Comment{}, Files: []uuid.UUID{}, } reqStatus := PutStatus{ @@ -2553,28 +2553,28 @@ func TestHandlers_PutStatus(t *testing.T) { accessUser := makeUser(t, false) user := userFromModelUser(*accessUser) - application := &model.ApplicationDetail{ + application := &service.ApplicationDetail{ ID: uuid.New(), - Status: model.Submitted, + Status: service.Submitted, CreatedBy: user.ID, Title: random.AlphaNumeric(t, 20), Content: random.AlphaNumeric(t, 50), CreatedAt: date, UpdatedAt: date, - Tags: []*model.Tag{}, - Targets: []*model.ApplicationTargetDetail{}, - Statuses: []*model.ApplicationStatus{{ + Tags: []*service.Tag{}, + Targets: []*service.ApplicationTargetDetail{}, + Statuses: []*service.ApplicationStatus{{ ID: uuid.New(), - Status: model.Submitted, + Status: service.Submitted, CreatedAt: date, CreatedBy: user.ID, }}, - Comments: []*model.Comment{}, + Comments: []*service.Comment{}, Files: []uuid.UUID{}, } reqStatus := PutStatus{ - Status: model.FixRequired, + Status: service.FixRequired, } reqBody, err := json.Marshal(reqStatus) require.NoError(t, err) @@ -2612,27 +2612,27 @@ func TestHandlers_PutStatus(t *testing.T) { accessUser := makeUser(t, false) user := userFromModelUser(*accessUser) date := time.Now() - application := &model.ApplicationDetail{ + application := &service.ApplicationDetail{ ID: uuid.New(), - Status: model.Submitted, + Status: service.Submitted, CreatedBy: user.ID, Title: random.AlphaNumeric(t, 20), Content: random.AlphaNumeric(t, 50), CreatedAt: date, UpdatedAt: date, - Tags: []*model.Tag{}, - Targets: []*model.ApplicationTargetDetail{}, - Statuses: []*model.ApplicationStatus{{ + Tags: []*service.Tag{}, + Targets: []*service.ApplicationTargetDetail{}, + Statuses: []*service.ApplicationStatus{{ ID: uuid.New(), - Status: model.Submitted, + Status: service.Submitted, CreatedAt: date, CreatedBy: user.ID, }}, - Comments: []*model.Comment{}, + Comments: []*service.Comment{}, Files: []uuid.UUID{}, } reqStatus := PutStatus{ - Status: model.Rejected, + Status: service.Rejected, } reqBody, err := json.Marshal(reqStatus) require.NoError(t, err) @@ -2670,27 +2670,27 @@ func TestHandlers_PutStatus(t *testing.T) { accessUser := makeUser(t, false) user := userFromModelUser(*accessUser) date := time.Now() - application := &model.ApplicationDetail{ + application := &service.ApplicationDetail{ ID: uuid.New(), - Status: model.Accepted, + Status: service.Accepted, CreatedBy: user.ID, Title: random.AlphaNumeric(t, 20), Content: random.AlphaNumeric(t, 50), CreatedAt: date, UpdatedAt: date, - Tags: []*model.Tag{}, - Targets: []*model.ApplicationTargetDetail{}, - Statuses: []*model.ApplicationStatus{{ + Tags: []*service.Tag{}, + Targets: []*service.ApplicationTargetDetail{}, + Statuses: []*service.ApplicationStatus{{ ID: uuid.New(), - Status: model.Accepted, + Status: service.Accepted, CreatedAt: date, CreatedBy: user.ID, }}, - Comments: []*model.Comment{}, + Comments: []*service.Comment{}, Files: []uuid.UUID{}, } reqStatus := PutStatus{ - Status: model.Submitted, + Status: service.Submitted, } reqBody, err := json.Marshal(reqStatus) require.NoError(t, err) @@ -2728,27 +2728,27 @@ func TestHandlers_PutStatus(t *testing.T) { accessUser := makeUser(t, true) user := userFromModelUser(*accessUser) date := time.Now() - application := &model.ApplicationDetail{ + application := &service.ApplicationDetail{ ID: uuid.New(), - Status: model.FixRequired, + Status: service.FixRequired, CreatedBy: uuid.New(), Title: random.AlphaNumeric(t, 20), Content: random.AlphaNumeric(t, 50), CreatedAt: date, UpdatedAt: date, - Tags: []*model.Tag{}, - Targets: []*model.ApplicationTargetDetail{}, - Statuses: []*model.ApplicationStatus{{ + Tags: []*service.Tag{}, + Targets: []*service.ApplicationTargetDetail{}, + Statuses: []*service.ApplicationStatus{{ ID: uuid.New(), - Status: model.FixRequired, + Status: service.FixRequired, CreatedAt: date, CreatedBy: uuid.New(), }}, - Comments: []*model.Comment{}, + Comments: []*service.Comment{}, Files: []uuid.UUID{}, } reqStatus := PutStatus{ - Status: model.Accepted, + Status: service.Accepted, Comment: random.AlphaNumeric(t, 20), } reqBody, err := json.Marshal(reqStatus) @@ -2787,34 +2787,34 @@ func TestHandlers_PutStatus(t *testing.T) { accessUser := makeUser(t, true) user := userFromModelUser(*accessUser) date := time.Now() - application := &model.ApplicationDetail{ + application := &service.ApplicationDetail{ ID: uuid.New(), - Status: model.Accepted, + Status: service.Accepted, CreatedBy: uuid.New(), Title: random.AlphaNumeric(t, 20), Content: random.AlphaNumeric(t, 50), CreatedAt: date, UpdatedAt: date, - Tags: []*model.Tag{}, - Targets: []*model.ApplicationTargetDetail{}, - Statuses: []*model.ApplicationStatus{{ + Tags: []*service.Tag{}, + Targets: []*service.ApplicationTargetDetail{}, + Statuses: []*service.ApplicationStatus{{ ID: uuid.New(), - Status: model.Accepted, + Status: service.Accepted, CreatedAt: date, CreatedBy: uuid.New(), }}, - Comments: []*model.Comment{}, + Comments: []*service.Comment{}, Files: []uuid.UUID{}, } - target := &model.ApplicationTargetDetail{ + target := &service.ApplicationTargetDetail{ ID: uuid.New(), Target: uuid.New(), - PaidAt: date, + PaidAt: nulltime.FromTime(&date), CreatedAt: date, } - targets := []*model.ApplicationTargetDetail{target} + targets := []*service.ApplicationTargetDetail{target} reqStatus := PutStatus{ - Status: model.Submitted, + Status: service.Submitted, Comment: random.AlphaNumeric(t, 20), } reqBody, err := json.Marshal(reqStatus) @@ -2858,27 +2858,27 @@ func TestHandlers_PutStatus(t *testing.T) { accessUser := makeUser(t, false) user := userFromModelUser(*accessUser) date := time.Now() - application := &model.ApplicationDetail{ + application := &service.ApplicationDetail{ ID: uuid.New(), - Status: model.Submitted, + Status: service.Submitted, CreatedBy: user.ID, Title: random.AlphaNumeric(t, 20), Content: random.AlphaNumeric(t, 50), CreatedAt: date, UpdatedAt: date, - Tags: []*model.Tag{}, - Targets: []*model.ApplicationTargetDetail{}, - Statuses: []*model.ApplicationStatus{{ + Tags: []*service.Tag{}, + Targets: []*service.ApplicationTargetDetail{}, + Statuses: []*service.ApplicationStatus{{ ID: uuid.New(), - Status: model.Submitted, + Status: service.Submitted, CreatedAt: date, CreatedBy: user.ID, }}, - Comments: []*model.Comment{}, + Comments: []*service.Comment{}, Files: []uuid.UUID{}, } reqStatus := PutStatus{ - Status: model.Accepted, + Status: service.Accepted, Comment: random.AlphaNumeric(t, 20), } reqBody, err := json.Marshal(reqStatus) @@ -2917,27 +2917,27 @@ func TestHandlers_PutStatus(t *testing.T) { accessUser := makeUser(t, false) user := userFromModelUser(*accessUser) date := time.Now() - application := &model.ApplicationDetail{ + application := &service.ApplicationDetail{ ID: uuid.New(), - Status: model.FixRequired, + Status: service.FixRequired, CreatedBy: uuid.New(), Title: random.AlphaNumeric(t, 20), Content: random.AlphaNumeric(t, 50), CreatedAt: date, UpdatedAt: date, - Tags: []*model.Tag{}, - Targets: []*model.ApplicationTargetDetail{}, - Statuses: []*model.ApplicationStatus{{ + Tags: []*service.Tag{}, + Targets: []*service.ApplicationTargetDetail{}, + Statuses: []*service.ApplicationStatus{{ ID: uuid.New(), - Status: model.FixRequired, + Status: service.FixRequired, CreatedAt: date, CreatedBy: uuid.New(), }}, - Comments: []*model.Comment{}, + Comments: []*service.Comment{}, Files: []uuid.UUID{}, } reqStatus := PutStatus{ - Status: model.Submitted, + Status: service.Submitted, Comment: random.AlphaNumeric(t, 20), } reqBody, err := json.Marshal(reqStatus) diff --git a/internal/router/auth.go b/internal/router/auth.go index 372e432f..a53b88d3 100644 --- a/internal/router/auth.go +++ b/internal/router/auth.go @@ -12,7 +12,6 @@ import ( "github.com/labstack/echo/v5" "github.com/traPtitech/Jomon/internal/logging" - "github.com/traPtitech/Jomon/internal/model" "github.com/traPtitech/Jomon/internal/router/wrapsession" "github.com/traPtitech/Jomon/internal/service" "github.com/traPtitech/Jomon/internal/traq" @@ -59,7 +58,7 @@ func (h Handlers) AuthCallback(c *echo.Context) error { return service.NewUnexpectedError(err) } - var modelUser *model.User + var modelUser *service.User modelUser, err = h.Repository.GetUserByName(ctx, u.Name) if err == nil { // User found, do nothing diff --git a/internal/router/file_test.go b/internal/router/file_test.go index df9e1c3e..d694458e 100644 --- a/internal/router/file_test.go +++ b/internal/router/file_test.go @@ -17,7 +17,6 @@ import ( "github.com/google/uuid" "github.com/labstack/echo/v5" "github.com/stretchr/testify/require" - "github.com/traPtitech/Jomon/internal/model" "github.com/traPtitech/Jomon/internal/service" "github.com/traPtitech/Jomon/internal/testutil" "github.com/traPtitech/Jomon/internal/testutil/random" @@ -38,7 +37,7 @@ func TestHandlers_PostFile(t *testing.T) { accessUser := makeUser(t, false) user := userFromModelUser(*accessUser) applicationID := uuid.New() - file := &model.File{ + file := &service.File{ ID: uuid.New(), Name: random.AlphaNumeric(t, 20), MimeType: "image/jpeg", @@ -155,7 +154,7 @@ func TestHandlers_PostFile(t *testing.T) { accessUser := makeUser(t, false) user := userFromModelUser(*accessUser) applicationID := uuid.New() - file := &model.File{ + file := &service.File{ ID: uuid.New(), Name: random.AlphaNumeric(t, 20), MimeType: "image/jpeg", @@ -221,7 +220,7 @@ func TestHandlers_GetFile(t *testing.T) { ctx := testutil.NewContext(t) ctrl := gomock.NewController(t) - file := &model.File{ + file := &service.File{ ID: uuid.New(), Name: random.AlphaNumeric(t, 20), MimeType: "image/jpeg", @@ -263,7 +262,7 @@ func TestHandlers_GetFile(t *testing.T) { ctx := testutil.NewContext(t) ctrl := gomock.NewController(t) - file := &model.File{ + file := &service.File{ ID: uuid.New(), Name: random.AlphaNumeric(t, 20), MimeType: "image/jpeg", @@ -299,7 +298,7 @@ func TestHandlers_GetFile(t *testing.T) { ctx := testutil.NewContext(t) ctrl := gomock.NewController(t) - file := &model.File{ + file := &service.File{ ID: uuid.New(), Name: random.AlphaNumeric(t, 20), MimeType: "image/jpeg", @@ -366,7 +365,7 @@ func TestHandlers_GetFileMeta(t *testing.T) { ctx := testutil.NewContext(t) ctrl := gomock.NewController(t) - file := &model.File{ + file := &service.File{ ID: uuid.New(), Name: random.AlphaNumeric(t, 20), MimeType: "image/jpeg", @@ -411,7 +410,7 @@ func TestHandlers_GetFileMeta(t *testing.T) { ctx := testutil.NewContext(t) ctrl := gomock.NewController(t) - file := &model.File{ + file := &service.File{ ID: uuid.New(), Name: random.AlphaNumeric(t, 20), MimeType: "image/jpeg", @@ -476,7 +475,7 @@ func TestHandlers_DeleteFile(t *testing.T) { accessUser := makeUser(t, false) user := userFromModelUser(*accessUser) - file := &model.File{ + file := &service.File{ ID: uuid.New(), Name: random.AlphaNumeric(t, 20), MimeType: "image/jpeg", @@ -522,7 +521,7 @@ func TestHandlers_DeleteFile(t *testing.T) { accessUser := makeUser(t, false) user := userFromModelUser(*accessUser) - file := &model.File{ + file := &service.File{ ID: uuid.New(), Name: random.AlphaNumeric(t, 20), MimeType: "image/jpeg", @@ -567,7 +566,7 @@ func TestHandlers_DeleteFile(t *testing.T) { accessUser := makeUser(t, false) user := userFromModelUser(*accessUser) - file := &model.File{ + file := &service.File{ ID: uuid.New(), Name: random.AlphaNumeric(t, 20), MimeType: "image/jpeg", diff --git a/internal/router/router.go b/internal/router/router.go index 63fcdcf8..7759f329 100644 --- a/internal/router/router.go +++ b/internal/router/router.go @@ -12,15 +12,14 @@ import ( "go.uber.org/zap" "github.com/traPtitech/Jomon/internal/logging" - "github.com/traPtitech/Jomon/internal/model" - "github.com/traPtitech/Jomon/internal/storage" + "github.com/traPtitech/Jomon/internal/service" "github.com/traPtitech/Jomon/internal/webhook" ) type Handlers struct { WebhookService *webhook.Service - Repository model.Repository - Storage storage.Storage + Repository service.Repository + Storage service.Storage SessionName string } diff --git a/internal/router/router_test.go b/internal/router/router_test.go index 9cfc2574..375df824 100644 --- a/internal/router/router_test.go +++ b/internal/router/router_test.go @@ -5,50 +5,49 @@ import ( "testing" "time" - "github.com/traPtitech/Jomon/internal/storage/mock_storage" + "github.com/traPtitech/Jomon/internal/service" + "github.com/traPtitech/Jomon/internal/service/mock_service" "github.com/google/uuid" - "github.com/traPtitech/Jomon/internal/model" - "github.com/traPtitech/Jomon/internal/model/mock_model" "github.com/traPtitech/Jomon/internal/testutil/random" "go.uber.org/mock/gomock" ) type MockRepository struct { - *mock_model.MockAccountManagerRepository - *mock_model.MockCommentRepository - *mock_model.MockFileRepository - *mock_model.MockApplicationRepository - *mock_model.MockApplicationStatusRepository - *mock_model.MockApplicationFileRepository - *mock_model.MockApplicationTagRepository - *mock_model.MockApplicationTargetRepository - *mock_model.MockTagRepository - *mock_model.MockUserRepository + *mock_service.MockAccountManagerRepository + *mock_service.MockCommentRepository + *mock_service.MockFileRepository + *mock_service.MockApplicationRepository + *mock_service.MockApplicationStatusRepository + *mock_service.MockApplicationFileRepository + *mock_service.MockApplicationTagRepository + *mock_service.MockApplicationTargetRepository + *mock_service.MockTagRepository + *mock_service.MockUserRepository } type MockStorage struct { - *mock_storage.MockStorage + *mock_service.MockStorage } func NewMockRepository(ctrl *gomock.Controller) *MockRepository { return &MockRepository{ - MockAccountManagerRepository: mock_model.NewMockAccountManagerRepository(ctrl), - MockCommentRepository: mock_model.NewMockCommentRepository(ctrl), - MockFileRepository: mock_model.NewMockFileRepository(ctrl), - MockApplicationRepository: mock_model.NewMockApplicationRepository(ctrl), - MockApplicationStatusRepository: mock_model.NewMockApplicationStatusRepository(ctrl), - MockApplicationFileRepository: mock_model.NewMockApplicationFileRepository(ctrl), - MockApplicationTagRepository: mock_model.NewMockApplicationTagRepository(ctrl), - MockApplicationTargetRepository: mock_model.NewMockApplicationTargetRepository(ctrl), - MockTagRepository: mock_model.NewMockTagRepository(ctrl), - MockUserRepository: mock_model.NewMockUserRepository(ctrl), + MockAccountManagerRepository: mock_service.NewMockAccountManagerRepository(ctrl), + MockCommentRepository: mock_service.NewMockCommentRepository(ctrl), + MockFileRepository: mock_service.NewMockFileRepository(ctrl), + MockApplicationRepository: mock_service.NewMockApplicationRepository(ctrl), + MockApplicationStatusRepository: mock_service.NewMockApplicationStatusRepository(ctrl), + MockApplicationFileRepository: mock_service.NewMockApplicationFileRepository(ctrl), + MockApplicationTagRepository: mock_service.NewMockApplicationTagRepository(ctrl), + MockApplicationTargetRepository: mock_service.NewMockApplicationTargetRepository(ctrl), + MockTagRepository: mock_service.NewMockTagRepository(ctrl), + MockUserRepository: mock_service.NewMockUserRepository(ctrl), } } func NewMockStorage(ctrl *gomock.Controller) *MockStorage { return &MockStorage{ - MockStorage: mock_storage.NewMockStorage(ctrl), + MockStorage: mock_service.NewMockStorage(ctrl), } } @@ -75,11 +74,11 @@ func NewTestHandlers(_ *testing.T, ctrl *gomock.Controller) (*TestHandlers, erro }, nil } -func makeUser(t *testing.T, accountManager bool) *model.User { +func makeUser(t *testing.T, accountManager bool) *service.User { t.Helper() date := time.Now() - return &model.User{ + return &service.User{ ID: uuid.New(), Name: random.AlphaNumeric(t, 20), DisplayName: random.AlphaNumeric(t, 20), diff --git a/internal/router/tag.go b/internal/router/tag.go index 9545c577..f618ff30 100644 --- a/internal/router/tag.go +++ b/internal/router/tag.go @@ -8,7 +8,6 @@ import ( "github.com/labstack/echo/v5" "github.com/samber/lo" "github.com/traPtitech/Jomon/internal/logging" - "github.com/traPtitech/Jomon/internal/model" "github.com/traPtitech/Jomon/internal/service" "go.uber.org/zap" ) @@ -36,7 +35,7 @@ func (h Handlers) GetTags(c *echo.Context) error { return err } - res := lo.Map(tags, func(tag *model.Tag, _ int) *TagResponse { + res := lo.Map(tags, func(tag *service.Tag, _ int) *TagResponse { return &TagResponse{ ID: tag.ID, Name: tag.Name, diff --git a/internal/router/tag_test.go b/internal/router/tag_test.go index 6db612cb..fc5d4a4d 100644 --- a/internal/router/tag_test.go +++ b/internal/router/tag_test.go @@ -14,7 +14,6 @@ import ( "github.com/labstack/echo/v5" "github.com/samber/lo" "github.com/stretchr/testify/require" - "github.com/traPtitech/Jomon/internal/model" "github.com/traPtitech/Jomon/internal/service" "github.com/traPtitech/Jomon/internal/testutil" "github.com/traPtitech/Jomon/internal/testutil/random" @@ -30,19 +29,19 @@ func TestHandlers_GetTags(t *testing.T) { ctrl := gomock.NewController(t) date := time.Now() - tag1 := &model.Tag{ + tag1 := &service.Tag{ ID: uuid.New(), Name: random.AlphaNumeric(t, 20), CreatedAt: date, UpdatedAt: date, } - tag2 := &model.Tag{ + tag2 := &service.Tag{ ID: uuid.New(), Name: random.AlphaNumeric(t, 20), CreatedAt: date, UpdatedAt: date, } - tags := []*model.Tag{tag1, tag2} + tags := []*service.Tag{tag1, tag2} e := echo.New() req := httptest.NewRequestWithContext(ctx, http.MethodGet, "/api/tags", nil) @@ -62,7 +61,7 @@ func TestHandlers_GetTags(t *testing.T) { err = json.Unmarshal(rec.Body.Bytes(), &got) require.NoError(t, err) opts := testutil.ApproxEqualOptions() - exp := lo.Map(tags, func(tag *model.Tag, _ int) *TagResponse { + exp := lo.Map(tags, func(tag *service.Tag, _ int) *TagResponse { return &TagResponse{ ID: tag.ID, Name: tag.Name, @@ -78,7 +77,7 @@ func TestHandlers_GetTags(t *testing.T) { ctx := testutil.NewContext(t) ctrl := gomock.NewController(t) - tags := []*model.Tag{} + tags := []*service.Tag{} e := echo.New() req := httptest.NewRequestWithContext(ctx, http.MethodGet, "/api/tags", nil) @@ -135,7 +134,7 @@ func TestHandlers_PostTag(t *testing.T) { ctrl := gomock.NewController(t) date := time.Now() - tag := &model.Tag{ + tag := &service.Tag{ ID: uuid.New(), Name: random.AlphaNumeric(t, 20), CreatedAt: date, @@ -183,7 +182,7 @@ func TestHandlers_PostTag(t *testing.T) { ctrl := gomock.NewController(t) date := time.Now() - tag := &model.Tag{ + tag := &service.Tag{ ID: uuid.New(), Name: "", CreatedAt: date, @@ -226,7 +225,7 @@ func TestHandlers_PutTag(t *testing.T) { ctrl := gomock.NewController(t) date := time.Now() - tag := &model.Tag{ + tag := &service.Tag{ ID: uuid.New(), Name: random.AlphaNumeric(t, 20), CreatedAt: date, @@ -237,7 +236,7 @@ func TestHandlers_PutTag(t *testing.T) { } reqBody, err := json.Marshal(reqTag) require.NoError(t, err) - updateTag := &model.Tag{ + updateTag := &service.Tag{ ID: tag.ID, Name: reqTag.Name, CreatedAt: date, @@ -284,7 +283,7 @@ func TestHandlers_PutTag(t *testing.T) { ctrl := gomock.NewController(t) date := time.Now() - tag := &model.Tag{ + tag := &service.Tag{ ID: uuid.New(), Name: random.AlphaNumeric(t, 20), CreatedAt: date, @@ -328,7 +327,7 @@ func TestHandlers_PutTag(t *testing.T) { invalidUUID := "invalid-uuid" date := time.Now() - tag := &model.Tag{ + tag := &service.Tag{ ID: uuid.New(), Name: random.AlphaNumeric(t, 20), CreatedAt: date, @@ -365,7 +364,7 @@ func TestHandlers_PutTag(t *testing.T) { ctrl := gomock.NewController(t) date := time.Now() - tag := &model.Tag{ + tag := &service.Tag{ ID: uuid.Nil, Name: random.AlphaNumeric(t, 20), CreatedAt: date, @@ -406,7 +405,7 @@ func TestHandlers_DeleteTag(t *testing.T) { ctrl := gomock.NewController(t) date := time.Now() - tag := &model.Tag{ + tag := &service.Tag{ ID: uuid.New(), Name: random.AlphaNumeric(t, 20), CreatedAt: date, @@ -442,7 +441,7 @@ func TestHandlers_DeleteTag(t *testing.T) { ctrl := gomock.NewController(t) date := time.Now() - tag := &model.Tag{ + tag := &service.Tag{ ID: uuid.New(), Name: random.AlphaNumeric(t, 20), CreatedAt: date, @@ -506,7 +505,7 @@ func TestHandlers_DeleteTag(t *testing.T) { ctrl := gomock.NewController(t) date := time.Now() - tag := &model.Tag{ + tag := &service.Tag{ ID: uuid.Nil, Name: random.AlphaNumeric(t, 20), CreatedAt: date, diff --git a/internal/router/user.go b/internal/router/user.go index f7dbfa5b..220b8457 100644 --- a/internal/router/user.go +++ b/internal/router/user.go @@ -8,7 +8,6 @@ import ( "github.com/labstack/echo/v5" "github.com/samber/lo" "github.com/traPtitech/Jomon/internal/logging" - "github.com/traPtitech/Jomon/internal/model" "github.com/traPtitech/Jomon/internal/nulltime" "github.com/traPtitech/Jomon/internal/service" "go.uber.org/zap" @@ -34,7 +33,7 @@ func (h Handlers) GetUsers(c *echo.Context) error { return err } - res := lo.Map(users, func(user *model.User, _ int) User { + res := lo.Map(users, func(user *service.User, _ int) User { return User{ ID: user.ID, Name: user.Name, @@ -42,7 +41,7 @@ func (h Handlers) GetUsers(c *echo.Context) error { AccountManager: user.AccountManager, CreatedAt: user.CreatedAt, UpdatedAt: user.UpdatedAt, - DeletedAt: nulltime.FromTime(&user.DeletedAt), + DeletedAt: user.DeletedAt, } }) @@ -87,7 +86,7 @@ func (h Handlers) UpdateUserInfo(c *echo.Context) error { }) } -func userFromModelUser(u model.User) User { +func userFromModelUser(u service.User) User { return User{ ID: u.ID, Name: u.Name, @@ -95,7 +94,7 @@ func userFromModelUser(u model.User) User { AccountManager: u.AccountManager, CreatedAt: u.CreatedAt, UpdatedAt: u.UpdatedAt, - DeletedAt: nulltime.FromTime(&u.DeletedAt), + DeletedAt: u.DeletedAt, } } diff --git a/internal/router/user_test.go b/internal/router/user_test.go index 125b0c4f..0d98fd87 100644 --- a/internal/router/user_test.go +++ b/internal/router/user_test.go @@ -13,8 +13,6 @@ import ( "github.com/labstack/echo/v5" "github.com/samber/lo" "github.com/stretchr/testify/require" - "github.com/traPtitech/Jomon/internal/model" - "github.com/traPtitech/Jomon/internal/nulltime" "github.com/traPtitech/Jomon/internal/service" "github.com/traPtitech/Jomon/internal/testutil" "github.com/traPtitech/Jomon/internal/testutil/random" @@ -22,7 +20,7 @@ import ( ) // TODO: これ消す userFromModelUserがある -func modelUserToUser(user *model.User) *User { +func modelUserToUser(user *service.User) *User { return &User{ ID: user.ID, Name: user.Name, @@ -30,7 +28,7 @@ func modelUserToUser(user *model.User) *User { AccountManager: user.AccountManager, CreatedAt: user.CreatedAt, UpdatedAt: user.UpdatedAt, - DeletedAt: nulltime.FromTime(&user.DeletedAt), + DeletedAt: user.DeletedAt, } } @@ -44,7 +42,7 @@ func TestHandlers_GetUsers(t *testing.T) { user1 := makeUser(t, random.Numeric(t, 2) == 1) user2 := makeUser(t, random.Numeric(t, 2) == 1) - users := []*model.User{user1, user2} + users := []*service.User{user1, user2} e := echo.New() req := httptest.NewRequestWithContext(ctx, http.MethodGet, "/api/users", nil) @@ -64,7 +62,7 @@ func TestHandlers_GetUsers(t *testing.T) { err = json.Unmarshal(rec.Body.Bytes(), &got) require.NoError(t, err) opts := testutil.ApproxEqualOptions() - exp := lo.Map(users, func(u *model.User, _ int) *User { + exp := lo.Map(users, func(u *service.User, _ int) *User { return modelUserToUser(u) }) testutil.RequireEqual(t, exp, got, opts...) @@ -75,7 +73,7 @@ func TestHandlers_GetUsers(t *testing.T) { ctx := testutil.NewContext(t) ctrl := gomock.NewController(t) - users := []*model.User{} + users := []*service.User{} e := echo.New() req := httptest.NewRequestWithContext(ctx, http.MethodGet, "/api/users", nil) @@ -95,7 +93,7 @@ func TestHandlers_GetUsers(t *testing.T) { err = json.Unmarshal(rec.Body.Bytes(), &got) require.NoError(t, err) opts := testutil.ApproxEqualOptions() - exp := lo.Map(users, func(u *model.User, _ int) *User { + exp := lo.Map(users, func(u *service.User, _ int) *User { return modelUserToUser(u) }) testutil.RequireEqual(t, exp, got, opts...) @@ -135,7 +133,7 @@ func TestHandlers_UpdateUserInfo(t *testing.T) { ctrl := gomock.NewController(t) user := makeUser(t, random.Numeric(t, 2) == 1) - updateUser := &model.User{ + updateUser := &service.User{ ID: user.ID, Name: user.Name, DisplayName: user.DisplayName, @@ -192,7 +190,7 @@ func TestHandlers_UpdateUserInfo(t *testing.T) { ctrl := gomock.NewController(t) user := makeUser(t, random.Numeric(t, 2) == 1) - updateUser := &model.User{ + updateUser := &service.User{ ID: user.ID, Name: user.Name, DisplayName: user.DisplayName, @@ -240,7 +238,7 @@ func TestHandlers_UpdateUserInfo(t *testing.T) { ctrl := gomock.NewController(t) user := makeUser(t, random.Numeric(t, 2) == 1) - updateUser := &model.User{ + updateUser := &service.User{ ID: user.ID, Name: user.Name, DisplayName: user.DisplayName, diff --git a/internal/service/account_manager.go b/internal/service/account_manager.go new file mode 100644 index 00000000..6458f165 --- /dev/null +++ b/internal/service/account_manager.go @@ -0,0 +1,18 @@ +//go:generate go tool mockgen -source=$GOFILE -destination=mock_$GOPACKAGE/mock_$GOFILE -package=mock_$GOPACKAGE +package service + +import ( + "context" + + "github.com/google/uuid" +) + +type AccountManager struct { + ID uuid.UUID `json:"id"` +} + +type AccountManagerRepository interface { + GetAccountManagers(ctx context.Context) ([]*AccountManager, error) + AddAccountManagers(ctx context.Context, userIDs []uuid.UUID) error + DeleteAccountManagers(ctx context.Context, userIDs []uuid.UUID) error +} diff --git a/internal/service/application.go b/internal/service/application.go new file mode 100644 index 00000000..a06e668d --- /dev/null +++ b/internal/service/application.go @@ -0,0 +1,70 @@ +//go:generate go tool mockgen -source=$GOFILE -destination=mock_$GOPACKAGE/mock_$GOFILE -package=mock_$GOPACKAGE +package service + +import ( + "context" + "time" + + "github.com/google/uuid" + "github.com/traPtitech/Jomon/internal/nulltime" +) + +type ApplicationRepository interface { + GetApplications(ctx context.Context, query ApplicationQuery) ([]*ApplicationResponse, error) + CreateApplication( + ctx context.Context, title string, content string, + tags []*Tag, targets []*ApplicationTarget, userID uuid.UUID, + ) (*ApplicationDetail, error) + GetApplication(ctx context.Context, applicationID uuid.UUID) (*ApplicationDetail, error) + UpdateApplication( + ctx context.Context, applicationID uuid.UUID, title string, content string, + tags []*Tag, targets []*ApplicationTarget, + ) (*ApplicationDetail, error) +} + +type Application struct { + ID uuid.UUID + Amount int + CreatedAt time.Time + UpdatedAt time.Time +} + +type ApplicationResponse struct { + ID uuid.UUID + Status Status + CreatedAt time.Time + UpdatedAt time.Time + CreatedBy uuid.UUID + Title string + Content string + Tags []*Tag + Targets []*ApplicationTargetDetail + Statuses []*ApplicationStatus +} + +type ApplicationDetail struct { + ID uuid.UUID + Status Status + Title string + Content string + Comments []*Comment + Files []uuid.UUID + Statuses []*ApplicationStatus + Tags []*Tag + Targets []*ApplicationTargetDetail + CreatedAt time.Time + UpdatedAt time.Time + CreatedBy uuid.UUID +} + +type ApplicationQuery struct { + Sort *string + Target uuid.UUID + Status *string + Since nulltime.NullTime + Until nulltime.NullTime + Limit int + Offset int + Tag *string + CreatedBy uuid.UUID +} diff --git a/internal/model/application_file.go b/internal/service/application_file.go similarity index 90% rename from internal/model/application_file.go rename to internal/service/application_file.go index c93d2528..d08b5e61 100644 --- a/internal/model/application_file.go +++ b/internal/service/application_file.go @@ -1,5 +1,5 @@ //go:generate go tool mockgen -source=$GOFILE -destination=mock_$GOPACKAGE/mock_$GOFILE -package=mock_$GOPACKAGE -package model +package service type ApplicationFileRepository interface { } diff --git a/internal/service/application_status.go b/internal/service/application_status.go new file mode 100644 index 00000000..4da37584 --- /dev/null +++ b/internal/service/application_status.go @@ -0,0 +1,96 @@ +//go:generate go tool mockgen -source=$GOFILE -destination=mock_$GOPACKAGE/mock_$GOFILE -package=mock_$GOPACKAGE +package service + +import ( + "context" + "encoding/json" + "fmt" + "time" + + "github.com/google/uuid" +) + +type Status int + +const ( + _ Status = iota + Submitted + FixRequired + Accepted + Completed + Rejected +) + +func (s Status) String() string { + switch s { + case Submitted: + return "submitted" + case FixRequired: + return "fix_required" + case Accepted: + return "accepted" + case Completed: + return "completed" + case Rejected: + return "rejected" + default: + // FIXME: ここerrorにしたい + return "" + } +} + +// dbにstringいれる今の実装だとMarshalJson入らなそう。 +func (s Status) MarshalJSON() ([]byte, error) { + switch s { + case Submitted: + return json.Marshal("submitted") + case FixRequired: + return json.Marshal("fix_required") + case Accepted: + return json.Marshal("accepted") + case Completed: + return json.Marshal("completed") + case Rejected: + return json.Marshal("rejected") + default: + return nil, fmt.Errorf("invalid status: %d", s) + } +} + +func (s *Status) UnmarshalJSON(data []byte) error { + var str string + if err := json.Unmarshal(data, &str); err != nil { + return fmt.Errorf("data should be a string, got %s", data) + } + + var st Status + switch str { + case "submitted": + st = Submitted + case "fix_required": + st = FixRequired + case "accepted": + st = Accepted + case "completed": + st = Completed + case "rejected": + st = Rejected + default: + return fmt.Errorf("invalid Status %s", str) + } + *s = st + return nil +} + +type ApplicationStatusRepository interface { + CreateStatus( + ctx context.Context, applicationID uuid.UUID, userID uuid.UUID, status Status, + ) (*ApplicationStatus, error) +} + +type ApplicationStatus struct { + ID uuid.UUID + CreatedBy uuid.UUID + Status Status + CreatedAt time.Time +} diff --git a/internal/model/application_tag.go b/internal/service/application_tag.go similarity index 90% rename from internal/model/application_tag.go rename to internal/service/application_tag.go index 4baa5c6a..0af22048 100644 --- a/internal/model/application_tag.go +++ b/internal/service/application_tag.go @@ -1,5 +1,5 @@ //go:generate go tool mockgen -source=$GOFILE -destination=mock_$GOPACKAGE/mock_$GOFILE -package=mock_$GOPACKAGE -package model +package service type ApplicationTagRepository interface { } diff --git a/internal/service/application_target.go b/internal/service/application_target.go new file mode 100644 index 00000000..176db6d0 --- /dev/null +++ b/internal/service/application_target.go @@ -0,0 +1,30 @@ +//go:generate go tool mockgen -source=$GOFILE -destination=mock_$GOPACKAGE/mock_$GOFILE -package=mock_$GOPACKAGE +package service + +import ( + "context" + "time" + + "github.com/google/uuid" + "github.com/traPtitech/Jomon/internal/nulltime" +) + +type ApplicationTargetRepository interface { + GetApplicationTargets( + ctx context.Context, + applicationID uuid.UUID, + ) ([]*ApplicationTargetDetail, error) +} + +type ApplicationTargetDetail struct { + ID uuid.UUID + Target uuid.UUID + Amount int + PaidAt nulltime.NullTime + CreatedAt time.Time +} + +type ApplicationTarget struct { + Target uuid.UUID + Amount int +} diff --git a/internal/service/comment.go b/internal/service/comment.go new file mode 100644 index 00000000..53531c08 --- /dev/null +++ b/internal/service/comment.go @@ -0,0 +1,28 @@ +//go:generate go tool mockgen -source=$GOFILE -destination=mock_$GOPACKAGE/mock_$GOFILE -package=mock_$GOPACKAGE +package service + +import ( + "context" + "time" + + "github.com/google/uuid" +) + +type Comment struct { + ID uuid.UUID + User uuid.UUID + Comment string + CreatedAt time.Time + UpdatedAt time.Time +} + +type CommentRepository interface { + GetComments(ctx context.Context, applicationID uuid.UUID) ([]*Comment, error) + CreateComment( + ctx context.Context, comment string, applicationID uuid.UUID, userID uuid.UUID, + ) (*Comment, error) + UpdateComment( + ctx context.Context, comment string, applicationID uuid.UUID, commentID uuid.UUID, + ) (*Comment, error) + DeleteComment(ctx context.Context, applicationID uuid.UUID, commentID uuid.UUID) error +} diff --git a/internal/service/file.go b/internal/service/file.go new file mode 100644 index 00000000..a2ed348d --- /dev/null +++ b/internal/service/file.go @@ -0,0 +1,29 @@ +//go:generate go tool mockgen -source=$GOFILE -destination=mock_$GOPACKAGE/mock_$GOFILE -package=mock_$GOPACKAGE +package service + +import ( + "context" + "time" + + "github.com/google/uuid" +) + +type FileRepository interface { + CreateFile( + ctx context.Context, + name string, + mimetype string, + applicationID uuid.UUID, + userID uuid.UUID, + ) (*File, error) + GetFile(ctx context.Context, fileID uuid.UUID) (*File, error) + DeleteFile(ctx context.Context, fileID uuid.UUID) error +} + +type File struct { + ID uuid.UUID + Name string + MimeType string + CreatedBy uuid.UUID + CreatedAt time.Time +} diff --git a/internal/model/mock_model/mock_account_manager.go b/internal/service/mock_service/mock_account_manager.go similarity index 89% rename from internal/model/mock_model/mock_account_manager.go rename to internal/service/mock_service/mock_account_manager.go index 44aa17c1..60005757 100644 --- a/internal/model/mock_model/mock_account_manager.go +++ b/internal/service/mock_service/mock_account_manager.go @@ -3,18 +3,18 @@ // // Generated by this command: // -// mockgen -source=account_manager.go -destination=mock_model/mock_account_manager.go -package=mock_model +// mockgen -source=account_manager.go -destination=mock_service/mock_account_manager.go -package=mock_service // -// Package mock_model is a generated GoMock package. -package mock_model +// Package mock_service is a generated GoMock package. +package mock_service import ( context "context" reflect "reflect" uuid "github.com/google/uuid" - model "github.com/traPtitech/Jomon/internal/model" + service "github.com/traPtitech/Jomon/internal/service" gomock "go.uber.org/mock/gomock" ) @@ -71,10 +71,10 @@ func (mr *MockAccountManagerRepositoryMockRecorder) DeleteAccountManagers(ctx, u } // GetAccountManagers mocks base method. -func (m *MockAccountManagerRepository) GetAccountManagers(ctx context.Context) ([]*model.AccountManager, error) { +func (m *MockAccountManagerRepository) GetAccountManagers(ctx context.Context) ([]*service.AccountManager, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "GetAccountManagers", ctx) - ret0, _ := ret[0].([]*model.AccountManager) + ret0, _ := ret[0].([]*service.AccountManager) ret1, _ := ret[1].(error) return ret0, ret1 } diff --git a/internal/model/mock_model/mock_application.go b/internal/service/mock_service/mock_application.go similarity index 81% rename from internal/model/mock_model/mock_application.go rename to internal/service/mock_service/mock_application.go index 47804f21..d1c573b9 100644 --- a/internal/model/mock_model/mock_application.go +++ b/internal/service/mock_service/mock_application.go @@ -3,18 +3,18 @@ // // Generated by this command: // -// mockgen -source=application.go -destination=mock_model/mock_application.go -package=mock_model +// mockgen -source=application.go -destination=mock_service/mock_application.go -package=mock_service // -// Package mock_model is a generated GoMock package. -package mock_model +// Package mock_service is a generated GoMock package. +package mock_service import ( context "context" reflect "reflect" uuid "github.com/google/uuid" - model "github.com/traPtitech/Jomon/internal/model" + service "github.com/traPtitech/Jomon/internal/service" gomock "go.uber.org/mock/gomock" ) @@ -43,10 +43,10 @@ func (m *MockApplicationRepository) EXPECT() *MockApplicationRepositoryMockRecor } // CreateApplication mocks base method. -func (m *MockApplicationRepository) CreateApplication(ctx context.Context, title, content string, tags []*model.Tag, targets []*model.ApplicationTarget, userID uuid.UUID) (*model.ApplicationDetail, error) { +func (m *MockApplicationRepository) CreateApplication(ctx context.Context, title, content string, tags []*service.Tag, targets []*service.ApplicationTarget, userID uuid.UUID) (*service.ApplicationDetail, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "CreateApplication", ctx, title, content, tags, targets, userID) - ret0, _ := ret[0].(*model.ApplicationDetail) + ret0, _ := ret[0].(*service.ApplicationDetail) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -58,10 +58,10 @@ func (mr *MockApplicationRepositoryMockRecorder) CreateApplication(ctx, title, c } // GetApplication mocks base method. -func (m *MockApplicationRepository) GetApplication(ctx context.Context, applicationID uuid.UUID) (*model.ApplicationDetail, error) { +func (m *MockApplicationRepository) GetApplication(ctx context.Context, applicationID uuid.UUID) (*service.ApplicationDetail, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "GetApplication", ctx, applicationID) - ret0, _ := ret[0].(*model.ApplicationDetail) + ret0, _ := ret[0].(*service.ApplicationDetail) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -73,10 +73,10 @@ func (mr *MockApplicationRepositoryMockRecorder) GetApplication(ctx, application } // GetApplications mocks base method. -func (m *MockApplicationRepository) GetApplications(ctx context.Context, query model.ApplicationQuery) ([]*model.ApplicationResponse, error) { +func (m *MockApplicationRepository) GetApplications(ctx context.Context, query service.ApplicationQuery) ([]*service.ApplicationResponse, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "GetApplications", ctx, query) - ret0, _ := ret[0].([]*model.ApplicationResponse) + ret0, _ := ret[0].([]*service.ApplicationResponse) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -88,10 +88,10 @@ func (mr *MockApplicationRepositoryMockRecorder) GetApplications(ctx, query any) } // UpdateApplication mocks base method. -func (m *MockApplicationRepository) UpdateApplication(ctx context.Context, applicationID uuid.UUID, title, content string, tags []*model.Tag, targets []*model.ApplicationTarget) (*model.ApplicationDetail, error) { +func (m *MockApplicationRepository) UpdateApplication(ctx context.Context, applicationID uuid.UUID, title, content string, tags []*service.Tag, targets []*service.ApplicationTarget) (*service.ApplicationDetail, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "UpdateApplication", ctx, applicationID, title, content, tags, targets) - ret0, _ := ret[0].(*model.ApplicationDetail) + ret0, _ := ret[0].(*service.ApplicationDetail) ret1, _ := ret[1].(error) return ret0, ret1 } diff --git a/internal/model/mock_model/mock_application_file.go b/internal/service/mock_service/mock_application_file.go similarity index 85% rename from internal/model/mock_model/mock_application_file.go rename to internal/service/mock_service/mock_application_file.go index 91d1140c..9c58edb0 100644 --- a/internal/model/mock_model/mock_application_file.go +++ b/internal/service/mock_service/mock_application_file.go @@ -3,11 +3,11 @@ // // Generated by this command: // -// mockgen -source=application_file.go -destination=mock_model/mock_application_file.go -package=mock_model +// mockgen -source=application_file.go -destination=mock_service/mock_application_file.go -package=mock_service // -// Package mock_model is a generated GoMock package. -package mock_model +// Package mock_service is a generated GoMock package. +package mock_service import ( gomock "go.uber.org/mock/gomock" diff --git a/internal/model/mock_model/mock_application_status.go b/internal/service/mock_service/mock_application_status.go similarity index 81% rename from internal/model/mock_model/mock_application_status.go rename to internal/service/mock_service/mock_application_status.go index 621940a5..9d214b2d 100644 --- a/internal/model/mock_model/mock_application_status.go +++ b/internal/service/mock_service/mock_application_status.go @@ -3,18 +3,18 @@ // // Generated by this command: // -// mockgen -source=application_status.go -destination=mock_model/mock_application_status.go -package=mock_model +// mockgen -source=application_status.go -destination=mock_service/mock_application_status.go -package=mock_service // -// Package mock_model is a generated GoMock package. -package mock_model +// Package mock_service is a generated GoMock package. +package mock_service import ( context "context" reflect "reflect" uuid "github.com/google/uuid" - model "github.com/traPtitech/Jomon/internal/model" + service "github.com/traPtitech/Jomon/internal/service" gomock "go.uber.org/mock/gomock" ) @@ -43,10 +43,10 @@ func (m *MockApplicationStatusRepository) EXPECT() *MockApplicationStatusReposit } // CreateStatus mocks base method. -func (m *MockApplicationStatusRepository) CreateStatus(ctx context.Context, applicationID, userID uuid.UUID, status model.Status) (*model.ApplicationStatus, error) { +func (m *MockApplicationStatusRepository) CreateStatus(ctx context.Context, applicationID, userID uuid.UUID, status service.Status) (*service.ApplicationStatus, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "CreateStatus", ctx, applicationID, userID, status) - ret0, _ := ret[0].(*model.ApplicationStatus) + ret0, _ := ret[0].(*service.ApplicationStatus) ret1, _ := ret[1].(error) return ret0, ret1 } diff --git a/internal/model/mock_model/mock_application_tag.go b/internal/service/mock_service/mock_application_tag.go similarity index 85% rename from internal/model/mock_model/mock_application_tag.go rename to internal/service/mock_service/mock_application_tag.go index 19e6cafd..47e86ec3 100644 --- a/internal/model/mock_model/mock_application_tag.go +++ b/internal/service/mock_service/mock_application_tag.go @@ -3,11 +3,11 @@ // // Generated by this command: // -// mockgen -source=application_tag.go -destination=mock_model/mock_application_tag.go -package=mock_model +// mockgen -source=application_tag.go -destination=mock_service/mock_application_tag.go -package=mock_service // -// Package mock_model is a generated GoMock package. -package mock_model +// Package mock_service is a generated GoMock package. +package mock_service import ( gomock "go.uber.org/mock/gomock" diff --git a/internal/model/mock_model/mock_application_target.go b/internal/service/mock_service/mock_application_target.go similarity index 82% rename from internal/model/mock_model/mock_application_target.go rename to internal/service/mock_service/mock_application_target.go index 2947a50c..e80d06c7 100644 --- a/internal/model/mock_model/mock_application_target.go +++ b/internal/service/mock_service/mock_application_target.go @@ -3,18 +3,18 @@ // // Generated by this command: // -// mockgen -source=application_target.go -destination=mock_model/mock_application_target.go -package=mock_model +// mockgen -source=application_target.go -destination=mock_service/mock_application_target.go -package=mock_service // -// Package mock_model is a generated GoMock package. -package mock_model +// Package mock_service is a generated GoMock package. +package mock_service import ( context "context" reflect "reflect" uuid "github.com/google/uuid" - model "github.com/traPtitech/Jomon/internal/model" + service "github.com/traPtitech/Jomon/internal/service" gomock "go.uber.org/mock/gomock" ) @@ -43,10 +43,10 @@ func (m *MockApplicationTargetRepository) EXPECT() *MockApplicationTargetReposit } // GetApplicationTargets mocks base method. -func (m *MockApplicationTargetRepository) GetApplicationTargets(ctx context.Context, applicationID uuid.UUID) ([]*model.ApplicationTargetDetail, error) { +func (m *MockApplicationTargetRepository) GetApplicationTargets(ctx context.Context, applicationID uuid.UUID) ([]*service.ApplicationTargetDetail, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "GetApplicationTargets", ctx, applicationID) - ret0, _ := ret[0].([]*model.ApplicationTargetDetail) + ret0, _ := ret[0].([]*service.ApplicationTargetDetail) ret1, _ := ret[1].(error) return ret0, ret1 } diff --git a/internal/model/mock_model/mock_comment.go b/internal/service/mock_service/mock_comment.go similarity index 86% rename from internal/model/mock_model/mock_comment.go rename to internal/service/mock_service/mock_comment.go index b46a77be..65aa593c 100644 --- a/internal/model/mock_model/mock_comment.go +++ b/internal/service/mock_service/mock_comment.go @@ -3,18 +3,18 @@ // // Generated by this command: // -// mockgen -source=comment.go -destination=mock_model/mock_comment.go -package=mock_model +// mockgen -source=comment.go -destination=mock_service/mock_comment.go -package=mock_service // -// Package mock_model is a generated GoMock package. -package mock_model +// Package mock_service is a generated GoMock package. +package mock_service import ( context "context" reflect "reflect" uuid "github.com/google/uuid" - model "github.com/traPtitech/Jomon/internal/model" + service "github.com/traPtitech/Jomon/internal/service" gomock "go.uber.org/mock/gomock" ) @@ -43,10 +43,10 @@ func (m *MockCommentRepository) EXPECT() *MockCommentRepositoryMockRecorder { } // CreateComment mocks base method. -func (m *MockCommentRepository) CreateComment(ctx context.Context, comment string, applicationID, userID uuid.UUID) (*model.Comment, error) { +func (m *MockCommentRepository) CreateComment(ctx context.Context, comment string, applicationID, userID uuid.UUID) (*service.Comment, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "CreateComment", ctx, comment, applicationID, userID) - ret0, _ := ret[0].(*model.Comment) + ret0, _ := ret[0].(*service.Comment) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -72,10 +72,10 @@ func (mr *MockCommentRepositoryMockRecorder) DeleteComment(ctx, applicationID, c } // GetComments mocks base method. -func (m *MockCommentRepository) GetComments(ctx context.Context, applicationID uuid.UUID) ([]*model.Comment, error) { +func (m *MockCommentRepository) GetComments(ctx context.Context, applicationID uuid.UUID) ([]*service.Comment, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "GetComments", ctx, applicationID) - ret0, _ := ret[0].([]*model.Comment) + ret0, _ := ret[0].([]*service.Comment) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -87,10 +87,10 @@ func (mr *MockCommentRepositoryMockRecorder) GetComments(ctx, applicationID any) } // UpdateComment mocks base method. -func (m *MockCommentRepository) UpdateComment(ctx context.Context, comment string, applicationID, commentID uuid.UUID) (*model.Comment, error) { +func (m *MockCommentRepository) UpdateComment(ctx context.Context, comment string, applicationID, commentID uuid.UUID) (*service.Comment, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "UpdateComment", ctx, comment, applicationID, commentID) - ret0, _ := ret[0].(*model.Comment) + ret0, _ := ret[0].(*service.Comment) ret1, _ := ret[1].(error) return ret0, ret1 } diff --git a/internal/model/mock_model/mock_file.go b/internal/service/mock_service/mock_file.go similarity index 86% rename from internal/model/mock_model/mock_file.go rename to internal/service/mock_service/mock_file.go index de84986b..f33a6560 100644 --- a/internal/model/mock_model/mock_file.go +++ b/internal/service/mock_service/mock_file.go @@ -3,18 +3,18 @@ // // Generated by this command: // -// mockgen -source=file.go -destination=mock_model/mock_file.go -package=mock_model +// mockgen -source=file.go -destination=mock_service/mock_file.go -package=mock_service // -// Package mock_model is a generated GoMock package. -package mock_model +// Package mock_service is a generated GoMock package. +package mock_service import ( context "context" reflect "reflect" uuid "github.com/google/uuid" - model "github.com/traPtitech/Jomon/internal/model" + service "github.com/traPtitech/Jomon/internal/service" gomock "go.uber.org/mock/gomock" ) @@ -43,10 +43,10 @@ func (m *MockFileRepository) EXPECT() *MockFileRepositoryMockRecorder { } // CreateFile mocks base method. -func (m *MockFileRepository) CreateFile(ctx context.Context, name, mimetype string, applicationID, userID uuid.UUID) (*model.File, error) { +func (m *MockFileRepository) CreateFile(ctx context.Context, name, mimetype string, applicationID, userID uuid.UUID) (*service.File, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "CreateFile", ctx, name, mimetype, applicationID, userID) - ret0, _ := ret[0].(*model.File) + ret0, _ := ret[0].(*service.File) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -72,10 +72,10 @@ func (mr *MockFileRepositoryMockRecorder) DeleteFile(ctx, fileID any) *gomock.Ca } // GetFile mocks base method. -func (m *MockFileRepository) GetFile(ctx context.Context, fileID uuid.UUID) (*model.File, error) { +func (m *MockFileRepository) GetFile(ctx context.Context, fileID uuid.UUID) (*service.File, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "GetFile", ctx, fileID) - ret0, _ := ret[0].(*model.File) + ret0, _ := ret[0].(*service.File) ret1, _ := ret[1].(error) return ret0, ret1 } diff --git a/internal/storage/mock_storage/mock_storage.go b/internal/service/mock_service/mock_storage.go similarity index 93% rename from internal/storage/mock_storage/mock_storage.go rename to internal/service/mock_service/mock_storage.go index 73a1cdbf..81151de5 100644 --- a/internal/storage/mock_storage/mock_storage.go +++ b/internal/service/mock_service/mock_storage.go @@ -3,11 +3,11 @@ // // Generated by this command: // -// mockgen -source=storage.go -destination=mock_storage/mock_storage.go -package=mock_storage +// mockgen -source=storage.go -destination=mock_service/mock_storage.go -package=mock_service // -// Package mock_storage is a generated GoMock package. -package mock_storage +// Package mock_service is a generated GoMock package. +package mock_service import ( context "context" diff --git a/internal/model/mock_model/mock_tag.go b/internal/service/mock_service/mock_tag.go similarity index 86% rename from internal/model/mock_model/mock_tag.go rename to internal/service/mock_service/mock_tag.go index 0f567298..81d69e88 100644 --- a/internal/model/mock_model/mock_tag.go +++ b/internal/service/mock_service/mock_tag.go @@ -3,18 +3,18 @@ // // Generated by this command: // -// mockgen -source=tag.go -destination=mock_model/mock_tag.go -package=mock_model +// mockgen -source=tag.go -destination=mock_service/mock_tag.go -package=mock_service // -// Package mock_model is a generated GoMock package. -package mock_model +// Package mock_service is a generated GoMock package. +package mock_service import ( context "context" reflect "reflect" uuid "github.com/google/uuid" - model "github.com/traPtitech/Jomon/internal/model" + service "github.com/traPtitech/Jomon/internal/service" gomock "go.uber.org/mock/gomock" ) @@ -43,10 +43,10 @@ func (m *MockTagRepository) EXPECT() *MockTagRepositoryMockRecorder { } // CreateTag mocks base method. -func (m *MockTagRepository) CreateTag(ctx context.Context, name string) (*model.Tag, error) { +func (m *MockTagRepository) CreateTag(ctx context.Context, name string) (*service.Tag, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "CreateTag", ctx, name) - ret0, _ := ret[0].(*model.Tag) + ret0, _ := ret[0].(*service.Tag) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -72,10 +72,10 @@ func (mr *MockTagRepositoryMockRecorder) DeleteTag(ctx, tagID any) *gomock.Call } // GetTag mocks base method. -func (m *MockTagRepository) GetTag(ctx context.Context, tagID uuid.UUID) (*model.Tag, error) { +func (m *MockTagRepository) GetTag(ctx context.Context, tagID uuid.UUID) (*service.Tag, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "GetTag", ctx, tagID) - ret0, _ := ret[0].(*model.Tag) + ret0, _ := ret[0].(*service.Tag) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -87,10 +87,10 @@ func (mr *MockTagRepositoryMockRecorder) GetTag(ctx, tagID any) *gomock.Call { } // GetTags mocks base method. -func (m *MockTagRepository) GetTags(ctx context.Context) ([]*model.Tag, error) { +func (m *MockTagRepository) GetTags(ctx context.Context) ([]*service.Tag, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "GetTags", ctx) - ret0, _ := ret[0].([]*model.Tag) + ret0, _ := ret[0].([]*service.Tag) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -102,10 +102,10 @@ func (mr *MockTagRepositoryMockRecorder) GetTags(ctx any) *gomock.Call { } // UpdateTag mocks base method. -func (m *MockTagRepository) UpdateTag(ctx context.Context, tagID uuid.UUID, name string) (*model.Tag, error) { +func (m *MockTagRepository) UpdateTag(ctx context.Context, tagID uuid.UUID, name string) (*service.Tag, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "UpdateTag", ctx, tagID, name) - ret0, _ := ret[0].(*model.Tag) + ret0, _ := ret[0].(*service.Tag) ret1, _ := ret[1].(error) return ret0, ret1 } diff --git a/internal/model/mock_model/mock_user.go b/internal/service/mock_service/mock_user.go similarity index 83% rename from internal/model/mock_model/mock_user.go rename to internal/service/mock_service/mock_user.go index 9bb0da06..bb20fb83 100644 --- a/internal/model/mock_model/mock_user.go +++ b/internal/service/mock_service/mock_user.go @@ -3,18 +3,18 @@ // // Generated by this command: // -// mockgen -source=user.go -destination=mock_model/mock_user.go -package=mock_model +// mockgen -source=user.go -destination=mock_service/mock_user.go -package=mock_service // -// Package mock_model is a generated GoMock package. -package mock_model +// Package mock_service is a generated GoMock package. +package mock_service import ( context "context" reflect "reflect" uuid "github.com/google/uuid" - model "github.com/traPtitech/Jomon/internal/model" + service "github.com/traPtitech/Jomon/internal/service" gomock "go.uber.org/mock/gomock" ) @@ -43,10 +43,10 @@ func (m *MockUserRepository) EXPECT() *MockUserRepositoryMockRecorder { } // CreateUser mocks base method. -func (m *MockUserRepository) CreateUser(ctx context.Context, name, dn string, accountManager bool) (*model.User, error) { +func (m *MockUserRepository) CreateUser(ctx context.Context, name, dn string, accountManager bool) (*service.User, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "CreateUser", ctx, name, dn, accountManager) - ret0, _ := ret[0].(*model.User) + ret0, _ := ret[0].(*service.User) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -58,10 +58,10 @@ func (mr *MockUserRepositoryMockRecorder) CreateUser(ctx, name, dn, accountManag } // GetUserByID mocks base method. -func (m *MockUserRepository) GetUserByID(ctx context.Context, userID uuid.UUID) (*model.User, error) { +func (m *MockUserRepository) GetUserByID(ctx context.Context, userID uuid.UUID) (*service.User, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "GetUserByID", ctx, userID) - ret0, _ := ret[0].(*model.User) + ret0, _ := ret[0].(*service.User) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -73,10 +73,10 @@ func (mr *MockUserRepositoryMockRecorder) GetUserByID(ctx, userID any) *gomock.C } // GetUserByName mocks base method. -func (m *MockUserRepository) GetUserByName(ctx context.Context, name string) (*model.User, error) { +func (m *MockUserRepository) GetUserByName(ctx context.Context, name string) (*service.User, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "GetUserByName", ctx, name) - ret0, _ := ret[0].(*model.User) + ret0, _ := ret[0].(*service.User) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -88,10 +88,10 @@ func (mr *MockUserRepositoryMockRecorder) GetUserByName(ctx, name any) *gomock.C } // GetUsers mocks base method. -func (m *MockUserRepository) GetUsers(ctx context.Context) ([]*model.User, error) { +func (m *MockUserRepository) GetUsers(ctx context.Context) ([]*service.User, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "GetUsers", ctx) - ret0, _ := ret[0].([]*model.User) + ret0, _ := ret[0].([]*service.User) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -103,10 +103,10 @@ func (mr *MockUserRepositoryMockRecorder) GetUsers(ctx any) *gomock.Call { } // UpdateUser mocks base method. -func (m *MockUserRepository) UpdateUser(ctx context.Context, userID uuid.UUID, name, dn string, accountManager bool) (*model.User, error) { +func (m *MockUserRepository) UpdateUser(ctx context.Context, userID uuid.UUID, name, dn string, accountManager bool) (*service.User, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "UpdateUser", ctx, userID, name, dn, accountManager) - ret0, _ := ret[0].(*model.User) + ret0, _ := ret[0].(*service.User) ret1, _ := ret[1].(error) return ret0, ret1 } diff --git a/internal/service/repository.go b/internal/service/repository.go new file mode 100644 index 00000000..ba1927b6 --- /dev/null +++ b/internal/service/repository.go @@ -0,0 +1,14 @@ +package service + +type Repository interface { + AccountManagerRepository + CommentRepository + FileRepository + ApplicationFileRepository + ApplicationStatusRepository + ApplicationTagRepository + ApplicationTargetRepository + ApplicationRepository + TagRepository + UserRepository +} diff --git a/internal/storage/storage.go b/internal/service/storage.go similarity index 81% rename from internal/storage/storage.go rename to internal/service/storage.go index c3e64456..6fc6ca75 100644 --- a/internal/storage/storage.go +++ b/internal/service/storage.go @@ -1,16 +1,11 @@ //go:generate go tool mockgen -source=$GOFILE -destination=mock_$GOPACKAGE/mock_$GOFILE -package=mock_$GOPACKAGE -package storage +package service import ( "context" - "errors" "io" ) -var ( - ErrFileNotFound = errors.New("not found") -) - type Storage interface { Save(ctx context.Context, filename string, src io.Reader) error Open(ctx context.Context, filename string) (io.ReadCloser, error) diff --git a/internal/service/tag.go b/internal/service/tag.go new file mode 100644 index 00000000..b312ce4d --- /dev/null +++ b/internal/service/tag.go @@ -0,0 +1,26 @@ +//go:generate go tool mockgen -source=$GOFILE -destination=mock_$GOPACKAGE/mock_$GOFILE -package=mock_$GOPACKAGE +package service + +import ( + "context" + "time" + + "github.com/google/uuid" + "github.com/traPtitech/Jomon/internal/nulltime" +) + +type Tag struct { + ID uuid.UUID + Name string + CreatedAt time.Time + UpdatedAt time.Time + DeletedAt nulltime.NullTime +} + +type TagRepository interface { + GetTags(ctx context.Context) ([]*Tag, error) + GetTag(ctx context.Context, tagID uuid.UUID) (*Tag, error) + CreateTag(ctx context.Context, name string) (*Tag, error) + UpdateTag(ctx context.Context, tagID uuid.UUID, name string) (*Tag, error) + DeleteTag(ctx context.Context, tagID uuid.UUID) error +} diff --git a/internal/service/user.go b/internal/service/user.go new file mode 100644 index 00000000..c30f26a1 --- /dev/null +++ b/internal/service/user.go @@ -0,0 +1,30 @@ +//go:generate go tool mockgen -source=$GOFILE -destination=mock_$GOPACKAGE/mock_$GOFILE -package=mock_$GOPACKAGE +package service + +import ( + "context" + "time" + + "github.com/google/uuid" + "github.com/traPtitech/Jomon/internal/nulltime" +) + +type User struct { + ID uuid.UUID + Name string + DisplayName string + AccountManager bool + CreatedAt time.Time + UpdatedAt time.Time + DeletedAt nulltime.NullTime +} + +type UserRepository interface { + CreateUser(ctx context.Context, name string, dn string, accountManager bool) (*User, error) + GetUserByID(ctx context.Context, userID uuid.UUID) (*User, error) + GetUserByName(ctx context.Context, name string) (*User, error) + GetUsers(ctx context.Context) ([]*User, error) + UpdateUser( + ctx context.Context, userID uuid.UUID, name string, dn string, accountManager bool, + ) (*User, error) +} diff --git a/internal/storage/error.go b/internal/storage/error.go new file mode 100644 index 00000000..7b1fdf3d --- /dev/null +++ b/internal/storage/error.go @@ -0,0 +1,7 @@ +package storage + +import ( + "github.com/traPtitech/Jomon/internal/service" +) + +var ErrFileNotFound = service.NewNotFoundError("file not found") diff --git a/internal/storage/local.go b/internal/storage/local.go index 6f767e9b..7170fb22 100644 --- a/internal/storage/local.go +++ b/internal/storage/local.go @@ -6,6 +6,8 @@ import ( "io" "os" "path/filepath" + + "github.com/traPtitech/Jomon/internal/service" ) type Local struct { @@ -55,4 +57,4 @@ func (l *Local) getFilePath(filename string) string { return filepath.Join(l.localDir, filename) } -var _ Storage = (*Local)(nil) +var _ service.Storage = (*Local)(nil) diff --git a/internal/storage/s3.go b/internal/storage/s3.go index 5aea7817..ca0de5be 100644 --- a/internal/storage/s3.go +++ b/internal/storage/s3.go @@ -10,6 +10,7 @@ import ( "github.com/aws/aws-sdk-go-v2/feature/s3/manager" "github.com/aws/aws-sdk-go-v2/service/s3" "github.com/aws/aws-sdk-go-v2/service/s3/types" + "github.com/traPtitech/Jomon/internal/service" ) type S3Storage struct { @@ -28,7 +29,7 @@ func NewS3Storage(cfg aws.Config, bucket string) *S3Storage { return s } -// FIXME : 引数に`key string`を受け取り、`Key`フィールドに渡したいがinterfaceの定義上一時的に`filename`で代用してる あとで分ける +// FIXME: 引数に`key string`を受け取り、`Key`フィールドに渡したいがinterfaceの定義上一時的に`filename`で代用してる あとで分ける func (fs *S3Storage) Save(ctx context.Context, filename string, src io.Reader) error { input := &s3.PutObjectInput{ Bucket: aws.String(fs.bucket), @@ -77,4 +78,4 @@ func (fs *S3Storage) Delete(ctx context.Context, key string) error { return nil } -var _ Storage = (*S3Storage)(nil) +var _ service.Storage = (*S3Storage)(nil) diff --git a/internal/storage/swift.go b/internal/storage/swift.go index 84932f23..521691ff 100644 --- a/internal/storage/swift.go +++ b/internal/storage/swift.go @@ -6,6 +6,7 @@ import ( "io" "github.com/ncw/swift" + "github.com/traPtitech/Jomon/internal/service" ) type Swift struct { @@ -67,4 +68,4 @@ func (s *Swift) Delete(_ context.Context, filename string) error { return nil } -var _ Storage = (*Swift)(nil) +var _ service.Storage = (*Swift)(nil) diff --git a/main.go b/main.go index ab6787a4..de0a7367 100644 --- a/main.go +++ b/main.go @@ -7,6 +7,7 @@ import ( "github.com/traPtitech/Jomon/internal/logging" "github.com/traPtitech/Jomon/internal/model" "github.com/traPtitech/Jomon/internal/router" + "github.com/traPtitech/Jomon/internal/service" "github.com/traPtitech/Jomon/internal/storage" "github.com/traPtitech/Jomon/internal/webhook" "go.uber.org/zap" @@ -21,7 +22,7 @@ func main() { defer client.Close() // Setup storage - var strg storage.Storage + var strg service.Storage if os.Getenv("IS_DEBUG_MODE") != "" { strg, err = storage.NewLocalStorage(os.Getenv("UPLOAD_DIR")) if err != nil {