@paroicms/server-database-media-storage 0.34.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (45) hide show
  1. package/README.md +3 -0
  2. package/ddl/medias.ddl.sql +34 -0
  3. package/dist/context.d.ts +1 -0
  4. package/dist/context.js +6 -0
  5. package/dist/context.js.map +1 -0
  6. package/dist/data-types.d.ts +24 -0
  7. package/dist/data-types.js +3 -0
  8. package/dist/data-types.js.map +1 -0
  9. package/dist/db-init/db-init.d.ts +11 -0
  10. package/dist/db-init/db-init.js +33 -0
  11. package/dist/db-init/db-init.js.map +1 -0
  12. package/dist/db-init/ddl-migration.d.ts +12 -0
  13. package/dist/db-init/ddl-migration.js +28 -0
  14. package/dist/db-init/ddl-migration.js.map +1 -0
  15. package/dist/entities/pa-image.model.d.ts +6 -0
  16. package/dist/entities/pa-image.model.js +40 -0
  17. package/dist/entities/pa-image.model.js.map +1 -0
  18. package/dist/entities/pa-media-handle.model.d.ts +6 -0
  19. package/dist/entities/pa-media-handle.model.js +40 -0
  20. package/dist/entities/pa-media-handle.model.js.map +1 -0
  21. package/dist/entities/pa-media.model.d.ts +10 -0
  22. package/dist/entities/pa-media.model.js +55 -0
  23. package/dist/entities/pa-media.model.js.map +1 -0
  24. package/dist/helpers/data-formatters.helpers.d.ts +5 -0
  25. package/dist/helpers/data-formatters.helpers.js +47 -0
  26. package/dist/helpers/data-formatters.helpers.js.map +1 -0
  27. package/dist/helpers/sqlite-date-helper.d.ts +1 -0
  28. package/dist/helpers/sqlite-date-helper.js +9 -0
  29. package/dist/helpers/sqlite-date-helper.js.map +1 -0
  30. package/dist/index.d.ts +3 -0
  31. package/dist/index.js +20 -0
  32. package/dist/index.js.map +1 -0
  33. package/dist/media-storage-context.d.ts +20 -0
  34. package/dist/media-storage-context.js +63 -0
  35. package/dist/media-storage-context.js.map +1 -0
  36. package/dist/media-storage-types.d.ts +23 -0
  37. package/dist/media-storage-types.js +3 -0
  38. package/dist/media-storage-types.js.map +1 -0
  39. package/dist/media-storage.d.ts +75 -0
  40. package/dist/media-storage.js +92 -0
  41. package/dist/media-storage.js.map +1 -0
  42. package/dist/media.queries.d.ts +32 -0
  43. package/dist/media.queries.js +250 -0
  44. package/dist/media.queries.js.map +1 -0
  45. package/package.json +42 -0
package/README.md ADDED
@@ -0,0 +1,3 @@
1
+ # @paroicms/server-database-media-storage
2
+
3
+ This package is part of ParoiCMS.
@@ -0,0 +1,34 @@
1
+ PRAGMA journal_mode = TRUNCATE;
2
+ PRAGMA foreign_keys = 1;
3
+
4
+ create table PaDbMetadata (
5
+ dbSchema varchar(100) not null primary key,
6
+ dbVersion integer not null
7
+ );
8
+
9
+ insert into PaDbMetadata (dbSchema, dbVersion) values ('medias', 3);
10
+
11
+ create table PaMedia (
12
+ uid varchar(36) not null primary key,
13
+ mediaType varchar(100) not null,
14
+ weightB integer not null,
15
+ modifiedTs timestamp not null default current_timestamp,
16
+ binaryFile blob not null,
17
+ attachedData text,
18
+ originalName varchar(200)
19
+ );
20
+
21
+ create table PaImage (
22
+ uid varchar(36) not null primary key references PaMedia (uid) on delete cascade,
23
+ width integer not null,
24
+ height integer not null,
25
+ lossless tinyint(1)
26
+ );
27
+
28
+ create table PaMediaHandle (
29
+ mediaUid varchar(36) not null references PaMedia (uid) on delete cascade,
30
+ handle varchar(200) not null,
31
+ orderNum integer,
32
+ leafId bigint,
33
+ primary key (mediaUid, handle)
34
+ );
@@ -0,0 +1 @@
1
+ export declare const packageDir: string;
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.packageDir = void 0;
4
+ const path_1 = require("path");
5
+ exports.packageDir = (0, path_1.dirname)(__dirname);
6
+ //# sourceMappingURL=context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.js","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":";;;AAAA,+BAA+B;AAElB,QAAA,UAAU,GAAG,IAAA,cAAO,EAAC,SAAS,CAAC,CAAC"}
@@ -0,0 +1,24 @@
1
+ /// <reference types="node" />
2
+ export interface MediaBase {
3
+ uid: string;
4
+ mediaType: string;
5
+ modifiedTs: Date;
6
+ weightB: number;
7
+ attachedData?: string;
8
+ originalName?: string;
9
+ }
10
+ export interface Media extends MediaBase {
11
+ kind: "media";
12
+ }
13
+ export interface Image extends MediaBase {
14
+ kind: "image";
15
+ height: number;
16
+ width: number;
17
+ lossless?: boolean;
18
+ }
19
+ export interface MediaWithBinary extends Media {
20
+ binaryFile: Buffer;
21
+ }
22
+ export interface ImageWithBinary extends Image {
23
+ binaryFile: Buffer;
24
+ }
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=data-types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"data-types.js","sourceRoot":"","sources":["../src/data-types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,11 @@
1
+ import { AppLog } from "@paroicms/server-lib";
2
+ import { DataSource } from "typeorm";
3
+ export declare function createOrOpenMainCn({ sqliteFile, siteName, canCreate, appLog, }: {
4
+ sqliteFile: string;
5
+ siteName: string;
6
+ canCreate: boolean;
7
+ appLog: AppLog;
8
+ }, siteLeafId: string): Promise<{
9
+ mainCn: DataSource;
10
+ logNextQuery: (count?: number | undefined) => void;
11
+ }>;
@@ -0,0 +1,33 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createOrOpenMainCn = void 0;
4
+ const server_lib_1 = require("@paroicms/server-lib");
5
+ const path_1 = require("path");
6
+ const context_1 = require("../context");
7
+ const ddl_migration_1 = require("./ddl-migration");
8
+ async function createOrOpenMainCn({ sqliteFile, siteName, canCreate, appLog, }, siteLeafId) {
9
+ const { logNextQuery, typeOrmLogger } = (0, server_lib_1.createSqlLogger)({ appLog, siteName, dbSchemaName: ddl_migration_1.dbSchemaName });
10
+ const { mainCn } = await (0, server_lib_1.createOrOpenSqliteConnection)({
11
+ siteName: siteName,
12
+ canCreate,
13
+ dbSchemaName: ddl_migration_1.dbSchemaName,
14
+ sqliteFile,
15
+ ddlFile: (0, path_1.join)(context_1.packageDir, "ddl", "medias.ddl.sql"),
16
+ migrateDb,
17
+ entities: [`${context_1.packageDir}/dist/**/*.model.js`],
18
+ logger: typeOrmLogger,
19
+ });
20
+ async function migrateDb(cn) {
21
+ const dbVersion = await (0, ddl_migration_1.getDbVersion)(cn, { siteName });
22
+ if (dbVersion !== ddl_migration_1.currentMediasDbSchemaVersion) {
23
+ await (0, ddl_migration_1.migrateMediasDb)(cn, {
24
+ fromVersion: dbVersion,
25
+ siteName,
26
+ appLog,
27
+ }, siteLeafId);
28
+ }
29
+ }
30
+ return { mainCn, logNextQuery };
31
+ }
32
+ exports.createOrOpenMainCn = createOrOpenMainCn;
33
+ //# sourceMappingURL=db-init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"db-init.js","sourceRoot":"","sources":["../../src/db-init/db-init.ts"],"names":[],"mappings":";;;AAAA,qDAA6F;AAC7F,+BAA4B;AAE5B,wCAAwC;AACxC,mDAKyB;AAElB,KAAK,UAAU,kBAAkB,CACtC,EACE,UAAU,EACV,QAAQ,EACR,SAAS,EACT,MAAM,GACuE,EAC/E,UAAkB;IAElB,MAAM,EAAE,YAAY,EAAE,aAAa,EAAE,GAAG,IAAA,4BAAe,EAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,YAAY,EAAZ,4BAAY,EAAE,CAAC,CAAC;IAE5F,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,IAAA,yCAA4B,EAAC;QACpD,QAAQ,EAAE,QAAQ;QAClB,SAAS;QACT,YAAY,EAAZ,4BAAY;QACZ,UAAU;QACV,OAAO,EAAE,IAAA,WAAI,EAAC,oBAAU,EAAE,KAAK,EAAE,gBAAgB,CAAC;QAClD,SAAS;QACT,QAAQ,EAAE,CAAC,GAAG,oBAAU,qBAAqB,CAAC;QAC9C,MAAM,EAAE,aAAa;KACtB,CAAC,CAAC;IAEH,KAAK,UAAU,SAAS,CAAC,EAAc;QACrC,MAAM,SAAS,GAAG,MAAM,IAAA,4BAAY,EAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC;QACvD,IAAI,SAAS,KAAK,4CAA4B,EAAE,CAAC;YAC/C,MAAM,IAAA,+BAAe,EACnB,EAAE,EACF;gBACE,WAAW,EAAE,SAAS;gBACtB,QAAQ;gBACR,MAAM;aACP,EACD,UAAU,CACX,CAAC;QACJ,CAAC;IACH,CAAC;IAED,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC;AAClC,CAAC;AAtCD,gDAsCC"}
@@ -0,0 +1,12 @@
1
+ import { AppLog } from "@paroicms/server-lib";
2
+ import { DataSource } from "typeorm";
3
+ export declare const dbSchemaName = "medias";
4
+ export declare const currentMediasDbSchemaVersion = 3;
5
+ export declare function getDbVersion(cn: DataSource, { siteName }: {
6
+ siteName: string;
7
+ }): Promise<number>;
8
+ export declare function migrateMediasDb(cn: DataSource, { fromVersion, siteName, appLog }: {
9
+ fromVersion: number;
10
+ siteName: string;
11
+ appLog: AppLog;
12
+ }, siteLeafId: string): Promise<void>;
@@ -0,0 +1,28 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.migrateMediasDb = exports.getDbVersion = exports.currentMediasDbSchemaVersion = exports.dbSchemaName = void 0;
4
+ const data_formatters_lib_1 = require("@paroi/data-formatters-lib");
5
+ exports.dbSchemaName = "medias";
6
+ exports.currentMediasDbSchemaVersion = 3;
7
+ async function getDbVersion(cn, { siteName }) {
8
+ const [row] = await cn.query(`select dbVersion from PaDbMetadata where dbSchema = '${exports.dbSchemaName}'`);
9
+ if (!row)
10
+ throw new Error(`[${siteName}] missing dbSchema '${exports.dbSchemaName}' in database`);
11
+ return (0, data_formatters_lib_1.nbVal)(row.dbVersion, { varName: "dbVersion" });
12
+ }
13
+ exports.getDbVersion = getDbVersion;
14
+ async function migrateMediasDb(cn, { fromVersion, siteName, appLog }, siteLeafId) {
15
+ const toVersion = exports.currentMediasDbSchemaVersion;
16
+ let currentVersion = fromVersion;
17
+ if (currentVersion === 3) {
18
+ // await cn.query("alter table ...");
19
+ // await cn.query(`update PaDbMetadata set dbVersion = 4 where dbSchema = '${dbSchemaName}'`);
20
+ currentVersion = 4;
21
+ }
22
+ if (currentVersion !== toVersion) {
23
+ throw new Error(`[${siteName}] version of ${exports.dbSchemaName} database should be '${toVersion}', but is '${currentVersion}'`);
24
+ }
25
+ appLog.info(`[${siteName}] ${exports.dbSchemaName} database was migrated from ${fromVersion} to ${currentVersion}`);
26
+ }
27
+ exports.migrateMediasDb = migrateMediasDb;
28
+ //# sourceMappingURL=ddl-migration.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ddl-migration.js","sourceRoot":"","sources":["../../src/db-init/ddl-migration.ts"],"names":[],"mappings":";;;AAAA,oEAAmD;AAKtC,QAAA,YAAY,GAAG,QAAQ,CAAC;AACxB,QAAA,4BAA4B,GAAG,CAAC,CAAC;AAEvC,KAAK,UAAU,YAAY,CAAC,EAAc,EAAE,EAAE,QAAQ,EAAwB;IACnF,MAAM,CAAC,GAAG,CAAC,GAAG,MAAM,EAAE,CAAC,KAAK,CAC1B,wDAAwD,oBAAY,GAAG,CACxE,CAAC;IACF,IAAI,CAAC,GAAG;QAAE,MAAM,IAAI,KAAK,CAAC,IAAI,QAAQ,uBAAuB,oBAAY,eAAe,CAAC,CAAC;IAC1F,OAAO,IAAA,2BAAK,EAAC,GAAG,CAAC,SAAS,EAAE,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC,CAAC;AACxD,CAAC;AAND,oCAMC;AAEM,KAAK,UAAU,eAAe,CACnC,EAAc,EACd,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,EAA6D,EAC5F,UAAkB;IAElB,MAAM,SAAS,GAAG,oCAA4B,CAAC;IAC/C,IAAI,cAAc,GAAG,WAAW,CAAC;IAEjC,IAAI,cAAc,KAAK,CAAC,EAAE,CAAC;QACzB,qCAAqC;QACrC,8FAA8F;QAC9F,cAAc,GAAG,CAAC,CAAC;IACrB,CAAC;IAED,IAAI,cAAc,KAAK,SAAS,EAAE,CAAC;QACjC,MAAM,IAAI,KAAK,CACb,IAAI,QAAQ,gBAAgB,oBAAY,wBAAwB,SAAS,cAAc,cAAc,GAAG,CACzG,CAAC;IACJ,CAAC;IACD,MAAM,CAAC,IAAI,CACT,IAAI,QAAQ,KAAK,oBAAY,+BAA+B,WAAW,OAAO,cAAc,EAAE,CAC/F,CAAC;AACJ,CAAC;AAtBD,0CAsBC"}
@@ -0,0 +1,6 @@
1
+ export declare class PaImageEntity {
2
+ uid: string;
3
+ width: number;
4
+ height: number;
5
+ lossless?: boolean;
6
+ }
@@ -0,0 +1,40 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.PaImageEntity = void 0;
13
+ const typeorm_1 = require("typeorm");
14
+ let PaImageEntity = class PaImageEntity {
15
+ uid;
16
+ width;
17
+ height;
18
+ lossless;
19
+ };
20
+ exports.PaImageEntity = PaImageEntity;
21
+ __decorate([
22
+ (0, typeorm_1.Column)({ type: "varchar", length: 36, primary: true }),
23
+ __metadata("design:type", String)
24
+ ], PaImageEntity.prototype, "uid", void 0);
25
+ __decorate([
26
+ (0, typeorm_1.Column)({ type: "integer" }),
27
+ __metadata("design:type", Number)
28
+ ], PaImageEntity.prototype, "width", void 0);
29
+ __decorate([
30
+ (0, typeorm_1.Column)({ type: "integer" }),
31
+ __metadata("design:type", Number)
32
+ ], PaImageEntity.prototype, "height", void 0);
33
+ __decorate([
34
+ (0, typeorm_1.Column)({ type: "boolean", nullable: true }),
35
+ __metadata("design:type", Boolean)
36
+ ], PaImageEntity.prototype, "lossless", void 0);
37
+ exports.PaImageEntity = PaImageEntity = __decorate([
38
+ (0, typeorm_1.Entity)("PaImage")
39
+ ], PaImageEntity);
40
+ //# sourceMappingURL=pa-image.model.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pa-image.model.js","sourceRoot":"","sources":["../../src/entities/pa-image.model.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,qCAAyC;AAGlC,IAAM,aAAa,GAAnB,MAAM,aAAa;IAExB,GAAG,CAAU;IAGb,KAAK,CAAU;IAGf,MAAM,CAAU;IAGhB,QAAQ,CAAW;CACpB,CAAA;AAZY,sCAAa;AAExB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;;0CAC1C;AAGb;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;;4CACb;AAGf;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;;6CACZ;AAGhB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;+CACzB;wBAXR,aAAa;IADzB,IAAA,gBAAM,EAAC,SAAS,CAAC;GACL,aAAa,CAYzB"}
@@ -0,0 +1,6 @@
1
+ export declare class PaMediaHandleEntity {
2
+ mediaUid: string;
3
+ handle: string;
4
+ orderNum?: number;
5
+ leafId?: string;
6
+ }
@@ -0,0 +1,40 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.PaMediaHandleEntity = void 0;
13
+ const typeorm_1 = require("typeorm");
14
+ let PaMediaHandleEntity = class PaMediaHandleEntity {
15
+ mediaUid;
16
+ handle;
17
+ orderNum;
18
+ leafId;
19
+ };
20
+ exports.PaMediaHandleEntity = PaMediaHandleEntity;
21
+ __decorate([
22
+ (0, typeorm_1.Column)({ type: "varchar", length: 36, primary: true }),
23
+ __metadata("design:type", String)
24
+ ], PaMediaHandleEntity.prototype, "mediaUid", void 0);
25
+ __decorate([
26
+ (0, typeorm_1.Column)({ type: "varchar", primary: true }),
27
+ __metadata("design:type", String)
28
+ ], PaMediaHandleEntity.prototype, "handle", void 0);
29
+ __decorate([
30
+ (0, typeorm_1.Column)({ type: "integer", nullable: true }),
31
+ __metadata("design:type", Number)
32
+ ], PaMediaHandleEntity.prototype, "orderNum", void 0);
33
+ __decorate([
34
+ (0, typeorm_1.Column)({ type: "bigint", nullable: true }),
35
+ __metadata("design:type", String)
36
+ ], PaMediaHandleEntity.prototype, "leafId", void 0);
37
+ exports.PaMediaHandleEntity = PaMediaHandleEntity = __decorate([
38
+ (0, typeorm_1.Entity)("PaMediaHandle")
39
+ ], PaMediaHandleEntity);
40
+ //# sourceMappingURL=pa-media-handle.model.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pa-media-handle.model.js","sourceRoot":"","sources":["../../src/entities/pa-media-handle.model.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,qCAAyC;AAGlC,IAAM,mBAAmB,GAAzB,MAAM,mBAAmB;IAE9B,QAAQ,CAAU;IAGlB,MAAM,CAAU;IAGhB,QAAQ,CAAU;IAGlB,MAAM,CAAU;CACjB,CAAA;AAZY,kDAAmB;AAE9B;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;;qDACrC;AAGlB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;;mDAC3B;AAGhB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;qDAC1B;AAGlB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;mDAC3B;8BAXL,mBAAmB;IAD/B,IAAA,gBAAM,EAAC,eAAe,CAAC;GACX,mBAAmB,CAY/B"}
@@ -0,0 +1,10 @@
1
+ /// <reference types="node" />
2
+ export declare class PaMediaEntity {
3
+ uid: string;
4
+ mediaType: string;
5
+ weightB: number;
6
+ modifiedTs: Date;
7
+ binaryFile: Buffer;
8
+ attachedData?: string;
9
+ originalName?: string;
10
+ }
@@ -0,0 +1,55 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.PaMediaEntity = void 0;
13
+ const typeorm_1 = require("typeorm");
14
+ let PaMediaEntity = class PaMediaEntity {
15
+ uid;
16
+ mediaType;
17
+ weightB;
18
+ modifiedTs;
19
+ binaryFile;
20
+ attachedData;
21
+ originalName;
22
+ };
23
+ exports.PaMediaEntity = PaMediaEntity;
24
+ __decorate([
25
+ (0, typeorm_1.Column)({ type: "varchar", length: 36, primary: true }),
26
+ __metadata("design:type", String)
27
+ ], PaMediaEntity.prototype, "uid", void 0);
28
+ __decorate([
29
+ (0, typeorm_1.Column)({ type: "varchar" }),
30
+ __metadata("design:type", String)
31
+ ], PaMediaEntity.prototype, "mediaType", void 0);
32
+ __decorate([
33
+ (0, typeorm_1.Column)({ type: "integer" }),
34
+ __metadata("design:type", Number)
35
+ ], PaMediaEntity.prototype, "weightB", void 0);
36
+ __decorate([
37
+ (0, typeorm_1.Column)({ type: "datetime", default: () => "current_timestamp", onUpdate: "current_timestamp" }),
38
+ __metadata("design:type", Date)
39
+ ], PaMediaEntity.prototype, "modifiedTs", void 0);
40
+ __decorate([
41
+ (0, typeorm_1.Column)({ type: "blob" }),
42
+ __metadata("design:type", Buffer)
43
+ ], PaMediaEntity.prototype, "binaryFile", void 0);
44
+ __decorate([
45
+ (0, typeorm_1.Column)({ type: "text", nullable: true }),
46
+ __metadata("design:type", String)
47
+ ], PaMediaEntity.prototype, "attachedData", void 0);
48
+ __decorate([
49
+ (0, typeorm_1.Column)({ type: "varchar", nullable: true }),
50
+ __metadata("design:type", String)
51
+ ], PaMediaEntity.prototype, "originalName", void 0);
52
+ exports.PaMediaEntity = PaMediaEntity = __decorate([
53
+ (0, typeorm_1.Entity)("PaMedia")
54
+ ], PaMediaEntity);
55
+ //# sourceMappingURL=pa-media.model.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pa-media.model.js","sourceRoot":"","sources":["../../src/entities/pa-media.model.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,qCAAyC;AAGlC,IAAM,aAAa,GAAnB,MAAM,aAAa;IAExB,GAAG,CAAU;IAGb,SAAS,CAAU;IAGnB,OAAO,CAAU;IAGjB,UAAU,CAAQ;IAGlB,UAAU,CAAU;IAGpB,YAAY,CAAU;IAGtB,YAAY,CAAU;CACvB,CAAA;AArBY,sCAAa;AAExB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;;0CAC1C;AAGb;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;;gDACT;AAGnB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;;8CACX;AAGjB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,mBAAmB,EAAE,QAAQ,EAAE,mBAAmB,EAAE,CAAC;8BACnF,IAAI;iDAAC;AAGlB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;8BACZ,MAAM;iDAAC;AAGpB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;mDACnB;AAGtB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;mDACtB;wBApBX,aAAa;IADzB,IAAA,gBAAM,EAAC,SAAS,CAAC;GACL,aAAa,CAqBzB"}
@@ -0,0 +1,5 @@
1
+ import { Image, ImageWithBinary, Media, MediaWithBinary } from "../data-types";
2
+ export declare function formatMedia(row: any): Media;
3
+ export declare function formatImage(row: any): Image;
4
+ export declare function formatMediaWithBinary(row: any): MediaWithBinary;
5
+ export declare function formatImageWithBinary(row: any): ImageWithBinary;
@@ -0,0 +1,47 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.formatImageWithBinary = exports.formatMediaWithBinary = exports.formatImage = exports.formatMedia = void 0;
4
+ const data_formatters_lib_1 = require("@paroi/data-formatters-lib");
5
+ const sqlite_date_helper_1 = require("./sqlite-date-helper");
6
+ function formatMedia(row) {
7
+ return {
8
+ kind: "media",
9
+ ...formatMediaBase(row),
10
+ };
11
+ }
12
+ exports.formatMedia = formatMedia;
13
+ function formatImage(row) {
14
+ return {
15
+ kind: "image",
16
+ ...formatMediaBase(row),
17
+ height: (0, data_formatters_lib_1.nbVal)(row.height),
18
+ width: (0, data_formatters_lib_1.nbVal)(row.width),
19
+ lossless: (0, data_formatters_lib_1.boolValOrUndef)(row.lossless),
20
+ };
21
+ }
22
+ exports.formatImage = formatImage;
23
+ function formatMediaWithBinary(row) {
24
+ return {
25
+ ...formatMedia(row),
26
+ binaryFile: row.binaryFile,
27
+ };
28
+ }
29
+ exports.formatMediaWithBinary = formatMediaWithBinary;
30
+ function formatImageWithBinary(row) {
31
+ return {
32
+ ...formatImage(row),
33
+ binaryFile: row.binaryFile,
34
+ };
35
+ }
36
+ exports.formatImageWithBinary = formatImageWithBinary;
37
+ function formatMediaBase(row) {
38
+ return {
39
+ mediaType: (0, data_formatters_lib_1.strVal)(row.mediaType),
40
+ modifiedTs: (0, sqlite_date_helper_1.parseSqliteDateTime)(row.modifiedTs),
41
+ uid: (0, data_formatters_lib_1.strVal)(row.uid),
42
+ weightB: (0, data_formatters_lib_1.nbVal)(row.weightB),
43
+ attachedData: (0, data_formatters_lib_1.strValOrUndef)(row.attachedData),
44
+ originalName: (0, data_formatters_lib_1.strValOrUndef)(row.originalName),
45
+ };
46
+ }
47
+ //# sourceMappingURL=data-formatters.helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"data-formatters.helpers.js","sourceRoot":"","sources":["../../src/helpers/data-formatters.helpers.ts"],"names":[],"mappings":";;;AAAA,oEAA0F;AAE1F,6DAA2D;AAE3D,SAAgB,WAAW,CAAC,GAAQ;IAClC,OAAO;QACL,IAAI,EAAE,OAAO;QACb,GAAG,eAAe,CAAC,GAAG,CAAC;KACxB,CAAC;AACJ,CAAC;AALD,kCAKC;AAED,SAAgB,WAAW,CAAC,GAAQ;IAClC,OAAO;QACL,IAAI,EAAE,OAAO;QACb,GAAG,eAAe,CAAC,GAAG,CAAC;QACvB,MAAM,EAAE,IAAA,2BAAK,EAAC,GAAG,CAAC,MAAM,CAAC;QACzB,KAAK,EAAE,IAAA,2BAAK,EAAC,GAAG,CAAC,KAAK,CAAC;QACvB,QAAQ,EAAE,IAAA,oCAAc,EAAC,GAAG,CAAC,QAAQ,CAAC;KACvC,CAAC;AACJ,CAAC;AARD,kCAQC;AAED,SAAgB,qBAAqB,CAAC,GAAQ;IAC5C,OAAO;QACL,GAAG,WAAW,CAAC,GAAG,CAAC;QACnB,UAAU,EAAE,GAAG,CAAC,UAAU;KAC3B,CAAC;AACJ,CAAC;AALD,sDAKC;AAED,SAAgB,qBAAqB,CAAC,GAAQ;IAC5C,OAAO;QACL,GAAG,WAAW,CAAC,GAAG,CAAC;QACnB,UAAU,EAAE,GAAG,CAAC,UAAU;KAC3B,CAAC;AACJ,CAAC;AALD,sDAKC;AAED,SAAS,eAAe,CAAC,GAAQ;IAC/B,OAAO;QACL,SAAS,EAAE,IAAA,4BAAM,EAAC,GAAG,CAAC,SAAS,CAAC;QAChC,UAAU,EAAE,IAAA,wCAAmB,EAAC,GAAG,CAAC,UAAU,CAAC;QAC/C,GAAG,EAAE,IAAA,4BAAM,EAAC,GAAG,CAAC,GAAG,CAAC;QACpB,OAAO,EAAE,IAAA,2BAAK,EAAC,GAAG,CAAC,OAAO,CAAC;QAC3B,YAAY,EAAE,IAAA,mCAAa,EAAC,GAAG,CAAC,YAAY,CAAC;QAC7C,YAAY,EAAE,IAAA,mCAAa,EAAC,GAAG,CAAC,YAAY,CAAC;KAC9C,CAAC;AACJ,CAAC"}
@@ -0,0 +1 @@
1
+ export declare function parseSqliteDateTime(val: string): Date;
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.parseSqliteDateTime = void 0;
4
+ function parseSqliteDateTime(val) {
5
+ const gmtDt = `${val.substring(0, 10)}T${val.substring(11, 19)}Z`;
6
+ return new Date(gmtDt);
7
+ }
8
+ exports.parseSqliteDateTime = parseSqliteDateTime;
9
+ //# sourceMappingURL=sqlite-date-helper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sqlite-date-helper.js","sourceRoot":"","sources":["../../src/helpers/sqlite-date-helper.ts"],"names":[],"mappings":";;;AAAA,SAAgB,mBAAmB,CAAC,GAAW;IAC7C,MAAM,KAAK,GAAG,GAAG,GAAG,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,GAAG,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,CAAC;IAClE,OAAO,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC;AACzB,CAAC;AAHD,kDAGC"}
@@ -0,0 +1,3 @@
1
+ export * from "./data-types";
2
+ export * from "./media-storage";
3
+ export * from "./media-storage-types";
package/dist/index.js ADDED
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./data-types"), exports);
18
+ __exportStar(require("./media-storage"), exports);
19
+ __exportStar(require("./media-storage-types"), exports);
20
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,+CAA6B;AAC7B,kDAAgC;AAChC,wDAAsC"}
@@ -0,0 +1,20 @@
1
+ import { AppLog } from "@paroicms/server-lib";
2
+ import { DataSource, EntityManager, Repository } from "typeorm";
3
+ import { PaMediaHandleEntity } from "./entities/pa-media-handle.model";
4
+ import { PaMediaEntity } from "./entities/pa-media.model";
5
+ import { MediaStorageOptions } from "./media-storage";
6
+ export declare class MediaStorageContext {
7
+ #private;
8
+ status: "ready" | "destroyed";
9
+ siteName: string;
10
+ canCreate: boolean;
11
+ appLog: AppLog;
12
+ logNextQuery: (count?: number | undefined) => void;
13
+ asyncQueue: <T extends () => Promise<any>>(task: T) => ReturnType<T>;
14
+ constructor(options: MediaStorageOptions);
15
+ init(siteLeafId: string): Promise<void>;
16
+ dataSource(): DataSource;
17
+ dbManager(): EntityManager;
18
+ mediaRepository(): Repository<PaMediaEntity>;
19
+ mediaHandleRepository(): Repository<PaMediaHandleEntity>;
20
+ }
@@ -0,0 +1,63 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MediaStorageContext = void 0;
4
+ const async_lib_1 = require("@paroi/async-lib");
5
+ const db_init_1 = require("./db-init/db-init");
6
+ const pa_media_handle_model_1 = require("./entities/pa-media-handle.model");
7
+ const pa_media_model_1 = require("./entities/pa-media.model");
8
+ class MediaStorageContext {
9
+ status = "ready";
10
+ siteName;
11
+ canCreate;
12
+ appLog;
13
+ logNextQuery;
14
+ asyncQueue = (0, async_lib_1.createAsyncQueue)();
15
+ #dbFileStorage;
16
+ #dataSource;
17
+ #cn;
18
+ #mediaRepository;
19
+ #mediaHandleRepository;
20
+ constructor(options) {
21
+ this.siteName = options.siteName;
22
+ this.canCreate = options.canCreate;
23
+ this.appLog = options.appLog;
24
+ this.#dbFileStorage = options.storage.file;
25
+ this.logNextQuery = () => { };
26
+ }
27
+ async init(siteLeafId) {
28
+ const { mainCn, logNextQuery } = await (0, db_init_1.createOrOpenMainCn)({
29
+ sqliteFile: this.#dbFileStorage,
30
+ appLog: this.appLog,
31
+ siteName: this.siteName,
32
+ canCreate: this.canCreate,
33
+ }, siteLeafId);
34
+ this.logNextQuery = logNextQuery;
35
+ this.#dataSource = mainCn;
36
+ this.#cn = mainCn.manager;
37
+ await this.#cn.query("PRAGMA foreign_keys = 1");
38
+ this.#mediaRepository = this.#cn.getRepository(pa_media_model_1.PaMediaEntity);
39
+ this.#mediaHandleRepository = this.#cn.getRepository(pa_media_handle_model_1.PaMediaHandleEntity);
40
+ }
41
+ dataSource() {
42
+ if (!this.#dataSource)
43
+ throw new Error("Should be initialized");
44
+ return this.#dataSource;
45
+ }
46
+ dbManager() {
47
+ if (!this.#cn)
48
+ throw new Error("Should be initialized");
49
+ return this.#cn;
50
+ }
51
+ mediaRepository() {
52
+ if (!this.#mediaRepository)
53
+ throw new Error("Should be initialized");
54
+ return this.#mediaRepository;
55
+ }
56
+ mediaHandleRepository() {
57
+ if (!this.#mediaHandleRepository)
58
+ throw new Error("Should be initialized");
59
+ return this.#mediaHandleRepository;
60
+ }
61
+ }
62
+ exports.MediaStorageContext = MediaStorageContext;
63
+ //# sourceMappingURL=media-storage-context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"media-storage-context.js","sourceRoot":"","sources":["../src/media-storage-context.ts"],"names":[],"mappings":";;;AAAA,gDAAoD;AAGpD,+CAAuD;AACvD,4EAAuE;AACvE,8DAA0D;AAG1D,MAAa,mBAAmB;IAC9B,MAAM,GAA0B,OAAO,CAAC;IACxC,QAAQ,CAAS;IACjB,SAAS,CAAU;IACnB,MAAM,CAAS;IACf,YAAY,CAAuC;IACnD,UAAU,GAAG,IAAA,4BAAgB,GAAE,CAAC;IAChC,cAAc,CAAS;IAEvB,WAAW,CAAc;IACzB,GAAG,CAAiB;IACpB,gBAAgB,CAA6B;IAC7C,sBAAsB,CAAmC;IAEzD,YAAY,OAA4B;QACtC,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;QACjC,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC;QACnC,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;QAC7B,IAAI,CAAC,cAAc,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC;QAC3C,IAAI,CAAC,YAAY,GAAG,GAAG,EAAE,GAAE,CAAC,CAAC;IAC/B,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,UAAkB;QAC3B,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,IAAA,4BAAkB,EACvD;YACE,UAAU,EAAE,IAAI,CAAC,cAAc;YAC/B,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,SAAS,EAAE,IAAI,CAAC,SAAS;SAC1B,EACD,UAAU,CACX,CAAC;QACF,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC;QACjC,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC;QAC1B,IAAI,CAAC,GAAG,GAAG,MAAM,CAAC,OAAO,CAAC;QAC1B,MAAM,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,yBAAyB,CAAC,CAAC;QAChD,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC,8BAAa,CAAC,CAAC;QAC9D,IAAI,CAAC,sBAAsB,GAAG,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC,2CAAmB,CAAC,CAAC;IAC5E,CAAC;IAED,UAAU;QACR,IAAI,CAAC,IAAI,CAAC,WAAW;YAAE,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;QAChE,OAAO,IAAI,CAAC,WAAW,CAAC;IAC1B,CAAC;IAED,SAAS;QACP,IAAI,CAAC,IAAI,CAAC,GAAG;YAAE,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;QACxD,OAAO,IAAI,CAAC,GAAG,CAAC;IAClB,CAAC;IAED,eAAe;QACb,IAAI,CAAC,IAAI,CAAC,gBAAgB;YAAE,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;QACrE,OAAO,IAAI,CAAC,gBAAgB,CAAC;IAC/B,CAAC;IAED,qBAAqB;QACnB,IAAI,CAAC,IAAI,CAAC,sBAAsB;YAAE,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;QAC3E,OAAO,IAAI,CAAC,sBAAsB,CAAC;IACrC,CAAC;CACF;AA3DD,kDA2DC"}
@@ -0,0 +1,23 @@
1
+ /// <reference types="node" />
2
+ export interface ReorderMediasInput {
3
+ handle: string;
4
+ mediaUids: string[];
5
+ }
6
+ export interface NewMediaPayload {
7
+ mediaType: string;
8
+ weightB: number;
9
+ binaryFile: Buffer;
10
+ attachedData?: string;
11
+ originalName?: string;
12
+ image?: ImageProperties;
13
+ }
14
+ export interface ImageProperties {
15
+ width: number;
16
+ height: number;
17
+ lossless?: boolean;
18
+ }
19
+ export interface NewMediaWithHandle extends NewMediaPayload {
20
+ handle: string;
21
+ replace?: boolean;
22
+ leafId: string;
23
+ }
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=media-storage-types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"media-storage-types.js","sourceRoot":"","sources":["../src/media-storage-types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,75 @@
1
+ import { AppLog } from "@paroicms/server-lib";
2
+ import { Image, ImageWithBinary, Media, MediaWithBinary } from "./data-types";
3
+ import { NewMediaWithHandle, ReorderMediasInput } from "./media-storage-types";
4
+ export interface MediaStorageOptions {
5
+ siteName: string;
6
+ canCreate: boolean;
7
+ storage: MediaStorageConf;
8
+ appLog: AppLog;
9
+ }
10
+ export interface MediaStorageConf {
11
+ type: "sqlite";
12
+ file: string;
13
+ }
14
+ export declare class MediaStorage {
15
+ #private;
16
+ constructor(options: MediaStorageOptions);
17
+ initialise(siteLeafId: string): Promise<void>;
18
+ addMedia(payload: NewMediaWithHandle): Promise<Media | Image>;
19
+ getFirstImageUid(options: {
20
+ handle: string;
21
+ }): Promise<string | undefined>;
22
+ getMedias(options: {
23
+ handle: string;
24
+ }): Promise<(Media | Image)[]>;
25
+ getMedias(options: {
26
+ handles: string[];
27
+ }): Promise<Map<string, Image | Media>>;
28
+ getMedia(options: {
29
+ handle: string;
30
+ } | {
31
+ uid: string;
32
+ }): Promise<Media | Image | undefined>;
33
+ getMediaWithBinary(uid: string): Promise<MediaWithBinary | ImageWithBinary | undefined>;
34
+ /**
35
+ * Deletes the handle, then deletes the orphan medias.
36
+ * @returns a list of deleted media uid
37
+ */
38
+ deleteMedia(options: {
39
+ handle: string;
40
+ }): Promise<string[]>;
41
+ /**
42
+ * Delete the media if it is attached only to the `handle`. Remove the handle from the media
43
+ * otherwise.
44
+ * @returns a list of deleted media uid
45
+ */
46
+ deleteMedia(options: {
47
+ uid: string;
48
+ handle: string;
49
+ }): Promise<string[]>;
50
+ /**
51
+ * Deletes the handle, then deletes the orphan medias.
52
+ * @returns a list of deleted media uid
53
+ */
54
+ deleteMedias(options: {
55
+ handle: string;
56
+ }): Promise<string[]>;
57
+ /**
58
+ * Deletes the handles, then deletes the orphan medias.
59
+ * @returns a list of deleted media uid
60
+ */
61
+ deleteMedias(options: {
62
+ handles: string[];
63
+ }): Promise<string[]>;
64
+ updateAttachedData(options: {
65
+ mediaUid: string;
66
+ values: string;
67
+ }): Promise<void>;
68
+ reorderMedias(options: ReorderMediasInput): Promise<(Media | Image)[]>;
69
+ countMedias({ leafId, exceptHandle }: {
70
+ leafId: string;
71
+ exceptHandle?: string;
72
+ }): Promise<number>;
73
+ getAttachedDocumentsWeight(): Promise<number>;
74
+ close(): Promise<void>;
75
+ }
@@ -0,0 +1,92 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MediaStorage = void 0;
4
+ const media_storage_context_1 = require("./media-storage-context");
5
+ const media_queries_1 = require("./media.queries");
6
+ class MediaStorage {
7
+ #context;
8
+ constructor(options) {
9
+ this.#context = new media_storage_context_1.MediaStorageContext(options);
10
+ }
11
+ // TODO: remove this parameter after all the DB are migrated in version 3+
12
+ async initialise(siteLeafId) {
13
+ this.#checkStatus();
14
+ await this.#context.init(siteLeafId);
15
+ }
16
+ async addMedia(payload) {
17
+ this.#checkStatus();
18
+ const uid = await this.#context.asyncQueue(async () => {
19
+ return await (0, media_queries_1.addMedia)(this.#context, payload);
20
+ });
21
+ const media = await (0, media_queries_1.getMedia)(this.#context.dbManager(), uid);
22
+ if (!media)
23
+ throw new Error(`should have a media '${uid}'`);
24
+ return media;
25
+ }
26
+ async getFirstImageUid(options) {
27
+ this.#checkStatus();
28
+ return await (0, media_queries_1.getFirstImageUidForHandle)(this.#context.dbManager(), options.handle);
29
+ }
30
+ async getMedias(options) {
31
+ this.#checkStatus();
32
+ if ("handle" in options) {
33
+ return await (0, media_queries_1.getMediasByHandle)(this.#context.dbManager(), options.handle);
34
+ }
35
+ return await (0, media_queries_1.getMediasByHandles)(this.#context.dbManager(), options.handles);
36
+ }
37
+ async getMedia(options) {
38
+ this.#checkStatus();
39
+ if ("handle" in options) {
40
+ return await (0, media_queries_1.getMediaByHandle)(this.#context.dbManager(), options.handle);
41
+ }
42
+ return await (0, media_queries_1.getMedia)(this.#context.dbManager(), options.uid);
43
+ }
44
+ async getMediaWithBinary(uid) {
45
+ this.#checkStatus();
46
+ return await (0, media_queries_1.getMediaWithBinary)(this.#context.dbManager(), uid);
47
+ }
48
+ async deleteMedia(options) {
49
+ this.#checkStatus();
50
+ if ("uid" in options) {
51
+ return await (0, media_queries_1.deleteMediaWithHandle)(this.#context.dbManager(), options);
52
+ }
53
+ return await (0, media_queries_1.deleteHandle)(this.#context.dbManager(), options.handle);
54
+ }
55
+ async deleteMedias(options) {
56
+ this.#checkStatus();
57
+ if ("handle" in options) {
58
+ return await (0, media_queries_1.deleteHandle)(this.#context.dbManager(), options.handle);
59
+ }
60
+ return await (0, media_queries_1.deleteHandles)(this.#context.dbManager(), options.handles);
61
+ }
62
+ async updateAttachedData(options) {
63
+ this.#checkStatus();
64
+ await (0, media_queries_1.updateAttachedData)(this.#context.dbManager(), options);
65
+ }
66
+ async reorderMedias(options) {
67
+ this.#checkStatus();
68
+ await (0, media_queries_1.reorderMedias)(this.#context, options);
69
+ return await this.getMedias({ handle: options.handle });
70
+ }
71
+ async countMedias({ leafId, exceptHandle }) {
72
+ this.#checkStatus();
73
+ return await (0, media_queries_1.countMediasByLeafId)(this.#context.dbManager(), leafId, { exceptHandle });
74
+ }
75
+ async getAttachedDocumentsWeight() {
76
+ this.#checkStatus();
77
+ return await (0, media_queries_1.getAttachedDocumentsWeight)(this.#context.dbManager());
78
+ }
79
+ async close() {
80
+ if (this.#context.status === "destroyed")
81
+ return;
82
+ this.#context.status = "destroyed";
83
+ await this.#context.dataSource().destroy();
84
+ }
85
+ #checkStatus() {
86
+ if (this.#context.status !== "ready") {
87
+ throw new Error(`MediaStorage is ${this.#context.status}`);
88
+ }
89
+ }
90
+ }
91
+ exports.MediaStorage = MediaStorage;
92
+ //# sourceMappingURL=media-storage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"media-storage.js","sourceRoot":"","sources":["../src/media-storage.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ import { EntityManager } from "typeorm";
2
+ import { Image, ImageWithBinary, Media, MediaWithBinary } from "./data-types";
3
+ import { MediaStorageContext } from "./media-storage-context";
4
+ import { NewMediaWithHandle, ReorderMediasInput } from "./media-storage-types";
5
+ export declare function addMedia(ctx: MediaStorageContext, payload: NewMediaWithHandle): Promise<string>;
6
+ export declare function getFirstImageUidForHandle(cn: EntityManager, handle: string): Promise<string | undefined>;
7
+ export declare function getMediasByHandle(cn: EntityManager, handle: string): Promise<(Image | Media)[]>;
8
+ export declare function getMediasByHandles(cn: EntityManager, handles: string[]): Promise<Map<string, Image | Media>>;
9
+ export declare function getMedia(cn: EntityManager, uid: string): Promise<Media | Image | undefined>;
10
+ export declare function countMediasByLeafId(cn: EntityManager, leafId: string, options?: {
11
+ exceptHandle?: string;
12
+ }): Promise<number>;
13
+ export declare function getAttachedDocumentsWeight(cn: EntityManager): Promise<number>;
14
+ export declare function getMediaByHandle(cn: EntityManager, handle: string): Promise<Media | Image | undefined>;
15
+ export declare function getMediaWithBinary(cn: EntityManager, uid: string): Promise<MediaWithBinary | ImageWithBinary | undefined>;
16
+ /**
17
+ * @returns the deleted media uid
18
+ */
19
+ export declare function deleteHandle(cn: EntityManager, handle: string): Promise<string[]>;
20
+ /**
21
+ * @returns the deleted media uids
22
+ */
23
+ export declare function deleteHandles(cn: EntityManager, handles: string[]): Promise<string[]>;
24
+ export declare function deleteMediaWithHandle(cn: EntityManager, { handle, uid }: {
25
+ handle: string;
26
+ uid: string;
27
+ }): Promise<string[]>;
28
+ export declare function updateAttachedData(cn: EntityManager, { mediaUid, values }: {
29
+ mediaUid: string;
30
+ values: string;
31
+ }): Promise<void>;
32
+ export declare function reorderMedias(ctx: MediaStorageContext, { mediaUids: uids, handle }: ReorderMediasInput): Promise<void>;
@@ -0,0 +1,250 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.reorderMedias = exports.updateAttachedData = exports.deleteMediaWithHandle = exports.deleteHandles = exports.deleteHandle = exports.getMediaWithBinary = exports.getMediaByHandle = exports.getAttachedDocumentsWeight = exports.countMediasByLeafId = exports.getMedia = exports.getMediasByHandles = exports.getMediasByHandle = exports.getFirstImageUidForHandle = exports.addMedia = void 0;
4
+ const data_formatters_lib_1 = require("@paroi/data-formatters-lib");
5
+ const anywhere_lib_1 = require("@paroicms/anywhere-lib");
6
+ const crypto_1 = require("crypto");
7
+ const pa_image_model_1 = require("./entities/pa-image.model");
8
+ const pa_media_handle_model_1 = require("./entities/pa-media-handle.model");
9
+ const pa_media_model_1 = require("./entities/pa-media.model");
10
+ const data_formatters_helpers_1 = require("./helpers/data-formatters.helpers");
11
+ async function addMedia(ctx, payload) {
12
+ const uid = (0, crypto_1.randomUUID)();
13
+ await ctx.dataSource().transaction(async (cn) => {
14
+ if (payload.replace)
15
+ await deleteHandle(cn, payload.handle);
16
+ await cn.getRepository(pa_media_model_1.PaMediaEntity).save({
17
+ uid,
18
+ binaryFile: payload.binaryFile,
19
+ originalName: payload.originalName,
20
+ attachedData: payload.attachedData,
21
+ mediaType: payload.mediaType,
22
+ weightB: payload.weightB,
23
+ });
24
+ if (payload.image) {
25
+ await cn.getRepository(pa_image_model_1.PaImageEntity).save({ ...payload.image, uid });
26
+ }
27
+ const maxNum = payload.replace ? await getMaxOrderNum(cn, payload.handle) : undefined;
28
+ await cn.getRepository(pa_media_handle_model_1.PaMediaHandleEntity).save({
29
+ mediaUid: uid,
30
+ handle: payload.handle,
31
+ orderNum: maxNum === undefined ? 1 : maxNum + 1,
32
+ leafId: payload.leafId,
33
+ });
34
+ });
35
+ return uid;
36
+ }
37
+ exports.addMedia = addMedia;
38
+ async function getMaxOrderNum(cn, handle) {
39
+ const row = await cn
40
+ .createQueryBuilder()
41
+ .select("max(h.orderNum)", "maxNum")
42
+ .from("PaMediaHandle", "h")
43
+ .where("h.handle = :handle", { handle })
44
+ .getRawOne();
45
+ return (0, data_formatters_lib_1.nbValOrUndef)(row?.maxNum);
46
+ }
47
+ async function getFirstImageUidForHandle(cn, handle) {
48
+ const row = await cn
49
+ .createQueryBuilder()
50
+ .addSelect("i.uid", "uid")
51
+ .from("PaMedia", "m")
52
+ .innerJoin("PaImage", "i", "i.uid = m.uid")
53
+ .innerJoin("PaMediaHandle", "h", "h.mediaUid = m.uid")
54
+ .where("h.handle = :handle", { handle })
55
+ .orderBy("h.orderNum", "ASC")
56
+ .addOrderBy("m.modifiedTs", "ASC")
57
+ .limit(1)
58
+ .getRawOne();
59
+ if (!row)
60
+ return;
61
+ return (0, data_formatters_lib_1.strVal)(row.uid);
62
+ }
63
+ exports.getFirstImageUidForHandle = getFirstImageUidForHandle;
64
+ async function getMediasByHandle(cn, handle) {
65
+ const rows = await buildMediaQuery(cn)
66
+ .addSelect("h.orderNum", "orderNum")
67
+ .innerJoin("PaMediaHandle", "h", "h.mediaUid = m.uid")
68
+ .where("h.handle = :handle", { handle })
69
+ .orderBy("h.orderNum", "ASC")
70
+ .addOrderBy("m.modifiedTs", "ASC")
71
+ .getRawMany();
72
+ const withOrderNum = [];
73
+ const withoutNotOrderNum = [];
74
+ rows.forEach((row) => {
75
+ if (row.orderNum) {
76
+ withOrderNum.push(row);
77
+ }
78
+ else {
79
+ withoutNotOrderNum.push(row);
80
+ }
81
+ });
82
+ const reordered = [...withOrderNum, ...withoutNotOrderNum];
83
+ return reordered.map((row) => ((0, anywhere_lib_1.isDef)(row.width) ? (0, data_formatters_helpers_1.formatImage)(row) : (0, data_formatters_helpers_1.formatMedia)(row)));
84
+ }
85
+ exports.getMediasByHandle = getMediasByHandle;
86
+ async function getMediasByHandles(cn, handles) {
87
+ const rows = await buildMediaQuery(cn)
88
+ .addSelect("h.handle", "handle")
89
+ .innerJoin("PaMediaHandle", "h", "h.mediaUid = m.uid")
90
+ .where("h.handle in (:...handles)", { handles })
91
+ .getRawMany();
92
+ const map = new Map();
93
+ for (const row of rows) {
94
+ const handle = (0, data_formatters_lib_1.strVal)(row.handle);
95
+ map.set(handle, (0, anywhere_lib_1.isDef)(row.width) ? (0, data_formatters_helpers_1.formatImage)(row) : (0, data_formatters_helpers_1.formatMedia)(row));
96
+ }
97
+ return map;
98
+ }
99
+ exports.getMediasByHandles = getMediasByHandles;
100
+ async function getMedia(cn, uid) {
101
+ const row = await buildMediaQuery(cn).where("m.uid = :uid", { uid }).getRawOne();
102
+ if (!row)
103
+ return;
104
+ return (0, anywhere_lib_1.isDef)(row.width) ? (0, data_formatters_helpers_1.formatImage)(row) : (0, data_formatters_helpers_1.formatMedia)(row);
105
+ }
106
+ exports.getMedia = getMedia;
107
+ async function countMediasByLeafId(cn, leafId, options = {}) {
108
+ const query = cn
109
+ .createQueryBuilder()
110
+ .select("count(1)", "cnt")
111
+ .from("PaMediaHandle", "h")
112
+ .where("h.leafId = :leafId", { leafId });
113
+ if (options.exceptHandle) {
114
+ query.andWhere("h.handle <> :handle", { handle: options.exceptHandle });
115
+ }
116
+ const row = await query.getRawOne();
117
+ return (0, data_formatters_lib_1.nbVal)(row?.cnt);
118
+ }
119
+ exports.countMediasByLeafId = countMediasByLeafId;
120
+ async function getAttachedDocumentsWeight(cn) {
121
+ const result = await cn
122
+ .createQueryBuilder()
123
+ .select("sum(m.weightB)", "weightB")
124
+ .from("PaMedia", "m")
125
+ .where("m.mediaType = :mediaType", { mediaType: "application/pdf" })
126
+ .getRawOne();
127
+ return (0, data_formatters_lib_1.nbValOrUndef)(result?.weightB) ?? 0;
128
+ }
129
+ exports.getAttachedDocumentsWeight = getAttachedDocumentsWeight;
130
+ async function getMediaByHandle(cn, handle) {
131
+ const row = await buildMediaQuery(cn)
132
+ .innerJoin("PaMediaHandle", "h", "h.mediaUid = m.uid")
133
+ .where("h.handle = :handle", { handle })
134
+ .getRawOne();
135
+ if (!row)
136
+ return;
137
+ return (0, anywhere_lib_1.isDef)(row.width) ? (0, data_formatters_helpers_1.formatImage)(row) : (0, data_formatters_helpers_1.formatMedia)(row);
138
+ }
139
+ exports.getMediaByHandle = getMediaByHandle;
140
+ async function getMediaWithBinary(cn, uid) {
141
+ const row = await buildMediaQuery(cn)
142
+ .addSelect("m.binaryFile", "binaryFile")
143
+ .where("m.uid = :uid", { uid })
144
+ .getRawOne();
145
+ if (!row)
146
+ return;
147
+ return (0, anywhere_lib_1.isDef)(row.width) ? (0, data_formatters_helpers_1.formatImageWithBinary)(row) : (0, data_formatters_helpers_1.formatMediaWithBinary)(row);
148
+ }
149
+ exports.getMediaWithBinary = getMediaWithBinary;
150
+ /**
151
+ * @returns the deleted media uid
152
+ */
153
+ async function deleteHandle(cn, handle) {
154
+ const res = await cn
155
+ .createQueryBuilder()
156
+ .delete()
157
+ .from("PaMediaHandle")
158
+ .where("handle = :handle", { handle })
159
+ .execute();
160
+ if (res.affected === 0)
161
+ return [];
162
+ return await deleteOrphanMedias(cn);
163
+ }
164
+ exports.deleteHandle = deleteHandle;
165
+ /**
166
+ * @returns the deleted media uids
167
+ */
168
+ async function deleteHandles(cn, handles) {
169
+ const res = await cn
170
+ .createQueryBuilder()
171
+ .delete()
172
+ .from("PaMediaHandle")
173
+ .where("handle in (:...handles)", { handles })
174
+ .execute();
175
+ if (res.affected === 0)
176
+ return [];
177
+ return await deleteOrphanMedias(cn);
178
+ }
179
+ exports.deleteHandles = deleteHandles;
180
+ async function deleteMediaWithHandle(cn, { handle, uid }) {
181
+ await cn
182
+ .createQueryBuilder()
183
+ .delete()
184
+ .from("PaMediaHandle")
185
+ .where("mediaUid = :uid", { uid })
186
+ .andWhere("handle = :handle", { handle })
187
+ .execute();
188
+ return await deleteOrphanMedias(cn);
189
+ }
190
+ exports.deleteMediaWithHandle = deleteMediaWithHandle;
191
+ async function deleteOrphanMedias(cn) {
192
+ const rows = await cn
193
+ .createQueryBuilder()
194
+ .select("m.uid", "uid")
195
+ .from("PaMedia", "m")
196
+ .where(`not exists (
197
+ select 1
198
+ from PaMediaHandle h
199
+ where h.mediaUid = m.uid
200
+ )`)
201
+ .getRawMany();
202
+ const uids = rows.map((row) => (0, data_formatters_lib_1.strVal)(row.uid));
203
+ await cn
204
+ .createQueryBuilder()
205
+ .delete()
206
+ .from("PaMedia")
207
+ .where("uid in (:...uids)", { uids })
208
+ .execute();
209
+ return uids;
210
+ }
211
+ async function updateAttachedData(cn, { mediaUid, values }) {
212
+ await cn.getRepository(pa_media_model_1.PaMediaEntity).update({ uid: mediaUid }, { attachedData: values });
213
+ }
214
+ exports.updateAttachedData = updateAttachedData;
215
+ async function reorderMedias(ctx, { mediaUids: uids, handle }) {
216
+ const medias = await getMediasByHandle(ctx.dbManager(), handle);
217
+ const orderMedias = [];
218
+ let orderNum = 1;
219
+ for (const uid of uids) {
220
+ const media = medias.find((item) => item.uid === uid);
221
+ if (!media) {
222
+ ctx.appLog.warn(`[reorder medias] skip missing media '${uid}' ('${handle}')`);
223
+ continue;
224
+ }
225
+ orderMedias.push({
226
+ mediaUid: uid,
227
+ handle,
228
+ orderNum,
229
+ });
230
+ ++orderNum;
231
+ }
232
+ await ctx.mediaHandleRepository().save(orderMedias);
233
+ }
234
+ exports.reorderMedias = reorderMedias;
235
+ function buildMediaQuery(cn) {
236
+ return cn
237
+ .createQueryBuilder()
238
+ .select("m.mediaType", "mediaType")
239
+ .addSelect("m.modifiedTs", "modifiedTs")
240
+ .addSelect("m.uid", "uid")
241
+ .addSelect("m.weightB", "weightB")
242
+ .addSelect("m.attachedData", "attachedData")
243
+ .addSelect("m.originalName", "originalName")
244
+ .addSelect("i.height", "height")
245
+ .addSelect("i.width", "width")
246
+ .addSelect("i.lossless", "lossless")
247
+ .from("PaMedia", "m")
248
+ .leftJoin("PaImage", "i", "i.uid = m.uid");
249
+ }
250
+ //# sourceMappingURL=media.queries.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"media.queries.js","sourceRoot":"","sources":["../src/media.queries.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,42 @@
1
+ {
2
+ "name": "@paroicms/server-database-media-storage",
3
+ "version": "0.34.0",
4
+ "description": "A library to make back-end for media galleries.",
5
+ "keywords": [
6
+ "media",
7
+ "image",
8
+ "gallery",
9
+ "server",
10
+ "storage"
11
+ ],
12
+ "author": "Paroi Team",
13
+ "license": "MIT",
14
+ "type": "commonjs",
15
+ "main": "dist/index.js",
16
+ "types": "dist/index.d.ts",
17
+ "scripts": {
18
+ "build": "tsc",
19
+ "clear": "rimraf dist/*",
20
+ "dev": "tsc --watch --preserveWatchOutput",
21
+ "eslint": "eslint ."
22
+ },
23
+ "devDependencies": {
24
+ "@types/node": "~20.10.5",
25
+ "rimraf": "~5.0.5",
26
+ "typescript": "~5.3.3"
27
+ },
28
+ "dependencies": {
29
+ "@paroi/async-lib": "~0.1.2",
30
+ "@paroi/data-formatters-lib": "~0.1.2",
31
+ "@paroicms/anywhere-lib": "0.53.0",
32
+ "@paroicms/server-lib": "0.14.0",
33
+ "reflect-metadata": "~0.1.13"
34
+ },
35
+ "peerDependencies": {
36
+ "typeorm": "0.3"
37
+ },
38
+ "files": [
39
+ "ddl",
40
+ "dist"
41
+ ]
42
+ }