clhq-dynamodb-module 1.1.0-alpha.90
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.
- package/dist/app.module.d.ts +2 -0
- package/dist/app.module.js +88 -0
- package/dist/common/enums/index.d.ts +1 -0
- package/dist/common/enums/index.js +17 -0
- package/dist/common/enums/project-enums.d.ts +13 -0
- package/dist/common/enums/project-enums.js +18 -0
- package/dist/common/user.controller.d.ts +12 -0
- package/dist/common/user.controller.js +102 -0
- package/dist/dbservice/dynamodb-base.service.d.ts +23 -0
- package/dist/dbservice/dynamodb-base.service.js +105 -0
- package/dist/dbservice/index.d.ts +4 -0
- package/dist/dbservice/index.js +20 -0
- package/dist/dbservice/projects.service.d.ts +5 -0
- package/dist/dbservice/projects.service.js +25 -0
- package/dist/dbservice/users.service.d.ts +5 -0
- package/dist/dbservice/users.service.js +25 -0
- package/dist/dbservice/workspaces.service.d.ts +5 -0
- package/dist/dbservice/workspaces.service.js +25 -0
- package/dist/entities/ai-usage.entity.d.ts +16 -0
- package/dist/entities/ai-usage.entity.js +71 -0
- package/dist/entities/asset.entity.d.ts +59 -0
- package/dist/entities/asset.entity.js +185 -0
- package/dist/entities/auth.entity.d.ts +10 -0
- package/dist/entities/auth.entity.js +9 -0
- package/dist/entities/clip-effect.entity.d.ts +9 -0
- package/dist/entities/clip-effect.entity.js +53 -0
- package/dist/entities/clip.entity.d.ts +44 -0
- package/dist/entities/clip.entity.js +114 -0
- package/dist/entities/comment.entity.d.ts +18 -0
- package/dist/entities/comment.entity.js +83 -0
- package/dist/entities/common.entity.d.ts +21 -0
- package/dist/entities/common.entity.js +27 -0
- package/dist/entities/credit-transaction.entity.d.ts +15 -0
- package/dist/entities/credit-transaction.entity.js +66 -0
- package/dist/entities/editor-project.entity.d.ts +48 -0
- package/dist/entities/editor-project.entity.js +226 -0
- package/dist/entities/effect.entity.d.ts +22 -0
- package/dist/entities/effect.entity.js +87 -0
- package/dist/entities/index.d.ts +28 -0
- package/dist/entities/index.js +44 -0
- package/dist/entities/invite.entity.d.ts +17 -0
- package/dist/entities/invite.entity.js +73 -0
- package/dist/entities/keyframe.entity.d.ts +18 -0
- package/dist/entities/keyframe.entity.js +73 -0
- package/dist/entities/payment-transaction.entity.d.ts +40 -0
- package/dist/entities/payment-transaction.entity.js +138 -0
- package/dist/entities/payment.entity.d.ts +24 -0
- package/dist/entities/payment.entity.js +89 -0
- package/dist/entities/plan.entity.d.ts +13 -0
- package/dist/entities/plan.entity.js +77 -0
- package/dist/entities/project-version.entity.d.ts +11 -0
- package/dist/entities/project-version.entity.js +66 -0
- package/dist/entities/project.entity.d.ts +48 -0
- package/dist/entities/project.entity.js +175 -0
- package/dist/entities/reward-rule.entity.d.ts +15 -0
- package/dist/entities/reward-rule.entity.js +67 -0
- package/dist/entities/stripe-webhook-event.entity.d.ts +9 -0
- package/dist/entities/stripe-webhook-event.entity.js +54 -0
- package/dist/entities/subscription-plan.entity.d.ts +37 -0
- package/dist/entities/subscription-plan.entity.js +197 -0
- package/dist/entities/subscription-usage.entity.d.ts +15 -0
- package/dist/entities/subscription-usage.entity.js +83 -0
- package/dist/entities/timeline.entity.d.ts +8 -0
- package/dist/entities/timeline.entity.js +48 -0
- package/dist/entities/track.entity.d.ts +20 -0
- package/dist/entities/track.entity.js +81 -0
- package/dist/entities/user-onboarding-response.entity.d.ts +8 -0
- package/dist/entities/user-onboarding-response.entity.js +48 -0
- package/dist/entities/user-profile.entity.d.ts +51 -0
- package/dist/entities/user-profile.entity.js +200 -0
- package/dist/entities/user-subscription.entity.d.ts +44 -0
- package/dist/entities/user-subscription.entity.js +160 -0
- package/dist/entities/user.entity.d.ts +32 -0
- package/dist/entities/user.entity.js +133 -0
- package/dist/entities/workspace-member.entity.d.ts +8 -0
- package/dist/entities/workspace-member.entity.js +49 -0
- package/dist/entities/workspace.entity.d.ts +9 -0
- package/dist/entities/workspace.entity.js +54 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.js +22 -0
- package/dist/main.d.ts +1 -0
- package/dist/main.js +10 -0
- package/dist/repositories/asset.repository.d.ts +15 -0
- package/dist/repositories/asset.repository.js +101 -0
- package/dist/repositories/base.repository.d.ts +31 -0
- package/dist/repositories/base.repository.js +172 -0
- package/dist/repositories/clip-effect.repository.d.ts +9 -0
- package/dist/repositories/clip-effect.repository.js +49 -0
- package/dist/repositories/clip.repository.d.ts +13 -0
- package/dist/repositories/clip.repository.js +101 -0
- package/dist/repositories/comment.repository.d.ts +12 -0
- package/dist/repositories/comment.repository.js +92 -0
- package/dist/repositories/editor-project.repository.d.ts +26 -0
- package/dist/repositories/editor-project.repository.js +107 -0
- package/dist/repositories/effect.repository.d.ts +10 -0
- package/dist/repositories/effect.repository.js +59 -0
- package/dist/repositories/index.d.ts +21 -0
- package/dist/repositories/index.js +37 -0
- package/dist/repositories/keyframe.repository.d.ts +9 -0
- package/dist/repositories/keyframe.repository.js +49 -0
- package/dist/repositories/payment-transaction.repository.d.ts +13 -0
- package/dist/repositories/payment-transaction.repository.js +123 -0
- package/dist/repositories/project-version.repository.d.ts +9 -0
- package/dist/repositories/project-version.repository.js +51 -0
- package/dist/repositories/project.repository.d.ts +17 -0
- package/dist/repositories/project.repository.js +132 -0
- package/dist/repositories/reward-rule.repository.d.ts +13 -0
- package/dist/repositories/reward-rule.repository.js +84 -0
- package/dist/repositories/subscription-plan.repository.d.ts +11 -0
- package/dist/repositories/subscription-plan.repository.js +49 -0
- package/dist/repositories/subscription-usage.repository.d.ts +12 -0
- package/dist/repositories/subscription-usage.repository.js +68 -0
- package/dist/repositories/timeline.repository.d.ts +9 -0
- package/dist/repositories/timeline.repository.js +53 -0
- package/dist/repositories/track.repository.d.ts +13 -0
- package/dist/repositories/track.repository.js +61 -0
- package/dist/repositories/user-onboarding-response.repository.d.ts +11 -0
- package/dist/repositories/user-onboarding-response.repository.js +58 -0
- package/dist/repositories/user-profile.repository.d.ts +18 -0
- package/dist/repositories/user-profile.repository.js +62 -0
- package/dist/repositories/user-subscription.repository.d.ts +13 -0
- package/dist/repositories/user-subscription.repository.js +52 -0
- package/dist/repositories/user.repository.d.ts +20 -0
- package/dist/repositories/user.repository.js +94 -0
- package/dist/repositories/workspace-member.repository.d.ts +10 -0
- package/dist/repositories/workspace-member.repository.js +37 -0
- package/dist/repositories/workspace.repository.d.ts +10 -0
- package/dist/repositories/workspace.repository.js +45 -0
- package/package.json +63 -0
- package/readme.entity.implementation.md +1560 -0
|
@@ -0,0 +1,61 @@
|
|
|
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
|
+
var TrackRepository_1;
|
|
12
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
13
|
+
exports.TrackRepository = void 0;
|
|
14
|
+
const common_1 = require("@nestjs/common");
|
|
15
|
+
const client_dynamodb_1 = require("@aws-sdk/client-dynamodb");
|
|
16
|
+
const base_repository_1 = require("./base.repository");
|
|
17
|
+
let TrackRepository = TrackRepository_1 = class TrackRepository extends base_repository_1.BaseRepository {
|
|
18
|
+
logger = new common_1.Logger(TrackRepository_1.name);
|
|
19
|
+
constructor(dynamoDbClient) {
|
|
20
|
+
super(dynamoDbClient, `track-${process.env.STAGE}`);
|
|
21
|
+
}
|
|
22
|
+
async findByTimelineId(timelineId) {
|
|
23
|
+
const result = await this.dynamoDb.query({
|
|
24
|
+
TableName: this.tableName,
|
|
25
|
+
IndexName: 'timelineId-orderIndex-index',
|
|
26
|
+
KeyConditionExpression: 'timelineId = :timelineId',
|
|
27
|
+
ExpressionAttributeValues: {
|
|
28
|
+
':timelineId': timelineId,
|
|
29
|
+
},
|
|
30
|
+
});
|
|
31
|
+
return result.Items || [];
|
|
32
|
+
}
|
|
33
|
+
async findByTrackType(timelineId, trackType) {
|
|
34
|
+
const result = await this.dynamoDb.query({
|
|
35
|
+
TableName: this.tableName,
|
|
36
|
+
IndexName: 'timelineId-trackType-index',
|
|
37
|
+
KeyConditionExpression: 'timelineId = :timelineId AND trackType = :trackType',
|
|
38
|
+
ExpressionAttributeValues: {
|
|
39
|
+
':timelineId': timelineId,
|
|
40
|
+
':trackType': trackType,
|
|
41
|
+
},
|
|
42
|
+
});
|
|
43
|
+
return result.Items || [];
|
|
44
|
+
}
|
|
45
|
+
async reorderTracks(timelineId, trackOrders) {
|
|
46
|
+
const updatePromises = trackOrders.map(({ id, orderIndex }) => this.dynamoDb.update({
|
|
47
|
+
TableName: this.tableName,
|
|
48
|
+
Key: { id },
|
|
49
|
+
UpdateExpression: 'SET orderIndex = :orderIndex',
|
|
50
|
+
ExpressionAttributeValues: {
|
|
51
|
+
':orderIndex': orderIndex,
|
|
52
|
+
},
|
|
53
|
+
}));
|
|
54
|
+
await Promise.all(updatePromises);
|
|
55
|
+
}
|
|
56
|
+
};
|
|
57
|
+
exports.TrackRepository = TrackRepository;
|
|
58
|
+
exports.TrackRepository = TrackRepository = TrackRepository_1 = __decorate([
|
|
59
|
+
(0, common_1.Injectable)(),
|
|
60
|
+
__metadata("design:paramtypes", [client_dynamodb_1.DynamoDB])
|
|
61
|
+
], TrackRepository);
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { DynamoDB } from '@aws-sdk/client-dynamodb';
|
|
2
|
+
import { BaseRepository } from './base.repository';
|
|
3
|
+
import { UserOnboardingResponse } from '../entities/user-onboarding-response.entity';
|
|
4
|
+
export declare class UserOnboardingResponseRepository extends BaseRepository<UserOnboardingResponse> {
|
|
5
|
+
private readonly logger;
|
|
6
|
+
constructor(dynamoDbClient: DynamoDB);
|
|
7
|
+
findByUserId(userId: string): Promise<UserOnboardingResponse[]>;
|
|
8
|
+
findByUserAndQuestion(userId: string, questionKey: string): Promise<UserOnboardingResponse | undefined>;
|
|
9
|
+
findByQuestionKey(questionKey: string): Promise<UserOnboardingResponse[]>;
|
|
10
|
+
upsertResponse(userId: string, questionKey: string, responseValue: string): Promise<UserOnboardingResponse>;
|
|
11
|
+
}
|
|
@@ -0,0 +1,58 @@
|
|
|
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
|
+
var UserOnboardingResponseRepository_1;
|
|
12
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
13
|
+
exports.UserOnboardingResponseRepository = void 0;
|
|
14
|
+
const common_1 = require("@nestjs/common");
|
|
15
|
+
const client_dynamodb_1 = require("@aws-sdk/client-dynamodb");
|
|
16
|
+
const base_repository_1 = require("./base.repository");
|
|
17
|
+
let UserOnboardingResponseRepository = UserOnboardingResponseRepository_1 = class UserOnboardingResponseRepository extends base_repository_1.BaseRepository {
|
|
18
|
+
logger = new common_1.Logger(UserOnboardingResponseRepository_1.name);
|
|
19
|
+
constructor(dynamoDbClient) {
|
|
20
|
+
super(dynamoDbClient, `user-onboarding-response-${process.env.STAGE}`);
|
|
21
|
+
}
|
|
22
|
+
async findByUserId(userId) {
|
|
23
|
+
return this.find({ userId });
|
|
24
|
+
}
|
|
25
|
+
async findByUserAndQuestion(userId, questionKey) {
|
|
26
|
+
const result = await this.find({ userId, questionKey });
|
|
27
|
+
return result[0];
|
|
28
|
+
}
|
|
29
|
+
async findByQuestionKey(questionKey) {
|
|
30
|
+
return this.find({ questionKey });
|
|
31
|
+
}
|
|
32
|
+
async upsertResponse(userId, questionKey, responseValue) {
|
|
33
|
+
const existing = await this.findByUserAndQuestion(userId, questionKey);
|
|
34
|
+
if (existing) {
|
|
35
|
+
const updated = await this.update(existing.id, {
|
|
36
|
+
responseValue,
|
|
37
|
+
updatedAt: new Date().toISOString(),
|
|
38
|
+
});
|
|
39
|
+
return updated;
|
|
40
|
+
}
|
|
41
|
+
else {
|
|
42
|
+
const newResponse = {
|
|
43
|
+
id: `${userId}-${questionKey}`,
|
|
44
|
+
userId,
|
|
45
|
+
questionKey,
|
|
46
|
+
responseValue,
|
|
47
|
+
createdAt: new Date().toISOString(),
|
|
48
|
+
updatedAt: new Date().toISOString(),
|
|
49
|
+
};
|
|
50
|
+
return await this.create(newResponse);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
};
|
|
54
|
+
exports.UserOnboardingResponseRepository = UserOnboardingResponseRepository;
|
|
55
|
+
exports.UserOnboardingResponseRepository = UserOnboardingResponseRepository = UserOnboardingResponseRepository_1 = __decorate([
|
|
56
|
+
(0, common_1.Injectable)(),
|
|
57
|
+
__metadata("design:paramtypes", [client_dynamodb_1.DynamoDB])
|
|
58
|
+
], UserOnboardingResponseRepository);
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { DynamoDB } from '@aws-sdk/client-dynamodb';
|
|
2
|
+
import { BaseRepository } from './base.repository';
|
|
3
|
+
import { UserProfile, NotificationPreferences, ExportPreferences, WorkspacePreferences } from '../entities/user-profile.entity';
|
|
4
|
+
export declare class UserProfileRepository extends BaseRepository<UserProfile> {
|
|
5
|
+
private readonly logger;
|
|
6
|
+
constructor(dynamoDbClient: DynamoDB);
|
|
7
|
+
findByUserId(userId: string): Promise<UserProfile | undefined>;
|
|
8
|
+
findByDisplayName(displayName: string): Promise<UserProfile[]>;
|
|
9
|
+
findByCompany(company: string): Promise<UserProfile[]>;
|
|
10
|
+
findByCountry(country: string): Promise<UserProfile[]>;
|
|
11
|
+
findProfilesNearingStorageLimit(threshold?: number): Promise<UserProfile[]>;
|
|
12
|
+
updateStorageUsed(userId: string, storageUsed: number): Promise<UserProfile>;
|
|
13
|
+
updateStorageLimit(userId: string, storageLimit: number): Promise<UserProfile>;
|
|
14
|
+
updateNotificationPreferences(userId: string, preferences: NotificationPreferences): Promise<UserProfile>;
|
|
15
|
+
updateExportPreferences(userId: string, preferences: ExportPreferences): Promise<UserProfile>;
|
|
16
|
+
updateWorkspacePreferences(userId: string, preferences: WorkspacePreferences): Promise<UserProfile>;
|
|
17
|
+
updateAvatar(userId: string, avatarUrl: string): Promise<UserProfile>;
|
|
18
|
+
}
|
|
@@ -0,0 +1,62 @@
|
|
|
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
|
+
var UserProfileRepository_1;
|
|
12
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
13
|
+
exports.UserProfileRepository = void 0;
|
|
14
|
+
const common_1 = require("@nestjs/common");
|
|
15
|
+
const client_dynamodb_1 = require("@aws-sdk/client-dynamodb");
|
|
16
|
+
const base_repository_1 = require("./base.repository");
|
|
17
|
+
let UserProfileRepository = UserProfileRepository_1 = class UserProfileRepository extends base_repository_1.BaseRepository {
|
|
18
|
+
logger = new common_1.Logger(UserProfileRepository_1.name);
|
|
19
|
+
constructor(dynamoDbClient) {
|
|
20
|
+
super(dynamoDbClient, `user-profile-${process.env.STAGE}`);
|
|
21
|
+
}
|
|
22
|
+
async findByUserId(userId) {
|
|
23
|
+
const results = await this.find({ userId });
|
|
24
|
+
return results[0];
|
|
25
|
+
}
|
|
26
|
+
async findByDisplayName(displayName) {
|
|
27
|
+
return this.find({ displayName });
|
|
28
|
+
}
|
|
29
|
+
async findByCompany(company) {
|
|
30
|
+
return this.find({ company });
|
|
31
|
+
}
|
|
32
|
+
async findByCountry(country) {
|
|
33
|
+
return this.find({ country });
|
|
34
|
+
}
|
|
35
|
+
async findProfilesNearingStorageLimit(threshold = 0.9) {
|
|
36
|
+
const results = await this.findAll();
|
|
37
|
+
return results.filter((profile) => profile.storageUsed / profile.storageLimit >= threshold);
|
|
38
|
+
}
|
|
39
|
+
async updateStorageUsed(userId, storageUsed) {
|
|
40
|
+
return this.update(userId, { storageUsed });
|
|
41
|
+
}
|
|
42
|
+
async updateStorageLimit(userId, storageLimit) {
|
|
43
|
+
return this.update(userId, { storageLimit });
|
|
44
|
+
}
|
|
45
|
+
async updateNotificationPreferences(userId, preferences) {
|
|
46
|
+
return this.update(userId, { notificationPreferences: preferences });
|
|
47
|
+
}
|
|
48
|
+
async updateExportPreferences(userId, preferences) {
|
|
49
|
+
return this.update(userId, { exportPreferences: preferences });
|
|
50
|
+
}
|
|
51
|
+
async updateWorkspacePreferences(userId, preferences) {
|
|
52
|
+
return this.update(userId, { workspacePreferences: preferences });
|
|
53
|
+
}
|
|
54
|
+
async updateAvatar(userId, avatarUrl) {
|
|
55
|
+
return this.update(userId, { avatarUrl });
|
|
56
|
+
}
|
|
57
|
+
};
|
|
58
|
+
exports.UserProfileRepository = UserProfileRepository;
|
|
59
|
+
exports.UserProfileRepository = UserProfileRepository = UserProfileRepository_1 = __decorate([
|
|
60
|
+
(0, common_1.Injectable)(),
|
|
61
|
+
__metadata("design:paramtypes", [client_dynamodb_1.DynamoDB])
|
|
62
|
+
], UserProfileRepository);
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { DynamoDB } from '@aws-sdk/client-dynamodb';
|
|
2
|
+
import { BaseRepository } from './base.repository';
|
|
3
|
+
import { UserSubscription, SubscriptionStatus } from '../entities/user-subscription.entity';
|
|
4
|
+
export declare class UserSubscriptionRepository extends BaseRepository<UserSubscription> {
|
|
5
|
+
private readonly logger;
|
|
6
|
+
constructor(dynamoDbClient: DynamoDB);
|
|
7
|
+
findByUserId(userId: string): Promise<UserSubscription | undefined>;
|
|
8
|
+
findByStripeSubscriptionId(stripeSubscriptionId: string): Promise<UserSubscription | undefined>;
|
|
9
|
+
findByPlanId(planId: string): Promise<UserSubscription[]>;
|
|
10
|
+
findByStatus(status: SubscriptionStatus): Promise<UserSubscription[]>;
|
|
11
|
+
findExpiringSubscriptions(beforeDate: string): Promise<UserSubscription[]>;
|
|
12
|
+
findTrialEndingSoon(beforeDate: string): Promise<UserSubscription[]>;
|
|
13
|
+
}
|
|
@@ -0,0 +1,52 @@
|
|
|
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
|
+
var UserSubscriptionRepository_1;
|
|
12
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
13
|
+
exports.UserSubscriptionRepository = void 0;
|
|
14
|
+
const common_1 = require("@nestjs/common");
|
|
15
|
+
const client_dynamodb_1 = require("@aws-sdk/client-dynamodb");
|
|
16
|
+
const base_repository_1 = require("./base.repository");
|
|
17
|
+
const user_subscription_entity_1 = require("../entities/user-subscription.entity");
|
|
18
|
+
let UserSubscriptionRepository = UserSubscriptionRepository_1 = class UserSubscriptionRepository extends base_repository_1.BaseRepository {
|
|
19
|
+
logger = new common_1.Logger(UserSubscriptionRepository_1.name);
|
|
20
|
+
constructor(dynamoDbClient) {
|
|
21
|
+
super(dynamoDbClient, `user-subscription-${process.env.STAGE}`);
|
|
22
|
+
}
|
|
23
|
+
async findByUserId(userId) {
|
|
24
|
+
const result = await this.find({ userId });
|
|
25
|
+
return result[0];
|
|
26
|
+
}
|
|
27
|
+
async findByStripeSubscriptionId(stripeSubscriptionId) {
|
|
28
|
+
const result = await this.find({ stripeSubscriptionId });
|
|
29
|
+
return result[0];
|
|
30
|
+
}
|
|
31
|
+
async findByPlanId(planId) {
|
|
32
|
+
return this.find({ planId });
|
|
33
|
+
}
|
|
34
|
+
async findByStatus(status) {
|
|
35
|
+
return this.find({ status });
|
|
36
|
+
}
|
|
37
|
+
async findExpiringSubscriptions(beforeDate) {
|
|
38
|
+
const items = await this.findAll();
|
|
39
|
+
return items.filter((sub) => sub.currentPeriodEnd <= beforeDate &&
|
|
40
|
+
sub.status === user_subscription_entity_1.SubscriptionStatus.ACTIVE);
|
|
41
|
+
}
|
|
42
|
+
async findTrialEndingSoon(beforeDate) {
|
|
43
|
+
const items = await this.findAll();
|
|
44
|
+
return items.filter((sub) => sub.trialEndsAt <= beforeDate &&
|
|
45
|
+
sub.status === user_subscription_entity_1.SubscriptionStatus.TRIAL);
|
|
46
|
+
}
|
|
47
|
+
};
|
|
48
|
+
exports.UserSubscriptionRepository = UserSubscriptionRepository;
|
|
49
|
+
exports.UserSubscriptionRepository = UserSubscriptionRepository = UserSubscriptionRepository_1 = __decorate([
|
|
50
|
+
(0, common_1.Injectable)(),
|
|
51
|
+
__metadata("design:paramtypes", [client_dynamodb_1.DynamoDB])
|
|
52
|
+
], UserSubscriptionRepository);
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { DynamoDB } from '@aws-sdk/client-dynamodb';
|
|
2
|
+
import { BaseRepository } from './base.repository';
|
|
3
|
+
import { User, UserStatus, UserRole } from '../entities/user.entity';
|
|
4
|
+
export declare class UserRepository extends BaseRepository<User> {
|
|
5
|
+
private readonly logger;
|
|
6
|
+
constructor(dynamoDbClient: DynamoDB);
|
|
7
|
+
findById(id: string): Promise<User | undefined>;
|
|
8
|
+
findByEmail(email: string): Promise<User | undefined>;
|
|
9
|
+
findByUsername(username: string): Promise<User | undefined>;
|
|
10
|
+
findByStripeCustomerId(stripeCustomerId: string): Promise<User | undefined>;
|
|
11
|
+
findByRole(role: UserRole): Promise<User[]>;
|
|
12
|
+
findByStatus(status: UserStatus): Promise<User[]>;
|
|
13
|
+
findActiveUsers(): Promise<User[]>;
|
|
14
|
+
findByCreatedAtRange(startDate: string, endDate: string): Promise<User[]>;
|
|
15
|
+
findRecentlyActive(sinceDate: string): Promise<User[]>;
|
|
16
|
+
updateLastLogin(userId: string): Promise<User>;
|
|
17
|
+
verifyEmail(userId: string): Promise<User>;
|
|
18
|
+
softDelete(userId: string): Promise<User>;
|
|
19
|
+
updatePassword(userId: string, passwordHash: string): Promise<User>;
|
|
20
|
+
}
|
|
@@ -0,0 +1,94 @@
|
|
|
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
|
+
var UserRepository_1;
|
|
12
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
13
|
+
exports.UserRepository = void 0;
|
|
14
|
+
const common_1 = require("@nestjs/common");
|
|
15
|
+
const client_dynamodb_1 = require("@aws-sdk/client-dynamodb");
|
|
16
|
+
const base_repository_1 = require("./base.repository");
|
|
17
|
+
const user_entity_1 = require("../entities/user.entity");
|
|
18
|
+
let UserRepository = UserRepository_1 = class UserRepository extends base_repository_1.BaseRepository {
|
|
19
|
+
logger = new common_1.Logger(UserRepository_1.name);
|
|
20
|
+
constructor(dynamoDbClient) {
|
|
21
|
+
super(dynamoDbClient, `users-${process.env.STAGE}`);
|
|
22
|
+
}
|
|
23
|
+
async findById(id) {
|
|
24
|
+
this.logger.debug(`UserRepository -> Finding user by ID: ${id}`);
|
|
25
|
+
const user = await super.findById(id);
|
|
26
|
+
if (user && !user.workspaceId) {
|
|
27
|
+
user.workspaceId = `default-workspace-${user.id}`;
|
|
28
|
+
}
|
|
29
|
+
return user;
|
|
30
|
+
}
|
|
31
|
+
async findByEmail(email) {
|
|
32
|
+
const results = await this.find({ email });
|
|
33
|
+
const user = results[0];
|
|
34
|
+
if (user && !user.workspaceId) {
|
|
35
|
+
user.workspaceId = `default-workspace-${user.id}`;
|
|
36
|
+
}
|
|
37
|
+
return user;
|
|
38
|
+
}
|
|
39
|
+
async findByUsername(username) {
|
|
40
|
+
if (!username)
|
|
41
|
+
return undefined;
|
|
42
|
+
const results = await this.find({ username });
|
|
43
|
+
return results[0];
|
|
44
|
+
}
|
|
45
|
+
async findByStripeCustomerId(stripeCustomerId) {
|
|
46
|
+
if (!stripeCustomerId)
|
|
47
|
+
return undefined;
|
|
48
|
+
const results = await this.find({ stripeCustomerId });
|
|
49
|
+
return results[0];
|
|
50
|
+
}
|
|
51
|
+
async findByRole(role) {
|
|
52
|
+
return this.find({ role });
|
|
53
|
+
}
|
|
54
|
+
async findByStatus(status) {
|
|
55
|
+
return this.find({ status });
|
|
56
|
+
}
|
|
57
|
+
async findActiveUsers() {
|
|
58
|
+
return this.find({ isActive: true, status: user_entity_1.UserStatus.ACTIVE });
|
|
59
|
+
}
|
|
60
|
+
async findByCreatedAtRange(startDate, endDate) {
|
|
61
|
+
const results = await this.findAll();
|
|
62
|
+
return results.filter((user) => user.createdAt >= startDate && user.createdAt <= endDate);
|
|
63
|
+
}
|
|
64
|
+
async findRecentlyActive(sinceDate) {
|
|
65
|
+
const results = await this.find({ status: user_entity_1.UserStatus.ACTIVE });
|
|
66
|
+
return results.filter((user) => user.lastLoginAt && user.lastLoginAt >= sinceDate);
|
|
67
|
+
}
|
|
68
|
+
async updateLastLogin(userId) {
|
|
69
|
+
return this.update(userId, { lastLoginAt: new Date().toISOString() });
|
|
70
|
+
}
|
|
71
|
+
async verifyEmail(userId) {
|
|
72
|
+
const now = new Date().toISOString();
|
|
73
|
+
return this.update(userId, {
|
|
74
|
+
emailVerified: true,
|
|
75
|
+
emailVerifiedAt: now,
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
async softDelete(userId) {
|
|
79
|
+
const now = new Date().toISOString();
|
|
80
|
+
return this.update(userId, {
|
|
81
|
+
status: user_entity_1.UserStatus.DELETED,
|
|
82
|
+
deletedAt: now,
|
|
83
|
+
isActive: false,
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
async updatePassword(userId, passwordHash) {
|
|
87
|
+
return this.update(userId, { passwordHash });
|
|
88
|
+
}
|
|
89
|
+
};
|
|
90
|
+
exports.UserRepository = UserRepository;
|
|
91
|
+
exports.UserRepository = UserRepository = UserRepository_1 = __decorate([
|
|
92
|
+
(0, common_1.Injectable)(),
|
|
93
|
+
__metadata("design:paramtypes", [client_dynamodb_1.DynamoDB])
|
|
94
|
+
], UserRepository);
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { DynamoDB } from '@aws-sdk/client-dynamodb';
|
|
2
|
+
import { BaseRepository } from './base.repository';
|
|
3
|
+
import { WorkspaceMember } from '../entities/workspace-member.entity';
|
|
4
|
+
export declare class WorkspaceMemberRepository extends BaseRepository<WorkspaceMember> {
|
|
5
|
+
private readonly logger;
|
|
6
|
+
constructor(dynamoDbClient: DynamoDB);
|
|
7
|
+
findByWorkspaceId(workspaceId: string): Promise<WorkspaceMember[]>;
|
|
8
|
+
findByUserId(userId: string): Promise<WorkspaceMember[]>;
|
|
9
|
+
findByWorkspaceAndUser(workspaceId: string, userId: string): Promise<WorkspaceMember | undefined>;
|
|
10
|
+
}
|
|
@@ -0,0 +1,37 @@
|
|
|
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
|
+
var WorkspaceMemberRepository_1;
|
|
12
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
13
|
+
exports.WorkspaceMemberRepository = void 0;
|
|
14
|
+
const common_1 = require("@nestjs/common");
|
|
15
|
+
const client_dynamodb_1 = require("@aws-sdk/client-dynamodb");
|
|
16
|
+
const base_repository_1 = require("./base.repository");
|
|
17
|
+
let WorkspaceMemberRepository = WorkspaceMemberRepository_1 = class WorkspaceMemberRepository extends base_repository_1.BaseRepository {
|
|
18
|
+
logger = new common_1.Logger(WorkspaceMemberRepository_1.name);
|
|
19
|
+
constructor(dynamoDbClient) {
|
|
20
|
+
super(dynamoDbClient, `workspace-members-${process.env.STAGE}`);
|
|
21
|
+
}
|
|
22
|
+
async findByWorkspaceId(workspaceId) {
|
|
23
|
+
return this.find({ workspaceId });
|
|
24
|
+
}
|
|
25
|
+
async findByUserId(userId) {
|
|
26
|
+
return this.find({ userId });
|
|
27
|
+
}
|
|
28
|
+
async findByWorkspaceAndUser(workspaceId, userId) {
|
|
29
|
+
const results = await this.find({ workspaceId, userId });
|
|
30
|
+
return results[0];
|
|
31
|
+
}
|
|
32
|
+
};
|
|
33
|
+
exports.WorkspaceMemberRepository = WorkspaceMemberRepository;
|
|
34
|
+
exports.WorkspaceMemberRepository = WorkspaceMemberRepository = WorkspaceMemberRepository_1 = __decorate([
|
|
35
|
+
(0, common_1.Injectable)(),
|
|
36
|
+
__metadata("design:paramtypes", [client_dynamodb_1.DynamoDB])
|
|
37
|
+
], WorkspaceMemberRepository);
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { DynamoDB } from '@aws-sdk/client-dynamodb';
|
|
2
|
+
import { BaseRepository } from './base.repository';
|
|
3
|
+
import { Workspace } from '../entities/workspace.entity';
|
|
4
|
+
export declare class WorkspaceRepository extends BaseRepository<Workspace> {
|
|
5
|
+
private readonly logger;
|
|
6
|
+
constructor(dynamoDbClient: DynamoDB);
|
|
7
|
+
findByOwnerId(ownerId: string): Promise<Workspace[]>;
|
|
8
|
+
findSharedWorkspaces(): Promise<Workspace[]>;
|
|
9
|
+
findByNameContains(searchTerm: string, ownerId?: string): Promise<Workspace[]>;
|
|
10
|
+
}
|
|
@@ -0,0 +1,45 @@
|
|
|
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
|
+
var WorkspaceRepository_1;
|
|
12
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
13
|
+
exports.WorkspaceRepository = void 0;
|
|
14
|
+
const common_1 = require("@nestjs/common");
|
|
15
|
+
const client_dynamodb_1 = require("@aws-sdk/client-dynamodb");
|
|
16
|
+
const base_repository_1 = require("./base.repository");
|
|
17
|
+
let WorkspaceRepository = WorkspaceRepository_1 = class WorkspaceRepository extends base_repository_1.BaseRepository {
|
|
18
|
+
logger = new common_1.Logger(WorkspaceRepository_1.name);
|
|
19
|
+
constructor(dynamoDbClient) {
|
|
20
|
+
super(dynamoDbClient, `workspaces-${process.env.STAGE}`);
|
|
21
|
+
}
|
|
22
|
+
async findByOwnerId(ownerId) {
|
|
23
|
+
return this.find({ ownerId }, {
|
|
24
|
+
indexName: 'ownerId-index',
|
|
25
|
+
keyConditionExpression: 'ownerId = :ownerId',
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
async findSharedWorkspaces() {
|
|
29
|
+
return this.find({ isShared: true }, {
|
|
30
|
+
indexName: 'isShared-index',
|
|
31
|
+
keyConditionExpression: 'isShared = :shared',
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
async findByNameContains(searchTerm, ownerId) {
|
|
35
|
+
const conditions = ownerId ? { ownerId } : {};
|
|
36
|
+
return this.find(conditions, {
|
|
37
|
+
keyConditionExpression: ownerId ? 'ownerId = :ownerId' : undefined,
|
|
38
|
+
}).then(items => items.filter(w => w.name?.toLowerCase().includes(searchTerm.toLowerCase())));
|
|
39
|
+
}
|
|
40
|
+
};
|
|
41
|
+
exports.WorkspaceRepository = WorkspaceRepository;
|
|
42
|
+
exports.WorkspaceRepository = WorkspaceRepository = WorkspaceRepository_1 = __decorate([
|
|
43
|
+
(0, common_1.Injectable)(),
|
|
44
|
+
__metadata("design:paramtypes", [client_dynamodb_1.DynamoDB])
|
|
45
|
+
], WorkspaceRepository);
|
package/package.json
ADDED
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "clhq-dynamodb-module",
|
|
3
|
+
"version": "1.1.0-alpha.90",
|
|
4
|
+
"description": "Reusable DynamoDB service package for the monorepo",
|
|
5
|
+
"main": "dist/index.js",
|
|
6
|
+
"types": "dist/index.d.ts",
|
|
7
|
+
"files": [
|
|
8
|
+
"dist"
|
|
9
|
+
],
|
|
10
|
+
"repository": {
|
|
11
|
+
"type": "git",
|
|
12
|
+
"url": "https://github.com/reacthub-pricematch/clhq-api-monorepo"
|
|
13
|
+
},
|
|
14
|
+
"registry": "https://registry.npmjs.org/",
|
|
15
|
+
"publishConfig": {
|
|
16
|
+
"registry": "https://registry.npmjs.org/",
|
|
17
|
+
"access": "public"
|
|
18
|
+
},
|
|
19
|
+
"bugs": {
|
|
20
|
+
"url": "https://github.com/reacthub-pricematch/clhq-api-monorepo/issues"
|
|
21
|
+
},
|
|
22
|
+
"license": "MIT",
|
|
23
|
+
"scripts": {
|
|
24
|
+
"build": "yarn exec tsc -p tsconfig.json",
|
|
25
|
+
"start": "nest start",
|
|
26
|
+
"start:dev": "env-cmd -f ../../.env.dev nest start --watch",
|
|
27
|
+
"start:debug": "nest start --debug --watch",
|
|
28
|
+
"start:prod": "env-cmd -f ../../.env.dev node dist/main",
|
|
29
|
+
"start:local": "env-cmd -f .env nest start --watch",
|
|
30
|
+
"test": "jest",
|
|
31
|
+
"version:upgrade:alpha": "standard-version --prerelease alpha",
|
|
32
|
+
"release": "npm publish --tag alpha",
|
|
33
|
+
"release:alpha": "npm publish --tag alpha",
|
|
34
|
+
"release:prealpha": "",
|
|
35
|
+
"format": "prettier --write \"src/**/*.ts\"",
|
|
36
|
+
"lint": "eslint \"{src,apps,libs,test}/**/*.ts\" --fix",
|
|
37
|
+
"clean:build": "rimraf .build",
|
|
38
|
+
"clean:dist": "rimraf dist",
|
|
39
|
+
"clean:webpack": "rimraf .webpack",
|
|
40
|
+
"clean:serverless": "rimraf .serverless",
|
|
41
|
+
"clean:all": "npm run clean:build&& npm run clean:dist&& npm run clean:webpack&& npm run clean:serverless",
|
|
42
|
+
"sls:deploy": "sls deploy",
|
|
43
|
+
"sls:deploy:dev": "env-cmd -f ../../.env.dev sls deploy --stage dev",
|
|
44
|
+
"sls:remove:dev": "env-cmd -f ../../.env.dev sls remove --stage dev",
|
|
45
|
+
"sls:offline": "sls offline",
|
|
46
|
+
"sls:package": "sls package",
|
|
47
|
+
"sls:package2": "npm run clean:all&& npm run sls:package",
|
|
48
|
+
"sls:remove": "sls remove"
|
|
49
|
+
},
|
|
50
|
+
"devDependencies": {
|
|
51
|
+
"@aws-sdk/client-dynamodb": "3.128.0",
|
|
52
|
+
"@aws-sdk/lib-dynamodb": "3.128.0",
|
|
53
|
+
"@aws-sdk/lib-storage": "3.128.0",
|
|
54
|
+
"@nestjs/common": "^11.1.5",
|
|
55
|
+
"@nestjs/config": "^4",
|
|
56
|
+
"@nestjs/core": "^11.1.5",
|
|
57
|
+
"@nestjs/platform-express": "^11.1.5",
|
|
58
|
+
"class-transformer": "0.5.1",
|
|
59
|
+
"class-validator": "0.14.2",
|
|
60
|
+
"serverless": "^4",
|
|
61
|
+
"standard-version": "^9.5.0"
|
|
62
|
+
}
|
|
63
|
+
}
|