kopia lustrzana https://github.com/transitive-bullshit/chatgpt-api
pull/715/head
rodzic
d1dfd32567
commit
9d0a388ead
|
@ -7,6 +7,7 @@ import { registerHealthCheck } from './health-check'
|
||||||
import { registerV1ProjectsCreateProject } from './projects/create-project'
|
import { registerV1ProjectsCreateProject } from './projects/create-project'
|
||||||
import { registerV1ProjectsGetProject } from './projects/get-project'
|
import { registerV1ProjectsGetProject } from './projects/get-project'
|
||||||
import { registerV1ProjectsListProjects } from './projects/list-projects'
|
import { registerV1ProjectsListProjects } from './projects/list-projects'
|
||||||
|
import { registerV1ProjectsUpdateProject } from './projects/update-project'
|
||||||
import { registerV1TeamsCreateTeam } from './teams/create-team'
|
import { registerV1TeamsCreateTeam } from './teams/create-team'
|
||||||
import { registerV1TeamsDeleteTeam } from './teams/delete-team'
|
import { registerV1TeamsDeleteTeam } from './teams/delete-team'
|
||||||
import { registerV1TeamsGetTeam } from './teams/get-team'
|
import { registerV1TeamsGetTeam } from './teams/get-team'
|
||||||
|
@ -46,8 +47,9 @@ registerV1TeamsMembersDeleteTeamMember(pri)
|
||||||
|
|
||||||
// Projects crud
|
// Projects crud
|
||||||
registerV1ProjectsCreateProject(pri)
|
registerV1ProjectsCreateProject(pri)
|
||||||
registerV1ProjectsGetProject(pri)
|
|
||||||
registerV1ProjectsListProjects(pri)
|
registerV1ProjectsListProjects(pri)
|
||||||
|
registerV1ProjectsGetProject(pri)
|
||||||
|
registerV1ProjectsUpdateProject(pri)
|
||||||
|
|
||||||
// TODO
|
// TODO
|
||||||
// pub.get('/projects/alias/:alias(.+)', require('./projects').readByAlias)
|
// pub.get('/projects/alias/:alias(.+)', require('./projects').readByAlias)
|
||||||
|
@ -59,7 +61,6 @@ registerV1ProjectsListProjects(pri)
|
||||||
// middleware.authenticate({ passthrough: true }),
|
// middleware.authenticate({ passthrough: true }),
|
||||||
// require('./projects').read
|
// require('./projects').read
|
||||||
// )
|
// )
|
||||||
// pri.put('/projects/:project(.+)', require('./projects').update)
|
|
||||||
|
|
||||||
// Setup routes and middleware
|
// Setup routes and middleware
|
||||||
apiV1.route('/', pub)
|
apiV1.route('/', pub)
|
||||||
|
|
|
@ -3,7 +3,8 @@ import { createRoute, type OpenAPIHono } from '@hono/zod-openapi'
|
||||||
import type { AuthenticatedEnv } from '@/lib/types'
|
import type { AuthenticatedEnv } from '@/lib/types'
|
||||||
import { db, schema } from '@/db'
|
import { db, schema } from '@/db'
|
||||||
import { aclTeamMember } from '@/lib/acl-team-member'
|
import { aclTeamMember } from '@/lib/acl-team-member'
|
||||||
import { assert, parseZodSchema } from '@/lib/utils'
|
import { getProviderToken } from '@/lib/auth/get-provider-token'
|
||||||
|
import { assert, parseZodSchema, sha256 } from '@/lib/utils'
|
||||||
|
|
||||||
const route = createRoute({
|
const route = createRoute({
|
||||||
description: 'Creates a new project.',
|
description: 'Creates a new project.',
|
||||||
|
@ -57,7 +58,9 @@ export function registerV1ProjectsCreateProject(
|
||||||
...body,
|
...body,
|
||||||
teamId: teamMember?.teamId,
|
teamId: teamMember?.teamId,
|
||||||
userId: user.id,
|
userId: user.id,
|
||||||
id
|
id,
|
||||||
|
_secret: sha256(),
|
||||||
|
_providerToken: getProviderToken({ id })
|
||||||
})
|
})
|
||||||
.returning()
|
.returning()
|
||||||
assert(project, 404, `Failed to create project "${body.name}"`)
|
assert(project, 404, `Failed to create project "${body.name}"`)
|
||||||
|
|
|
@ -0,0 +1,57 @@
|
||||||
|
import { createRoute, type OpenAPIHono } from '@hono/zod-openapi'
|
||||||
|
|
||||||
|
import type { AuthenticatedEnv } from '@/lib/types'
|
||||||
|
import { db, eq, schema } from '@/db'
|
||||||
|
import { assert, parseZodSchema } from '@/lib/utils'
|
||||||
|
|
||||||
|
import { projectIdParamsSchema } from './schemas'
|
||||||
|
|
||||||
|
const route = createRoute({
|
||||||
|
description: 'Updates a project.',
|
||||||
|
tags: ['projects'],
|
||||||
|
operationId: 'updateProject',
|
||||||
|
method: 'put',
|
||||||
|
path: 'projects/{projectId}',
|
||||||
|
security: [{ bearerAuth: [] }],
|
||||||
|
request: {
|
||||||
|
params: projectIdParamsSchema,
|
||||||
|
body: {
|
||||||
|
required: true,
|
||||||
|
content: {
|
||||||
|
'application/json': {
|
||||||
|
schema: schema.projectUpdateSchema
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
responses: {
|
||||||
|
200: {
|
||||||
|
description: 'The updated project',
|
||||||
|
content: {
|
||||||
|
'application/json': {
|
||||||
|
schema: schema.projectSelectSchema
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// TODO
|
||||||
|
// ...openApiErrorResponses
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
export function registerV1ProjectsUpdateProject(
|
||||||
|
app: OpenAPIHono<AuthenticatedEnv>
|
||||||
|
) {
|
||||||
|
return app.openapi(route, async (c) => {
|
||||||
|
const { projectId } = c.req.valid('param')
|
||||||
|
const body = c.req.valid('json')
|
||||||
|
|
||||||
|
const [project] = await db
|
||||||
|
.update(schema.projects)
|
||||||
|
.set(body)
|
||||||
|
.where(eq(schema.projects.id, projectId))
|
||||||
|
.returning()
|
||||||
|
assert(project, 404, `Failed to update project "${projectId}"`)
|
||||||
|
|
||||||
|
return c.json(parseZodSchema(schema.projectSelectSchema, project))
|
||||||
|
})
|
||||||
|
}
|
|
@ -52,10 +52,10 @@ export const projects = pgTable(
|
||||||
isStripeConnectEnabled: boolean().default(false).notNull(),
|
isStripeConnectEnabled: boolean().default(false).notNull(),
|
||||||
|
|
||||||
// All deployments share the same underlying proxy secret
|
// All deployments share the same underlying proxy secret
|
||||||
_secret: text(),
|
_secret: text().notNull(),
|
||||||
|
|
||||||
// Auth token used to access the saasify API on behalf of this project
|
// Auth token used to access the saasify API on behalf of this project
|
||||||
// _providerToken: text().notNull(),
|
_providerToken: text().notNull(),
|
||||||
|
|
||||||
// TODO: Full-text search
|
// TODO: Full-text search
|
||||||
_text: text().default('').notNull(),
|
_text: text().default('').notNull(),
|
||||||
|
@ -101,6 +101,7 @@ export const projects = pgTable(
|
||||||
(table) => [
|
(table) => [
|
||||||
index('project_userId_idx').on(table.userId),
|
index('project_userId_idx').on(table.userId),
|
||||||
index('project_teamId_idx').on(table.teamId),
|
index('project_teamId_idx').on(table.teamId),
|
||||||
|
index('project_alias_idx').on(table.alias),
|
||||||
index('project_createdAt_idx').on(table.createdAt),
|
index('project_createdAt_idx').on(table.createdAt),
|
||||||
index('project_updatedAt_idx').on(table.updatedAt)
|
index('project_updatedAt_idx').on(table.updatedAt)
|
||||||
]
|
]
|
||||||
|
@ -162,7 +163,7 @@ export const projectSelectSchema = createSelectSchema(projects, {
|
||||||
})
|
})
|
||||||
.omit({
|
.omit({
|
||||||
_secret: true,
|
_secret: true,
|
||||||
// _providerToken: true,
|
_providerToken: true,
|
||||||
_text: true,
|
_text: true,
|
||||||
_webhooks: true,
|
_webhooks: true,
|
||||||
_stripeCouponIds: true,
|
_stripeCouponIds: true,
|
||||||
|
@ -208,15 +209,13 @@ export const projectInsertSchema = createInsertSchema(projects, {
|
||||||
teamId: true
|
teamId: true
|
||||||
})
|
})
|
||||||
.strict()
|
.strict()
|
||||||
// .refine((data) => {
|
|
||||||
// return {
|
|
||||||
// ...data,
|
|
||||||
// _providerToken: getProviderToken(data)
|
|
||||||
// }
|
|
||||||
// })
|
|
||||||
|
|
||||||
// TODO: narrow update schema
|
export const projectUpdateSchema = createUpdateSchema(projects)
|
||||||
export const projectUpdateSchema = createUpdateSchema(projects).strict()
|
.pick({
|
||||||
|
name: true,
|
||||||
|
alias: true
|
||||||
|
})
|
||||||
|
.strict()
|
||||||
|
|
||||||
export const projectDebugSelectSchema = createSelectSchema(projects).pick({
|
export const projectDebugSelectSchema = createSelectSchema(projects).pick({
|
||||||
id: true,
|
id: true,
|
||||||
|
@ -233,4 +232,3 @@ export const projectDebugSelectSchema = createSelectSchema(projects).pick({
|
||||||
|
|
||||||
// TODO: virtual saasUrl
|
// TODO: virtual saasUrl
|
||||||
// TODO: virtual aliasUrl
|
// TODO: virtual aliasUrl
|
||||||
// TODO: virtual stripeConnectParams
|
|
||||||
|
|
Ładowanie…
Reference in New Issue