Skip to content

Commit 9445009

Browse files
chore: release target state api endpoint
1 parent ec8e62f commit 9445009

File tree

6 files changed

+265
-1
lines changed

6 files changed

+265
-1
lines changed

apps/api/openapi/openapi.json

Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1134,6 +1134,20 @@
11341134
],
11351135
"type": "object"
11361136
},
1137+
"ReleaseTargetState": {
1138+
"properties": {
1139+
"currentRelease": {
1140+
"$ref": "#/components/schemas/Release"
1141+
},
1142+
"desiredRelease": {
1143+
"$ref": "#/components/schemas/Release"
1144+
},
1145+
"latestJob": {
1146+
"$ref": "#/components/schemas/Job"
1147+
}
1148+
},
1149+
"type": "object"
1150+
},
11371151
"Resource": {
11381152
"properties": {
11391153
"config": {
@@ -4615,6 +4629,74 @@
46154629
"summary": "Get jobs for a release target"
46164630
}
46174631
},
4632+
"/v1/workspaces/{workspaceId}/release-targets/{releaseTargetKey}/state": {
4633+
"get": {
4634+
"description": "Returns the state for a release target {releaseTargetKey}.",
4635+
"operationId": "getReleaseTargetState",
4636+
"parameters": [
4637+
{
4638+
"description": "ID of the workspace",
4639+
"in": "path",
4640+
"name": "workspaceId",
4641+
"required": true,
4642+
"schema": {
4643+
"type": "string"
4644+
}
4645+
},
4646+
{
4647+
"description": "Key of the release target",
4648+
"in": "path",
4649+
"name": "releaseTargetKey",
4650+
"required": true,
4651+
"schema": {
4652+
"type": "string"
4653+
}
4654+
},
4655+
{
4656+
"description": "Whether to bypass the cache",
4657+
"in": "query",
4658+
"name": "bypassCache",
4659+
"required": false,
4660+
"schema": {
4661+
"type": "boolean"
4662+
}
4663+
}
4664+
],
4665+
"responses": {
4666+
"200": {
4667+
"content": {
4668+
"application/json": {
4669+
"schema": {
4670+
"$ref": "#/components/schemas/ReleaseTargetState"
4671+
}
4672+
}
4673+
},
4674+
"description": "The state for the release target"
4675+
},
4676+
"400": {
4677+
"content": {
4678+
"application/json": {
4679+
"schema": {
4680+
"$ref": "#/components/schemas/ErrorResponse"
4681+
}
4682+
}
4683+
},
4684+
"description": "Invalid request"
4685+
},
4686+
"404": {
4687+
"content": {
4688+
"application/json": {
4689+
"schema": {
4690+
"$ref": "#/components/schemas/ErrorResponse"
4691+
}
4692+
}
4693+
},
4694+
"description": "Resource not found"
4695+
}
4696+
},
4697+
"summary": "Get the state for a release target"
4698+
}
4699+
},
46184700
"/v1/workspaces/{workspaceId}/releases/{releaseId}": {
46194701
"get": {
46204702
"description": "Returns a specific release by ID.",

apps/api/openapi/paths/release-targets.jsonnet

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,4 +37,26 @@ local openapi = import '../lib/openapi.libsonnet';
3737
) + openapi.notFoundResponse(),
3838
},
3939
},
40+
'/v1/workspaces/{workspaceId}/release-targets/{releaseTargetKey}/state': {
41+
get: {
42+
summary: 'Get the state for a release target',
43+
operationId: 'getReleaseTargetState',
44+
description: 'Returns the state for a release target {releaseTargetKey}.',
45+
parameters: [
46+
openapi.workspaceIdParam(),
47+
openapi.releaseTargetKeyParam(),
48+
{
49+
name: 'bypassCache',
50+
'in': 'query',
51+
description: 'Whether to bypass the cache',
52+
schema: { type: 'boolean' },
53+
required: false,
54+
},
55+
],
56+
responses: openapi.okResponse(
57+
openapi.schemaRef('ReleaseTargetState'),
58+
'The state for the release target',
59+
) + openapi.notFoundResponse() + openapi.badRequestResponse(),
60+
},
61+
},
4062
}

apps/api/openapi/schemas/release.jsonnet

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,4 +28,12 @@ local openapi = import '../lib/openapi.libsonnet';
2828
createdAt: { type: 'string' },
2929
},
3030
},
31+
ReleaseTargetState: {
32+
type: 'object',
33+
properties: {
34+
desiredRelease: openapi.schemaRef('Release'),
35+
currentRelease: openapi.schemaRef('Release'),
36+
latestJob: openapi.schemaRef('Job'),
37+
},
38+
},
3139
}

apps/api/src/routes/v1/workspaces/release-targets.ts

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,9 +48,33 @@ const getReleaseTargetDesiredRelease: AsyncTypedHandler<
4848
res.status(200).json(desiredReleaseResponse.data);
4949
};
5050

51+
const getReleaseTargetState: AsyncTypedHandler<
52+
"/v1/workspaces/{workspaceId}/release-targets/{releaseTargetKey}/state",
53+
"get"
54+
> = async (req, res) => {
55+
const { workspaceId, releaseTargetKey } = req.params;
56+
const { bypassCache } = req.query;
57+
58+
const stateResponse = await getClientFor(workspaceId).GET(
59+
"/v1/workspaces/{workspaceId}/release-targets/{releaseTargetKey}/state",
60+
{
61+
params: {
62+
path: { workspaceId, releaseTargetKey },
63+
query: { bypassCache },
64+
},
65+
},
66+
);
67+
68+
if (stateResponse.error != null)
69+
throw new ApiError(stateResponse.error.error ?? "Unknown error", 500);
70+
71+
res.status(200).json(stateResponse.data);
72+
};
73+
5174
const releaseTargetKeyRouter = Router({ mergeParams: true })
5275
.get("/jobs", asyncHandler(getReleaseTargetJobs))
53-
.get("/desired-release", asyncHandler(getReleaseTargetDesiredRelease));
76+
.get("/desired-release", asyncHandler(getReleaseTargetDesiredRelease))
77+
.get("/state", asyncHandler(getReleaseTargetState));
5478

5579
export const releaseTargetsRouter = Router({ mergeParams: true }).use(
5680
"/:releaseTargetKey",

apps/api/src/types/openapi.ts

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -513,6 +513,26 @@ export interface paths {
513513
patch?: never;
514514
trace?: never;
515515
};
516+
"/v1/workspaces/{workspaceId}/release-targets/{releaseTargetKey}/state": {
517+
parameters: {
518+
query?: never;
519+
header?: never;
520+
path?: never;
521+
cookie?: never;
522+
};
523+
/**
524+
* Get the state for a release target
525+
* @description Returns the state for a release target {releaseTargetKey}.
526+
*/
527+
get: operations["getReleaseTargetState"];
528+
put?: never;
529+
post?: never;
530+
delete?: never;
531+
options?: never;
532+
head?: never;
533+
patch?: never;
534+
trace?: never;
535+
};
516536
"/v1/workspaces/{workspaceId}/releases/{releaseId}": {
517537
parameters: {
518538
query?: never;
@@ -1027,6 +1047,11 @@ export interface components {
10271047
environmentId: string;
10281048
resourceId: string;
10291049
};
1050+
ReleaseTargetState: {
1051+
currentRelease?: components["schemas"]["Release"];
1052+
desiredRelease?: components["schemas"]["Release"];
1053+
latestJob?: components["schemas"]["Job"];
1054+
};
10301055
Resource: {
10311056
config: {
10321057
[key: string]: unknown;
@@ -3116,6 +3141,52 @@ export interface operations {
31163141
};
31173142
};
31183143
};
3144+
getReleaseTargetState: {
3145+
parameters: {
3146+
query?: {
3147+
/** @description Whether to bypass the cache */
3148+
bypassCache?: boolean;
3149+
};
3150+
header?: never;
3151+
path: {
3152+
/** @description ID of the workspace */
3153+
workspaceId: string;
3154+
/** @description Key of the release target */
3155+
releaseTargetKey: string;
3156+
};
3157+
cookie?: never;
3158+
};
3159+
requestBody?: never;
3160+
responses: {
3161+
/** @description The state for the release target */
3162+
200: {
3163+
headers: {
3164+
[name: string]: unknown;
3165+
};
3166+
content: {
3167+
"application/json": components["schemas"]["ReleaseTargetState"];
3168+
};
3169+
};
3170+
/** @description Invalid request */
3171+
400: {
3172+
headers: {
3173+
[name: string]: unknown;
3174+
};
3175+
content: {
3176+
"application/json": components["schemas"]["ErrorResponse"];
3177+
};
3178+
};
3179+
/** @description Resource not found */
3180+
404: {
3181+
headers: {
3182+
[name: string]: unknown;
3183+
};
3184+
content: {
3185+
"application/json": components["schemas"]["ErrorResponse"];
3186+
};
3187+
};
3188+
};
3189+
};
31193190
getRelease: {
31203191
parameters: {
31213192
query?: never;

packages/workspace-engine-sdk/src/schema.ts

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -718,6 +718,26 @@ export interface paths {
718718
patch?: never;
719719
trace?: never;
720720
};
721+
"/v1/workspaces/{workspaceId}/release-targets/{releaseTargetKey}/state": {
722+
parameters: {
723+
query?: never;
724+
header?: never;
725+
path?: never;
726+
cookie?: never;
727+
};
728+
/**
729+
* Get the state for a release target
730+
* @description Returns the state for a release target {releaseTargetKey}.
731+
*/
732+
get: operations["getReleaseTargetState"];
733+
put?: never;
734+
post?: never;
735+
delete?: never;
736+
options?: never;
737+
head?: never;
738+
patch?: never;
739+
trace?: never;
740+
};
721741
"/v1/workspaces/{workspaceId}/releases/{releaseId}": {
722742
parameters: {
723743
query?: never;
@@ -3192,6 +3212,43 @@ export interface operations {
31923212
};
31933213
};
31943214
};
3215+
getReleaseTargetState: {
3216+
parameters: {
3217+
query?: {
3218+
/** @description Whether to bypass the cache */
3219+
bypassCache?: boolean;
3220+
};
3221+
header?: never;
3222+
path: {
3223+
/** @description ID of the workspace */
3224+
workspaceId: string;
3225+
/** @description Key of the release target */
3226+
releaseTargetKey: string;
3227+
};
3228+
cookie?: never;
3229+
};
3230+
requestBody?: never;
3231+
responses: {
3232+
/** @description The state for the release target */
3233+
200: {
3234+
headers: {
3235+
[name: string]: unknown;
3236+
};
3237+
content: {
3238+
"application/json": components["schemas"]["ReleaseTargetState"];
3239+
};
3240+
};
3241+
/** @description Resource not found */
3242+
404: {
3243+
headers: {
3244+
[name: string]: unknown;
3245+
};
3246+
content: {
3247+
"application/json": components["schemas"]["ErrorResponse"];
3248+
};
3249+
};
3250+
};
3251+
};
31953252
getRelease: {
31963253
parameters: {
31973254
query?: never;

0 commit comments

Comments
 (0)