Skip to content

Commit 0fab4d4

Browse files
feat: New RPCs
1 parent a477a51 commit 0fab4d4

File tree

9 files changed

+262
-18
lines changed

9 files changed

+262
-18
lines changed

.golangci.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -506,6 +506,7 @@ linters:
506506
- interfacer
507507
- maligned
508508
- nosnakecase
509+
- prealloc
509510
- scopelint
510511
- structcheck
511512
- testpackage

cmd/svc/license/service/service.go

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@ import (
1212
"github.com/bufbuild/protovalidate-go"
1313
"github.com/sirupsen/logrus"
1414
"github.com/volatiletech/sqlboiler/v4/boil"
15+
"github.com/volatiletech/sqlboiler/v4/queries/qm"
16+
"google.golang.org/protobuf/types/known/timestamppb"
1517

1618
"github.com/kevinmichaelchen/temporal-saga-grpc/cmd/svc/license/models"
1719
)
@@ -74,3 +76,52 @@ func (s *Service) CreateLicense(
7476

7577
return out, nil
7678
}
79+
80+
// GetLicense - Gets a License.
81+
func (s *Service) GetLicense(
82+
ctx context.Context,
83+
req *connect.Request[licensev1beta1.GetLicenseRequest],
84+
) (*connect.Response[licensev1beta1.GetLicenseResponse], error) {
85+
record, err := models.FindLicense(ctx, s.db, req.Msg.GetId())
86+
if err != nil {
87+
return nil, fmt.Errorf("unable to retrieve item: %w", err)
88+
}
89+
90+
return connect.NewResponse(&licensev1beta1.GetLicenseResponse{
91+
License: &licensev1beta1.License{
92+
Id: record.ID,
93+
Start: timestamppb.New(record.StartTime),
94+
End: timestamppb.New(record.EndTime),
95+
UserId: record.UserID,
96+
},
97+
}), nil
98+
}
99+
100+
// ListLicenses - Lists licenses.
101+
func (s *Service) ListLicenses(
102+
ctx context.Context,
103+
req *connect.Request[licensev1beta1.ListLicensesRequest],
104+
) (*connect.Response[licensev1beta1.ListLicensesResponse], error) {
105+
var mods []qm.QueryMod
106+
// TODO account for parent and page_token fields
107+
mods = append(mods, qm.Limit(max(1, int(req.Msg.GetPageSize()))))
108+
109+
items, err := models.Licenses(mods...).All(ctx, s.db)
110+
if err != nil {
111+
return nil, fmt.Errorf("unable to retrieve items: %w", err)
112+
}
113+
114+
var licenses []*licensev1beta1.License
115+
for _, item := range items {
116+
licenses = append(licenses, &licensev1beta1.License{
117+
Id: item.ID,
118+
Start: timestamppb.New(item.StartTime),
119+
End: timestamppb.New(item.EndTime),
120+
UserId: item.UserID,
121+
})
122+
}
123+
124+
return connect.NewResponse(&licensev1beta1.ListLicensesResponse{
125+
Licenses: licenses,
126+
}), nil
127+
}

cmd/svc/org/service/service.go

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import (
1212
"github.com/sirupsen/logrus"
1313
"github.com/volatiletech/null/v8"
1414
"github.com/volatiletech/sqlboiler/v4/boil"
15+
"github.com/volatiletech/sqlboiler/v4/queries/qm"
1516

1617
"github.com/kevinmichaelchen/temporal-saga-grpc/cmd/svc/org/models"
1718
)
@@ -57,3 +58,47 @@ func (s *Service) CreateOrg(
5758

5859
return out, nil
5960
}
61+
62+
// GetOrg - Gets an org.
63+
func (s *Service) GetOrg(
64+
ctx context.Context,
65+
req *connect.Request[orgPB.GetOrgRequest],
66+
) (*connect.Response[orgPB.GetOrgResponse], error) {
67+
record, err := models.FindOrg(ctx, s.db, req.Msg.GetId())
68+
if err != nil {
69+
return nil, fmt.Errorf("unable to retrieve item: %w", err)
70+
}
71+
72+
return connect.NewResponse(&orgPB.GetOrgResponse{
73+
Org: &orgPB.Org{
74+
Id: record.ID,
75+
Name: record.Name.String,
76+
},
77+
}), nil
78+
}
79+
80+
// ListOrgs - Lists orgs.
81+
func (s *Service) ListOrgs(
82+
ctx context.Context,
83+
req *connect.Request[orgPB.ListOrgsRequest],
84+
) (*connect.Response[orgPB.ListOrgsResponse], error) {
85+
var mods []qm.QueryMod
86+
mods = append(mods, qm.Limit(max(1, int(req.Msg.GetPageSize()))))
87+
88+
items, err := models.Orgs(mods...).All(ctx, s.db)
89+
if err != nil {
90+
return nil, fmt.Errorf("unable to retrieve items: %w", err)
91+
}
92+
93+
var orgs []*orgPB.Org
94+
for _, item := range items {
95+
orgs = append(orgs, &orgPB.Org{
96+
Id: item.ID,
97+
Name: item.Name.String,
98+
})
99+
}
100+
101+
return connect.NewResponse(&orgPB.ListOrgsResponse{
102+
Orgs: orgs,
103+
}), nil
104+
}

cmd/svc/profile/service/service.go

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import (
1212
"github.com/sirupsen/logrus"
1313
"github.com/volatiletech/null/v8"
1414
"github.com/volatiletech/sqlboiler/v4/boil"
15+
"github.com/volatiletech/sqlboiler/v4/queries/qm"
1516

1617
"github.com/kevinmichaelchen/temporal-saga-grpc/cmd/svc/profile/models"
1718
)
@@ -60,3 +61,50 @@ func (s *Service) CreateProfile(
6061

6162
return out, nil
6263
}
64+
65+
// GetProfile - Gets a profile.
66+
func (s *Service) GetProfile(
67+
ctx context.Context,
68+
req *connect.Request[profilePB.GetProfileRequest],
69+
) (*connect.Response[profilePB.GetProfileResponse], error) {
70+
record, err := models.FindProfile(ctx, s.db, req.Msg.GetId())
71+
if err != nil {
72+
return nil, fmt.Errorf("unable to retrieve item: %w", err)
73+
}
74+
75+
return connect.NewResponse(&profilePB.GetProfileResponse{
76+
Profile: &profilePB.Profile{
77+
Id: record.ID,
78+
FullName: record.FullName.String,
79+
OrgId: record.OrgID,
80+
},
81+
}), nil
82+
}
83+
84+
// ListProfiles - Lists profiles.
85+
func (s *Service) ListProfiles(
86+
ctx context.Context,
87+
req *connect.Request[profilePB.ListProfilesRequest],
88+
) (*connect.Response[profilePB.ListProfilesResponse], error) {
89+
var mods []qm.QueryMod
90+
// TODO account for parent and page_token fields
91+
mods = append(mods, qm.Limit(max(1, int(req.Msg.GetPageSize()))))
92+
93+
items, err := models.Profiles(mods...).All(ctx, s.db)
94+
if err != nil {
95+
return nil, fmt.Errorf("unable to retrieve items: %w", err)
96+
}
97+
98+
var profiles []*profilePB.Profile
99+
for _, item := range items {
100+
profiles = append(profiles, &profilePB.Profile{
101+
Id: item.ID,
102+
FullName: item.FullName.String,
103+
OrgId: item.OrgID,
104+
})
105+
}
106+
107+
return connect.NewResponse(&profilePB.ListProfilesResponse{
108+
Profiles: profiles,
109+
}), nil
110+
}

go.mod

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,12 @@ module github.com/kevinmichaelchen/temporal-saga-grpc
33
go 1.21.5
44

55
require (
6-
buf.build/gen/go/kevinmichaelchen/licenseapis/connectrpc/go v1.14.0-20240105230935-96a83ee74301.1
7-
buf.build/gen/go/kevinmichaelchen/licenseapis/protocolbuffers/go v1.32.0-20240105230935-96a83ee74301.1
8-
buf.build/gen/go/kevinmichaelchen/orgapis/connectrpc/go v1.14.0-20240105230936-cc69561a5883.1
9-
buf.build/gen/go/kevinmichaelchen/orgapis/protocolbuffers/go v1.32.0-20240105230936-cc69561a5883.1
10-
buf.build/gen/go/kevinmichaelchen/profileapis/connectrpc/go v1.14.0-20240105230937-9f5a2b967cc7.1
11-
buf.build/gen/go/kevinmichaelchen/profileapis/protocolbuffers/go v1.32.0-20240105230937-9f5a2b967cc7.1
6+
buf.build/gen/go/kevinmichaelchen/licenseapis/connectrpc/go v1.14.0-20240106023353-b0ccffe2bf81.1
7+
buf.build/gen/go/kevinmichaelchen/licenseapis/protocolbuffers/go v1.32.0-20240106023353-b0ccffe2bf81.1
8+
buf.build/gen/go/kevinmichaelchen/orgapis/connectrpc/go v1.14.0-20240106023354-7971463d1bab.1
9+
buf.build/gen/go/kevinmichaelchen/orgapis/protocolbuffers/go v1.32.0-20240106023354-7971463d1bab.1
10+
buf.build/gen/go/kevinmichaelchen/profileapis/connectrpc/go v1.14.0-20240106023355-4074133bf516.1
11+
buf.build/gen/go/kevinmichaelchen/profileapis/protocolbuffers/go v1.32.0-20240106023355-4074133bf516.1
1212
buf.build/gen/go/kevinmichaelchen/temporalapis/connectrpc/go v1.14.0-20240105233422-8054bf72d102.1
1313
buf.build/gen/go/kevinmichaelchen/temporalapis/protocolbuffers/go v1.32.0-20240105233422-8054bf72d102.1
1414
connectrpc.com/connect v1.14.0

go.sum

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,17 @@
11
buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go v1.32.0-20231115204500-e097f827e652.1 h1:u0olL4yf2p7Tl5jfsAK5keaFi+JFJuv1CDHrbiXkxkk=
22
buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go v1.32.0-20231115204500-e097f827e652.1/go.mod h1:tiTMKD8j6Pd/D2WzREoweufjzaJKHZg35f/VGcZ2v3I=
3-
buf.build/gen/go/kevinmichaelchen/licenseapis/connectrpc/go v1.14.0-20240105230935-96a83ee74301.1 h1:iz8B4/o/Tu9kCU1O61ce9LoMO4cruyKOxZg+Xn3jkIk=
4-
buf.build/gen/go/kevinmichaelchen/licenseapis/connectrpc/go v1.14.0-20240105230935-96a83ee74301.1/go.mod h1:TWnyka2/a0+psN92AVScMT7Sq3mKdjCAWLjcfLQDMgk=
5-
buf.build/gen/go/kevinmichaelchen/licenseapis/protocolbuffers/go v1.32.0-20240105230935-96a83ee74301.1 h1:uxRlX4/HFwA//ZcSZdryz5Nk9hzsLWRUMnmJjwQGA7s=
6-
buf.build/gen/go/kevinmichaelchen/licenseapis/protocolbuffers/go v1.32.0-20240105230935-96a83ee74301.1/go.mod h1:f0zTv4+cZ3+O0fQx7E6JKpPLhQuUJMkl+M7Ott4b4wo=
7-
buf.build/gen/go/kevinmichaelchen/orgapis/connectrpc/go v1.14.0-20240105230936-cc69561a5883.1 h1:w6j+cfXANJ3mFei+DLs8afQp305z35sSXJdrVTP+Kig=
8-
buf.build/gen/go/kevinmichaelchen/orgapis/connectrpc/go v1.14.0-20240105230936-cc69561a5883.1/go.mod h1:2c3rsXGY3Zpto2kEM0hr3bTrvRqcUQzlPF5Glj/Xjno=
9-
buf.build/gen/go/kevinmichaelchen/orgapis/protocolbuffers/go v1.32.0-20240105230936-cc69561a5883.1 h1:pHMAxU1GI79GvmdTi2mfOKDRaPWqZ7UqMSoyxBVLp9U=
10-
buf.build/gen/go/kevinmichaelchen/orgapis/protocolbuffers/go v1.32.0-20240105230936-cc69561a5883.1/go.mod h1:VX7SaxTl48U3BUn1ZWGPaw3Z3trZei6Lijff1hWDCmM=
11-
buf.build/gen/go/kevinmichaelchen/profileapis/connectrpc/go v1.14.0-20240105230937-9f5a2b967cc7.1 h1:+pGDboLYUQSzr+YieYCoY1AP9RtL69rLKhBx5tNzwT4=
12-
buf.build/gen/go/kevinmichaelchen/profileapis/connectrpc/go v1.14.0-20240105230937-9f5a2b967cc7.1/go.mod h1:yZWWCij9/6ffN2PJwEYWgs7DjkWa5cXl2AR8Xvnc+Ng=
13-
buf.build/gen/go/kevinmichaelchen/profileapis/protocolbuffers/go v1.32.0-20240105230937-9f5a2b967cc7.1 h1:YaUHKKR7AZRrnCiZ+QOQuw2wQB0DlOe8KBdN7bDymhs=
14-
buf.build/gen/go/kevinmichaelchen/profileapis/protocolbuffers/go v1.32.0-20240105230937-9f5a2b967cc7.1/go.mod h1:mdFxPRDe6P7qFVw9urFLZ3SkG+ZdPW5q5QXFGjGr8DE=
3+
buf.build/gen/go/kevinmichaelchen/licenseapis/connectrpc/go v1.14.0-20240106023353-b0ccffe2bf81.1 h1:HXlREx5iasiZ7RLIcM+Sa9KXLfznGMzfRUvtFJPa3pA=
4+
buf.build/gen/go/kevinmichaelchen/licenseapis/connectrpc/go v1.14.0-20240106023353-b0ccffe2bf81.1/go.mod h1:bH7/XrbxIE+ZFdY12NEIikndXo36yoc7AV6sJDLR/M0=
5+
buf.build/gen/go/kevinmichaelchen/licenseapis/protocolbuffers/go v1.32.0-20240106023353-b0ccffe2bf81.1 h1:Bhg6zySqAAGMy8+lw+EhV1iIU/vDoUekSnFKlvFWX3s=
6+
buf.build/gen/go/kevinmichaelchen/licenseapis/protocolbuffers/go v1.32.0-20240106023353-b0ccffe2bf81.1/go.mod h1:f0zTv4+cZ3+O0fQx7E6JKpPLhQuUJMkl+M7Ott4b4wo=
7+
buf.build/gen/go/kevinmichaelchen/orgapis/connectrpc/go v1.14.0-20240106023354-7971463d1bab.1 h1:AcL7ufchnekd8PUAipa2TUv93Xo07XOExmoL8Ae5J+4=
8+
buf.build/gen/go/kevinmichaelchen/orgapis/connectrpc/go v1.14.0-20240106023354-7971463d1bab.1/go.mod h1:tq6x6ypkRXOLfa/pojKOaoAtdiwaNhK520RwZdnYRMU=
9+
buf.build/gen/go/kevinmichaelchen/orgapis/protocolbuffers/go v1.32.0-20240106023354-7971463d1bab.1 h1:XGdlUgsatFaPXeMj+KSSIBxC+esBQMK6vLvaSV71iYA=
10+
buf.build/gen/go/kevinmichaelchen/orgapis/protocolbuffers/go v1.32.0-20240106023354-7971463d1bab.1/go.mod h1:VX7SaxTl48U3BUn1ZWGPaw3Z3trZei6Lijff1hWDCmM=
11+
buf.build/gen/go/kevinmichaelchen/profileapis/connectrpc/go v1.14.0-20240106023355-4074133bf516.1 h1:oVo3ozoMXc1uqT9cQIs4duxnJ4XEAvMLu20aP98ahGQ=
12+
buf.build/gen/go/kevinmichaelchen/profileapis/connectrpc/go v1.14.0-20240106023355-4074133bf516.1/go.mod h1:ErjiGiWNjH317M2DV6eeGDYZgvgLmwX7kzFBqHEYo6Q=
13+
buf.build/gen/go/kevinmichaelchen/profileapis/protocolbuffers/go v1.32.0-20240106023355-4074133bf516.1 h1:g4MnvhuIRX2BQ4BTkSwwkzv6GDJ/jlZNcB4gycwm1ko=
14+
buf.build/gen/go/kevinmichaelchen/profileapis/protocolbuffers/go v1.32.0-20240106023355-4074133bf516.1/go.mod h1:mdFxPRDe6P7qFVw9urFLZ3SkG+ZdPW5q5QXFGjGr8DE=
1515
buf.build/gen/go/kevinmichaelchen/temporalapis/connectrpc/go v1.14.0-20240105233422-8054bf72d102.1 h1:DjZa2Ji1Rje54fcm1SU2EfRRyEwfHNrt1SIz2JxaFMA=
1616
buf.build/gen/go/kevinmichaelchen/temporalapis/connectrpc/go v1.14.0-20240105233422-8054bf72d102.1/go.mod h1:lAv2Uero9GS0WGHvco9tw82GY5J/U0uuBdccsHV4Acc=
1717
buf.build/gen/go/kevinmichaelchen/temporalapis/protocolbuffers/go v1.32.0-20240105233422-8054bf72d102.1 h1:TOugHIye1MzyV7Vjzff13UZWidUVPp0xwmejtOBEXew=

idl/licenseapis/license/v1beta1/api.proto

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,14 @@ service LicenseService {
1111
rpc CreateLicense(CreateLicenseRequest) returns (CreateLicenseResponse) {
1212
option idempotency_level = IDEMPOTENT;
1313
}
14+
// Get a License.
15+
rpc GetLicense(GetLicenseRequest) returns (GetLicenseResponse) {
16+
option idempotency_level = IDEMPOTENT;
17+
}
18+
// ListLicenses - Lists Licenses.
19+
rpc ListLicenses(ListLicensesRequest) returns (ListLicensesResponse) {
20+
option idempotency_level = IDEMPOTENT;
21+
}
1422
}
1523

1624
message CreateLicenseRequest {
@@ -28,3 +36,29 @@ message CreateLicenseRequest {
2836
}
2937

3038
message CreateLicenseResponse {}
39+
40+
message License {
41+
string id = 1;
42+
google.protobuf.Timestamp start = 2;
43+
google.protobuf.Timestamp end = 3;
44+
string user_id = 4;
45+
}
46+
47+
message GetLicenseRequest {
48+
string id = 1;
49+
}
50+
51+
message GetLicenseResponse {
52+
License license = 1;
53+
}
54+
55+
message ListLicensesRequest {
56+
string parent = 1;
57+
int32 page_size = 2;
58+
string page_token = 3;
59+
}
60+
61+
message ListLicensesResponse {
62+
repeated License licenses = 1;
63+
string next_page_token = 2;
64+
}

idl/orgapis/org/v1beta1/api.proto

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,14 @@ service OrgService {
1010
rpc CreateOrg(CreateOrgRequest) returns (CreateOrgResponse) {
1111
option idempotency_level = IDEMPOTENT;
1212
}
13+
// GetOrg - Gets an Organization.
14+
rpc GetOrg(GetOrgRequest) returns (GetOrgResponse) {
15+
option idempotency_level = IDEMPOTENT;
16+
}
17+
// ListOrgs - Lists Organizations.
18+
rpc ListOrgs(ListOrgsRequest) returns (ListOrgsResponse) {
19+
option idempotency_level = IDEMPOTENT;
20+
}
1321
}
1422

1523
message CreateOrgRequest {
@@ -18,3 +26,27 @@ message CreateOrgRequest {
1826
}
1927

2028
message CreateOrgResponse {}
29+
30+
message Org {
31+
string id = 1;
32+
string name = 2;
33+
}
34+
35+
message GetOrgRequest {
36+
string id = 1;
37+
}
38+
39+
message GetOrgResponse {
40+
Org org = 1;
41+
}
42+
43+
message ListOrgsRequest {
44+
string parent = 1;
45+
int32 page_size = 2;
46+
string page_token = 3;
47+
}
48+
49+
message ListOrgsResponse {
50+
repeated Org orgs = 1;
51+
string next_page_token = 2;
52+
}

idl/profileapis/profile/v1beta1/api.proto

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,14 @@ service ProfileService {
1010
rpc CreateProfile(CreateProfileRequest) returns (CreateProfileResponse) {
1111
option idempotency_level = IDEMPOTENT;
1212
}
13+
// GetProfile - Gets a Profile.
14+
rpc GetProfile(GetProfileRequest) returns (GetProfileResponse) {
15+
option idempotency_level = IDEMPOTENT;
16+
}
17+
// ListProfiles - Lists Profiles.
18+
rpc ListProfiles(ListProfilesRequest) returns (ListProfilesResponse) {
19+
option idempotency_level = IDEMPOTENT;
20+
}
1321
}
1422

1523
message CreateProfileRequest {
@@ -19,3 +27,28 @@ message CreateProfileRequest {
1927
}
2028

2129
message CreateProfileResponse {}
30+
31+
message Profile {
32+
string id = 1;
33+
string full_name = 2;
34+
string org_id = 3;
35+
}
36+
37+
message GetProfileRequest {
38+
string id = 1;
39+
}
40+
41+
message GetProfileResponse {
42+
Profile profile = 1;
43+
}
44+
45+
message ListProfilesRequest {
46+
string parent = 1;
47+
int32 page_size = 2;
48+
string page_token = 3;
49+
}
50+
51+
message ListProfilesResponse {
52+
repeated Profile profiles = 1;
53+
string next_page_token = 2;
54+
}

0 commit comments

Comments
 (0)