@recursyve/nestjs-unique-codes-sequelize 8.0.0-beta.1

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.
@@ -0,0 +1 @@
1
+ export * from "./sequelize.adapter";
@@ -0,0 +1,4 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const tslib_1 = require("tslib");
4
+ tslib_1.__exportStar(require("./sequelize.adapter"), exports);
@@ -0,0 +1,5 @@
1
+ import { DynamicModule } from "@nestjs/common";
2
+ import { DatabaseAdapter } from "@recursyve/nestjs-unique-codes-core";
3
+ export declare class SequelizeAdapter extends DatabaseAdapter {
4
+ forRoot(): DynamicModule;
5
+ }
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SequelizeAdapter = void 0;
4
+ const nestjs_unique_codes_core_1 = require("@recursyve/nestjs-unique-codes-core");
5
+ const sequelize_platform_module_1 = require("../sequelize-platform.module");
6
+ class SequelizeAdapter extends nestjs_unique_codes_core_1.DatabaseAdapter {
7
+ forRoot() {
8
+ return {
9
+ module: sequelize_platform_module_1.SequelizePlatformModule,
10
+ imports: [
11
+ sequelize_platform_module_1.SequelizePlatformModule.forRoot()
12
+ ]
13
+ };
14
+ }
15
+ }
16
+ exports.SequelizeAdapter = SequelizeAdapter;
package/index.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ export * from "./adapters";
2
+ export * from "./models";
3
+ export * from "./sequelize-platform.module";
package/index.js ADDED
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const tslib_1 = require("tslib");
4
+ tslib_1.__exportStar(require("./adapters"), exports);
5
+ tslib_1.__exportStar(require("./models"), exports);
6
+ tslib_1.__exportStar(require("./sequelize-platform.module"), exports);
@@ -0,0 +1 @@
1
+ export { SequelizeUniqueCodes } from "./unique-codes.model";
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SequelizeUniqueCodes = void 0;
4
+ var unique_codes_model_1 = require("./unique-codes.model");
5
+ Object.defineProperty(exports, "SequelizeUniqueCodes", { enumerable: true, get: function () { return unique_codes_model_1.SequelizeUniqueCodes; } });
@@ -0,0 +1,12 @@
1
+ import { UniqueCodes } from "@recursyve/nestjs-unique-codes-core";
2
+ import { Model } from "sequelize-typescript";
3
+ export declare class SequelizeUniqueCodes extends Model implements UniqueCodes {
4
+ id: number;
5
+ code: string;
6
+ metadata: Record<string, any>;
7
+ validAt: Date;
8
+ expiresAt: Date;
9
+ availableUsageCount: number;
10
+ usages: Record<string, any>[];
11
+ type: string;
12
+ }
@@ -0,0 +1,53 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SequelizeUniqueCodes = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const sequelize_typescript_1 = require("sequelize-typescript");
6
+ const uuid = require("uuid");
7
+ const sequelize_1 = require("sequelize");
8
+ let SequelizeUniqueCodes = class SequelizeUniqueCodes extends sequelize_typescript_1.Model {
9
+ };
10
+ tslib_1.__decorate([
11
+ sequelize_typescript_1.PrimaryKey,
12
+ sequelize_typescript_1.AutoIncrement,
13
+ sequelize_typescript_1.Column,
14
+ tslib_1.__metadata("design:type", Number)
15
+ ], SequelizeUniqueCodes.prototype, "id", void 0);
16
+ tslib_1.__decorate([
17
+ (0, sequelize_typescript_1.AllowNull)(false),
18
+ (0, sequelize_typescript_1.Default)(() => uuid.v4()),
19
+ sequelize_typescript_1.Column,
20
+ tslib_1.__metadata("design:type", String)
21
+ ], SequelizeUniqueCodes.prototype, "code", void 0);
22
+ tslib_1.__decorate([
23
+ (0, sequelize_typescript_1.Column)(sequelize_1.DataTypes.JSON),
24
+ tslib_1.__metadata("design:type", Object)
25
+ ], SequelizeUniqueCodes.prototype, "metadata", void 0);
26
+ tslib_1.__decorate([
27
+ sequelize_typescript_1.Column,
28
+ tslib_1.__metadata("design:type", Date)
29
+ ], SequelizeUniqueCodes.prototype, "validAt", void 0);
30
+ tslib_1.__decorate([
31
+ sequelize_typescript_1.Column,
32
+ tslib_1.__metadata("design:type", Date)
33
+ ], SequelizeUniqueCodes.prototype, "expiresAt", void 0);
34
+ tslib_1.__decorate([
35
+ (0, sequelize_typescript_1.Default)(1),
36
+ sequelize_typescript_1.Column,
37
+ tslib_1.__metadata("design:type", Number)
38
+ ], SequelizeUniqueCodes.prototype, "availableUsageCount", void 0);
39
+ tslib_1.__decorate([
40
+ (0, sequelize_typescript_1.Column)(sequelize_1.DataTypes.JSON),
41
+ tslib_1.__metadata("design:type", Array)
42
+ ], SequelizeUniqueCodes.prototype, "usages", void 0);
43
+ tslib_1.__decorate([
44
+ (0, sequelize_typescript_1.AllowNull)(false),
45
+ sequelize_typescript_1.Column,
46
+ tslib_1.__metadata("design:type", String)
47
+ ], SequelizeUniqueCodes.prototype, "type", void 0);
48
+ SequelizeUniqueCodes = tslib_1.__decorate([
49
+ (0, sequelize_typescript_1.Table)({
50
+ tableName: "unique_codes"
51
+ })
52
+ ], SequelizeUniqueCodes);
53
+ exports.SequelizeUniqueCodes = SequelizeUniqueCodes;
package/package.json ADDED
@@ -0,0 +1,25 @@
1
+ {
2
+ "name": "@recursyve/nestjs-unique-codes-sequelize",
3
+ "version": "8.0.0-beta.1",
4
+ "publishConfig": {
5
+ "access": "public"
6
+ },
7
+ "peerDependencies": {
8
+ "@nestjs/common": "^8.0.0",
9
+ "@nestjs/core": "^8.0.0",
10
+ "@nestjs/sequelize": "^8.0.0",
11
+ "@recursyve/nestjs-unique-codes-core": "^8.0.0-beta.0",
12
+ "date-fns": "^2.28.0",
13
+ "sequelize": "^6.6.0",
14
+ "sequelize-typescript": "^2.1.0"
15
+ },
16
+ "devDependencies": {
17
+ "@nestjs/common": "^8.0.5",
18
+ "@nestjs/core": "^8.0.5",
19
+ "sequelize": "^6.6.5",
20
+ "sequelize-typescript": "^2.1.0",
21
+ "tslint": "^6.1.2",
22
+ "typescript": "^4.3.5"
23
+ },
24
+ "gitHead": "9cef464495d8155c8dff97a6055da3253c899ddf"
25
+ }
@@ -0,0 +1,12 @@
1
+ import { Model } from "sequelize-typescript";
2
+ import { FindOptions, Identifier } from "sequelize";
3
+ declare class M extends Model {
4
+ }
5
+ export declare abstract class UniqueCodeDatabaseReadRepository<T extends Model> {
6
+ protected repository: typeof M;
7
+ protected constructor(repository: typeof M);
8
+ findByPk(identifier: Identifier, options?: FindOptions): Promise<T>;
9
+ findOne(options?: FindOptions): Promise<T>;
10
+ findAll(options?: FindOptions): Promise<T[]>;
11
+ }
12
+ export {};
@@ -0,0 +1,27 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.UniqueCodeDatabaseReadRepository = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const common_1 = require("@nestjs/common");
6
+ const sequelize_typescript_1 = require("sequelize-typescript");
7
+ class M extends sequelize_typescript_1.Model {
8
+ }
9
+ let UniqueCodeDatabaseReadRepository = class UniqueCodeDatabaseReadRepository {
10
+ constructor(repository) {
11
+ this.repository = repository;
12
+ }
13
+ findByPk(identifier, options) {
14
+ return this.repository.findByPk(identifier, options);
15
+ }
16
+ findOne(options) {
17
+ return this.repository.findOne(options);
18
+ }
19
+ findAll(options) {
20
+ return this.repository.findAll(options);
21
+ }
22
+ };
23
+ UniqueCodeDatabaseReadRepository = tslib_1.__decorate([
24
+ (0, common_1.Injectable)(),
25
+ tslib_1.__metadata("design:paramtypes", [Object])
26
+ ], UniqueCodeDatabaseReadRepository);
27
+ exports.UniqueCodeDatabaseReadRepository = UniqueCodeDatabaseReadRepository;
@@ -0,0 +1,11 @@
1
+ import { Model } from "sequelize-typescript";
2
+ import { UniqueCodeDatabaseReadRepository } from "./database-read.repository";
3
+ declare class M extends Model {
4
+ }
5
+ export declare abstract class UniqueCodeDatabaseRepository<T extends Model, CreateDto = Partial<T>, UpdateDto = Partial<T>> extends UniqueCodeDatabaseReadRepository<T> {
6
+ protected constructor(repository: typeof M);
7
+ create(dto: CreateDto | Partial<T>): Promise<T>;
8
+ update(id: number, dto: UpdateDto | Partial<T>): Promise<T>;
9
+ delete(id: number): Promise<void>;
10
+ }
11
+ export {};
@@ -0,0 +1,37 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.UniqueCodeDatabaseRepository = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const common_1 = require("@nestjs/common");
6
+ const sequelize_typescript_1 = require("sequelize-typescript");
7
+ const database_read_repository_1 = require("./database-read.repository");
8
+ class M extends sequelize_typescript_1.Model {
9
+ }
10
+ let UniqueCodeDatabaseRepository = class UniqueCodeDatabaseRepository extends database_read_repository_1.UniqueCodeDatabaseReadRepository {
11
+ constructor(repository) {
12
+ super(repository);
13
+ }
14
+ async create(dto) {
15
+ return await this.repository.create(dto);
16
+ }
17
+ async update(id, dto) {
18
+ const model = await this.findByPk(id);
19
+ if (!model) {
20
+ throw new common_1.HttpException(`Resource not found for id ${id}`, common_1.HttpStatus.NOT_FOUND);
21
+ }
22
+ await model.update(dto);
23
+ return model;
24
+ }
25
+ async delete(id) {
26
+ const model = await this.findByPk(id);
27
+ if (!model) {
28
+ throw new common_1.HttpException(`Resource not found for id ${id}`, common_1.HttpStatus.NOT_FOUND);
29
+ }
30
+ await model.destroy();
31
+ }
32
+ };
33
+ UniqueCodeDatabaseRepository = tslib_1.__decorate([
34
+ (0, common_1.Injectable)(),
35
+ tslib_1.__metadata("design:paramtypes", [Object])
36
+ ], UniqueCodeDatabaseRepository);
37
+ exports.UniqueCodeDatabaseRepository = UniqueCodeDatabaseRepository;
@@ -0,0 +1,4 @@
1
+ import { DynamicModule } from "@nestjs/common";
2
+ export declare class SequelizePlatformModule {
3
+ static forRoot(): DynamicModule;
4
+ }
@@ -0,0 +1,36 @@
1
+ "use strict";
2
+ var SequelizePlatformModule_1;
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.SequelizePlatformModule = void 0;
5
+ const tslib_1 = require("tslib");
6
+ const common_1 = require("@nestjs/common");
7
+ const sequelize_1 = require("@nestjs/sequelize");
8
+ const models_1 = require("./models");
9
+ const nestjs_unique_codes_core_1 = require("@recursyve/nestjs-unique-codes-core");
10
+ const unique_codes_service_1 = require("./services/unique-codes.service");
11
+ let SequelizePlatformModule = SequelizePlatformModule_1 = class SequelizePlatformModule {
12
+ static forRoot() {
13
+ return {
14
+ module: SequelizePlatformModule_1,
15
+ global: true,
16
+ imports: [
17
+ sequelize_1.SequelizeModule.forFeature([
18
+ models_1.SequelizeUniqueCodes
19
+ ])
20
+ ],
21
+ providers: [
22
+ {
23
+ provide: nestjs_unique_codes_core_1.UniqueCodesService,
24
+ useFactory: () => new unique_codes_service_1.SequelizeUniqueCodesService(models_1.SequelizeUniqueCodes)
25
+ },
26
+ ],
27
+ exports: [
28
+ nestjs_unique_codes_core_1.UniqueCodesService
29
+ ]
30
+ };
31
+ }
32
+ };
33
+ SequelizePlatformModule = SequelizePlatformModule_1 = tslib_1.__decorate([
34
+ (0, common_1.Module)({})
35
+ ], SequelizePlatformModule);
36
+ exports.SequelizePlatformModule = SequelizePlatformModule;
@@ -0,0 +1,13 @@
1
+ import { UniqueCodes, UniqueCodesService } from "@recursyve/nestjs-unique-codes-core";
2
+ import { SequelizeUniqueCodes } from "../models";
3
+ export declare class SequelizeUniqueCodesService extends UniqueCodesService {
4
+ private readonly repository;
5
+ constructor(repository: typeof SequelizeUniqueCodes);
6
+ create(uniqueCode: Partial<UniqueCodes>): Promise<UniqueCodes>;
7
+ getByCode(code: string): Promise<UniqueCodes>;
8
+ findByCode(code: string): Promise<UniqueCodes | null>;
9
+ getByCodeAndType(code: string, type: string): Promise<UniqueCodes>;
10
+ findByCodeAndType(code: string, type: string): Promise<UniqueCodes | null>;
11
+ validate(uniqueCode: string | UniqueCodes): Promise<boolean>;
12
+ use(id: number, metadata?: Record<string, any>): Promise<void>;
13
+ }
@@ -0,0 +1,86 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SequelizeUniqueCodesService = void 0;
4
+ const nestjs_unique_codes_core_1 = require("@recursyve/nestjs-unique-codes-core");
5
+ const common_1 = require("@nestjs/common");
6
+ const date_fns_1 = require("date-fns");
7
+ class SequelizeUniqueCodesService extends nestjs_unique_codes_core_1.UniqueCodesService {
8
+ constructor(repository) {
9
+ super();
10
+ this.repository = repository;
11
+ }
12
+ create(uniqueCode) {
13
+ return this.repository.create(uniqueCode);
14
+ }
15
+ async getByCode(code) {
16
+ const uniqueCode = await this.repository.findOne({
17
+ where: {
18
+ code
19
+ }
20
+ });
21
+ if (!uniqueCode)
22
+ throw new common_1.NotFoundException(`Unique code '${code}' not found`);
23
+ return uniqueCode;
24
+ }
25
+ findByCode(code) {
26
+ return this.repository.findOne({
27
+ where: {
28
+ code
29
+ }
30
+ });
31
+ }
32
+ async getByCodeAndType(code, type) {
33
+ const uniqueCode = await this.repository.findOne({
34
+ where: {
35
+ code,
36
+ type
37
+ }
38
+ });
39
+ if (!uniqueCode)
40
+ throw new common_1.NotFoundException(`Unique code '${code}' with type '${type}' not found`);
41
+ return uniqueCode;
42
+ }
43
+ findByCodeAndType(code, type) {
44
+ return this.repository.findOne({
45
+ where: {
46
+ code,
47
+ type
48
+ }
49
+ });
50
+ }
51
+ async validate(uniqueCode) {
52
+ var _a, _b;
53
+ if (typeof uniqueCode === "string") {
54
+ uniqueCode = await this.getByCode(uniqueCode);
55
+ }
56
+ if (uniqueCode.availableUsageCount <= 0) {
57
+ return false;
58
+ }
59
+ const now = Date.now();
60
+ return (0, date_fns_1.isWithinInterval)(now, {
61
+ start: (_a = uniqueCode.validAt) !== null && _a !== void 0 ? _a : now,
62
+ end: (_b = uniqueCode.expiresAt) !== null && _b !== void 0 ? _b : now
63
+ });
64
+ }
65
+ async use(id, metadata) {
66
+ var _a;
67
+ const uniqueCode = await this.repository.findByPk(id);
68
+ const isValid = await this.validate(uniqueCode);
69
+ if (!isValid) {
70
+ throw new common_1.BadRequestException(`Unique code ${uniqueCode.code} invalid`);
71
+ }
72
+ const usages = (_a = uniqueCode.usages) !== null && _a !== void 0 ? _a : [];
73
+ usages.push(Object.assign(Object.assign({}, metadata), { usedAt: new Date() }));
74
+ if (uniqueCode.availableUsageCount) {
75
+ await uniqueCode.decrement("availableUsageCount");
76
+ }
77
+ await this.repository.update({
78
+ usages
79
+ }, {
80
+ where: {
81
+ id
82
+ }
83
+ });
84
+ }
85
+ }
86
+ exports.SequelizeUniqueCodesService = SequelizeUniqueCodesService;
@@ -0,0 +1,32 @@
1
+ "use strict";
2
+ module.exports = {
3
+ createUniqueCodesTable: (queryInterface, Sequelize) => {
4
+ return queryInterface.createTable("unique_codes", {
5
+ id: {
6
+ type: Sequelize.INTEGER,
7
+ primaryKey: true,
8
+ autoIncrement: true,
9
+ allowNull: false
10
+ },
11
+ code: {
12
+ type: Sequelize.STRING,
13
+ allowNull: false
14
+ },
15
+ metadata: Sequelize.JSON,
16
+ valid_at: Sequelize.DATE,
17
+ expires_at: Sequelize.DATE,
18
+ available_usage_count: Sequelize.INTEGER,
19
+ usages: Sequelize.JSON,
20
+ type: {
21
+ type: Sequelize.STRING,
22
+ allowNull: false
23
+ },
24
+ created_at: Sequelize.DATE,
25
+ updated_at: Sequelize.DATE,
26
+ deleted_at: Sequelize.DATE
27
+ });
28
+ },
29
+ dropUniqueCodeTable: (queryInterface, Sequelize) => {
30
+ return queryInterface.dropTable("unique_codes");
31
+ }
32
+ };