Add missing DB modules (lua-scripts CRUD, god-credentials, power-transfers)

Co-authored-by: johndoe6345789 <224850594+johndoe6345789@users.noreply.github.com>
This commit is contained in:
copilot-swe-agent[bot]
2026-01-06 10:25:14 +00:00
parent 81a26a9765
commit b453ec413d
12 changed files with 257 additions and 3 deletions

View File

@@ -8,6 +8,6 @@
* providing a migration path to the full DBAL when ready.
*/
export { closeAdapter } from '../../dbal-client/adapter/close-adapter'
export { getAdapter } from '../../dbal-client/adapter/get-adapter'
export type { DBALAdapter, ListOptions, ListResult } from '../../dbal-client/types'
export { closeAdapter } from '../../../dbal-client/adapter/close-adapter'
export { getAdapter } from '../../../dbal-client/adapter/get-adapter'
export type { DBALAdapter, ListOptions, ListResult } from '../../../dbal-client/types'

View File

@@ -0,0 +1,92 @@
import { getAdapter } from '../core/dbal-client'
/**
* Get god credentials expiry timestamp
*/
export async function getGodCredentialsExpiry(): Promise<number> {
const adapter = getAdapter()
const result = await adapter.list('SystemConfig')
// eslint-disable-next-line @typescript-eslint/no-explicit-any
const config = (result.data as any[]).find((c: any) => c.key === 'godCredentialsExpiry')
return config?.value ? Number(config.value) : 0
}
/**
* Set god credentials expiry timestamp
*/
export async function setGodCredentialsExpiry(timestamp: number): Promise<void> {
const adapter = getAdapter()
await adapter.upsert(
'SystemConfig',
'key',
'godCredentialsExpiry',
{ key: 'godCredentialsExpiry', value: String(timestamp) },
{ value: String(timestamp) }
)
}
/**
* Get first login flags
*/
export async function getFirstLoginFlags(): Promise<Record<string, boolean>> {
const adapter = getAdapter()
const result = await adapter.list('User')
// eslint-disable-next-line @typescript-eslint/no-explicit-any
const users = result.data as any[]
const flags: Record<string, boolean> = {}
for (const user of users) {
if (user.id && user.firstLogin !== undefined) {
flags[user.id] = Boolean(user.firstLogin)
}
}
return flags
}
/**
* Set first login flag for a user
*/
export async function setFirstLoginFlag(userId: string, flag: boolean): Promise<void> {
const adapter = getAdapter()
await adapter.update('User', userId, { firstLogin: flag })
}
/**
* Get god credentials expiry duration
*/
export async function getGodCredentialsExpiryDuration(): Promise<number> {
const adapter = getAdapter()
const result = await adapter.list('SystemConfig')
// eslint-disable-next-line @typescript-eslint/no-explicit-any
const config = (result.data as any[]).find((c: any) => c.key === 'godCredentialsExpiryDuration')
return config?.value ? Number(config.value) : 300000 // Default 5 minutes
}
/**
* Set god credentials expiry duration
*/
export async function setGodCredentialsExpiryDuration(duration: number): Promise<void> {
const adapter = getAdapter()
await adapter.upsert(
'SystemConfig',
'key',
'godCredentialsExpiryDuration',
{ key: 'godCredentialsExpiryDuration', value: String(duration) },
{ value: String(duration) }
)
}
/**
* Check if god credentials should be shown
*/
export async function shouldShowGodCredentials(): Promise<boolean> {
const expiry = await getGodCredentialsExpiry()
return expiry > Date.now()
}
/**
* Reset god credentials expiry
*/
export async function resetGodCredentialsExpiry(): Promise<void> {
const duration = await getGodCredentialsExpiryDuration()
await setGodCredentialsExpiry(Date.now() + duration)
}

View File

@@ -0,0 +1,21 @@
import { getAdapter } from '../../core/dbal-client'
import type { LuaScript } from '@/lib/types/level-types'
/**
* Add a Lua script
*/
export async function addLuaScript(script: LuaScript): Promise<void> {
const adapter = getAdapter()
await adapter.create('LuaScript', {
id: script.id,
tenantId: script.tenantId,
name: script.name,
description: script.description,
code: script.code,
parameters: script.parameters,
returnType: script.returnType,
isSandboxed: script.isSandboxed ?? true,
allowedGlobals: script.allowedGlobals ?? '[]',
timeoutMs: script.timeoutMs ?? 5000,
})
}

View File

@@ -0,0 +1,9 @@
import { getAdapter } from '../../core/dbal-client'
/**
* Delete a Lua script by ID
*/
export async function deleteLuaScript(scriptId: string): Promise<void> {
const adapter = getAdapter()
await adapter.delete('LuaScript', scriptId)
}

View File

@@ -0,0 +1,23 @@
import { getAdapter } from '../../core/dbal-client'
import type { LuaScript } from '@/lib/types/level-types'
/**
* Update a Lua script by ID
*/
export async function updateLuaScript(
scriptId: string,
updates: Partial<LuaScript>
): Promise<void> {
const adapter = getAdapter()
const data: Record<string, unknown> = {}
if (updates.name !== undefined) data.name = updates.name
if (updates.description !== undefined) data.description = updates.description
if (updates.code !== undefined) data.code = updates.code
if (updates.parameters !== undefined) data.parameters = updates.parameters
if (updates.returnType !== undefined) data.returnType = updates.returnType
if (updates.isSandboxed !== undefined) data.isSandboxed = updates.isSandboxed
if (updates.allowedGlobals !== undefined) data.allowedGlobals = updates.allowedGlobals
if (updates.timeoutMs !== undefined) data.timeoutMs = updates.timeoutMs
await adapter.update('LuaScript', scriptId, data)
}

View File

@@ -1,2 +1,5 @@
export { getLuaScripts } from './crud/get-lua-scripts'
export { setLuaScripts } from './crud/set-lua-scripts'
export { addLuaScript } from './crud/add-lua-script'
export { updateLuaScript } from './crud/update-lua-script'
export { deleteLuaScript } from './crud/delete-lua-script'

View File

@@ -0,0 +1,17 @@
import { getAdapter } from '../../core/dbal-client'
import type { PowerTransferRequest } from '@/lib/types/level-types'
/**
* Add a power transfer request
*/
export async function addPowerTransferRequest(request: PowerTransferRequest): Promise<void> {
const adapter = getAdapter()
await adapter.create('PowerTransferRequest', {
id: request.id,
fromUserId: request.fromUserId,
toUserId: request.toUserId,
status: request.status,
createdAt: request.createdAt,
expiresAt: request.expiresAt,
})
}

View File

@@ -0,0 +1,9 @@
import { getAdapter } from '../../core/dbal-client'
/**
* Delete a power transfer request by ID
*/
export async function deletePowerTransferRequest(requestId: string): Promise<void> {
const adapter = getAdapter()
await adapter.delete('PowerTransferRequest', requestId)
}

View File

@@ -0,0 +1,27 @@
import { getAdapter } from '../../core/dbal-client'
import type { PowerTransferRequest } from '@/lib/types/level-types'
type DBALPowerTransferRecord = {
id: string
fromUserId: string
toUserId: string
status: string
createdAt: string | bigint
expiresAt: string | bigint
}
/**
* Get all power transfer requests
*/
export async function getPowerTransferRequests(): Promise<PowerTransferRequest[]> {
const adapter = getAdapter()
const result = (await adapter.list('PowerTransferRequest')) as { data: DBALPowerTransferRecord[] }
return result.data.map(request => ({
id: request.id,
fromUserId: request.fromUserId,
toUserId: request.toUserId,
status: request.status,
createdAt: typeof request.createdAt === 'bigint' ? request.createdAt : BigInt(request.createdAt),
expiresAt: typeof request.expiresAt === 'bigint' ? request.expiresAt : BigInt(request.expiresAt),
}))
}

View File

@@ -0,0 +1,31 @@
import { getAdapter } from '../../core/dbal-client'
import type { PowerTransferRequest } from '@/lib/types/level-types'
type DBALPowerTransferRecord = {
id: string
}
/**
* Set all power transfer requests (replaces existing)
*/
export async function setPowerTransferRequests(requests: PowerTransferRequest[]): Promise<void> {
const adapter = getAdapter()
// Delete existing requests
const existing = (await adapter.list('PowerTransferRequest')) as { data: DBALPowerTransferRecord[] }
for (const request of existing.data) {
await adapter.delete('PowerTransferRequest', request.id)
}
// Create new requests
for (const request of requests) {
await adapter.create('PowerTransferRequest', {
id: request.id,
fromUserId: request.fromUserId,
toUserId: request.toUserId,
status: request.status,
createdAt: request.createdAt,
expiresAt: request.expiresAt,
})
}
}

View File

@@ -0,0 +1,17 @@
import { getAdapter } from '../../core/dbal-client'
import type { PowerTransferRequest } from '@/lib/types/level-types'
/**
* Update a power transfer request by ID
*/
export async function updatePowerTransferRequest(
requestId: string,
updates: Partial<PowerTransferRequest>
): Promise<void> {
const adapter = getAdapter()
const data: Record<string, unknown> = {}
if (updates.status !== undefined) data.status = updates.status
if (updates.expiresAt !== undefined) data.expiresAt = updates.expiresAt
await adapter.update('PowerTransferRequest', requestId, data)
}

View File

@@ -0,0 +1,5 @@
export { getPowerTransferRequests } from './crud/get-power-transfer-requests'
export { setPowerTransferRequests } from './crud/set-power-transfer-requests'
export { addPowerTransferRequest } from './crud/add-power-transfer-request'
export { updatePowerTransferRequest } from './crud/update-power-transfer-request'
export { deletePowerTransferRequest } from './crud/delete-power-transfer-request'