Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit60323d8

Browse files
committed
Switch fully to generated types
In some places the organization ID is part of the URL but not part ofthe request so I separated out the ID into a separate argument in therelevant API functions.Otherwise this was a straightforward replacement where I mostly onlyneeded to change some of the interface names (User instead ofUserResponse for example) and add a few missing but required properties.Arguably `parameter_values` could be made optional but I am just passingin an empty array for now mostly just to make it obvious that we couldpass stuff there if we need to.I kind of winged the template form; I am not sure what the differencebetween a template and template version is or why the latter comesbefore the former so the form just returns all the data required tocreate both.
1 parentd5eb87f commit60323d8

File tree

22 files changed

+137
-115
lines changed

22 files changed

+137
-115
lines changed

‎site/src/api/index.test.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
importaxiosfrom"axios"
22
import{getApiKey,login,logout}from"."
3-
import{APIKeyResponse,LoginResponse}from"./types"
3+
import*asTypesGenfrom"./typesGenerated"
44

55
// Mock the axios module so that no real network requests are made, but rather
66
// we swap in a resolved or rejected value
@@ -12,7 +12,7 @@ describe("api.ts", () => {
1212
describe("login",()=>{
1313
it("should return LoginResponse",async()=>{
1414
// given
15-
constloginResponse:LoginResponse={
15+
constloginResponse:TypesGen.LoginWithPasswordResponse={
1616
session_token:"abc_123_test",
1717
}
1818
constaxiosMockPost=jest.fn().mockImplementationOnce(()=>{
@@ -87,7 +87,7 @@ describe("api.ts", () => {
8787
describe("getApiKey",()=>{
8888
it("should return APIKeyResponse",async()=>{
8989
// given
90-
constapiKeyResponse:APIKeyResponse={
90+
constapiKeyResponse:TypesGen.GenerateAPIKeyResponse={
9191
key:"abc_123_test",
9292
}
9393
constaxiosMockPost=jest.fn().mockImplementationOnce(()=>{

‎site/src/api/index.ts

Lines changed: 38 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,32 @@
11
importaxios,{AxiosRequestHeaders}from"axios"
22
import{mutate}from"swr"
3-
import*asTypesfrom"./types"
43
import*asTypesGenfrom"./typesGenerated"
54

65
constCONTENT_TYPE_JSON:AxiosRequestHeaders={
76
"Content-Type":"application/json",
87
}
98

10-
exportconstprovisioners:Types.Provisioner[]=[
9+
exportconstprovisioners:TypesGen.ProvisionerDaemon[]=[
1110
{
1211
id:"terraform",
1312
name:"Terraform",
13+
created_at:"",
14+
provisioners:[],
1415
},
1516
{
1617
id:"cdr-basic",
1718
name:"Basic",
19+
created_at:"",
20+
provisioners:[],
1821
},
1922
]
2023

2124
exportnamespaceWorkspace{
22-
exportconstcreate=async(request:Types.CreateWorkspaceRequest):Promise<Types.Workspace>=>{
23-
constresponse=awaitfetch(`/api/v2/organizations/${request.organization_id}/workspaces`,{
25+
exportconstcreate=async(
26+
organizationId:string,
27+
request:TypesGen.CreateWorkspaceRequest,
28+
):Promise<TypesGen.Workspace>=>{
29+
constresponse=awaitfetch(`/api/v2/organizations/${organizationId}/workspaces`,{
2430
method:"POST",
2531
headers:{
2632
"Content-Type":"application/json",
@@ -43,13 +49,13 @@ export namespace Workspace {
4349
}
4450
}
4551

46-
exportconstlogin=async(email:string,password:string):Promise<Types.LoginResponse>=>{
52+
exportconstlogin=async(email:string,password:string):Promise<TypesGen.LoginWithPasswordResponse>=>{
4753
constpayload=JSON.stringify({
4854
email,
4955
password,
5056
})
5157

52-
constresponse=awaitaxios.post<Types.LoginResponse>("/api/v2/users/login",payload,{
58+
constresponse=awaitaxios.post<TypesGen.LoginWithPasswordResponse>("/api/v2/users/login",payload,{
5359
headers:{ ...CONTENT_TYPE_JSON},
5460
})
5561

@@ -60,8 +66,8 @@ export const logout = async (): Promise<void> => {
6066
awaitaxios.post("/api/v2/users/logout")
6167
}
6268

63-
exportconstgetUser=async():Promise<Types.UserResponse>=>{
64-
constresponse=awaitaxios.get<Types.UserResponse>("/api/v2/users/me")
69+
exportconstgetUser=async():Promise<TypesGen.User>=>{
70+
constresponse=awaitaxios.get<TypesGen.User>("/api/v2/users/me")
6571
returnresponse.data
6672
}
6773

@@ -70,8 +76,8 @@ export const getAuthMethods = async (): Promise<TypesGen.AuthMethods> => {
7076
returnresponse.data
7177
}
7278

73-
exportconstgetApiKey=async():Promise<Types.APIKeyResponse>=>{
74-
constresponse=awaitaxios.post<Types.APIKeyResponse>("/api/v2/users/me/keys")
79+
exportconstgetApiKey=async():Promise<TypesGen.GenerateAPIKeyResponse>=>{
80+
constresponse=awaitaxios.post<TypesGen.GenerateAPIKeyResponse>("/api/v2/users/me/keys")
7581
returnresponse.data
7682
}
7783

@@ -80,55 +86,57 @@ export const getUsers = async (): Promise<TypesGen.User[]> => {
8086
returnresponse.data
8187
}
8288

83-
exportconstgetOrganization=async(organizationId:string):Promise<Types.Organization>=>{
84-
constresponse=awaitaxios.get<Types.Organization>(`/api/v2/organizations/${organizationId}`)
89+
exportconstgetOrganization=async(organizationId:string):Promise<TypesGen.Organization>=>{
90+
constresponse=awaitaxios.get<TypesGen.Organization>(`/api/v2/organizations/${organizationId}`)
8591
returnresponse.data
8692
}
8793

88-
exportconstgetOrganizations=async():Promise<Types.Organization[]>=>{
89-
constresponse=awaitaxios.get<Types.Organization[]>("/api/v2/users/me/organizations")
94+
exportconstgetOrganizations=async():Promise<TypesGen.Organization[]>=>{
95+
constresponse=awaitaxios.get<TypesGen.Organization[]>("/api/v2/users/me/organizations")
9096
returnresponse.data
9197
}
9298

93-
exportconstgetTemplate=async(templateId:string):Promise<Types.Template>=>{
94-
constresponse=awaitaxios.get<Types.Template>(`/api/v2/templates/${templateId}`)
99+
exportconstgetTemplate=async(templateId:string):Promise<TypesGen.Template>=>{
100+
constresponse=awaitaxios.get<TypesGen.Template>(`/api/v2/templates/${templateId}`)
95101
returnresponse.data
96102
}
97103

98-
exportconstgetWorkspace=async(workspaceId:string):Promise<Types.Workspace>=>{
99-
constresponse=awaitaxios.get<Types.Workspace>(`/api/v2/workspaces/${workspaceId}`)
104+
exportconstgetWorkspace=async(workspaceId:string):Promise<TypesGen.Workspace>=>{
105+
constresponse=awaitaxios.get<TypesGen.Workspace>(`/api/v2/workspaces/${workspaceId}`)
100106
returnresponse.data
101107
}
102108

103109
exportconstgetWorkspaceByOwnerAndName=async(
104110
organizationID:string,
105111
username="me",
106112
workspaceName:string,
107-
):Promise<Types.Workspace>=>{
108-
constresponse=awaitaxios.get<Types.Workspace>(
113+
):Promise<TypesGen.Workspace>=>{
114+
constresponse=awaitaxios.get<TypesGen.Workspace>(
109115
`/api/v2/organizations/${organizationID}/workspaces/${username}/${workspaceName}`,
110116
)
111117
returnresponse.data
112118
}
113119

114-
exportconstgetWorkspaceResources=async(workspaceBuildID:string):Promise<Types.WorkspaceResource[]>=>{
115-
constresponse=awaitaxios.get<Types.WorkspaceResource[]>(`/api/v2/workspacebuilds/${workspaceBuildID}/resources`)
120+
exportconstgetWorkspaceResources=async(workspaceBuildID:string):Promise<TypesGen.WorkspaceResource[]>=>{
121+
constresponse=awaitaxios.get<TypesGen.WorkspaceResource[]>(
122+
`/api/v2/workspacebuilds/${workspaceBuildID}/resources`,
123+
)
116124
returnresponse.data
117125
}
118126

119-
exportconstcreateUser=async(user:Types.CreateUserRequest):Promise<TypesGen.User>=>{
127+
exportconstcreateUser=async(user:TypesGen.CreateUserRequest):Promise<TypesGen.User>=>{
120128
constresponse=awaitaxios.post<TypesGen.User>("/api/v2/users",user)
121129
returnresponse.data
122130
}
123131

124-
exportconstgetBuildInfo=async():Promise<Types.BuildInfoResponse>=>{
132+
exportconstgetBuildInfo=async():Promise<TypesGen.BuildInfoResponse>=>{
125133
constresponse=awaitaxios.get("/api/v2/buildinfo")
126134
returnresponse.data
127135
}
128136

129137
exportconstputWorkspaceAutostart=async(
130138
workspaceID:string,
131-
autostart:Types.WorkspaceAutostartRequest,
139+
autostart:TypesGen.UpdateWorkspaceAutostartRequest,
132140
):Promise<void>=>{
133141
constpayload=JSON.stringify(autostart)
134142
awaitaxios.put(`/api/v2/workspaces/${workspaceID}/autostart`,payload,{
@@ -138,15 +146,18 @@ export const putWorkspaceAutostart = async (
138146

139147
exportconstputWorkspaceAutostop=async(
140148
workspaceID:string,
141-
autostop:Types.WorkspaceAutostopRequest,
149+
autostop:TypesGen.UpdateWorkspaceAutostopRequest,
142150
):Promise<void>=>{
143151
constpayload=JSON.stringify(autostop)
144152
awaitaxios.put(`/api/v2/workspaces/${workspaceID}/autostop`,payload,{
145153
headers:{ ...CONTENT_TYPE_JSON},
146154
})
147155
}
148156

149-
exportconstupdateProfile=async(userId:string,data:Types.UpdateProfileRequest):Promise<Types.UserResponse>=>{
157+
exportconstupdateProfile=async(
158+
userId:string,
159+
data:TypesGen.UpdateUserProfileRequest,
160+
):Promise<TypesGen.User>=>{
150161
constresponse=awaitaxios.put(`/api/v2/users/${userId}/profile`,data)
151162
returnresponse.data
152163
}

‎site/src/components/CreateUserForm/CreateUserForm.tsx

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import TextField from "@material-ui/core/TextField"
33
import{FormikContextType,FormikErrors,useFormik}from"formik"
44
importReactfrom"react"
55
import*asYupfrom"yup"
6-
import{CreateUserRequest}from"../../api/types"
6+
import*asTypesGenfrom"../../api/typesGenerated"
77
import{getFormHelpers,onChangeTrimmed}from"../../util/formUtils"
88
import{FormFooter}from"../FormFooter/FormFooter"
99
import{FullPageForm}from"../FullPageForm/FullPageForm"
@@ -21,9 +21,9 @@ export const Language = {
2121
}
2222

2323
exportinterfaceCreateUserFormProps{
24-
onSubmit:(user:CreateUserRequest)=>void
24+
onSubmit:(user:TypesGen.CreateUserRequest)=>void
2525
onCancel:()=>void
26-
formErrors?:FormikErrors<CreateUserRequest>
26+
formErrors?:FormikErrors<TypesGen.CreateUserRequest>
2727
isLoading:boolean
2828
error?:string
2929
myOrgId:string
@@ -43,7 +43,7 @@ export const CreateUserForm: React.FC<CreateUserFormProps> = ({
4343
error,
4444
myOrgId,
4545
})=>{
46-
constform:FormikContextType<CreateUserRequest>=useFormik<CreateUserRequest>({
46+
constform:FormikContextType<TypesGen.CreateUserRequest>=useFormik<TypesGen.CreateUserRequest>({
4747
initialValues:{
4848
email:"",
4949
password:"",
@@ -53,7 +53,7 @@ export const CreateUserForm: React.FC<CreateUserFormProps> = ({
5353
validationSchema,
5454
onSubmit,
5555
})
56-
constgetFieldHelpers=getFormHelpers<CreateUserRequest>(form,formErrors)
56+
constgetFieldHelpers=getFormHelpers<TypesGen.CreateUserRequest>(form,formErrors)
5757

5858
return(
5959
<FullPageFormtitle="Create user"onCancel={onCancel}>

‎site/src/components/Footer/Footer.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,11 @@ import { makeStyles } from "@material-ui/core/styles"
33
importTypographyfrom"@material-ui/core/Typography"
44
import{useActor}from"@xstate/react"
55
importReact,{useContext}from"react"
6-
import{BuildInfoResponse}from"../../api/types"
6+
import*asTypesGenfrom"../../api/typesGenerated"
77
import{XServiceContext}from"../../xServices/StateContext"
88

99
exportconstLanguage={
10-
buildInfoText:(buildInfo:BuildInfoResponse):string=>{
10+
buildInfoText:(buildInfo:TypesGen.BuildInfoResponse):string=>{
1111
return`Coder${buildInfo.version}`
1212
},
1313
}

‎site/src/components/NavbarView/NavbarView.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,14 @@ import ListItem from "@material-ui/core/ListItem"
33
import{fade,makeStyles}from"@material-ui/core/styles"
44
importReactfrom"react"
55
import{NavLink}from"react-router-dom"
6-
import{UserResponse}from"../../api/types"
6+
import*asTypesGenfrom"../../api/typesGenerated"
77
import{navHeight}from"../../theme/constants"
88
import{AdminDropdown}from"../AdminDropdown/AdminDropdown"
99
import{Logo}from"../Icons/Logo"
1010
import{UserDropdown}from"../UserDropdown/UsersDropdown"
1111

1212
exportinterfaceNavbarViewProps{
13-
user?:UserResponse
13+
user?:TypesGen.User
1414
onSignOut:()=>void
1515
}
1616

‎site/src/components/UserDropdown/UsersDropdown.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import { fade, makeStyles } from "@material-ui/core/styles"
77
importAccountIconfrom"@material-ui/icons/AccountCircleOutlined"
88
importReact,{useState}from"react"
99
import{Link}from"react-router-dom"
10-
import{UserResponse}from"../../api/types"
10+
import*asTypesGenfrom"../../api/typesGenerated"
1111
import{BorderedMenu}from"../BorderedMenu/BorderedMenu"
1212
import{CloseDropdown,OpenDropdown}from"../DropdownArrows/DropdownArrows"
1313
import{DocsIcon}from"../Icons/DocsIcon"
@@ -21,7 +21,7 @@ export const Language = {
2121
signOutLabel:"Sign Out",
2222
}
2323
exportinterfaceUserDropdownProps{
24-
user:UserResponse
24+
user:TypesGen.User
2525
onSignOut:()=>void
2626
}
2727

‎site/src/components/UserProfileCard/UserProfileCard.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
import{makeStyles}from"@material-ui/core/styles"
22
importTypographyfrom"@material-ui/core/Typography"
33
importReactfrom"react"
4-
import{UserResponse}from"../../api/types"
4+
import*asTypesGenfrom"../../api/typesGenerated"
55
import{UserAvatar}from"../UserAvatar/UserAvatar"
66

77
interfaceUserProfileCardProps{
8-
user:UserResponse
8+
user:TypesGen.User
99
}
1010

1111
exportconstUserProfileCard:React.FC<UserProfileCardProps>=({ user})=>{

‎site/src/components/UsersTable/UsersTable.tsx

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ import TableCell from "@material-ui/core/TableCell"
55
importTableHeadfrom"@material-ui/core/TableHead"
66
importTableRowfrom"@material-ui/core/TableRow"
77
importReactfrom"react"
8-
import{UserResponse}from"../../api/types"
98
import*asTypesGenfrom"../../api/typesGenerated"
109
import{EmptyState}from"../EmptyState/EmptyState"
1110
import{RoleSelect}from"../RoleSelect/RoleSelect"
@@ -25,10 +24,10 @@ export const Language = {
2524
}
2625

2726
exportinterfaceUsersTableProps{
28-
users:UserResponse[]
29-
onSuspendUser:(user:UserResponse)=>void
30-
onResetUserPassword:(user:UserResponse)=>void
31-
onUpdateUserRoles:(user:UserResponse,roles:TypesGen.Role["name"][])=>void
27+
users:TypesGen.User[]
28+
onSuspendUser:(user:TypesGen.User)=>void
29+
onResetUserPassword:(user:TypesGen.User)=>void
30+
onUpdateUserRoles:(user:TypesGen.User,roles:TypesGen.Role["name"][])=>void
3231
roles:TypesGen.Role[]
3332
isUpdatingUserRoles?:boolean
3433
}

‎site/src/components/Workspace/Workspace.tsx

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,15 @@ import Typography from "@material-ui/core/Typography"
55
importCloudCircleIconfrom"@material-ui/icons/CloudCircle"
66
importReactfrom"react"
77
import{Link}from"react-router-dom"
8-
import*asTypesfrom"../../api/types"
8+
import*asTypesGenfrom"../../api/typesGenerated"
99
import{WorkspaceSchedule}from"../WorkspaceSchedule/WorkspaceSchedule"
1010
import{WorkspaceSection}from"../WorkspaceSection/WorkspaceSection"
1111
import*asConstantsfrom"./constants"
1212

1313
exportinterfaceWorkspaceProps{
14-
organization:Types.Organization
15-
workspace:Types.Workspace
16-
template:Types.Template
14+
organization:TypesGen.Organization
15+
workspace:TypesGen.Workspace
16+
template:TypesGen.Template
1717
}
1818

1919
/**

‎site/src/forms/CreateTemplateForm.tsx

Lines changed: 20 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import { makeStyles } from "@material-ui/core/styles"
33
import{FormikContextType,useFormik}from"formik"
44
importReactfrom"react"
55
import*asYupfrom"yup"
6-
import{CreateTemplateRequest,Organization,Provisioner,Template}from"../api/types"
6+
import*asTypesGenfrom"../api/typesGenerated"
77
import{FormCloseButton}from"../components/FormCloseButton/FormCloseButton"
88
import{FormDropdownField,FormDropdownItem}from"../components/FormDropdownField/FormDropdownField"
99
import{FormSection}from"../components/FormSection/FormSection"
@@ -12,13 +12,21 @@ import { FormTitle } from "../components/FormTitle/FormTitle"
1212
import{LoadingButton}from"../components/LoadingButton/LoadingButton"
1313
import{maxWidth}from"../theme/constants"
1414

15+
// It appears that to create a template you need to create a template version
16+
// and then a template so this contains the information to do both.
17+
exporttypeCreateTemplateRequest=TypesGen.CreateTemplateVersionRequest&Pick<TypesGen.CreateTemplateRequest,"name">
18+
1519
exportinterfaceCreateTemplateFormProps{
16-
provisioners:Provisioner[]
17-
organizations:Organization[]
18-
onSubmit:(request:CreateTemplateRequest)=>Promise<Template>
20+
provisioners:TypesGen.ProvisionerDaemon[]
21+
organizations:TypesGen.Organization[]
22+
onSubmit:(organizationId:string,request:CreateTemplateRequest)=>Promise<TypesGen.Template>
1923
onCancel:()=>void
2024
}
2125

26+
interfaceCreateTemplateFieldsextendsPick<CreateTemplateRequest,"name"|"provisioner">{
27+
organizationId:string
28+
}
29+
2230
constvalidationSchema=Yup.object({
2331
provisioner:Yup.string().required("Provisioner is required."),
2432
organizationId:Yup.string().required("Organization is required."),
@@ -33,7 +41,7 @@ export const CreateTemplateForm: React.FC<CreateTemplateFormProps> = ({
3341
})=>{
3442
conststyles=useStyles()
3543

36-
constform:FormikContextType<CreateTemplateRequest>=useFormik<CreateTemplateRequest>({
44+
constform:FormikContextType<CreateTemplateFields>=useFormik<CreateTemplateFields>({
3745
initialValues:{
3846
provisioner:provisioners[0].id,
3947
organizationId:organizations[0].name,
@@ -42,7 +50,13 @@ export const CreateTemplateForm: React.FC<CreateTemplateFormProps> = ({
4250
enableReinitialize:true,
4351
validationSchema:validationSchema,
4452
onSubmit:(req)=>{
45-
returnonSubmit(req)
53+
returnonSubmit(req.organizationId,{
54+
name:req.name,
55+
storage_method:"file",
56+
storage_source:"hash",
57+
provisioner:req.provisioner,
58+
parameter_values:[],
59+
})
4660
},
4761
})
4862

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp