Files
mesh-forge/convex/admin.ts

80 lines
2.0 KiB
TypeScript

import { getAuthUserId } from '@convex-dev/auth/server'
import { v } from 'convex/values'
import { api } from './_generated/api'
import { query } from './_generated/server'
import { computeFlagsFromConfig } from './builds'
import { adminMutation, adminQuery } from './helpers'
export const isAdmin = query({
args: {},
handler: async (ctx) => {
const userId = await getAuthUserId(ctx)
if (!userId) return false
const userSettings = await ctx.db
.query('userSettings')
.withIndex('by_user', (q) => q.eq('userId', userId))
.first()
return userSettings?.isAdmin === true
},
})
export const listFailedBuilds = adminQuery({
args: {},
handler: async (ctx) => {
const failedBuilds = await ctx.db
.query('builds')
.filter((q) => q.eq(q.field('status'), 'failure'))
.order('desc')
.collect()
return failedBuilds
},
})
export const listAllBuilds = adminQuery({
args: {},
handler: async (ctx) => {
const allBuilds = await ctx.db.query('builds').order('desc').collect()
return allBuilds
},
})
export const retryBuild = adminMutation({
args: {
buildId: v.id('builds'),
},
handler: async (ctx, args) => {
const build = await ctx.db.get(args.buildId)
if (!build) {
throw new Error('Build not found')
}
// Compute flags from config
const flags = computeFlagsFromConfig(build.config)
// Dispatch new GitHub build with same config
// This will use the latest YAML from the branch
await ctx.scheduler.runAfter(0, api.actions.dispatchGithubBuild, {
target: build.config.target,
version: build.config.version,
buildId: args.buildId,
flags,
buildHash: build.buildHash,
plugins: build.config.pluginsEnabled ?? [],
})
// Update build status to queued and clear artifact paths
await ctx.db.patch(args.buildId, {
status: 'queued',
updatedAt: Date.now(),
firmwarePath: undefined,
sourcePath: undefined,
})
return { success: true }
},
})