auth-mn 1.0.0 → 1.0.1
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 +206 -187
- package/dist/auth.d.ts +3 -0
- package/dist/auth.js +7 -2
- package/dist/index.d.ts +5 -0
- package/dist/index.js +1 -0
- package/dist/types.d.ts +27 -0
- package/dist/user.d.ts +20 -1
- package/dist/user.js +26 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,187 +1,206 @@
|
|
|
1
|
-
# auth-mn
|
|
2
|
-
|
|
3
|
-
**Auth.mn** — таны апп-уудын нэгдсэн хэрэглэгчийн систем. Хэрэглэгч бүртгүүлэх, нэвтрэх
|
|
4
|
-
(утас / имэйл OTP, Google, Facebook, Steam, QR), профайл, төхөөрөмж, мэдэгдлийг Auth.mn
|
|
5
|
-
хариуцна; таны апп зөвхөн **хэрэглэгчийн token**-ийг хүлээж аваад Auth.mn-ээс мэдээллийг нь
|
|
6
|
-
асууна.
|
|
7
|
-
|
|
8
|
-
Энэ сан нь таны **backend (Node.js)** дээр ажиллана:
|
|
9
|
-
|
|
10
|
-
| Та юу хийх вэ | Сангийн функц | Шаардлагатай эрх |
|
|
11
|
-
|---|---|---|
|
|
12
|
-
| Frontend-ээс ирсэн хэрэглэгчийн token шалгаж мэдээллийг авах | `user.verify(token)` / `user.middleware()` | `user.verify` |
|
|
13
|
-
| user_id / утас / имэйлээр хэрэглэгч
|
|
14
|
-
|
|
|
15
|
-
|
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
//
|
|
76
|
-
|
|
77
|
-
});
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
>
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
```
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
}
|
|
150
|
-
```
|
|
151
|
-
|
|
152
|
-
##
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
await authMn.
|
|
161
|
-
await authMn.
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
```
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
1
|
+
# auth-mn
|
|
2
|
+
|
|
3
|
+
**Auth.mn** — таны апп-уудын нэгдсэн хэрэглэгчийн систем. Хэрэглэгч бүртгүүлэх, нэвтрэх
|
|
4
|
+
(утас / имэйл OTP, Google, Facebook, Steam, QR), профайл, төхөөрөмж, мэдэгдлийг Auth.mn
|
|
5
|
+
хариуцна; таны апп зөвхөн **хэрэглэгчийн token**-ийг хүлээж аваад Auth.mn-ээс мэдээллийг нь
|
|
6
|
+
асууна.
|
|
7
|
+
|
|
8
|
+
Энэ сан нь таны **backend (Node.js)** дээр ажиллана:
|
|
9
|
+
|
|
10
|
+
| Та юу хийх вэ | Сангийн функц | Шаардлагатай эрх |
|
|
11
|
+
|---|---|---|
|
|
12
|
+
| Frontend-ээс ирсэн хэрэглэгчийн token шалгаж мэдээллийг авах | `user.verify(token)` / `user.middleware()` | `user.verify` |
|
|
13
|
+
| user_id / утас / имэйлээр нэг хэрэглэгч авах | `user.find({...})` | `user.read` |
|
|
14
|
+
| Олон хэрэглэгч (өөрийн апп-ийн хэрэглэгчид, ID жагсаалт, хайлт) | `user.list({...})` / `user.listAll({...})` | `user.read` |
|
|
15
|
+
| Push мэдэгдэл, SMS, имэйл илгээх | `notification.push / sms / mail` | `notification.*` |
|
|
16
|
+
| Хэрэглэгчийн нээлттэй апп дээр realtime toast / төлөв харуулах | `socket.toast / status / orderStatus / emit` | `socket.*` |
|
|
17
|
+
|
|
18
|
+
Frontend дээр нэвтрэх товч, QR нэвтрэлт хэрэгтэй бол **[auth-mn-react](https://www.npmjs.com/package/auth-mn-react)** санг хэрэглэнэ.
|
|
19
|
+
|
|
20
|
+
```bash
|
|
21
|
+
npm i auth-mn
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
---
|
|
25
|
+
|
|
26
|
+
## 1. Client бүртгүүлэх
|
|
27
|
+
|
|
28
|
+
Auth.mn **admin panel → Апп-ууд (Client)** дээр апп-аа бүртгэхэд `client_id` (`cl_…`) болон
|
|
29
|
+
`client_secret` (`sk_…`) олгоно. Secret **нэг л удаа** харагдана — `.env`-дээ хадгална.
|
|
30
|
+
Тухайн апп ямар API дуудаж болохыг (эрхүүдийг) admin тэндээ сонгоно; эрхгүй API дуудвал
|
|
31
|
+
`403` + ямар эрх дутууг хэлсэн message ирнэ.
|
|
32
|
+
|
|
33
|
+
```env
|
|
34
|
+
AUTH_MN_CLIENT_ID=cl_xxxxxxxxxxxxxxxx
|
|
35
|
+
AUTH_MN_CLIENT_SECRET=sk_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
## 2. Тохиргоо
|
|
39
|
+
|
|
40
|
+
```ts
|
|
41
|
+
import authMn, { setAuth, setHost } from "auth-mn";
|
|
42
|
+
|
|
43
|
+
setHost("prod"); // "staging" эсвэл setHost({ MAIN: "https://api.auth.mn" })
|
|
44
|
+
setAuth({
|
|
45
|
+
client_id: process.env.AUTH_MN_CLIENT_ID!,
|
|
46
|
+
client_secret: process.env.AUTH_MN_CLIENT_SECRET!
|
|
47
|
+
});
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
Үүний дараа юу ч хийх шаардлагагүй: сан `client_id + secret`-ээр access token (1 цаг) болон
|
|
51
|
+
refresh token (30 хоног) авч, хугацаа дуусахаас өмнө өөрөө сунгана. 401 ирвэл token-оо
|
|
52
|
+
сэргээж нэг удаа дахин оролдоно. **Бүх функц `{ success, message, data, status }` буцна, throw хийхгүй.**
|
|
53
|
+
|
|
54
|
+
## 3. Хэрэглэгч нэвтрүүлэх (гол урсгал)
|
|
55
|
+
|
|
56
|
+
```
|
|
57
|
+
[Frontend] auth-mn-react → Auth.mn дээр нэвтэрнэ → таны сайт руу ?authToken=... буцна
|
|
58
|
+
(эсвэл QR / OTP-оор token авна)
|
|
59
|
+
│ Authorization: Bearer <authToken>
|
|
60
|
+
▼
|
|
61
|
+
[Таны backend] authMn.user.verify(authToken) ──► Auth.mn (client token + user.verify эрх)
|
|
62
|
+
│ token-ийг задалж, хэрэглэгчийн
|
|
63
|
+
▼ мэдээллийг буцаана
|
|
64
|
+
өөрийн session / JWT үүсгэнэ, хэрэглэгчийг DB-дээ user_id-аар холбоно
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
### 3.1 Нэвтрэх endpoint
|
|
68
|
+
|
|
69
|
+
```ts
|
|
70
|
+
app.post("/api/auth/callback", async (req, res) => {
|
|
71
|
+
const v = await authMn.user.verify(req.body.authToken);
|
|
72
|
+
if (!v.success) return res.status(401).json({ message: v.message });
|
|
73
|
+
|
|
74
|
+
const u = v.data.user; // user_id, user_name, primary_phone, primary_email, profile_image_url, ...
|
|
75
|
+
// 1) өөрийн DB-д user_id-аар хайж байхгүй бол үүсгэнэ
|
|
76
|
+
// 2) өөрийн session / JWT үүсгэж cookie-д хадгална
|
|
77
|
+
res.json({ success: true, user: u });
|
|
78
|
+
});
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
`v.data`:
|
|
82
|
+
|
|
83
|
+
```ts
|
|
84
|
+
{
|
|
85
|
+
user: UserT; // доорх бүтэц
|
|
86
|
+
exp: number | null; // хэрэглэгчийн token дуусах хугацаа (unix sec)
|
|
87
|
+
client: { client_id, name } // ямар client-ээр шалгасан
|
|
88
|
+
}
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
Шалгалт бүр хэрэглэгчийн **нэвтрэлтийн түүхэнд** "`<таны домэйн>`-д дамжуулсан" гэж бүртгэгдэнэ —
|
|
92
|
+
хэрэглэгч Auth.mn дээрээ аль апп-д хэзээ нэвтэрснээ харна.
|
|
93
|
+
|
|
94
|
+
### 3.2 Route хамгаалах middleware
|
|
95
|
+
|
|
96
|
+
Хэрэглэгчийн token-ийг хүсэлт бүрт шалгах бол:
|
|
97
|
+
|
|
98
|
+
```ts
|
|
99
|
+
// Authorization: Bearer <token> (эсвэл ?authToken= / body.authToken)
|
|
100
|
+
app.get("/api/me", authMn.user.middleware(), (req, res) => {
|
|
101
|
+
res.json(req.authMnUser); // UserT
|
|
102
|
+
});
|
|
103
|
+
|
|
104
|
+
app.get("/api/feed", authMn.user.middleware({ required: false }), (req, res) => {
|
|
105
|
+
// нэвтрээгүй бол req.authMnUser === null, алдаа өгөхгүй
|
|
106
|
+
});
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
> Хүсэлт бүрт Auth.mn руу нэг дуудлага хийдэг тул ачаалал ихтэй бол 3.1-ийн адил нэвтрэх үед нэг удаа
|
|
110
|
+
> шалгаад өөрийн session/JWT ашиглахыг зөвлөнө.
|
|
111
|
+
|
|
112
|
+
### 3.3 Хэрэглэгч хайх
|
|
113
|
+
|
|
114
|
+
```ts
|
|
115
|
+
const r = await authMn.user.find({ user_id: 5742248 }); // эсвэл { phone_number: "99112233" } / { email }
|
|
116
|
+
if (r.success) console.log(r.data.user_name);
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
### 3.4 Олон хэрэглэгч (жагсаалт)
|
|
120
|
+
|
|
121
|
+
```ts
|
|
122
|
+
// Таны апп-д бүртгүүлсэн бүх хэрэглэгч — campaign, push илгээхэд
|
|
123
|
+
const r = await authMn.user.list({ app_name: "CHARGEX", fields: "lite", page: 1, limit: 500 });
|
|
124
|
+
// r.data = { list: UserLite[], total, page, limit }
|
|
125
|
+
|
|
126
|
+
const all = await authMn.user.listAll({ app_name: "CHARGEX", fields: "lite" }); // бүх хуудсыг нэгтгэнэ
|
|
127
|
+
await authMn.user.list({ user_ids: [5742248, 5742249] });
|
|
128
|
+
await authMn.user.list({ q: "9911", last_login_after: "2026-01-01" });
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
Шүүлтүүр: `user_ids | app_name | phone_number | email | name | q | gender | last_login_after | page | limit (≤500) | fields ("full" | "lite")`.
|
|
132
|
+
|
|
133
|
+
### UserT
|
|
134
|
+
|
|
135
|
+
```ts
|
|
136
|
+
{
|
|
137
|
+
user_id: number; // Auth.mn-ийн тогтмол ID — өөрийн DB-д үүгээр холбоно
|
|
138
|
+
user_name: string;
|
|
139
|
+
nick_name: string;
|
|
140
|
+
primary_phone: string | null;
|
|
141
|
+
primary_email: string | null;
|
|
142
|
+
emails: { email, verified, primary }[];
|
|
143
|
+
phone_numbers: { number, verified, primary }[];
|
|
144
|
+
profile_image_url: string;
|
|
145
|
+
gender?: "MEN" | "WOMEN";
|
|
146
|
+
date_of_birth: Date | null;
|
|
147
|
+
auth_profiles: { google_id, facebook_id, steam_id, ... };
|
|
148
|
+
sign_up_date, last_login, ...
|
|
149
|
+
}
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
## 4. Мэдэгдэл
|
|
153
|
+
|
|
154
|
+
```ts
|
|
155
|
+
await authMn.notification.push({
|
|
156
|
+
user_id: 5742248,
|
|
157
|
+
target_app: "MY-APP",
|
|
158
|
+
body: { title: "Захиалга", body: "Захиалга #123 батлагдлаа", button: { title: "Харах", url: "https://..." } }
|
|
159
|
+
}); // notification.push
|
|
160
|
+
await authMn.notification.sms({ to: "99112233", from: "MYAPP", text: "Код: 1234" }); // notification.sms
|
|
161
|
+
await authMn.notification.mail({
|
|
162
|
+
type: "notification", to: ["a@b.mn"], subject: "Сайн уу",
|
|
163
|
+
body: { name: "Бат", title: "Тавтай морил", desc: "..." }
|
|
164
|
+
}); // notification.mail
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
## 5. Socket (realtime)
|
|
168
|
+
|
|
169
|
+
Хэрэглэгч Auth.mn-тэй холбогдсон аль нэг апп-аа нээлттэй байхад:
|
|
170
|
+
|
|
171
|
+
```ts
|
|
172
|
+
await authMn.socket.toast({ user_id, type: "info", text: "Төлбөр амжилттай" }); // socket.toast
|
|
173
|
+
await authMn.socket.status({ user_id, id: "order-123", type: "Loading", title: "Боловсруулж байна" }); // socket.status
|
|
174
|
+
await authMn.socket.status({ user_id, id: "order-123", type: "Success", title: "Амжилттай", amount: 15000 });
|
|
175
|
+
await authMn.socket.orderStatus({ user_id, order_id: "order-123" }); // socket.status
|
|
176
|
+
await authMn.socket.emit([{ user_id, emit_name: "my-event", data: { any: 1 } }]); // socket.emit
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
## 6. Client өөрийн мэдээлэл
|
|
180
|
+
|
|
181
|
+
```ts
|
|
182
|
+
import { config } from "auth-mn";
|
|
183
|
+
await authMn.auth.getToken(); // хүчинтэй access token (шаардлагатай бол refresh / login хийгээд)
|
|
184
|
+
config.token; // одоогийн access token — гараар Authorization: Bearer үүсгэхэд
|
|
185
|
+
|
|
186
|
+
await authMn.auth.me(); // { client_id, name, permissions, ... }
|
|
187
|
+
authMn.auth.hasPermission("notification.sms"); // сүүлийн token-оос
|
|
188
|
+
await authMn.auth.permissions(); // Auth.mn-ийн бүх боломжит эрх
|
|
189
|
+
await authMn.auth.revoke(); // refresh token-оо хүчингүй болгоод cache цэвэрлэнэ
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
## Алдаа
|
|
193
|
+
|
|
194
|
+
| status | Шалтгаан |
|
|
195
|
+
|---|---|
|
|
196
|
+
| 401 | client_id/secret буруу, client идэвхгүй, эсвэл хэрэглэгчийн token хүчингүй |
|
|
197
|
+
| 403 | Энэ API-д шаардлагатай эрх client-д олгогдоогүй — admin panel дээр нэмнэ |
|
|
198
|
+
| 0 | Сүлжээний алдаа (`message`-д шалтгаан) |
|
|
199
|
+
|
|
200
|
+
## 0.x → 1.0 шилжилт
|
|
201
|
+
|
|
202
|
+
- `config.auth.username / password`, `auth.TOKEN({username,password})` → `setAuth({ client_id, client_secret })`.
|
|
203
|
+
Хуучин client бүртгэлүүд admin panel дээр **Secret шинэчлэх** дарж secret авна.
|
|
204
|
+
- `find.USER / MERCHANT / ADMIN / CLIENT / CRM` **хасагдсан** — хэрэглэгчийн мэдээлэл `user.verify` / `user.find`-ээр.
|
|
205
|
+
- `notification.SinglePushNoti / SMS / MAIL`, `socket.ShowToast / ShowStatus / ShowOrderStatus / EMIT` хэвээр ажиллана (alias).
|
|
206
|
+
- `notification._3RD.*` хасагдсан.
|
package/dist/auth.d.ts
CHANGED
|
@@ -26,6 +26,8 @@ export declare const refresh: () => Promise<Result<TokenData>>;
|
|
|
26
26
|
* Бусад бүх API функц үүнийг автоматаар дуудна.
|
|
27
27
|
*/
|
|
28
28
|
export declare const getToken: () => Promise<string>;
|
|
29
|
+
/** Одоогийн access token (хоосон бол авч амжаагүй) — config.token-той ижил */
|
|
30
|
+
export declare const token: () => string;
|
|
29
31
|
/** Одоогийн refresh token-ийг серверт хүчингүй болгоод cache цэвэрлэнэ */
|
|
30
32
|
export declare const revoke: () => Promise<Result<null>>;
|
|
31
33
|
/** Client-ийн мэдээлэл + олгогдсон permission */
|
|
@@ -44,6 +46,7 @@ export declare const TOKEN: (_legacy?: {
|
|
|
44
46
|
}) => Promise<string>;
|
|
45
47
|
declare const _default: {
|
|
46
48
|
getToken: () => Promise<string>;
|
|
49
|
+
token: () => string;
|
|
47
50
|
login: () => Promise<Result<TokenData>>;
|
|
48
51
|
refresh: () => Promise<Result<TokenData>>;
|
|
49
52
|
revoke: () => Promise<Result<null>>;
|
package/dist/auth.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.TOKEN = exports.hasPermission = exports.permissions = exports.me = exports.revoke = exports.getToken = exports.refresh = exports.login = exports.authState = exports.AuthState = void 0;
|
|
3
|
+
exports.TOKEN = exports.hasPermission = exports.permissions = exports.me = exports.revoke = exports.token = exports.getToken = exports.refresh = exports.login = exports.authState = exports.AuthState = void 0;
|
|
4
4
|
const index_1 = require("./index");
|
|
5
5
|
const request_1 = require("./request");
|
|
6
6
|
/** Хугацаа дуусахаас хэдэн секундын өмнө refresh хийх */
|
|
@@ -27,6 +27,7 @@ class AuthState {
|
|
|
27
27
|
}
|
|
28
28
|
apply(d) {
|
|
29
29
|
this.accessToken = d.access_token;
|
|
30
|
+
index_1.config.token = d.access_token;
|
|
30
31
|
this.refreshToken = d.refresh_token;
|
|
31
32
|
this.accessExpiresAt = Date.now() + d.expires_in * 1000;
|
|
32
33
|
this.refreshExpiresAt = Date.now() + d.refresh_expires_in * 1000;
|
|
@@ -35,6 +36,7 @@ class AuthState {
|
|
|
35
36
|
}
|
|
36
37
|
clear() {
|
|
37
38
|
this.accessToken = "";
|
|
39
|
+
index_1.config.token = "";
|
|
38
40
|
this.refreshToken = "";
|
|
39
41
|
this.accessExpiresAt = 0;
|
|
40
42
|
this.refreshExpiresAt = 0;
|
|
@@ -107,6 +109,9 @@ const getToken = () => exports.authState.single(async () => {
|
|
|
107
109
|
return l.success ? exports.authState.accessToken : "";
|
|
108
110
|
});
|
|
109
111
|
exports.getToken = getToken;
|
|
112
|
+
/** Одоогийн access token (хоосон бол авч амжаагүй) — config.token-той ижил */
|
|
113
|
+
const token = () => index_1.config.token;
|
|
114
|
+
exports.token = token;
|
|
110
115
|
/** Одоогийн refresh token-ийг серверт хүчингүй болгоод cache цэвэрлэнэ */
|
|
111
116
|
const revoke = async () => {
|
|
112
117
|
const rt = exports.authState.refreshToken;
|
|
@@ -144,4 +149,4 @@ const TOKEN = async (_legacy) => {
|
|
|
144
149
|
return (0, exports.getToken)();
|
|
145
150
|
};
|
|
146
151
|
exports.TOKEN = TOKEN;
|
|
147
|
-
exports.default = { getToken: exports.getToken, login: exports.login, refresh: exports.refresh, revoke: exports.revoke, me: exports.me, permissions: exports.permissions, hasPermission: exports.hasPermission, TOKEN: exports.TOKEN, state: exports.authState };
|
|
152
|
+
exports.default = { getToken: exports.getToken, token: exports.token, login: exports.login, refresh: exports.refresh, revoke: exports.revoke, me: exports.me, permissions: exports.permissions, hasPermission: exports.hasPermission, TOKEN: exports.TOKEN, state: exports.authState };
|
package/dist/index.d.ts
CHANGED
|
@@ -19,6 +19,8 @@ import notification from "./notification";
|
|
|
19
19
|
import socket from "./socket";
|
|
20
20
|
export type Env = "prod" | "staging";
|
|
21
21
|
export type Config = {
|
|
22
|
+
/** Одоогийн client access token (сан автоматаар шинэчилнэ; гараар Authorization header үүсгэхэд ашиглаж болно) */
|
|
23
|
+
token: string;
|
|
22
24
|
env: Env;
|
|
23
25
|
hosts: {
|
|
24
26
|
MAIN: string;
|
|
@@ -52,6 +54,7 @@ export * from "./types";
|
|
|
52
54
|
declare const _default: {
|
|
53
55
|
auth: {
|
|
54
56
|
getToken: () => Promise<string>;
|
|
57
|
+
token: () => string;
|
|
55
58
|
login: () => Promise<import("./types").Result<import("./types").TokenData>>;
|
|
56
59
|
refresh: () => Promise<import("./types").Result<import("./types").TokenData>>;
|
|
57
60
|
revoke: () => Promise<import("./types").Result<null>>;
|
|
@@ -71,6 +74,8 @@ declare const _default: {
|
|
|
71
74
|
phone_number?: string;
|
|
72
75
|
email?: string;
|
|
73
76
|
}) => Promise<import("./types").Result<import("./types").UserT>>;
|
|
77
|
+
list: typeof import("./user").list;
|
|
78
|
+
listAll: typeof import("./user").listAll;
|
|
74
79
|
middleware: (opts?: import("./user").MiddlewareOptions) => (req: {
|
|
75
80
|
[k: string]: any;
|
|
76
81
|
headers: Record<string, any>;
|
package/dist/index.js
CHANGED
package/dist/types.d.ts
CHANGED
|
@@ -132,6 +132,33 @@ export type UserT = {
|
|
|
132
132
|
dynamic_info?: Record<string, any>;
|
|
133
133
|
apps?: UserAppItem[];
|
|
134
134
|
};
|
|
135
|
+
export type UserListFilter = {
|
|
136
|
+
/** user_id жагсаалт (max 1000) */
|
|
137
|
+
user_ids?: (number | string)[];
|
|
138
|
+
/** Таны апп-д бүртгүүлсэн хэрэглэгчид (apps.app_name) */
|
|
139
|
+
app_name?: string;
|
|
140
|
+
phone_number?: string;
|
|
141
|
+
email?: string;
|
|
142
|
+
/** нэр (хэсэгчилсэн) */
|
|
143
|
+
name?: string;
|
|
144
|
+
/** нэр / nick / имэйл / утас дээр ерөнхий хайлт */
|
|
145
|
+
q?: string;
|
|
146
|
+
gender?: Gender;
|
|
147
|
+
/** энэ хугацаанаас хойш нэвтэрсэн (ISO) */
|
|
148
|
+
last_login_after?: string | Date;
|
|
149
|
+
page?: number;
|
|
150
|
+
/** max 500, default 100 */
|
|
151
|
+
limit?: number;
|
|
152
|
+
/** lite: зөвхөн user_id, нэр, утас, имэйл, зураг, last_login (хурдан) */
|
|
153
|
+
fields?: "full" | "lite";
|
|
154
|
+
};
|
|
155
|
+
export type UserLite = Pick<UserT, "user_id" | "user_name" | "nick_name" | "primary_phone" | "primary_email" | "profile_image_url" | "last_login">;
|
|
156
|
+
export type PageResult<T> = {
|
|
157
|
+
list: T[];
|
|
158
|
+
total: number;
|
|
159
|
+
page: number;
|
|
160
|
+
limit: number;
|
|
161
|
+
};
|
|
135
162
|
export type PushNotiT = {
|
|
136
163
|
user_id: number;
|
|
137
164
|
target_app: string;
|
package/dist/user.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Result, UserT, VerifiedUser } from "./types";
|
|
1
|
+
import { PageResult, Result, UserListFilter, UserLite, UserT, VerifiedUser } from "./types";
|
|
2
2
|
/**
|
|
3
3
|
* Хэрэглэгчийн token-ийг Auth.mn сервер дээр баталгаажуулж, хэрэглэгчийн
|
|
4
4
|
* мэдээллийг авна. Frontend (auth-mn-react redirect / QR / OTP) -ээс ирсэн
|
|
@@ -18,6 +18,23 @@ export declare const find: (query: {
|
|
|
18
18
|
phone_number?: string;
|
|
19
19
|
email?: string;
|
|
20
20
|
}) => Promise<Result<UserT>>;
|
|
21
|
+
/**
|
|
22
|
+
* Олон хэрэглэгч — хуудаслалттай. Permission: user.read
|
|
23
|
+
* await authMn.user.list({ app_name: "CHARGEX", fields: "lite", limit: 500 });
|
|
24
|
+
* → { list, total, page, limit }
|
|
25
|
+
*/
|
|
26
|
+
export declare function list(filter: UserListFilter & {
|
|
27
|
+
fields: "lite";
|
|
28
|
+
}): Promise<Result<PageResult<UserLite>>>;
|
|
29
|
+
export declare function list(filter?: UserListFilter): Promise<Result<PageResult<UserT>>>;
|
|
30
|
+
/**
|
|
31
|
+
* Бүх хуудсыг татаж нэг массив болгоно (campaign, тайлан г.м.). max нь хамгаалалт (default 50000).
|
|
32
|
+
* const users = await authMn.user.listAll({ app_name: "CHARGEX", fields: "lite" });
|
|
33
|
+
*/
|
|
34
|
+
export declare function listAll(filter: UserListFilter & {
|
|
35
|
+
fields: "lite";
|
|
36
|
+
}, max?: number): Promise<Result<UserLite[]>>;
|
|
37
|
+
export declare function listAll(filter?: UserListFilter, max?: number): Promise<Result<UserT[]>>;
|
|
21
38
|
type AnyReq = {
|
|
22
39
|
headers: Record<string, any>;
|
|
23
40
|
query?: any;
|
|
@@ -54,6 +71,8 @@ declare const _default: {
|
|
|
54
71
|
phone_number?: string;
|
|
55
72
|
email?: string;
|
|
56
73
|
}) => Promise<Result<UserT>>;
|
|
74
|
+
list: typeof list;
|
|
75
|
+
listAll: typeof listAll;
|
|
57
76
|
middleware: (opts?: MiddlewareOptions) => (req: AnyReq, res: AnyRes, next: Next) => Promise<any>;
|
|
58
77
|
};
|
|
59
78
|
export default _default;
|
package/dist/user.js
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.middleware = exports.find = exports.verify = void 0;
|
|
4
|
+
exports.list = list;
|
|
5
|
+
exports.listAll = listAll;
|
|
4
6
|
const request_1 = require("./request");
|
|
5
7
|
/**
|
|
6
8
|
* Хэрэглэгчийн token-ийг Auth.mn сервер дээр баталгаажуулж, хэрэглэгчийн
|
|
@@ -24,6 +26,29 @@ exports.verify = verify;
|
|
|
24
26
|
*/
|
|
25
27
|
const find = (query) => (0, request_1.request)({ method: "POST", path: "/main/v1/auth/client/user/find", name: "user find", data: query });
|
|
26
28
|
exports.find = find;
|
|
29
|
+
function list(filter = {}) {
|
|
30
|
+
return (0, request_1.request)({
|
|
31
|
+
method: "POST",
|
|
32
|
+
path: "/main/v1/auth/client/user/list",
|
|
33
|
+
name: "user list",
|
|
34
|
+
data: filter
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
async function listAll(filter = {}, max = 50000) {
|
|
38
|
+
const limit = Math.min(500, filter.limit || 500);
|
|
39
|
+
const all = [];
|
|
40
|
+
let page = 1;
|
|
41
|
+
for (;;) {
|
|
42
|
+
const r = await list({ ...filter, page, limit });
|
|
43
|
+
if (!r.success || !r.data)
|
|
44
|
+
return { success: false, message: r.message, data: null, status: r.status };
|
|
45
|
+
all.push(...r.data.list);
|
|
46
|
+
if (all.length >= r.data.total || r.data.list.length < limit || all.length >= max)
|
|
47
|
+
break;
|
|
48
|
+
page++;
|
|
49
|
+
}
|
|
50
|
+
return { success: true, message: "Амжилттай", data: all, status: 200 };
|
|
51
|
+
}
|
|
27
52
|
const defaultGetToken = (req) => {
|
|
28
53
|
var _a, _b, _c, _d;
|
|
29
54
|
const h = String(((_a = req.headers) === null || _a === void 0 ? void 0 : _a.authorization) || ((_b = req.headers) === null || _b === void 0 ? void 0 : _b.Authorization) || "");
|
|
@@ -65,4 +90,4 @@ const middleware = (opts = {}) => async (req, res, next) => {
|
|
|
65
90
|
return next();
|
|
66
91
|
};
|
|
67
92
|
exports.middleware = middleware;
|
|
68
|
-
exports.default = { verify: exports.verify, find: exports.find, middleware: exports.middleware };
|
|
93
|
+
exports.default = { verify: exports.verify, find: exports.find, list, listAll, middleware: exports.middleware };
|