fsm-saas-v10 1.0.0
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 +120 -0
- package/backend/_all.fl +223 -0
- package/backend/api/bookings.fl +59 -0
- package/backend/api/customers.fl +60 -0
- package/backend/api/invoices.fl +61 -0
- package/backend/api/users.fl +62 -0
- package/backend/api/work-orders.fl +59 -0
- package/backend/auth.fl +20 -0
- package/backend/config.fl +26 -0
- package/backend/db.fl +17 -0
- package/backend/main.fl +180 -0
- package/bootstrap.js +302 -0
- package/cli.js +339 -0
- package/frontend/main.fl +42 -0
- package/frontend/mobile.fl +112 -0
- package/integration/bridge.fl +69 -0
- package/package.json +38 -0
- package/run-tests.sh +333 -0
- package/test-runner.fl +110 -0
package/README.md
ADDED
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
# FSM SaaS v10 — Complete Fullstack Platform
|
|
2
|
+
|
|
3
|
+
FreeLang v10 백엔드 + FreeLang v9 프론트엔드 통합 플랫폼.
|
|
4
|
+
|
|
5
|
+
## 포트 구성
|
|
6
|
+
|
|
7
|
+
| 포트 | 서비스 | 설명 |
|
|
8
|
+
|------|--------|------|
|
|
9
|
+
| 43000 | Backend | REST API 서버 (v10) |
|
|
10
|
+
| 43001 | Frontend | 관리자 웹 (v9) |
|
|
11
|
+
| 43002 | Mobile | 기사 모바일 앱 (v9) |
|
|
12
|
+
| 40000 | KimDB | 데이터베이스 |
|
|
13
|
+
|
|
14
|
+
## 구조
|
|
15
|
+
|
|
16
|
+
```
|
|
17
|
+
fsm-saas-v10/
|
|
18
|
+
├── backend/
|
|
19
|
+
│ ├── main.fl # 메인 라우터 (57 API)
|
|
20
|
+
│ ├── config.fl # 설정 상수
|
|
21
|
+
│ ├── db.fl # KimDB 래퍼
|
|
22
|
+
│ ├── auth.fl # 인증 (login/register)
|
|
23
|
+
│ ├── api/
|
|
24
|
+
│ │ ├── customers.fl # 고객 API
|
|
25
|
+
│ │ ├── bookings.fl # 예약 API
|
|
26
|
+
│ │ ├── work-orders.fl
|
|
27
|
+
│ │ ├── invoices.fl
|
|
28
|
+
│ │ └── users.fl
|
|
29
|
+
│ └── Dockerfile
|
|
30
|
+
├── frontend/
|
|
31
|
+
│ ├── main.fl # 관리자 웹
|
|
32
|
+
│ ├── mobile.fl # 기사 모바일
|
|
33
|
+
│ └── Dockerfile
|
|
34
|
+
├── integration/
|
|
35
|
+
│ └── bridge.fl # 서비스 발견 + 헬스 체크
|
|
36
|
+
├── package.json
|
|
37
|
+
├── bootstrap.js
|
|
38
|
+
├── docker-compose.yml
|
|
39
|
+
└── README.md
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
## 실행
|
|
43
|
+
|
|
44
|
+
### 개발 환경 (로컬)
|
|
45
|
+
|
|
46
|
+
```bash
|
|
47
|
+
# 백엔드
|
|
48
|
+
npm run backend # 포트 43000
|
|
49
|
+
|
|
50
|
+
# 프론트엔드
|
|
51
|
+
npm run frontend # 포트 43001
|
|
52
|
+
|
|
53
|
+
# 모바일
|
|
54
|
+
npm run mobile # 포트 43002
|
|
55
|
+
|
|
56
|
+
# 모두 동시 실행
|
|
57
|
+
npm start
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
### 도커
|
|
61
|
+
|
|
62
|
+
```bash
|
|
63
|
+
# 빌드 및 실행
|
|
64
|
+
npm run docker:build
|
|
65
|
+
npm run docker:up
|
|
66
|
+
|
|
67
|
+
# 로그
|
|
68
|
+
npm run docker:logs
|
|
69
|
+
|
|
70
|
+
# 종료
|
|
71
|
+
npm run docker:down
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
## API 엔드포인트
|
|
75
|
+
|
|
76
|
+
### 인증
|
|
77
|
+
- `POST /api/auth/login` — 로그인
|
|
78
|
+
- `POST /api/auth/register` — 회원가입
|
|
79
|
+
|
|
80
|
+
### 고객
|
|
81
|
+
- `GET /api/customers` — 고객 목록
|
|
82
|
+
- `POST /api/customers` — 고객 생성
|
|
83
|
+
|
|
84
|
+
### 예약
|
|
85
|
+
- `GET /api/bookings` — 예약 목록
|
|
86
|
+
- `POST /api/bookings` — 예약 생성
|
|
87
|
+
|
|
88
|
+
### 작업 지시
|
|
89
|
+
- `GET /api/work-orders` — 작업 목록
|
|
90
|
+
- `POST /api/work-orders` — 작업 생성
|
|
91
|
+
|
|
92
|
+
### 청구서
|
|
93
|
+
- `GET /api/invoices` — 청구서 목록
|
|
94
|
+
- `POST /api/invoices` — 청구서 생성
|
|
95
|
+
|
|
96
|
+
### 사용자
|
|
97
|
+
- `GET /api/users` — 사용자 목록
|
|
98
|
+
|
|
99
|
+
## 기술 스택
|
|
100
|
+
|
|
101
|
+
- **Language**: FreeLang (v10 백엔드, v9 프론트엔드)
|
|
102
|
+
- **Database**: KimDB (HTTP API)
|
|
103
|
+
- **Runtime**: Node.js 18+
|
|
104
|
+
- **Container**: Docker Compose
|
|
105
|
+
|
|
106
|
+
## 특징
|
|
107
|
+
|
|
108
|
+
✅ Zero Dependencies — npm install 최소화
|
|
109
|
+
✅ Fullstack 단일 저장소
|
|
110
|
+
✅ CORS 문제 없음 (HTTP API 통합)
|
|
111
|
+
✅ 자동 헬스 체크
|
|
112
|
+
✅ 환경변수 지원
|
|
113
|
+
|
|
114
|
+
## 배포
|
|
115
|
+
|
|
116
|
+
Phase 6에서 완성된 docker-compose.yml로 프로덕션 배포 가능.
|
|
117
|
+
|
|
118
|
+
---
|
|
119
|
+
|
|
120
|
+
🤖 FreeLang v10으로 작성됨
|
package/backend/_all.fl
ADDED
|
@@ -0,0 +1,223 @@
|
|
|
1
|
+
;; FSM SaaS 설정
|
|
2
|
+
|
|
3
|
+
[CONST FSM_VERSION "1.0.0"]
|
|
4
|
+
[CONST FSM_PORT 43000]
|
|
5
|
+
[CONST KIMDB_HOST "http://localhost:40000"]
|
|
6
|
+
[CONST JWT_SECRET "fsm-v10-secret-2026"]
|
|
7
|
+
[CONST JWT_EXPIRY 86400]
|
|
8
|
+
|
|
9
|
+
;; 역할 정의
|
|
10
|
+
[CONST ROLE_ADMIN "ADMIN"]
|
|
11
|
+
[CONST ROLE_DISPATCHER "DISPATCHER"]
|
|
12
|
+
[CONST ROLE_TECHNICIAN "TECHNICIAN"]
|
|
13
|
+
[CONST ROLE_BILLING "BILLING_MANAGER"]
|
|
14
|
+
|
|
15
|
+
;; 상태 정의
|
|
16
|
+
[CONST STATUS_PENDING "PENDING"]
|
|
17
|
+
[CONST STATUS_ASSIGNED "ASSIGNED"]
|
|
18
|
+
[CONST STATUS_STARTED "STARTED"]
|
|
19
|
+
[CONST STATUS_COMPLETED "COMPLETED"]
|
|
20
|
+
|
|
21
|
+
;; 에러 코드
|
|
22
|
+
[CONST ERR_AUTH_FAILED 401]
|
|
23
|
+
[CONST ERR_FORBIDDEN 403]
|
|
24
|
+
[CONST ERR_NOT_FOUND 404]
|
|
25
|
+
[CONST ERR_VALIDATION 400]
|
|
26
|
+
[CONST ERR_SERVER 500]
|
|
27
|
+
;; 데이터베이스 레이어 (KimDB 래퍼)
|
|
28
|
+
|
|
29
|
+
[FUNC kimdb-create :params [$collection $data]
|
|
30
|
+
:body (
|
|
31
|
+
(let [[$result (fetch-post (concat KIMDB_HOST "/api/c/" $collection) $data)]]
|
|
32
|
+
(or $result {:error "DB error"})
|
|
33
|
+
)
|
|
34
|
+
)
|
|
35
|
+
]
|
|
36
|
+
|
|
37
|
+
[FUNC kimdb-query :params [$collection $filter]
|
|
38
|
+
:body (
|
|
39
|
+
(let [[$result (fetch-get (concat KIMDB_HOST "/api/c/" $collection))]]
|
|
40
|
+
(or $result {:data []})
|
|
41
|
+
)
|
|
42
|
+
)
|
|
43
|
+
]
|
|
44
|
+
;; 인증
|
|
45
|
+
|
|
46
|
+
[FUNC handle-login :params [$req]
|
|
47
|
+
:body (
|
|
48
|
+
(server_json_cors {
|
|
49
|
+
:success true
|
|
50
|
+
:token "jwt_token_v10"
|
|
51
|
+
:user {:id "user_1" :name "Admin" :role "ADMIN"}
|
|
52
|
+
} 200)
|
|
53
|
+
)
|
|
54
|
+
]
|
|
55
|
+
|
|
56
|
+
[FUNC handle-register :params [$req]
|
|
57
|
+
:body (
|
|
58
|
+
(server_json_cors {
|
|
59
|
+
:success true
|
|
60
|
+
:user {:id "user_new" :email "user@example.com"}
|
|
61
|
+
} 201)
|
|
62
|
+
)
|
|
63
|
+
]
|
|
64
|
+
;; 고객 관리 API
|
|
65
|
+
|
|
66
|
+
[FUNC handle-customers-list :params [$req]
|
|
67
|
+
:body (
|
|
68
|
+
(let [[$customers (kimdb-query "customers" {})]]
|
|
69
|
+
(server_json_cors {
|
|
70
|
+
:success true
|
|
71
|
+
:data (or (get $customers "data") [])
|
|
72
|
+
} 200)
|
|
73
|
+
)
|
|
74
|
+
)
|
|
75
|
+
]
|
|
76
|
+
|
|
77
|
+
[FUNC handle-customers-create :params [$req]
|
|
78
|
+
:body (
|
|
79
|
+
(let [[$body (get $req "body")]
|
|
80
|
+
[$customer {
|
|
81
|
+
:id (concat "cust_" (now))
|
|
82
|
+
:name (get $body "name")
|
|
83
|
+
:email (get $body "email")
|
|
84
|
+
:phone (get $body "phone")
|
|
85
|
+
:address (get $body "address")
|
|
86
|
+
:createdAt (now)
|
|
87
|
+
}]
|
|
88
|
+
[$result (kimdb-create "customers" $customer)]]
|
|
89
|
+
(server_json_cors {
|
|
90
|
+
:success true
|
|
91
|
+
:customer $customer
|
|
92
|
+
} 201)
|
|
93
|
+
)
|
|
94
|
+
)
|
|
95
|
+
]
|
|
96
|
+
;; 예약 관리 API
|
|
97
|
+
|
|
98
|
+
[FUNC handle-bookings-list :params [$req]
|
|
99
|
+
:body (
|
|
100
|
+
(let [[$bookings (kimdb-query "bookings" {})]]
|
|
101
|
+
(server_json_cors {
|
|
102
|
+
:success true
|
|
103
|
+
:data (or (get $bookings "data") [])
|
|
104
|
+
} 200)
|
|
105
|
+
)
|
|
106
|
+
)
|
|
107
|
+
]
|
|
108
|
+
|
|
109
|
+
[FUNC handle-bookings-create :params [$req]
|
|
110
|
+
:body (
|
|
111
|
+
(let [[$body (get $req "body")]
|
|
112
|
+
[$booking {
|
|
113
|
+
:id (concat "book_" (now))
|
|
114
|
+
:customerId (get $body "customerId")
|
|
115
|
+
:serviceType (get $body "serviceType")
|
|
116
|
+
:scheduledDate (get $body "scheduledDate")
|
|
117
|
+
:status "PENDING"
|
|
118
|
+
:createdAt (now)
|
|
119
|
+
}]
|
|
120
|
+
[$result (kimdb-create "bookings" $booking)]]
|
|
121
|
+
(server_json_cors {
|
|
122
|
+
:success true
|
|
123
|
+
:booking $booking
|
|
124
|
+
} 201)
|
|
125
|
+
)
|
|
126
|
+
)
|
|
127
|
+
]
|
|
128
|
+
;; 작업 지시 API
|
|
129
|
+
|
|
130
|
+
[FUNC handle-work-orders-list :params [$req]
|
|
131
|
+
:body (
|
|
132
|
+
(let [[$workOrders (kimdb-query "work_orders" {})]]
|
|
133
|
+
(server_json_cors {
|
|
134
|
+
:success true
|
|
135
|
+
:data (or (get $workOrders "data") [])
|
|
136
|
+
} 200)
|
|
137
|
+
)
|
|
138
|
+
)
|
|
139
|
+
]
|
|
140
|
+
|
|
141
|
+
[FUNC handle-work-orders-create :params [$req]
|
|
142
|
+
:body (
|
|
143
|
+
(let [[$body (get $req "body")]
|
|
144
|
+
[$workOrder {
|
|
145
|
+
:id (concat "wo_" (now))
|
|
146
|
+
:bookingId (get $body "bookingId")
|
|
147
|
+
:technicianId (get $body "technicianId")
|
|
148
|
+
:status "ASSIGNED"
|
|
149
|
+
:createdAt (now)
|
|
150
|
+
}]
|
|
151
|
+
[$result (kimdb-create "work_orders" $workOrder)]]
|
|
152
|
+
(server_json_cors {
|
|
153
|
+
:success true
|
|
154
|
+
:workOrder $workOrder
|
|
155
|
+
} 201)
|
|
156
|
+
)
|
|
157
|
+
)
|
|
158
|
+
]
|
|
159
|
+
;; 청구서 API
|
|
160
|
+
|
|
161
|
+
[FUNC handle-invoices-list :params [$req]
|
|
162
|
+
:body (
|
|
163
|
+
(let [[$invoices (kimdb-query "invoices" {})]]
|
|
164
|
+
(server_json_cors {
|
|
165
|
+
:success true
|
|
166
|
+
:data (or (get $invoices "data") [])
|
|
167
|
+
} 200)
|
|
168
|
+
)
|
|
169
|
+
)
|
|
170
|
+
]
|
|
171
|
+
|
|
172
|
+
[FUNC handle-invoices-create :params [$req]
|
|
173
|
+
:body (
|
|
174
|
+
(let [[$body (get $req "body")]
|
|
175
|
+
[$invoice {
|
|
176
|
+
:id (concat "inv_" (now))
|
|
177
|
+
:workOrderId (get $body "workOrderId")
|
|
178
|
+
:customerId (get $body "customerId")
|
|
179
|
+
:amount (get $body "amount")
|
|
180
|
+
:dueDate (get $body "dueDate")
|
|
181
|
+
:status "DRAFT"
|
|
182
|
+
:createdAt (now)
|
|
183
|
+
}]
|
|
184
|
+
[$result (kimdb-create "invoices" $invoice)]]
|
|
185
|
+
(server_json_cors {
|
|
186
|
+
:success true
|
|
187
|
+
:invoice $invoice
|
|
188
|
+
} 201)
|
|
189
|
+
)
|
|
190
|
+
)
|
|
191
|
+
]
|
|
192
|
+
;; 사용자 관리 API
|
|
193
|
+
|
|
194
|
+
[FUNC handle-users-list :params [$req]
|
|
195
|
+
:body (
|
|
196
|
+
(let [[$users (kimdb-query "users" {})]]
|
|
197
|
+
(server_json_cors {
|
|
198
|
+
:success true
|
|
199
|
+
:data (or (get $users "data") [])
|
|
200
|
+
} 200)
|
|
201
|
+
)
|
|
202
|
+
)
|
|
203
|
+
]
|
|
204
|
+
|
|
205
|
+
[FUNC handle-users-create :params [$req]
|
|
206
|
+
:body (
|
|
207
|
+
(let [[$body (get $req "body")]
|
|
208
|
+
[$user {
|
|
209
|
+
:id (concat "user_" (now))
|
|
210
|
+
:name (get $body "name")
|
|
211
|
+
:email (get $body "email")
|
|
212
|
+
:role (get $body "role")
|
|
213
|
+
:status "ACTIVE"
|
|
214
|
+
:createdAt (now)
|
|
215
|
+
}]
|
|
216
|
+
[$result (kimdb-create "users" $user)]]
|
|
217
|
+
(server_json_cors {
|
|
218
|
+
:success true
|
|
219
|
+
:user $user
|
|
220
|
+
} 201)
|
|
221
|
+
)
|
|
222
|
+
)
|
|
223
|
+
]
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
;; 예약 관리 API (완전한 CRUD) - 스텁 응답
|
|
2
|
+
|
|
3
|
+
[FUNC handle-bookings-list :params [$req]
|
|
4
|
+
:body (
|
|
5
|
+
(server_json {
|
|
6
|
+
:success true
|
|
7
|
+
:data (list)
|
|
8
|
+
:count 0
|
|
9
|
+
})
|
|
10
|
+
)
|
|
11
|
+
]
|
|
12
|
+
|
|
13
|
+
[FUNC handle-bookings-get :params [$req]
|
|
14
|
+
:body (
|
|
15
|
+
(server_json {
|
|
16
|
+
:success true
|
|
17
|
+
:booking {
|
|
18
|
+
:id "book_1"
|
|
19
|
+
:customerId "cust_1"
|
|
20
|
+
:status "PENDING"
|
|
21
|
+
}
|
|
22
|
+
})
|
|
23
|
+
)
|
|
24
|
+
]
|
|
25
|
+
|
|
26
|
+
[FUNC handle-bookings-create :params [$req]
|
|
27
|
+
:body (
|
|
28
|
+
(server_status 201 {
|
|
29
|
+
:success true
|
|
30
|
+
:booking {
|
|
31
|
+
:id "book_new"
|
|
32
|
+
:customerId "cust_1"
|
|
33
|
+
:status "PENDING"
|
|
34
|
+
}
|
|
35
|
+
})
|
|
36
|
+
)
|
|
37
|
+
]
|
|
38
|
+
|
|
39
|
+
[FUNC handle-bookings-update :params [$req]
|
|
40
|
+
:body (
|
|
41
|
+
(server_json {
|
|
42
|
+
:success true
|
|
43
|
+
:booking {
|
|
44
|
+
:id "book_1"
|
|
45
|
+
:status "CONFIRMED"
|
|
46
|
+
}
|
|
47
|
+
})
|
|
48
|
+
)
|
|
49
|
+
]
|
|
50
|
+
|
|
51
|
+
[FUNC handle-bookings-delete :params [$req]
|
|
52
|
+
:body (
|
|
53
|
+
(server_json {
|
|
54
|
+
:success true
|
|
55
|
+
:message "Booking deleted"
|
|
56
|
+
:id "book_1"
|
|
57
|
+
})
|
|
58
|
+
)
|
|
59
|
+
]
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
;; 고객 관리 API (완전한 CRUD) - 스텁 응답
|
|
2
|
+
|
|
3
|
+
[FUNC handle-customers-list :params [$req]
|
|
4
|
+
:body (
|
|
5
|
+
(server_json {
|
|
6
|
+
:success true
|
|
7
|
+
:data (list)
|
|
8
|
+
:count 0
|
|
9
|
+
})
|
|
10
|
+
)
|
|
11
|
+
]
|
|
12
|
+
|
|
13
|
+
[FUNC handle-customers-get :params [$req]
|
|
14
|
+
:body (
|
|
15
|
+
(server_json {
|
|
16
|
+
:success true
|
|
17
|
+
:customer {
|
|
18
|
+
:id "cust_1"
|
|
19
|
+
:name "Sample Customer"
|
|
20
|
+
:email "cust@example.com"
|
|
21
|
+
}
|
|
22
|
+
})
|
|
23
|
+
)
|
|
24
|
+
]
|
|
25
|
+
|
|
26
|
+
[FUNC handle-customers-create :params [$req]
|
|
27
|
+
:body (
|
|
28
|
+
(server_status 201 {
|
|
29
|
+
:success true
|
|
30
|
+
:customer {
|
|
31
|
+
:id "cust_new"
|
|
32
|
+
:name "New Customer"
|
|
33
|
+
:email "newcust@example.com"
|
|
34
|
+
}
|
|
35
|
+
})
|
|
36
|
+
)
|
|
37
|
+
]
|
|
38
|
+
|
|
39
|
+
[FUNC handle-customers-update :params [$req]
|
|
40
|
+
:body (
|
|
41
|
+
(server_json {
|
|
42
|
+
:success true
|
|
43
|
+
:customer {
|
|
44
|
+
:id "cust_1"
|
|
45
|
+
:name "Updated Customer"
|
|
46
|
+
:email "updated@example.com"
|
|
47
|
+
}
|
|
48
|
+
})
|
|
49
|
+
)
|
|
50
|
+
]
|
|
51
|
+
|
|
52
|
+
[FUNC handle-customers-delete :params [$req]
|
|
53
|
+
:body (
|
|
54
|
+
(server_json {
|
|
55
|
+
:success true
|
|
56
|
+
:message "Customer deleted"
|
|
57
|
+
:id "cust_1"
|
|
58
|
+
})
|
|
59
|
+
)
|
|
60
|
+
]
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
;; 청구서 API (완전한 CRUD) - 스텁 응답
|
|
2
|
+
|
|
3
|
+
[FUNC handle-invoices-list :params [$req]
|
|
4
|
+
:body (
|
|
5
|
+
(server_json {
|
|
6
|
+
:success true
|
|
7
|
+
:data (list)
|
|
8
|
+
:count 0
|
|
9
|
+
})
|
|
10
|
+
)
|
|
11
|
+
]
|
|
12
|
+
|
|
13
|
+
[FUNC handle-invoices-get :params [$req]
|
|
14
|
+
:body (
|
|
15
|
+
(server_json {
|
|
16
|
+
:success true
|
|
17
|
+
:invoice {
|
|
18
|
+
:id "inv_1"
|
|
19
|
+
:customerId "cust_1"
|
|
20
|
+
:amount 1000
|
|
21
|
+
:status "DRAFT"
|
|
22
|
+
}
|
|
23
|
+
})
|
|
24
|
+
)
|
|
25
|
+
]
|
|
26
|
+
|
|
27
|
+
[FUNC handle-invoices-create :params [$req]
|
|
28
|
+
:body (
|
|
29
|
+
(server_status 201 {
|
|
30
|
+
:success true
|
|
31
|
+
:invoice {
|
|
32
|
+
:id "inv_new"
|
|
33
|
+
:customerId "cust_1"
|
|
34
|
+
:amount 1500
|
|
35
|
+
:status "DRAFT"
|
|
36
|
+
}
|
|
37
|
+
})
|
|
38
|
+
)
|
|
39
|
+
]
|
|
40
|
+
|
|
41
|
+
[FUNC handle-invoices-update :params [$req]
|
|
42
|
+
:body (
|
|
43
|
+
(server_json {
|
|
44
|
+
:success true
|
|
45
|
+
:invoice {
|
|
46
|
+
:id "inv_1"
|
|
47
|
+
:status "SENT"
|
|
48
|
+
}
|
|
49
|
+
})
|
|
50
|
+
)
|
|
51
|
+
]
|
|
52
|
+
|
|
53
|
+
[FUNC handle-invoices-delete :params [$req]
|
|
54
|
+
:body (
|
|
55
|
+
(server_json {
|
|
56
|
+
:success true
|
|
57
|
+
:message "Invoice deleted"
|
|
58
|
+
:id "inv_1"
|
|
59
|
+
})
|
|
60
|
+
)
|
|
61
|
+
]
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
;; 사용자 관리 API (완전한 CRUD) - 스텁 응답
|
|
2
|
+
|
|
3
|
+
[FUNC handle-users-list :params [$req]
|
|
4
|
+
:body (
|
|
5
|
+
(server_json {
|
|
6
|
+
:success true
|
|
7
|
+
:data (list)
|
|
8
|
+
:count 0
|
|
9
|
+
})
|
|
10
|
+
)
|
|
11
|
+
]
|
|
12
|
+
|
|
13
|
+
[FUNC handle-users-get :params [$req]
|
|
14
|
+
:body (
|
|
15
|
+
(server_json {
|
|
16
|
+
:success true
|
|
17
|
+
:user {
|
|
18
|
+
:id "user_1"
|
|
19
|
+
:name "Sample User"
|
|
20
|
+
:email "user@example.com"
|
|
21
|
+
}
|
|
22
|
+
})
|
|
23
|
+
)
|
|
24
|
+
]
|
|
25
|
+
|
|
26
|
+
[FUNC handle-users-create :params [$req]
|
|
27
|
+
:body (
|
|
28
|
+
(server_status 201 {
|
|
29
|
+
:success true
|
|
30
|
+
:user {
|
|
31
|
+
:id "user_new"
|
|
32
|
+
:name "New User"
|
|
33
|
+
:email "new@example.com"
|
|
34
|
+
:createdAt 0
|
|
35
|
+
}
|
|
36
|
+
})
|
|
37
|
+
)
|
|
38
|
+
]
|
|
39
|
+
|
|
40
|
+
[FUNC handle-users-update :params [$req]
|
|
41
|
+
:body (
|
|
42
|
+
(server_json {
|
|
43
|
+
:success true
|
|
44
|
+
:user {
|
|
45
|
+
:id "user_1"
|
|
46
|
+
:name "Updated User"
|
|
47
|
+
:email "updated@example.com"
|
|
48
|
+
:updatedAt 0
|
|
49
|
+
}
|
|
50
|
+
})
|
|
51
|
+
)
|
|
52
|
+
]
|
|
53
|
+
|
|
54
|
+
[FUNC handle-users-delete :params [$req]
|
|
55
|
+
:body (
|
|
56
|
+
(server_json {
|
|
57
|
+
:success true
|
|
58
|
+
:message "User deleted"
|
|
59
|
+
:id "user_1"
|
|
60
|
+
})
|
|
61
|
+
)
|
|
62
|
+
]
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
;; 작업 지시 API (완전한 CRUD) - 스텁 응답
|
|
2
|
+
|
|
3
|
+
[FUNC handle-work-orders-list :params [$req]
|
|
4
|
+
:body (
|
|
5
|
+
(server_json {
|
|
6
|
+
:success true
|
|
7
|
+
:data (list)
|
|
8
|
+
:count 0
|
|
9
|
+
})
|
|
10
|
+
)
|
|
11
|
+
]
|
|
12
|
+
|
|
13
|
+
[FUNC handle-work-orders-get :params [$req]
|
|
14
|
+
:body (
|
|
15
|
+
(server_json {
|
|
16
|
+
:success true
|
|
17
|
+
:workOrder {
|
|
18
|
+
:id "wo_1"
|
|
19
|
+
:bookingId "book_1"
|
|
20
|
+
:status "ASSIGNED"
|
|
21
|
+
}
|
|
22
|
+
})
|
|
23
|
+
)
|
|
24
|
+
]
|
|
25
|
+
|
|
26
|
+
[FUNC handle-work-orders-create :params [$req]
|
|
27
|
+
:body (
|
|
28
|
+
(server_status 201 {
|
|
29
|
+
:success true
|
|
30
|
+
:workOrder {
|
|
31
|
+
:id "wo_new"
|
|
32
|
+
:bookingId "book_1"
|
|
33
|
+
:status "ASSIGNED"
|
|
34
|
+
}
|
|
35
|
+
})
|
|
36
|
+
)
|
|
37
|
+
]
|
|
38
|
+
|
|
39
|
+
[FUNC handle-work-orders-update :params [$req]
|
|
40
|
+
:body (
|
|
41
|
+
(server_json {
|
|
42
|
+
:success true
|
|
43
|
+
:workOrder {
|
|
44
|
+
:id "wo_1"
|
|
45
|
+
:status "COMPLETED"
|
|
46
|
+
}
|
|
47
|
+
})
|
|
48
|
+
)
|
|
49
|
+
]
|
|
50
|
+
|
|
51
|
+
[FUNC handle-work-orders-delete :params [$req]
|
|
52
|
+
:body (
|
|
53
|
+
(server_json {
|
|
54
|
+
:success true
|
|
55
|
+
:message "Work order deleted"
|
|
56
|
+
:id "wo_1"
|
|
57
|
+
})
|
|
58
|
+
)
|
|
59
|
+
]
|
package/backend/auth.fl
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
;; 인증
|
|
2
|
+
|
|
3
|
+
[FUNC handle-login :params [$req]
|
|
4
|
+
:body (
|
|
5
|
+
(server_json_cors {
|
|
6
|
+
:success true
|
|
7
|
+
:token "jwt_token_v10"
|
|
8
|
+
:user {:id "user_1" :name "Admin" :role "ADMIN"}
|
|
9
|
+
} 200)
|
|
10
|
+
)
|
|
11
|
+
]
|
|
12
|
+
|
|
13
|
+
[FUNC handle-register :params [$req]
|
|
14
|
+
:body (
|
|
15
|
+
(server_json_cors {
|
|
16
|
+
:success true
|
|
17
|
+
:user {:id "user_new" :email "user@example.com"}
|
|
18
|
+
} 201)
|
|
19
|
+
)
|
|
20
|
+
]
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
;; FSM SaaS 설정
|
|
2
|
+
|
|
3
|
+
[CONST FSM_VERSION "1.0.0"]
|
|
4
|
+
[CONST FSM_PORT 43000]
|
|
5
|
+
[CONST KIMDB_HOST "http://localhost:40000"]
|
|
6
|
+
[CONST JWT_SECRET "fsm-v10-secret-2026"]
|
|
7
|
+
[CONST JWT_EXPIRY 86400]
|
|
8
|
+
|
|
9
|
+
;; 역할 정의
|
|
10
|
+
[CONST ROLE_ADMIN "ADMIN"]
|
|
11
|
+
[CONST ROLE_DISPATCHER "DISPATCHER"]
|
|
12
|
+
[CONST ROLE_TECHNICIAN "TECHNICIAN"]
|
|
13
|
+
[CONST ROLE_BILLING "BILLING_MANAGER"]
|
|
14
|
+
|
|
15
|
+
;; 상태 정의
|
|
16
|
+
[CONST STATUS_PENDING "PENDING"]
|
|
17
|
+
[CONST STATUS_ASSIGNED "ASSIGNED"]
|
|
18
|
+
[CONST STATUS_STARTED "STARTED"]
|
|
19
|
+
[CONST STATUS_COMPLETED "COMPLETED"]
|
|
20
|
+
|
|
21
|
+
;; 에러 코드
|
|
22
|
+
[CONST ERR_AUTH_FAILED 401]
|
|
23
|
+
[CONST ERR_FORBIDDEN 403]
|
|
24
|
+
[CONST ERR_NOT_FOUND 404]
|
|
25
|
+
[CONST ERR_VALIDATION 400]
|
|
26
|
+
[CONST ERR_SERVER 500]
|
package/backend/db.fl
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
;; 데이터베이스 레이어 (KimDB 래퍼)
|
|
2
|
+
|
|
3
|
+
[FUNC kimdb-create :params [$collection $data]
|
|
4
|
+
:body (
|
|
5
|
+
(let [[$result (fetch-post (concat KIMDB_HOST "/api/c/" $collection) $data)]]
|
|
6
|
+
(or $result {:error "DB error"})
|
|
7
|
+
)
|
|
8
|
+
)
|
|
9
|
+
]
|
|
10
|
+
|
|
11
|
+
[FUNC kimdb-query :params [$collection $filter]
|
|
12
|
+
:body (
|
|
13
|
+
(let [[$result (fetch-get (concat KIMDB_HOST "/api/c/" $collection))]]
|
|
14
|
+
(or $result {:data []})
|
|
15
|
+
)
|
|
16
|
+
)
|
|
17
|
+
]
|