@urga-panel/ur-panels-core 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/.eslintrc.js +13 -0
- package/dist/ServiceManager.d.ts +26 -0
- package/dist/ServiceManager.js +351 -0
- package/dist/TestRun.d.ts +1 -0
- package/dist/TestRun.js +14 -0
- package/dist/index.d.ts +15 -0
- package/dist/index.js +22 -0
- package/dist/services/abstract/apiService/ApiService.d.ts +17 -0
- package/dist/services/abstract/apiService/ApiService.js +33 -0
- package/dist/services/abstract/authServices/AuthService.d.ts +75 -0
- package/dist/services/abstract/authServices/AuthService.js +275 -0
- package/dist/services/abstract/authServices/Authorization.d.ts +0 -0
- package/dist/services/abstract/authServices/Authorization.js +0 -0
- package/dist/services/abstract/extensionServices/ExtensionService.d.ts +25 -0
- package/dist/services/abstract/extensionServices/ExtensionService.js +21 -0
- package/dist/services/abstract/pageServices/LayoutPageService.d.ts +17 -0
- package/dist/services/abstract/pageServices/LayoutPageService.js +32 -0
- package/dist/services/abstract/pageServices/PageServices.d.ts +20 -0
- package/dist/services/abstract/pageServices/PageServices.js +23 -0
- package/dist/services/abstract/pageServices/controllers/NSPageControllerService.d.ts +10 -0
- package/dist/services/abstract/pageServices/controllers/NSPageControllerService.js +18 -0
- package/dist/services/abstract/pageServices/controllers/PageControllerService.d.ts +27 -0
- package/dist/services/abstract/pageServices/controllers/PageControllerService.js +24 -0
- package/dist/services/abstract/pageServices/controllers/SVPageControllerService.d.ts +34 -0
- package/dist/services/abstract/pageServices/controllers/SVPageControllerService.js +73 -0
- package/dist/services/abstract/pageServices/pages/NsPageService.d.ts +26 -0
- package/dist/services/abstract/pageServices/pages/NsPageService.js +66 -0
- package/dist/services/abstract/project/ProjectInfoService.d.ts +42 -0
- package/dist/services/abstract/project/ProjectInfoService.js +72 -0
- package/dist/services/abstract/webviewServices/WVBackService.d.ts +18 -0
- package/dist/services/abstract/webviewServices/WVBackService.js +22 -0
- package/dist/services/abstract/webviewServices/WVFrontService.d.ts +21 -0
- package/dist/services/abstract/webviewServices/WVFrontService.js +54 -0
- package/dist/services/abstract/webviewServices/nv.d.ts +26 -0
- package/dist/services/abstract/webviewServices/nv.js +99 -0
- package/dist/services/main/fetchServices/FetchBrowserService.d.ts +19 -0
- package/dist/services/main/fetchServices/FetchBrowserService.js +26 -0
- package/dist/services/main/httpServices/RequestHandlerService.d.ts +46 -0
- package/dist/services/main/httpServices/RequestHandlerService.js +165 -0
- package/dist/services/main/remoteApiControllerService/RemoteApiControllerService.d.ts +36 -0
- package/dist/services/main/remoteApiControllerService/RemoteApiControllerService.js +42 -0
- package/dist/services/main/testServices/TestService.d.ts +19 -0
- package/dist/services/main/testServices/TestService.js +22 -0
- package/dist/services/main/testServices/TestService2.d.ts +18 -0
- package/dist/services/main/testServices/TestService2.js +20 -0
- package/dist/types/RegisterServiceInfo.d.ts +13 -0
- package/dist/types/RegisterServiceInfo.js +1 -0
- package/dist/types/Service.d.ts +32 -0
- package/dist/types/Service.js +43 -0
- package/dist/types/ServiceConstructor.d.ts +5 -0
- package/dist/types/ServiceConstructor.js +1 -0
- package/dist/types/ServiceEntry.d.ts +6 -0
- package/dist/types/ServiceEntry.js +1 -0
- package/dist/types/ServiceOts.d.ts +12 -0
- package/dist/types/ServiceOts.js +1 -0
- package/dist/types/ServiceRegisterInfo.d.ts +29 -0
- package/dist/types/ServiceRegisterInfo.js +25 -0
- package/dist/types/ServiceResponse.d.ts +13 -0
- package/dist/types/ServiceResponse.js +1 -0
- package/dist/types/ServiceSetupOptions.d.ts +3 -0
- package/dist/types/ServiceSetupOptions.js +1 -0
- package/dist/types/ServiceStatus.d.ts +1 -0
- package/dist/types/ServiceStatus.js +1 -0
- package/dist/types/_ServiceError.d.ts +5 -0
- package/dist/types/_ServiceError.js +1 -0
- package/jest.config.js +5 -0
- package/package.json +35 -0
- package/src/ServiceManager.ts +403 -0
- package/src/TestRun.ts +17 -0
- package/src/index.ts +26 -0
- package/src/services/abstract/apiService/ApiService.ts +51 -0
- package/src/services/abstract/authServices/AuthService.ts +364 -0
- package/src/services/abstract/authServices/Authorization.ts +0 -0
- package/src/services/abstract/extensionServices/ExtensionService.ts +50 -0
- package/src/services/abstract/pageServices/LayoutPageService.ts +49 -0
- package/src/services/abstract/pageServices/PageServices.ts +37 -0
- package/src/services/abstract/pageServices/controllers/NSPageControllerService.ts +23 -0
- package/src/services/abstract/pageServices/controllers/PageControllerService.ts +56 -0
- package/src/services/abstract/pageServices/controllers/SVPageControllerService.ts +104 -0
- package/src/services/abstract/pageServices/pages/NSPageService.ts +82 -0
- package/src/services/abstract/project/ProjectInfoService.ts +108 -0
- package/src/services/abstract/webviewServices/WVBackService.ts +34 -0
- package/src/services/abstract/webviewServices/WVFrontService.ts +71 -0
- package/src/services/abstract/webviewServices/nv.js +112 -0
- package/src/services/abstract/webviewServices/nv.ts +125 -0
- package/src/services/main/fetchServices/FetchBrowserService.ts +40 -0
- package/src/services/main/httpServices/RequestHandlerService.ts +207 -0
- package/src/services/main/remoteApiControllerService/RemoteApiControllerService.ts +70 -0
- package/src/services/main/testServices/TestService.ts +36 -0
- package/src/services/main/testServices/TestService2.ts +34 -0
- package/src/types/RegisterServiceInfo.ts +19 -0
- package/src/types/Service.ts +61 -0
- package/src/types/ServiceConstructor.ts +6 -0
- package/src/types/ServiceEntry.ts +10 -0
- package/src/types/ServiceOts.ts +17 -0
- package/src/types/ServiceRegisterInfo.ts +48 -0
- package/src/types/ServiceResponse.ts +13 -0
- package/src/types/ServiceSetupOptions.ts +5 -0
- package/src/types/ServiceStatus.ts +2 -0
- package/src/types/_ServiceError.ts +5 -0
- package/tsconfig.json +20 -0
|
@@ -0,0 +1,364 @@
|
|
|
1
|
+
import { Service } from "../../../types/Service";
|
|
2
|
+
import { ServiceOts } from "../../../types/ServiceOts";
|
|
3
|
+
import { RegisterServiceInfo } from "../../../types/ServiceRegisterInfo";
|
|
4
|
+
import { ServiceResponse } from "../../../types/ServiceResponse";
|
|
5
|
+
import { ServiceSetupOptions } from "../../../types/ServiceSetupOptions";
|
|
6
|
+
import { RequestHandlerService } from "../../main/httpServices/RequestHandlerService";
|
|
7
|
+
// import bcrypt from 'bcryptjs';
|
|
8
|
+
// import jwt from 'jsonwebtoken';
|
|
9
|
+
|
|
10
|
+
const JWT_SECRET = 'gizliAnahtar'; // .env dosyasına taşıman önerilir
|
|
11
|
+
const JWT_REFRESH_SECRET = 'gizliRefreshAnahtar'; // refresh için ayrı bir secret önerilir
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
export type AuthOts = ServiceOts & {
|
|
15
|
+
usedService: {
|
|
16
|
+
RequestHandlerService: () => RequestHandlerService; // Replace with actual type if available
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
export abstract class AuthService extends Service {
|
|
22
|
+
static serviceInfo = {
|
|
23
|
+
name: "AuthService",
|
|
24
|
+
requiredServices: ["RequestHandlerService"],
|
|
25
|
+
}
|
|
26
|
+
protected async onSetup(options?: ServiceSetupOptions): Promise<ServiceResponse> {
|
|
27
|
+
|
|
28
|
+
return { status: "success", message: "setup complete" };
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
protected async onStart(): Promise<ServiceResponse> {
|
|
32
|
+
// Object.keys(this.pages).forEach(async tag => {
|
|
33
|
+
// const service = this.ots.abilities.createChildService?.("ProjectPage-"+tag);
|
|
34
|
+
// await service.start();
|
|
35
|
+
// });
|
|
36
|
+
|
|
37
|
+
const requestHandlerService = this.ots.usedService.RequestHandlerService() as RequestHandlerService;
|
|
38
|
+
// requestHandlerService.addHandler("deneme",this.loginHandler.bind(this));
|
|
39
|
+
requestHandlerService.addHandler("login", this.loginRequest.bind(this));
|
|
40
|
+
requestHandlerService.addHandler("deneme", this.deneme.bind(this), {
|
|
41
|
+
auth: true,
|
|
42
|
+
role: "guest" // Örnek olarak admin rolü
|
|
43
|
+
});
|
|
44
|
+
requestHandlerService.addHandler("getUserInfo", this.getUserInfo_REQUEST.bind(this), {
|
|
45
|
+
auth: true,
|
|
46
|
+
role: "guest" // Örnek olarak admin rolü
|
|
47
|
+
});
|
|
48
|
+
// requestHandlerService.addHandler("deneme",this.loginHandler.bind(this));
|
|
49
|
+
|
|
50
|
+
return { status: "success", message: "started" };
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
protected async onStop(): Promise<ServiceResponse> {
|
|
54
|
+
return { status: "success", message: "stopped" };
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
protected async onDestroy(): Promise<ServiceResponse> {
|
|
58
|
+
return { status: "success", message: "destroyed" };
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
constructor(public ots: AuthOts) {
|
|
62
|
+
super(ots);
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
// Abstract methods for platform-specific logic
|
|
66
|
+
protected abstract saveToken(token: string): Promise<void>;
|
|
67
|
+
protected abstract clearToken(): Promise<void>;
|
|
68
|
+
protected abstract getUserInfo({ userId, userName, userRole }: {
|
|
69
|
+
userId?: string;
|
|
70
|
+
userName?: string;
|
|
71
|
+
userRole?: string;
|
|
72
|
+
}): Promise<{
|
|
73
|
+
success: boolean;
|
|
74
|
+
message?: string;
|
|
75
|
+
user?: {
|
|
76
|
+
id: number;
|
|
77
|
+
username: string;
|
|
78
|
+
password: string; // Optional password field for internal use
|
|
79
|
+
role?: string; // Optional role field
|
|
80
|
+
databaseId?: string; // Optional database ID field
|
|
81
|
+
};
|
|
82
|
+
}>;
|
|
83
|
+
|
|
84
|
+
// protected abstract authenticateUser(username: string, password: string):
|
|
85
|
+
// Promise<{
|
|
86
|
+
// success: boolean; user?: {
|
|
87
|
+
// id: number;
|
|
88
|
+
// username: string;
|
|
89
|
+
// password: string; // Optional password field for internal use
|
|
90
|
+
// role?: string; // Optional role field
|
|
91
|
+
// };
|
|
92
|
+
// }>;
|
|
93
|
+
|
|
94
|
+
// Define methods specific to AuthService here
|
|
95
|
+
async loginRequest({ username, password, params, request, url }): Promise<any> {
|
|
96
|
+
//const { username, password } = params;
|
|
97
|
+
// Kullanıcı adı veya şifre eksikse
|
|
98
|
+
//debugger;
|
|
99
|
+
try {
|
|
100
|
+
// const formData = await request.formData();
|
|
101
|
+
// const username = formData.get('username');
|
|
102
|
+
// const password = formData.get('password');
|
|
103
|
+
//debugger;
|
|
104
|
+
if (!username || !password) {
|
|
105
|
+
return this.resposeHandler({ status: "fail", message: "Kullanıcı adı ve şifre gereklidir" });
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
const result = await this.getUserInfo({ userName: username });
|
|
109
|
+
|
|
110
|
+
if (result.success) {
|
|
111
|
+
let jwt: typeof import("jsonwebtoken") | undefined;
|
|
112
|
+
if (typeof window === "undefined") {
|
|
113
|
+
jwt = (await import("jsonwebtoken")).default;
|
|
114
|
+
}
|
|
115
|
+
let bcrypt: typeof import("bcryptjs") | undefined;
|
|
116
|
+
if (typeof window === "undefined") {
|
|
117
|
+
bcrypt = await import("bcryptjs");
|
|
118
|
+
}
|
|
119
|
+
console.log("User authenticated:", result.user);
|
|
120
|
+
|
|
121
|
+
const match = await bcrypt.compare(password, result.user.password);
|
|
122
|
+
if (!match) {
|
|
123
|
+
return this.resposeHandler({ success: false });
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
const accessToken = jwt.sign(
|
|
127
|
+
{
|
|
128
|
+
id: result.user.id,
|
|
129
|
+
username: result.user.username,
|
|
130
|
+
role: result.user.role,
|
|
131
|
+
databaseId: result.user.databaseId // databaseId eklendi
|
|
132
|
+
},
|
|
133
|
+
JWT_SECRET,
|
|
134
|
+
{ expiresIn: '15m' }
|
|
135
|
+
);
|
|
136
|
+
|
|
137
|
+
// 5. Refresh Token üret
|
|
138
|
+
const refreshToken = jwt.sign(
|
|
139
|
+
{
|
|
140
|
+
id: result.user.id,
|
|
141
|
+
username: result.user.username,
|
|
142
|
+
role: result.user.role,
|
|
143
|
+
databaseId: result.user.databaseId // databaseId eklendi
|
|
144
|
+
},
|
|
145
|
+
JWT_REFRESH_SECRET,
|
|
146
|
+
{ expiresIn: '7d' }
|
|
147
|
+
);
|
|
148
|
+
|
|
149
|
+
// return { status: "success", accessToken: accessToken,
|
|
150
|
+
// refreshToken: refreshToken };
|
|
151
|
+
// // ...tokenları ürettikten sonra...
|
|
152
|
+
return new Response(
|
|
153
|
+
JSON.stringify({ status: "success", message: "valid credentials", data: { user: result.user } }),
|
|
154
|
+
{
|
|
155
|
+
status: 200,
|
|
156
|
+
headers: {
|
|
157
|
+
"Set-Cookie":
|
|
158
|
+
`accessToken=${accessToken}; Path=/; HttpOnly; Secure; SameSite=Strict; Max-Age=900, refreshToken=${refreshToken}; Path=/; HttpOnly; Secure; SameSite=Strict; Max-Age=604800`,
|
|
159
|
+
'Content-Type': 'application/json'
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
);
|
|
163
|
+
}
|
|
164
|
+
return this.resposeHandler({ status: "fail", message: "Invalid credentials" });
|
|
165
|
+
} catch (error) {
|
|
166
|
+
this.log.ERROR("Error during login:", error);
|
|
167
|
+
return this.resposeHandler({ status: "error", message: "An error occurred during login" });
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
async checkToken({ accessToken, refreshToken, options }: {
|
|
171
|
+
accessToken: string; refreshToken: string, options?: {
|
|
172
|
+
role?: string;
|
|
173
|
+
}
|
|
174
|
+
}): Promise<{ valid: boolean; newAccessToken?: string, newRefreshToken?: string, user?: any }> {
|
|
175
|
+
this.log.OK("Access Token:", accessToken);
|
|
176
|
+
this.log.OK("Refresh Token:", refreshToken);
|
|
177
|
+
//debugger;
|
|
178
|
+
try {
|
|
179
|
+
// 1. Access token'ı doğrula
|
|
180
|
+
let jwt: typeof import("jsonwebtoken") | undefined;
|
|
181
|
+
if (typeof window === "undefined") {
|
|
182
|
+
jwt = (await import("jsonwebtoken")).default;
|
|
183
|
+
}
|
|
184
|
+
const decoded = jwt.verify(accessToken, JWT_SECRET);
|
|
185
|
+
const res = await this.getUserInfo({
|
|
186
|
+
userId: (decoded as any).id,
|
|
187
|
+
userName: (decoded as any).username,
|
|
188
|
+
userRole: (decoded as any).role || "user" // Varsayılan rol
|
|
189
|
+
});
|
|
190
|
+
//debugger;
|
|
191
|
+
|
|
192
|
+
if (!res.success) {
|
|
193
|
+
return { valid: false, user: res.user };
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
// Admin ise onay ver
|
|
197
|
+
if (options?.role && res.user?.role == 'admin') {
|
|
198
|
+
return { valid: true, user: res.user };
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
//Check role here
|
|
202
|
+
if (options?.role && res.user?.role !== options.role) {
|
|
203
|
+
return { valid: false };
|
|
204
|
+
}
|
|
205
|
+
return { valid: true, user: res.user };
|
|
206
|
+
} catch (err) {
|
|
207
|
+
// Access token geçersiz veya süresi dolmuşsa
|
|
208
|
+
try {
|
|
209
|
+
let jwt: typeof import("jsonwebtoken") | undefined;
|
|
210
|
+
if (typeof window === "undefined") {
|
|
211
|
+
jwt = (await import("jsonwebtoken")).default;
|
|
212
|
+
}
|
|
213
|
+
// 2. Refresh token'ı doğrula
|
|
214
|
+
const decodedRefresh: {
|
|
215
|
+
id: number;
|
|
216
|
+
username: string;
|
|
217
|
+
role: string; // Refresh token'da rol bilgisi varsa
|
|
218
|
+
databaseId?: string;
|
|
219
|
+
} = jwt.verify(refreshToken, JWT_REFRESH_SECRET) as unknown as any;
|
|
220
|
+
//debugger;
|
|
221
|
+
|
|
222
|
+
const res = await this.getUserInfo({
|
|
223
|
+
userId: (decodedRefresh as any).id,
|
|
224
|
+
userName: (decodedRefresh as any).username,
|
|
225
|
+
userRole: (decodedRefresh as any).role || "user" // Varsayılan rol
|
|
226
|
+
});
|
|
227
|
+
|
|
228
|
+
if (!res.success) {
|
|
229
|
+
return { valid: false };
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
//Check role here
|
|
233
|
+
// Admin ise onay ver
|
|
234
|
+
|
|
235
|
+
// Admin ise devam etsin
|
|
236
|
+
if (options?.role && res.user?.role === 'admin') {
|
|
237
|
+
// admin ise role kontrolü atlanır, devam edilir
|
|
238
|
+
} else if (options?.role && res.user?.role !== options.role) {
|
|
239
|
+
return { valid: false };
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
// Refresh token geçerli, yeni access token üret
|
|
243
|
+
const newAccessToken = jwt.sign(
|
|
244
|
+
{
|
|
245
|
+
id: decodedRefresh.id,
|
|
246
|
+
username: decodedRefresh.username,
|
|
247
|
+
role: decodedRefresh.role,
|
|
248
|
+
databaseId: decodedRefresh.databaseId // databaseId eklendi
|
|
249
|
+
},
|
|
250
|
+
JWT_SECRET,
|
|
251
|
+
{ expiresIn: '15m' }
|
|
252
|
+
);
|
|
253
|
+
const newRefreshToken = jwt.sign(
|
|
254
|
+
{
|
|
255
|
+
id: decodedRefresh.id,
|
|
256
|
+
username: decodedRefresh.username,
|
|
257
|
+
role: decodedRefresh.role,
|
|
258
|
+
databaseId: decodedRefresh.databaseId // databaseId eklendi
|
|
259
|
+
},
|
|
260
|
+
JWT_REFRESH_SECRET,
|
|
261
|
+
{ expiresIn: '7d' }
|
|
262
|
+
);
|
|
263
|
+
|
|
264
|
+
|
|
265
|
+
return { valid: true, newAccessToken, newRefreshToken, user: res.user };
|
|
266
|
+
} catch (refreshErr) {
|
|
267
|
+
// Refresh token da geçersiz
|
|
268
|
+
return { valid: false };
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
// async checkToken(accessToken: string, refreshToken): Promise<boolean> {
|
|
274
|
+
// // try {
|
|
275
|
+
// // const decoded = jwt.verify(token, 'gizliAnahtar');
|
|
276
|
+
// // return !!decoded;
|
|
277
|
+
// // } catch (error) {
|
|
278
|
+
// // console.error('Token verification failed:', error);
|
|
279
|
+
// // return false;
|
|
280
|
+
// // }
|
|
281
|
+
// }
|
|
282
|
+
|
|
283
|
+
async deneme({ params, request, url }): Promise<any> {
|
|
284
|
+
this.log.OK("RequestHandlerService deneme", params);
|
|
285
|
+
const cookieHeader = request.headers.get('cookie');
|
|
286
|
+
const accessToken = this.getCookie(cookieHeader, 'accessToken');
|
|
287
|
+
const refreshToken = this.getCookie(cookieHeader, 'refreshToken');
|
|
288
|
+
this.log.OK("Access Token:", accessToken);
|
|
289
|
+
this.log.OK("Refresh Token:", refreshToken);
|
|
290
|
+
return this.resposeHandler({ status: "success", message: "Deneme successful" });
|
|
291
|
+
}
|
|
292
|
+
async getUserInfo_REQUEST({ params, request, url, user }): Promise<any> {
|
|
293
|
+
this.log.OK("RequestHandlerService deneme", params);
|
|
294
|
+
//debugger;
|
|
295
|
+
// const cookieHeader = request.headers.get('cookie');
|
|
296
|
+
// const accessToken = this.getCookie(cookieHeader, 'accessToken');
|
|
297
|
+
// const refreshToken = this.getCookie(cookieHeader, 'refreshToken');
|
|
298
|
+
// this.log.OK("Access Token:", accessToken);
|
|
299
|
+
// this.log.OK("Refresh Token:", refreshToken);
|
|
300
|
+
//const result = await this.getUserInfo({userName:username});
|
|
301
|
+
//debugger;
|
|
302
|
+
return this.resposeHandler({
|
|
303
|
+
status: "success",
|
|
304
|
+
message: "getUserInfo_REQUEST successful",
|
|
305
|
+
data: {
|
|
306
|
+
user: {
|
|
307
|
+
id: user?.id || null,
|
|
308
|
+
username: user?.username || null,
|
|
309
|
+
role: user?.role || null,
|
|
310
|
+
databaseId: user?.databaseId || null // databaseId eklendi
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
});
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
resposeHandler(response: any): Response {
|
|
317
|
+
if (response.status === "success") {
|
|
318
|
+
return new Response(JSON.stringify(response), {
|
|
319
|
+
status: 200,
|
|
320
|
+
headers: {
|
|
321
|
+
'Content-Type': 'application/json'
|
|
322
|
+
}
|
|
323
|
+
});
|
|
324
|
+
}
|
|
325
|
+
return new Response(JSON.stringify(response), {
|
|
326
|
+
status: 400,
|
|
327
|
+
headers: {
|
|
328
|
+
'Content-Type': 'application/json'
|
|
329
|
+
}
|
|
330
|
+
});
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
getCookie(cookieHeader: string | null, name: string): string | undefined {
|
|
334
|
+
if (!cookieHeader) return undefined;
|
|
335
|
+
const cookies = cookieHeader.split(';').map(c => c.trim());
|
|
336
|
+
for (const cookie of cookies) {
|
|
337
|
+
const [key, ...val] = cookie.split('=');
|
|
338
|
+
if (key === name) return val.join('=');
|
|
339
|
+
}
|
|
340
|
+
return undefined;
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
async logout(): Promise<void> {
|
|
344
|
+
await this.clearToken();
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
async register(username: string, password: string): Promise<boolean> {
|
|
348
|
+
// Implement registration logic (platform-specific)
|
|
349
|
+
// You may want to add an abstract method for registration as well
|
|
350
|
+
return true; // Placeholder
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
|
|
354
|
+
|
|
355
|
+
export const registerServiceInfo = new RegisterServiceInfo(
|
|
356
|
+
{
|
|
357
|
+
serviceName: "RequestHandlerService",
|
|
358
|
+
tag: "RequestHandlerService",
|
|
359
|
+
dynamicTag: false,
|
|
360
|
+
requiredServices: [],
|
|
361
|
+
isAbstract: true,
|
|
362
|
+
abstractService: AuthService,
|
|
363
|
+
}
|
|
364
|
+
);
|
|
File without changes
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { Service } from "../../../types/Service.js";
|
|
2
|
+
import { ServiceOts } from "../../../types/ServiceOts.js";
|
|
3
|
+
import { ServiceResponse } from "../../../types/ServiceResponse.js";
|
|
4
|
+
import { ServiceSetupOptions } from "../../../types/ServiceSetupOptions.js";
|
|
5
|
+
|
|
6
|
+
export type ExtensionOts = ServiceOts & {
|
|
7
|
+
usedService: {
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export abstract class ExtensionService extends Service {
|
|
12
|
+
constructor(ots:ExtensionOts) {
|
|
13
|
+
super({...ots});
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
abstract extensionInfo: {
|
|
17
|
+
showLeftMenu: boolean;
|
|
18
|
+
name: string;
|
|
19
|
+
showName: string;
|
|
20
|
+
icon: string;
|
|
21
|
+
slug: string;
|
|
22
|
+
description: string;
|
|
23
|
+
version: string;
|
|
24
|
+
}
|
|
25
|
+
abstract svelteComponent: any;
|
|
26
|
+
protected abstract onSetup(options?: ServiceSetupOptions):Promise<ServiceResponse>;
|
|
27
|
+
protected abstract onStart(): Promise<ServiceResponse>;
|
|
28
|
+
protected abstract onStop(): Promise<ServiceResponse>;
|
|
29
|
+
protected abstract onDestroy(): Promise<ServiceResponse>;
|
|
30
|
+
|
|
31
|
+
// protected async onSetup(options?: ServiceSetupOptions): Promise<ServiceResponse> {
|
|
32
|
+
// return { status: "success", message: "setup complete" };
|
|
33
|
+
// }
|
|
34
|
+
|
|
35
|
+
// protected async onStart(): Promise<ServiceResponse> {
|
|
36
|
+
// return { status: "success", message: "started" };
|
|
37
|
+
// }
|
|
38
|
+
|
|
39
|
+
// protected async onStop(): Promise<ServiceResponse> {
|
|
40
|
+
// return { status: "success", message: "stopped" };
|
|
41
|
+
// }
|
|
42
|
+
|
|
43
|
+
// protected async onDestroy(): Promise<ServiceResponse> {
|
|
44
|
+
// return { status: "success", message: "destroyed" };
|
|
45
|
+
// }
|
|
46
|
+
|
|
47
|
+
denemeYazi() {
|
|
48
|
+
return "deneme";
|
|
49
|
+
}
|
|
50
|
+
}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { ServiceOts } from "../../../types/ServiceOts";
|
|
2
|
+
import { PageService } from "./PageServices";
|
|
3
|
+
|
|
4
|
+
export type RightMenuItem = {
|
|
5
|
+
icon: string;
|
|
6
|
+
label: string;
|
|
7
|
+
action: () => void;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
export type LayoutOts = ServiceOts & {
|
|
12
|
+
usedService: {
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export class LayoutPageService extends PageService {
|
|
17
|
+
rightMenuItem:RightMenuItem[];
|
|
18
|
+
// svelte_onMount?: () => void;
|
|
19
|
+
// svelte_onDestroy?: () => void;
|
|
20
|
+
s_onMount?:()=>Promise<void>;
|
|
21
|
+
s_onDestroy?:()=>Promise<void>;
|
|
22
|
+
|
|
23
|
+
constructor(ots:LayoutOts) {
|
|
24
|
+
super({...ots});
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/*
|
|
28
|
+
protected async onSetup(options?: ServiceSetupOptions): Promise<ServiceResponse> {
|
|
29
|
+
super.onSetup(options);
|
|
30
|
+
return { status: "success", message: "LayoutService setup complete" };
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
protected async onStart(): Promise<ServiceResponse> {
|
|
34
|
+
super.onStart();
|
|
35
|
+
return { status: "success", message: "LayoutService started" };
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
protected async onStop(): Promise<ServiceResponse> {
|
|
39
|
+
return { status: "success", message: "LayoutService stopped" };
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
protected async onDestroy(): Promise<ServiceResponse> {
|
|
43
|
+
return { status: "success", message: "LayoutService destroyed" };
|
|
44
|
+
}*/
|
|
45
|
+
|
|
46
|
+
denemeYazi() {
|
|
47
|
+
return "deneme";
|
|
48
|
+
}
|
|
49
|
+
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { Service } from "../../../types/Service";
|
|
2
|
+
import { ServiceOts } from "../../../types/ServiceOts";
|
|
3
|
+
import { ServiceResponse } from "../../../types/ServiceResponse";
|
|
4
|
+
import { ServiceSetupOptions } from "../../../types/ServiceSetupOptions";
|
|
5
|
+
|
|
6
|
+
export type PageOts = ServiceOts & {
|
|
7
|
+
usedService: {
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export class PageService extends Service {
|
|
12
|
+
serviceInfo: { name: string; requiredServices: string[]; };
|
|
13
|
+
public svelteComponent: any; // Optional Svelte component reference
|
|
14
|
+
constructor(ots:PageOts) {
|
|
15
|
+
super({...ots});
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
protected async onSetup(options?: ServiceSetupOptions): Promise<ServiceResponse> {
|
|
19
|
+
return { status: "success", message: "setup complete" };
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
protected async onStart(): Promise<ServiceResponse> {
|
|
23
|
+
return { status: "success", message: "started" };
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
protected async onStop(): Promise<ServiceResponse> {
|
|
27
|
+
return { status: "success", message: "stopped" };
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
protected async onDestroy(): Promise<ServiceResponse> {
|
|
31
|
+
return { status: "success", message: "destroyed" };
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
denemeYazi() {
|
|
35
|
+
return "deneme";
|
|
36
|
+
}
|
|
37
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { Service } from "../../../../types/Service";
|
|
2
|
+
import { NSPageService } from "../pages/NsPageService";
|
|
3
|
+
import { PageService } from "../PageServices";
|
|
4
|
+
import { PageControllerService } from "./PageControllerService";
|
|
5
|
+
|
|
6
|
+
export class NSPageControllerService extends PageControllerService {
|
|
7
|
+
serviceInfo: { name: string; requiredServices: string[]; };
|
|
8
|
+
|
|
9
|
+
registerPage(tag: string, opt:object) {
|
|
10
|
+
console.log(`Registering page with tag: ${tag}`);
|
|
11
|
+
const service = this.ots.abilities.createChildService?.(tag);
|
|
12
|
+
// await service.setup();
|
|
13
|
+
this.pages[tag] = {
|
|
14
|
+
status: "setup",
|
|
15
|
+
service:service as PageService
|
|
16
|
+
};
|
|
17
|
+
return service as NSPageService;
|
|
18
|
+
}
|
|
19
|
+
onLoaded(){
|
|
20
|
+
console.log("NSPageControllerService onLoaded called");
|
|
21
|
+
// Implement any additional logic needed when the page is loaded
|
|
22
|
+
}
|
|
23
|
+
}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { Service } from "../../../../types/Service";
|
|
2
|
+
import { ServiceOts } from "../../../../types/ServiceOts";
|
|
3
|
+
import { ServiceResponse } from "../../../../types/ServiceResponse";
|
|
4
|
+
import { ServiceSetupOptions } from "../../../../types/ServiceSetupOptions";
|
|
5
|
+
import { PageService } from "../PageServices";
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
export type PageControllerOts = ServiceOts & {
|
|
10
|
+
usedService: {
|
|
11
|
+
},
|
|
12
|
+
abilities?: {
|
|
13
|
+
createChildService?: (tag:string)=> any,
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export abstract class PageControllerService extends Service {
|
|
18
|
+
|
|
19
|
+
abstract registerPage(tag: string, opt: object): any;
|
|
20
|
+
|
|
21
|
+
public pages: {
|
|
22
|
+
[key: string]: {
|
|
23
|
+
service: PageService,
|
|
24
|
+
status: "setup" | "started" | "stopped" | "destroyed",
|
|
25
|
+
}
|
|
26
|
+
} = {};
|
|
27
|
+
|
|
28
|
+
constructor(public ots:PageControllerOts) {
|
|
29
|
+
super({...ots});
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
protected async onSetup(options?: ServiceSetupOptions): Promise<ServiceResponse> {
|
|
33
|
+
return { status: "success", message: "setup complete" };
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
protected async onStart(): Promise<ServiceResponse> {
|
|
37
|
+
return { status: "success", message: "started" };
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
protected async onStop(): Promise<ServiceResponse> {
|
|
41
|
+
return { status: "success", message: "stopped" };
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
protected async onDestroy(): Promise<ServiceResponse> {
|
|
45
|
+
return { status: "success", message: "destroyed" };
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
denemeYazi() {
|
|
49
|
+
return "deneme";
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import { PageControllerService } from "./PageControllerService";
|
|
2
|
+
import { PageService } from "../PageServices";
|
|
3
|
+
|
|
4
|
+
export type SveltePageProp = {
|
|
5
|
+
onMount: (callback: () => Promise<void>) => void;
|
|
6
|
+
onDestroy: (callback: () => Promise<void>) => void;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
export class SVPageControllerService extends PageControllerService {
|
|
10
|
+
serviceInfo = {
|
|
11
|
+
name: "SVPageControllerService",
|
|
12
|
+
type: "SVPageControllerService",
|
|
13
|
+
requiredServices: [],
|
|
14
|
+
description: "Service for handling Svelte page operations",
|
|
15
|
+
version: "1.0.0",
|
|
16
|
+
}
|
|
17
|
+
registerPage(tag: string, opt: object) {
|
|
18
|
+
throw new Error("Method not implemented.");
|
|
19
|
+
}
|
|
20
|
+
public pageServices: {
|
|
21
|
+
[key: string]: any // PageService
|
|
22
|
+
} = {};
|
|
23
|
+
|
|
24
|
+
constructor(public ots: any) { // PageControllerOts
|
|
25
|
+
super({...ots});
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
createPageService(
|
|
29
|
+
tag:string,
|
|
30
|
+
callback: (service:PageService, obj?:{ params,url} ) => Promise<any>,
|
|
31
|
+
options?: {
|
|
32
|
+
slug?: boolean
|
|
33
|
+
}
|
|
34
|
+
) {
|
|
35
|
+
const $this = this;
|
|
36
|
+
return async ({ params, url }) => {
|
|
37
|
+
const slug = params.slug;
|
|
38
|
+
const device = params.device;
|
|
39
|
+
|
|
40
|
+
let tagWithSlug = tag;
|
|
41
|
+
if(options?.slug){
|
|
42
|
+
tagWithSlug = `${tag}-${slug}`;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
//console.warn("Slug:", slug,"tag:", tagWithSlug, "url:", url);
|
|
46
|
+
//console.warn('device:', device, 'params:', params);
|
|
47
|
+
let service = $this.pageServices[tagWithSlug];
|
|
48
|
+
if(service== undefined){
|
|
49
|
+
service = this.ots.abilities.createChildService?.(tagWithSlug);
|
|
50
|
+
await service.setup();
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
$this.pageServices[tagWithSlug] = service as PageService;
|
|
54
|
+
//console.log("Available services:", Object.keys(this.pageServices));
|
|
55
|
+
|
|
56
|
+
const res = await callback(service as PageService, { params, url });
|
|
57
|
+
|
|
58
|
+
return {
|
|
59
|
+
...res,
|
|
60
|
+
device: device,
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
mountPageService(tag:string, page:SveltePageProp, options?:{
|
|
69
|
+
onMount?:()=>Promise<void>,
|
|
70
|
+
onDestroy?:()=>Promise<void>
|
|
71
|
+
}){
|
|
72
|
+
let key = tag;
|
|
73
|
+
const $this = this;
|
|
74
|
+
console.log("Available services:", Object.keys(this.pageServices));
|
|
75
|
+
const service = this.pageServices[key] ;
|
|
76
|
+
this.log.OK("Mounting page service for tag:", tag, "Service:", service);
|
|
77
|
+
page.onMount(async () => {
|
|
78
|
+
this.log.OK("PageService", "onMount", key);
|
|
79
|
+
console.log("Available services:", Object.keys($this.pageServices));
|
|
80
|
+
await service.start();
|
|
81
|
+
if(options?.onMount){
|
|
82
|
+
await options.onMount();
|
|
83
|
+
}
|
|
84
|
+
// await service.start();
|
|
85
|
+
// if(options?.onMount){
|
|
86
|
+
// await options.onMount();
|
|
87
|
+
// }
|
|
88
|
+
// (this.pageServices["MainLayoutService"] as MainLayoutService).loading = false;
|
|
89
|
+
// (this.pageServices["MainLayoutService"] as MainLayoutService).mobileMenuOpen = false;
|
|
90
|
+
|
|
91
|
+
});
|
|
92
|
+
page.onDestroy(async () => {
|
|
93
|
+
this.log.OK("PageService", "onDestroy", key);
|
|
94
|
+
await service.stop();
|
|
95
|
+
if(options?.onDestroy){
|
|
96
|
+
await options.onDestroy();
|
|
97
|
+
}
|
|
98
|
+
});
|
|
99
|
+
|
|
100
|
+
return service as PageService;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
|
|
104
|
+
}
|