sardines-compile-time-tools
Version:
sardines.compile-time-tools.js is part of the sardines.io project
118 lines (97 loc) • 3.48 kB
text/typescript
import {
Storage,
Storage as TEstStorage,
StorageSettings,
StorageSettings as TEstStSt,
PostgresDatabaseStructure
} from '../builtin_services/storage'
import * as utils from 'sardines-utils'
export { Storage, StorageSettings as XYZSettings } from '../builtin_services/storage'
const postgresDBStruct: PostgresDatabaseStructure = {
service: {
id: 'UUID PRIMARY KEY DEFAULT uuid_generate_v4()',
create_on: 'TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP',
last_access_on: 'TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP',
owner: 'VARCHAR(30)',
name: 'VARCHAR(30)',
version: 'VARCHAR(20)',
source: 'VARCHAR(300)',
provider_settings: 'JSONB', // Array, enlist all possible provider/driver pairs and provider settings
init_params: 'JSONB', // service used init parameters
UNIQUE: ['owner', 'name', 'version']
}
}
export interface ServiceSettings {
owner: string
name: string
version: string
source: string
provider_settings?: any[]
init_params?: any
}
export interface ServiceIdentity {
owner: string
name: string
version?: string
}
export interface RepositorySettings {
storage: StorageSettings
}
class Repository {
private store: any;
constructor(repoSettings: RepositorySettings) {
this.store = new Storage(repoSettings.storage, postgresDBStruct)
}
async registerService(serviceSettings: ServiceSettings) {
let res = await this.queryService({ owner: serviceSettings.owner, name: serviceSettings.name, version: serviceSettings.version})
if (res) {
throw utils.unifyErrMesg(`service [${serviceSettings.owner}/${serviceSettings.name}@${serviceSettings.version}] already exists`, utils.logo, 'repository')
}
res = await this.store.set('service', serviceSettings)
if (res.rowCount === 1) return true
else throw utils.unifyErrMesg(`Failed to store service [${serviceSettings.owner}/${serviceSettings.name}@${serviceSettings.version}]`, utils.logo, 'repository')
}
async queryService(identity: ServiceIdentity) {
const res = await this.store.get('service', identity)
if (res) {
let serviceList = []
if (!Array.isArray(res)) serviceList.push({id: res.id})
else serviceList = res.map((item:any) => ({id: item.id}))
for (let service of serviceList) {
await this.store.set('service', {last_access_on: 'CURRENT_TIMESTAMP'}, service)
}
}
return res
}
}
export async function someFunc(settings: RepositorySettings, others: any[] = []) {
console.log(settings)
}
export const someArrowFunc = async (settings: RepositorySettings[]|RepositorySettings|null):Promise<RepositorySettings> => {
console.log(settings)
}
const someOtherFunc = function(settings: RepositorySettings):RepositorySettings {
console.log(settings)
}
export const t = async (s: TEstStSt) => {
console.log(s)
}
export const x = someOtherFunc // VariableStatement
// export const y = Repository // VariableStatement
export const z = someArrowFunc // VariableStatement
const obj = {
x: someArrowFunc,
y: Repository,
z: someFunc,
}
// export default {
// a: someArrowFunc,
// b: Repository,
// c: someFunc,
// e: 'abc',
// f: 123,
// g: [],
// h: [1, 2, 3],
// obj,
// handler: () => {}
// }