Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit b67f8d4

Browse files
committed
Refactor HTTP middlewares to use UUIDs
1 parent a30cf22 commit b67f8d4

26 files changed

+272
-592
lines changed

coderd/coderd.go

Lines changed: 57 additions & 158 deletions
Original file line numberDiff line numberDiff line change
@@ -44,27 +44,28 @@ func New(options *Options) (http.Handler, func()) {
4444
r.Post("/login", api.postLogin)
4545
r.Post("/logout", api.postLogout)
4646

47-
// Used for setup.
48-
r.Get("/user", api.user)
49-
r.Post("/user", api.postUser)
50-
r.Route("/users", func(r chi.Router) {
51-
r.Use(
52-
httpmw.ExtractAPIKey(options.Database, nil),
53-
)
54-
r.Post("/", api.postUsers)
55-
56-
r.Route("/{user}", func(r chi.Router) {
57-
r.Use(httpmw.ExtractUserParam(options.Database))
58-
r.Get("/", api.userByName)
59-
r.Get("/organizations", api.organizationsByUser)
60-
r.Post("/keys", api.postKeyForUser)
47+
r.Route("/user", func(r chi.Router) {
48+
r.Get("/first", api.user)
49+
r.Post("/first", api.user)
50+
r.Group(func(r chi.Router) {
51+
r.Use(httpmw.ExtractAPIKey(options.Database, nil))
52+
r.Post("/", nil)
53+
r.Route("/{user}", func(r chi.Router) {
54+
r.Use(httpmw.ExtractUserParam(options.Database))
55+
r.Get("/", api.userByName)
56+
r.Get("/organizations", api.organizationsByUser)
57+
r.Post("/keys", api.postKeyForUser)
58+
})
6159
})
6260
})
61+
6362
r.Route("/organization/{organization}", func(r chi.Router) {
6463
r.Use(
6564
httpmw.ExtractAPIKey(options.Database, nil),
6665
httpmw.ExtractOrganizationParam(options.Database),
6766
)
67+
r.Post("/users", nil)
68+
r.Get("/provisionerdaemons", nil)
6869
r.Route("/projects", func(r chi.Router) {
6970
r.Post("/", api.postProjectsByOrganization)
7071
r.Get("/", api.projectsByOrganization)
@@ -75,172 +76,70 @@ func New(options *Options) (http.Handler, func()) {
7576
r.Use(
7677
httpmw.ExtractAPIKey(options.Database, nil),
7778
httpmw.ExtractProjectParam(options.Database),
79+
httpmw.ExtractOrganizationParam(options.Database),
7880
)
7981
r.Get("/", api.projectByOrganization)
8082
r.Get("/workspaces", api.workspacesByProject)
81-
r.Route("/parameters", func(r chi.Router) {
82-
r.Get("/", api.parametersByProject)
83-
r.Post("/", api.postParametersByProject)
84-
})
85-
r.Route("/versions", func(r chi.Router) {
86-
r.Get("/", api.projectVersionsByOrganization)
87-
r.Post("/", api.postProjectVersionByOrganization)
88-
r.Route("/{projectversion}", func(r chi.Router) {
89-
r.Use(httpmw.ExtractProjectVersionParam(api.Database))
90-
r.Get("/", api.projectVersionByOrganizationAndName)
91-
})
92-
})
93-
r.Get("/", api.projects)
94-
r.Route("/{organization}", func(r chi.Router) {
95-
r.Use(httpmw.ExtractOrganizationParam(options.Database))
96-
r.Get("/", api.projectsByOrganization)
97-
r.Post("/", api.postProjectsByOrganization)
98-
r.Route("/{project}", func(r chi.Router) {
99-
100-
})
101-
})
83+
r.Get("/parameters", api.parametersByProject)
84+
r.Post("/parameters", api.postParametersByProject)
85+
r.Get("/versions", api.projectVersionsByOrganization)
86+
r.Post("/versions", api.postProjectVersionByOrganization)
10287
})
103-
104-
// Upload - Uploads a file.
105-
106-
// CreateProject(organization) - Creates a project with a version.
107-
// ImportProjectVersion(organization, project?) - If a project is provided, it's attached. If a project isn't, it's detached.
108-
// ProjectVersions - Returns a list of project versions by project.
109-
// ProjectVersionSchema(projectversion) - Return parameter schemas for a job.
110-
// ProjectVersionParameters(projectversion) - Returns computed parameters for a job.
111-
// ProjectVersionParameters(projectversion) - Returns computed parameters for a job.
112-
// ProjectVersionLogs(projectversion) - Returns logs for an executing project version.
113-
// ProjectVersionLogsAfter(projectversion, timestamp) - Streams logs that occur after a specific timestamp.
114-
// ProjectVersionResources(projectversion, resources) - Returns resources to be created for a project version.
115-
116-
// CreateWorkspace - Creates a workspace for a project.
117-
// ProvisionWorkspace - Creates a new build.
118-
// Workspaces - Returns all workspaces the user has access to.
119-
// WorkspacesByProject - Returns workspaces inside a project.
120-
// WorkspaceByName - Returns a workspace by name.
121-
// Workspace - Returns a single workspace by ID.
122-
// WorkspaceProvisions - Returns a timeline of provisions for a workspace.
123-
// WorkspaceProvisionResources - List resources for a specific workspace version.
124-
// WorkspaceProvisionResource - Get a specific resource.
125-
// WorkspaceProvisionLogs - Returns a stream of logs.
126-
// WorkspaceProvisionLogsAfter - Returns a stream of logs after.
127-
// DialWorkspaceAgent - Creates the connection to a workspace agent.
128-
// ListenWorkspaceAgent - Listens to the workspace agent as the ID.
129-
// AuthWorkspaceAgentWithGoogleInstanceIdentity - Exchanges SA for token.
130-
131-
// User - Returns the currently authenticated user.
132-
// HasFirstUser - Returns whether the first user has been created.
133-
// CreateFirstUser - Creates a new user and the organization provided.
134-
// CreateUser - Creates a new user and adds them to the organization.
135-
// CreateAPIKey - Creates a new API key.
136-
// LoginWithPassword - Authenticates with email and password.
137-
// Logout - Should clear the session token.
138-
139-
// ProvisionerDaemons
140-
// ListenProvisionerDaemon
141-
142-
// OrganizationsByUser - Returns organizations by user.
143-
144-
r.Route("/agent", func(r chi.Router) {
145-
146-
})
147-
148-
r.Route("/daemon", func(r chi.Router) {
149-
150-
})
151-
152-
r.Route("/job", func(r chi.Router) {
88+
r.Route("/projectversion/{projectversion}", func(r chi.Router) {
15389
r.Use(
15490
httpmw.ExtractAPIKey(options.Database, nil),
91+
httpmw.ExtractProjectVersionParam(options.Database),
15592
httpmw.ExtractOrganizationParam(options.Database),
15693
)
157-
r.Post("/", api.postProjectImportByOrganization)
158-
})
159-
160-
r.Route("/provisioner/job/{job}/resources", func(r chi.Router) {
16194

95+
r.Get("/", nil)
96+
r.Get("/schema", nil)
97+
r.Get("/parameters", nil)
98+
r.Get("/logs", nil)
99+
r.Get("/resources", nil)
162100
})
163-
164-
// ProjectVersionLogs
165-
166-
// Listing operations specific to resources should go under
167-
// their respective routes. eg. /orgs/<name>/workspaces
168-
r.Route("/workspaces", func(r chi.Router) {
169-
r.Use(httpmw.ExtractAPIKey(options.Database, nil))
170-
r.Get("/", api.workspaces)
171-
r.Route("/{user}", func(r chi.Router) {
172-
r.Use(httpmw.ExtractUserParam(options.Database))
173-
r.Post("/", api.postWorkspaceByUser)
174-
r.Route("/{workspace}", func(r chi.Router) {
175-
r.Use(httpmw.ExtractWorkspaceParam(options.Database))
176-
r.Get("/", api.workspaceByUser)
177-
r.Route("/version", func(r chi.Router) {
178-
r.Post("/", api.postWorkspaceBuildByUser)
179-
r.Get("/", api.workspaceBuildByUser)
180-
r.Route("/{workspacebuild}", func(r chi.Router) {
181-
r.Use(httpmw.ExtractWorkspaceBuildParam(options.Database))
182-
r.Get("/", api.workspaceBuildByName)
183-
})
184-
})
185-
})
101+
r.Route("/workspace/{workspace}", func(r chi.Router) {
102+
r.Use(
103+
httpmw.ExtractAPIKey(options.Database, nil),
104+
httpmw.ExtractWorkspaceParam(options.Database),
105+
httpmw.ExtractUserParam(options.Database),
106+
)
107+
r.Get("/", nil)
108+
r.Get("/builds", nil)
109+
r.Post("/builds", nil)
110+
})
111+
r.Route("/workspacebuild/{workspacebuild}", func(r chi.Router) {
112+
r.Use(
113+
httpmw.ExtractAPIKey(options.Database, nil),
114+
httpmw.ExtractWorkspaceBuildParam(options.Database),
115+
httpmw.ExtractWorkspaceParam(options.Database),
116+
)
117+
r.Get("/logs", nil)
118+
r.Get("/resources", nil)
119+
r.Route("/resources/{workspaceresource}", func(r chi.Router) {
120+
r.Use(httpmw.ExtractWorkspaceResourceParam(options.Database))
121+
r.Get("/", nil)
122+
r.Get("/dial", nil)
186123
})
187124
})
188-
189125
r.Route("/workspaceagent", func(r chi.Router) {
190-
r.Route("/authenticate", func(r chi.Router) {
126+
r.Route("/auth", func(r chi.Router) {
191127
r.Post("/google-instance-identity", api.postAuthenticateWorkspaceAgentUsingGoogleInstanceIdentity)
192128
})
193-
r.Group(func(r chi.Router) {
129+
r.Route("/me", func(r chi.Router) {
194130
r.Use(httpmw.ExtractWorkspaceAgent(options.Database))
195-
r.Get("/serve", api.workspaceAgentServe)
131+
r.Get("/listen", nil)
132+
})
133+
})
134+
r.Route("/provisionerdaemon", func(r chi.Router) {
135+
r.Route("/me", func(r chi.Router) {
136+
r.Get("/listen", api.provisionerDaemonsServe)
196137
})
197138
})
198-
199139
r.Route("/upload", func(r chi.Router) {
200140
r.Use(httpmw.ExtractAPIKey(options.Database, nil))
201141
r.Post("/", api.postUpload)
202142
})
203-
204-
r.Route("/projectimport/{organization}", func(r chi.Router) {
205-
r.Use(
206-
httpmw.ExtractAPIKey(options.Database, nil),
207-
httpmw.ExtractOrganizationParam(options.Database),
208-
)
209-
r.Post("/", api.postProjectImportByOrganization)
210-
r.Route("/{provisionerjob}", func(r chi.Router) {
211-
r.Use(httpmw.ExtractProvisionerJobParam(options.Database))
212-
r.Get("/", api.provisionerJobByID)
213-
r.Get("/schemas", api.projectImportJobSchemasByID)
214-
r.Get("/parameters", api.projectImportJobParametersByID)
215-
r.Get("/resources", api.provisionerJobResourcesByID)
216-
r.Get("/logs", api.provisionerJobLogsByID)
217-
})
218-
})
219-
220-
r.Route("/workspaceprovision/{organization}", func(r chi.Router) {
221-
r.Use(
222-
httpmw.ExtractAPIKey(options.Database, nil),
223-
httpmw.ExtractOrganizationParam(options.Database),
224-
)
225-
r.Route("/{provisionerjob}", func(r chi.Router) {
226-
r.Use(httpmw.ExtractProvisionerJobParam(options.Database))
227-
r.Get("/", api.provisionerJobByID)
228-
r.Get("/logs", api.provisionerJobLogsByID)
229-
r.Route("/resources", func(r chi.Router) {
230-
r.Get("/", api.provisionerJobResourcesByID)
231-
r.Route("/{workspaceresource}", func(r chi.Router) {
232-
r.Use(httpmw.ExtractWorkspaceResourceParam(options.Database))
233-
r.Get("/", api.provisionerJobResourceByID)
234-
r.Get("/agent", api.workspaceAgentConnectByResource)
235-
})
236-
})
237-
})
238-
})
239-
240-
r.Route("/provisioners/daemons", func(r chi.Router) {
241-
r.Get("/", api.provisionerDaemons)
242-
r.Get("/serve", api.provisionerDaemonsServe)
243-
})
244143
})
245144
r.NotFound(site.Handler(options.Logger).ServeHTTP)
246145
return r, api.websocketWaitGroup.Wait

database/databasefake/databasefake.go

Lines changed: 15 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -406,7 +406,7 @@ func (q *fakeQuerier) GetProjectVersionsByProjectID(_ context.Context, projectID
406406

407407
version := make([]database.ProjectVersion, 0)
408408
for _, projectVersion := range q.projectVersion {
409-
if projectVersion.ProjectID.String() != projectID.String() {
409+
if projectVersion.ProjectID.UUID.String() != projectID.String() {
410410
continue
411411
}
412412
version = append(version, projectVersion)
@@ -422,7 +422,7 @@ func (q *fakeQuerier) GetProjectVersionByProjectIDAndName(_ context.Context, arg
422422
defer q.mutex.Unlock()
423423

424424
for _, projectVersion := range q.projectVersion {
425-
if projectVersion.ProjectID.String() != arg.ProjectID.String() {
425+
if projectVersion.ProjectID.UUID.String() != arg.ProjectID.UUID.String() {
426426
continue
427427
}
428428
if !strings.EqualFold(projectVersion.Name, arg.Name) {
@@ -740,13 +740,14 @@ func (q *fakeQuerier) InsertProjectVersion(_ context.Context, arg database.Inser
740740

741741
//nolint:gosimple
742742
version := database.ProjectVersion{
743-
ID: arg.ID,
744-
ProjectID: arg.ProjectID,
745-
CreatedAt: arg.CreatedAt,
746-
UpdatedAt: arg.UpdatedAt,
747-
Name: arg.Name,
748-
Description: arg.Description,
749-
ImportJobID: arg.ImportJobID,
743+
ID: arg.ID,
744+
ProjectID: arg.ProjectID,
745+
OrganizationID: arg.OrganizationID,
746+
CreatedAt: arg.CreatedAt,
747+
UpdatedAt: arg.UpdatedAt,
748+
Name: arg.Name,
749+
Description: arg.Description,
750+
JobID: arg.JobID,
750751
}
751752
q.projectVersion = append(q.projectVersion, version)
752753
return version, nil
@@ -803,10 +804,11 @@ func (q *fakeQuerier) InsertProvisionerDaemon(_ context.Context, arg database.In
803804
defer q.mutex.Unlock()
804805

805806
daemon := database.ProvisionerDaemon{
806-
ID: arg.ID,
807-
CreatedAt: arg.CreatedAt,
808-
Name: arg.Name,
809-
Provisioners: arg.Provisioners,
807+
ID: arg.ID,
808+
CreatedAt: arg.CreatedAt,
809+
OrganizationID: arg.OrganizationID,
810+
Name: arg.Name,
811+
Provisioners: arg.Provisioners,
810812
}
811813
q.provisionerDaemons = append(q.provisionerDaemons, daemon)
812814
return daemon, nil

database/dump.sql

Lines changed: 2 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

database/migrations/000002_projects.up.sql

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ CREATE TABLE project_version (
3434
id uuid NOT NULL UNIQUE,
3535
-- This should be indexed.
3636
project_id uuid REFERENCES project (id),
37+
organization_id text NOT NULL,
3738
created_at timestamptz NOT NULL,
3839
updated_at timestamptz NOT NULL,
3940
-- Name is generated for ease of differentiation.

database/migrations/000004_jobs.up.sql

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ CREATE TABLE IF NOT EXISTS provisioner_daemon (
22
id uuid NOT NULL UNIQUE,
33
created_at timestamptz NOT NULL,
44
updated_at timestamptz,
5+
organization_id text,
56
-- Name is generated for ease of differentiation.
67
-- eg. WowBananas16
78
name varchar(64) NOT NULL UNIQUE,

database/models.go

Lines changed: 14 additions & 12 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

database/querier.go

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)