Skip to content

Commit c73662a

Browse files
committed
Merge branch 'next' of github.com:devforth/adminforth into next
2 parents 7ffdfc6 + fc6aae2 commit c73662a

File tree

8 files changed

+76
-9
lines changed

8 files changed

+76
-9
lines changed

adminforth/dataConnectors/clickhouse.ts

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -499,6 +499,21 @@ class ClickhouseConnector extends AdminForthBaseConnector implements IAdminForth
499499
return res;
500500
}
501501

502+
async deleteMany({ resource, recordIds }: { resource: AdminForthResource; recordIds: string[] }): Promise<number> {
503+
const pkColumn = resource.dataSourceColumns.find((col) => col.primaryKey);
504+
if (!pkColumn || !recordIds || recordIds.length === 0) {
505+
return 0;
506+
}
507+
const paramNames = recordIds.map((_, idx) => `id${idx}`);
508+
const conditions = paramNames.map((name) => `${pkColumn.name} = {${name}:${pkColumn._underlineType}}`).join(' OR ');
509+
const queryParams = paramNames.reduce((acc, name, idx) => {acc[name] = recordIds[idx]; return acc;}, {} as Record<string, any>);
510+
await this.client.command({
511+
query: `ALTER TABLE ${this.dbName}.${resource.table} DELETE WHERE ${conditions}`,
512+
query_params: queryParams,
513+
});
514+
return recordIds.length;
515+
}
516+
502517
close() {
503518
this.client.disconnect();
504519
}

adminforth/dataConnectors/mongo.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -397,6 +397,15 @@ class MongoConnector extends AdminForthBaseConnector implements IAdminForthDataS
397397
return res.deletedCount > 0;
398398
}
399399

400+
async deleteMany({ resource, recordIds }: { resource: AdminForthResource; recordIds: string[] }): Promise<number> {
401+
if (!recordIds || recordIds.length === 0) {
402+
return 0;
403+
}
404+
const collection = this.client.db().collection(resource.table);
405+
const res = await collection.deleteMany({[this.getPrimaryKey(resource)]: { $in: recordIds }});
406+
return res.deletedCount ?? 0;
407+
}
408+
400409
async close() {
401410
await this.client.close()
402411
}

adminforth/dataConnectors/mysql.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -420,6 +420,17 @@ class MysqlConnector extends AdminForthBaseConnector implements IAdminForthDataS
420420
return res.rowCount > 0;
421421
}
422422

423+
async deleteMany({ resource, recordIds }: { resource: AdminForthResource; recordIds: string[] }): Promise<number> {
424+
if (!recordIds || recordIds.length === 0) {
425+
return 0;
426+
}
427+
const placeholders = recordIds.map(() => '?').join(',');
428+
const query = `DELETE FROM ${resource.table} WHERE ${this.getPrimaryKey(resource)} IN (${placeholders})`;
429+
dbLogger.trace(`🪲📜 MySQL Q: ${query} values: ${JSON.stringify([recordIds])}`);
430+
const [result] = await this.client.execute(query, recordIds);
431+
return result.affectedRows ?? 0;
432+
}
433+
423434
async close() {
424435
await this.client.end();
425436
}

adminforth/dataConnectors/postgres.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -455,6 +455,17 @@ class PostgresConnector extends AdminForthBaseConnector implements IAdminForthDa
455455
return res.rowCount > 0;
456456
}
457457

458+
async deleteMany({ resource, recordIds }: { resource: AdminForthResource; recordIds: string[]}): Promise<number> {
459+
if (!recordIds || recordIds.length === 0) {
460+
return 0;
461+
}
462+
const placeholders = recordIds.map((_, idx) => `$${idx + 1}`).join(', ');
463+
const query = `DELETE FROM "${resource.table}" WHERE "${this.getPrimaryKey(resource)}" IN (${placeholders})`;
464+
dbLogger.trace(`🪲📜 PG Q: ${query}, values: ${JSON.stringify([recordIds])}`);
465+
const res = await this.client.query(query, recordIds);
466+
return res.rowCount ?? 0;
467+
}
468+
458469
async close() {
459470
await this.client.end();
460471
}

adminforth/dataConnectors/sqlite.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -382,6 +382,17 @@ class SQLiteConnector extends AdminForthBaseConnector implements IAdminForthData
382382
return res.changes > 0;
383383
}
384384

385+
async deleteMany({ resource, recordIds }: { resource: AdminForthResource, recordIds: string[] }): Promise<number> {
386+
if (!recordIds || recordIds.length === 0) {
387+
return 0;
388+
}
389+
const placeholders = recordIds.map(() => '?').join(',');
390+
const q = this.client.prepare(`DELETE FROM ${resource.table} WHERE ${this.getPrimaryKey(resource)} IN (${placeholders})`);
391+
dbLogger.trace(`🪲📜 SQLITE Q: ${q}, params: ${JSON.stringify(recordIds)}`);
392+
const res = await q.run(...recordIds);
393+
return res.changes ?? 0;
394+
}
395+
385396
close() {
386397
this.client.close();
387398
}

adminforth/modules/codeInjector.ts

Lines changed: 16 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -724,11 +724,16 @@ class CodeInjector implements ICodeInjector {
724724

725725

726726
/* hash checking */
727-
// Here we use pnpm-lock.yaml, because this file will be anywat, even if user doesn't use it
728-
const spaPnpmLockPath = path.join(this.spaTmpPath(), 'pnpm-lock.yaml');
729-
const spaPnpmLock = yaml.parse(await fs.promises.readFile(spaPnpmLockPath, 'utf-8'));
730-
const spaLockHash = hashify(spaPnpmLock);
731-
727+
let spaLockHash = '';
728+
if (await this.doesUserHasPnpmLockFile(this.adminforth.config.customization.customComponentsDir)) {
729+
const spaPnpmLockPath = path.join(this.spaTmpPath(), 'pnpm-lock.yaml');
730+
const spaPnpmLock = yaml.parse(await fs.promises.readFile(spaPnpmLockPath, 'utf-8'));
731+
spaLockHash = hashify(spaPnpmLock);
732+
} else {
733+
const spaNpmLockPath = path.join(this.spaTmpPath(), 'package-lock.json');
734+
const spaNpmLock = JSON.parse(await fs.promises.readFile(spaNpmLockPath, 'utf-8'));
735+
spaLockHash = hashify(spaNpmLock);
736+
}
732737
/* customPackageLock */
733738
let usersLockHash: string = '';
734739
let usersPackages: string[] = [];
@@ -946,7 +951,9 @@ class CodeInjector implements ICodeInjector {
946951

947952
// 🚫 Skip big files or files which might be dynamic
948953
if (file.name === 'node_modules' || file.name === 'dist' ||
949-
file.name === 'i18n-messages.json' || file.name === 'i18n-empty.json' || file.name === 'hashes.json') {
954+
file.name === 'i18n-messages.json' || file.name === 'i18n-empty.json' ||
955+
file.name === 'hashes.json' || file.name === 'package.json' ||
956+
file.name === 'pnpm-lock.yaml' || file.name === 'package-lock.json') {
950957
return '';
951958
}
952959

@@ -974,7 +981,9 @@ class CodeInjector implements ICodeInjector {
974981

975982
// 🚫 Skip big/dynamic folders or files
976983
if (file.name === 'node_modules' || file.name === 'dist' ||
977-
file.name === 'i18n-messages.json' || file.name === 'i18n-empty.json' || file.name === 'hashes.json') {
984+
file.name === 'i18n-messages.json' || file.name === 'i18n-empty.json' ||
985+
file.name === 'hashes.json' || file.name === 'package.json' ||
986+
file.name === 'pnpm-lock.yaml' || file.name === 'package-lock.json') {
978987
return;
979988
}
980989

@@ -1041,9 +1050,7 @@ class CodeInjector implements ICodeInjector {
10411050
const skipBuild = buildHash === sourcesHash;
10421051
const skipExtract = messagesHash === sourcesHash;
10431052

1044-
afLogger.trace(`🪲 SPA build hash: ${buildHash}`);
10451053
afLogger.trace(`🪲 SPA messages hash: ${messagesHash}`);
1046-
afLogger.trace(`🪲 SPA sources hash: ${sourcesHash}`);
10471054

10481055
if (!skipBuild) {
10491056
// remove serveDir if exists

adminforth/types/Back.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1760,6 +1760,8 @@ export interface IOperationalResource {
17601760
update: (primaryKey: any, record: any) => Promise<any>;
17611761

17621762
delete: (primaryKey: any) => Promise<boolean>;
1763+
1764+
deleteMany?(recordIds: any[]): Promise<number>;
17631765

17641766
dataConnector: IAdminForthDataSourceConnectorBase;
17651767
}

dev-demo/Taskfile.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ vars:
3030
- "adminforth-quick-filters"
3131
- "adminforth-many2many"
3232
- "adminforth-background-jobs"
33+
- "adminforth-auto-remove"
3334

3435
ADAPTERS:
3536
- "adminforth-completion-adapter-open-ai-chat-gpt"

0 commit comments

Comments
 (0)