Merge pull request #2995 from specklesystems/fabians/previews-ioc-1

chore(server): previews IoC 1 - index.js repo
This commit is contained in:
Alessandro Magionami 2024-09-17 09:46:45 +02:00 коммит произвёл GitHub
Родитель f893ba29a2 6e23fe05cc
Коммит 6590c14ade
Не найден ключ, соответствующий данной подписи
Идентификатор ключа GPG: B5690EEEBB952194
4 изменённых файлов: 92 добавлений и 37 удалений

Просмотреть файл

@ -0,0 +1,15 @@
import { Nullable } from '@speckle/shared'
export type ObjectPreview = {
streamId: string
objectId: string
previewStatus: number
priority: number
lastUpdate: Date
preview: Nullable<string>
}
export type Preview = {
id: string
data: Buffer
}

Просмотреть файл

@ -11,10 +11,10 @@ const {
getCommitById
} = require('../core/services/commits')
const {
getPreviewImage,
createObjectPreview,
getObjectPreviewInfo
} = require('./services/previews')
getPreviewImageFactory,
createObjectPreviewFactory,
getObjectPreviewInfoFactory
} = require('./repository/previews')
const { makeOgImage } = require('./ogImage')
const { moduleLogger, logger } = require('@/logging/logging')
@ -27,6 +27,7 @@ const httpErrorImage = (httpErrorCode) =>
require.resolve(`#/assets/previews/images/preview_${httpErrorCode}.png`)
const cors = require('cors')
const { db } = require('@/db/knex')
const noPreviewImage = require.resolve('#/assets/previews/images/no_preview.png')
const previewErrorImage = require.resolve('#/assets/previews/images/preview_error.png')
@ -60,8 +61,10 @@ exports.init = (app, isInitial) => {
}
// Get existing preview metadata
const getObjectPreviewInfo = getObjectPreviewInfoFactory({ db })
const previewInfo = await getObjectPreviewInfo({ streamId, objectId })
if (!previewInfo) {
const createObjectPreview = createObjectPreviewFactory({ db })
await createObjectPreview({ streamId, objectId, priority: 0 })
}
@ -81,6 +84,7 @@ exports.init = (app, isInitial) => {
file: previewErrorImage
}
}
const getPreviewImage = getPreviewImageFactory({ db })
const previewImg = await getPreviewImage({ previewId: previewImgId })
if (!previewImg) {
logger.warn(`Preview image not found: ${previewImgId}`)

Просмотреть файл

@ -0,0 +1,69 @@
/* istanbul ignore file */
import knex from '@/db/knex'
import { buildTableHelper } from '@/modules/core/dbSchema'
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 }) =>
async ({ streamId, objectId }: { streamId: string; objectId: string }) => {
return await tables
.objectPreview(deps.db)
.select('*')
.where({ streamId, objectId })
.first()
}
export const createObjectPreviewFactory =
(deps: { db: Knex }) =>
async ({
streamId,
objectId,
priority
}: Pick<ObjectPreviewRecord, 'streamId' | 'objectId' | 'priority'>) => {
const insertionObject: SetOptional<ObjectPreviewRecord, 'lastUpdate' | 'preview'> =
{
streamId,
objectId,
priority,
previewStatus: 0
}
const sqlQuery =
tables.objectPreview(deps.db).insert(insertionObject).toString() +
' on conflict do nothing'
await knex.raw(sqlQuery)
}
export const getPreviewImageFactory =
(deps: { db: Knex }) =>
async ({ previewId }: { previewId: string }) => {
const previewRow = await tables
.previews(deps.db)
.where({ id: previewId })
.first()
.select('*')
if (!previewRow) {
return null
}
return previewRow.data
}

Просмотреть файл

@ -1,33 +0,0 @@
/* istanbul ignore file */
'use strict'
const knex = require('@/db/knex')
const ObjectPreview = () => knex('object_preview')
const Previews = () => knex('previews')
module.exports = {
async getObjectPreviewInfo({ streamId, objectId }) {
return await ObjectPreview().select('*').where({ streamId, objectId }).first()
},
async createObjectPreview({ streamId, objectId, priority }) {
const insertionObject = {
streamId,
objectId,
priority,
previewStatus: 0
}
const sqlQuery =
ObjectPreview().insert(insertionObject).toString() + ' on conflict do nothing'
await knex.raw(sqlQuery)
},
async getPreviewImage({ previewId }) {
const previewRow = await Previews().where({ id: previewId }).first().select('*')
if (!previewRow) {
return null
}
return previewRow.data
}
}