Skip to content

Commit 7de5f89

Browse files
authored
Merge pull request #588 from Lynndabel/lynn
nestera
2 parents c38b3aa + c381b30 commit 7de5f89

File tree

5 files changed

+476
-0
lines changed

5 files changed

+476
-0
lines changed
Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
import {
2+
Entity,
3+
Column,
4+
PrimaryGeneratedColumn,
5+
CreateDateColumn,
6+
UpdateDateColumn,
7+
ManyToOne,
8+
JoinColumn,
9+
Index,
10+
Unique,
11+
} from 'typeorm';
12+
import { GroupSavingsPool } from './group-savings-pool.entity';
13+
import { User } from '../../user/entities/user.entity';
14+
15+
export enum MemberRole {
16+
OWNER = 'OWNER',
17+
ADMIN = 'ADMIN',
18+
MEMBER = 'MEMBER',
19+
}
20+
21+
export enum MemberStatus {
22+
ACTIVE = 'ACTIVE',
23+
INACTIVE = 'INACTIVE',
24+
REMOVED = 'REMOVED',
25+
}
26+
27+
@Entity('group_pool_members')
28+
@Unique(['poolId', 'userId'])
29+
@Index(['poolId'])
30+
@Index(['userId'])
31+
export class GroupPoolMember {
32+
@PrimaryGeneratedColumn('uuid')
33+
id: string;
34+
35+
@Column('uuid')
36+
poolId: string;
37+
38+
@ManyToOne(() => GroupSavingsPool, { onDelete: 'CASCADE' })
39+
@JoinColumn({ name: 'poolId' })
40+
pool: GroupSavingsPool;
41+
42+
@Column('uuid')
43+
userId: string;
44+
45+
@ManyToOne(() => User, { onDelete: 'CASCADE' })
46+
@JoinColumn({ name: 'userId' })
47+
user: User;
48+
49+
@Column('varchar', { length: 60 })
50+
walletAddress: string;
51+
52+
@Column({
53+
type: 'enum',
54+
enum: MemberRole,
55+
default: MemberRole.MEMBER,
56+
})
57+
role: MemberRole;
58+
59+
@Column({
60+
type: 'enum',
61+
enum: MemberStatus,
62+
default: MemberStatus.ACTIVE,
63+
})
64+
status: MemberStatus;
65+
66+
@Column('decimal', { precision: 18, scale: 7, default: 0 })
67+
totalContributed: number;
68+
69+
@Column('decimal', { precision: 18, scale: 7, default: 0 })
70+
sharePercentage: number;
71+
72+
@Column('timestamp', { nullable: true })
73+
joinedAt: Date | null;
74+
75+
@Column('timestamp', { nullable: true })
76+
leftAt: Date | null;
77+
78+
@Column('varchar', { length: 255, nullable: true })
79+
leaveReason: string | null;
80+
81+
@Column('json', { nullable: true })
82+
metadata: Record<string, any> | null;
83+
84+
@CreateDateColumn()
85+
createdAt: Date;
86+
87+
@UpdateDateColumn()
88+
updatedAt: Date;
89+
}
Lines changed: 123 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,123 @@
1+
import {
2+
Entity,
3+
Column,
4+
PrimaryGeneratedColumn,
5+
CreateDateColumn,
6+
UpdateDateColumn,
7+
ManyToOne,
8+
JoinColumn,
9+
OneToMany,
10+
Index,
11+
} from 'typeorm';
12+
import { User } from '../../user/entities/user.entity';
13+
import { SavingsProduct } from './savings-product.entity';
14+
import { GroupPoolMember } from './group-pool-member.entity';
15+
import { MultiSigWithdrawalRequest } from './multi-sig-withdrawal-request.entity';
16+
import { SignatureEvent } from './signature-event.entity';
17+
18+
export enum PoolStatus {
19+
ACTIVE = 'ACTIVE',
20+
INACTIVE = 'INACTIVE',
21+
FROZEN = 'FROZEN',
22+
CLOSED = 'CLOSED',
23+
}
24+
25+
export enum PoolType {
26+
SAVINGS = 'SAVINGS',
27+
INVESTMENT = 'INVESTMENT',
28+
EMERGENCY_FUND = 'EMERGENCY_FUND',
29+
}
30+
31+
@Entity('group_savings_pools')
32+
@Index(['creatorId'])
33+
@Index(['productId'])
34+
@Index(['multisigAddress'])
35+
export class GroupSavingsPool {
36+
@PrimaryGeneratedColumn('uuid')
37+
id: string;
38+
39+
@Column('uuid')
40+
creatorId: string;
41+
42+
@ManyToOne(() => User, { onDelete: 'CASCADE' })
43+
@JoinColumn({ name: 'creatorId' })
44+
creator: User;
45+
46+
@Column('varchar', { length: 255 })
47+
name: string;
48+
49+
@Column('text', { nullable: true })
50+
description: string | null;
51+
52+
@Column('varchar', { length: 60 })
53+
multisigAddress: string;
54+
55+
@Column({
56+
type: 'enum',
57+
enum: PoolType,
58+
default: PoolType.SAVINGS,
59+
})
60+
poolType: PoolType;
61+
62+
@Column({
63+
type: 'enum',
64+
enum: PoolStatus,
65+
default: PoolStatus.ACTIVE,
66+
})
67+
status: PoolStatus;
68+
69+
@Column('int')
70+
requiredSignatures: number;
71+
72+
@Column('int')
73+
totalSigners: number;
74+
75+
@Column('decimal', { precision: 18, scale: 7, default: 0 })
76+
totalDeposits: number;
77+
78+
@Column('decimal', { precision: 18, scale: 7, default: 0 })
79+
currentBalance: number;
80+
81+
@Column('uuid')
82+
productId: string;
83+
84+
@ManyToOne(() => SavingsProduct, { onDelete: 'CASCADE' })
85+
@JoinColumn({ name: 'productId' })
86+
product: SavingsProduct;
87+
88+
@Column('decimal', { precision: 18, scale: 7, nullable: true })
89+
targetAmount: number | null;
90+
91+
@Column('timestamp', { nullable: true })
92+
targetDate: Date | null;
93+
94+
@Column('json', { nullable: true })
95+
metadata: Record<string, any> | null;
96+
97+
@Column('timestamp', { nullable: true })
98+
frozenAt: Date | null;
99+
100+
@Column('varchar', { length: 255, nullable: true })
101+
freezeReason: string | null;
102+
103+
@Column('timestamp', { nullable: true })
104+
closedAt: Date | null;
105+
106+
@Column('varchar', { length: 255, nullable: true })
107+
closeReason: string | null;
108+
109+
@CreateDateColumn()
110+
createdAt: Date;
111+
112+
@UpdateDateColumn()
113+
updatedAt: Date;
114+
115+
@OneToMany(() => GroupPoolMember, (member) => member.pool, { cascade: true })
116+
members: GroupPoolMember[];
117+
118+
@OneToMany(() => MultiSigWithdrawalRequest, (request) => request.pool, { cascade: true })
119+
withdrawalRequests: MultiSigWithdrawalRequest[];
120+
121+
@OneToMany(() => SignatureEvent, (event) => event.pool, { cascade: true })
122+
signatureEvents: SignatureEvent[];
123+
}
Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,104 @@
1+
import {
2+
Entity,
3+
Column,
4+
PrimaryGeneratedColumn,
5+
CreateDateColumn,
6+
UpdateDateColumn,
7+
ManyToOne,
8+
JoinColumn,
9+
OneToMany,
10+
Index,
11+
} from 'typeorm';
12+
import { GroupSavingsPool } from './group-savings-pool.entity';
13+
import { User } from '../../user/entities/user.entity';
14+
import { WithdrawalSignature } from './withdrawal-signature.entity';
15+
16+
export enum MultiSigWithdrawalStatus {
17+
PENDING = 'PENDING',
18+
APPROVED = 'APPROVED',
19+
REJECTED = 'REJECTED',
20+
EXECUTED = 'EXECUTED',
21+
FAILED = 'FAILED',
22+
EXPIRED = 'EXPIRED',
23+
}
24+
25+
@Entity('multi_sig_withdrawal_requests')
26+
@Index(['poolId'])
27+
@Index(['requesterId'])
28+
@Index(['status'])
29+
export class MultiSigWithdrawalRequest {
30+
@PrimaryGeneratedColumn('uuid')
31+
id: string;
32+
33+
@Column('uuid')
34+
poolId: string;
35+
36+
@ManyToOne(() => GroupSavingsPool, { onDelete: 'CASCADE' })
37+
@JoinColumn({ name: 'poolId' })
38+
pool: GroupSavingsPool;
39+
40+
@Column('uuid')
41+
requesterId: string;
42+
43+
@ManyToOne(() => User, { onDelete: 'CASCADE' })
44+
@JoinColumn({ name: 'requesterId' })
45+
requester: User;
46+
47+
@Column('varchar', { length: 60 })
48+
recipientAddress: string;
49+
50+
@Column('decimal', { precision: 18, scale: 7 })
51+
amount: number;
52+
53+
@Column('text', { nullable: true })
54+
reason: string | null;
55+
56+
@Column({
57+
type: 'enum',
58+
enum: MultiSigWithdrawalStatus,
59+
default: MultiSigWithdrawalStatus.PENDING,
60+
})
61+
status: MultiSigWithdrawalStatus;
62+
63+
@Column('int')
64+
requiredSignatures: number;
65+
66+
@Column('int', { default: 0 })
67+
currentSignatures: number;
68+
69+
@Column('timestamp', { nullable: true })
70+
expiresAt: Date | null;
71+
72+
@Column('timestamp', { nullable: true })
73+
approvedAt: Date | null;
74+
75+
@Column('timestamp', { nullable: true })
76+
executedAt: Date | null;
77+
78+
@Column('timestamp', { nullable: true })
79+
failedAt: Date | null;
80+
81+
@Column('varchar', { length: 255, nullable: true })
82+
failureReason: string | null;
83+
84+
@Column('varchar', { length: 64, nullable: true })
85+
transactionHash: string | null;
86+
87+
@Column('decimal', { precision: 18, scale: 7, nullable: true })
88+
transactionFee: number | null;
89+
90+
@Column('json', { nullable: true })
91+
stellarTransactionXdr: string | null;
92+
93+
@Column('json', { nullable: true })
94+
metadata: Record<string, any> | null;
95+
96+
@CreateDateColumn()
97+
createdAt: Date;
98+
99+
@UpdateDateColumn()
100+
updatedAt: Date;
101+
102+
@OneToMany(() => WithdrawalSignature, (signature) => signature.withdrawalRequest, { cascade: true })
103+
signatures: WithdrawalSignature[];
104+
}

0 commit comments

Comments
 (0)