@progalaxyelabs/ngx-stonescriptphp-client 1.0.0 → 1.1.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/HLD.md +31 -0
- package/LICENSE +21 -0
- package/README.md +89 -2
- package/{lib → dist}/api-connection.service.d.ts +1 -3
- package/dist/api-connection.service.d.ts.map +1 -0
- package/dist/api-connection.service.js +314 -0
- package/dist/api-connection.service.js.map +1 -0
- package/{lib → dist}/api-response.model.d.ts +1 -0
- package/dist/api-response.model.d.ts.map +1 -0
- package/dist/api-response.model.js +51 -0
- package/dist/api-response.model.js.map +1 -0
- package/dist/auth.service.d.ts +4 -0
- package/dist/auth.service.d.ts.map +1 -0
- package/dist/auth.service.js +16 -0
- package/dist/auth.service.js.map +1 -0
- package/{lib → dist}/csrf.service.d.ts +1 -3
- package/dist/csrf.service.d.ts.map +1 -0
- package/dist/csrf.service.js +47 -0
- package/dist/csrf.service.js.map +1 -0
- package/dist/db.service.d.ts +4 -0
- package/dist/db.service.d.ts.map +1 -0
- package/dist/db.service.js +16 -0
- package/dist/db.service.js.map +1 -0
- package/{fesm2022/progalaxyelabs-ngx-stonescriptphp-client.mjs → dist/esm/api-connection.service.js} +28 -276
- package/dist/esm/api-connection.service.js.map +1 -0
- package/dist/esm/api-response.model.js +47 -0
- package/dist/esm/api-response.model.js.map +1 -0
- package/dist/esm/auth.service.js +13 -0
- package/dist/esm/auth.service.js.map +1 -0
- package/dist/esm/csrf.service.js +44 -0
- package/dist/esm/csrf.service.js.map +1 -0
- package/dist/esm/db.service.js +13 -0
- package/dist/esm/db.service.js.map +1 -0
- package/dist/esm/index.js +13 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/my-environment.model.js +29 -0
- package/dist/esm/my-environment.model.js.map +1 -0
- package/dist/esm/ngx-stonescriptphp-client.module.js +25 -0
- package/dist/esm/ngx-stonescriptphp-client.module.js.map +1 -0
- package/dist/esm/signin-status.service.js +23 -0
- package/dist/esm/signin-status.service.js.map +1 -0
- package/dist/esm/token.service.js +61 -0
- package/dist/esm/token.service.js.map +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +16 -0
- package/dist/index.js.map +1 -0
- package/{lib → dist}/my-environment.model.d.ts +1 -0
- package/dist/my-environment.model.d.ts.map +1 -0
- package/dist/my-environment.model.js +33 -0
- package/dist/my-environment.model.js.map +1 -0
- package/dist/ngx-stonescriptphp-client.module.d.ts +6 -0
- package/dist/ngx-stonescriptphp-client.module.d.ts.map +1 -0
- package/dist/ngx-stonescriptphp-client.module.js +28 -0
- package/dist/ngx-stonescriptphp-client.module.js.map +1 -0
- package/{lib → dist}/signin-status.service.d.ts +1 -3
- package/dist/signin-status.service.d.ts.map +1 -0
- package/dist/signin-status.service.js +26 -0
- package/dist/signin-status.service.js.map +1 -0
- package/{lib → dist}/token.service.d.ts +1 -3
- package/dist/token.service.d.ts.map +1 -0
- package/dist/token.service.js +64 -0
- package/dist/token.service.js.map +1 -0
- package/docs/AUTH_COMPATIBILITY.md +310 -0
- package/docs/CHANGELOG.md +261 -0
- package/package.json +59 -18
- package/esm2022/lib/api-connection.service.mjs +0 -304
- package/esm2022/lib/api-response.model.mjs +0 -44
- package/esm2022/lib/auth.service.mjs +0 -14
- package/esm2022/lib/csrf.service.mjs +0 -46
- package/esm2022/lib/db.service.mjs +0 -14
- package/esm2022/lib/my-environment.model.mjs +0 -31
- package/esm2022/lib/ngx-stonescriptphp-client/ngx-stonescriptphp-client.module.mjs +0 -27
- package/esm2022/lib/signin-status.service.mjs +0 -23
- package/esm2022/lib/token.service.mjs +0 -63
- package/esm2022/progalaxyelabs-ngx-stonescriptphp-client.mjs +0 -5
- package/esm2022/public-api.mjs +0 -13
- package/fesm2022/progalaxyelabs-ngx-stonescriptphp-client.mjs.map +0 -1
- package/index.d.ts +0 -5
- package/lib/auth.service.d.ts +0 -6
- package/lib/db.service.d.ts +0 -6
- package/lib/ngx-stonescriptphp-client/ngx-stonescriptphp-client.module.d.ts +0 -10
- package/public-api.d.ts +0 -9
package/HLD.md
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
# ngx-stonescriptphp-client - High Level Design
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
Official Angular HTTP client library for StoneScriptPHP backend framework.
|
|
5
|
+
|
|
6
|
+
## Purpose
|
|
7
|
+
Provides type-safe HTTP calls to StoneScriptPHP APIs using auto-generated TypeScript interfaces.
|
|
8
|
+
|
|
9
|
+
## Architecture
|
|
10
|
+
|
|
11
|
+
### Components
|
|
12
|
+
- **ApiConnectionService** - HTTP client wrapper with error handling
|
|
13
|
+
- **AuthService** - JWT token management
|
|
14
|
+
- **DbService** - IndexedDB offline storage integration
|
|
15
|
+
- **TokenService** - Token storage and refresh logic
|
|
16
|
+
- **SigninStatusService** - Authentication state management
|
|
17
|
+
|
|
18
|
+
### Flow
|
|
19
|
+
1. StoneScriptPHP generates TypeScript DTOs from PHP
|
|
20
|
+
2. Angular imports generated interfaces
|
|
21
|
+
3. HTTP calls use interfaces for type safety
|
|
22
|
+
4. Responses validated against DTOs
|
|
23
|
+
|
|
24
|
+
## Tech Stack
|
|
25
|
+
- Angular >= 19.0
|
|
26
|
+
- RxJS >= 7.8
|
|
27
|
+
- TypeScript >= 5.8
|
|
28
|
+
|
|
29
|
+
## Distribution
|
|
30
|
+
- Published to npm as @progalaxyelabs/ngx-stonescriptphp-client
|
|
31
|
+
- Future migration to @stonescriptphp namespace planned
|
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2025 ProGalaxy eLabs
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
CHANGED
|
@@ -7,6 +7,19 @@
|
|
|
7
7
|
|
|
8
8
|
**Note:** While published as `@progalaxyelabs/ngx-stonescriptphp-client`, this is the official client for [StoneScriptPHP](https://stonescriptphp.org). Future versions will migrate to the `@stonescriptphp` namespace.
|
|
9
9
|
|
|
10
|
+
## ✅ Authentication Support (v1.0.0+)
|
|
11
|
+
|
|
12
|
+
**Fully compatible with StoneScriptPHP Framework v2.1.x authentication!**
|
|
13
|
+
|
|
14
|
+
- ✅ **Cookie-based auth**: Secure httpOnly cookies + CSRF (StoneScriptPHP v2.1.x default)
|
|
15
|
+
- ✅ **Body-based auth**: Legacy mode for custom backends
|
|
16
|
+
- ✅ **Configurable**: Choose your auth strategy via environment config
|
|
17
|
+
- ✅ **All HTTP methods**: GET, POST, PUT, PATCH, DELETE with automatic token refresh
|
|
18
|
+
|
|
19
|
+
See [Configuration](#configuration) section below for setup details.
|
|
20
|
+
|
|
21
|
+
📖 **Documentation**: [CHANGELOG](docs/CHANGELOG.md) | [Auth Compatibility](docs/AUTH_COMPATIBILITY.md)
|
|
22
|
+
|
|
10
23
|
---
|
|
11
24
|
|
|
12
25
|
## What is this?
|
|
@@ -27,7 +40,7 @@ This library provides the HTTP client that consumes those contracts, giving you
|
|
|
27
40
|
- ✅ **RxJS observables** - Native Angular integration
|
|
28
41
|
- ✅ **Error handling** - Consistent error responses
|
|
29
42
|
- ✅ **Interceptors ready** - Add auth, logging, retry logic
|
|
30
|
-
- ✅ **Angular 19+** - Modern Angular standalone components
|
|
43
|
+
- ✅ **Angular 19+ & 20+** - Modern Angular standalone components
|
|
31
44
|
|
|
32
45
|
## Installation
|
|
33
46
|
|
|
@@ -105,6 +118,80 @@ PHP Backend (StoneScriptPHP) Angular Frontend
|
|
|
105
118
|
3. Import generated TypeScript interfaces in Angular
|
|
106
119
|
4. Make type-safe HTTP calls
|
|
107
120
|
|
|
121
|
+
## Configuration
|
|
122
|
+
|
|
123
|
+
### Authentication Modes (v1.0.0+)
|
|
124
|
+
|
|
125
|
+
Choose your authentication strategy based on your backend:
|
|
126
|
+
|
|
127
|
+
#### Cookie-based Auth (Recommended - StoneScriptPHP v2.1.x)
|
|
128
|
+
|
|
129
|
+
```typescript
|
|
130
|
+
// environment.ts
|
|
131
|
+
export const environment = {
|
|
132
|
+
production: false,
|
|
133
|
+
apiServer: {
|
|
134
|
+
host: 'http://localhost:8000/'
|
|
135
|
+
},
|
|
136
|
+
auth: {
|
|
137
|
+
mode: 'cookie', // Default mode
|
|
138
|
+
refreshEndpoint: '/auth/refresh', // Default endpoint
|
|
139
|
+
useCsrf: true, // Default for cookie mode
|
|
140
|
+
refreshTokenCookieName: 'refresh_token', // Default
|
|
141
|
+
csrfTokenCookieName: 'csrf_token', // Default
|
|
142
|
+
csrfHeaderName: 'X-CSRF-Token' // Default
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
**Features:**
|
|
148
|
+
- Secure httpOnly cookies prevent XSS attacks
|
|
149
|
+
- CSRF token protection
|
|
150
|
+
- Token rotation on refresh
|
|
151
|
+
- Works with StoneScriptPHP `AuthRoutes::register($router)`
|
|
152
|
+
|
|
153
|
+
#### Body-based Auth (Legacy/Custom Backends)
|
|
154
|
+
|
|
155
|
+
```typescript
|
|
156
|
+
// environment.ts
|
|
157
|
+
export const environment = {
|
|
158
|
+
production: false,
|
|
159
|
+
apiServer: {
|
|
160
|
+
host: 'http://localhost:8000/'
|
|
161
|
+
},
|
|
162
|
+
auth: {
|
|
163
|
+
mode: 'body',
|
|
164
|
+
refreshEndpoint: '/user/refresh_access',
|
|
165
|
+
useCsrf: false
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
**Use when:**
|
|
171
|
+
- Your backend accepts tokens in request body
|
|
172
|
+
- Custom authentication implementation
|
|
173
|
+
- Migrating from older systems
|
|
174
|
+
|
|
175
|
+
#### Manual Auth (No Auto-Refresh)
|
|
176
|
+
|
|
177
|
+
```typescript
|
|
178
|
+
// environment.ts
|
|
179
|
+
export const environment = {
|
|
180
|
+
production: false,
|
|
181
|
+
apiServer: {
|
|
182
|
+
host: 'http://localhost:8000/'
|
|
183
|
+
},
|
|
184
|
+
auth: {
|
|
185
|
+
mode: 'none'
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
```
|
|
189
|
+
|
|
190
|
+
**Use when:**
|
|
191
|
+
- You handle token refresh manually
|
|
192
|
+
- No authentication needed
|
|
193
|
+
- Custom auth logic
|
|
194
|
+
|
|
108
195
|
## Advanced Usage
|
|
109
196
|
|
|
110
197
|
### With Interceptors
|
|
@@ -151,7 +238,7 @@ StoneScriptPHP responses follow this structure:
|
|
|
151
238
|
|
|
152
239
|
## Requirements
|
|
153
240
|
|
|
154
|
-
- Angular >= 19.0.0
|
|
241
|
+
- Angular >= 19.0.0 or 20.0.0
|
|
155
242
|
- RxJS >= 7.8.0
|
|
156
243
|
- TypeScript >= 5.8.0
|
|
157
244
|
|
|
@@ -3,7 +3,6 @@ import { SigninStatusService } from './signin-status.service';
|
|
|
3
3
|
import { ApiResponse } from './api-response.model';
|
|
4
4
|
import { MyEnvironmentModel } from './my-environment.model';
|
|
5
5
|
import { CsrfService } from './csrf.service';
|
|
6
|
-
import * as i0 from "@angular/core";
|
|
7
6
|
export declare class ApiConnectionService {
|
|
8
7
|
private tokens;
|
|
9
8
|
private signinStatus;
|
|
@@ -32,6 +31,5 @@ export declare class ApiConnectionService {
|
|
|
32
31
|
*/
|
|
33
32
|
private refreshAccessTokenBodyMode;
|
|
34
33
|
buildQueryString(options?: any): string;
|
|
35
|
-
static ɵfac: i0.ɵɵFactoryDeclaration<ApiConnectionService, never>;
|
|
36
|
-
static ɵprov: i0.ɵɵInjectableDeclaration<ApiConnectionService>;
|
|
37
34
|
}
|
|
35
|
+
//# sourceMappingURL=api-connection.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api-connection.service.d.ts","sourceRoot":"","sources":["../src/api-connection.service.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAC9D,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACnD,OAAO,EAAE,kBAAkB,EAAc,MAAM,wBAAwB,CAAC;AACxE,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAE7C,qBAGa,oBAAoB;IASzB,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,YAAY;IACpB,OAAO,CAAC,WAAW;IACnB,OAAO,CAAC,IAAI;IAVhB,OAAO,CAAC,IAAI,CAAK;IAEjB,OAAO,CAAC,WAAW,CAAK;IAExB,OAAO,CAAC,UAAU,CAAY;gBAGlB,MAAM,EAAE,YAAY,EACpB,YAAY,EAAE,mBAAmB,EACjC,WAAW,EAAE,kBAAkB,EAC/B,IAAI,EAAE,WAAW;YA4Bf,OAAO;IAmCrB,OAAO,CAAC,WAAW;IAOb,GAAG,CAAC,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,cAAc,CAAC,EAAE,GAAG,GAAI,OAAO,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;IAStF,IAAI,CAAC,QAAQ,EAAE,mBAAmB,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,GAAG,OAAO,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;IActF,GAAG,CAAC,QAAQ,EAAE,mBAAmB,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,GAAG,OAAO,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;IAcrF,KAAK,CAAC,QAAQ,EAAE,mBAAmB,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,GAAG,OAAO,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;IAcvF,MAAM,CAAC,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,cAAc,CAAC,EAAE,GAAG,GAAG,OAAO,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;IAsC9F,OAAO,CAAC,kBAAkB;YAaZ,0BAA0B;IAYlC,kBAAkB,IAAI,OAAO,CAAC,OAAO,CAAC;IAY5C;;OAEG;YACW,4BAA4B;IAwD1C;;OAEG;YACW,0BAA0B;IAkDxC,gBAAgB,CAAC,OAAO,CAAC,EAAE,GAAG,GAAG,MAAM;CAkB1C"}
|
|
@@ -0,0 +1,314 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ApiConnectionService = void 0;
|
|
4
|
+
const tslib_1 = require("tslib");
|
|
5
|
+
const core_1 = require("@angular/core");
|
|
6
|
+
const token_service_1 = require("./token.service");
|
|
7
|
+
const signin_status_service_1 = require("./signin-status.service");
|
|
8
|
+
const api_response_model_1 = require("./api-response.model");
|
|
9
|
+
const my_environment_model_1 = require("./my-environment.model");
|
|
10
|
+
const csrf_service_1 = require("./csrf.service");
|
|
11
|
+
let ApiConnectionService = class ApiConnectionService {
|
|
12
|
+
tokens;
|
|
13
|
+
signinStatus;
|
|
14
|
+
environment;
|
|
15
|
+
csrf;
|
|
16
|
+
host = ''; // contains trailing slash
|
|
17
|
+
accessToken = '';
|
|
18
|
+
authConfig;
|
|
19
|
+
constructor(tokens, signinStatus, environment, csrf) {
|
|
20
|
+
this.tokens = tokens;
|
|
21
|
+
this.signinStatus = signinStatus;
|
|
22
|
+
this.environment = environment;
|
|
23
|
+
this.csrf = csrf;
|
|
24
|
+
this.host = environment.apiServer.host;
|
|
25
|
+
// Set default auth config based on mode
|
|
26
|
+
this.authConfig = {
|
|
27
|
+
mode: environment.auth?.mode || 'cookie',
|
|
28
|
+
refreshEndpoint: environment.auth?.refreshEndpoint,
|
|
29
|
+
useCsrf: environment.auth?.useCsrf,
|
|
30
|
+
refreshTokenCookieName: environment.auth?.refreshTokenCookieName || 'refresh_token',
|
|
31
|
+
csrfTokenCookieName: environment.auth?.csrfTokenCookieName || 'csrf_token',
|
|
32
|
+
csrfHeaderName: environment.auth?.csrfHeaderName || 'X-CSRF-Token'
|
|
33
|
+
};
|
|
34
|
+
// Set default refresh endpoint based on mode if not specified
|
|
35
|
+
if (!this.authConfig.refreshEndpoint) {
|
|
36
|
+
this.authConfig.refreshEndpoint = this.authConfig.mode === 'cookie'
|
|
37
|
+
? '/auth/refresh'
|
|
38
|
+
: '/user/refresh_access';
|
|
39
|
+
}
|
|
40
|
+
// Set default CSRF setting based on mode if not specified
|
|
41
|
+
if (this.authConfig.useCsrf === undefined) {
|
|
42
|
+
this.authConfig.useCsrf = this.authConfig.mode === 'cookie';
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
async request(url, options, data) {
|
|
46
|
+
try {
|
|
47
|
+
if (data !== null) {
|
|
48
|
+
const body = JSON.stringify(data);
|
|
49
|
+
if (body) {
|
|
50
|
+
options.body = body;
|
|
51
|
+
}
|
|
52
|
+
else {
|
|
53
|
+
options.body = {};
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
const accessTokenIncluded = this.includeAccessToken(options);
|
|
57
|
+
let response = await fetch(url, options);
|
|
58
|
+
if ((response.status === 401) && accessTokenIncluded) {
|
|
59
|
+
response = await this.refreshAccessTokenAndRetry(url, options, response);
|
|
60
|
+
}
|
|
61
|
+
if (response.ok) {
|
|
62
|
+
const json = await (response.json());
|
|
63
|
+
return (new api_response_model_1.ApiResponse(json.status, json.data, json.message));
|
|
64
|
+
}
|
|
65
|
+
if (response.status === 401) {
|
|
66
|
+
this.signinStatus.signedOut();
|
|
67
|
+
}
|
|
68
|
+
return this.handleError(response);
|
|
69
|
+
}
|
|
70
|
+
catch (error) {
|
|
71
|
+
return this.handleError(error);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
handleError(error) {
|
|
75
|
+
console.error(`Backend returned code ${error.status}, ` +
|
|
76
|
+
`full error: `, error);
|
|
77
|
+
return new api_response_model_1.ApiResponse('error');
|
|
78
|
+
}
|
|
79
|
+
async get(endpoint, queryParamsObj) {
|
|
80
|
+
const url = this.host + endpoint.replace(/^\/+/, '') + this.buildQueryString(queryParamsObj);
|
|
81
|
+
const fetchOptions = {
|
|
82
|
+
mode: 'cors',
|
|
83
|
+
redirect: 'error'
|
|
84
|
+
};
|
|
85
|
+
return this.request(url, fetchOptions, null);
|
|
86
|
+
}
|
|
87
|
+
async post(pathWithQueryParams, data) {
|
|
88
|
+
const url = this.host + pathWithQueryParams.replace(/^\/+/, '');
|
|
89
|
+
const fetchOptions = {
|
|
90
|
+
method: 'POST',
|
|
91
|
+
mode: 'cors',
|
|
92
|
+
redirect: 'error',
|
|
93
|
+
headers: {
|
|
94
|
+
'Content-Type': 'application/json'
|
|
95
|
+
},
|
|
96
|
+
body: JSON.stringify(data)
|
|
97
|
+
};
|
|
98
|
+
return this.request(url, fetchOptions, data);
|
|
99
|
+
}
|
|
100
|
+
async put(pathWithQueryParams, data) {
|
|
101
|
+
const url = this.host + pathWithQueryParams.replace(/^\/+/, '');
|
|
102
|
+
const fetchOptions = {
|
|
103
|
+
method: 'PUT',
|
|
104
|
+
mode: 'cors',
|
|
105
|
+
redirect: 'error',
|
|
106
|
+
headers: {
|
|
107
|
+
'Content-Type': 'application/json'
|
|
108
|
+
},
|
|
109
|
+
body: JSON.stringify(data)
|
|
110
|
+
};
|
|
111
|
+
return this.request(url, fetchOptions, data);
|
|
112
|
+
}
|
|
113
|
+
async patch(pathWithQueryParams, data) {
|
|
114
|
+
const url = this.host + pathWithQueryParams.replace(/^\/+/, '');
|
|
115
|
+
const fetchOptions = {
|
|
116
|
+
method: 'PATCH',
|
|
117
|
+
mode: 'cors',
|
|
118
|
+
redirect: 'error',
|
|
119
|
+
headers: {
|
|
120
|
+
'Content-Type': 'application/json'
|
|
121
|
+
},
|
|
122
|
+
body: JSON.stringify(data)
|
|
123
|
+
};
|
|
124
|
+
return this.request(url, fetchOptions, data);
|
|
125
|
+
}
|
|
126
|
+
async delete(endpoint, queryParamsObj) {
|
|
127
|
+
const url = this.host + endpoint.replace(/^\/+/, '') + this.buildQueryString(queryParamsObj);
|
|
128
|
+
const fetchOptions = {
|
|
129
|
+
method: 'DELETE',
|
|
130
|
+
mode: 'cors',
|
|
131
|
+
redirect: 'error'
|
|
132
|
+
};
|
|
133
|
+
return this.request(url, fetchOptions, null);
|
|
134
|
+
}
|
|
135
|
+
// async postFormWithFiles(pathWithQueryParams: string, formData: FormData): Promise<ApiResponse | null> {
|
|
136
|
+
// const url = this.host + pathWithQueryParams.replace(/^\/+/, '')
|
|
137
|
+
// try {
|
|
138
|
+
// const fetchOptions: RequestInit = {
|
|
139
|
+
// method: 'POST',
|
|
140
|
+
// mode: 'cors',
|
|
141
|
+
// redirect: 'error',
|
|
142
|
+
// body: formData
|
|
143
|
+
// }
|
|
144
|
+
// const accessTokenIncluded = this.includeAccessToken(fetchOptions)
|
|
145
|
+
// let response: Response = await fetch(url, fetchOptions)
|
|
146
|
+
// if ((response.status === 401) && accessTokenIncluded) {
|
|
147
|
+
// response = await this.refreshAccessTokenAndRetry(url, fetchOptions, response)
|
|
148
|
+
// }
|
|
149
|
+
// if (response.ok) {
|
|
150
|
+
// return ((await (response.json()) as ApiResponse))
|
|
151
|
+
// }
|
|
152
|
+
// return this.handleError(response)
|
|
153
|
+
// } catch (error) {
|
|
154
|
+
// return this.handleError(error)
|
|
155
|
+
// }
|
|
156
|
+
// }
|
|
157
|
+
includeAccessToken(options) {
|
|
158
|
+
this.accessToken = this.tokens.getAccessToken();
|
|
159
|
+
if (!this.accessToken) {
|
|
160
|
+
return false;
|
|
161
|
+
}
|
|
162
|
+
if (!options.headers) {
|
|
163
|
+
options.headers = {};
|
|
164
|
+
}
|
|
165
|
+
options.headers['Authorization'] = 'Bearer ' + this.accessToken;
|
|
166
|
+
return true;
|
|
167
|
+
}
|
|
168
|
+
async refreshAccessTokenAndRetry(url, fetchOptions, response) {
|
|
169
|
+
const refreshStatusOk = await this.refreshAccessToken();
|
|
170
|
+
if (!refreshStatusOk) {
|
|
171
|
+
return response;
|
|
172
|
+
}
|
|
173
|
+
fetchOptions.headers['Authorization'] = 'Bearer ' + this.accessToken;
|
|
174
|
+
response = await fetch(url, fetchOptions);
|
|
175
|
+
return response;
|
|
176
|
+
}
|
|
177
|
+
async refreshAccessToken() {
|
|
178
|
+
if (this.authConfig.mode === 'none') {
|
|
179
|
+
return false;
|
|
180
|
+
}
|
|
181
|
+
if (this.authConfig.mode === 'cookie') {
|
|
182
|
+
return await this.refreshAccessTokenCookieMode();
|
|
183
|
+
}
|
|
184
|
+
else {
|
|
185
|
+
return await this.refreshAccessTokenBodyMode();
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* Refresh access token using cookie-based auth (StoneScriptPHP v2.1.x default)
|
|
190
|
+
*/
|
|
191
|
+
async refreshAccessTokenCookieMode() {
|
|
192
|
+
try {
|
|
193
|
+
const refreshTokenUrl = this.host + this.authConfig.refreshEndpoint.replace(/^\/+/, '');
|
|
194
|
+
const headers = {
|
|
195
|
+
'Content-Type': 'application/json'
|
|
196
|
+
};
|
|
197
|
+
// Add CSRF token if enabled
|
|
198
|
+
if (this.authConfig.useCsrf) {
|
|
199
|
+
const csrfToken = this.csrf.getCsrfToken(this.authConfig.csrfTokenCookieName);
|
|
200
|
+
if (!csrfToken) {
|
|
201
|
+
console.error('CSRF token not found in cookie');
|
|
202
|
+
return false;
|
|
203
|
+
}
|
|
204
|
+
headers[this.authConfig.csrfHeaderName] = csrfToken;
|
|
205
|
+
}
|
|
206
|
+
let refreshTokenResponse = await fetch(refreshTokenUrl, {
|
|
207
|
+
method: 'POST',
|
|
208
|
+
mode: 'cors',
|
|
209
|
+
credentials: 'include', // Important: send cookies
|
|
210
|
+
redirect: 'error',
|
|
211
|
+
headers: headers
|
|
212
|
+
});
|
|
213
|
+
if (!refreshTokenResponse.ok) {
|
|
214
|
+
this.accessToken = '';
|
|
215
|
+
this.tokens.clear();
|
|
216
|
+
return false;
|
|
217
|
+
}
|
|
218
|
+
let refreshAccessData = await refreshTokenResponse.json();
|
|
219
|
+
if (!refreshAccessData || refreshAccessData.status !== 'ok') {
|
|
220
|
+
return false;
|
|
221
|
+
}
|
|
222
|
+
// Extract access token from response
|
|
223
|
+
const newAccessToken = refreshAccessData.data?.access_token || refreshAccessData.access_token;
|
|
224
|
+
if (!newAccessToken) {
|
|
225
|
+
console.error('No access token in refresh response');
|
|
226
|
+
return false;
|
|
227
|
+
}
|
|
228
|
+
// Store new access token (refresh token is in httpOnly cookie)
|
|
229
|
+
this.tokens.setAccessToken(newAccessToken);
|
|
230
|
+
this.accessToken = newAccessToken;
|
|
231
|
+
return true;
|
|
232
|
+
}
|
|
233
|
+
catch (error) {
|
|
234
|
+
console.error('Token refresh failed (cookie mode):', error);
|
|
235
|
+
this.accessToken = '';
|
|
236
|
+
this.tokens.clear();
|
|
237
|
+
return false;
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
/**
|
|
241
|
+
* Refresh access token using body-based auth (legacy mode)
|
|
242
|
+
*/
|
|
243
|
+
async refreshAccessTokenBodyMode() {
|
|
244
|
+
try {
|
|
245
|
+
const refreshToken = this.tokens.getRefreshToken();
|
|
246
|
+
if (!refreshToken) {
|
|
247
|
+
return false;
|
|
248
|
+
}
|
|
249
|
+
const refreshTokenUrl = this.host + this.authConfig.refreshEndpoint.replace(/^\/+/, '');
|
|
250
|
+
let refreshTokenResponse = await fetch(refreshTokenUrl, {
|
|
251
|
+
method: 'POST',
|
|
252
|
+
mode: 'cors',
|
|
253
|
+
redirect: 'error',
|
|
254
|
+
headers: {
|
|
255
|
+
'Content-Type': 'application/json'
|
|
256
|
+
},
|
|
257
|
+
body: JSON.stringify({
|
|
258
|
+
access_token: this.accessToken,
|
|
259
|
+
refresh_token: refreshToken
|
|
260
|
+
})
|
|
261
|
+
});
|
|
262
|
+
if (!refreshTokenResponse.ok) {
|
|
263
|
+
this.accessToken = '';
|
|
264
|
+
this.tokens.clear();
|
|
265
|
+
return false;
|
|
266
|
+
}
|
|
267
|
+
let refreshAccessData = await refreshTokenResponse.json();
|
|
268
|
+
if (!refreshAccessData) {
|
|
269
|
+
return false;
|
|
270
|
+
}
|
|
271
|
+
const newAccessToken = refreshAccessData.data?.access_token || refreshAccessData.access_token;
|
|
272
|
+
if (!newAccessToken) {
|
|
273
|
+
console.error('No access token in refresh response');
|
|
274
|
+
return false;
|
|
275
|
+
}
|
|
276
|
+
this.tokens.setTokens(newAccessToken, refreshToken);
|
|
277
|
+
this.accessToken = newAccessToken;
|
|
278
|
+
return true;
|
|
279
|
+
}
|
|
280
|
+
catch (error) {
|
|
281
|
+
console.error('Token refresh failed (body mode):', error);
|
|
282
|
+
this.accessToken = '';
|
|
283
|
+
this.tokens.clear();
|
|
284
|
+
return false;
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
buildQueryString(options) {
|
|
288
|
+
if (options === undefined) {
|
|
289
|
+
return '';
|
|
290
|
+
}
|
|
291
|
+
const array = [];
|
|
292
|
+
for (let key in options) {
|
|
293
|
+
if (options.hasOwnProperty(key) && (options[key] !== null) && (options[key] !== undefined)) {
|
|
294
|
+
array.push(encodeURIComponent(key) + "=" + encodeURIComponent(options[key]));
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
const str = array.join('&');
|
|
298
|
+
if (str !== '') {
|
|
299
|
+
return '?' + str;
|
|
300
|
+
}
|
|
301
|
+
return '';
|
|
302
|
+
}
|
|
303
|
+
};
|
|
304
|
+
exports.ApiConnectionService = ApiConnectionService;
|
|
305
|
+
exports.ApiConnectionService = ApiConnectionService = tslib_1.__decorate([
|
|
306
|
+
(0, core_1.Injectable)({
|
|
307
|
+
providedIn: 'root'
|
|
308
|
+
}),
|
|
309
|
+
tslib_1.__metadata("design:paramtypes", [token_service_1.TokenService,
|
|
310
|
+
signin_status_service_1.SigninStatusService,
|
|
311
|
+
my_environment_model_1.MyEnvironmentModel,
|
|
312
|
+
csrf_service_1.CsrfService])
|
|
313
|
+
], ApiConnectionService);
|
|
314
|
+
//# sourceMappingURL=api-connection.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api-connection.service.js","sourceRoot":"","sources":["../src/api-connection.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api-response.model.d.ts","sourceRoot":"","sources":["../src/api-response.model.ts"],"names":[],"mappings":"AAAA,qBAAa,WAAW,CAAC,QAAQ;IAC7B,OAAO,CAAC,MAAM,CAAQ;IACtB,OAAO,CAAC,IAAI,CAAK;IACjB,OAAO,CAAC,OAAO,CAAQ;gBAEX,MAAM,EAAE,MAAM,EAAE,IAAI,GAAE,GAAQ,EAAE,OAAO,GAAE,MAAW;IAMhE,IAAI,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,QAAQ,KAAK,IAAI,GAAG,WAAW,CAAC,QAAQ,CAAC;IAO/D,OAAO,CAAC,QAAQ,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,KAAK,IAAI,GAAG,WAAW,CAAC,QAAQ,CAAC;IAOnF,OAAO,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,WAAW,CAAC,QAAQ,CAAC;IAOpD,SAAS,IAAI,OAAO;IAIpB,OAAO,IAAI,OAAO;IAIlB,OAAO,IAAI,QAAQ,GAAG,IAAI;IAI1B,QAAQ,IAAI,MAAM;IAIlB,SAAS,IAAI,MAAM;IAInB,UAAU,IAAI,MAAM;CAGvB"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ApiResponse = void 0;
|
|
4
|
+
class ApiResponse {
|
|
5
|
+
status;
|
|
6
|
+
data;
|
|
7
|
+
message;
|
|
8
|
+
constructor(status, data = {}, message = '') {
|
|
9
|
+
this.status = status;
|
|
10
|
+
this.data = data;
|
|
11
|
+
this.message = message;
|
|
12
|
+
}
|
|
13
|
+
onOk(callback) {
|
|
14
|
+
if (this.status === 'ok') {
|
|
15
|
+
callback(this.data);
|
|
16
|
+
}
|
|
17
|
+
return this;
|
|
18
|
+
}
|
|
19
|
+
onNotOk(callback) {
|
|
20
|
+
if (this.status === 'not ok') {
|
|
21
|
+
callback(this.message, this.data);
|
|
22
|
+
}
|
|
23
|
+
return this;
|
|
24
|
+
}
|
|
25
|
+
onError(callback) {
|
|
26
|
+
if (this.status === 'error') {
|
|
27
|
+
callback();
|
|
28
|
+
}
|
|
29
|
+
return this;
|
|
30
|
+
}
|
|
31
|
+
isSuccess() {
|
|
32
|
+
return this.status === 'ok';
|
|
33
|
+
}
|
|
34
|
+
isError() {
|
|
35
|
+
return this.status === 'error' || this.status === 'not ok';
|
|
36
|
+
}
|
|
37
|
+
getData() {
|
|
38
|
+
return this.data || null;
|
|
39
|
+
}
|
|
40
|
+
getError() {
|
|
41
|
+
return this.message || 'Unknown error';
|
|
42
|
+
}
|
|
43
|
+
getStatus() {
|
|
44
|
+
return this.status;
|
|
45
|
+
}
|
|
46
|
+
getMessage() {
|
|
47
|
+
return this.message;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
exports.ApiResponse = ApiResponse;
|
|
51
|
+
//# sourceMappingURL=api-response.model.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api-response.model.js","sourceRoot":"","sources":["../src/api-response.model.ts"],"names":[],"mappings":";;;AAAA,MAAa,WAAW;IACZ,MAAM,CAAQ;IACd,IAAI,CAAK;IACT,OAAO,CAAQ;IAEvB,YAAY,MAAc,EAAE,OAAY,EAAE,EAAE,UAAkB,EAAE;QAC5D,IAAI,CAAC,MAAM,GAAG,MAAM,CAAA;QACpB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAA;QAChB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAA;IAC1B,CAAC;IAED,IAAI,CAAC,QAAkC;QACnC,IAAI,IAAI,CAAC,MAAM,KAAK,IAAI,EAAE,CAAC;YACvB,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACvB,CAAC;QACD,OAAO,IAAI,CAAA;IACf,CAAC;IAED,OAAO,CAAC,QAAmD;QACvD,IAAI,IAAI,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;YAC3B,QAAQ,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,CAAA;QACrC,CAAC;QACD,OAAO,IAAI,CAAA;IACf,CAAC;IAED,OAAO,CAAC,QAAoB;QACxB,IAAI,IAAI,CAAC,MAAM,KAAK,OAAO,EAAE,CAAC;YAC1B,QAAQ,EAAE,CAAA;QACd,CAAC;QACD,OAAO,IAAI,CAAA;IACf,CAAC;IAED,SAAS;QACL,OAAO,IAAI,CAAC,MAAM,KAAK,IAAI,CAAA;IAC/B,CAAC;IAED,OAAO;QACH,OAAO,IAAI,CAAC,MAAM,KAAK,OAAO,IAAI,IAAI,CAAC,MAAM,KAAK,QAAQ,CAAA;IAC9D,CAAC;IAED,OAAO;QACH,OAAO,IAAI,CAAC,IAAI,IAAI,IAAI,CAAA;IAC5B,CAAC;IAED,QAAQ;QACJ,OAAO,IAAI,CAAC,OAAO,IAAI,eAAe,CAAA;IAC1C,CAAC;IAED,SAAS;QACL,OAAO,IAAI,CAAC,MAAM,CAAA;IACtB,CAAC;IAED,UAAU;QACN,OAAO,IAAI,CAAC,OAAO,CAAA;IACvB,CAAC;CACJ;AAvDD,kCAuDC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.service.d.ts","sourceRoot":"","sources":["../src/auth.service.ts"],"names":[],"mappings":"AAEA,qBAGa,WAAW;;CAGvB"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.AuthService = void 0;
|
|
4
|
+
const tslib_1 = require("tslib");
|
|
5
|
+
const core_1 = require("@angular/core");
|
|
6
|
+
let AuthService = class AuthService {
|
|
7
|
+
constructor() { }
|
|
8
|
+
};
|
|
9
|
+
exports.AuthService = AuthService;
|
|
10
|
+
exports.AuthService = AuthService = tslib_1.__decorate([
|
|
11
|
+
(0, core_1.Injectable)({
|
|
12
|
+
providedIn: 'root'
|
|
13
|
+
}),
|
|
14
|
+
tslib_1.__metadata("design:paramtypes", [])
|
|
15
|
+
], AuthService);
|
|
16
|
+
//# sourceMappingURL=auth.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.service.js","sourceRoot":"","sources":["../src/auth.service.ts"],"names":[],"mappings":";;;;AAAA,wCAA2C;AAKpC,IAAM,WAAW,GAAjB,MAAM,WAAW;IAEtB,gBAAgB,CAAC;CAClB,CAAA;AAHY,kCAAW;sBAAX,WAAW;IAHvB,IAAA,iBAAU,EAAC;QACV,UAAU,EAAE,MAAM;KACnB,CAAC;;GACW,WAAW,CAGvB"}
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import * as i0 from "@angular/core";
|
|
2
1
|
/**
|
|
3
2
|
* CSRF Token Service
|
|
4
3
|
*
|
|
@@ -19,6 +18,5 @@ export declare class CsrfService {
|
|
|
19
18
|
* Note: Client-side deletion is limited for httpOnly cookies
|
|
20
19
|
*/
|
|
21
20
|
clearCsrfToken(cookieName?: string): void;
|
|
22
|
-
static ɵfac: i0.ɵɵFactoryDeclaration<CsrfService, never>;
|
|
23
|
-
static ɵprov: i0.ɵɵInjectableDeclaration<CsrfService>;
|
|
24
21
|
}
|
|
22
|
+
//# sourceMappingURL=csrf.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"csrf.service.d.ts","sourceRoot":"","sources":["../src/csrf.service.ts"],"names":[],"mappings":"AAEA;;;;;GAKG;AACH,qBAGa,WAAW;IAEpB;;OAEG;IACH,YAAY,CAAC,UAAU,GAAE,MAAqB,GAAG,MAAM,GAAG,IAAI;IAW9D;;OAEG;IACH,YAAY,CAAC,UAAU,GAAE,MAAqB,GAAG,OAAO;IAIxD;;;OAGG;IACH,cAAc,CAAC,UAAU,GAAE,MAAqB,GAAG,IAAI;CAI1D"}
|