Skip to content

Commit 4c4f4d1

Browse files
committed

File tree

5 files changed

+166
-86
lines changed

5 files changed

+166
-86
lines changed

Diff for: apicontext/context.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import (
88
func FromContext(ctx context.Context) (polycode.ApiContext, error) {
99
value := ctx.Value("polycode.context")
1010
if value == nil {
11-
return polycode.ApiContext{}, polycode.ErrContextNotFound
11+
return nil, polycode.ErrContextNotFound
1212
}
1313

1414
return value.(polycode.ApiContext), nil

Diff for: polycode/client.go

+84
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,11 @@ type ExecServiceRequest struct {
3434
Input any `json:"input"`
3535
}
3636

37+
type ExecServiceExtendedRequest struct {
38+
EnvId string `json:"envId"`
39+
ExecServiceRequest ExecServiceRequest `json:"execServiceRequest"`
40+
}
41+
3742
type ExecServiceResponse struct {
3843
IsAsync bool `json:"isAsync"`
3944
Output any `json:"output"`
@@ -48,6 +53,11 @@ type ExecApiRequest struct {
4853
Request ApiRequest `json:"request"`
4954
}
5055

56+
type ExecApiExtendedRequest struct {
57+
EnvId string `json:"envId"`
58+
ExecApiRequest ExecApiRequest `json:"execApiRequest"`
59+
}
60+
5161
type ExecApiResponse struct {
5262
IsAsync bool `json:"isAsync"`
5363
Response ApiResponse `json:"response"`
@@ -72,11 +82,28 @@ type QueryRequest struct {
7282
Limit int `json:"limit"`
7383
}
7484

85+
// QueryExtendedRequest represents the JSON structure for query operations
86+
type QueryExtendedRequest struct {
87+
EnvId string `json:"envId"`
88+
TenantId string `json:"tenantId"`
89+
PartitionKey string `json:"partitionKey"`
90+
ServiceName string `json:"serviceName"`
91+
QueryRequest QueryRequest `json:"queryRequest"`
92+
}
93+
7594
// GetFileRequest represents the JSON structure for get file operations
7695
type GetFileRequest struct {
7796
Key string `json:"key"`
7897
}
7998

99+
type GetFileExtendedRequest struct {
100+
EnvId string `json:"envId"`
101+
TenantId string `json:"tenantId"`
102+
PartitionKey string `json:"partitionKey"`
103+
ServiceName string `json:"serviceName"`
104+
GetFileRequest GetFileRequest `json:"getFileRequest"`
105+
}
106+
80107
// GetFileResponse represents the JSON structure for get file response
81108
type GetFileResponse struct {
82109
Content string `json:"content"`
@@ -123,6 +150,20 @@ func (sc *ServiceClient) ExecService(sessionId string, req ExecServiceRequest) (
123150
return res, nil
124151
}
125152

153+
// ExecServiceExtended executes a service with the given request
154+
func (sc *ServiceClient) ExecServiceExtended(sessionId string, req ExecServiceExtendedRequest) (ExecServiceResponse, error) {
155+
var res ExecServiceResponse
156+
err := executeApiWithResponse(sc.httpClient, sc.baseURL, sessionId, "v1/extended/context/service/exec", req, &res)
157+
if err != nil {
158+
return ExecServiceResponse{}, err
159+
}
160+
161+
if res.IsAsync {
162+
panic(ErrTaskInProgress)
163+
}
164+
return res, nil
165+
}
166+
126167
func (sc *ServiceClient) ExecApi(sessionId string, req ExecApiRequest) (ExecApiResponse, error) {
127168
var res ExecApiResponse
128169
err := executeApiWithResponse(sc.httpClient, sc.baseURL, sessionId, "v1/context/api/exec", req, &res)
@@ -136,6 +177,19 @@ func (sc *ServiceClient) ExecApi(sessionId string, req ExecApiRequest) (ExecApiR
136177
return res, nil
137178
}
138179

180+
func (sc *ServiceClient) ExecApiExtended(sessionId string, req ExecApiExtendedRequest) (ExecApiResponse, error) {
181+
var res ExecApiResponse
182+
err := executeApiWithResponse(sc.httpClient, sc.baseURL, sessionId, "v1/extended/context/api/exec", req, &res)
183+
if err != nil {
184+
return ExecApiResponse{}, err
185+
}
186+
187+
if res.IsAsync {
188+
panic(ErrTaskInProgress)
189+
}
190+
return res, nil
191+
}
192+
139193
// GetItem gets an item from the database
140194
func (sc *ServiceClient) GetItem(sessionId string, req QueryRequest) (map[string]interface{}, error) {
141195
var res map[string]interface{}
@@ -146,6 +200,16 @@ func (sc *ServiceClient) GetItem(sessionId string, req QueryRequest) (map[string
146200
return res, nil
147201
}
148202

203+
// GetItemExtended gets an item from the database
204+
func (sc *ServiceClient) GetItemExtended(sessionId string, req QueryExtendedRequest) (map[string]interface{}, error) {
205+
var res map[string]interface{}
206+
err := executeApiWithResponse(sc.httpClient, sc.baseURL, sessionId, "v1/extended/context/db/get", req, &res)
207+
if err != nil {
208+
return nil, err
209+
}
210+
return res, nil
211+
}
212+
149213
// QueryItems queries items from the database
150214
func (sc *ServiceClient) QueryItems(sessionId string, req QueryRequest) ([]map[string]interface{}, error) {
151215
var res []map[string]interface{}
@@ -156,6 +220,16 @@ func (sc *ServiceClient) QueryItems(sessionId string, req QueryRequest) ([]map[s
156220
return res, nil
157221
}
158222

223+
// QueryItemsExtended queries items from the database
224+
func (sc *ServiceClient) QueryItemsExtended(sessionId string, req QueryExtendedRequest) ([]map[string]interface{}, error) {
225+
var res []map[string]interface{}
226+
err := executeApiWithResponse(sc.httpClient, sc.baseURL, sessionId, "v1/extended/context/db/query", req, &res)
227+
if err != nil {
228+
return nil, err
229+
}
230+
return res, nil
231+
}
232+
159233
// PutItem puts an item into the database
160234
func (sc *ServiceClient) PutItem(sessionId string, req PutRequest) error {
161235
return executeApiWithoutResponse(sc.httpClient, sc.baseURL, sessionId, "v1/context/db/put", req)
@@ -171,6 +245,16 @@ func (sc *ServiceClient) GetFile(sessionId string, req GetFileRequest) (GetFileR
171245
return res, nil
172246
}
173247

248+
// GetFileExtended gets a file from the file store
249+
func (sc *ServiceClient) GetFileExtended(sessionId string, req GetFileExtendedRequest) (GetFileResponse, error) {
250+
var res GetFileResponse
251+
err := executeApiWithResponse(sc.httpClient, sc.baseURL, sessionId, "v1/extended/context/file/get", req, &res)
252+
if err != nil {
253+
return GetFileResponse{}, err
254+
}
255+
return res, nil
256+
}
257+
174258
// PutFile puts a file into the file store
175259
func (sc *ServiceClient) PutFile(sessionId string, req PutFileRequest) error {
176260
return executeApiWithoutResponse(sc.httpClient, sc.baseURL, sessionId, "v1/context/file/put", req)

Diff for: polycode/context.go

+50-66
Original file line numberDiff line numberDiff line change
@@ -5,109 +5,93 @@ import (
55
"time"
66
)
77

8-
type ServiceContext struct {
9-
ctx context.Context
10-
sessionId string
11-
dataStore DataStore
12-
fileStore FileStore
13-
option TaskOptions
14-
config AppConfig
8+
type ServiceContext interface {
9+
AppConfig() AppConfig
10+
Db() DataStore
11+
FileStore() FileStore
1512
}
1613

17-
func (s ServiceContext) AppConfig() AppConfig {
18-
return s.config
19-
}
20-
21-
func (s ServiceContext) Option() TaskOptions {
22-
return s.option
23-
}
24-
25-
func (s ServiceContext) Deadline() (deadline time.Time, ok bool) {
26-
return s.ctx.Deadline()
27-
}
28-
29-
func (s ServiceContext) Done() <-chan struct{} {
30-
return s.ctx.Done()
31-
}
32-
33-
func (s ServiceContext) Err() error {
34-
return s.ctx.Err()
35-
}
36-
37-
func (s ServiceContext) Value(key any) any {
38-
return s.ctx.Value(key)
14+
type WorkflowContext interface {
15+
AppConfig() AppConfig
16+
Service(service string) (RemoteService, error)
17+
Controller(controller string) (RemoteController, error)
3918
}
4019

41-
func (s ServiceContext) Db() DataStore {
42-
return s.dataStore
20+
type ApiContext interface {
21+
AppConfig() AppConfig
22+
Service(service string) (RemoteService, error)
23+
Controller(controller string) (RemoteController, error)
4324
}
4425

45-
func (s ServiceContext) FileStore() FileStore {
46-
return s.fileStore
26+
type RawContext interface {
27+
ServiceExec(req ExecServiceExtendedRequest) (ExecServiceResponse, error)
28+
ApiExec(req ExecApiExtendedRequest) (ExecApiResponse, error)
29+
DbGet(req QueryExtendedRequest) (map[string]interface{}, error)
30+
DbQuery(req QueryExtendedRequest) ([]map[string]interface{}, error)
31+
FileGet(req GetFileExtendedRequest) (GetFileResponse, error)
4732
}
4833

49-
type WorkflowContext struct {
34+
type ContextImpl struct {
5035
ctx context.Context
5136
sessionId string
52-
serviceClient *ServiceClient
37+
dataStore DataStore
38+
fileStore FileStore
5339
config AppConfig
40+
serviceClient *ServiceClient
5441
}
5542

56-
func (wc WorkflowContext) AppConfig() AppConfig {
57-
return wc.config
43+
func (s ContextImpl) AppConfig() AppConfig {
44+
return s.config
5845
}
5946

60-
func (wc WorkflowContext) Deadline() (deadline time.Time, ok bool) {
61-
return wc.ctx.Deadline()
47+
func (s ContextImpl) Deadline() (deadline time.Time, ok bool) {
48+
return s.ctx.Deadline()
6249
}
6350

64-
func (wc WorkflowContext) Done() <-chan struct{} {
65-
return wc.ctx.Done()
51+
func (s ContextImpl) Done() <-chan struct{} {
52+
return s.ctx.Done()
6653
}
6754

68-
func (wc WorkflowContext) Err() error {
69-
return wc.ctx.Err()
55+
func (s ContextImpl) Err() error {
56+
return s.ctx.Err()
7057
}
7158

72-
func (wc WorkflowContext) Value(key any) any {
73-
return wc.ctx.Value(key)
59+
func (s ContextImpl) Value(key any) any {
60+
return s.ctx.Value(key)
7461
}
7562

76-
func (wc WorkflowContext) Service(service string) (RemoteService, error) {
77-
return RemoteService{ctx: wc.ctx, sessionId: wc.sessionId, service: service, serviceClient: wc.serviceClient}, nil
63+
func (s ContextImpl) Db() DataStore {
64+
return s.dataStore
7865
}
7966

80-
type ApiContext struct {
81-
ctx context.Context
82-
sessionId string
83-
serviceClient *ServiceClient
84-
config AppConfig
67+
func (s ContextImpl) FileStore() FileStore {
68+
return s.fileStore
8569
}
8670

87-
func (wc ApiContext) AppConfig() AppConfig {
88-
return wc.config
71+
func (s ContextImpl) Service(service string) (RemoteService, error) {
72+
return RemoteService{ctx: s.ctx, sessionId: s.sessionId, service: service, serviceClient: s.serviceClient}, nil
8973
}
9074

91-
func (wc ApiContext) Deadline() (deadline time.Time, ok bool) {
92-
return wc.ctx.Deadline()
75+
func (s ContextImpl) Controller(controller string) (RemoteController, error) {
76+
return RemoteController{ctx: s.ctx, sessionId: s.sessionId, controller: controller, serviceClient: s.serviceClient}, nil
9377
}
9478

95-
func (wc ApiContext) Done() <-chan struct{} {
96-
return wc.ctx.Done()
79+
func (s ContextImpl) ServiceExec(req ExecServiceExtendedRequest) (ExecServiceResponse, error) {
80+
return s.serviceClient.ExecServiceExtended(s.sessionId, req)
9781
}
9882

99-
func (wc ApiContext) Err() error {
100-
return wc.ctx.Err()
83+
func (s ContextImpl) ApiExec(req ExecApiExtendedRequest) (ExecApiResponse, error) {
84+
return s.serviceClient.ExecApiExtended(s.sessionId, req)
10185
}
10286

103-
func (wc ApiContext) Value(key any) any {
104-
return wc.ctx.Value(key)
87+
func (s ContextImpl) DbGet(req QueryExtendedRequest) (map[string]interface{}, error) {
88+
return s.serviceClient.GetItemExtended(s.sessionId, req)
10589
}
10690

107-
func (wc ApiContext) Service(service string) (RemoteService, error) {
108-
return RemoteService{ctx: wc.ctx, sessionId: wc.sessionId, service: service, serviceClient: wc.serviceClient}, nil
91+
func (s ContextImpl) DbQuery(req QueryExtendedRequest) ([]map[string]interface{}, error) {
92+
return s.serviceClient.QueryItemsExtended(s.sessionId, req)
10993
}
11094

111-
func (wc ApiContext) Controller(controller string) (RemoteController, error) {
112-
return RemoteController{ctx: wc.ctx, sessionId: wc.sessionId, controller: controller, serviceClient: wc.serviceClient}, nil
95+
func (s ContextImpl) FileGet(req GetFileExtendedRequest) (GetFileResponse, error) {
96+
return s.serviceClient.GetFileExtended(s.sessionId, req)
11397
}

Diff for: polycode/runtime.go

+16-19
Original file line numberDiff line numberDiff line change
@@ -170,29 +170,24 @@ func runService(ctx context.Context, event ServiceStartEvent) (evt ServiceComple
170170
return ErrorToServiceComplete(ErrBadRequest.Wrap(err)), nil
171171
}
172172

173+
ctxImpl := &ContextImpl{
174+
ctx: ctx,
175+
sessionId: event.SessionId,
176+
dataStore: NewDatabase(serviceClient, event.SessionId),
177+
fileStore: NewFileStore(serviceClient, event.SessionId),
178+
config: appConfig,
179+
serviceClient: serviceClient,
180+
}
181+
173182
var ret any
174183
if service.IsWorkflow(event.Method) {
175-
workflowCtx := WorkflowContext{
176-
ctx: ctx,
177-
sessionId: event.SessionId,
178-
serviceClient: serviceClient,
179-
config: appConfig,
180-
}
181-
182184
println(fmt.Sprintf("client: service %s exec workflow %s with session id %s", event.Service,
183185
event.Method, event.SessionId))
184-
ret, err = service.ExecuteWorkflow(workflowCtx, event.Method, inputObj)
186+
ret, err = service.ExecuteWorkflow(ctxImpl, event.Method, inputObj)
185187
} else {
186-
srvCtx := ServiceContext{
187-
ctx: ctx,
188-
sessionId: event.SessionId,
189-
dataStore: NewDatabase(serviceClient, event.SessionId),
190-
config: appConfig,
191-
}
192-
193188
println(fmt.Sprintf("client: service %s exec handler %s with session id %s", event.Service,
194189
event.Method, event.SessionId))
195-
ret, err = service.ExecuteService(srvCtx, event.Method, inputObj)
190+
ret, err = service.ExecuteService(ctxImpl, event.Method, inputObj)
196191
}
197192

198193
if err != nil {
@@ -235,14 +230,16 @@ func runApi(ctx context.Context, event ApiStartEvent) (evt ApiCompleteEvent, err
235230
return ErrorToApiComplete(ErrApiExecError.Wrap(fmt.Errorf("api not registered"))), nil
236231
}
237232

238-
apiCtx := ApiContext{
233+
ctxImpl := &ContextImpl{
239234
ctx: ctx,
240235
sessionId: event.SessionId,
241-
serviceClient: serviceClient,
236+
dataStore: NewDatabase(serviceClient, event.SessionId),
237+
fileStore: NewFileStore(serviceClient, event.SessionId),
242238
config: appConfig,
239+
serviceClient: serviceClient,
243240
}
244241

245-
newCtx := context.WithValue(ctx, "polycode.context", apiCtx)
242+
newCtx := context.WithValue(ctx, "polycode.context", ctxImpl)
246243
httpReq, err := ConvertToHttpRequest(newCtx, event.Request)
247244
if err != nil {
248245
println("client: api error, bad request")

Diff for: rawcontext/context.go

+15
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package apicontext
2+
3+
import (
4+
"context"
5+
"github.com/cloudimpl/next-coder-sdk/polycode"
6+
)
7+
8+
func FromContext(ctx context.Context) (polycode.RawContext, error) {
9+
rawContext, ok := ctx.(polycode.RawContext)
10+
if !ok {
11+
return nil, polycode.ErrContextNotFound
12+
}
13+
14+
return rawContext, nil
15+
}

0 commit comments

Comments
 (0)