@devoplus/one-sdk 0.0.0-stage → 0.2.0-next.117
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/CHANGELOG.md +268 -0
- package/README.md +893 -2
- package/bin/accessRequest.d.mts +96 -0
- package/bin/accessRequest.mjs +340 -0
- package/bin/appOps.d.mts +97 -0
- package/bin/appOps.mjs +336 -0
- package/bin/dataCommand.mjs +131 -0
- package/bin/devConfig.mjs +132 -0
- package/bin/one.mjs +341 -0
- package/bin/session.mjs +239 -0
- package/dist/agentInput.d.ts +9 -0
- package/dist/agentInput.d.ts.map +1 -0
- package/dist/agentInput.js +102 -0
- package/dist/agentInput.js.map +1 -0
- package/dist/agentTools.d.ts +83 -0
- package/dist/agentTools.d.ts.map +1 -0
- package/dist/agentTools.js +164 -0
- package/dist/agentTools.js.map +1 -0
- package/dist/ai.d.ts +67 -0
- package/dist/ai.d.ts.map +1 -0
- package/dist/ai.js +129 -0
- package/dist/ai.js.map +1 -0
- package/dist/audit.d.ts +21 -0
- package/dist/audit.d.ts.map +1 -0
- package/dist/audit.js +58 -0
- package/dist/audit.js.map +1 -0
- package/dist/backend.d.ts +27 -0
- package/dist/backend.d.ts.map +1 -0
- package/dist/backend.js +63 -0
- package/dist/backend.js.map +1 -0
- package/dist/cache.d.ts +20 -0
- package/dist/cache.d.ts.map +1 -0
- package/dist/cache.js +84 -0
- package/dist/cache.js.map +1 -0
- package/dist/client.d.ts +147 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +469 -0
- package/dist/client.js.map +1 -0
- package/dist/components.d.ts +235 -0
- package/dist/components.d.ts.map +1 -0
- package/dist/components.js +1491 -0
- package/dist/components.js.map +1 -0
- package/dist/context.d.ts +110 -0
- package/dist/context.d.ts.map +1 -0
- package/dist/context.js +126 -0
- package/dist/context.js.map +1 -0
- package/dist/data/crud.d.ts +74 -0
- package/dist/data/crud.d.ts.map +1 -0
- package/dist/data/crud.js +614 -0
- package/dist/data/crud.js.map +1 -0
- package/dist/data/ddl.d.ts +76 -0
- package/dist/data/ddl.d.ts.map +1 -0
- package/dist/data/ddl.js +362 -0
- package/dist/data/ddl.js.map +1 -0
- package/dist/data/fold.d.ts +14 -0
- package/dist/data/fold.d.ts.map +1 -0
- package/dist/data/fold.js +76 -0
- package/dist/data/fold.js.map +1 -0
- package/dist/data/model.d.ts +113 -0
- package/dist/data/model.d.ts.map +1 -0
- package/dist/data/model.js +408 -0
- package/dist/data/model.js.map +1 -0
- package/dist/data/values.d.ts +29 -0
- package/dist/data/values.d.ts.map +1 -0
- package/dist/data/values.js +152 -0
- package/dist/data/values.js.map +1 -0
- package/dist/dexa.d.ts +44 -0
- package/dist/dexa.d.ts.map +1 -0
- package/dist/dexa.js +74 -0
- package/dist/dexa.js.map +1 -0
- package/dist/dexaCommand.d.ts +116 -0
- package/dist/dexaCommand.d.ts.map +1 -0
- package/dist/dexaCommand.js +226 -0
- package/dist/dexaCommand.js.map +1 -0
- package/dist/export/columns.d.ts +62 -0
- package/dist/export/columns.d.ts.map +1 -0
- package/dist/export/columns.js +127 -0
- package/dist/export/columns.js.map +1 -0
- package/dist/export/csv.d.ts +10 -0
- package/dist/export/csv.d.ts.map +1 -0
- package/dist/export/csv.js +30 -0
- package/dist/export/csv.js.map +1 -0
- package/dist/export/report.d.ts +19 -0
- package/dist/export/report.d.ts.map +1 -0
- package/dist/export/report.js +91 -0
- package/dist/export/report.js.map +1 -0
- package/dist/export/response.d.ts +14 -0
- package/dist/export/response.d.ts.map +1 -0
- package/dist/export/response.js +70 -0
- package/dist/export/response.js.map +1 -0
- package/dist/export/xlsx.d.ts +15 -0
- package/dist/export/xlsx.d.ts.map +1 -0
- package/dist/export/xlsx.js +167 -0
- package/dist/export/xlsx.js.map +1 -0
- package/dist/export/zip.d.ts +7 -0
- package/dist/export/zip.d.ts.map +1 -0
- package/dist/export/zip.js +83 -0
- package/dist/export/zip.js.map +1 -0
- package/dist/files.d.ts +52 -0
- package/dist/files.d.ts.map +1 -0
- package/dist/files.js +137 -0
- package/dist/files.js.map +1 -0
- package/dist/index.d.ts +31 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +35 -0
- package/dist/index.js.map +1 -0
- package/dist/jobs.d.ts +57 -0
- package/dist/jobs.d.ts.map +1 -0
- package/dist/jobs.js +157 -0
- package/dist/jobs.js.map +1 -0
- package/dist/log.d.ts +22 -0
- package/dist/log.d.ts.map +1 -0
- package/dist/log.js +107 -0
- package/dist/log.js.map +1 -0
- package/dist/notify.d.ts +41 -0
- package/dist/notify.d.ts.map +1 -0
- package/dist/notify.js +11 -0
- package/dist/notify.js.map +1 -0
- package/dist/org.d.ts +184 -0
- package/dist/org.d.ts.map +1 -0
- package/dist/org.js +114 -0
- package/dist/org.js.map +1 -0
- package/dist/people.d.ts +39 -0
- package/dist/people.d.ts.map +1 -0
- package/dist/people.js +88 -0
- package/dist/people.js.map +1 -0
- package/dist/problem.d.ts +12 -0
- package/dist/problem.d.ts.map +1 -0
- package/dist/problem.js +33 -0
- package/dist/problem.js.map +1 -0
- package/dist/runtime.d.ts +92 -0
- package/dist/runtime.d.ts.map +1 -0
- package/dist/runtime.js +8 -0
- package/dist/runtime.js.map +1 -0
- package/dist/scenarios.d.ts +125 -0
- package/dist/scenarios.d.ts.map +1 -0
- package/dist/scenarios.js +251 -0
- package/dist/scenarios.js.map +1 -0
- package/package.json +55 -3
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"components.js","sourceRoot":"","sources":["../src/components.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
export interface OneUser {
|
|
2
|
+
/** devoplus-auth `sub` — UserAccount kimlik uzayı (org şeması User._id DEĞİL). */
|
|
3
|
+
sub: string;
|
|
4
|
+
/** Uygulamaya verilmiş scope'lar (manifest'in alt kümesi). */
|
|
5
|
+
scope: readonly string[];
|
|
6
|
+
globalAdmin: boolean;
|
|
7
|
+
/**
|
|
8
|
+
* Kullanıcının BU uygulamanın ad alanındaki izinleri (`One.<Uygulama>.*`, D-49) — portal yöneticisi Yetki
|
|
9
|
+
* Yönetimi'nde kullanıcı gruplarına (org düğümlerine) atar. Başka uygulamaların ve portalın izinleri iletilmez.
|
|
10
|
+
*/
|
|
11
|
+
permissions: readonly string[];
|
|
12
|
+
/** Portal yöneticisi (şirket ya da küresel yönetici rolü): platformda her izne sahiptir, `hasPermission` de öyle sayar. */
|
|
13
|
+
admin: boolean;
|
|
14
|
+
}
|
|
15
|
+
/** Oturum bir başkası adına mı kullanılıyor (D-76 U3)? `delegation` = Vekalet, `impersonation` = Yerine Görüntüle. */
|
|
16
|
+
export type OneActingKind = 'delegation' | 'impersonation';
|
|
17
|
+
/**
|
|
18
|
+
* Vekalet / Yerine Görüntüle oturumunda işlemi GERÇEKTE yapan kişi. `user.sub` adına çalışılan kişidir (veri onundur);
|
|
19
|
+
* `actor.sub` oturumu kullanan kişidir — denetim kaydına ve "kim yaptı" bilgisine bu yazılır. Varsayılan olarak bu
|
|
20
|
+
* oturumlar salt-okunurdur: platform GET/HEAD dışındaki isteği uygulamaya ulaşmadan reddeder (manifest
|
|
21
|
+
* `actingSessions: "write"` beyan edilmedikçe).
|
|
22
|
+
*/
|
|
23
|
+
export interface OneActor {
|
|
24
|
+
sub: string;
|
|
25
|
+
kind: OneActingKind;
|
|
26
|
+
}
|
|
27
|
+
export interface OneContext {
|
|
28
|
+
app: string;
|
|
29
|
+
portalKey: string;
|
|
30
|
+
/** Kiracı: 24-hex PortalId. Veri her zaman buna bağlıdır (D-10). */
|
|
31
|
+
portalId: string;
|
|
32
|
+
/** Oturum yoksa null — yalnız okuma metotları buraya anonim ulaşabilir. */
|
|
33
|
+
user: OneUser | null;
|
|
34
|
+
/**
|
|
35
|
+
* Vekalet / Yerine Görüntüle oturumunda işlemi yapan kişi (D-76 U3); kendi oturumunda ve anonimde null. `readContext`
|
|
36
|
+
* her zaman yazar; isteğe bağlı olması yalnız elle kurulan bağlamlar (testler) kırılmasın diyedir.
|
|
37
|
+
*/
|
|
38
|
+
actor?: OneActor | null;
|
|
39
|
+
/**
|
|
40
|
+
* İsteğin geldiği yol (C6). `user`: tarayıcıdan, kullanıcının oturumuyla. `job`: platformun kuyruk ya da zamanlama
|
|
41
|
+
* çağrısı — Devoplus servisleri UYGULAMANIN kimliğiyle çağrılır (yalnız `jobs.services` beyanı + kurulumdaki yönetici
|
|
42
|
+
* onayı). `agent`: Devoplus ajanının araç çağrısı — servisler kişi adına çağrılır, süreli onay gerektirenler hariç.
|
|
43
|
+
* `readContext` her zaman yazar; isteğe bağlı olması yalnız elle kurulan bağlamlar kırılmasın diyedir (yoksa `user`).
|
|
44
|
+
*/
|
|
45
|
+
mode?: OneRequestMode;
|
|
46
|
+
/**
|
|
47
|
+
* Portal yöneticisi mi (`user.admin` ile aynı; oturumsuz ve iş çağrısında `false`). Ajan aracında yalnız çağıran kişi
|
|
48
|
+
* kurulumun portalının şirket yöneticisiyse `true` olur. `readContext` her zaman yazar.
|
|
49
|
+
*/
|
|
50
|
+
admin?: boolean;
|
|
51
|
+
/** İş çağrısında (`mode: 'job'`) manifest `jobs.services` beyanı; diğer yollarda boş. `readContext` her zaman yazar. */
|
|
52
|
+
jobServices?: readonly string[];
|
|
53
|
+
}
|
|
54
|
+
/** İsteğin geldiği yol — bkz. `OneContext.mode`. */
|
|
55
|
+
export type OneRequestMode = 'user' | 'job' | 'agent';
|
|
56
|
+
export declare class OneError extends Error {
|
|
57
|
+
readonly status: number;
|
|
58
|
+
readonly code: string;
|
|
59
|
+
/**
|
|
60
|
+
* Sunucunun "bu kadar saniye sonra yeniden deneyin" ipucu (`Retry-After` başlığı ya da ProblemDetails
|
|
61
|
+
* `retryAfterSeconds` alanı); yoksa `undefined`. Örnek: DEXA komutu 409 `ERPCMD-APP-E-016` (aynı işlem sürüyor).
|
|
62
|
+
*/
|
|
63
|
+
readonly retryAfterSeconds: number | undefined;
|
|
64
|
+
constructor(status: number, code: string, detail: string, options?: {
|
|
65
|
+
retryAfterSeconds?: number | undefined;
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
export declare function readContext(headers: Headers): OneContext;
|
|
69
|
+
/** Oturum bir başkası adına mı (Vekalet ya da Yerine Görüntüle)? */
|
|
70
|
+
export declare function isActingSession(ctx: OneContext): boolean;
|
|
71
|
+
/** Oturum zorunlu uçlar için: anonimse 401 fırlatır. */
|
|
72
|
+
export declare function requireUser(ctx: OneContext): OneUser;
|
|
73
|
+
/**
|
|
74
|
+
* Kullanıcının AYRICA ve SÜRELİ onay vermesi gereken scope'lar (karar defteri D-59): ERP'ye veri yazma ve kullanıcı
|
|
75
|
+
* adına e-posta/SMS/mobil bildirim. Manifest'te beyan edilmiş ve kullanıcının yetkisi olsa bile, kullanıcı bu uygulamaya
|
|
76
|
+
* bu portalda onay vermeden (30 gün geçerli) belirtece GİRMEZ; portal uygulamanın üstünde bir uyarı ve "İzinleri incele"
|
|
77
|
+
* düğmesi gösterir. Liste devoplus-auth `ONE_APP_CONSENT.scopes` ile aynıdır. `dexa.read` bu listede DEĞİLDİR.
|
|
78
|
+
*/
|
|
79
|
+
export declare const CONSENT_SCOPES: readonly string[];
|
|
80
|
+
/**
|
|
81
|
+
* Bu scope kullanıcının ayrı onayına bağlı ve belirteçte YOK mu? Uygulama ilgili düğmeyi kapatıp "portaldaki İzinleri
|
|
82
|
+
* incele düğmesiyle izin verin" diyebilsin diye. ⚠️ Belirteç yalnız scope'un OLMADIĞINI söyler: manifest'te hiç
|
|
83
|
+
* beyan edilmemiş bir scope için de `true` döner — beyan uygulamanın kendi bilgisidir. Oturumsuzsa `false`.
|
|
84
|
+
*/
|
|
85
|
+
export declare function awaitsUserConsent(ctx: OneContext, scope: string): boolean;
|
|
86
|
+
/**
|
|
87
|
+
* Scope kapısı: uygulama manifest'te beyan etmediği bir işi yapamaz. Onaya bağlı scope'ta (`CONSENT_SCOPES`) hata metni
|
|
88
|
+
* kullanıcıya izni nereden vereceğini de söyler; kod aynı kalır (`ONE-SDK-E-003`).
|
|
89
|
+
*/
|
|
90
|
+
export declare function requireScope(ctx: OneContext, scope: string): OneUser;
|
|
91
|
+
/**
|
|
92
|
+
* Devoplus servis çağrısının yerel scope kapısı (C6) — servis istemcileri bunu kullanır; asıl karar backend'dedir.
|
|
93
|
+
* - `user`: `requireScope` ile aynı (kullanıcının belirtecindeki scope).
|
|
94
|
+
* - `agent`: kişi adına; süreli onay gerektiren scope'lar (`CONSENT_SCOPES` — e-posta, SMS, bildirim, DEXA'ya yazma)
|
|
95
|
+
* ajan aracında HİÇ kullanılamaz (kişi bu çağrıda onay ekranını göremez).
|
|
96
|
+
* - `job`: kullanıcı GEREKMEZ; scope manifest `jobs.services` beyanında olmalı. Beyan yetmez: servis ancak kurulumda
|
|
97
|
+
* portal yöneticisi onaylarsa açılır (onay backend'de denetlenir, uygulama göremez → onaysızsa backend 403 döner).
|
|
98
|
+
*/
|
|
99
|
+
export declare function requireServiceScope(ctx: OneContext, scope: string): void;
|
|
100
|
+
/**
|
|
101
|
+
* Uygulama izni (D-49): kullanıcıda kod varsa ya da portal yöneticisiyse `true` (backend'in yönetici baypasıyla aynı
|
|
102
|
+
* kural — yönetici için HER kodda `true`). Anonim bağlamda `false`. Kod uygulamanın kendi ad alanında olmalıdır
|
|
103
|
+
* (`One.<Uygulama>.<Eylem>`); başka ad alanındaki kod dispatch'ten hiç gelmediği için yönetici olmayan kullanıcıda
|
|
104
|
+
* `false` döner. ⚠️ Ad alanı süzgeci bir kolaylıktır, gizlilik sınırı DEĞİL: belirteç kullanıcının bütün izinlerini
|
|
105
|
+
* taşır (inceleme bulgusu P2-1).
|
|
106
|
+
*/
|
|
107
|
+
export declare function hasPermission(ctx: OneContext, code: string): boolean;
|
|
108
|
+
/** İzin kapısı: oturum yoksa 401, izin yoksa 403 (`ONE-SDK-E-004`). */
|
|
109
|
+
export declare function requirePermission(ctx: OneContext, code: string): OneUser;
|
|
110
|
+
//# sourceMappingURL=context.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,OAAO;IACtB,kFAAkF;IAClF,GAAG,EAAE,MAAM,CAAA;IACX,8DAA8D;IAC9D,KAAK,EAAE,SAAS,MAAM,EAAE,CAAA;IACxB,WAAW,EAAE,OAAO,CAAA;IACpB;;;OAGG;IACH,WAAW,EAAE,SAAS,MAAM,EAAE,CAAA;IAC9B,2HAA2H;IAC3H,KAAK,EAAE,OAAO,CAAA;CACf;AAED,sHAAsH;AACtH,MAAM,MAAM,aAAa,GAAG,YAAY,GAAG,eAAe,CAAA;AAE1D;;;;;GAKG;AACH,MAAM,WAAW,QAAQ;IACvB,GAAG,EAAE,MAAM,CAAA;IACX,IAAI,EAAE,aAAa,CAAA;CACpB;AAED,MAAM,WAAW,UAAU;IACzB,GAAG,EAAE,MAAM,CAAA;IACX,SAAS,EAAE,MAAM,CAAA;IACjB,oEAAoE;IACpE,QAAQ,EAAE,MAAM,CAAA;IAChB,2EAA2E;IAC3E,IAAI,EAAE,OAAO,GAAG,IAAI,CAAA;IACpB;;;OAGG;IACH,KAAK,CAAC,EAAE,QAAQ,GAAG,IAAI,CAAA;IACvB;;;;;OAKG;IACH,IAAI,CAAC,EAAE,cAAc,CAAA;IACrB;;;OAGG;IACH,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,wHAAwH;IACxH,WAAW,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;CAChC;AAED,oDAAoD;AACpD,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,KAAK,GAAG,OAAO,CAAA;AAErD,qBAAa,QAAS,SAAQ,KAAK;IAQ/B,QAAQ,CAAC,MAAM,EAAE,MAAM;IACvB,QAAQ,CAAC,IAAI,EAAE,MAAM;IARvB;;;OAGG;IACH,QAAQ,CAAC,iBAAiB,EAAE,MAAM,GAAG,SAAS,CAAA;IAE9C,YACW,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACrB,MAAM,EAAE,MAAM,EACd,OAAO,GAAE;QAAE,iBAAiB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;KAAO,EAIzD;CACF;AAED,wBAAgB,WAAW,CAAC,OAAO,EAAE,OAAO,GAAG,UAAU,CAmCxD;AAED,oEAAoE;AACpE,wBAAgB,eAAe,CAAC,GAAG,EAAE,UAAU,GAAG,OAAO,CAExD;AAED,wDAAwD;AACxD,wBAAgB,WAAW,CAAC,GAAG,EAAE,UAAU,GAAG,OAAO,CAGpD;AAED;;;;;GAKG;AACH,eAAO,MAAM,cAAc,EAAE,SAAS,MAAM,EAAkE,CAAA;AAE9G;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAEzE;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAWpE;AAED;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAexE;AAED;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAIpE;AAED,uEAAuE;AACvE,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAIxE"}
|
package/dist/context.js
ADDED
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
export class OneError extends Error {
|
|
2
|
+
status;
|
|
3
|
+
code;
|
|
4
|
+
/**
|
|
5
|
+
* Sunucunun "bu kadar saniye sonra yeniden deneyin" ipucu (`Retry-After` başlığı ya da ProblemDetails
|
|
6
|
+
* `retryAfterSeconds` alanı); yoksa `undefined`. Örnek: DEXA komutu 409 `ERPCMD-APP-E-016` (aynı işlem sürüyor).
|
|
7
|
+
*/
|
|
8
|
+
retryAfterSeconds;
|
|
9
|
+
constructor(status, code, detail, options = {}) {
|
|
10
|
+
super(detail);
|
|
11
|
+
this.status = status;
|
|
12
|
+
this.code = code;
|
|
13
|
+
this.retryAfterSeconds = options.retryAfterSeconds;
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
export function readContext(headers) {
|
|
17
|
+
const app = headers.get('x-one-app');
|
|
18
|
+
const portalKey = headers.get('x-one-portal-key');
|
|
19
|
+
const portalId = headers.get('x-one-portal');
|
|
20
|
+
if (!app || !portalKey || !portalId)
|
|
21
|
+
// Dispatch dışından çağrı (ör. yanlış route) — bağlamsız çalışmak kiracı sınırını kaybettirir.
|
|
22
|
+
throw new OneError(500, 'ONE-SDK-E-001', 'Platform bağlamı eksik: istek dispatch üzerinden gelmedi.');
|
|
23
|
+
const auth = headers.get('x-one-auth');
|
|
24
|
+
const sub = headers.get('x-one-sub');
|
|
25
|
+
// `job`: platformun kuyruk işi çağrısı (D-80) — iletiyi bırakan kullanıcının `sub` ve yetki alanlarıyla; izin ve
|
|
26
|
+
// yönetici bilgisi taşınmaz (boş gelir). Zamanlanmış iş `sub` taşımaz → `user` null.
|
|
27
|
+
const user = (auth === 'user' || auth === 'job') && sub
|
|
28
|
+
? {
|
|
29
|
+
sub,
|
|
30
|
+
scope: (headers.get('x-one-scope') ?? '').split(' ').filter(Boolean),
|
|
31
|
+
globalAdmin: headers.get('x-one-global-admin') === 'true',
|
|
32
|
+
permissions: (headers.get('x-one-permissions') ?? '').split(' ').filter(Boolean),
|
|
33
|
+
admin: headers.get('x-one-admin') === 'true',
|
|
34
|
+
}
|
|
35
|
+
: null;
|
|
36
|
+
const actorSub = headers.get('x-one-actor-sub');
|
|
37
|
+
const sessionKind = headers.get('x-one-session-kind');
|
|
38
|
+
// Platform iki başlığı birlikte yazar; yalnız biri gelirse (beklenmeyen durum) yine başkası adına sayılır — "kendi
|
|
39
|
+
// oturumu" varsayımı yazma kararlarını gevşetirdi.
|
|
40
|
+
const actor = user && (actorSub || sessionKind)
|
|
41
|
+
? { sub: actorSub ?? '', kind: sessionKind === 'delegation' ? 'delegation' : 'impersonation' }
|
|
42
|
+
: null;
|
|
43
|
+
// Yol: platformun iş çağrısı `X-One-Auth: job`, Devoplus ajanının imzalı çağrısı `X-One-Invoked-By: devoplus-agent`
|
|
44
|
+
// yazar; istemcinin yazdığı aynı adlı başlıklar platform kapısında silinir.
|
|
45
|
+
const mode = auth === 'job' ? 'job' : headers.get('x-one-invoked-by') === 'devoplus-agent' ? 'agent' : 'user';
|
|
46
|
+
const jobServices = mode === 'job' ? (headers.get('x-one-job-services') ?? '').split(' ').filter(Boolean) : [];
|
|
47
|
+
return { app, portalKey, portalId, user, actor, mode, admin: user?.admin ?? false, jobServices };
|
|
48
|
+
}
|
|
49
|
+
/** Oturum bir başkası adına mı (Vekalet ya da Yerine Görüntüle)? */
|
|
50
|
+
export function isActingSession(ctx) {
|
|
51
|
+
return ctx.actor != null;
|
|
52
|
+
}
|
|
53
|
+
/** Oturum zorunlu uçlar için: anonimse 401 fırlatır. */
|
|
54
|
+
export function requireUser(ctx) {
|
|
55
|
+
if (!ctx.user)
|
|
56
|
+
throw new OneError(401, 'ONE-SDK-E-002', 'Bu işlem için oturum gerekir.');
|
|
57
|
+
return ctx.user;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Kullanıcının AYRICA ve SÜRELİ onay vermesi gereken scope'lar (karar defteri D-59): ERP'ye veri yazma ve kullanıcı
|
|
61
|
+
* adına e-posta/SMS/mobil bildirim. Manifest'te beyan edilmiş ve kullanıcının yetkisi olsa bile, kullanıcı bu uygulamaya
|
|
62
|
+
* bu portalda onay vermeden (30 gün geçerli) belirtece GİRMEZ; portal uygulamanın üstünde bir uyarı ve "İzinleri incele"
|
|
63
|
+
* düğmesi gösterir. Liste devoplus-auth `ONE_APP_CONSENT.scopes` ile aynıdır. `dexa.read` bu listede DEĞİLDİR.
|
|
64
|
+
*/
|
|
65
|
+
export const CONSENT_SCOPES = ['dexa.write', 'mail.execute', 'sms.execute', 'push.execute'];
|
|
66
|
+
/**
|
|
67
|
+
* Bu scope kullanıcının ayrı onayına bağlı ve belirteçte YOK mu? Uygulama ilgili düğmeyi kapatıp "portaldaki İzinleri
|
|
68
|
+
* incele düğmesiyle izin verin" diyebilsin diye. ⚠️ Belirteç yalnız scope'un OLMADIĞINI söyler: manifest'te hiç
|
|
69
|
+
* beyan edilmemiş bir scope için de `true` döner — beyan uygulamanın kendi bilgisidir. Oturumsuzsa `false`.
|
|
70
|
+
*/
|
|
71
|
+
export function awaitsUserConsent(ctx, scope) {
|
|
72
|
+
return ctx.user !== null && CONSENT_SCOPES.includes(scope) && !ctx.user.scope.includes(scope);
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Scope kapısı: uygulama manifest'te beyan etmediği bir işi yapamaz. Onaya bağlı scope'ta (`CONSENT_SCOPES`) hata metni
|
|
76
|
+
* kullanıcıya izni nereden vereceğini de söyler; kod aynı kalır (`ONE-SDK-E-003`).
|
|
77
|
+
*/
|
|
78
|
+
export function requireScope(ctx, scope) {
|
|
79
|
+
const user = requireUser(ctx);
|
|
80
|
+
if (!user.scope.includes(scope))
|
|
81
|
+
throw new OneError(403, 'ONE-SDK-E-003', CONSENT_SCOPES.includes(scope)
|
|
82
|
+
? `Bu işlem için "${scope}" yetkisi gerekir. Bu işlem için ayrıca izninizi vermeniz gerekiyor: portalda uygulamanın üstündeki "İzinleri incele" düğmesini kullanın.`
|
|
83
|
+
: `Bu işlem için "${scope}" yetkisi gerekir.`);
|
|
84
|
+
return user;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Devoplus servis çağrısının yerel scope kapısı (C6) — servis istemcileri bunu kullanır; asıl karar backend'dedir.
|
|
88
|
+
* - `user`: `requireScope` ile aynı (kullanıcının belirtecindeki scope).
|
|
89
|
+
* - `agent`: kişi adına; süreli onay gerektiren scope'lar (`CONSENT_SCOPES` — e-posta, SMS, bildirim, DEXA'ya yazma)
|
|
90
|
+
* ajan aracında HİÇ kullanılamaz (kişi bu çağrıda onay ekranını göremez).
|
|
91
|
+
* - `job`: kullanıcı GEREKMEZ; scope manifest `jobs.services` beyanında olmalı. Beyan yetmez: servis ancak kurulumda
|
|
92
|
+
* portal yöneticisi onaylarsa açılır (onay backend'de denetlenir, uygulama göremez → onaysızsa backend 403 döner).
|
|
93
|
+
*/
|
|
94
|
+
export function requireServiceScope(ctx, scope) {
|
|
95
|
+
if (ctx.mode === 'job') {
|
|
96
|
+
if (!(ctx.jobServices ?? []).includes(scope))
|
|
97
|
+
throw new OneError(403, 'ONE-SDK-E-003', `Arka plan işinde "${scope}" servisi kullanılamaz: manifest jobs.services içinde beyan edilmeli ve kurulumda portal yöneticisi onaylamalıdır.`);
|
|
98
|
+
return;
|
|
99
|
+
}
|
|
100
|
+
if (ctx.mode === 'agent' && CONSENT_SCOPES.includes(scope)) {
|
|
101
|
+
requireUser(ctx);
|
|
102
|
+
throw new OneError(403, 'ONE-SDK-E-003', `"${scope}" yetkisi Devoplus ajanının araç çağrısında kullanılamaz; bu işlemi uygulamanın ekranından yapın.`);
|
|
103
|
+
}
|
|
104
|
+
requireScope(ctx, scope);
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Uygulama izni (D-49): kullanıcıda kod varsa ya da portal yöneticisiyse `true` (backend'in yönetici baypasıyla aynı
|
|
108
|
+
* kural — yönetici için HER kodda `true`). Anonim bağlamda `false`. Kod uygulamanın kendi ad alanında olmalıdır
|
|
109
|
+
* (`One.<Uygulama>.<Eylem>`); başka ad alanındaki kod dispatch'ten hiç gelmediği için yönetici olmayan kullanıcıda
|
|
110
|
+
* `false` döner. ⚠️ Ad alanı süzgeci bir kolaylıktır, gizlilik sınırı DEĞİL: belirteç kullanıcının bütün izinlerini
|
|
111
|
+
* taşır (inceleme bulgusu P2-1).
|
|
112
|
+
*/
|
|
113
|
+
export function hasPermission(ctx, code) {
|
|
114
|
+
const user = ctx.user;
|
|
115
|
+
if (!user)
|
|
116
|
+
return false;
|
|
117
|
+
return user.admin || user.permissions.includes(code);
|
|
118
|
+
}
|
|
119
|
+
/** İzin kapısı: oturum yoksa 401, izin yoksa 403 (`ONE-SDK-E-004`). */
|
|
120
|
+
export function requirePermission(ctx, code) {
|
|
121
|
+
const user = requireUser(ctx);
|
|
122
|
+
if (!hasPermission(ctx, code))
|
|
123
|
+
throw new OneError(403, 'ONE-SDK-E-004', `Bu işlem için "${code}" izni gerekir.`);
|
|
124
|
+
return user;
|
|
125
|
+
}
|
|
126
|
+
//# sourceMappingURL=context.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.js","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { OneError, type OneContext } from '../context.ts';
|
|
2
|
+
import type { OneDatabase } from '../runtime.ts';
|
|
3
|
+
import { type ExportLang } from '../export/columns.ts';
|
|
4
|
+
import { type DataEntity, type DataField, type OneDataModel } from './model.ts';
|
|
5
|
+
import { type DbValue, type FieldIssue } from './values.ts';
|
|
6
|
+
export type CrudPermission = string | ((ctx: OneContext) => boolean);
|
|
7
|
+
export interface CrudOptions {
|
|
8
|
+
/** `one data generate`'in ürettiği `dataModel` (ya da `one.data.json` içeriği). */
|
|
9
|
+
model: OneDataModel;
|
|
10
|
+
entity: string;
|
|
11
|
+
/** `shared`: uygulamayı kullanan herkes bütün kayıtları görür · `own`: herkes yalnız kendi oluşturduğu kayıtları. */
|
|
12
|
+
records: 'shared' | 'own';
|
|
13
|
+
/** Uçların öneki (varsayılan `/api`). */
|
|
14
|
+
basePath?: string;
|
|
15
|
+
/** Okuma için uygulama izni (ör. `One.Talep.Read`) ya da `(ctx) => boolean`; verilmezse oturum yeter. */
|
|
16
|
+
canRead?: CrudPermission;
|
|
17
|
+
/** Yazma (oluşturma, güncelleme, silme) için izin; verilmezse oturum yeter. */
|
|
18
|
+
canWrite?: CrudPermission;
|
|
19
|
+
/** Vekalet / Yerine Görüntüle oturumunda yazma (varsayılan `read` = kapalı). */
|
|
20
|
+
actingSessions?: 'read' | 'write';
|
|
21
|
+
/** Varsayılan sayfa boyu (1-200, varsayılan 50). */
|
|
22
|
+
pageSize?: number;
|
|
23
|
+
/** Dışa aktarmada en çok satır (varsayılan 10.000, en çok 50.000). */
|
|
24
|
+
exportLimit?: number;
|
|
25
|
+
/** Dışa aktarma ve raporda tarih-saatlerin gösterildiği saat dilimi (varsayılan Europe/Istanbul). */
|
|
26
|
+
timeZone?: string;
|
|
27
|
+
}
|
|
28
|
+
export interface CrudHandler {
|
|
29
|
+
/** Varlığın uç yolu (ör. `/api/requests`). */
|
|
30
|
+
readonly path: string;
|
|
31
|
+
/** İstek bu varlığın uçlarından birine değilse `null`; değilse yanıt (hatalar dahil — RFC 9457). */
|
|
32
|
+
handle(request: Request, db: OneDatabase, ctx?: OneContext): Promise<Response | null>;
|
|
33
|
+
}
|
|
34
|
+
export declare const CRUD_MAX_PAGE_SIZE = 200;
|
|
35
|
+
export declare const CRUD_MAX_FILTERS = 20;
|
|
36
|
+
export declare const CRUD_MAX_BODY_BYTES: number;
|
|
37
|
+
export declare const CRUD_REPORT_MAX_ROWS = 2000;
|
|
38
|
+
/** Alan hatalarını taşıyan hata — yanıtta RFC 9457 gövdesine `errors: [{ field, message }]` olarak eklenir. */
|
|
39
|
+
export declare class DataValidationError extends OneError {
|
|
40
|
+
readonly errors: readonly FieldIssue[];
|
|
41
|
+
constructor(status: number, code: string, detail: string, errors: readonly FieldIssue[]);
|
|
42
|
+
}
|
|
43
|
+
/** Sorgu dizesi → WHERE parçaları + parametreler + sıralama + sayfa. Adlar yalnız modelden gelir. */
|
|
44
|
+
export interface ListQuery {
|
|
45
|
+
where: string[];
|
|
46
|
+
params: DbValue[];
|
|
47
|
+
orderBy: string;
|
|
48
|
+
page: number;
|
|
49
|
+
size: number;
|
|
50
|
+
lang: ExportLang;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Hazır liste bileşeninin (`<one-table src>`, D-83) sorgu lehçesi → bu uçların lehçesi. Bileşen `limit` · `page` ·
|
|
54
|
+
* `cursor` · `sort` + `order` · `q` · `<alan>From` / `<alan>To` · `lang` gönderir; uçlar `_size` · `_page` · `_sort` ·
|
|
55
|
+
* `<alan>.contains` · `<alan>.from` / `<alan>.to` · `_lang` bekler. İki lehçe aynı uçta çalışır: bileşen `src` olarak
|
|
56
|
+
* doğrudan `/api/<varlık>` alabilir (D-82 şablonları bunu kullanır; önce 400 "Bilinmeyen sorgu parametresi" dönüyordu).
|
|
57
|
+
*
|
|
58
|
+
* ⚠️ Lehçe adı modeldeki bir ALAN adıysa (ör. alanın adı `page`) o parametre alan süzgecidir — model önceliklidir
|
|
59
|
+
* (geriye uyum). `q` metin alanlarının (text · longText) HERHANGİ birinde içerir araması yapar (Türkçe katlanmış,
|
|
60
|
+
* `.contains` ile aynı kural). `cursor` bu uçlarda sayfa numarasıdır (yanıttaki `nextCursor`).
|
|
61
|
+
*/
|
|
62
|
+
export declare function translateTableDialect(entity: DataEntity, params: URLSearchParams): {
|
|
63
|
+
params: URLSearchParams;
|
|
64
|
+
search: string | null;
|
|
65
|
+
issues: FieldIssue[];
|
|
66
|
+
};
|
|
67
|
+
export declare function parseListQuery(entity: DataEntity, raw: URLSearchParams, defaults: {
|
|
68
|
+
pageSize: number;
|
|
69
|
+
}): ListQuery;
|
|
70
|
+
/** Benzersizlik ihlali iletisinden (`UNIQUE constraint failed: <tablo>.<kolon>`) alanı bulur. */
|
|
71
|
+
export declare function uniqueViolationField(entity: DataEntity, error: unknown): DataField | null | undefined;
|
|
72
|
+
/** Model + varlık için uç işleyicisi. Model ilk kullanımda doğrulanır (geçersizse her istek 500 `ONE-SDK-E-100`). */
|
|
73
|
+
export declare function createCrudHandler(options: CrudOptions): CrudHandler;
|
|
74
|
+
//# sourceMappingURL=crud.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"crud.d.ts","sourceRoot":"","sources":["../../src/data/crud.ts"],"names":[],"mappings":"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"}
|