Files
speckle-server/packages/server/modules/previews/repository/previews.ts
T
Gergő Jedlicska 61609de97e gergo/previews (#3765)
* feat(preview-generator): add new preview generator webapp

* wip(preview-service): reworking the preview service backend

* feat(previews): logging

* feat(preview-service): streamline payloads

* fix(preview-service): do not log the full payload

* feat(preview-service): build new preview service

* feat(preview-service): add separate response queue

* feat(previews): integrate preview queues with the server

* feat(previews): use module alias

* chore(previews): remove old preview service code

* feat(previews): log stuff on job statuses

* fix(previews): add missing deps and scripts

* fix(previews): package deps fix

* fix(server): moar typing fixes

* Metrics related to jobs: total count, request failures, response errors & durations

* duration should include unit.
- histogram metric should be summary
- error responses include duration in seconds
- attempt to remove metric before adding it (prevent errors with duplicate metrics)

* fix(server, frontend): some ts fixes

* fixes

* fix(frontend): remove unneeded ts-expect-error

* chore(preview-service): eslint

* TS fix

* feat(previews): more smoal fixes

* fix(preview-service): alias loading

* feat(helm): updates for new preview service queue setup

* feat(preview-service): launch new browser for each job

* feat(preview-service): add timeout, fix liveliness

* fix(helm): add access to new secret in service accounts

* tidy metrics into a separate file

* Remove broken preview service acceptance test

* fix broken import

* Add metrics to test

* feat(preview-service): handle preview service shutdown properly

* fix(previews): merge bork

---------

Co-authored-by: Iain Sproat <68657+iainsproat@users.noreply.github.com>
Co-authored-by: Kristaps Fabians Geikins <fabis94@live.com>
2025-03-06 14:26:56 +01:00

93 lines
2.3 KiB
TypeScript

import { buildTableHelper } from '@/modules/core/dbSchema'
import {
GetObjectPreviewInfo,
GetPreviewImage,
StoreObjectPreview,
StorePreview,
UpsertObjectPreview
} from '@/modules/previews/domain/operations'
import {
ObjectPreview as ObjectPreviewRecord,
Preview
} from '@/modules/previews/domain/types'
import { Knex } from 'knex'
import { SetOptional } from 'type-fest'
const ObjectPreview = buildTableHelper('object_preview', [
'streamId',
'objectId',
'previewStatus',
'priority',
'lastUpdate',
'preview'
])
const Previews = buildTableHelper('previews', ['id', 'data'])
const tables = {
objectPreview: (db: Knex) => db<ObjectPreviewRecord>(ObjectPreview.name),
previews: (db: Knex) => db<Preview>(Previews.name)
}
export const getObjectPreviewInfoFactory =
(deps: { db: Knex }): GetObjectPreviewInfo =>
async ({ streamId, objectId }: { streamId: string; objectId: string }) => {
return await tables
.objectPreview(deps.db)
.select('*')
.where({ streamId, objectId })
.first()
}
export const storeObjectPreviewFactory =
({ db }: { db: Knex }): StoreObjectPreview =>
async ({
streamId,
objectId,
priority
}: Pick<ObjectPreviewRecord, 'streamId' | 'objectId' | 'priority'>) => {
const insertionObject: SetOptional<ObjectPreviewRecord, 'lastUpdate' | 'preview'> =
{
streamId,
objectId,
priority,
previewStatus: 0
}
const sqlQuery = tables
.objectPreview(db)
.insert(insertionObject)
.onConflict()
.ignore()
await sqlQuery
}
export const storePreviewFactory =
({ db }: { db: Knex }): StorePreview =>
async ({ preview }) => {
await tables.previews(db).insert(preview).onConflict().ignore()
}
export const upsertObjectPreviewFactory =
({ db }: { db: Knex }): UpsertObjectPreview =>
async ({ objectPreview }) => {
await tables
.objectPreview(db)
.insert(objectPreview)
.onConflict(['streamId', 'objectId'])
.merge()
}
export const getPreviewImageFactory =
(deps: { db: Knex }): GetPreviewImage =>
async ({ previewId }: { previewId: string }) => {
const previewRow = await tables
.previews(deps.db)
.where({ id: previewId })
.first()
.select('*')
if (!previewRow) {
return null
}
return previewRow.data
}