From a2b9d435addb97f1fffccb24d0514d9c924d6314 Mon Sep 17 00:00:00 2001 From: Shion Ichikawa Date: Sat, 18 Mar 2023 20:16:52 +0900 Subject: [PATCH 01/10] =?UTF-8?q?=E2=9C=A8=20(pkg/gcs)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pkg/gcs/bucket.go | 14 +++++++++ pkg/gcs/client.go | 25 ++++++++++++++++ pkg/gcs/folder.go | 72 +++++++++++++++++++++++++++++++++++++++++++++++ pkg/gcs/object.go | 26 +++++++++++++++++ 4 files changed, 137 insertions(+) create mode 100644 pkg/gcs/bucket.go create mode 100644 pkg/gcs/client.go create mode 100644 pkg/gcs/folder.go create mode 100644 pkg/gcs/object.go diff --git a/pkg/gcs/bucket.go b/pkg/gcs/bucket.go new file mode 100644 index 0000000..47fdeaa --- /dev/null +++ b/pkg/gcs/bucket.go @@ -0,0 +1,14 @@ +package gcs + +import "cloud.google.com/go/storage" + +type BucketRef struct { + bucket *storage.BucketHandle +} + +func (r BucketRef) Folder(name string) *FolderRef { + return &FolderRef{ + basePath: name, + bucket: nil, + } +} diff --git a/pkg/gcs/client.go b/pkg/gcs/client.go new file mode 100644 index 0000000..0c5dad6 --- /dev/null +++ b/pkg/gcs/client.go @@ -0,0 +1,25 @@ +package gcs + +import ( + "cloud.google.com/go/storage" + "context" +) + +type Client struct { + client *storage.Client +} + +func NewClient(ctx context.Context) (*Client, error) { + client, err := storage.NewClient(ctx) + + if err != nil { + return nil, err + } + return &Client{client: client}, nil +} + +func (c Client) Bucket(name string) *BucketRef { + return &BucketRef{ + bucket: c.client.Bucket(name), + } +} diff --git a/pkg/gcs/folder.go b/pkg/gcs/folder.go new file mode 100644 index 0000000..a36a921 --- /dev/null +++ b/pkg/gcs/folder.go @@ -0,0 +1,72 @@ +package gcs + +import ( + "cloud.google.com/go/storage" + "context" + "google.golang.org/api/iterator" +) + +type FolderRef struct { + // basePath should be the prefix of object name + // e.g. basePath = "foo/bar/", object name = "foo/bar/baz" + // e.g. basePath = "ynufes/", object name = "ynufes/shion" + basePath string + bucket *storage.BucketHandle +} + +func (f FolderRef) Object(name string) ObjectRef { + return ObjectRef{ + objName: f.basePath + name, + bucket: f.bucket, + } +} + +func (f FolderRef) Folder(name string) FolderRef { + return FolderRef{ + basePath: f.basePath + name + "/", + bucket: f.bucket, + } +} + +func (f FolderRef) List(ctx context.Context) ([]FolderRef, []ObjectRef, error) { + results := f.bucket.Objects(ctx, &storage.Query{ + Prefix: f.basePath, + Delimiter: "/", + }) + var folders []FolderRef + var objects []ObjectRef + for { + next, err := results.Next() + if err == iterator.Done { + break + } + if err != nil { + return nil, nil, err + } + + if next.Prefix != "" { + folders = append(folders, FolderRef{ + basePath: next.Prefix, + bucket: f.bucket, + }) + } else { + objects = append(objects, ObjectRef{ + objName: next.Name, + bucket: f.bucket, + }) + } + } + return folders, objects, nil +} + +func (f FolderRef) Upload(ctx context.Context, name string, data []byte) (*ObjectRef, error) { + w := f.bucket.Object(f.basePath + name).NewWriter(ctx) + defer w.Close() + if _, err := w.Write(data); err != nil { + return nil, err + } + return &ObjectRef{ + objName: f.basePath + name, + bucket: f.bucket, + }, nil +} diff --git a/pkg/gcs/object.go b/pkg/gcs/object.go new file mode 100644 index 0000000..05e9a6a --- /dev/null +++ b/pkg/gcs/object.go @@ -0,0 +1,26 @@ +package gcs + +import ( + "cloud.google.com/go/storage" + "time" +) + +type ( + ObjectRef struct { + objName string + bucket *storage.BucketHandle + } + SignedObjectLink string +) + +func (r ObjectRef) IssueLink() (SignedObjectLink, error) { + url, err := r.bucket.SignedURL(r.objName, &storage.SignedURLOptions{ + Method: "GET", + Expires: time.Now().Add(time.Minute * 1), + Scheme: storage.SigningSchemeV4, + }) + if err != nil { + return "", err + } + return SignedObjectLink(url), nil +} From 7a225353cfdd2661f77b4d3bbd5d689e7f1cc013 Mon Sep 17 00:00:00 2001 From: Shion Ichikawa Date: Sun, 19 Mar 2023 06:26:40 +0900 Subject: [PATCH 02/10] =?UTF-8?q?=E2=9C=A8=20(pkg/gcs)=20Name(),Download()?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pkg/gcs/object.go | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/pkg/gcs/object.go b/pkg/gcs/object.go index 05e9a6a..56b826a 100644 --- a/pkg/gcs/object.go +++ b/pkg/gcs/object.go @@ -2,6 +2,8 @@ package gcs import ( "cloud.google.com/go/storage" + "context" + "io" "time" ) @@ -13,6 +15,24 @@ type ( SignedObjectLink string ) +func (r ObjectRef) Name() string { + return r.objName +} + +func (r ObjectRef) Download(ctx context.Context) ([]byte, error) { + reader, err := r.bucket.Object(r.objName).NewReader(ctx) + if err != nil { + return nil, err + } + defer reader.Close() + + data, err := io.ReadAll(reader) + if err != nil { + return nil, err + } + return data, nil +} + func (r ObjectRef) IssueLink() (SignedObjectLink, error) { url, err := r.bucket.SignedURL(r.objName, &storage.SignedURLOptions{ Method: "GET", From bc1cdb6f8cb3fdeb38055f94226f0f09794b2e4c Mon Sep 17 00:00:00 2001 From: Shion Ichikawa Date: Sun, 19 Mar 2023 10:01:05 +0900 Subject: [PATCH 03/10] =?UTF-8?q?=F0=9F=90=9B=20(entity/response)ID?= =?UTF-8?q?=E5=9E=8B=E3=81=AE=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- svc/pkg/infra/entity/response/aggregate.go | 35 ++++++++++++++-------- 1 file changed, 23 insertions(+), 12 deletions(-) diff --git a/svc/pkg/infra/entity/response/aggregate.go b/svc/pkg/infra/entity/response/aggregate.go index 4183d1b..d54589f 100644 --- a/svc/pkg/infra/entity/response/aggregate.go +++ b/svc/pkg/infra/entity/response/aggregate.go @@ -8,22 +8,33 @@ import ( const ResponseRootName = "Responses" -type ( - Response struct { - ID id.UserID `json:"-"` - OrgID int64 `json:"org_id"` - AuthorID int64 `json:"author_id"` - FormID int64 `json:"form_id"` - Data map[string]interface{} `json:"data"` - } -) +type Response struct { + ID id.UserID `json:"-"` + OrgID string `json:"org_id"` + AuthorID string `json:"author_id"` + FormID string `json:"form_id"` + Data map[string]interface{} `json:"data"` +} func (r Response) ToModel() (*response.Response, error) { + orgID, err := identity.ImportID(r.OrgID) + if err != nil { + return nil, err + } + authorID, err := identity.ImportID(r.AuthorID) + if err != nil { + return nil, err + } + formID, err := identity.ImportID(r.FormID) + if err != nil { + return nil, err + } + return &response.Response{ ID: r.ID, - OrgID: identity.NewID(r.OrgID), - AuthorID: identity.NewID(r.AuthorID), - FormID: identity.NewID(r.FormID), + OrgID: orgID, + AuthorID: authorID, + FormID: formID, Data: r.Data, }, nil } From f7c8bde95679fbd8aa0e22f8fc11396570552192 Mon Sep 17 00:00:00 2001 From: Shion Ichikawa Date: Sun, 19 Mar 2023 11:45:01 +0900 Subject: [PATCH 04/10] =?UTF-8?q?=E2=9C=A8=20(reader/response)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- svc/pkg/domain/model/id/id.go | 1 + svc/pkg/infra/entity/response/aggregate.go | 30 ++++-- svc/pkg/infra/reader/response.go | 112 +++++++++++++++++++++ 3 files changed, 137 insertions(+), 6 deletions(-) create mode 100644 svc/pkg/infra/reader/response.go diff --git a/svc/pkg/domain/model/id/id.go b/svc/pkg/domain/model/id/id.go index 7d69e3d..8330358 100644 --- a/svc/pkg/domain/model/id/id.go +++ b/svc/pkg/domain/model/id/id.go @@ -9,6 +9,7 @@ type ( FormID util.ID SectionID util.ID QuestionID util.ID + ResponseID util.ID OrgIDs []OrgID RoleID util.ID ) diff --git a/svc/pkg/infra/entity/response/aggregate.go b/svc/pkg/infra/entity/response/aggregate.go index d54589f..1689c9a 100644 --- a/svc/pkg/infra/entity/response/aggregate.go +++ b/svc/pkg/infra/entity/response/aggregate.go @@ -8,12 +8,30 @@ import ( const ResponseRootName = "Responses" -type Response struct { - ID id.UserID `json:"-"` - OrgID string `json:"org_id"` - AuthorID string `json:"author_id"` - FormID string `json:"form_id"` - Data map[string]interface{} `json:"data"` +type ( + Response struct { + ID id.ResponseID `json:"-"` + OrgID string `json:"org_id"` + AuthorID string `json:"author_id"` + FormID string `json:"form_id"` + QuestionResponses map[string]QuestionResponse `json:"questions"` + } + QuestionResponse struct { + QuestionID id.QuestionID `json:"-"` + ResponseData map[string]interface{} `json:"data"` + } +) + +func NewResponse( + rid id.ResponseID, + oid string, + aid string, + fid string, + data map[string]QuestionResponse, +) Response { + return Response{ + rid, oid, aid, fid, data, + } } func (r Response) ToModel() (*response.Response, error) { diff --git a/svc/pkg/infra/reader/response.go b/svc/pkg/infra/reader/response.go new file mode 100644 index 0000000..cf9e134 --- /dev/null +++ b/svc/pkg/infra/reader/response.go @@ -0,0 +1,112 @@ +package reader + +import ( + "context" + "firebase.google.com/go/v4/db" + "fmt" + "ynufes-mypage-backend/pkg/firebase" + "ynufes-mypage-backend/svc/pkg/domain/model/id" + "ynufes-mypage-backend/svc/pkg/domain/model/response" + "ynufes-mypage-backend/svc/pkg/exception" + entity "ynufes-mypage-backend/svc/pkg/infra/entity/response" +) + +type Response struct { + ref *db.Ref +} + +func NewResponse(f firebase.Firebase) Response { + return Response{ + ref: f.Client(entity.ResponseRootName), + } +} + +func (r Response) GetByID(ctx context.Context, oid id.ResponseID) (*response.Response, error) { + var responseEntity entity.Response + hits, err := r.ref.OrderByKey(). + EqualTo(oid.ExportID()).GetOrdered(ctx) + if err != nil { + return nil, err + } + if len(hits) == 0 { + return nil, exception.ErrNotFound + } + if err := hits[0].Unmarshal(&responseEntity); err != nil { + return nil, fmt.Errorf("failed to unmarshal response entity: %w", err) + } + responseEntity.ID = oid + m, err := responseEntity.ToModel() + if err != nil { + return nil, err + } + return m, nil +} + +func (r Response) ListByFormID(ctx context.Context, fid id.FormID) ([]response.Response, error) { + hits, err := r.ref.OrderByChild("form_id"). + EqualTo(fid.ExportID()).GetOrdered(ctx) + if err != nil { + return nil, err + } + if len(hits) == 0 { + return nil, exception.ErrNotFound + } + resps := make([]response.Response, 0, len(hits)) + for _, hit := range hits { + var e entity.Response + if err := hit.Unmarshal(&e); err != nil { + return nil, fmt.Errorf("failed to unmarshal response entity: %w", err) + } + e.ID = fid + m, err := e.ToModel() + if err != nil { + return nil, err + } + resps = append(resps, *m) + } + return resps, nil +} + +func (r Response) ListByOrgID(ctx context.Context, oid id.OrgID) ([]response.Response, error) { + hits, err := r.ref.OrderByChild("org_id"). + EqualTo(oid.ExportID()).GetOrdered(ctx) + if err != nil { + return nil, err + } + resps := make([]response.Response, 0, len(hits)) + for _, hit := range hits { + var e entity.Response + if err := hit.Unmarshal(&e); err != nil { + return nil, fmt.Errorf("failed to unmarshal response entity: %w", err) + } + e.ID = oid + m, err := e.ToModel() + if err != nil { + return nil, err + } + resps = append(resps, *m) + } + return resps, nil +} + +func (r Response) ListByAuthorID(ctx context.Context, uid id.UserID) ([]response.Response, error) { + hits, err := r.ref.OrderByChild("author_id"). + EqualTo(uid.ExportID()).GetOrdered(ctx) + if err != nil { + return nil, err + } + resps := make([]response.Response, 0, len(hits)) + for _, hit := range hits { + var e entity.Response + if err := hit.Unmarshal(&e); err != nil { + return nil, fmt.Errorf("failed to unmarshal response entity: %w", err) + } + e.ID = uid + m, err := e.ToModel() + if err != nil { + return nil, err + } + resps = append(resps, *m) + } + return resps, nil +} From 2403fb70694a69edc167a1b188056760c4025e6f Mon Sep 17 00:00:00 2001 From: Shion Ichikawa Date: Sun, 19 Mar 2023 17:54:31 +0900 Subject: [PATCH 05/10] =?UTF-8?q?=E2=9C=A8=20(typecast)ConvertToStringMapI?= =?UTF-8?q?nterface?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pkg/typecast/cast.go | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/pkg/typecast/cast.go b/pkg/typecast/cast.go index 2a102d7..21ccc1f 100644 --- a/pkg/typecast/cast.go +++ b/pkg/typecast/cast.go @@ -1,6 +1,25 @@ package typecast -import "errors" +import ( + "errors" + "fmt" +) + +func ConvertToStringMapInterface(v interface{}) (map[string]interface{}, error) { + m, ok := v.(map[interface{}]interface{}) + if !ok { + return nil, fmt.Errorf("ConvertToStringMapInterface: %v is not a map", v) + } + res := make(map[string]interface{}) + for k, v := range m { + key, ok := k.(string) + if !ok { + return nil, fmt.Errorf("ConvertToStringMapInterface: map key %v is not a string", k) + } + res[key] = v + } + return res, nil +} func ConvertToStringMapString(v interface{}) (map[string]string, error) { m, ok := v.(map[string]string) From 44c7f6fea753408d5df42c1c1a9e3215e0fb2497 Mon Sep 17 00:00:00 2001 From: Shion Ichikawa Date: Sun, 19 Mar 2023 18:24:40 +0900 Subject: [PATCH 06/10] =?UTF-8?q?=E2=9C=A8=20(model,entity/response)Questi?= =?UTF-8?q?onResponse?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- svc/pkg/domain/model/response/aggregate.go | 10 ++++---- svc/pkg/infra/entity/response/aggregate.go | 27 ++++++++++++++++------ 2 files changed, 26 insertions(+), 11 deletions(-) diff --git a/svc/pkg/domain/model/response/aggregate.go b/svc/pkg/domain/model/response/aggregate.go index ee1f0b7..be9d80f 100644 --- a/svc/pkg/domain/model/response/aggregate.go +++ b/svc/pkg/domain/model/response/aggregate.go @@ -2,16 +2,18 @@ package response import ( "ynufes-mypage-backend/svc/pkg/domain/model/id" - "ynufes-mypage-backend/svc/pkg/domain/model/util" ) type ( Response struct { - ID ID + ID id.ResponseID OrgID id.OrgID AuthorID id.UserID FormID id.FormID - Data map[string]interface{} + Data map[id.QuestionID]QuestionResponse + } + QuestionResponse struct { + QuestionID id.QuestionID + ResponseData map[string]interface{} } - ID util.ID ) diff --git a/svc/pkg/infra/entity/response/aggregate.go b/svc/pkg/infra/entity/response/aggregate.go index 1689c9a..f28ea25 100644 --- a/svc/pkg/infra/entity/response/aggregate.go +++ b/svc/pkg/infra/entity/response/aggregate.go @@ -48,11 +48,24 @@ func (r Response) ToModel() (*response.Response, error) { return nil, err } - return &response.Response{ - ID: r.ID, - OrgID: orgID, - AuthorID: authorID, - FormID: formID, - Data: r.Data, - }, nil + data := make(map[id.QuestionID]response.QuestionResponse, len(r.QuestionResponses)) + for k, v := range r.QuestionResponses { + qid, err := identity.ImportID(k) + if err != nil { + return nil, err + } + data[qid] = response.QuestionResponse{ + QuestionID: qid, + ResponseData: v.ResponseData, + } + } + + resp := response.NewResponse( + r.ID, + orgID, + authorID, + formID, + data, + ) + return &resp, nil } From f309024482bfdfedfc9cde12e85983477844cc00 Mon Sep 17 00:00:00 2001 From: Shion Ichikawa Date: Sun, 19 Mar 2023 18:25:20 +0900 Subject: [PATCH 07/10] =?UTF-8?q?=E2=9C=A8=20(model,entity/response)Factor?= =?UTF-8?q?yFunc?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- svc/pkg/domain/model/response/aggregate.go | 19 +++++++++++++++++++ svc/pkg/infra/entity/response/aggregate.go | 6 ++++++ 2 files changed, 25 insertions(+) diff --git a/svc/pkg/domain/model/response/aggregate.go b/svc/pkg/domain/model/response/aggregate.go index be9d80f..68d483f 100644 --- a/svc/pkg/domain/model/response/aggregate.go +++ b/svc/pkg/domain/model/response/aggregate.go @@ -17,3 +17,22 @@ type ( ResponseData map[string]interface{} } ) + +func NewResponse( + rid id.ResponseID, + oid id.OrgID, + aid id.UserID, + fid id.FormID, + data map[id.QuestionID]QuestionResponse, +) Response { + return Response{ + rid, oid, aid, fid, data, + } +} + +func NewQuestionResponse( + qid id.QuestionID, + data map[string]interface{}, +) QuestionResponse { + return QuestionResponse{qid, data} +} diff --git a/svc/pkg/infra/entity/response/aggregate.go b/svc/pkg/infra/entity/response/aggregate.go index f28ea25..b5c6519 100644 --- a/svc/pkg/infra/entity/response/aggregate.go +++ b/svc/pkg/infra/entity/response/aggregate.go @@ -34,6 +34,12 @@ func NewResponse( } } +func NewQuestionResponse( + qid id.QuestionID, data map[string]interface{}, +) QuestionResponse { + return QuestionResponse{qid, data} +} + func (r Response) ToModel() (*response.Response, error) { orgID, err := identity.ImportID(r.OrgID) if err != nil { From f4e3a942006c9e94d0dbaef038277bec5fc198bc Mon Sep 17 00:00:00 2001 From: Shion Ichikawa Date: Sun, 19 Mar 2023 18:26:10 +0900 Subject: [PATCH 08/10] =?UTF-8?q?=E2=9C=A8=20(writer/response)response?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- svc/pkg/infra/writer/response.go | 71 ++++++++++++++++++++++++++++++++ 1 file changed, 71 insertions(+) create mode 100644 svc/pkg/infra/writer/response.go diff --git a/svc/pkg/infra/writer/response.go b/svc/pkg/infra/writer/response.go new file mode 100644 index 0000000..52dc497 --- /dev/null +++ b/svc/pkg/infra/writer/response.go @@ -0,0 +1,71 @@ +package writer + +import ( + "context" + "firebase.google.com/go/v4/db" + "fmt" + "ynufes-mypage-backend/pkg/identity" + "ynufes-mypage-backend/pkg/typecast" + "ynufes-mypage-backend/svc/pkg/domain/model/response" + "ynufes-mypage-backend/svc/pkg/exception" + entity "ynufes-mypage-backend/svc/pkg/infra/entity/response" +) + +type Response struct { + ref *db.Ref +} + +func NewResponse(f *db.Ref) Response { + return Response{ + ref: f, + } +} + +func (w Response) Create(ctx context.Context, resp *response.Response) error { + if resp.ID != nil && resp.ID.HasValue() { + return exception.ErrIDAlreadyAssigned + } + if resp.OrgID == nil || !resp.OrgID.HasValue() || + resp.AuthorID == nil || !resp.AuthorID.HasValue() || + resp.FormID == nil || !resp.FormID.HasValue() { + return exception.ErrIDNotAssigned + } + newID := identity.IssueID() + data := make(map[string]entity.QuestionResponse, len(resp.Data)) + for key, val := range resp.Data { + mapInterface, err := typecast.ConvertToStringMapInterface(val) + if err != nil { + return fmt.Errorf("failed to convert to entity QuestionResponse: %w", err) + } + data[key.ExportID()] = entity.NewQuestionResponse(key, mapInterface) + } + e := entity.NewResponse( + newID, resp.OrgID.ExportID(), resp.AuthorID.ExportID(), resp.FormID.ExportID(), data, + ) + if err := w.ref.Child(newID.ExportID()).Set(ctx, e); err != nil { + return err + } + resp.ID = newID + return nil +} + +func (w Response) Set(ctx context.Context, resp response.Response) error { + if resp.ID == nil || !resp.ID.HasValue() { + return exception.ErrIDNotAssigned + } + data := make(map[string]entity.QuestionResponse, len(resp.Data)) + for key, val := range resp.Data { + mapInterface, err := typecast.ConvertToStringMapInterface(val) + if err != nil { + return fmt.Errorf("failed to convert to entity QuestionResponse: %w", err) + } + data[key.ExportID()] = entity.NewQuestionResponse(key, mapInterface) + } + e := entity.NewResponse( + resp.ID, resp.OrgID.ExportID(), resp.AuthorID.ExportID(), resp.FormID.ExportID(), data, + ) + if err := w.ref.Child(resp.ID.ExportID()).Set(ctx, e); err != nil { + return err + } + return nil +} From 9d83ff6760ca4789cabdd6acbcad5409b7cef3aa Mon Sep 17 00:00:00 2001 From: Shion Ichikawa Date: Sun, 19 Mar 2023 18:35:33 +0900 Subject: [PATCH 09/10] =?UTF-8?q?=F0=9F=90=9B=20(writer,reader/response)Fa?= =?UTF-8?q?ctory=E9=96=A2=E6=95=B0=E3=81=AE=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- svc/pkg/infra/reader/response.go | 2 +- svc/pkg/infra/writer/response.go | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/svc/pkg/infra/reader/response.go b/svc/pkg/infra/reader/response.go index cf9e134..ea8b722 100644 --- a/svc/pkg/infra/reader/response.go +++ b/svc/pkg/infra/reader/response.go @@ -15,7 +15,7 @@ type Response struct { ref *db.Ref } -func NewResponse(f firebase.Firebase) Response { +func NewResponse(f *firebase.Firebase) Response { return Response{ ref: f.Client(entity.ResponseRootName), } diff --git a/svc/pkg/infra/writer/response.go b/svc/pkg/infra/writer/response.go index 52dc497..f926c01 100644 --- a/svc/pkg/infra/writer/response.go +++ b/svc/pkg/infra/writer/response.go @@ -4,6 +4,7 @@ import ( "context" "firebase.google.com/go/v4/db" "fmt" + "ynufes-mypage-backend/pkg/firebase" "ynufes-mypage-backend/pkg/identity" "ynufes-mypage-backend/pkg/typecast" "ynufes-mypage-backend/svc/pkg/domain/model/response" @@ -15,9 +16,9 @@ type Response struct { ref *db.Ref } -func NewResponse(f *db.Ref) Response { +func NewResponse(f *firebase.Firebase) Response { return Response{ - ref: f, + ref: f.Client(entity.ResponseRootName), } } From 85a473d3b72289c7db11a86a980ef7c2b98acc61 Mon Sep 17 00:00:00 2001 From: Shion Ichikawa Date: Sun, 19 Mar 2023 18:36:04 +0900 Subject: [PATCH 10/10] =?UTF-8?q?=E2=9C=A8=20(command,query/response)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- svc/pkg/domain/command/response.go | 11 +++++++++++ svc/pkg/domain/query/response.go | 14 ++++++++++++++ svc/pkg/registry/repository.go | 8 ++++++++ 3 files changed, 33 insertions(+) create mode 100644 svc/pkg/domain/command/response.go create mode 100644 svc/pkg/domain/query/response.go diff --git a/svc/pkg/domain/command/response.go b/svc/pkg/domain/command/response.go new file mode 100644 index 0000000..43689a6 --- /dev/null +++ b/svc/pkg/domain/command/response.go @@ -0,0 +1,11 @@ +package command + +import ( + "context" + "ynufes-mypage-backend/svc/pkg/domain/model/response" +) + +type Response interface { + Create(ctx context.Context, resp *response.Response) error + Set(ctx context.Context, resp response.Response) error +} diff --git a/svc/pkg/domain/query/response.go b/svc/pkg/domain/query/response.go new file mode 100644 index 0000000..72462b1 --- /dev/null +++ b/svc/pkg/domain/query/response.go @@ -0,0 +1,14 @@ +package query + +import ( + "context" + "ynufes-mypage-backend/svc/pkg/domain/model/id" + "ynufes-mypage-backend/svc/pkg/domain/model/response" +) + +type Response interface { + GetByID(ctx context.Context, oid id.ResponseID) (*response.Response, error) + ListByFormID(ctx context.Context, fid id.FormID) ([]response.Response, error) + ListByOrgID(ctx context.Context, oid id.OrgID) ([]response.Response, error) + ListByAuthorID(ctx context.Context, uid id.UserID) ([]response.Response, error) +} diff --git a/svc/pkg/registry/repository.go b/svc/pkg/registry/repository.go index 8298e0d..f647aaf 100644 --- a/svc/pkg/registry/repository.go +++ b/svc/pkg/registry/repository.go @@ -83,3 +83,11 @@ func (repo Repository) NewLineCommand() command.Line { func (repo Repository) NewLineQuery() query.Line { return reader.NewLine(repo.fb) } + +func (repo Repository) NewResponseCommand() command.Response { + return writer.NewResponse(repo.fb) +} + +func (repo Repository) NewResponseQuery() query.Response { + return reader.NewResponse(repo.fb) +}