geek-custom-api-core 0.0.39 → 0.0.41

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.
Files changed (45) hide show
  1. package/.history/package_20260210022723.json +96 -0
  2. package/.history/package_20260213152745.json +96 -0
  3. package/.history/sql/{deposit_20260107014035.sql → deposit_20260210122921.sql} +1 -1
  4. package/.history/sql/{deposit_20260107014025.sql → deposit_20260210122922.sql} +3 -1
  5. package/.history/sql/{deposit_20260107014018.sql → deposit_20260210123015.sql} +6 -4
  6. package/.history/sql/{deposit_20260107014011.sql → deposit_20260210123203.sql} +9 -7
  7. package/.history/sql/deposit_20260212040156.sql +121 -0
  8. package/dist/common/filter/GlobalExceptionFilter.d.ts +2 -1
  9. package/dist/common/filter/GlobalExceptionFilter.js +63 -71
  10. package/dist/common/filter/GlobalExceptionFilter.js.map +1 -1
  11. package/dist/tsconfig.build.tsbuildinfo +1 -1
  12. package/dist/tsconfig.tsbuildinfo +1 -0
  13. package/package.json +1 -1
  14. package/sql/deposit.sql +5 -3
  15. package/.history/sql/deposit_20251227185545.sql +0 -0
  16. package/.history/sql/deposit_20251227185930.sql +0 -13
  17. package/.history/sql/deposit_20251227185933.sql +0 -13
  18. package/.history/sql/deposit_20251227190816.sql +0 -37
  19. package/.history/sql/deposit_20251227192700.sql +0 -61
  20. package/.history/sql/deposit_20251227192841.sql +0 -64
  21. package/.history/sql/deposit_20251227192941.sql +0 -50
  22. package/.history/sql/deposit_20251227193434.sql +0 -63
  23. package/.history/sql/deposit_20251227193642.sql +0 -63
  24. package/.history/sql/deposit_20251227193650.sql +0 -63
  25. package/.history/sql/deposit_20251227193750.sql +0 -63
  26. package/.history/sql/deposit_20251227193800.sql +0 -63
  27. package/.history/sql/deposit_20251227194014.sql +0 -75
  28. package/.history/sql/deposit_20251227194019.sql +0 -75
  29. package/.history/sql/deposit_20251227194022.sql +0 -75
  30. package/.history/sql/deposit_20251227194025.sql +0 -75
  31. package/.history/sql/deposit_20251227194104.sql +0 -68
  32. package/.history/sql/deposit_20251229182850.sql +0 -75
  33. package/.history/sql/deposit_20251229182900.sql +0 -75
  34. package/.history/sql/deposit_20251229182902.sql +0 -75
  35. package/.history/sql/deposit_20251229182929.sql +0 -76
  36. package/.history/sql/deposit_20251229182949.sql +0 -76
  37. package/.history/sql/deposit_20251229183054.sql +0 -75
  38. package/.history/sql/deposit_20251229183153.sql +0 -79
  39. package/.history/sql/deposit_20251229235124.sql +0 -79
  40. package/.history/sql/deposit_20251230000718.sql +0 -108
  41. package/.history/sql/deposit_20251230001700.sql +0 -110
  42. package/.history/sql/deposit_20251230001836.sql +0 -110
  43. package/.history/sql/deposit_20251230121407.sql +0 -111
  44. package/.history/sql/deposit_20260107000750.sql +0 -113
  45. package/.history/sql/deposit_20260107013938.sql +0 -115
@@ -0,0 +1,96 @@
1
+ {
2
+ "name": "geek-custom-api-core",
3
+ "version": "0.0.40",
4
+ "description": "",
5
+ "author": "",
6
+ "license": "UNLICENSED",
7
+ "main": "dist/index.js",
8
+ "types": "dist/index.d.ts",
9
+ "engines": {
10
+ "node": "18.x"
11
+ },
12
+ "scripts": {
13
+ "build": "nest build",
14
+ "format": "prettier --write \"src/**/*.ts\" \"test/**/*.ts\"",
15
+ "lint": "eslint \"{src,apps,libs,test}/**/*.ts\"",
16
+ "lint:fix": "eslint \"{src,apps,libs,test}/**/*.ts\" --fix",
17
+ "start": "nest start"
18
+ },
19
+ "dependencies": {
20
+ "@aws-sdk/client-s3": "^3.400.0",
21
+ "@aws-sdk/client-secrets-manager": "^3.939.0",
22
+ "@nestjs/axios": "^3.0.2",
23
+ "@nestjs/common": "^10.3.9",
24
+ "@nestjs/config": "^3.2.2",
25
+ "@nestjs/core": "^10.3.9",
26
+ "@nestjs/jwt": "^10.1.0",
27
+ "@nestjs/mapped-types": "^2.0.2",
28
+ "@nestjs/passport": "^10.0.0",
29
+ "@nestjs/platform-express": "^10.3.9",
30
+ "@nestjs/swagger": "^7.4.2",
31
+ "@nestjs/typeorm": "^10.0.0",
32
+ "axios": "^1.4.0",
33
+ "bcrypt": "^5.1.0",
34
+ "class-transformer": "^0.5.1",
35
+ "class-validator": "^0.14.0",
36
+ "date-fns": "^2.30.0",
37
+ "dayjs": "^1.11.10",
38
+ "fast-xml-parser": "^4.3.6",
39
+ "ioredis": "^5.4.1",
40
+ "moment": "^2.29.4",
41
+ "moment-timezone": "^0.5.46",
42
+ "multer-s3": "^3.0.1",
43
+ "mysql2": "^3.6.0",
44
+ "passport-jwt": "^4.0.1",
45
+ "reflect-metadata": "^0.1.13",
46
+ "rxjs": "^7.8.1",
47
+ "typeorm": "^0.3.17",
48
+ "uuid": "^9.0.1",
49
+ "xlsx": "^0.18.5"
50
+ },
51
+ "devDependencies": {
52
+ "@nestjs/cli": "^10.0.0",
53
+ "@nestjs/schematics": "^9.0.0",
54
+ "@types/bcrypt": "^5.0.0",
55
+ "@types/express": "^4.17.13",
56
+ "@types/jest": "^29.5.0",
57
+ "@types/multer": "^2.0.0",
58
+ "@types/node": "^18.19.0",
59
+ "@types/passport-jwt": "^3.0.9",
60
+ "@types/supertest": "^2.0.12",
61
+ "@typescript-eslint/eslint-plugin": "^7.18.0",
62
+ "@typescript-eslint/parser": "^7.18.0",
63
+ "eslint": "^8.57.0",
64
+ "eslint-config-prettier": "^9.1.0",
65
+ "eslint-plugin-prettier": "^5.0.0",
66
+ "jest": "^29.7.0",
67
+ "prettier": "^3.2.5",
68
+ "source-map-support": "^0.5.21",
69
+ "supertest": "^7.1.3",
70
+ "ts-jest": "^29.1.2",
71
+ "ts-loader": "^9.5.1",
72
+ "ts-node": "^10.9.2",
73
+ "tsconfig-paths": "^4.2.0",
74
+ "typescript": "^5.3.3",
75
+ "webpack": "^5.90.0",
76
+ "webpack-cli": "^5.1.4",
77
+ "webpack-node-externals": "^3.0.0"
78
+ },
79
+ "jest": {
80
+ "moduleFileExtensions": [
81
+ "js",
82
+ "json",
83
+ "ts"
84
+ ],
85
+ "rootDir": "src",
86
+ "testRegex": ".*\\.spec\\.ts$",
87
+ "transform": {
88
+ "^.+\\.(t|j)s$": "ts-jest"
89
+ },
90
+ "collectCoverageFrom": [
91
+ "**/*.(t|j)s"
92
+ ],
93
+ "coverageDirectory": "../coverage",
94
+ "testEnvironment": "node"
95
+ }
96
+ }
@@ -0,0 +1,96 @@
1
+ {
2
+ "name": "geek-custom-api-core",
3
+ "version": "0.0.41",
4
+ "description": "",
5
+ "author": "",
6
+ "license": "UNLICENSED",
7
+ "main": "dist/index.js",
8
+ "types": "dist/index.d.ts",
9
+ "engines": {
10
+ "node": "18.x"
11
+ },
12
+ "scripts": {
13
+ "build": "nest build",
14
+ "format": "prettier --write \"src/**/*.ts\" \"test/**/*.ts\"",
15
+ "lint": "eslint \"{src,apps,libs,test}/**/*.ts\"",
16
+ "lint:fix": "eslint \"{src,apps,libs,test}/**/*.ts\" --fix",
17
+ "start": "nest start"
18
+ },
19
+ "dependencies": {
20
+ "@aws-sdk/client-s3": "^3.400.0",
21
+ "@aws-sdk/client-secrets-manager": "^3.939.0",
22
+ "@nestjs/axios": "^3.0.2",
23
+ "@nestjs/common": "^10.3.9",
24
+ "@nestjs/config": "^3.2.2",
25
+ "@nestjs/core": "^10.3.9",
26
+ "@nestjs/jwt": "^10.1.0",
27
+ "@nestjs/mapped-types": "^2.0.2",
28
+ "@nestjs/passport": "^10.0.0",
29
+ "@nestjs/platform-express": "^10.3.9",
30
+ "@nestjs/swagger": "^7.4.2",
31
+ "@nestjs/typeorm": "^10.0.0",
32
+ "axios": "^1.4.0",
33
+ "bcrypt": "^5.1.0",
34
+ "class-transformer": "^0.5.1",
35
+ "class-validator": "^0.14.0",
36
+ "date-fns": "^2.30.0",
37
+ "dayjs": "^1.11.10",
38
+ "fast-xml-parser": "^4.3.6",
39
+ "ioredis": "^5.4.1",
40
+ "moment": "^2.29.4",
41
+ "moment-timezone": "^0.5.46",
42
+ "multer-s3": "^3.0.1",
43
+ "mysql2": "^3.6.0",
44
+ "passport-jwt": "^4.0.1",
45
+ "reflect-metadata": "^0.1.13",
46
+ "rxjs": "^7.8.1",
47
+ "typeorm": "^0.3.17",
48
+ "uuid": "^9.0.1",
49
+ "xlsx": "^0.18.5"
50
+ },
51
+ "devDependencies": {
52
+ "@nestjs/cli": "^10.0.0",
53
+ "@nestjs/schematics": "^9.0.0",
54
+ "@types/bcrypt": "^5.0.0",
55
+ "@types/express": "^4.17.13",
56
+ "@types/jest": "^29.5.0",
57
+ "@types/multer": "^2.0.0",
58
+ "@types/node": "^18.19.0",
59
+ "@types/passport-jwt": "^3.0.9",
60
+ "@types/supertest": "^2.0.12",
61
+ "@typescript-eslint/eslint-plugin": "^7.18.0",
62
+ "@typescript-eslint/parser": "^7.18.0",
63
+ "eslint": "^8.57.0",
64
+ "eslint-config-prettier": "^9.1.0",
65
+ "eslint-plugin-prettier": "^5.0.0",
66
+ "jest": "^29.7.0",
67
+ "prettier": "^3.2.5",
68
+ "source-map-support": "^0.5.21",
69
+ "supertest": "^7.1.3",
70
+ "ts-jest": "^29.1.2",
71
+ "ts-loader": "^9.5.1",
72
+ "ts-node": "^10.9.2",
73
+ "tsconfig-paths": "^4.2.0",
74
+ "typescript": "^5.3.3",
75
+ "webpack": "^5.90.0",
76
+ "webpack-cli": "^5.1.4",
77
+ "webpack-node-externals": "^3.0.0"
78
+ },
79
+ "jest": {
80
+ "moduleFileExtensions": [
81
+ "js",
82
+ "json",
83
+ "ts"
84
+ ],
85
+ "rootDir": "src",
86
+ "testRegex": ".*\\.spec\\.ts$",
87
+ "transform": {
88
+ "^.+\\.(t|j)s$": "ts-jest"
89
+ },
90
+ "collectCoverageFrom": [
91
+ "**/*.(t|j)s"
92
+ ],
93
+ "coverageDirectory": "../coverage",
94
+ "testEnvironment": "node"
95
+ }
96
+ }
@@ -108,7 +108,7 @@ CREATE TABLE gs_depositCoupon (
108
108
  policySno INT NOT NULL COMMENT '쿠폰 정책 번호',
109
109
  partnerSno INT NOT NULL COMMENT '고객사 번호',
110
110
  couponCode VARCHAR(20) NOT NULL COMMENT '랜덤 숫자 쿠폰 코드',
111
- usedFl ENUM('y','n') NOT NULL DEFAULT 'n' COMMENT '사용 여부',
111
+ usedFl ENUM('Y','N') NOT NULL DEFAULT 'N' COMMENT '사용 여부',
112
112
  memberNo INT NULL COMMENT '사용 회원',
113
113
  memberId VARCHAR(50) NULL COMMENT '회원 아이디',
114
114
  memberName VARCHAR(50) NULL COMMENT '회원명',
@@ -108,8 +108,10 @@ CREATE TABLE gs_depositCoupon (
108
108
  policySno INT NOT NULL COMMENT '쿠폰 정책 번호',
109
109
  partnerSno INT NOT NULL COMMENT '고객사 번호',
110
110
  couponCode VARCHAR(20) NOT NULL COMMENT '랜덤 숫자 쿠폰 코드',
111
- usedFl ENUM('y','n') NOT NULL DEFAULT 'n' COMMENT '사용 여부',
111
+ usedFl ENUM('Y','N') NOT NULL DEFAULT 'N' COMMENT '사용 여부',
112
112
  memberNo INT NULL COMMENT '사용 회원',
113
+ memberId VARCHAR(50) NULL COMMENT '회원 아이디',
114
+ memberName VARCHAR(50) NULL COMMENT '회원명',
113
115
  regDt TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
114
116
  updateDt TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '사용일',
115
117
  UNIQUE KEY uk_coupon_member (sno, memberNo),
@@ -2,8 +2,8 @@ CREATE TABLE gs_depositManager(
2
2
  sno INT PRIMARY KEY AUTO_INCREMENT,
3
3
  partnerSno INT NOT NULL COMMENT '고객사 번호',
4
4
  memberNo INT NOT NULL COMMENT '회원번호',
5
- memberId VARCHAR(50) NOT NULL COMMENT '회원 아이디',
6
- memberName VARCHAR(50) NOT NULL COMMENT '회원명',
5
+ memberId VARCHAR(50) NULL COMMENT '회원 아이디',
6
+ memberName VARCHAR(50) NULL COMMENT '회원명',
7
7
  depositType ENUM('ISSUE', 'USE', 'REFUND', 'ADJUST', 'EXPIRED') NOT NULL COMMENT '거래유형',
8
8
  source ENUM('ADMIN', 'ORDER', 'SYSTEM') NOT NULL DEFAULT 'ADMIN' COMMENT '발생 주체',
9
9
  managerSno INT NOT NULL COMMENT '관리자 번호',
@@ -98,7 +98,7 @@ CREATE TABLE gs_depositCouponManager (
98
98
  expireAfterDays INT NOT NULL COMMENT '등록 후 만료까지 일수 (n일)',
99
99
  issueLimit INT NULL COMMENT '총 발급 수량 (NULL = 무제한)',
100
100
  issueCount INT NOT NULL DEFAULT 0 COMMENT '발급된 수량',
101
- useFl ENUM('y','n') NOT NULL DEFAULT 'y' COMMENT '사용 여부',
101
+ usedFl ENUM('Y','N') NOT NULL DEFAULT 'N' COMMENT '사용 여부',
102
102
  regDt TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
103
103
  updateDt TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
104
104
  ) COMMENT='예치금 쿠폰 정책';
@@ -108,8 +108,10 @@ CREATE TABLE gs_depositCoupon (
108
108
  policySno INT NOT NULL COMMENT '쿠폰 정책 번호',
109
109
  partnerSno INT NOT NULL COMMENT '고객사 번호',
110
110
  couponCode VARCHAR(20) NOT NULL COMMENT '랜덤 숫자 쿠폰 코드',
111
- usedFl ENUM('y','n') NOT NULL DEFAULT 'n' COMMENT '사용 여부',
111
+ usedFl ENUM('Y','N') NOT NULL DEFAULT 'N' COMMENT '사용 여부',
112
112
  memberNo INT NULL COMMENT '사용 회원',
113
+ memberId VARCHAR(50) NULL COMMENT '회원 아이디',
114
+ memberName VARCHAR(50) NULL COMMENT '회원명',
113
115
  regDt TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
114
116
  updateDt TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '사용일',
115
117
  UNIQUE KEY uk_coupon_member (sno, memberNo),
@@ -2,8 +2,8 @@ CREATE TABLE gs_depositManager(
2
2
  sno INT PRIMARY KEY AUTO_INCREMENT,
3
3
  partnerSno INT NOT NULL COMMENT '고객사 번호',
4
4
  memberNo INT NOT NULL COMMENT '회원번호',
5
- memberId VARCHAR(50) NOT NULL COMMENT '회원 아이디',
6
- memberName VARCHAR(50) NOT NULL COMMENT '회원명',
5
+ memberId VARCHAR(50) NULL COMMENT '회원 아이디',
6
+ memberName VARCHAR(50) NULL COMMENT '회원명',
7
7
  depositType ENUM('ISSUE', 'USE', 'REFUND', 'ADJUST', 'EXPIRED') NOT NULL COMMENT '거래유형',
8
8
  source ENUM('ADMIN', 'ORDER', 'SYSTEM') NOT NULL DEFAULT 'ADMIN' COMMENT '발생 주체',
9
9
  managerSno INT NOT NULL COMMENT '관리자 번호',
@@ -36,15 +36,15 @@ CREATE TABLE gs_depositJobDetail(
36
36
  jobSno INT NOT NULL COMMENT '작업 번호',
37
37
  partnerSno INT NOT NULL COMMENT '고객사 번호',
38
38
  memberNo INT NOT NULL COMMENT '회원번호',
39
- memberId VARCHAR(50) NOT NULL COMMENT '회원 아이디',
40
- memberName VARCHAR(50) NOT NULL COMMENT '회원명',
39
+ memberId VARCHAR(50) NULL COMMENT '회원 아이디',
40
+ memberName VARCHAR(50) NULL COMMENT '회원명',
41
41
  depositAmount INT NOT NULL COMMENT '증감 금액 +,-',
42
42
  reason VARCHAR(200) NOT NULL COMMENT '사유',
43
43
  result ENUM('SUCCESS', 'FAIL') NOT NULL DEFAULT 'SUCCESS' COMMENT '결과',
44
44
  failReason TEXT NULL COMMENT '실패 사유',
45
45
  expiredDt TIMESTAMP NULL COMMENT '만료일시',
46
46
  couponSno INT NULL COMMENT '사용된 쿠폰 sno',
47
- expireFl ENUM('y','n') NOT NULL DEFAULT 'n' COMMENT '만료 처리 여부',
47
+ expireFl ENUM('Y','N') NOT NULL DEFAULT 'N' COMMENT '만료 처리 여부',
48
48
  regDt TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
49
49
  updateDt TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
50
50
  INDEX idx_job (jobSno),
@@ -98,7 +98,7 @@ CREATE TABLE gs_depositCouponManager (
98
98
  expireAfterDays INT NOT NULL COMMENT '등록 후 만료까지 일수 (n일)',
99
99
  issueLimit INT NULL COMMENT '총 발급 수량 (NULL = 무제한)',
100
100
  issueCount INT NOT NULL DEFAULT 0 COMMENT '발급된 수량',
101
- useFl ENUM('y','n') NOT NULL DEFAULT 'y' COMMENT '사용 여부',
101
+ usedFl ENUM('Y','N') NOT NULL DEFAULT 'N' COMMENT '사용 여부',
102
102
  regDt TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
103
103
  updateDt TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
104
104
  ) COMMENT='예치금 쿠폰 정책';
@@ -108,8 +108,10 @@ CREATE TABLE gs_depositCoupon (
108
108
  policySno INT NOT NULL COMMENT '쿠폰 정책 번호',
109
109
  partnerSno INT NOT NULL COMMENT '고객사 번호',
110
110
  couponCode VARCHAR(20) NOT NULL COMMENT '랜덤 숫자 쿠폰 코드',
111
- usedFl ENUM('y','n') NOT NULL DEFAULT 'n' COMMENT '사용 여부',
111
+ usedFl ENUM('Y','N') NOT NULL DEFAULT 'N' COMMENT '사용 여부',
112
112
  memberNo INT NULL COMMENT '사용 회원',
113
+ memberId VARCHAR(50) NULL COMMENT '회원 아이디',
114
+ memberName VARCHAR(50) NULL COMMENT '회원명',
113
115
  regDt TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
114
116
  updateDt TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '사용일',
115
117
  UNIQUE KEY uk_coupon_member (sno, memberNo),
@@ -0,0 +1,121 @@
1
+ CREATE TABLE gs_depositManager(
2
+ sno INT PRIMARY KEY AUTO_INCREMENT,
3
+ partnerSno INT NOT NULL COMMENT '고객사 번호',
4
+ memberNo INT NOT NULL COMMENT '회원번호',
5
+ memberId VARCHAR(50) NULL COMMENT '회원 아이디',
6
+ memberName VARCHAR(50) NULL COMMENT '회원명',
7
+ depositType ENUM('ISSUE', 'USE', 'REFUND', 'ADJUST', 'EXPIRED') NOT NULL COMMENT '거래유형',
8
+ source ENUM('ADMIN', 'ORDER', 'SYSTEM') NOT NULL DEFAULT 'ADMIN' COMMENT '발생 주체',
9
+ managerSno INT NOT NULL COMMENT '관리자 번호',
10
+ refType ENUM('JOB_DETAIL','ORDER','SYSTEM') NOT NULL COMMENT '참조 타입',
11
+ refSno INT NOT NULL COMMENT 'jobDetailSno 또는 주문 Sno',
12
+ depositAmount INT NOT NULL COMMENT '증감 금액 +,-',
13
+ balanceAfter INT NOT NULL COMMENT '거래 후 잔액',
14
+ reason VARCHAR(200) NOT NULL COMMENT '사유',
15
+ regDt TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
16
+ updateDt TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
17
+ INDEX idx_member_partner (partnerSno, memberNo, regDt)
18
+ )COMMENT='예치금 원장';
19
+
20
+ CREATE TABLE gs_depositJob(
21
+ sno INT PRIMARY KEY AUTO_INCREMENT,
22
+ jobName VARCHAR(100) NOT NULL COMMENT '작업명',
23
+ jobType ENUM('SINGLE','EXCEL') NOT NULL DEFAULT 'SINGLE' COMMENT '작업유형',
24
+ managerSno INT NOT NULL COMMENT '실행 관리자',
25
+ totalCount INT NOT NULL COMMENT '총 건수',
26
+ successCount INT NOT NULL COMMENT '성공 건수',
27
+ failCount INT NOT NULL COMMENT '실패 건수',
28
+ status ENUM('READY','PROCESSING','DONE') NOT NULL DEFAULT 'READY' COMMENT '작업 상태',
29
+ regDt TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
30
+ updateDt TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
31
+ )COMMENT='예치금 지급 작업';
32
+
33
+
34
+ CREATE TABLE gs_depositJobDetail(
35
+ sno INT PRIMARY KEY AUTO_INCREMENT,
36
+ jobSno INT NOT NULL COMMENT '작업 번호',
37
+ partnerSno INT NOT NULL COMMENT '고객사 번호',
38
+ memberNo INT NOT NULL COMMENT '회원번호',
39
+ memberId VARCHAR(50) NULL COMMENT '회원 아이디',
40
+ memberName VARCHAR(50) NULL COMMENT '회원명',
41
+ depositAmount INT NOT NULL COMMENT '증감 금액 +,-',
42
+ reason VARCHAR(200) NOT NULL COMMENT '사유',
43
+ result ENUM('SUCCESS', 'FAIL') NOT NULL DEFAULT 'SUCCESS' COMMENT '결과',
44
+ failReason TEXT NULL COMMENT '실패 사유',
45
+ expiredDt TIMESTAMP NULL COMMENT '만료일시',
46
+ couponSno INT NULL COMMENT '사용된 쿠폰 sno',
47
+ expireFl ENUM('Y','N') NOT NULL DEFAULT 'N' COMMENT '만료 처리 여부',
48
+ regDt TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
49
+ updateDt TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
50
+ INDEX idx_job (jobSno),
51
+ INDEX idx_member (memberNo),
52
+ INDEX idx_partner_member (partnerSno, memberNo),
53
+ INDEX idx_expire (expiredDt, expireFl)
54
+ )COMMENT='예치금 지급 단위';
55
+
56
+
57
+ CREATE TABLE gs_depositOrder (
58
+ sno INT PRIMARY KEY AUTO_INCREMENT,
59
+ orderNo VARCHAR(50) NOT NULL COMMENT '주문번호',
60
+ partnerSno INT NOT NULL COMMENT '고객사 번호',
61
+ memberNo INT NOT NULL COMMENT '회원번호',
62
+ memberId VARCHAR(50) NULL COMMENT '회원 아이디',
63
+ memberName VARCHAR(50) NULL COMMENT '회원명',
64
+ usedAmount INT NOT NULL COMMENT '사용 금액',
65
+ regDt TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
66
+ updateDt TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
67
+ )COMMENT='주문 예치금 사용 요약';
68
+
69
+ CREATE TABLE gs_depositOrderDetail (
70
+ sno BIGINT AUTO_INCREMENT PRIMARY KEY,
71
+ orderSno INT NOT NULL COMMENT '주문 번호',
72
+ partnerSno INT NOT NULL COMMENT '고객사 번호',
73
+ memberNo INT NOT NULL COMMENT '회원번호',
74
+ memberId VARCHAR(50) NULL COMMENT '회원 아이디',
75
+ memberName VARCHAR(50) NULL COMMENT '회원명',
76
+ orderGoodsNo VARCHAR(50) NOT NULL,
77
+ orderGoodsName VARCHAR(200) NOT NULL,
78
+ orderAmount INT NOT NULL COMMENT '안분 기준 주문 금액',
79
+ issueDetailSno INT NOT NULL COMMENT 'gs_depositJobDetail.sno',
80
+ usedDepositAmount INT NOT NULL COMMENT '해당 지급건에서 차감된 금액',
81
+ allocatedRatio DECIMAL(10,6) NOT NULL COMMENT '안분 비율',
82
+ allocatedAmount INT NOT NULL COMMENT '주문에 배정된 예치금',
83
+ expireDt TIMESTAMP NULL COMMENT '지급건 만료일 스냅샷',
84
+ refundYn ENUM('Y','N') NOT NULL DEFAULT 'N' COMMENT '환불 여부',
85
+ refundDt TIMESTAMP NULL COMMENT '환불일시',
86
+ regDt TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
87
+ updateDt TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
88
+ INDEX idx_member (memberNo),
89
+ INDEX idx_order (orderSno),
90
+ INDEX idx_issue (issueDetailSno)
91
+ );
92
+
93
+ CREATE TABLE gs_depositCouponManager (
94
+ sno INT PRIMARY KEY AUTO_INCREMENT,
95
+ partnerSno INT NOT NULL COMMENT '고객사 번호',
96
+ title VARCHAR(100) NOT NULL COMMENT '쿠폰명',
97
+ depositAmount INT NOT NULL COMMENT '지급 예치금',
98
+ registerStartDt TIMESTAMP NOT NULL COMMENT '쿠폰 등록 시작일',
99
+ registerEndDt TIMESTAMP NOT NULL COMMENT '쿠폰 등록 종료일',
100
+ expireAfterDays INT NOT NULL COMMENT '등록 후 만료까지 일수 (n일)',
101
+ issueLimit INT NULL COMMENT '총 발급 수량 (NULL = 무제한)',
102
+ issueCount INT NOT NULL DEFAULT 0 COMMENT '발급된 수량',
103
+ usedFl ENUM('Y','N') NOT NULL DEFAULT 'N' COMMENT '사용 여부',
104
+ regDt TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
105
+ updateDt TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
106
+ ) COMMENT='예치금 쿠폰 정책';
107
+
108
+ CREATE TABLE gs_depositCoupon (
109
+ sno INT PRIMARY KEY AUTO_INCREMENT,
110
+ policySno INT NOT NULL COMMENT '쿠폰 정책 번호',
111
+ partnerSno INT NOT NULL COMMENT '고객사 번호',
112
+ couponCode VARCHAR(20) NOT NULL COMMENT '랜덤 숫자 쿠폰 코드',
113
+ usedFl ENUM('Y','N') NOT NULL DEFAULT 'N' COMMENT '사용 여부',
114
+ memberNo INT NULL COMMENT '사용 회원',
115
+ memberId VARCHAR(50) NULL COMMENT '회원 아이디',
116
+ memberName VARCHAR(50) NULL COMMENT '회원명',
117
+ regDt TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
118
+ updateDt TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '사용일',
119
+ UNIQUE KEY uk_coupon_member (sno, memberNo),
120
+ INDEX idx_policy (policySno)
121
+ ) COMMENT='예치금 랜덤 쿠폰';
@@ -1,10 +1,11 @@
1
1
  import { ExceptionFilter, ArgumentsHost } from '@nestjs/common';
2
2
  import { JwtService } from '@nestjs/jwt';
3
+ import { Response } from 'express';
3
4
  import { GSExceptionService } from 'src/api/common/exception/exception.service';
4
5
  export declare class GlobalExceptionFilter implements ExceptionFilter {
5
6
  private readonly gsExceptionService;
6
7
  private readonly jwtService;
7
8
  constructor(gsExceptionService: GSExceptionService, jwtService: JwtService);
8
9
  private readonly logger;
9
- catch(exception: any, host: ArgumentsHost): Promise<void>;
10
+ catch(exception: any, host: ArgumentsHost): Promise<Response<any, Record<string, any>>>;
10
11
  }
@@ -23,88 +23,80 @@ let GlobalExceptionFilter = GlobalExceptionFilter_1 = class GlobalExceptionFilte
23
23
  this.logger = new common_1.Logger(GlobalExceptionFilter_1.name);
24
24
  }
25
25
  async catch(exception, host) {
26
- var _a, _b, _c;
27
- this.logger.error((exception === null || exception === void 0 ? void 0 : exception.message) || 'Unhandled exception', exception === null || exception === void 0 ? void 0 : exception.stack);
28
- if (exception.constructor === common_1.NotFoundException)
29
- return;
26
+ var _a, _b, _c, _d;
30
27
  const ctx = host.switchToHttp();
31
- const stack = exception.stack;
32
28
  const response = ctx.getResponse();
33
29
  const request = ctx.getRequest();
34
- const ip = ((_a = request.headers['x-forwarded-for']) === null || _a === void 0 ? void 0 : _a.toString().split(',')[0]) ||
30
+ const stack = ((_a = exception === null || exception === void 0 ? void 0 : exception.stack) === null || _a === void 0 ? void 0 : _a.toString()) || '';
31
+ this.logger.error((exception === null || exception === void 0 ? void 0 : exception.message) || 'Unhandled exception', stack);
32
+ if (exception instanceof common_1.NotFoundException)
33
+ return;
34
+ const ip = ((_b = request.headers['x-forwarded-for']) === null || _b === void 0 ? void 0 : _b.toString().split(',')[0]) ||
35
35
  request.socket.remoteAddress;
36
- const { authorization } = request.headers;
37
36
  let partnerSno = 0;
38
- if (authorization != null) {
39
- const accessToken = authorization.split(' ')[1];
40
- const decodeToken = this.jwtService.decode(accessToken, {
41
- complete: false,
42
- json: true,
43
- });
44
- partnerSno = (_b = decodeToken === null || decodeToken === void 0 ? void 0 : decodeToken.partnerSno) !== null && _b !== void 0 ? _b : 0;
37
+ try {
38
+ const { authorization } = request.headers;
39
+ if (authorization) {
40
+ const accessToken = authorization.split(' ')[1];
41
+ const decodeToken = this.jwtService.decode(accessToken);
42
+ partnerSno = (_c = decodeToken === null || decodeToken === void 0 ? void 0 : decodeToken.partnerSno) !== null && _c !== void 0 ? _c : 0;
43
+ }
44
+ }
45
+ catch (e) {
46
+ this.logger.warn('Failed to decode token in filter');
45
47
  }
46
48
  let status = common_1.HttpStatus.INTERNAL_SERVER_ERROR;
47
- let message = exception.message.message;
48
- let code = 'HttpException';
49
- switch (exception.constructor) {
50
- case common_1.HttpException:
51
- status = exception.getStatus();
52
- message = exception.message;
53
- break;
54
- case typeorm_1.QueryFailedError:
55
- status = common_1.HttpStatus.UNPROCESSABLE_ENTITY;
56
- message = exception.message;
57
- code = exception.code;
58
- break;
59
- case typeorm_1.EntityNotFoundError:
60
- status = common_1.HttpStatus.UNPROCESSABLE_ENTITY;
61
- message = exception.message;
62
- code = exception.code;
63
- break;
64
- case typeorm_1.CannotCreateEntityIdMapError:
65
- status = common_1.HttpStatus.UNPROCESSABLE_ENTITY;
66
- message = exception.message;
67
- code = exception.code;
68
- break;
69
- case common_1.UnauthorizedException:
70
- status = common_1.HttpStatus.UNAUTHORIZED;
71
- message = 'Unauthorized';
72
- break;
73
- case TypeError:
74
- status = common_1.HttpStatus.INTERNAL_SERVER_ERROR;
75
- message = exception.message;
76
- code = exception.code;
77
- break;
78
- default:
79
- status = common_1.HttpStatus.INTERNAL_SERVER_ERROR;
80
- message = exception;
49
+ let message = (exception === null || exception === void 0 ? void 0 : exception.message) || 'Internal server error';
50
+ let code = 'UNKNOWN_ERROR';
51
+ if (exception instanceof common_1.HttpException) {
52
+ status = exception.getStatus();
53
+ const res = exception.getResponse();
54
+ message =
55
+ typeof res === 'object'
56
+ ? res.message || JSON.stringify(res)
57
+ : res;
58
+ code = 'HttpException';
59
+ }
60
+ else if (exception instanceof typeorm_1.QueryFailedError ||
61
+ exception instanceof typeorm_1.EntityNotFoundError ||
62
+ exception instanceof typeorm_1.CannotCreateEntityIdMapError) {
63
+ status = common_1.HttpStatus.UNPROCESSABLE_ENTITY;
64
+ message = exception.message;
65
+ code = exception.code || 'DB_ERROR';
81
66
  }
82
- if (typeof message === 'object')
83
- message = JSON.stringify(message);
84
- if (typeof message === 'object' &&
85
- (message['response']['statusCode'] === 404 ||
86
- message['response']['statusCode'] === '404')) {
87
- response.status(status).json({
88
- statusCode: 404,
89
- message: message || 'Internal server error',
90
- timestamp: (0, date_fns_1.format)(new Date(), 'yyyy/M/d, h:mm:ss a'),
91
- path: request.url,
67
+ else if (exception instanceof common_1.UnauthorizedException) {
68
+ status = common_1.HttpStatus.UNAUTHORIZED;
69
+ message = 'Unauthorized';
70
+ code = 'UNAUTHORIZED';
71
+ }
72
+ else if (exception instanceof TypeError) {
73
+ status = common_1.HttpStatus.INTERNAL_SERVER_ERROR;
74
+ message = exception.message;
75
+ code = 'TYPE_ERROR';
76
+ }
77
+ if (!status || typeof status !== 'number') {
78
+ status = 500;
79
+ }
80
+ const displayMessage = typeof message === 'object' ? JSON.stringify(message) : message;
81
+ try {
82
+ await this.gsExceptionService.create({
83
+ partnerSno,
84
+ url: request.url,
85
+ request: JSON.stringify(request.body),
86
+ message: displayMessage,
87
+ trace: stack,
88
+ errorCode: status.toString(),
89
+ ip,
92
90
  });
93
91
  }
94
- await this.gsExceptionService.create({
95
- partnerSno: partnerSno,
96
- url: request.url,
97
- request: JSON.stringify(request.body),
98
- message: message,
99
- trace: stack.toString(),
100
- errorCode: (status === null || status === void 0 ? void 0 : status.toString()) || '500',
101
- ip,
102
- });
103
- await response.status(status).json({
92
+ catch (dbError) {
93
+ this.logger.error('Failed to log exception to DB', dbError.stack);
94
+ }
95
+ return response.status(status).json({
104
96
  statusCode: status,
105
- code: (_c = exception.response) === null || _c === void 0 ? void 0 : _c.code,
106
- message: message || 'Internal server error',
107
- trace: stack.toString(),
97
+ code: ((_d = exception.response) === null || _d === void 0 ? void 0 : _d.code) || code,
98
+ message: displayMessage,
99
+ trace: process.env.NODE_ENV === 'prod' ? undefined : stack,
108
100
  timestamp: (0, date_fns_1.format)(new Date(), 'yyyy/M/d, h:mm:ss a'),
109
101
  path: request.url,
110
102
  });
@@ -1 +1 @@
1
- {"version":3,"file":"GlobalExceptionFilter.js","sourceRoot":"","sources":["../../../src/common/filter/GlobalExceptionFilter.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"GlobalExceptionFilter.js","sourceRoot":"","sources":["../../../src/common/filter/GlobalExceptionFilter.ts"],"names":[],"mappings":"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"}