mirror of
https://github.com/shishantbiswas/bknd.git
synced 2026-03-15 20:17:22 +00:00
fix repository's findOne to allow offset and sort – fixes module manager's config retrieval
This commit is contained in:
@@ -1,6 +1,7 @@
|
||||
import { describe, expect, test } from "bun:test";
|
||||
import { mark, stripMark } from "../src/core/utils";
|
||||
import { ModuleManager } from "../src/modules/ModuleManager";
|
||||
import { entity, text } from "../src/data";
|
||||
import { ModuleManager, getDefaultConfig } from "../src/modules/ModuleManager";
|
||||
import { CURRENT_VERSION, TABLE_NAME } from "../src/modules/migrations";
|
||||
import { getDummyConnection } from "./helper";
|
||||
|
||||
@@ -29,7 +30,19 @@ describe("ModuleManager", async () => {
|
||||
const mm = new ModuleManager(c.dummyConnection);
|
||||
await mm.build();
|
||||
const version = mm.version();
|
||||
const json = mm.configs();
|
||||
const configs = mm.configs();
|
||||
const json = stripMark({
|
||||
...configs,
|
||||
data: {
|
||||
...configs.data,
|
||||
basepath: "/api/data2",
|
||||
entities: {
|
||||
test: entity("test", {
|
||||
content: text()
|
||||
}).toJSON()
|
||||
}
|
||||
}
|
||||
});
|
||||
//const { version, ...json } = mm.toJSON() as any;
|
||||
|
||||
const c2 = getDummyConnection();
|
||||
@@ -37,13 +50,48 @@ describe("ModuleManager", async () => {
|
||||
const mm2 = new ModuleManager(c2.dummyConnection, { initial: { version, ...json } });
|
||||
await mm2.syncConfigTable();
|
||||
await db
|
||||
.updateTable(TABLE_NAME)
|
||||
.set({ json: JSON.stringify(json), version: CURRENT_VERSION })
|
||||
.insertInto(TABLE_NAME)
|
||||
.values({ type: "config", json: JSON.stringify(json), version: CURRENT_VERSION })
|
||||
.execute();
|
||||
|
||||
await mm2.build();
|
||||
|
||||
expect(json).toEqual(mm2.configs());
|
||||
expect(json).toEqual(stripMark(mm2.configs()));
|
||||
});
|
||||
|
||||
test("s3.1: (fetch) config given, table exists, version matches", async () => {
|
||||
const configs = getDefaultConfig();
|
||||
const json = {
|
||||
...configs,
|
||||
data: {
|
||||
...configs.data,
|
||||
basepath: "/api/data2",
|
||||
entities: {
|
||||
test: entity("test", {
|
||||
content: text()
|
||||
}).toJSON()
|
||||
}
|
||||
}
|
||||
};
|
||||
//const { version, ...json } = mm.toJSON() as any;
|
||||
|
||||
const { dummyConnection } = getDummyConnection();
|
||||
const db = dummyConnection.kysely;
|
||||
const mm2 = new ModuleManager(dummyConnection);
|
||||
await mm2.syncConfigTable();
|
||||
// assume an initial version
|
||||
await db.insertInto(TABLE_NAME).values({ type: "config", json: null, version: 1 }).execute();
|
||||
await db
|
||||
.insertInto(TABLE_NAME)
|
||||
.values({ type: "config", json: JSON.stringify(json), version: CURRENT_VERSION })
|
||||
.execute();
|
||||
|
||||
await mm2.build();
|
||||
|
||||
expect(stripMark(json)).toEqual(stripMark(mm2.configs()));
|
||||
expect(mm2.configs().data.entities.test).toBeDefined();
|
||||
expect(mm2.configs().data.entities.test.fields.content).toBeDefined();
|
||||
expect(mm2.get("data").toJSON().entities.test.fields.content).toBeDefined();
|
||||
});
|
||||
|
||||
test("s4: config given, table exists, version outdated, migrate", async () => {
|
||||
|
||||
@@ -72,10 +72,10 @@ export class TypeInvalidError extends Error {
|
||||
}
|
||||
}
|
||||
|
||||
export function stripMark(obj: any) {
|
||||
export function stripMark<O = any>(obj: O) {
|
||||
const newObj = cloneDeep(obj);
|
||||
mark(newObj, false);
|
||||
return newObj;
|
||||
return newObj as O;
|
||||
}
|
||||
|
||||
export function mark(obj: any, validated = true) {
|
||||
|
||||
@@ -162,8 +162,7 @@ export class Repository<DB = any, TB extends keyof DB = any> implements EmitsEve
|
||||
protected async performQuery(qb: RepositoryQB): Promise<RepositoryResponse> {
|
||||
const entity = this.entity;
|
||||
const compiled = qb.compile();
|
||||
/*const { sql, parameters } = qb.compile();
|
||||
console.log("many", sql, parameters);*/
|
||||
//console.log("performQuery", compiled.sql, compiled.parameters);
|
||||
|
||||
const start = performance.now();
|
||||
const selector = (as = "count") => this.conn.fn.countAll<number>().as(as);
|
||||
@@ -263,6 +262,7 @@ export class Repository<DB = any, TB extends keyof DB = any> implements EmitsEve
|
||||
qb = qb.orderBy(aliased(options.sort.by), options.sort.dir);
|
||||
}
|
||||
|
||||
//console.log("options", { _options, options, exclude_options });
|
||||
return { qb, options };
|
||||
}
|
||||
|
||||
@@ -286,14 +286,11 @@ export class Repository<DB = any, TB extends keyof DB = any> implements EmitsEve
|
||||
where: RepoQuery["where"],
|
||||
_options?: Partial<Omit<RepoQuery, "where" | "limit" | "offset">>
|
||||
): Promise<RepositoryResponse<DB[TB] | undefined>> {
|
||||
const { qb, options } = this.buildQuery(
|
||||
{
|
||||
const { qb, options } = this.buildQuery({
|
||||
..._options,
|
||||
where,
|
||||
limit: 1
|
||||
},
|
||||
["offset", "sort"]
|
||||
);
|
||||
});
|
||||
|
||||
return this.single(qb, options) as any;
|
||||
}
|
||||
|
||||
@@ -2,7 +2,15 @@ import { Diff } from "@sinclair/typebox/value";
|
||||
import { Guard } from "auth";
|
||||
import { BkndError, DebugLogger, Exception, isDebug } from "core";
|
||||
import { EventManager } from "core/events";
|
||||
import { Default, type Static, StringEnum, Type, objectEach, transformObject } from "core/utils";
|
||||
import {
|
||||
Default,
|
||||
type Static,
|
||||
StringEnum,
|
||||
Type,
|
||||
objectEach,
|
||||
stripMark,
|
||||
transformObject
|
||||
} from "core/utils";
|
||||
import {
|
||||
type Connection,
|
||||
EntityManager,
|
||||
@@ -130,7 +138,7 @@ export class ModuleManager {
|
||||
if ("version" in options.initial) {
|
||||
const { version, ...initialConfig } = options.initial;
|
||||
this._version = version;
|
||||
initial = initialConfig;
|
||||
initial = stripMark(initialConfig);
|
||||
|
||||
this._booted_with = "provided";
|
||||
} else {
|
||||
@@ -393,6 +401,7 @@ export class ModuleManager {
|
||||
this.logger.context("build").log("version", this.version());
|
||||
this.logger.log("booted with", this._booted_with);
|
||||
|
||||
// @todo: check this, because you could start without an initial config
|
||||
if (this.version() !== CURRENT_VERSION) {
|
||||
await this.syncConfigTable();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user