briyah 1.0.6 → 1.0.8
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/README.md +32 -22
- package/dist/server/src/ai/LLM/anthropic.service.js +19 -15
- package/dist/server/src/ai/LLM/base-ai.service.js +5 -4
- package/dist/server/src/ai/LLM/deepseek.service.js +11 -13
- package/dist/server/src/ai/LLM/fal.service.js +20 -24
- package/dist/server/src/ai/LLM/googleai.service.js +13 -15
- package/dist/server/src/ai/LLM/grok.service.js +12 -14
- package/dist/server/src/ai/LLM/mock.service.js +9 -11
- package/dist/server/src/ai/LLM/openai.service.js +18 -20
- package/dist/server/src/ai/LLM/together.service.js +14 -13
- package/dist/server/src/ai/LLM/vertexai.service.js +12 -14
- package/dist/server/src/ai/agent-store.service.js +12 -11
- package/dist/server/src/ai/artifact.service.js +7 -6
- package/dist/server/src/ai/attached-file.service.js +8 -7
- package/dist/server/src/ai/model_prices.d.ts +1 -2
- package/dist/server/src/ai/model_prices.js +15 -14
- package/dist/server/src/ai/published-agents.service.js +6 -5
- package/dist/server/src/app/balance.service.js +7 -6
- package/dist/server/src/app/stripe.controller.js +12 -11
- package/dist/server/src/app/stripe.service.js +20 -19
- package/dist/server/src/app/transaction.service.js +6 -5
- package/dist/server/src/app/user-service-manager.js +6 -5
- package/dist/server/src/app.controller.js +95 -94
- package/dist/server/src/app.service.js +31 -30
- package/dist/server/src/auth/auth.controller.js +21 -20
- package/dist/server/src/auth/jwt-auth.guard.js +4 -3
- package/dist/server/src/auth/rate-limit.service.d.ts +0 -1
- package/dist/server/src/auth/rate-limit.service.js +6 -7
- package/dist/server/src/auth/twilio.service.js +4 -3
- package/dist/server/src/auth/users.service.js +6 -5
- package/dist/server/src/common/logger.d.ts +21 -0
- package/dist/server/src/common/logger.js +83 -0
- package/dist/server/src/config/configuration.service.js +1 -1
- package/dist/server/src/room/artifact-store.service.d.ts +0 -1
- package/dist/server/src/room/artifact-store.service.js +16 -17
- package/dist/server/src/room/published-rooms.service.js +5 -3
- package/dist/server/src/room/room-store.service.js +17 -16
- package/dist/server/src/room/room.js +14 -13
- package/dist/server/src/sdk/briyah-config.d.ts +7 -0
- package/dist/server/src/sdk/briyah-config.js +2 -0
- package/dist/server/src/sdk/briyah.js +14 -5
- package/dist/server/src/sdk/index.d.ts +2 -1
- package/dist/server/src/story/story-progress.service.js +2 -1
- package/dist/server/src/story/story-store.service.js +28 -27
- package/dist/server/src/story/story.service.js +113 -112
- package/docs/.nojekyll +1 -0
- package/docs/assets/hierarchy.js +1 -0
- package/docs/assets/highlight.css +106 -0
- package/docs/assets/icons.js +18 -0
- package/docs/assets/icons.svg +1 -0
- package/docs/assets/main.js +60 -0
- package/docs/assets/navigation.js +1 -0
- package/docs/assets/search.js +1 -0
- package/docs/assets/style.css +1633 -0
- package/docs/classes/Agent.html +87 -0
- package/docs/classes/Briyah.html +64 -0
- package/docs/classes/BriyahConfigService.html +12 -0
- package/docs/classes/Room.html +119 -0
- package/docs/enums/MessageAction.html +13 -0
- package/docs/hierarchy.html +1 -0
- package/docs/index.html +136 -0
- package/docs/interfaces/AgentInfo.html +17 -0
- package/docs/interfaces/AgentMessagesResponse.html +5 -0
- package/docs/interfaces/AppService.html +680 -0
- package/docs/interfaces/ArtifactMetadata.html +8 -0
- package/docs/interfaces/AttachDocumentResponse.html +3 -0
- package/docs/interfaces/BriyahConfigOptions.html +16 -0
- package/docs/interfaces/ChapterInfo.html +3 -0
- package/docs/interfaces/Character.html +7 -0
- package/docs/interfaces/CreateAgentResponse.html +2 -0
- package/docs/interfaces/CreateRoomResponse.html +3 -0
- package/docs/interfaces/CreateStoryResponse.html +2 -0
- package/docs/interfaces/FileList.html +2 -0
- package/docs/interfaces/LoggingOptions.html +9 -0
- package/docs/interfaces/Message.html +6 -0
- package/docs/interfaces/ModelInfo.html +5 -0
- package/docs/interfaces/PreparedPromptResponse.html +3 -0
- package/docs/interfaces/ProcessTextResponse.html +7 -0
- package/docs/interfaces/PromptFile.html +3 -0
- package/docs/interfaces/PromptFileContent.html +3 -0
- package/docs/interfaces/PromptFilesResponse.html +2 -0
- package/docs/interfaces/PromptFolder.html +3 -0
- package/docs/interfaces/PromptFoldersResponse.html +2 -0
- package/docs/interfaces/RoomDetails.html +9 -0
- package/docs/interfaces/RoomInfo.html +5 -0
- package/docs/interfaces/RoomMessagesResponse.html +3 -0
- package/docs/interfaces/StoryIdea.html +5 -0
- package/docs/interfaces/StoryInfo.html +21 -0
- package/docs/interfaces/StoryState.html +9 -0
- package/docs/modules.html +1 -0
- package/docs/types/PromptScope.html +1 -0
- package/package.json +6 -3
- package/data/common/config/story_ideas.txt +0 -6
|
@@ -48,6 +48,7 @@ const fs = __importStar(require("fs"));
|
|
|
48
48
|
const path = __importStar(require("path"));
|
|
49
49
|
const crypto_1 = require("crypto");
|
|
50
50
|
const configuration_service_1 = require("../config/configuration.service");
|
|
51
|
+
const logger_1 = require("../common/logger");
|
|
51
52
|
let AttachedFileService = class AttachedFileService {
|
|
52
53
|
configService;
|
|
53
54
|
attachedFilesDir;
|
|
@@ -64,7 +65,7 @@ let AttachedFileService = class AttachedFileService {
|
|
|
64
65
|
storeFile(ownerId, fileName, fileData, additionalMetadata = {}) {
|
|
65
66
|
const existingMetadata = this.getFileMetadataByName(ownerId, fileName);
|
|
66
67
|
if (existingMetadata) {
|
|
67
|
-
|
|
68
|
+
logger_1.logger.log(`File "${fileName}" already exists for owner ${ownerId}, returning existing fileId: ${existingMetadata.fileId}`);
|
|
68
69
|
if (Object.keys(additionalMetadata).length > 0) {
|
|
69
70
|
this.updateFileMetadata(ownerId, existingMetadata.fileId, additionalMetadata);
|
|
70
71
|
}
|
|
@@ -84,7 +85,7 @@ let AttachedFileService = class AttachedFileService {
|
|
|
84
85
|
metadataMap = JSON.parse(fs.readFileSync(metadataPath, 'utf8'));
|
|
85
86
|
}
|
|
86
87
|
catch (error) {
|
|
87
|
-
|
|
88
|
+
logger_1.logger.error('Error loading file metadata:', error);
|
|
88
89
|
}
|
|
89
90
|
}
|
|
90
91
|
const metadata = {
|
|
@@ -134,7 +135,7 @@ let AttachedFileService = class AttachedFileService {
|
|
|
134
135
|
return true;
|
|
135
136
|
}
|
|
136
137
|
catch (error) {
|
|
137
|
-
|
|
138
|
+
logger_1.logger.error('Error updating file metadata:', error);
|
|
138
139
|
return false;
|
|
139
140
|
}
|
|
140
141
|
}
|
|
@@ -148,7 +149,7 @@ let AttachedFileService = class AttachedFileService {
|
|
|
148
149
|
return metadataMap[fileId] || null;
|
|
149
150
|
}
|
|
150
151
|
catch (error) {
|
|
151
|
-
|
|
152
|
+
logger_1.logger.error('Error getting file metadata:', error);
|
|
152
153
|
return null;
|
|
153
154
|
}
|
|
154
155
|
}
|
|
@@ -166,7 +167,7 @@ let AttachedFileService = class AttachedFileService {
|
|
|
166
167
|
}
|
|
167
168
|
}
|
|
168
169
|
catch (error) {
|
|
169
|
-
|
|
170
|
+
logger_1.logger.error('Error getting file metadata by name:', error);
|
|
170
171
|
}
|
|
171
172
|
return null;
|
|
172
173
|
}
|
|
@@ -184,7 +185,7 @@ let AttachedFileService = class AttachedFileService {
|
|
|
184
185
|
return Object.values(metadataMap);
|
|
185
186
|
}
|
|
186
187
|
catch (error) {
|
|
187
|
-
|
|
188
|
+
logger_1.logger.error('Error listing file metadata:', error);
|
|
188
189
|
return [];
|
|
189
190
|
}
|
|
190
191
|
}
|
|
@@ -208,7 +209,7 @@ let AttachedFileService = class AttachedFileService {
|
|
|
208
209
|
}
|
|
209
210
|
}
|
|
210
211
|
catch (error) {
|
|
211
|
-
|
|
212
|
+
logger_1.logger.error('Error updating file metadata:', error);
|
|
212
213
|
}
|
|
213
214
|
}
|
|
214
215
|
return true;
|
|
@@ -1,2 +1 @@
|
|
|
1
|
-
declare
|
|
2
|
-
export default modelPrices;
|
|
1
|
+
export declare function getModelPrices(): any;
|
|
@@ -33,22 +33,23 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
33
33
|
};
|
|
34
34
|
})();
|
|
35
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.getModelPrices = getModelPrices;
|
|
36
37
|
const fs = __importStar(require("fs"));
|
|
37
38
|
const path = __importStar(require("path"));
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
39
|
+
let _modelPrices = null;
|
|
40
|
+
function getModelPrices() {
|
|
41
|
+
if (_modelPrices !== null)
|
|
42
|
+
return _modelPrices;
|
|
43
|
+
const dataDir = process.env.SERVER_DATA_PATH || path.resolve(process.cwd(), 'briyah-data');
|
|
44
|
+
const pricesFilePath = path.join(dataDir, 'common', 'config', 'model_prices.json');
|
|
45
|
+
if (!fs.existsSync(pricesFilePath)) {
|
|
46
|
+
throw new Error(`Model prices file not found at ${pricesFilePath}. Cannot proceed without pricing data.`);
|
|
46
47
|
}
|
|
47
|
-
|
|
48
|
-
|
|
48
|
+
try {
|
|
49
|
+
_modelPrices = JSON.parse(fs.readFileSync(pricesFilePath, 'utf8'));
|
|
49
50
|
}
|
|
51
|
+
catch (error) {
|
|
52
|
+
throw new Error(`Failed to load model prices from ${pricesFilePath}: ${error}`);
|
|
53
|
+
}
|
|
54
|
+
return _modelPrices;
|
|
50
55
|
}
|
|
51
|
-
catch (error) {
|
|
52
|
-
console.error('Error loading model prices:', error);
|
|
53
|
-
}
|
|
54
|
-
exports.default = modelPrices;
|
|
@@ -46,11 +46,12 @@ exports.PublishedAgentsService = void 0;
|
|
|
46
46
|
const common_1 = require("@nestjs/common");
|
|
47
47
|
const fs = __importStar(require("fs"));
|
|
48
48
|
const path = __importStar(require("path"));
|
|
49
|
+
const logger_1 = require("../common/logger");
|
|
49
50
|
let PublishedAgentsService = class PublishedAgentsService {
|
|
50
51
|
mapping = new Map();
|
|
51
52
|
mappingFile;
|
|
52
53
|
constructor() {
|
|
53
|
-
const dataPath = process.env.SERVER_DATA_PATH || path.resolve(process.cwd(), 'data');
|
|
54
|
+
const dataPath = process.env.SERVER_DATA_PATH || path.resolve(process.cwd(), 'briyah-data');
|
|
54
55
|
const dataDir = path.resolve(dataPath, 'common');
|
|
55
56
|
if (!fs.existsSync(dataDir)) {
|
|
56
57
|
fs.mkdirSync(dataDir, { recursive: true });
|
|
@@ -77,7 +78,7 @@ let PublishedAgentsService = class PublishedAgentsService {
|
|
|
77
78
|
load() {
|
|
78
79
|
try {
|
|
79
80
|
if (!fs.existsSync(this.mappingFile)) {
|
|
80
|
-
|
|
81
|
+
logger_1.logger.log('[PublishedAgentsService] No published agents file found, starting fresh');
|
|
81
82
|
this.mapping = new Map();
|
|
82
83
|
this.save();
|
|
83
84
|
return;
|
|
@@ -92,8 +93,8 @@ let PublishedAgentsService = class PublishedAgentsService {
|
|
|
92
93
|
}
|
|
93
94
|
}
|
|
94
95
|
catch (error) {
|
|
95
|
-
|
|
96
|
-
|
|
96
|
+
logger_1.logger.error('[PublishedAgentsService] Error loading published agents:', error);
|
|
97
|
+
logger_1.logger.log('[PublishedAgentsService] Starting with empty mapping');
|
|
97
98
|
this.mapping = new Map();
|
|
98
99
|
this.save();
|
|
99
100
|
}
|
|
@@ -107,7 +108,7 @@ let PublishedAgentsService = class PublishedAgentsService {
|
|
|
107
108
|
fs.writeFileSync(this.mappingFile, JSON.stringify(data, null, 2), 'utf-8');
|
|
108
109
|
}
|
|
109
110
|
catch (error) {
|
|
110
|
-
|
|
111
|
+
logger_1.logger.error('[PublishedAgentsService] Error saving published agents:', error);
|
|
111
112
|
}
|
|
112
113
|
}
|
|
113
114
|
};
|
|
@@ -36,6 +36,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
36
36
|
exports.BalanceService = void 0;
|
|
37
37
|
const fs = __importStar(require("fs"));
|
|
38
38
|
const path = __importStar(require("path"));
|
|
39
|
+
const logger_1 = require("../common/logger");
|
|
39
40
|
class BalanceService {
|
|
40
41
|
userId;
|
|
41
42
|
configService;
|
|
@@ -71,14 +72,14 @@ class BalanceService {
|
|
|
71
72
|
const balanceStr = fs.readFileSync(this.balanceFilePath, 'utf-8').trim();
|
|
72
73
|
const balance = parseFloat(balanceStr);
|
|
73
74
|
if (isNaN(balance)) {
|
|
74
|
-
|
|
75
|
+
logger_1.logger.error(`Balance file corrupted for user ${this.userId}, resetting to starting balance`);
|
|
75
76
|
this.saveBalance(this.startingBalance);
|
|
76
77
|
return this.startingBalance;
|
|
77
78
|
}
|
|
78
79
|
return balance;
|
|
79
80
|
}
|
|
80
81
|
catch (error) {
|
|
81
|
-
|
|
82
|
+
logger_1.logger.error(`Error reading balance for user ${this.userId}:`, error);
|
|
82
83
|
return this.startingBalance;
|
|
83
84
|
}
|
|
84
85
|
}
|
|
@@ -91,14 +92,14 @@ class BalanceService {
|
|
|
91
92
|
const markupStr = fs.readFileSync(this.markupFilePath, 'utf-8').trim();
|
|
92
93
|
const markup = parseFloat(markupStr);
|
|
93
94
|
if (isNaN(markup)) {
|
|
94
|
-
|
|
95
|
+
logger_1.logger.error(`Markup file corrupted, resetting to 0`);
|
|
95
96
|
this.saveMarkup(0);
|
|
96
97
|
return 0;
|
|
97
98
|
}
|
|
98
99
|
return markup;
|
|
99
100
|
}
|
|
100
101
|
catch (error) {
|
|
101
|
-
|
|
102
|
+
logger_1.logger.error(`Error reading markup:`, error);
|
|
102
103
|
return 0;
|
|
103
104
|
}
|
|
104
105
|
}
|
|
@@ -137,7 +138,7 @@ class BalanceService {
|
|
|
137
138
|
}
|
|
138
139
|
}
|
|
139
140
|
catch (error) {
|
|
140
|
-
|
|
141
|
+
logger_1.logger.error(`Error saving balance for user ${this.userId}:`, error);
|
|
141
142
|
throw error;
|
|
142
143
|
}
|
|
143
144
|
}
|
|
@@ -150,7 +151,7 @@ class BalanceService {
|
|
|
150
151
|
fs.writeFileSync(this.markupFilePath, markup.toString(), 'utf-8');
|
|
151
152
|
}
|
|
152
153
|
catch (error) {
|
|
153
|
-
|
|
154
|
+
logger_1.logger.error(`Error saving markup:`, error);
|
|
154
155
|
throw error;
|
|
155
156
|
}
|
|
156
157
|
}
|
|
@@ -18,6 +18,7 @@ const stripe_service_1 = require("./stripe.service");
|
|
|
18
18
|
const user_service_manager_1 = require("./user-service-manager");
|
|
19
19
|
const jwt_auth_guard_1 = require("../auth/jwt-auth.guard");
|
|
20
20
|
const public_decorator_1 = require("../auth/public.decorator");
|
|
21
|
+
const logger_1 = require("../common/logger");
|
|
21
22
|
let StripeController = class StripeController {
|
|
22
23
|
stripeService;
|
|
23
24
|
userServiceManager;
|
|
@@ -45,26 +46,26 @@ let StripeController = class StripeController {
|
|
|
45
46
|
return this.stripeService.getStripeConfig();
|
|
46
47
|
}
|
|
47
48
|
async handleWebhook(req, signature) {
|
|
48
|
-
|
|
49
|
+
logger_1.logger.log('[Stripe Webhook] Received webhook request');
|
|
49
50
|
if (!signature) {
|
|
50
|
-
|
|
51
|
+
logger_1.logger.error('[Stripe Webhook] Missing stripe-signature header');
|
|
51
52
|
throw new common_1.BadRequestException('Missing stripe-signature header');
|
|
52
53
|
}
|
|
53
54
|
const rawBody = req.rawBody;
|
|
54
55
|
if (!rawBody) {
|
|
55
|
-
|
|
56
|
+
logger_1.logger.error('[Stripe Webhook] Missing request body');
|
|
56
57
|
throw new common_1.BadRequestException('Missing request body');
|
|
57
58
|
}
|
|
58
|
-
|
|
59
|
+
logger_1.logger.log('[Stripe Webhook] Verifying webhook signature...');
|
|
59
60
|
const event = this.stripeService.verifyWebhookSignature(rawBody, signature);
|
|
60
|
-
|
|
61
|
+
logger_1.logger.log(`[Stripe Webhook] Event type: ${event.type}, Event ID: ${event.id}`);
|
|
61
62
|
switch (event.type) {
|
|
62
63
|
case 'payment_intent.succeeded': {
|
|
63
|
-
|
|
64
|
+
logger_1.logger.log('[Stripe Webhook] Matched payment_intent.succeeded case');
|
|
64
65
|
const paymentIntent = event.data.object;
|
|
65
66
|
const userId = paymentIntent.metadata.userId;
|
|
66
67
|
if (!userId) {
|
|
67
|
-
|
|
68
|
+
logger_1.logger.error('Payment Intent missing userId in metadata');
|
|
68
69
|
return { received: true };
|
|
69
70
|
}
|
|
70
71
|
const appService = this.userServiceManager.getAppService(userId);
|
|
@@ -72,11 +73,11 @@ let StripeController = class StripeController {
|
|
|
72
73
|
break;
|
|
73
74
|
}
|
|
74
75
|
case 'payment_intent.payment_failed': {
|
|
75
|
-
|
|
76
|
+
logger_1.logger.log('[Stripe Webhook] Matched payment_intent.payment_failed case');
|
|
76
77
|
const paymentIntent = event.data.object;
|
|
77
78
|
const userId = paymentIntent.metadata.userId;
|
|
78
79
|
if (!userId) {
|
|
79
|
-
|
|
80
|
+
logger_1.logger.error('[Stripe Webhook] Payment Intent missing userId in metadata');
|
|
80
81
|
return { received: true };
|
|
81
82
|
}
|
|
82
83
|
const appService = this.userServiceManager.getAppService(userId);
|
|
@@ -84,9 +85,9 @@ let StripeController = class StripeController {
|
|
|
84
85
|
break;
|
|
85
86
|
}
|
|
86
87
|
default:
|
|
87
|
-
|
|
88
|
+
logger_1.logger.log(`[Stripe Webhook] Unhandled event type: ${event.type}`);
|
|
88
89
|
}
|
|
89
|
-
|
|
90
|
+
logger_1.logger.log('[Stripe Webhook] Webhook processed successfully');
|
|
90
91
|
return { received: true };
|
|
91
92
|
}
|
|
92
93
|
async getTransactionHistory(req, limit, offset) {
|
|
@@ -15,6 +15,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
15
15
|
exports.StripeService = void 0;
|
|
16
16
|
const common_1 = require("@nestjs/common");
|
|
17
17
|
const stripe_1 = __importDefault(require("stripe"));
|
|
18
|
+
const logger_1 = require("../common/logger");
|
|
18
19
|
let StripeService = class StripeService {
|
|
19
20
|
stripe;
|
|
20
21
|
minPaymentAmount;
|
|
@@ -68,7 +69,7 @@ let StripeService = class StripeService {
|
|
|
68
69
|
};
|
|
69
70
|
}
|
|
70
71
|
catch (error) {
|
|
71
|
-
|
|
72
|
+
logger_1.logger.error('Error creating Payment Intent:', error);
|
|
72
73
|
throw new common_1.InternalServerErrorException('Failed to create payment intent');
|
|
73
74
|
}
|
|
74
75
|
}
|
|
@@ -119,7 +120,7 @@ let StripeService = class StripeService {
|
|
|
119
120
|
};
|
|
120
121
|
}
|
|
121
122
|
catch (error) {
|
|
122
|
-
|
|
123
|
+
logger_1.logger.error('Error creating Checkout Session:', error);
|
|
123
124
|
throw new common_1.InternalServerErrorException('Failed to create checkout session');
|
|
124
125
|
}
|
|
125
126
|
}
|
|
@@ -133,44 +134,44 @@ let StripeService = class StripeService {
|
|
|
133
134
|
return this.stripe.webhooks.constructEvent(rawBody, signature, this.webhookSecret);
|
|
134
135
|
}
|
|
135
136
|
catch (error) {
|
|
136
|
-
|
|
137
|
+
logger_1.logger.error('Webhook signature verification failed:', error);
|
|
137
138
|
throw new common_1.BadRequestException('Invalid webhook signature');
|
|
138
139
|
}
|
|
139
140
|
}
|
|
140
141
|
async handlePaymentIntentSucceeded(paymentIntent, appService) {
|
|
141
142
|
try {
|
|
142
143
|
const userId = paymentIntent.metadata.userId;
|
|
143
|
-
|
|
144
|
+
logger_1.logger.log(`[Stripe Webhook] Processing payment_intent.succeeded for user ${userId}, payment ${paymentIntent.id}`);
|
|
144
145
|
if (!userId) {
|
|
145
|
-
|
|
146
|
+
logger_1.logger.error('Payment Intent missing userId in metadata:', paymentIntent.id);
|
|
146
147
|
return;
|
|
147
148
|
}
|
|
148
149
|
const amount = paymentIntent.amount / 100;
|
|
149
|
-
|
|
150
|
+
logger_1.logger.log(`[Stripe Webhook] Amount: $${amount.toFixed(2)}`);
|
|
150
151
|
const transactionService = appService.getTransactionService();
|
|
151
152
|
const existingTransaction = await transactionService.getTransactionByPaymentIntent(paymentIntent.id);
|
|
152
|
-
|
|
153
|
+
logger_1.logger.log(`[Stripe Webhook] Existing transaction:`, existingTransaction);
|
|
153
154
|
if (existingTransaction?.status === 'succeeded') {
|
|
154
|
-
|
|
155
|
+
logger_1.logger.log(`Transaction ${paymentIntent.id} already processed, skipping`);
|
|
155
156
|
return;
|
|
156
157
|
}
|
|
157
158
|
const balanceBefore = await appService.getBalance();
|
|
158
|
-
|
|
159
|
-
|
|
159
|
+
logger_1.logger.log(`[Stripe Webhook] Balance before: $${balanceBefore.toFixed(2)}`);
|
|
160
|
+
logger_1.logger.log(`[Stripe Webhook] Adding $${amount.toFixed(2)} to balance`);
|
|
160
161
|
await appService.addBalance(amount);
|
|
161
162
|
const balanceAfter = await appService.getBalance();
|
|
162
|
-
|
|
163
|
-
|
|
163
|
+
logger_1.logger.log(`[Stripe Webhook] Balance after: $${balanceAfter.toFixed(2)}`);
|
|
164
|
+
logger_1.logger.log(`[Stripe Webhook] Updating transaction status to 'succeeded'`);
|
|
164
165
|
await transactionService.updateTransactionStatus(paymentIntent.id, 'succeeded');
|
|
165
|
-
|
|
166
|
+
logger_1.logger.log(`[Stripe Webhook] Checking for paused stories to resume...`);
|
|
166
167
|
const resumedCount = await appService.resumePausedStories();
|
|
167
168
|
if (resumedCount > 0) {
|
|
168
|
-
|
|
169
|
+
logger_1.logger.log(`[Stripe Webhook] Resumed ${resumedCount} paused story/stories`);
|
|
169
170
|
}
|
|
170
|
-
|
|
171
|
+
logger_1.logger.log(`[Stripe Webhook] Payment succeeded: $${amount.toFixed(2)} added to user ${userId} (balance: ${balanceBefore.toFixed(2)} → ${balanceAfter.toFixed(2)})`);
|
|
171
172
|
}
|
|
172
173
|
catch (error) {
|
|
173
|
-
|
|
174
|
+
logger_1.logger.error('[Stripe Webhook] Error handling payment success:', error);
|
|
174
175
|
throw error;
|
|
175
176
|
}
|
|
176
177
|
}
|
|
@@ -178,15 +179,15 @@ let StripeService = class StripeService {
|
|
|
178
179
|
try {
|
|
179
180
|
const userId = paymentIntent.metadata.userId;
|
|
180
181
|
if (!userId) {
|
|
181
|
-
|
|
182
|
+
logger_1.logger.error('Payment Intent missing userId in metadata:', paymentIntent.id);
|
|
182
183
|
return;
|
|
183
184
|
}
|
|
184
185
|
const transactionService = appService.getTransactionService();
|
|
185
186
|
await transactionService.updateTransactionStatus(paymentIntent.id, 'failed');
|
|
186
|
-
|
|
187
|
+
logger_1.logger.log(`Payment failed for user ${userId}: ${paymentIntent.id}`);
|
|
187
188
|
}
|
|
188
189
|
catch (error) {
|
|
189
|
-
|
|
190
|
+
logger_1.logger.error('Error handling payment failure:', error);
|
|
190
191
|
throw error;
|
|
191
192
|
}
|
|
192
193
|
}
|
|
@@ -37,6 +37,7 @@ exports.TransactionService = void 0;
|
|
|
37
37
|
const fs = __importStar(require("fs"));
|
|
38
38
|
const path = __importStar(require("path"));
|
|
39
39
|
const zod_1 = require("zod");
|
|
40
|
+
const logger_1 = require("../common/logger");
|
|
40
41
|
class TransactionService {
|
|
41
42
|
userId;
|
|
42
43
|
configService;
|
|
@@ -69,7 +70,7 @@ class TransactionService {
|
|
|
69
70
|
return transaction;
|
|
70
71
|
}
|
|
71
72
|
catch (error) {
|
|
72
|
-
|
|
73
|
+
logger_1.logger.error(`Error recording transaction for user ${this.userId}:`, error);
|
|
73
74
|
throw error;
|
|
74
75
|
}
|
|
75
76
|
}
|
|
@@ -77,7 +78,7 @@ class TransactionService {
|
|
|
77
78
|
try {
|
|
78
79
|
const transaction = await this.getTransactionByPaymentIntent(paymentIntentId);
|
|
79
80
|
if (!transaction) {
|
|
80
|
-
|
|
81
|
+
logger_1.logger.error(`Transaction not found for payment intent ${paymentIntentId}`);
|
|
81
82
|
return;
|
|
82
83
|
}
|
|
83
84
|
transaction.status = status;
|
|
@@ -90,7 +91,7 @@ class TransactionService {
|
|
|
90
91
|
}
|
|
91
92
|
}
|
|
92
93
|
catch (error) {
|
|
93
|
-
|
|
94
|
+
logger_1.logger.error(`Error updating transaction status for ${paymentIntentId}:`, error);
|
|
94
95
|
throw error;
|
|
95
96
|
}
|
|
96
97
|
}
|
|
@@ -106,7 +107,7 @@ class TransactionService {
|
|
|
106
107
|
return JSON.parse(content);
|
|
107
108
|
}
|
|
108
109
|
catch (error) {
|
|
109
|
-
|
|
110
|
+
logger_1.logger.error(`Error getting transaction for payment intent ${paymentIntentId}:`, error);
|
|
110
111
|
return null;
|
|
111
112
|
}
|
|
112
113
|
}
|
|
@@ -131,7 +132,7 @@ class TransactionService {
|
|
|
131
132
|
};
|
|
132
133
|
}
|
|
133
134
|
catch (error) {
|
|
134
|
-
|
|
135
|
+
logger_1.logger.error(`Error getting transactions for user ${this.userId}:`, error);
|
|
135
136
|
return { transactions: [], total: 0 };
|
|
136
137
|
}
|
|
137
138
|
}
|
|
@@ -13,6 +13,7 @@ exports.UserServiceManager = void 0;
|
|
|
13
13
|
const common_1 = require("@nestjs/common");
|
|
14
14
|
const config_1 = require("@nestjs/config");
|
|
15
15
|
const user_service_factory_1 = require("./user-service-factory");
|
|
16
|
+
const logger_1 = require("../common/logger");
|
|
16
17
|
let UserServiceManager = class UserServiceManager {
|
|
17
18
|
userServiceFactory;
|
|
18
19
|
configService;
|
|
@@ -36,7 +37,7 @@ let UserServiceManager = class UserServiceManager {
|
|
|
36
37
|
clearInterval(this.cleanupIntervalId);
|
|
37
38
|
this.cleanupIntervalId = null;
|
|
38
39
|
this.userServices.clear();
|
|
39
|
-
|
|
40
|
+
logger_1.logger.log('[UserServiceManager] Shutdown complete');
|
|
40
41
|
}
|
|
41
42
|
}
|
|
42
43
|
getAppService(userId) {
|
|
@@ -49,7 +50,7 @@ let UserServiceManager = class UserServiceManager {
|
|
|
49
50
|
return context.appService;
|
|
50
51
|
}
|
|
51
52
|
else {
|
|
52
|
-
|
|
53
|
+
logger_1.logger.log(`[UserServiceManager] Cache expired for user ${userId} (${ageMinutes.toFixed(1)}min old)`);
|
|
53
54
|
this.userServices.delete(userId);
|
|
54
55
|
}
|
|
55
56
|
}
|
|
@@ -62,7 +63,7 @@ let UserServiceManager = class UserServiceManager {
|
|
|
62
63
|
}
|
|
63
64
|
removeUserService(userId) {
|
|
64
65
|
if (this.userServices.delete(userId)) {
|
|
65
|
-
|
|
66
|
+
logger_1.logger.log(`[UserServiceManager] Manually removed service for user ${userId}`);
|
|
66
67
|
}
|
|
67
68
|
}
|
|
68
69
|
getCacheStats() {
|
|
@@ -86,11 +87,11 @@ let UserServiceManager = class UserServiceManager {
|
|
|
86
87
|
this.userServices.delete(userId);
|
|
87
88
|
removedCount++;
|
|
88
89
|
const ageMinutes = age / (60 * 1000);
|
|
89
|
-
|
|
90
|
+
logger_1.logger.log(`[UserServiceManager] Cleaned up service for user ${userId} (${ageMinutes.toFixed(1)}min inactive)`);
|
|
90
91
|
}
|
|
91
92
|
}
|
|
92
93
|
if (removedCount > 0) {
|
|
93
|
-
|
|
94
|
+
logger_1.logger.log(`[UserServiceManager] Cleanup complete: removed ${removedCount} inactive user(s), ${this.userServices.size} remaining`);
|
|
94
95
|
}
|
|
95
96
|
}
|
|
96
97
|
};
|