@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.
Files changed (101) hide show
  1. package/.eslintrc.js +13 -0
  2. package/dist/ServiceManager.d.ts +26 -0
  3. package/dist/ServiceManager.js +351 -0
  4. package/dist/TestRun.d.ts +1 -0
  5. package/dist/TestRun.js +14 -0
  6. package/dist/index.d.ts +15 -0
  7. package/dist/index.js +22 -0
  8. package/dist/services/abstract/apiService/ApiService.d.ts +17 -0
  9. package/dist/services/abstract/apiService/ApiService.js +33 -0
  10. package/dist/services/abstract/authServices/AuthService.d.ts +75 -0
  11. package/dist/services/abstract/authServices/AuthService.js +275 -0
  12. package/dist/services/abstract/authServices/Authorization.d.ts +0 -0
  13. package/dist/services/abstract/authServices/Authorization.js +0 -0
  14. package/dist/services/abstract/extensionServices/ExtensionService.d.ts +25 -0
  15. package/dist/services/abstract/extensionServices/ExtensionService.js +21 -0
  16. package/dist/services/abstract/pageServices/LayoutPageService.d.ts +17 -0
  17. package/dist/services/abstract/pageServices/LayoutPageService.js +32 -0
  18. package/dist/services/abstract/pageServices/PageServices.d.ts +20 -0
  19. package/dist/services/abstract/pageServices/PageServices.js +23 -0
  20. package/dist/services/abstract/pageServices/controllers/NSPageControllerService.d.ts +10 -0
  21. package/dist/services/abstract/pageServices/controllers/NSPageControllerService.js +18 -0
  22. package/dist/services/abstract/pageServices/controllers/PageControllerService.d.ts +27 -0
  23. package/dist/services/abstract/pageServices/controllers/PageControllerService.js +24 -0
  24. package/dist/services/abstract/pageServices/controllers/SVPageControllerService.d.ts +34 -0
  25. package/dist/services/abstract/pageServices/controllers/SVPageControllerService.js +73 -0
  26. package/dist/services/abstract/pageServices/pages/NsPageService.d.ts +26 -0
  27. package/dist/services/abstract/pageServices/pages/NsPageService.js +66 -0
  28. package/dist/services/abstract/project/ProjectInfoService.d.ts +42 -0
  29. package/dist/services/abstract/project/ProjectInfoService.js +72 -0
  30. package/dist/services/abstract/webviewServices/WVBackService.d.ts +18 -0
  31. package/dist/services/abstract/webviewServices/WVBackService.js +22 -0
  32. package/dist/services/abstract/webviewServices/WVFrontService.d.ts +21 -0
  33. package/dist/services/abstract/webviewServices/WVFrontService.js +54 -0
  34. package/dist/services/abstract/webviewServices/nv.d.ts +26 -0
  35. package/dist/services/abstract/webviewServices/nv.js +99 -0
  36. package/dist/services/main/fetchServices/FetchBrowserService.d.ts +19 -0
  37. package/dist/services/main/fetchServices/FetchBrowserService.js +26 -0
  38. package/dist/services/main/httpServices/RequestHandlerService.d.ts +46 -0
  39. package/dist/services/main/httpServices/RequestHandlerService.js +165 -0
  40. package/dist/services/main/remoteApiControllerService/RemoteApiControllerService.d.ts +36 -0
  41. package/dist/services/main/remoteApiControllerService/RemoteApiControllerService.js +42 -0
  42. package/dist/services/main/testServices/TestService.d.ts +19 -0
  43. package/dist/services/main/testServices/TestService.js +22 -0
  44. package/dist/services/main/testServices/TestService2.d.ts +18 -0
  45. package/dist/services/main/testServices/TestService2.js +20 -0
  46. package/dist/types/RegisterServiceInfo.d.ts +13 -0
  47. package/dist/types/RegisterServiceInfo.js +1 -0
  48. package/dist/types/Service.d.ts +32 -0
  49. package/dist/types/Service.js +43 -0
  50. package/dist/types/ServiceConstructor.d.ts +5 -0
  51. package/dist/types/ServiceConstructor.js +1 -0
  52. package/dist/types/ServiceEntry.d.ts +6 -0
  53. package/dist/types/ServiceEntry.js +1 -0
  54. package/dist/types/ServiceOts.d.ts +12 -0
  55. package/dist/types/ServiceOts.js +1 -0
  56. package/dist/types/ServiceRegisterInfo.d.ts +29 -0
  57. package/dist/types/ServiceRegisterInfo.js +25 -0
  58. package/dist/types/ServiceResponse.d.ts +13 -0
  59. package/dist/types/ServiceResponse.js +1 -0
  60. package/dist/types/ServiceSetupOptions.d.ts +3 -0
  61. package/dist/types/ServiceSetupOptions.js +1 -0
  62. package/dist/types/ServiceStatus.d.ts +1 -0
  63. package/dist/types/ServiceStatus.js +1 -0
  64. package/dist/types/_ServiceError.d.ts +5 -0
  65. package/dist/types/_ServiceError.js +1 -0
  66. package/jest.config.js +5 -0
  67. package/package.json +35 -0
  68. package/src/ServiceManager.ts +403 -0
  69. package/src/TestRun.ts +17 -0
  70. package/src/index.ts +26 -0
  71. package/src/services/abstract/apiService/ApiService.ts +51 -0
  72. package/src/services/abstract/authServices/AuthService.ts +364 -0
  73. package/src/services/abstract/authServices/Authorization.ts +0 -0
  74. package/src/services/abstract/extensionServices/ExtensionService.ts +50 -0
  75. package/src/services/abstract/pageServices/LayoutPageService.ts +49 -0
  76. package/src/services/abstract/pageServices/PageServices.ts +37 -0
  77. package/src/services/abstract/pageServices/controllers/NSPageControllerService.ts +23 -0
  78. package/src/services/abstract/pageServices/controllers/PageControllerService.ts +56 -0
  79. package/src/services/abstract/pageServices/controllers/SVPageControllerService.ts +104 -0
  80. package/src/services/abstract/pageServices/pages/NSPageService.ts +82 -0
  81. package/src/services/abstract/project/ProjectInfoService.ts +108 -0
  82. package/src/services/abstract/webviewServices/WVBackService.ts +34 -0
  83. package/src/services/abstract/webviewServices/WVFrontService.ts +71 -0
  84. package/src/services/abstract/webviewServices/nv.js +112 -0
  85. package/src/services/abstract/webviewServices/nv.ts +125 -0
  86. package/src/services/main/fetchServices/FetchBrowserService.ts +40 -0
  87. package/src/services/main/httpServices/RequestHandlerService.ts +207 -0
  88. package/src/services/main/remoteApiControllerService/RemoteApiControllerService.ts +70 -0
  89. package/src/services/main/testServices/TestService.ts +36 -0
  90. package/src/services/main/testServices/TestService2.ts +34 -0
  91. package/src/types/RegisterServiceInfo.ts +19 -0
  92. package/src/types/Service.ts +61 -0
  93. package/src/types/ServiceConstructor.ts +6 -0
  94. package/src/types/ServiceEntry.ts +10 -0
  95. package/src/types/ServiceOts.ts +17 -0
  96. package/src/types/ServiceRegisterInfo.ts +48 -0
  97. package/src/types/ServiceResponse.ts +13 -0
  98. package/src/types/ServiceSetupOptions.ts +5 -0
  99. package/src/types/ServiceStatus.ts +2 -0
  100. package/src/types/_ServiceError.ts +5 -0
  101. 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
+ );
@@ -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
+ }