checkpoint: goals feature, wallet balance, and goals/wallet detail UI

- Add goals feature (models, migrations, API, web pages)
- Add reserved/centralized wallet balance service
- Add wallet detail page and overview components
- Add new UI components (progress, multi-select, FAB)
- Remove stray empty -H/-d files from working tree
This commit is contained in:
Dwindi Ramadhana
2026-06-17 20:40:00 +07:00
parent 35e93b826a
commit 6a6e74562c
401 changed files with 9517 additions and 397 deletions

BIN
apps/.DS_Store vendored Normal file → Executable file

Binary file not shown.

BIN
apps/api/.DS_Store vendored Normal file → Executable file

Binary file not shown.

0
apps/api/.env.example Normal file → Executable file
View File

0
apps/api/.gitignore vendored Normal file → Executable file
View File

0
apps/api/.prettierrc Normal file → Executable file
View File

0
apps/api/README.md Normal file → Executable file
View File

0
apps/api/dist/admin/admin-config.controller.d.ts vendored Normal file → Executable file
View File

0
apps/api/dist/admin/admin-config.controller.js vendored Normal file → Executable file
View File

0
apps/api/dist/admin/admin-config.controller.js.map vendored Normal file → Executable file
View File

0
apps/api/dist/admin/admin-config.service.d.ts vendored Normal file → Executable file
View File

0
apps/api/dist/admin/admin-config.service.js vendored Normal file → Executable file
View File

0
apps/api/dist/admin/admin-config.service.js.map vendored Normal file → Executable file
View File

0
apps/api/dist/admin/admin-payment-methods.controller.d.ts vendored Normal file → Executable file
View File

0
apps/api/dist/admin/admin-payment-methods.controller.js vendored Normal file → Executable file
View File

0
apps/api/dist/admin/admin-payment-methods.controller.js.map vendored Normal file → Executable file
View File

0
apps/api/dist/admin/admin-payment-methods.service.d.ts vendored Normal file → Executable file
View File

0
apps/api/dist/admin/admin-payment-methods.service.js vendored Normal file → Executable file
View File

0
apps/api/dist/admin/admin-payment-methods.service.js.map vendored Normal file → Executable file
View File

0
apps/api/dist/admin/admin-payments.controller.d.ts vendored Normal file → Executable file
View File

0
apps/api/dist/admin/admin-payments.controller.js vendored Normal file → Executable file
View File

0
apps/api/dist/admin/admin-payments.controller.js.map vendored Normal file → Executable file
View File

0
apps/api/dist/admin/admin-payments.service.d.ts vendored Normal file → Executable file
View File

0
apps/api/dist/admin/admin-payments.service.js vendored Normal file → Executable file
View File

0
apps/api/dist/admin/admin-payments.service.js.map vendored Normal file → Executable file
View File

0
apps/api/dist/admin/admin-plans.controller.d.ts vendored Normal file → Executable file
View File

0
apps/api/dist/admin/admin-plans.controller.js vendored Normal file → Executable file
View File

0
apps/api/dist/admin/admin-plans.controller.js.map vendored Normal file → Executable file
View File

0
apps/api/dist/admin/admin-plans.service.d.ts vendored Normal file → Executable file
View File

0
apps/api/dist/admin/admin-plans.service.js vendored Normal file → Executable file
View File

0
apps/api/dist/admin/admin-plans.service.js.map vendored Normal file → Executable file
View File

44
apps/api/dist/admin/admin-users.controller.d.ts vendored Normal file → Executable file
View File

@@ -6,11 +6,11 @@ export declare class AdminUsersController {
id: string;
email: string;
createdAt: Date;
emailVerified: boolean;
name: string | null;
emailVerified: boolean;
lastLoginAt: Date | null;
role: string;
suspendedAt: Date | null;
lastLoginAt: Date | null;
_count: {
transactions: number;
wallets: number;
@@ -62,11 +62,11 @@ export declare class AdminUsersController {
trialEndDate: Date | null;
cancelledAt: Date | null;
cancellationReason: string | null;
})[];
}) | null;
_count: {
payments: number;
transactions: number;
wallets: number;
payments: number;
};
} & {
id: string;
@@ -75,20 +75,20 @@ export declare class AdminUsersController {
createdAt: Date;
updatedAt: Date;
status: string;
emailVerified: boolean;
passwordHash: string | null;
name: string | null;
avatarUrl: string | null;
defaultCurrency: string | null;
timeZone: string | null;
emailVerified: boolean;
otpEmailEnabled: boolean;
otpWhatsappEnabled: boolean;
otpTotpEnabled: boolean;
otpTotpSecret: string | null;
passwordHash: string | null;
otpWhatsappEnabled: boolean;
lastLoginAt: Date | null;
role: string;
suspendedAt: Date | null;
suspendedReason: string | null;
lastLoginAt: Date | null;
}) | null>;
updateRole(id: string, body: {
role: string;
@@ -99,20 +99,20 @@ export declare class AdminUsersController {
createdAt: Date;
updatedAt: Date;
status: string;
emailVerified: boolean;
passwordHash: string | null;
name: string | null;
avatarUrl: string | null;
defaultCurrency: string | null;
timeZone: string | null;
emailVerified: boolean;
otpEmailEnabled: boolean;
otpWhatsappEnabled: boolean;
otpTotpEnabled: boolean;
otpTotpSecret: string | null;
passwordHash: string | null;
otpWhatsappEnabled: boolean;
lastLoginAt: Date | null;
role: string;
suspendedAt: Date | null;
suspendedReason: string | null;
lastLoginAt: Date | null;
}>;
suspend(id: string, body: {
reason: string;
@@ -123,20 +123,20 @@ export declare class AdminUsersController {
createdAt: Date;
updatedAt: Date;
status: string;
emailVerified: boolean;
passwordHash: string | null;
name: string | null;
avatarUrl: string | null;
defaultCurrency: string | null;
timeZone: string | null;
emailVerified: boolean;
otpEmailEnabled: boolean;
otpWhatsappEnabled: boolean;
otpTotpEnabled: boolean;
otpTotpSecret: string | null;
passwordHash: string | null;
otpWhatsappEnabled: boolean;
lastLoginAt: Date | null;
role: string;
suspendedAt: Date | null;
suspendedReason: string | null;
lastLoginAt: Date | null;
}>;
unsuspend(id: string): Promise<{
id: string;
@@ -145,20 +145,20 @@ export declare class AdminUsersController {
createdAt: Date;
updatedAt: Date;
status: string;
emailVerified: boolean;
passwordHash: string | null;
name: string | null;
avatarUrl: string | null;
defaultCurrency: string | null;
timeZone: string | null;
emailVerified: boolean;
otpEmailEnabled: boolean;
otpWhatsappEnabled: boolean;
otpTotpEnabled: boolean;
otpTotpSecret: string | null;
passwordHash: string | null;
otpWhatsappEnabled: boolean;
lastLoginAt: Date | null;
role: string;
suspendedAt: Date | null;
suspendedReason: string | null;
lastLoginAt: Date | null;
}>;
grantProAccess(id: string, body: {
planSlug: string;
@@ -186,8 +186,8 @@ export declare class AdminUsersController {
id: string;
email: string;
createdAt: Date;
emailVerified: boolean;
name: string | null;
emailVerified: boolean;
role: string;
}>;
update(id: string, body: {
@@ -198,8 +198,8 @@ export declare class AdminUsersController {
id: string;
email: string;
createdAt: Date;
emailVerified: boolean;
name: string | null;
emailVerified: boolean;
role: string;
}>;
delete(id: string): Promise<{

0
apps/api/dist/admin/admin-users.controller.js vendored Normal file → Executable file
View File

0
apps/api/dist/admin/admin-users.controller.js.map vendored Normal file → Executable file
View File

44
apps/api/dist/admin/admin-users.service.d.ts vendored Normal file → Executable file
View File

@@ -6,11 +6,11 @@ export declare class AdminUsersService {
id: string;
email: string;
createdAt: Date;
emailVerified: boolean;
name: string | null;
emailVerified: boolean;
lastLoginAt: Date | null;
role: string;
suspendedAt: Date | null;
lastLoginAt: Date | null;
_count: {
transactions: number;
wallets: number;
@@ -57,11 +57,11 @@ export declare class AdminUsersService {
trialEndDate: Date | null;
cancelledAt: Date | null;
cancellationReason: string | null;
})[];
}) | null;
_count: {
payments: number;
transactions: number;
wallets: number;
payments: number;
};
} & {
id: string;
@@ -70,20 +70,20 @@ export declare class AdminUsersService {
createdAt: Date;
updatedAt: Date;
status: string;
emailVerified: boolean;
passwordHash: string | null;
name: string | null;
avatarUrl: string | null;
defaultCurrency: string | null;
timeZone: string | null;
emailVerified: boolean;
otpEmailEnabled: boolean;
otpWhatsappEnabled: boolean;
otpTotpEnabled: boolean;
otpTotpSecret: string | null;
passwordHash: string | null;
otpWhatsappEnabled: boolean;
lastLoginAt: Date | null;
role: string;
suspendedAt: Date | null;
suspendedReason: string | null;
lastLoginAt: Date | null;
}) | null>;
updateRole(id: string, role: string): Promise<{
id: string;
@@ -92,20 +92,20 @@ export declare class AdminUsersService {
createdAt: Date;
updatedAt: Date;
status: string;
emailVerified: boolean;
passwordHash: string | null;
name: string | null;
avatarUrl: string | null;
defaultCurrency: string | null;
timeZone: string | null;
emailVerified: boolean;
otpEmailEnabled: boolean;
otpWhatsappEnabled: boolean;
otpTotpEnabled: boolean;
otpTotpSecret: string | null;
passwordHash: string | null;
otpWhatsappEnabled: boolean;
lastLoginAt: Date | null;
role: string;
suspendedAt: Date | null;
suspendedReason: string | null;
lastLoginAt: Date | null;
}>;
suspend(id: string, reason: string): Promise<{
id: string;
@@ -114,20 +114,20 @@ export declare class AdminUsersService {
createdAt: Date;
updatedAt: Date;
status: string;
emailVerified: boolean;
passwordHash: string | null;
name: string | null;
avatarUrl: string | null;
defaultCurrency: string | null;
timeZone: string | null;
emailVerified: boolean;
otpEmailEnabled: boolean;
otpWhatsappEnabled: boolean;
otpTotpEnabled: boolean;
otpTotpSecret: string | null;
passwordHash: string | null;
otpWhatsappEnabled: boolean;
lastLoginAt: Date | null;
role: string;
suspendedAt: Date | null;
suspendedReason: string | null;
lastLoginAt: Date | null;
}>;
unsuspend(id: string): Promise<{
id: string;
@@ -136,20 +136,20 @@ export declare class AdminUsersService {
createdAt: Date;
updatedAt: Date;
status: string;
emailVerified: boolean;
passwordHash: string | null;
name: string | null;
avatarUrl: string | null;
defaultCurrency: string | null;
timeZone: string | null;
emailVerified: boolean;
otpEmailEnabled: boolean;
otpWhatsappEnabled: boolean;
otpTotpEnabled: boolean;
otpTotpSecret: string | null;
passwordHash: string | null;
otpWhatsappEnabled: boolean;
lastLoginAt: Date | null;
role: string;
suspendedAt: Date | null;
suspendedReason: string | null;
lastLoginAt: Date | null;
}>;
grantProAccess(userId: string, planSlug: string, durationDays: number): Promise<{
id: string;
@@ -179,8 +179,8 @@ export declare class AdminUsersService {
id: string;
email: string;
createdAt: Date;
emailVerified: boolean;
name: string | null;
emailVerified: boolean;
role: string;
}>;
update(id: string, data: {
@@ -191,8 +191,8 @@ export declare class AdminUsersService {
id: string;
email: string;
createdAt: Date;
emailVerified: boolean;
name: string | null;
emailVerified: boolean;
role: string;
}>;
delete(id: string): Promise<{

0
apps/api/dist/admin/admin-users.service.js vendored Normal file → Executable file
View File

0
apps/api/dist/admin/admin-users.service.js.map vendored Normal file → Executable file
View File

0
apps/api/dist/admin/admin.module.d.ts vendored Normal file → Executable file
View File

0
apps/api/dist/admin/admin.module.js vendored Normal file → Executable file
View File

0
apps/api/dist/admin/admin.module.js.map vendored Normal file → Executable file
View File

0
apps/api/dist/admin/guards/admin.guard.d.ts vendored Normal file → Executable file
View File

0
apps/api/dist/admin/guards/admin.guard.js vendored Normal file → Executable file
View File

0
apps/api/dist/admin/guards/admin.guard.js.map vendored Normal file → Executable file
View File

0
apps/api/dist/app.controller.d.ts vendored Normal file → Executable file
View File

0
apps/api/dist/app.controller.js vendored Normal file → Executable file
View File

0
apps/api/dist/app.controller.js.map vendored Normal file → Executable file
View File

0
apps/api/dist/app.module.d.ts vendored Normal file → Executable file
View File

2
apps/api/dist/app.module.js vendored Normal file → Executable file
View File

@@ -53,6 +53,7 @@ const transactions_module_1 = require("./transactions/transactions.module");
const categories_module_1 = require("./categories/categories.module");
const otp_module_1 = require("./otp/otp.module");
const admin_module_1 = require("./admin/admin.module");
const goals_module_1 = require("./goals/goals.module");
const maintenance_guard_1 = require("./common/guards/maintenance.guard");
let AppModule = class AppModule {
};
@@ -75,6 +76,7 @@ exports.AppModule = AppModule = __decorate([
categories_module_1.CategoriesModule,
otp_module_1.OtpModule,
admin_module_1.AdminModule,
goals_module_1.GoalsModule,
],
controllers: [health_controller_1.HealthController],
providers: [

2
apps/api/dist/app.module.js.map vendored Normal file → Executable file
View File

@@ -1 +1 @@
{"version":3,"file":"app.module.js","sourceRoot":"","sources":["../src/app.module.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,2CAAwC;AACxC,2CAA8C;AAC9C,uCAAyC;AACzC,2CAA6B;AAC7B,0DAAsD;AACtD,oDAAgD;AAChD,kEAA8D;AAC9D,uDAAmD;AACnD,6DAAyD;AACzD,4EAAwE;AACxE,sEAAkE;AAClE,iDAA6C;AAC7C,uDAAmD;AACnD,yEAAqE;AA4B9D,IAAM,SAAS,GAAf,MAAM,SAAS;CAAG,CAAA;AAAZ,8BAAS;oBAAT,SAAS;IA1BrB,IAAA,eAAM,EAAC;QACN,OAAO,EAAE;YACP,qBAAY,CAAC,OAAO,CAAC;gBACnB,QAAQ,EAAE,IAAI;gBACd,WAAW,EAAE;oBACX,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,MAAM,CAAC;oBACnC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,YAAY,CAAC;iBAC1C;aACF,CAAC;YACF,4BAAY;YACZ,wBAAU;YACV,0BAAW;YACX,8BAAa;YACb,wCAAkB;YAClB,oCAAgB;YAChB,sBAAS;YACT,0BAAW;SACZ;QACD,WAAW,EAAE,CAAC,oCAAgB,CAAC;QAC/B,SAAS,EAAE;YACT;gBACE,OAAO,EAAE,gBAAS;gBAClB,QAAQ,EAAE,oCAAgB;aAC3B;SACF;KACF,CAAC;GACW,SAAS,CAAG"}
{"version":3,"file":"app.module.js","sourceRoot":"","sources":["../src/app.module.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,2CAAwC;AACxC,2CAA8C;AAC9C,uCAAyC;AACzC,2CAA6B;AAC7B,0DAAsD;AACtD,oDAAgD;AAChD,kEAA8D;AAC9D,uDAAmD;AACnD,6DAAyD;AACzD,4EAAwE;AACxE,sEAAkE;AAClE,iDAA6C;AAC7C,uDAAmD;AACnD,uDAAmD;AACnD,yEAAqE;AA6B9D,IAAM,SAAS,GAAf,MAAM,SAAS;CAAG,CAAA;AAAZ,8BAAS;oBAAT,SAAS;IA3BrB,IAAA,eAAM,EAAC;QACN,OAAO,EAAE;YACP,qBAAY,CAAC,OAAO,CAAC;gBACnB,QAAQ,EAAE,IAAI;gBACd,WAAW,EAAE;oBACX,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,MAAM,CAAC;oBACnC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,YAAY,CAAC;iBAC1C;aACF,CAAC;YACF,4BAAY;YACZ,wBAAU;YACV,0BAAW;YACX,8BAAa;YACb,wCAAkB;YAClB,oCAAgB;YAChB,sBAAS;YACT,0BAAW;YACX,0BAAW;SACZ;QACD,WAAW,EAAE,CAAC,oCAAgB,CAAC;QAC/B,SAAS,EAAE;YACT;gBACE,OAAO,EAAE,gBAAS;gBAClB,QAAQ,EAAE,oCAAgB;aAC3B;SACF;KACF,CAAC;GACW,SAAS,CAAG"}

0
apps/api/dist/app.service.d.ts vendored Normal file → Executable file
View File

0
apps/api/dist/app.service.js vendored Normal file → Executable file
View File

0
apps/api/dist/app.service.js.map vendored Normal file → Executable file
View File

2
apps/api/dist/auth/auth.controller.d.ts vendored Normal file → Executable file
View File

@@ -71,9 +71,9 @@ export declare class AuthController {
getProfile(req: RequestWithUser): Promise<{
id: string;
email: string;
emailVerified: boolean;
name: string | null;
avatarUrl: string | null;
emailVerified: boolean;
role: string;
}>;
changePassword(req: RequestWithUser, body: {

0
apps/api/dist/auth/auth.controller.js vendored Normal file → Executable file
View File

0
apps/api/dist/auth/auth.controller.js.map vendored Normal file → Executable file
View File

0
apps/api/dist/auth/auth.guard.d.ts vendored Normal file → Executable file
View File

0
apps/api/dist/auth/auth.guard.js vendored Normal file → Executable file
View File

0
apps/api/dist/auth/auth.guard.js.map vendored Normal file → Executable file
View File

0
apps/api/dist/auth/auth.module.d.ts vendored Normal file → Executable file
View File

0
apps/api/dist/auth/auth.module.js vendored Normal file → Executable file
View File

0
apps/api/dist/auth/auth.module.js.map vendored Normal file → Executable file
View File

2
apps/api/dist/auth/auth.service.d.ts vendored Normal file → Executable file
View File

@@ -86,9 +86,9 @@ export declare class AuthService {
getUserProfile(userId: string): Promise<{
id: string;
email: string;
emailVerified: boolean;
name: string | null;
avatarUrl: string | null;
emailVerified: boolean;
role: string;
}>;
changePassword(userId: string, currentPassword: string, newPassword: string, isSettingPassword?: boolean): Promise<{

0
apps/api/dist/auth/auth.service.js vendored Normal file → Executable file
View File

0
apps/api/dist/auth/auth.service.js.map vendored Normal file → Executable file
View File

0
apps/api/dist/auth/google.strategy.d.ts vendored Normal file → Executable file
View File

0
apps/api/dist/auth/google.strategy.js vendored Normal file → Executable file
View File

0
apps/api/dist/auth/google.strategy.js.map vendored Normal file → Executable file
View File

0
apps/api/dist/auth/jwt.strategy.d.ts vendored Normal file → Executable file
View File

0
apps/api/dist/auth/jwt.strategy.js vendored Normal file → Executable file
View File

0
apps/api/dist/auth/jwt.strategy.js.map vendored Normal file → Executable file
View File

0
apps/api/dist/categories/categories.controller.d.ts vendored Normal file → Executable file
View File

0
apps/api/dist/categories/categories.controller.js vendored Normal file → Executable file
View File

0
apps/api/dist/categories/categories.controller.js.map vendored Normal file → Executable file
View File

0
apps/api/dist/categories/categories.module.d.ts vendored Normal file → Executable file
View File

0
apps/api/dist/categories/categories.module.js vendored Normal file → Executable file
View File

0
apps/api/dist/categories/categories.module.js.map vendored Normal file → Executable file
View File

0
apps/api/dist/categories/categories.service.d.ts vendored Normal file → Executable file
View File

0
apps/api/dist/categories/categories.service.js vendored Normal file → Executable file
View File

0
apps/api/dist/categories/categories.service.js.map vendored Normal file → Executable file
View File

0
apps/api/dist/categories/dto/create-category.dto.d.ts vendored Normal file → Executable file
View File

0
apps/api/dist/categories/dto/create-category.dto.js vendored Normal file → Executable file
View File

0
apps/api/dist/categories/dto/create-category.dto.js.map vendored Normal file → Executable file
View File

0
apps/api/dist/common/decorators/skip-maintenance.decorator.d.ts vendored Normal file → Executable file
View File

0
apps/api/dist/common/decorators/skip-maintenance.decorator.js vendored Normal file → Executable file
View File

0
apps/api/dist/common/decorators/skip-maintenance.decorator.js.map vendored Normal file → Executable file
View File

0
apps/api/dist/common/guards/maintenance.guard.d.ts vendored Normal file → Executable file
View File

0
apps/api/dist/common/guards/maintenance.guard.js vendored Normal file → Executable file
View File

0
apps/api/dist/common/guards/maintenance.guard.js.map vendored Normal file → Executable file
View File

0
apps/api/dist/common/user.util.d.ts vendored Normal file → Executable file
View File

0
apps/api/dist/common/user.util.js vendored Normal file → Executable file
View File

0
apps/api/dist/common/user.util.js.map vendored Normal file → Executable file
View File

View File

@@ -0,0 +1,5 @@
export declare class CreateAllocationDto {
walletId: string;
amount: number;
notes?: string;
}

View File

@@ -0,0 +1,35 @@
"use strict";
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
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;
return c > 3 && r && Object.defineProperty(target, key, r), r;
};
var __metadata = (this && this.__metadata) || function (k, v) {
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.CreateAllocationDto = void 0;
const class_validator_1 = require("class-validator");
class CreateAllocationDto {
walletId;
amount;
notes;
}
exports.CreateAllocationDto = CreateAllocationDto;
__decorate([
(0, class_validator_1.IsString)(),
(0, class_validator_1.IsNotEmpty)(),
__metadata("design:type", String)
], CreateAllocationDto.prototype, "walletId", void 0);
__decorate([
(0, class_validator_1.IsNumber)(),
(0, class_validator_1.Min)(0.01),
__metadata("design:type", Number)
], CreateAllocationDto.prototype, "amount", void 0);
__decorate([
(0, class_validator_1.IsString)(),
(0, class_validator_1.IsOptional)(),
__metadata("design:type", String)
], CreateAllocationDto.prototype, "notes", void 0);
//# sourceMappingURL=create-allocation.dto.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"create-allocation.dto.js","sourceRoot":"","sources":["../../../src/goals/dto/create-allocation.dto.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,qDAAkF;AAElF,MAAa,mBAAmB;IAG9B,QAAQ,CAAS;IAIjB,MAAM,CAAS;IAIf,KAAK,CAAU;CAChB;AAZD,kDAYC;AATC;IAFC,IAAA,0BAAQ,GAAE;IACV,IAAA,4BAAU,GAAE;;qDACI;AAIjB;IAFC,IAAA,0BAAQ,GAAE;IACV,IAAA,qBAAG,EAAC,IAAI,CAAC;;mDACK;AAIf;IAFC,IAAA,0BAAQ,GAAE;IACV,IAAA,4BAAU,GAAE;;kDACE"}

View File

@@ -0,0 +1,9 @@
export declare class CreateGoalDto {
name: string;
description?: string;
targetAmount: number;
currency: string;
targetDate?: string;
imageUrl?: string;
category?: string;
}

59
apps/api/dist/goals/dto/create-goal.dto.js vendored Executable file
View File

@@ -0,0 +1,59 @@
"use strict";
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
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;
return c > 3 && r && Object.defineProperty(target, key, r), r;
};
var __metadata = (this && this.__metadata) || function (k, v) {
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.CreateGoalDto = void 0;
const class_validator_1 = require("class-validator");
class CreateGoalDto {
name;
description;
targetAmount;
currency;
targetDate;
imageUrl;
category;
}
exports.CreateGoalDto = CreateGoalDto;
__decorate([
(0, class_validator_1.IsString)(),
(0, class_validator_1.IsNotEmpty)(),
__metadata("design:type", String)
], CreateGoalDto.prototype, "name", void 0);
__decorate([
(0, class_validator_1.IsString)(),
(0, class_validator_1.IsOptional)(),
__metadata("design:type", String)
], CreateGoalDto.prototype, "description", void 0);
__decorate([
(0, class_validator_1.IsNumber)(),
(0, class_validator_1.Min)(0),
__metadata("design:type", Number)
], CreateGoalDto.prototype, "targetAmount", void 0);
__decorate([
(0, class_validator_1.IsString)(),
(0, class_validator_1.IsNotEmpty)(),
__metadata("design:type", String)
], CreateGoalDto.prototype, "currency", void 0);
__decorate([
(0, class_validator_1.IsDateString)(),
(0, class_validator_1.IsOptional)(),
__metadata("design:type", String)
], CreateGoalDto.prototype, "targetDate", void 0);
__decorate([
(0, class_validator_1.IsString)(),
(0, class_validator_1.IsOptional)(),
__metadata("design:type", String)
], CreateGoalDto.prototype, "imageUrl", void 0);
__decorate([
(0, class_validator_1.IsString)(),
(0, class_validator_1.IsOptional)(),
__metadata("design:type", String)
], CreateGoalDto.prototype, "category", void 0);
//# sourceMappingURL=create-goal.dto.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"create-goal.dto.js","sourceRoot":"","sources":["../../../src/goals/dto/create-goal.dto.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,qDAAgG;AAEhG,MAAa,aAAa;IAGxB,IAAI,CAAS;IAIb,WAAW,CAAU;IAIrB,YAAY,CAAS;IAIrB,QAAQ,CAAS;IAIjB,UAAU,CAAU;IAIpB,QAAQ,CAAU;IAIlB,QAAQ,CAAU;CACnB;AA5BD,sCA4BC;AAzBC;IAFC,IAAA,0BAAQ,GAAE;IACV,IAAA,4BAAU,GAAE;;2CACA;AAIb;IAFC,IAAA,0BAAQ,GAAE;IACV,IAAA,4BAAU,GAAE;;kDACQ;AAIrB;IAFC,IAAA,0BAAQ,GAAE;IACV,IAAA,qBAAG,EAAC,CAAC,CAAC;;mDACc;AAIrB;IAFC,IAAA,0BAAQ,GAAE;IACV,IAAA,4BAAU,GAAE;;+CACI;AAIjB;IAFC,IAAA,8BAAY,GAAE;IACd,IAAA,4BAAU,GAAE;;iDACO;AAIpB;IAFC,IAAA,0BAAQ,GAAE;IACV,IAAA,4BAAU,GAAE;;+CACK;AAIlB;IAFC,IAAA,0BAAQ,GAAE;IACV,IAAA,4BAAU,GAAE;;+CACK"}

View File

@@ -0,0 +1,6 @@
import { CreateGoalDto } from './create-goal.dto';
declare const UpdateGoalDto_base: import("@nestjs/mapped-types").MappedType<Partial<CreateGoalDto>>;
export declare class UpdateGoalDto extends UpdateGoalDto_base {
status?: string;
}
export {};

25
apps/api/dist/goals/dto/update-goal.dto.js vendored Executable file
View File

@@ -0,0 +1,25 @@
"use strict";
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
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;
return c > 3 && r && Object.defineProperty(target, key, r), r;
};
var __metadata = (this && this.__metadata) || function (k, v) {
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.UpdateGoalDto = void 0;
const mapped_types_1 = require("@nestjs/mapped-types");
const create_goal_dto_1 = require("./create-goal.dto");
const class_validator_1 = require("class-validator");
class UpdateGoalDto extends (0, mapped_types_1.PartialType)(create_goal_dto_1.CreateGoalDto) {
status;
}
exports.UpdateGoalDto = UpdateGoalDto;
__decorate([
(0, class_validator_1.IsString)(),
(0, class_validator_1.IsOptional)(),
__metadata("design:type", String)
], UpdateGoalDto.prototype, "status", void 0);
//# sourceMappingURL=update-goal.dto.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"update-goal.dto.js","sourceRoot":"","sources":["../../../src/goals/dto/update-goal.dto.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,uDAAmD;AACnD,uDAAkD;AAClD,qDAAuD;AAEvD,MAAa,aAAc,SAAQ,IAAA,0BAAW,EAAC,+BAAa,CAAC;IAG3D,MAAM,CAAU;CACjB;AAJD,sCAIC;AADC;IAFC,IAAA,0BAAQ,GAAE;IACV,IAAA,4BAAU,GAAE;;6CACG"}

261
apps/api/dist/goals/goals.controller.d.ts vendored Executable file
View File

@@ -0,0 +1,261 @@
import { GoalsService } from './goals.service';
import { CreateGoalDto } from './dto/create-goal.dto';
import { UpdateGoalDto } from './dto/update-goal.dto';
import { CreateAllocationDto } from './dto/create-allocation.dto';
export declare class GoalsController {
private readonly goalsService;
constructor(goalsService: GoalsService);
create(req: any, createGoalDto: CreateGoalDto): Promise<{
allocations: ({
wallet: {
id: string;
createdAt: Date;
updatedAt: Date;
name: string;
userId: string;
kind: string;
currency: string | null;
unit: string | null;
deletedAt: Date | null;
initialAmount: import("@prisma/client/runtime/library").Decimal | null;
pricePerUnit: import("@prisma/client/runtime/library").Decimal | null;
reservedBalance: import("@prisma/client/runtime/library").Decimal;
};
} & {
id: string;
createdAt: Date;
currency: string;
amount: import("@prisma/client/runtime/library").Decimal;
walletId: string;
notes: string | null;
goalId: string;
exchangeRate: import("@prisma/client/runtime/library").Decimal | null;
amountInGoalCurrency: import("@prisma/client/runtime/library").Decimal;
createdBy: string;
})[];
milestones: {
id: string;
targetAmount: import("@prisma/client/runtime/library").Decimal;
percentage: number;
goalId: string;
achievedAt: Date | null;
notifiedAt: Date | null;
}[];
} & {
category: string | null;
id: string;
createdAt: Date;
updatedAt: Date;
status: string;
name: string;
userId: string;
currency: string;
description: string | null;
targetAmount: import("@prisma/client/runtime/library").Decimal;
targetDate: Date | null;
imageUrl: string | null;
teamId: string | null;
currentAmount: import("@prisma/client/runtime/library").Decimal;
completedAt: Date | null;
}>;
findAll(req: any, status?: string): Promise<({
allocations: ({
wallet: {
id: string;
createdAt: Date;
updatedAt: Date;
name: string;
userId: string;
kind: string;
currency: string | null;
unit: string | null;
deletedAt: Date | null;
initialAmount: import("@prisma/client/runtime/library").Decimal | null;
pricePerUnit: import("@prisma/client/runtime/library").Decimal | null;
reservedBalance: import("@prisma/client/runtime/library").Decimal;
};
} & {
id: string;
createdAt: Date;
currency: string;
amount: import("@prisma/client/runtime/library").Decimal;
walletId: string;
notes: string | null;
goalId: string;
exchangeRate: import("@prisma/client/runtime/library").Decimal | null;
amountInGoalCurrency: import("@prisma/client/runtime/library").Decimal;
createdBy: string;
})[];
milestones: {
id: string;
targetAmount: import("@prisma/client/runtime/library").Decimal;
percentage: number;
goalId: string;
achievedAt: Date | null;
notifiedAt: Date | null;
}[];
} & {
category: string | null;
id: string;
createdAt: Date;
updatedAt: Date;
status: string;
name: string;
userId: string;
currency: string;
description: string | null;
targetAmount: import("@prisma/client/runtime/library").Decimal;
targetDate: Date | null;
imageUrl: string | null;
teamId: string | null;
currentAmount: import("@prisma/client/runtime/library").Decimal;
completedAt: Date | null;
})[]>;
getStats(req: any): Promise<{
totalGoals: number;
activeGoals: number;
completedGoals: number;
totalTargetAmount: number;
totalCurrentAmount: number;
overallProgress: number;
}>;
findOne(req: any, id: string): Promise<{
allocations: ({
wallet: {
id: string;
createdAt: Date;
updatedAt: Date;
name: string;
userId: string;
kind: string;
currency: string | null;
unit: string | null;
deletedAt: Date | null;
initialAmount: import("@prisma/client/runtime/library").Decimal | null;
pricePerUnit: import("@prisma/client/runtime/library").Decimal | null;
reservedBalance: import("@prisma/client/runtime/library").Decimal;
};
} & {
id: string;
createdAt: Date;
currency: string;
amount: import("@prisma/client/runtime/library").Decimal;
walletId: string;
notes: string | null;
goalId: string;
exchangeRate: import("@prisma/client/runtime/library").Decimal | null;
amountInGoalCurrency: import("@prisma/client/runtime/library").Decimal;
createdBy: string;
})[];
milestones: {
id: string;
targetAmount: import("@prisma/client/runtime/library").Decimal;
percentage: number;
goalId: string;
achievedAt: Date | null;
notifiedAt: Date | null;
}[];
} & {
category: string | null;
id: string;
createdAt: Date;
updatedAt: Date;
status: string;
name: string;
userId: string;
currency: string;
description: string | null;
targetAmount: import("@prisma/client/runtime/library").Decimal;
targetDate: Date | null;
imageUrl: string | null;
teamId: string | null;
currentAmount: import("@prisma/client/runtime/library").Decimal;
completedAt: Date | null;
}>;
update(req: any, id: string, updateGoalDto: UpdateGoalDto): Promise<{
allocations: ({
wallet: {
id: string;
createdAt: Date;
updatedAt: Date;
name: string;
userId: string;
kind: string;
currency: string | null;
unit: string | null;
deletedAt: Date | null;
initialAmount: import("@prisma/client/runtime/library").Decimal | null;
pricePerUnit: import("@prisma/client/runtime/library").Decimal | null;
reservedBalance: import("@prisma/client/runtime/library").Decimal;
};
} & {
id: string;
createdAt: Date;
currency: string;
amount: import("@prisma/client/runtime/library").Decimal;
walletId: string;
notes: string | null;
goalId: string;
exchangeRate: import("@prisma/client/runtime/library").Decimal | null;
amountInGoalCurrency: import("@prisma/client/runtime/library").Decimal;
createdBy: string;
})[];
milestones: {
id: string;
targetAmount: import("@prisma/client/runtime/library").Decimal;
percentage: number;
goalId: string;
achievedAt: Date | null;
notifiedAt: Date | null;
}[];
} & {
category: string | null;
id: string;
createdAt: Date;
updatedAt: Date;
status: string;
name: string;
userId: string;
currency: string;
description: string | null;
targetAmount: import("@prisma/client/runtime/library").Decimal;
targetDate: Date | null;
imageUrl: string | null;
teamId: string | null;
currentAmount: import("@prisma/client/runtime/library").Decimal;
completedAt: Date | null;
}>;
remove(req: any, id: string): Promise<{
message: string;
}>;
addAllocation(req: any, id: string, createAllocationDto: CreateAllocationDto): Promise<{
wallet: {
id: string;
createdAt: Date;
updatedAt: Date;
name: string;
userId: string;
kind: string;
currency: string | null;
unit: string | null;
deletedAt: Date | null;
initialAmount: import("@prisma/client/runtime/library").Decimal | null;
pricePerUnit: import("@prisma/client/runtime/library").Decimal | null;
reservedBalance: import("@prisma/client/runtime/library").Decimal;
};
} & {
id: string;
createdAt: Date;
currency: string;
amount: import("@prisma/client/runtime/library").Decimal;
walletId: string;
notes: string | null;
goalId: string;
exchangeRate: import("@prisma/client/runtime/library").Decimal | null;
amountInGoalCurrency: import("@prisma/client/runtime/library").Decimal;
createdBy: string;
}>;
removeAllocation(req: any, id: string, allocationId: string): Promise<{
message: string;
}>;
}

Some files were not shown because too many files have changed in this diff Show More