@superlikers/microsites-api 0.1.0 → 0.2.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/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,13 @@
|
|
|
1
1
|
# @superlikers/microsites-api
|
|
2
2
|
|
|
3
|
+
## 0.2.0
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- 8ea4d9f: - `PrizesService.redeem()` now throws an `ApiError` when the backend rejects the redemption with HTTP 200 and `success: false` (not enough points, over the limit…). Its `message` is the backend's `missing_message`, and the whole body, including `missing: { points, overlimit }`, is in `ApiError.cause`. The new `RedeemFailure` model types that body. Before, the rejection arrived in the success callback as a `RedeemedPrize` that only had `success`.
|
|
8
|
+
- **Breaking:** `email`, `unconfirmed_email` and `avatar` are optional in `BaseParticipant`, because campaigns that don't ask for an email don't return them, in any endpoint. Reading them now requires handling `undefined`.
|
|
9
|
+
- `ApiError` messages are meant to be shown to the participant, so its default messages are now in Spanish, like the ones the backend sends.
|
|
10
|
+
|
|
3
11
|
## 0.1.0
|
|
4
12
|
|
|
5
13
|
### Minor Changes
|
package/README.md
CHANGED
|
@@ -95,7 +95,8 @@ Each method documents its endpoint and parameters in its JSDoc (visible on hover
|
|
|
95
95
|
|
|
96
96
|
### Campaign-specific fields
|
|
97
97
|
|
|
98
|
-
Models hold the fields every campaign has
|
|
98
|
+
Models hold the fields every campaign has; a field some campaigns don't return, such as `email` in campaigns
|
|
99
|
+
that don't ask for one, is optional. Campaigns add their own fields (participant properties, goal data, external action data…), so the services that return them take a type parameter. Extend the `Base*` model and pass **your full interface**:
|
|
99
100
|
|
|
100
101
|
```ts
|
|
101
102
|
import { BaseCurrentParticipant, ParticipantService } from '@superlikers/microsites-api'
|
|
@@ -136,6 +137,8 @@ inject(EntriesService)
|
|
|
136
137
|
})
|
|
137
138
|
```
|
|
138
139
|
|
|
140
|
+
Every entries method uses the backend's detailed `show` view, where the external action slug arrives in `atype`.
|
|
141
|
+
|
|
139
142
|
Entries of a type the library doesn't model yet are returned as `UnknownEntry`: the common fields are typed and the rest are `unknown`.
|
|
140
143
|
|
|
141
144
|
### Query parameters
|
|
@@ -144,11 +147,16 @@ Parameters are serialized the way the backend expects: `null` and `undefined` ar
|
|
|
144
147
|
|
|
145
148
|
## Errors
|
|
146
149
|
|
|
147
|
-
Every failure is thrown as an `ApiError`. This includes
|
|
150
|
+
Every failure is thrown as an `ApiError`. This includes the failures the backend reports with HTTP `200`: the ones
|
|
151
|
+
with `state: 'error'`, and a rejected redemption (`success: false`). So every error is handled in the `error`
|
|
152
|
+
callback, and a response that reaches the `next` callback is a success.
|
|
153
|
+
|
|
154
|
+
Its `message` is meant to be shown to the participant: it is the backend's message, or a Spanish default when the
|
|
155
|
+
backend sends none.
|
|
148
156
|
|
|
149
157
|
| Property | Description |
|
|
150
158
|
| ------------------- | ------------------------------------------------------------------------------------------------------------- |
|
|
151
|
-
| `message` | Backend message, or a default one.
|
|
159
|
+
| `message` | Backend message, or a default one, ready to show to the participant. |
|
|
152
160
|
| `status` | HTTP status. `0` = the request never reached the server. |
|
|
153
161
|
| `code` | Backend error code (`code_error`), or `null`. |
|
|
154
162
|
| `fieldErrors` | Validation errors by field, e.g. `{ email: 'is invalid' }`. Empty object when there are none. |
|
|
@@ -156,10 +164,25 @@ Every failure is thrown as an `ApiError`. This includes errors the backend repor
|
|
|
156
164
|
| `isNetworkError` | `status === 0` (offline, CORS, DNS…). |
|
|
157
165
|
| `isUnauthorized` | `status === 401`. |
|
|
158
166
|
| `isInvalidResponse` | The server answered with something that is not JSON, usually because the module is disabled for the campaign. |
|
|
159
|
-
| `cause` | The original `HttpErrorResponse
|
|
167
|
+
| `cause` | The original `HttpErrorResponse`, whose `error` holds the backend's body. |
|
|
160
168
|
|
|
161
169
|
Use `isApiError(error)` to narrow an `unknown` error.
|
|
162
170
|
|
|
171
|
+
A rejected redemption (not enough points, over the limit…) arrives as an `ApiError` whose `message` is the
|
|
172
|
+
backend's `missing_message`; the whole body, typed by `RedeemFailure`, is in `cause`:
|
|
173
|
+
|
|
174
|
+
```ts
|
|
175
|
+
prizes.redeem(prize._id).subscribe({
|
|
176
|
+
next: redemption => this.code.set(redemption.code),
|
|
177
|
+
error: (error: unknown) => {
|
|
178
|
+
if (!isApiError(error)) return
|
|
179
|
+
this.message.set(error.message) // e.g. "Te faltan 500 puntos"
|
|
180
|
+
const body = (error.cause as HttpErrorResponse).error as RedeemFailure
|
|
181
|
+
this.missingPoints.set(body.missing.points)
|
|
182
|
+
}
|
|
183
|
+
})
|
|
184
|
+
```
|
|
185
|
+
|
|
163
186
|
## Testing (`@superlikers/microsites-api/testing`)
|
|
164
187
|
|
|
165
188
|
Helpers for your app's unit tests. Import them only from spec files.
|
|
@@ -38,6 +38,9 @@ function normalizeConfig(config) {
|
|
|
38
38
|
/**
|
|
39
39
|
* Error thrown by every `@superlikers/microsites-api` request.
|
|
40
40
|
*
|
|
41
|
+
* `message` is meant to be shown to the participant, so the fallbacks are in Spanish, like the
|
|
42
|
+
* backend's own messages.
|
|
43
|
+
*
|
|
41
44
|
* @example
|
|
42
45
|
* ```ts
|
|
43
46
|
* try {
|
|
@@ -97,8 +100,8 @@ function isParseFailure(response) {
|
|
|
97
100
|
}
|
|
98
101
|
function defaultMessage(status, invalidResponse) {
|
|
99
102
|
if (invalidResponse)
|
|
100
|
-
return '
|
|
101
|
-
return status === 0 ? '
|
|
103
|
+
return 'El módulo puede estar deshabilitado en la campaña.';
|
|
104
|
+
return status === 0 ? 'No pudimos conectarnos con el servidor. Revisa tu conexión.' : `La petición falló con estado ${status}.`;
|
|
102
105
|
}
|
|
103
106
|
|
|
104
107
|
/**
|
|
@@ -167,23 +170,23 @@ class ApiClient {
|
|
|
167
170
|
#config = injectMicrositesApiConfig();
|
|
168
171
|
get(path, options) {
|
|
169
172
|
const url = this.#url(path);
|
|
170
|
-
return this.#handleErrors(this.#http.get(url, this.#options(options)), url);
|
|
173
|
+
return this.#handleErrors(this.#http.get(url, this.#options(options)), url, options);
|
|
171
174
|
}
|
|
172
175
|
post(path, body, options) {
|
|
173
176
|
const url = this.#url(path);
|
|
174
|
-
return this.#handleErrors(this.#http.post(url, body, this.#options(options)), url);
|
|
177
|
+
return this.#handleErrors(this.#http.post(url, body, this.#options(options)), url, options);
|
|
175
178
|
}
|
|
176
179
|
put(path, body, options) {
|
|
177
180
|
const url = this.#url(path);
|
|
178
|
-
return this.#handleErrors(this.#http.put(url, body, this.#options(options)), url);
|
|
181
|
+
return this.#handleErrors(this.#http.put(url, body, this.#options(options)), url, options);
|
|
179
182
|
}
|
|
180
183
|
patch(path, body, options) {
|
|
181
184
|
const url = this.#url(path);
|
|
182
|
-
return this.#handleErrors(this.#http.patch(url, body, this.#options(options)), url);
|
|
185
|
+
return this.#handleErrors(this.#http.patch(url, body, this.#options(options)), url, options);
|
|
183
186
|
}
|
|
184
187
|
delete(path, options) {
|
|
185
188
|
const url = this.#url(path);
|
|
186
|
-
return this.#handleErrors(this.#http.delete(url, this.#options(options)), url);
|
|
189
|
+
return this.#handleErrors(this.#http.delete(url, this.#options(options)), url, options);
|
|
187
190
|
}
|
|
188
191
|
/** `/sessions/login` → `https://4x.superlikerslabs.com/sessions/login` */
|
|
189
192
|
#url(path) {
|
|
@@ -199,11 +202,17 @@ class ApiClient {
|
|
|
199
202
|
}
|
|
200
203
|
/**
|
|
201
204
|
* Turns every failure into an {@link ApiError} and notifies `onUnauthorized` on 401.
|
|
202
|
-
* Some endpoints report errors with HTTP 200 and `state: 'error'` (e.g. referral code validation)
|
|
203
|
-
*
|
|
205
|
+
* Some endpoints report errors with HTTP 200 and `state: 'error'` (e.g. referral code validation), and
|
|
206
|
+
* others in their own shape (see `failureMessage`); both are thrown as an `ApiError` with status 200,
|
|
207
|
+
* so callers only handle errors in one place.
|
|
204
208
|
*/
|
|
205
|
-
#handleErrors(request, url) {
|
|
209
|
+
#handleErrors(request, url, options) {
|
|
206
210
|
return request.pipe(map(body => {
|
|
211
|
+
const message = options?.failureMessage?.(body) ?? null;
|
|
212
|
+
if (message !== null) {
|
|
213
|
+
const failure = typeof body === 'object' && body !== null ? { ...body, state: 'error', message } : { state: 'error', message, body };
|
|
214
|
+
throw new ApiError(new HttpErrorResponse({ status: 200, statusText: 'OK', error: failure, url }));
|
|
215
|
+
}
|
|
207
216
|
if (isErrorBody(body))
|
|
208
217
|
throw new ApiError(new HttpErrorResponse({ status: 200, statusText: 'OK', error: body, url }));
|
|
209
218
|
return body;
|
|
@@ -558,7 +567,7 @@ class PrizesService {
|
|
|
558
567
|
return this.#api.get(`/prizes/${id}/redeem/check`);
|
|
559
568
|
}
|
|
560
569
|
redeem(id, opts = {}) {
|
|
561
|
-
return this.#api.post(`/prizes/${id}/redeem`, opts);
|
|
570
|
+
return this.#api.post(`/prizes/${id}/redeem`, opts, { failureMessage: redeemFailureMessage });
|
|
562
571
|
}
|
|
563
572
|
getWishlist(page) {
|
|
564
573
|
return this.#api.get('/prizes/whislist', { params: { page } });
|
|
@@ -575,6 +584,13 @@ class PrizesService {
|
|
|
575
584
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.7", ngImport: i0, type: PrizesService, decorators: [{
|
|
576
585
|
type: Service
|
|
577
586
|
}] });
|
|
587
|
+
/** A rejected redemption answers with HTTP 200 and `success: false` (see {@link RedeemFailure}). */
|
|
588
|
+
function redeemFailureMessage(body) {
|
|
589
|
+
const failure = body;
|
|
590
|
+
if (!failure || failure.success !== false)
|
|
591
|
+
return null;
|
|
592
|
+
return failure.missing_message || 'No pudimos canjear el premio.';
|
|
593
|
+
}
|
|
578
594
|
|
|
579
595
|
/** Segment and advanced participant rankings. */
|
|
580
596
|
class RankingService {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"superlikers-microsites-api.mjs","sources":["../../../projects/microsites-api/src/lib/config/provide-microsites-api.ts","../../../projects/microsites-api/src/lib/errors/api-error.ts","../../../projects/microsites-api/src/lib/http/query-params.ts","../../../projects/microsites-api/src/lib/http/api-client.ts","../../../projects/microsites-api/src/lib/achievements/achievements.service.ts","../../../projects/microsites-api/src/lib/activities/activities.service.ts","../../../projects/microsites-api/src/lib/badges/badges.service.ts","../../../projects/microsites-api/src/lib/blogs/blogs.service.ts","../../../projects/microsites-api/src/lib/boards/boards.service.ts","../../../projects/microsites-api/src/lib/comments/comments.service.ts","../../../projects/microsites-api/src/lib/entries/entries.service.ts","../../../projects/microsites-api/src/lib/entries/is-entry-type.ts","../../../projects/microsites-api/src/lib/external-forms/external-forms.service.ts","../../../projects/microsites-api/src/lib/goals/goals.service.ts","../../../projects/microsites-api/src/lib/metrics/metrics.service.ts","../../../projects/microsites-api/src/lib/participant/participant.service.ts","../../../projects/microsites-api/src/lib/password/password.service.ts","../../../projects/microsites-api/src/lib/prizes/prizes.service.ts","../../../projects/microsites-api/src/lib/ranking/ranking.service.ts","../../../projects/microsites-api/src/lib/referrals/referrals.service.ts","../../../projects/microsites-api/src/lib/registrations/registrations.service.ts","../../../projects/microsites-api/src/lib/session/session.service.ts","../../../projects/microsites-api/src/lib/teams/teams.service.ts","../../../projects/microsites-api/src/lib/votes/votes.service.ts","../../../projects/microsites-api/src/public-api.ts","../../../projects/microsites-api/src/superlikers-microsites-api.ts"],"sourcesContent":["import { EnvironmentProviders, inject, InjectionToken, makeEnvironmentProviders } from '@angular/core'\n\nimport { MicrositesApiConfig } from './microsites-api-config'\n\n/** @internal Holds the normalized config. Not part of the public API. */\nexport const MICROSITES_API_CONFIG = new InjectionToken<MicrositesApiConfig>('MICROSITES_API_CONFIG')\n\n/**\n * Configures `@superlikers/microsites-api` for the application.\n *\n * @example\n * ```ts\n * // app.config.ts\n * export const appConfig: ApplicationConfig = {\n * providers: [provideMicrositesApi({ baseUrl: environment.baseUrl })]\n * }\n * ```\n */\nexport function provideMicrositesApi(config: MicrositesApiConfig): EnvironmentProviders {\n return makeEnvironmentProviders([{ provide: MICROSITES_API_CONFIG, useValue: normalizeConfig(config) }])\n}\n\n/** @internal Reads the config inside the library, with a helpful error when it is missing. */\nexport function injectMicrositesApiConfig(): MicrositesApiConfig {\n const config = inject(MICROSITES_API_CONFIG, { optional: true })\n if (!config) {\n throw new Error('[@superlikers/microsites-api] Missing configuration. Add provideMicrositesApi({ baseUrl }) to your app.config.ts providers.')\n }\n return config\n}\n\nfunction normalizeConfig(config: MicrositesApiConfig): MicrositesApiConfig {\n const baseUrl = config.baseUrl?.trim().replace(/\\/+$/, '') ?? ''\n\n if (!URL.canParse(baseUrl) || !/^https?:$/.test(new URL(baseUrl).protocol)) {\n throw new Error(`[@superlikers/microsites-api] Invalid baseUrl \"${config.baseUrl}\". Expected an absolute http(s) URL, e.g. https://4x.superlikerslabs.com`)\n }\n\n return { ...config, baseUrl }\n}\n","import { HttpErrorResponse } from '@angular/common/http'\n\n/** Error body returned by the Superlikers backend. */\ninterface ErrorBody {\n state?: string\n message?: string\n code_error?: number\n errors?: Record<string, string>\n}\n\n/**\n * Error thrown by every `@superlikers/microsites-api` request.\n *\n * @example\n * ```ts\n * try {\n * await firstValueFrom(sessionService.login(data))\n * } catch (error) {\n * if (isApiError(error)) this.message.set(error.message)\n * }\n * ```\n */\nexport class ApiError extends Error {\n override readonly name = 'ApiError'\n\n /** HTTP status. `0` means the request never reached the server (network, CORS, offline). */\n readonly status: number\n /** Backend error code (`code_error`), e.g. `140`. `null` when the backend did not send one. */\n readonly code: number | null\n /** Validation errors by field name, e.g. `{ email: 'is invalid' }`. Empty when there are none. */\n readonly fieldErrors: Readonly<Record<string, string>>\n /** URL of the failed request. */\n readonly url: string | null\n\n /**\n * `true` when the server answered with something that is not JSON (e.g. an HTML page).\n * Happens when a module is disabled for the campaign: the backend redirects to the site instead of answering.\n */\n readonly isInvalidResponse: boolean\n\n constructor(response: HttpErrorResponse) {\n const invalidResponse = isParseFailure(response)\n const body = invalidResponse ? {} : readBody(response.error)\n super(body.message || defaultMessage(response.status, invalidResponse), { cause: response })\n\n this.status = response.status\n this.code = typeof body.code_error === 'number' ? body.code_error : null\n this.fieldErrors = body.errors ?? {}\n this.url = response.url\n this.isInvalidResponse = invalidResponse\n }\n\n get isNetworkError(): boolean {\n return this.status === 0\n }\n\n get isUnauthorized(): boolean {\n return this.status === 401\n }\n}\n\nexport function isApiError(error: unknown): error is ApiError {\n return error instanceof ApiError\n}\n\nfunction readBody(error: unknown): ErrorBody {\n return typeof error === 'object' && error !== null ? (error as ErrorBody) : {}\n}\n\n/**\n * A 2xx body HttpClient could not parse: the fetch backend (Angular's default) reports the `SyntaxError`\n * itself, the XHR backend wraps it as `{ error: SyntaxError, text }`.\n */\nfunction isParseFailure(response: HttpErrorResponse): boolean {\n if (response.status < 200 || response.status >= 300) return false\n const error: unknown = response.error\n return error instanceof SyntaxError || (typeof error === 'object' && error !== null && (error as { error?: unknown }).error instanceof SyntaxError)\n}\n\nfunction defaultMessage(status: number, invalidResponse: boolean): string {\n if (invalidResponse) return 'The server did not answer with JSON. The module may be disabled for this campaign.'\n return status === 0 ? 'Could not reach the server. Check your connection.' : `Request failed with status ${status}.`\n}\n","import { HttpParameterCodec, HttpParams } from '@angular/common/http'\n\ntype ParamValue = string | number | boolean\ntype Nullable<T> = T | null | undefined\ntype ParamObject = Record<string, Nullable<ParamValue>>\n\n/** Query params as a plain object. `null`/`undefined` values are skipped. */\nexport type ApiParams = Record<string, Nullable<ParamValue> | readonly Nullable<ParamValue>[] | ParamObject>\n\n/**\n * Encodes every reserved character. Angular's default codec leaves `+` unencoded,\n * which the backend decodes as a space (`ana+test@mail.com` → `ana test@mail.com`).\n */\nclass StrictUrlCodec implements HttpParameterCodec {\n encodeKey(key: string): string {\n return encodeURIComponent(key)\n }\n encodeValue(value: string): string {\n return encodeURIComponent(value)\n }\n decodeKey(key: string): string {\n return decodeURIComponent(key)\n }\n decodeValue(value: string): string {\n return decodeURIComponent(value)\n }\n}\n\nconst codec = new StrictUrlCodec()\n\n/**\n * @internal Builds query params: arrays use `key[]`, plain objects use `key[subkey]`,\n * empty values are skipped. `{ page: 2, tags: ['a', 'b'], q: undefined }` → `page=2&tags[]=a&tags[]=b`.\n */\nexport function toHttpParams(params: ApiParams): HttpParams {\n let httpParams = new HttpParams({ encoder: codec })\n\n for (const [key, value] of Object.entries(params)) {\n if (Array.isArray(value)) {\n for (const item of value) {\n if (item != null) httpParams = httpParams.append(`${key}[]`, String(item))\n }\n } else if (isPlainObject(value)) {\n for (const [subkey, subvalue] of Object.entries(value)) {\n if (subvalue != null) httpParams = httpParams.append(`${key}[${subkey}]`, String(subvalue))\n }\n } else if (value != null) {\n httpParams = httpParams.append(key, String(value))\n }\n }\n\n return httpParams\n}\n\nfunction isPlainObject(value: unknown): value is ParamObject {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n}\n\n/**\n * @internal Casts a params object with a named nested type (e.g. a `date_filter: DateFilter` field) to\n * {@link ApiParams}. Named types without an index signature aren't structurally assignable to `ApiParams`\n * even when every property matches; `toHttpParams` handles arbitrary shapes safely at runtime regardless.\n */\nexport function asApiParams<T extends object>(params: T): ApiParams {\n return params as unknown as ApiParams\n}\n","import { HttpClient, HttpErrorResponse, HttpHeaders, HttpParams } from '@angular/common/http'\nimport { EnvironmentInjector, inject, runInInjectionContext, Service } from '@angular/core'\nimport { catchError, map, Observable, throwError } from 'rxjs'\n\nimport { injectMicrositesApiConfig } from '../config/provide-microsites-api'\nimport { ApiError } from '../errors/api-error'\nimport { ApiParams, toHttpParams } from './query-params'\n\n/** Options a domain service can pass to a request. */\nexport interface ApiRequestOptions {\n /** Plain object (serialized by {@link toHttpParams}) or ready-made `HttpParams`. */\n params?: ApiParams | HttpParams\n headers?: Record<string, string>\n}\n\n/**\n * @internal The library's only gateway to the microsite backend.\n * Every domain service makes its requests through here; nothing else uses `HttpClient`.\n */\n@Service()\nexport class ApiClient {\n readonly #http = inject(HttpClient)\n readonly #injector = inject(EnvironmentInjector)\n readonly #config = injectMicrositesApiConfig()\n\n get<T>(path: string, options?: ApiRequestOptions): Observable<T> {\n const url = this.#url(path)\n return this.#handleErrors(this.#http.get<T>(url, this.#options(options)), url)\n }\n\n post<T>(path: string, body: unknown, options?: ApiRequestOptions): Observable<T> {\n const url = this.#url(path)\n return this.#handleErrors(this.#http.post<T>(url, body, this.#options(options)), url)\n }\n\n put<T>(path: string, body: unknown, options?: ApiRequestOptions): Observable<T> {\n const url = this.#url(path)\n return this.#handleErrors(this.#http.put<T>(url, body, this.#options(options)), url)\n }\n\n patch<T>(path: string, body: unknown, options?: ApiRequestOptions): Observable<T> {\n const url = this.#url(path)\n return this.#handleErrors(this.#http.patch<T>(url, body, this.#options(options)), url)\n }\n\n delete<T>(path: string, options?: ApiRequestOptions): Observable<T> {\n const url = this.#url(path)\n return this.#handleErrors(this.#http.delete<T>(url, this.#options(options)), url)\n }\n\n /** `/sessions/login` → `https://4x.superlikerslabs.com/sessions/login` */\n #url(path: string): string {\n return `${this.#config.baseUrl}/${path.replace(/^\\/+/, '')}`\n }\n\n /** What every request shares. `Content-Type` is left to HttpClient (JSON for objects, none for FormData). */\n #options(options?: ApiRequestOptions) {\n return {\n params: options?.params instanceof HttpParams ? options.params : toHttpParams(options?.params ?? {}),\n headers: new HttpHeaders({ Accept: 'application/json', ...options?.headers }),\n withCredentials: true\n }\n }\n\n /**\n * Turns every failure into an {@link ApiError} and notifies `onUnauthorized` on 401.\n * Some endpoints report errors with HTTP 200 and `state: 'error'` (e.g. referral code validation);\n * those are thrown as an `ApiError` with status 200 too, so callers only handle errors in one place.\n */\n #handleErrors<T>(request: Observable<T>, url: string): Observable<T> {\n return request.pipe(\n map(body => {\n if (isErrorBody(body)) throw new ApiError(new HttpErrorResponse({ status: 200, statusText: 'OK', error: body, url }))\n return body\n }),\n catchError((error: unknown) => {\n if (!(error instanceof HttpErrorResponse)) return throwError(() => error)\n\n const apiError = new ApiError(error)\n const onUnauthorized = this.#config.onUnauthorized\n if (apiError.isUnauthorized && onUnauthorized) runInInjectionContext(this.#injector, () => onUnauthorized(apiError))\n\n return throwError(() => apiError)\n })\n )\n }\n}\n\nfunction isErrorBody(body: unknown): boolean {\n return typeof body === 'object' && body !== null && !Array.isArray(body) && (body as { state?: unknown }).state === 'error'\n}\n","import { inject, Service } from '@angular/core'\nimport { Observable } from 'rxjs'\n\nimport { ApiClient } from '../http/api-client'\nimport { asApiParams } from '../http/query-params'\nimport { AchievementsListResponse, AchievementsParams, BadgeAchievement, GoalAchievement } from './achievements-models'\n\n/** Achievements earned by participants (goal and badge achievements). */\n@Service()\nexport class AchievementsService {\n readonly #api = inject(ApiClient)\n\n list<T = GoalAchievement | BadgeAchievement>(params: AchievementsParams = {}): Observable<AchievementsListResponse<T>> {\n return this.#api.get<AchievementsListResponse<T>>('/achievements/index', { params: asApiParams({ ...params, view: params.view ?? 'list' }) })\n }\n}\n","import { inject, Service } from '@angular/core'\nimport { Observable } from 'rxjs'\n\nimport { ApiClient } from '../http/api-client'\nimport { UploadDocumentParams, UploadDocumentResponse, UploadPhotoParams, UploadPhotoResponse } from './activities-models'\n\n/** Photo and document uploads. */\n@Service()\nexport class ActivitiesService {\n readonly #api = inject(ApiClient)\n\n uploadPhoto({ file, filename, category }: UploadPhotoParams): Observable<UploadPhotoResponse> {\n const body = new FormData()\n if (filename) body.append('upload_photo[image]', file, filename)\n else body.append('upload_photo[image]', file)\n if (category != null) body.append('upload_photo[category]', category)\n\n return this.#api.post<UploadPhotoResponse>('/mod/photos', body)\n }\n\n uploadDocument({ file, category }: UploadDocumentParams): Observable<UploadDocumentResponse> {\n const body = new FormData()\n body.append('upload_document[document]', file)\n if (category) body.append('upload_document[category]', category)\n\n return this.#api.post<UploadDocumentResponse>('/mod/documents', body)\n }\n}\n","import { inject, Service } from '@angular/core'\nimport { Observable } from 'rxjs'\n\nimport { ApiClient } from '../http/api-client'\nimport { BadgeResponse, BadgesListResponse, BadgesParams, ParticipantBadgesResponse } from './badges-models'\n\n/** Badges and the badges earned by a participant. */\n@Service()\nexport class BadgesService {\n readonly #api = inject(ApiClient)\n\n list(params: BadgesParams = {}): Observable<BadgesListResponse> {\n return this.#api.get<BadgesListResponse>('/badges/index', { params: { ...params } })\n }\n\n get(id: string): Observable<BadgeResponse> {\n return this.#api.get<BadgeResponse>(`/badges/${id}/show`)\n }\n\n /** Badges earned by the logged participant, or by `uid` when given. */\n getStats(uid?: string): Observable<ParticipantBadgesResponse> {\n return this.#api.get<ParticipantBadgesResponse>('/badges/stats', { params: { participant_uid: uid } })\n }\n}\n","import { inject, Service } from '@angular/core'\nimport { Observable } from 'rxjs'\n\nimport { ApiClient } from '../http/api-client'\nimport { ActivityParticipant } from '../shared/activity-participant'\nimport { BlogPostResponse, BlogPostsParams, BlogPostsResponse, CreateBlogPostParams, CreateBlogPostResponse } from './blogs-models'\n\n/** Blog posts (mod/blog activity). */\n@Service()\nexport class BlogsService {\n readonly #api = inject(ApiClient)\n\n list<T = ActivityParticipant>(params: BlogPostsParams = {}): Observable<BlogPostsResponse<T>> {\n return this.#api.get<BlogPostsResponse<T>>('/mod/blog', { params: { ...params, page: params.page ?? 1 } })\n }\n\n get<T = ActivityParticipant>(id: string): Observable<BlogPostResponse<T>> {\n return this.#api.get<BlogPostResponse<T>>(`/mod/blog/${id}/show`)\n }\n\n create<T = ActivityParticipant>({ title, body, format, attached_file, category, tags, push_redirect_url }: CreateBlogPostParams): Observable<CreateBlogPostResponse<T>> {\n const data = new FormData()\n data.append('blog_post[title]', title)\n data.append('blog_post[body]', body)\n data.append('blog_post[format]', format ?? 'text')\n if (attached_file) data.append('blog_post[attached_file]', attached_file)\n if (category) data.append('blog_post[category]', category)\n if (push_redirect_url) data.append('blog_post[push_redirect_url]', push_redirect_url)\n for (const tag of tags ?? []) data.append('blog_post[tags][]', tag)\n\n return this.#api.post<CreateBlogPostResponse<T>>('/mod/blogs', data)\n }\n}\n","import { inject, Service } from '@angular/core'\nimport { Observable } from 'rxjs'\n\nimport { ApiClient } from '../http/api-client'\nimport { BoardReportsResponse, BoardsListResponse, BoardsParams, ExecuteReportParams, ExecuteReportResponse } from './boards-models'\n\n/** Dashboards (boards) and their reports. */\n@Service()\nexport class BoardsService {\n readonly #api = inject(ApiClient)\n\n list(params: BoardsParams = {}): Observable<BoardsListResponse> {\n return this.#api.get<BoardsListResponse>('/boards/index', { params: { ...params } })\n }\n\n listReports(board: string, page?: number): Observable<BoardReportsResponse> {\n return this.#api.get<BoardReportsResponse>(`/boards/${board}/reports`, { params: { page } })\n }\n\n /** Either `timeframe` or `start_date`/`end_date` is used, never both. */\n executeReport(board: string, report: string, params: ExecuteReportParams = {}): Observable<ExecuteReportResponse> {\n const query = params.timeframe ? { timeframe: params.timeframe } : { start_date: params.start_date, end_date: params.end_date }\n return this.#api.get<ExecuteReportResponse>(`/boards/${board}/reports/${report}/exec`, { params: query })\n }\n}\n","import { inject, Service } from '@angular/core'\nimport { Observable } from 'rxjs'\n\nimport { ApiClient } from '../http/api-client'\nimport { ActivityParticipant } from '../shared/activity-participant'\nimport { CommentsListResponse, CommentsParams, CreateCommentParams, CreateCommentResponse } from './comments-models'\n\n/** Comments on an activity (target). */\n@Service()\nexport class CommentsService {\n readonly #api = inject(ApiClient)\n\n list<T = ActivityParticipant>(targetId: string, params: CommentsParams = {}): Observable<CommentsListResponse<T>> {\n return this.#api.get<CommentsListResponse<T>>(`/mod/comments/${targetId}`, { params: { ...params } })\n }\n\n create<T = ActivityParticipant>(targetId: string, { body, category }: CreateCommentParams): Observable<CreateCommentResponse<T>> {\n return this.#api.post<CreateCommentResponse<T>>(`/mod/comments/${targetId}`, { comment: { body, category } })\n }\n}\n","import { inject, Service } from '@angular/core'\nimport { Observable } from 'rxjs'\n\nimport { ApiClient } from '../http/api-client'\nimport { asApiParams } from '../http/query-params'\nimport { CreateExternalOptions, CreateExternalResponse, DocumentEntry, EntriesListParams, EntriesParams, EntriesResponse, Entry, EntryData, ExternalEntry, PhotoEntry, PurchaseEntry, RedeemEntry } from './entries-models'\n\n/**\n * Entries (activities) of the logged participant, or of another one with `participant_uid` (admins).\n * Every method uses the detailed `show` view. Types without a method of their own are listed with `list({ _type })`.\n */\n@Service()\nexport class EntriesService {\n readonly #api = inject(ApiClient)\n\n /** `T`: shape of `data` (the campaign's external action fields). */\n listExternals<T = EntryData>(params: EntriesParams = {}): Observable<EntriesResponse<ExternalEntry<T>>> {\n return this.#list<ExternalEntry<T>>({ ...params, _type: 'External' })\n }\n\n listRedemptions(params: EntriesParams = {}): Observable<EntriesResponse<RedeemEntry>> {\n return this.#list<RedeemEntry>({ ...params, _type: 'Redeem' })\n }\n\n listPhotos(params: EntriesParams = {}): Observable<EntriesResponse<PhotoEntry>> {\n return this.#list<PhotoEntry>({ ...params, _type: 'UploadPhoto' })\n }\n\n listDocuments(params: EntriesParams = {}): Observable<EntriesResponse<DocumentEntry>> {\n return this.#list<DocumentEntry>({ ...params, _type: 'UploadDocument' })\n }\n\n listPurchases(params: EntriesParams = {}): Observable<EntriesResponse<PurchaseEntry>> {\n return this.#list<PurchaseEntry>({ ...params, _type: 'Retail::Buy' })\n }\n\n /** Every entry, or one `_type` (including the ones without a method of their own). Narrow each item with `isEntryType`. */\n list(params: EntriesListParams = {}): Observable<EntriesResponse<Entry>> {\n return this.#list<Entry>(params)\n }\n\n /** Entries of several participants at once (admins only, 100 per page). `uids` is required by the backend. */\n search(uids: string[], params: EntriesListParams = {}): Observable<EntriesResponse<Entry>> {\n return this.#api.get<EntriesResponse<Entry>>('/entries/search', { params: asApiParams({ ...params, participant_uids: uids, hide_undo: params.hide_undo ?? true, view: 'show' }) })\n }\n\n /**\n * Records an external action event.\n * @param event An external action configured in the campaign (otherwise `code_error: 30`).\n * @param properties Event data. Must not be empty (otherwise `code_error: 11`).\n */\n createExternal(event: string, properties: Record<string, unknown>, { category, points_type }: CreateExternalOptions = {}): Observable<CreateExternalResponse> {\n return this.#api.post<CreateExternalResponse>('/mod/external', { event, properties, category, points_type })\n }\n\n #list<E>(params: EntriesListParams): Observable<EntriesResponse<E>> {\n return this.#api.get<EntriesResponse<E>>('/participant_entries', { params: asApiParams({ ...params, hide_undo: params.hide_undo ?? true, view: 'show' }) })\n }\n}\n","import { Entry, EntryTypes, KnownEntryType } from './entries-models'\n\n/**\n * Narrows an entry to its type.\n *\n * @example\n * ```ts\n * for (const entry of response.data) {\n * if (isEntryType(entry, 'Redeem')) console.log(entry.prize.name)\n * }\n * ```\n */\nexport function isEntryType<K extends KnownEntryType>(entry: Entry, type: K): entry is EntryTypes[K] {\n return entry._type === type\n}\n","import { inject, Service } from '@angular/core'\nimport { Observable } from 'rxjs'\n\nimport { ApiClient } from '../http/api-client'\nimport { EntryData, ExternalEntry } from '../entries/entries-models'\nimport { ExternalFormFieldsResponse, ExternalFormsListParams, ExternalFormsListResponse, ExternalFormSubmissionResponse, ExternalFormSubmissionsParams, ExternalFormSubmissionsResponse } from './external-forms-models'\n\n/** External forms (custom actions configured per campaign) and their submissions. */\n@Service()\nexport class ExternalFormsService {\n readonly #api = inject(ApiClient)\n\n listForms(params: ExternalFormsListParams = {}): Observable<ExternalFormsListResponse> {\n return this.#api.get<ExternalFormsListResponse>('/external_forms/actions/list', { params: { ...params, participant_match_rules: params.participant_match_rules ?? true } })\n }\n\n getFormFields(id: string): Observable<ExternalFormFieldsResponse> {\n return this.#api.get<ExternalFormFieldsResponse>(`/external_forms/actions/${id}/fields_info`)\n }\n\n submit(id: string, values: Record<string, unknown>, category?: string): Observable<ExternalFormSubmissionResponse> {\n return this.#api.post<ExternalFormSubmissionResponse>(`/external_forms/actions/${id}/fillup`, { external_form: values, category })\n }\n\n /** Submitted forms (`External` entries), paginated. It is a read, but the backend only accepts POST. `T`: shape of `data`. */\n listSubmissions<T = EntryData>(params: ExternalFormSubmissionsParams = {}): Observable<ExternalFormSubmissionsResponse<T>> {\n return this.#api.post<ExternalFormSubmissionsResponse<T>>('/external_forms/list', { ...params, hide_undo: params.hide_undo ?? true })\n }\n\n /** @param id The submission (entry) `_id`. */\n getSubmission<T = EntryData>(id: string): Observable<ExternalEntry<T>> {\n return this.#api.get<ExternalEntry<T>>(`/external_forms/${id}`)\n }\n\n updateSubmission(id: string, values: Record<string, unknown>): Observable<ExternalFormSubmissionResponse> {\n return this.#api.patch<ExternalFormSubmissionResponse>(`/external_forms/${id}`, { external_form: values })\n }\n}\n","import { inject, Service } from '@angular/core'\nimport { Observable } from 'rxjs'\n\nimport { ApiClient } from '../http/api-client'\nimport { GoalAcceptanceResponse, GoalData, GoalsListParams, GoalsListResponse, ParticipantGoalsParams, ParticipantGoalsResponse } from './goals-models'\n\n/** Campaign goals: the participant's goals with progress, the campaign catalog, and accepting goals. */\n@Service()\nexport class GoalsService {\n readonly #api = inject(ApiClient)\n\n /** Goals that apply to the logged participant (or `participant_uid`), with their progress. `T`: shape of `goal_data`. */\n listParticipantGoals<T = GoalData>(params: ParticipantGoalsParams = {}): Observable<ParticipantGoalsResponse<T>> {\n return this.#api.get<ParticipantGoalsResponse<T>>('/participants/goals', { params: { ...params } })\n }\n\n /** Every goal of the campaign (no progress), paginated. It is a read, but the backend only accepts POST. */\n list<T = GoalData>(params: GoalsListParams = {}): Observable<GoalsListResponse<T>> {\n return this.#api.post<GoalsListResponse<T>>('/goals/index', { ...params, include_ended: params.include_ended ?? true })\n }\n\n /** @param goalId The goal id (`ParticipantGoal.goal_id`, not its `_id`). */\n accept(goalId: string): Observable<GoalAcceptanceResponse> {\n return this.#api.post<GoalAcceptanceResponse>('/participants/goals/accept', { goal_id: goalId })\n }\n\n /** @param goalId The goal id (`ParticipantGoal.goal_id`, not its `_id`). */\n decline(goalId: string): Observable<GoalAcceptanceResponse> {\n return this.#api.post<GoalAcceptanceResponse>('/participants/goals/unaccept', { goal_id: goalId })\n }\n}\n","import { inject, Service } from '@angular/core'\nimport { Observable } from 'rxjs'\n\nimport { ApiClient } from '../http/api-client'\nimport { CalculateMetricParams, CalculateMetricResponse, MetricsListResponse, MetricsParams } from './metrics-models'\n\n/** Campaign metrics (custom aggregations configured per campaign). */\n@Service()\nexport class MetricsService {\n readonly #api = inject(ApiClient)\n\n list(params: MetricsParams = {}): Observable<MetricsListResponse> {\n return this.#api.get<MetricsListResponse>('/metrics/index', { params: { ...params } })\n }\n\n calculate(params: CalculateMetricParams): Observable<CalculateMetricResponse> {\n return this.#api.get<CalculateMetricResponse>('/metrics/exec', { params: { ...params } })\n }\n}\n","import { inject, Service } from '@angular/core'\nimport { Observable } from 'rxjs'\n\nimport { ApiClient } from '../http/api-client'\nimport {\n BaseCurrentParticipant,\n BaseParticipant,\n BaseParticipantRankData,\n CurrentParticipantResponse,\n ParticipantListParams,\n ParticipantListResponse,\n ParticipantRankResponse,\n ParticipantResponse,\n PushSubscriptionPayload,\n RemovePushSubscriptionsResponse,\n SavePushSubscriptionResponse\n} from './participant-models'\n\n/** Logged participant, participant lists and push notification subscriptions. */\n@Service()\nexport class ParticipantService {\n readonly #api = inject(ApiClient)\n\n /** Logged participant and site config. `T`: your participant interface (`extends BaseCurrentParticipant`). */\n getCurrent<T = BaseCurrentParticipant>(): Observable<CurrentParticipantResponse<T>> {\n return this.#api.get<CurrentParticipantResponse<T>>('/sconfig')\n }\n\n /** Points, level and position of the logged participant. `T`: shape of `data.data` (`extends BaseParticipantRankData`). */\n getRank<T = BaseParticipantRankData>(): Observable<ParticipantRankResponse<T>> {\n return this.#api.get<ParticipantRankResponse<T>>('/participant_rank')\n }\n\n /** `T`: your participant interface (`extends BaseParticipant`). */\n list<T = BaseParticipant>(params: ParticipantListParams = {}): Observable<ParticipantListResponse<T>> {\n return this.#api.get<ParticipantListResponse<T>>('/participants/list', { params: { ...params } })\n }\n\n /** `T`: your participant interface (`extends BaseParticipant`). */\n getByUid<T = BaseParticipant>(uid: string): Observable<ParticipantResponse<T>> {\n return this.#api.get<ParticipantResponse<T>>('/participants/show', { params: { uid } })\n }\n\n /** Sends the browser subscription as the request body, unwrapped. */\n savePushSubscription(subscription: PushSubscriptionPayload): Observable<SavePushSubscriptionResponse> {\n return this.#api.post<SavePushSubscriptionResponse>('/participants/save_push_subscription', subscription)\n }\n\n removePushSubscriptions(): Observable<RemovePushSubscriptionsResponse> {\n return this.#api.post<RemovePushSubscriptionsResponse>('/participants/remove_push_subscriptions', {})\n }\n}\n","import { inject, Service } from '@angular/core'\nimport { Observable } from 'rxjs'\n\nimport { ApiClient } from '../http/api-client'\nimport { ChangePasswordParams, ChangePasswordResponse, NotificationChannel, ResetPasswordParams, ResetPasswordResponse, SendResetTokenParams, SendResetTokenResponse, ValidateChannelResponse } from './password-models'\n\n/** Change password (logged participant) and the password recovery flow. */\n@Service()\nexport class PasswordService {\n readonly #api = inject(ApiClient)\n\n changePassword(params: ChangePasswordParams): Observable<ChangePasswordResponse> {\n return this.#api.put<ChangePasswordResponse>('/password/change', { participation: params })\n }\n\n /** Checks that a participant exists for the given channel value (e.g. an email or a phone number). */\n validateChannel(channel: NotificationChannel, value: string): Observable<ValidateChannelResponse> {\n return this.#api.post<ValidateChannelResponse>('/password/validate_channel', { [channel]: value })\n }\n\n sendResetToken({ channel, data, edit_password_url, uid }: SendResetTokenParams): Observable<SendResetTokenResponse> {\n const body: Record<string, unknown> = { participation: data, notification_channel: channel, edit_password_url }\n if (uid) body['uid'] = uid\n\n return this.#api.post<SendResetTokenResponse>('/password', body)\n }\n\n resetPassword({ password, password_confirmation, token, channel }: ResetPasswordParams): Observable<ResetPasswordResponse> {\n return this.#api.post<ResetPasswordResponse>('/password/update', { participation: { password, password_confirmation }, token, channel })\n }\n}\n","import { inject, Service } from '@angular/core'\nimport { Observable } from 'rxjs'\n\nimport { ApiClient } from '../http/api-client'\nimport { asApiParams } from '../http/query-params'\nimport { CheckRedeemResponse, ExternalCouponDataResponse, PrizesListResponse, PrizesParams, RedeemedPrize, ToggleWishlistResponse, WishlistResponse } from './prizes-models'\n\n/** Prizes and redemptions. */\n@Service()\nexport class PrizesService {\n readonly #api = inject(ApiClient)\n\n list(params: PrizesParams = {}): Observable<PrizesListResponse> {\n return this.#api.get<PrizesListResponse>('/prizes/index', { params: asApiParams({ ...params, page: params.page ?? 1, view: params.view ?? 'show' }) })\n }\n\n checkRedeem(id: string): Observable<CheckRedeemResponse> {\n return this.#api.get<CheckRedeemResponse>(`/prizes/${id}/redeem/check`)\n }\n\n redeem(id: string, opts: Record<string, unknown> = {}): Observable<RedeemedPrize> {\n return this.#api.post<RedeemedPrize>(`/prizes/${id}/redeem`, opts)\n }\n\n getWishlist(page?: number): Observable<WishlistResponse> {\n return this.#api.get<WishlistResponse>('/prizes/whislist', { params: { page } })\n }\n\n toggleWishlist(id: string): Observable<ToggleWishlistResponse> {\n return this.#api.get<ToggleWishlistResponse>(`/prizes/${id}/whislist_toggle`, { params: { id } })\n }\n\n getExternalCouponData(id: string, key: string, city?: string): Observable<ExternalCouponDataResponse> {\n return this.#api.get<ExternalCouponDataResponse>(`/prizes/${id}/redeem/external/${key}`, { params: { city } })\n }\n}\n","import { inject, Service } from '@angular/core'\nimport { Observable } from 'rxjs'\n\nimport { ApiClient } from '../http/api-client'\nimport { AdvancedRankingParams, AdvancedRankingResponse, SegmentRankingParams, SegmentRankingResponse } from './ranking-models'\n\n/** Segment and advanced participant rankings. */\n@Service()\nexport class RankingService {\n readonly #api = inject(ApiClient)\n\n getSegment(params: SegmentRankingParams = {}): Observable<SegmentRankingResponse> {\n return this.#api.get<SegmentRankingResponse>('/participants/ranks/segment', { params: { ...params } })\n }\n\n getAdvanced<T = Record<string, unknown>>(params: AdvancedRankingParams = {}): Observable<AdvancedRankingResponse<T>> {\n return this.#api.get<AdvancedRankingResponse<T>>('/participants/ranks/advanced', { params: { ...params } })\n }\n}\n","import { inject, Service } from '@angular/core'\nimport { Observable } from 'rxjs'\n\nimport { ApiClient } from '../http/api-client'\nimport { ChangeReferralCodeResponse } from './referrals-models'\n\n/** The participant's referral code. */\n@Service()\nexport class ReferralsService {\n readonly #api = inject(ApiClient)\n\n changeCode(code: string): Observable<ChangeReferralCodeResponse> {\n return this.#api.post<ChangeReferralCodeResponse>('/mod/referrals', {}, { params: { code } })\n }\n}\n","import { inject, Service } from '@angular/core'\nimport { Observable } from 'rxjs'\n\nimport { ApiClient } from '../http/api-client'\nimport { ConfirmEmailResponse, SendEmailVerificationTokenResponse, SignupData, SignupFormResponse, SignupResponse, UpdateParticipantResponse, ValidateEmailTokenResponse } from './registrations-models'\n\n/** Signup and email verification. */\n@Service()\nexport class RegistrationsService {\n readonly #api = inject(ApiClient)\n\n getSignupForm(): Observable<SignupFormResponse> {\n return this.#api.get<SignupFormResponse>('/registrations/signupform')\n }\n\n signup(data: SignupData): Observable<SignupResponse> {\n return this.#api.post<SignupResponse>('/registrations/fillup', { participation: data })\n }\n\n updateParticipant(data: SignupData): Observable<UpdateParticipantResponse> {\n return this.#api.post<UpdateParticipantResponse>('/registrations/update', { participation: data })\n }\n\n /** Sends (or resends) the email verification token to the given address. */\n sendEmailVerificationToken(email: string): Observable<SendEmailVerificationTokenResponse> {\n return this.#api.post<SendEmailVerificationTokenResponse>('/registrations/reset_email_verify_token', { email })\n }\n\n validateEmailToken(token: string): Observable<ValidateEmailTokenResponse> {\n return this.#api.post<ValidateEmailTokenResponse>('/registrations/validate_email_token', { token })\n }\n\n confirmEmail(token: string): Observable<ConfirmEmailResponse> {\n return this.#api.post<ConfirmEmailResponse>('/registrations/confirm_email', { token })\n }\n}\n","import { inject, Service } from '@angular/core'\nimport { Observable } from 'rxjs'\n\nimport { ApiClient } from '../http/api-client'\nimport { LoginCredentials, LoginFormResponse, LoginRequirementsResponse, LoginResponse, LogoutResponse, SsoLoginResponse } from './session-models'\n\n/** Participant session: login form, login/logout, SSO and login requirements. */\n@Service()\nexport class SessionService {\n readonly #api = inject(ApiClient)\n\n /** Fields the microsite asks for on login (the login identifier varies: email, code, document…). */\n getLoginForm(): Observable<LoginFormResponse> {\n return this.#api.get<LoginFormResponse>('/sessions/loginform')\n }\n\n login(credentials: LoginCredentials): Observable<LoginResponse> {\n return this.#api.post<LoginResponse>('/sessions/login', { participation: credentials })\n }\n\n logout(): Observable<LogoutResponse> {\n return this.#api.get<LogoutResponse>('/sessions/logout')\n }\n\n /** URL to redirect the participant to the SSO provider. */\n getSsoLoginUrl(provider: string): Observable<SsoLoginResponse> {\n return this.#api.get<SsoLoginResponse>('/auth/sso_login', { params: { provider } })\n }\n\n /** Whether the logged participant can use the site or must complete something first (`redirect_page`). */\n checkLoginRequirements(): Observable<LoginRequirementsResponse> {\n return this.#api.get<LoginRequirementsResponse>('/participant_login_requirements')\n }\n}\n","import { inject, Service } from '@angular/core'\nimport { Observable } from 'rxjs'\n\nimport { ApiClient } from '../http/api-client'\nimport { CreateTeamParams, CreateTeamResponse, RemoveMemberResponse, TeamResponse, TeamsListResponse, TeamsParams } from './teams-models'\n\n/** Teams. */\n@Service()\nexport class TeamsService {\n readonly #api = inject(ApiClient)\n\n list(params: TeamsParams = {}): Observable<TeamsListResponse> {\n return this.#api.get<TeamsListResponse>('/mod/teams', { params: { ...params } })\n }\n\n get(id: string): Observable<TeamResponse> {\n return this.#api.get<TeamResponse>(`/mod/teams/${id}/show`)\n }\n\n create(params: CreateTeamParams): Observable<CreateTeamResponse> {\n return this.#api.post<CreateTeamResponse>('/mod/teams', { team: params })\n }\n\n /** Removes the logged participant, or `uid` when given, from the team. */\n removeMember(id: string, uid?: string): Observable<RemoveMemberResponse> {\n return this.#api.post<RemoveMemberResponse>(`/mod/teams/${id}/remove_member`, {}, { params: { participant_uid: uid } })\n }\n}\n","import { inject, Service } from '@angular/core'\nimport { Observable } from 'rxjs'\n\nimport { ApiClient } from '../http/api-client'\nimport { CreateVoteParams, UpdateVoteParams, VoteResponse, VotesResponse } from './votes-models'\n\n/** Votes on an activity (target): like, support, interest, curiosity. */\n@Service()\nexport class VotesService {\n readonly #api = inject(ApiClient)\n\n get(targetId: string): Observable<VotesResponse> {\n return this.#api.get<VotesResponse>(`/mod/votes/${targetId}`)\n }\n\n create(targetId: string, params: CreateVoteParams = {}): Observable<VoteResponse> {\n return this.#api.post<VoteResponse>(`/mod/votes/${targetId}`, params)\n }\n\n update(targetId: string, params: UpdateVoteParams = {}): Observable<VoteResponse> {\n return this.#api.patch<VoteResponse>(`/mod/votes/${targetId}`, params)\n }\n\n delete(targetId: string): Observable<VoteResponse> {\n return this.#api.delete<VoteResponse>(`/mod/votes/${targetId}`)\n }\n}\n","/*\n * Public API Surface of @superlikers/microsites-api\n *\n * Everything exported here is public API (the contract with consumers).\n * Domain folders only hold public models and their service, so they are exported through their\n * `index.ts`; `config`, `errors` and `http` also hold internal pieces and are exported one by one.\n */\n\n// Config\nexport type { MicrositesApiConfig } from './lib/config/microsites-api-config'\nexport { provideMicrositesApi } from './lib/config/provide-microsites-api'\n\n// Errors\nexport { ApiError, isApiError } from './lib/errors/api-error'\n\n// Shared models\nexport type * from './lib/shared/activity-participant'\nexport type * from './lib/shared/date-filter'\nexport type * from './lib/shared/field'\n\n// Domains\nexport * from './lib/achievements'\nexport * from './lib/activities'\nexport * from './lib/badges'\nexport * from './lib/blogs'\nexport * from './lib/boards'\nexport * from './lib/comments'\nexport * from './lib/entries'\nexport * from './lib/external-forms'\nexport * from './lib/goals'\nexport * from './lib/metrics'\nexport * from './lib/participant'\nexport * from './lib/password'\nexport * from './lib/prizes'\nexport * from './lib/ranking'\nexport * from './lib/referrals'\nexport * from './lib/registrations'\nexport * from './lib/session'\nexport * from './lib/teams'\nexport * from './lib/votes'\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"superlikers-microsites-api.mjs","sources":["../../../projects/microsites-api/src/lib/config/provide-microsites-api.ts","../../../projects/microsites-api/src/lib/errors/api-error.ts","../../../projects/microsites-api/src/lib/http/query-params.ts","../../../projects/microsites-api/src/lib/http/api-client.ts","../../../projects/microsites-api/src/lib/achievements/achievements.service.ts","../../../projects/microsites-api/src/lib/activities/activities.service.ts","../../../projects/microsites-api/src/lib/badges/badges.service.ts","../../../projects/microsites-api/src/lib/blogs/blogs.service.ts","../../../projects/microsites-api/src/lib/boards/boards.service.ts","../../../projects/microsites-api/src/lib/comments/comments.service.ts","../../../projects/microsites-api/src/lib/entries/entries.service.ts","../../../projects/microsites-api/src/lib/entries/is-entry-type.ts","../../../projects/microsites-api/src/lib/external-forms/external-forms.service.ts","../../../projects/microsites-api/src/lib/goals/goals.service.ts","../../../projects/microsites-api/src/lib/metrics/metrics.service.ts","../../../projects/microsites-api/src/lib/participant/participant.service.ts","../../../projects/microsites-api/src/lib/password/password.service.ts","../../../projects/microsites-api/src/lib/prizes/prizes.service.ts","../../../projects/microsites-api/src/lib/ranking/ranking.service.ts","../../../projects/microsites-api/src/lib/referrals/referrals.service.ts","../../../projects/microsites-api/src/lib/registrations/registrations.service.ts","../../../projects/microsites-api/src/lib/session/session.service.ts","../../../projects/microsites-api/src/lib/teams/teams.service.ts","../../../projects/microsites-api/src/lib/votes/votes.service.ts","../../../projects/microsites-api/src/public-api.ts","../../../projects/microsites-api/src/superlikers-microsites-api.ts"],"sourcesContent":["import { EnvironmentProviders, inject, InjectionToken, makeEnvironmentProviders } from '@angular/core'\n\nimport { MicrositesApiConfig } from './microsites-api-config'\n\n/** @internal Holds the normalized config. Not part of the public API. */\nexport const MICROSITES_API_CONFIG = new InjectionToken<MicrositesApiConfig>('MICROSITES_API_CONFIG')\n\n/**\n * Configures `@superlikers/microsites-api` for the application.\n *\n * @example\n * ```ts\n * // app.config.ts\n * export const appConfig: ApplicationConfig = {\n * providers: [provideMicrositesApi({ baseUrl: environment.baseUrl })]\n * }\n * ```\n */\nexport function provideMicrositesApi(config: MicrositesApiConfig): EnvironmentProviders {\n return makeEnvironmentProviders([{ provide: MICROSITES_API_CONFIG, useValue: normalizeConfig(config) }])\n}\n\n/** @internal Reads the config inside the library, with a helpful error when it is missing. */\nexport function injectMicrositesApiConfig(): MicrositesApiConfig {\n const config = inject(MICROSITES_API_CONFIG, { optional: true })\n if (!config) {\n throw new Error('[@superlikers/microsites-api] Missing configuration. Add provideMicrositesApi({ baseUrl }) to your app.config.ts providers.')\n }\n return config\n}\n\nfunction normalizeConfig(config: MicrositesApiConfig): MicrositesApiConfig {\n const baseUrl = config.baseUrl?.trim().replace(/\\/+$/, '') ?? ''\n\n if (!URL.canParse(baseUrl) || !/^https?:$/.test(new URL(baseUrl).protocol)) {\n throw new Error(`[@superlikers/microsites-api] Invalid baseUrl \"${config.baseUrl}\". Expected an absolute http(s) URL, e.g. https://4x.superlikerslabs.com`)\n }\n\n return { ...config, baseUrl }\n}\n","import { HttpErrorResponse } from '@angular/common/http'\n\n/** Error body returned by the Superlikers backend. */\ninterface ErrorBody {\n state?: string\n message?: string\n code_error?: number\n errors?: Record<string, string>\n}\n\n/**\n * Error thrown by every `@superlikers/microsites-api` request.\n *\n * `message` is meant to be shown to the participant, so the fallbacks are in Spanish, like the\n * backend's own messages.\n *\n * @example\n * ```ts\n * try {\n * await firstValueFrom(sessionService.login(data))\n * } catch (error) {\n * if (isApiError(error)) this.message.set(error.message)\n * }\n * ```\n */\nexport class ApiError extends Error {\n override readonly name = 'ApiError'\n\n /** HTTP status. `0` means the request never reached the server (network, CORS, offline). */\n readonly status: number\n /** Backend error code (`code_error`), e.g. `140`. `null` when the backend did not send one. */\n readonly code: number | null\n /** Validation errors by field name, e.g. `{ email: 'is invalid' }`. Empty when there are none. */\n readonly fieldErrors: Readonly<Record<string, string>>\n /** URL of the failed request. */\n readonly url: string | null\n\n /**\n * `true` when the server answered with something that is not JSON (e.g. an HTML page).\n * Happens when a module is disabled for the campaign: the backend redirects to the site instead of answering.\n */\n readonly isInvalidResponse: boolean\n\n constructor(response: HttpErrorResponse) {\n const invalidResponse = isParseFailure(response)\n const body = invalidResponse ? {} : readBody(response.error)\n super(body.message || defaultMessage(response.status, invalidResponse), { cause: response })\n\n this.status = response.status\n this.code = typeof body.code_error === 'number' ? body.code_error : null\n this.fieldErrors = body.errors ?? {}\n this.url = response.url\n this.isInvalidResponse = invalidResponse\n }\n\n get isNetworkError(): boolean {\n return this.status === 0\n }\n\n get isUnauthorized(): boolean {\n return this.status === 401\n }\n}\n\nexport function isApiError(error: unknown): error is ApiError {\n return error instanceof ApiError\n}\n\nfunction readBody(error: unknown): ErrorBody {\n return typeof error === 'object' && error !== null ? (error as ErrorBody) : {}\n}\n\n/**\n * A 2xx body HttpClient could not parse: the fetch backend (Angular's default) reports the `SyntaxError`\n * itself, the XHR backend wraps it as `{ error: SyntaxError, text }`.\n */\nfunction isParseFailure(response: HttpErrorResponse): boolean {\n if (response.status < 200 || response.status >= 300) return false\n const error: unknown = response.error\n return error instanceof SyntaxError || (typeof error === 'object' && error !== null && (error as { error?: unknown }).error instanceof SyntaxError)\n}\n\nfunction defaultMessage(status: number, invalidResponse: boolean): string {\n if (invalidResponse) return 'El módulo puede estar deshabilitado en la campaña.'\n return status === 0 ? 'No pudimos conectarnos con el servidor. Revisa tu conexión.' : `La petición falló con estado ${status}.`\n}\n","import { HttpParameterCodec, HttpParams } from '@angular/common/http'\n\ntype ParamValue = string | number | boolean\ntype Nullable<T> = T | null | undefined\ntype ParamObject = Record<string, Nullable<ParamValue>>\n\n/** Query params as a plain object. `null`/`undefined` values are skipped. */\nexport type ApiParams = Record<string, Nullable<ParamValue> | readonly Nullable<ParamValue>[] | ParamObject>\n\n/**\n * Encodes every reserved character. Angular's default codec leaves `+` unencoded,\n * which the backend decodes as a space (`ana+test@mail.com` → `ana test@mail.com`).\n */\nclass StrictUrlCodec implements HttpParameterCodec {\n encodeKey(key: string): string {\n return encodeURIComponent(key)\n }\n encodeValue(value: string): string {\n return encodeURIComponent(value)\n }\n decodeKey(key: string): string {\n return decodeURIComponent(key)\n }\n decodeValue(value: string): string {\n return decodeURIComponent(value)\n }\n}\n\nconst codec = new StrictUrlCodec()\n\n/**\n * @internal Builds query params: arrays use `key[]`, plain objects use `key[subkey]`,\n * empty values are skipped. `{ page: 2, tags: ['a', 'b'], q: undefined }` → `page=2&tags[]=a&tags[]=b`.\n */\nexport function toHttpParams(params: ApiParams): HttpParams {\n let httpParams = new HttpParams({ encoder: codec })\n\n for (const [key, value] of Object.entries(params)) {\n if (Array.isArray(value)) {\n for (const item of value) {\n if (item != null) httpParams = httpParams.append(`${key}[]`, String(item))\n }\n } else if (isPlainObject(value)) {\n for (const [subkey, subvalue] of Object.entries(value)) {\n if (subvalue != null) httpParams = httpParams.append(`${key}[${subkey}]`, String(subvalue))\n }\n } else if (value != null) {\n httpParams = httpParams.append(key, String(value))\n }\n }\n\n return httpParams\n}\n\nfunction isPlainObject(value: unknown): value is ParamObject {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n}\n\n/**\n * @internal Casts a params object with a named nested type (e.g. a `date_filter: DateFilter` field) to\n * {@link ApiParams}. Named types without an index signature aren't structurally assignable to `ApiParams`\n * even when every property matches; `toHttpParams` handles arbitrary shapes safely at runtime regardless.\n */\nexport function asApiParams<T extends object>(params: T): ApiParams {\n return params as unknown as ApiParams\n}\n","import { HttpClient, HttpErrorResponse, HttpHeaders, HttpParams } from '@angular/common/http'\nimport { EnvironmentInjector, inject, runInInjectionContext, Service } from '@angular/core'\nimport { catchError, map, Observable, throwError } from 'rxjs'\n\nimport { injectMicrositesApiConfig } from '../config/provide-microsites-api'\nimport { ApiError } from '../errors/api-error'\nimport { ApiParams, toHttpParams } from './query-params'\n\n/** Options a domain service can pass to a request. */\nexport interface ApiRequestOptions {\n /** Plain object (serialized by {@link toHttpParams}) or ready-made `HttpParams`. */\n params?: ApiParams | HttpParams\n headers?: Record<string, string>\n /**\n * For endpoints that report failures in a 2xx body without `state: 'error'`: returns the error\n * message for such a body, or `null` when it is a success. The message is thrown as an `ApiError`.\n */\n failureMessage?: (body: unknown) => string | null\n}\n\n/**\n * @internal The library's only gateway to the microsite backend.\n * Every domain service makes its requests through here; nothing else uses `HttpClient`.\n */\n@Service()\nexport class ApiClient {\n readonly #http = inject(HttpClient)\n readonly #injector = inject(EnvironmentInjector)\n readonly #config = injectMicrositesApiConfig()\n\n get<T>(path: string, options?: ApiRequestOptions): Observable<T> {\n const url = this.#url(path)\n return this.#handleErrors(this.#http.get<T>(url, this.#options(options)), url, options)\n }\n\n post<T>(path: string, body: unknown, options?: ApiRequestOptions): Observable<T> {\n const url = this.#url(path)\n return this.#handleErrors(this.#http.post<T>(url, body, this.#options(options)), url, options)\n }\n\n put<T>(path: string, body: unknown, options?: ApiRequestOptions): Observable<T> {\n const url = this.#url(path)\n return this.#handleErrors(this.#http.put<T>(url, body, this.#options(options)), url, options)\n }\n\n patch<T>(path: string, body: unknown, options?: ApiRequestOptions): Observable<T> {\n const url = this.#url(path)\n return this.#handleErrors(this.#http.patch<T>(url, body, this.#options(options)), url, options)\n }\n\n delete<T>(path: string, options?: ApiRequestOptions): Observable<T> {\n const url = this.#url(path)\n return this.#handleErrors(this.#http.delete<T>(url, this.#options(options)), url, options)\n }\n\n /** `/sessions/login` → `https://4x.superlikerslabs.com/sessions/login` */\n #url(path: string): string {\n return `${this.#config.baseUrl}/${path.replace(/^\\/+/, '')}`\n }\n\n /** What every request shares. `Content-Type` is left to HttpClient (JSON for objects, none for FormData). */\n #options(options?: ApiRequestOptions) {\n return {\n params: options?.params instanceof HttpParams ? options.params : toHttpParams(options?.params ?? {}),\n headers: new HttpHeaders({ Accept: 'application/json', ...options?.headers }),\n withCredentials: true\n }\n }\n\n /**\n * Turns every failure into an {@link ApiError} and notifies `onUnauthorized` on 401.\n * Some endpoints report errors with HTTP 200 and `state: 'error'` (e.g. referral code validation), and\n * others in their own shape (see `failureMessage`); both are thrown as an `ApiError` with status 200,\n * so callers only handle errors in one place.\n */\n #handleErrors<T>(request: Observable<T>, url: string, options?: ApiRequestOptions): Observable<T> {\n return request.pipe(\n map(body => {\n const message = options?.failureMessage?.(body) ?? null\n if (message !== null) {\n const failure = typeof body === 'object' && body !== null ? { ...body, state: 'error', message } : { state: 'error', message, body }\n throw new ApiError(new HttpErrorResponse({ status: 200, statusText: 'OK', error: failure, url }))\n }\n if (isErrorBody(body)) throw new ApiError(new HttpErrorResponse({ status: 200, statusText: 'OK', error: body, url }))\n return body\n }),\n catchError((error: unknown) => {\n if (!(error instanceof HttpErrorResponse)) return throwError(() => error)\n\n const apiError = new ApiError(error)\n const onUnauthorized = this.#config.onUnauthorized\n if (apiError.isUnauthorized && onUnauthorized) runInInjectionContext(this.#injector, () => onUnauthorized(apiError))\n\n return throwError(() => apiError)\n })\n )\n }\n}\n\nfunction isErrorBody(body: unknown): boolean {\n return typeof body === 'object' && body !== null && !Array.isArray(body) && (body as { state?: unknown }).state === 'error'\n}\n","import { inject, Service } from '@angular/core'\nimport { Observable } from 'rxjs'\n\nimport { ApiClient } from '../http/api-client'\nimport { asApiParams } from '../http/query-params'\nimport { AchievementsListResponse, AchievementsParams, BadgeAchievement, GoalAchievement } from './achievements-models'\n\n/** Achievements earned by participants (goal and badge achievements). */\n@Service()\nexport class AchievementsService {\n readonly #api = inject(ApiClient)\n\n list<T = GoalAchievement | BadgeAchievement>(params: AchievementsParams = {}): Observable<AchievementsListResponse<T>> {\n return this.#api.get<AchievementsListResponse<T>>('/achievements/index', { params: asApiParams({ ...params, view: params.view ?? 'list' }) })\n }\n}\n","import { inject, Service } from '@angular/core'\nimport { Observable } from 'rxjs'\n\nimport { ApiClient } from '../http/api-client'\nimport { UploadDocumentParams, UploadDocumentResponse, UploadPhotoParams, UploadPhotoResponse } from './activities-models'\n\n/** Photo and document uploads. */\n@Service()\nexport class ActivitiesService {\n readonly #api = inject(ApiClient)\n\n uploadPhoto({ file, filename, category }: UploadPhotoParams): Observable<UploadPhotoResponse> {\n const body = new FormData()\n if (filename) body.append('upload_photo[image]', file, filename)\n else body.append('upload_photo[image]', file)\n if (category != null) body.append('upload_photo[category]', category)\n\n return this.#api.post<UploadPhotoResponse>('/mod/photos', body)\n }\n\n uploadDocument({ file, category }: UploadDocumentParams): Observable<UploadDocumentResponse> {\n const body = new FormData()\n body.append('upload_document[document]', file)\n if (category) body.append('upload_document[category]', category)\n\n return this.#api.post<UploadDocumentResponse>('/mod/documents', body)\n }\n}\n","import { inject, Service } from '@angular/core'\nimport { Observable } from 'rxjs'\n\nimport { ApiClient } from '../http/api-client'\nimport { BadgeResponse, BadgesListResponse, BadgesParams, ParticipantBadgesResponse } from './badges-models'\n\n/** Badges and the badges earned by a participant. */\n@Service()\nexport class BadgesService {\n readonly #api = inject(ApiClient)\n\n list(params: BadgesParams = {}): Observable<BadgesListResponse> {\n return this.#api.get<BadgesListResponse>('/badges/index', { params: { ...params } })\n }\n\n get(id: string): Observable<BadgeResponse> {\n return this.#api.get<BadgeResponse>(`/badges/${id}/show`)\n }\n\n /** Badges earned by the logged participant, or by `uid` when given. */\n getStats(uid?: string): Observable<ParticipantBadgesResponse> {\n return this.#api.get<ParticipantBadgesResponse>('/badges/stats', { params: { participant_uid: uid } })\n }\n}\n","import { inject, Service } from '@angular/core'\nimport { Observable } from 'rxjs'\n\nimport { ApiClient } from '../http/api-client'\nimport { ActivityParticipant } from '../shared/activity-participant'\nimport { BlogPostResponse, BlogPostsParams, BlogPostsResponse, CreateBlogPostParams, CreateBlogPostResponse } from './blogs-models'\n\n/** Blog posts (mod/blog activity). */\n@Service()\nexport class BlogsService {\n readonly #api = inject(ApiClient)\n\n list<T = ActivityParticipant>(params: BlogPostsParams = {}): Observable<BlogPostsResponse<T>> {\n return this.#api.get<BlogPostsResponse<T>>('/mod/blog', { params: { ...params, page: params.page ?? 1 } })\n }\n\n get<T = ActivityParticipant>(id: string): Observable<BlogPostResponse<T>> {\n return this.#api.get<BlogPostResponse<T>>(`/mod/blog/${id}/show`)\n }\n\n create<T = ActivityParticipant>({ title, body, format, attached_file, category, tags, push_redirect_url }: CreateBlogPostParams): Observable<CreateBlogPostResponse<T>> {\n const data = new FormData()\n data.append('blog_post[title]', title)\n data.append('blog_post[body]', body)\n data.append('blog_post[format]', format ?? 'text')\n if (attached_file) data.append('blog_post[attached_file]', attached_file)\n if (category) data.append('blog_post[category]', category)\n if (push_redirect_url) data.append('blog_post[push_redirect_url]', push_redirect_url)\n for (const tag of tags ?? []) data.append('blog_post[tags][]', tag)\n\n return this.#api.post<CreateBlogPostResponse<T>>('/mod/blogs', data)\n }\n}\n","import { inject, Service } from '@angular/core'\nimport { Observable } from 'rxjs'\n\nimport { ApiClient } from '../http/api-client'\nimport { BoardReportsResponse, BoardsListResponse, BoardsParams, ExecuteReportParams, ExecuteReportResponse } from './boards-models'\n\n/** Dashboards (boards) and their reports. */\n@Service()\nexport class BoardsService {\n readonly #api = inject(ApiClient)\n\n list(params: BoardsParams = {}): Observable<BoardsListResponse> {\n return this.#api.get<BoardsListResponse>('/boards/index', { params: { ...params } })\n }\n\n listReports(board: string, page?: number): Observable<BoardReportsResponse> {\n return this.#api.get<BoardReportsResponse>(`/boards/${board}/reports`, { params: { page } })\n }\n\n /** Either `timeframe` or `start_date`/`end_date` is used, never both. */\n executeReport(board: string, report: string, params: ExecuteReportParams = {}): Observable<ExecuteReportResponse> {\n const query = params.timeframe ? { timeframe: params.timeframe } : { start_date: params.start_date, end_date: params.end_date }\n return this.#api.get<ExecuteReportResponse>(`/boards/${board}/reports/${report}/exec`, { params: query })\n }\n}\n","import { inject, Service } from '@angular/core'\nimport { Observable } from 'rxjs'\n\nimport { ApiClient } from '../http/api-client'\nimport { ActivityParticipant } from '../shared/activity-participant'\nimport { CommentsListResponse, CommentsParams, CreateCommentParams, CreateCommentResponse } from './comments-models'\n\n/** Comments on an activity (target). */\n@Service()\nexport class CommentsService {\n readonly #api = inject(ApiClient)\n\n list<T = ActivityParticipant>(targetId: string, params: CommentsParams = {}): Observable<CommentsListResponse<T>> {\n return this.#api.get<CommentsListResponse<T>>(`/mod/comments/${targetId}`, { params: { ...params } })\n }\n\n create<T = ActivityParticipant>(targetId: string, { body, category }: CreateCommentParams): Observable<CreateCommentResponse<T>> {\n return this.#api.post<CreateCommentResponse<T>>(`/mod/comments/${targetId}`, { comment: { body, category } })\n }\n}\n","import { inject, Service } from '@angular/core'\nimport { Observable } from 'rxjs'\n\nimport { ApiClient } from '../http/api-client'\nimport { asApiParams } from '../http/query-params'\nimport { CreateExternalOptions, CreateExternalResponse, DocumentEntry, EntriesListParams, EntriesParams, EntriesResponse, Entry, EntryData, ExternalEntry, PhotoEntry, PurchaseEntry, RedeemEntry } from './entries-models'\n\n/**\n * Entries (activities) of the logged participant, or of another one with `participant_uid` (admins).\n * Every method uses the detailed `show` view. Types without a method of their own are listed with `list({ _type })`.\n */\n@Service()\nexport class EntriesService {\n readonly #api = inject(ApiClient)\n\n /** `T`: shape of `data` (the campaign's external action fields). */\n listExternals<T = EntryData>(params: EntriesParams = {}): Observable<EntriesResponse<ExternalEntry<T>>> {\n return this.#list<ExternalEntry<T>>({ ...params, _type: 'External' })\n }\n\n listRedemptions(params: EntriesParams = {}): Observable<EntriesResponse<RedeemEntry>> {\n return this.#list<RedeemEntry>({ ...params, _type: 'Redeem' })\n }\n\n listPhotos(params: EntriesParams = {}): Observable<EntriesResponse<PhotoEntry>> {\n return this.#list<PhotoEntry>({ ...params, _type: 'UploadPhoto' })\n }\n\n listDocuments(params: EntriesParams = {}): Observable<EntriesResponse<DocumentEntry>> {\n return this.#list<DocumentEntry>({ ...params, _type: 'UploadDocument' })\n }\n\n listPurchases(params: EntriesParams = {}): Observable<EntriesResponse<PurchaseEntry>> {\n return this.#list<PurchaseEntry>({ ...params, _type: 'Retail::Buy' })\n }\n\n /** Every entry, or one `_type` (including the ones without a method of their own). Narrow each item with `isEntryType`. */\n list(params: EntriesListParams = {}): Observable<EntriesResponse<Entry>> {\n return this.#list<Entry>(params)\n }\n\n /** Entries of several participants at once (admins only, 100 per page). `uids` is required by the backend. */\n search(uids: string[], params: EntriesListParams = {}): Observable<EntriesResponse<Entry>> {\n return this.#api.get<EntriesResponse<Entry>>('/entries/search', { params: asApiParams({ ...params, participant_uids: uids, hide_undo: params.hide_undo ?? true, view: 'show' }) })\n }\n\n /**\n * Records an external action event.\n * @param event An external action configured in the campaign (otherwise `code_error: 30`).\n * @param properties Event data. Must not be empty (otherwise `code_error: 11`).\n */\n createExternal(event: string, properties: Record<string, unknown>, { category, points_type }: CreateExternalOptions = {}): Observable<CreateExternalResponse> {\n return this.#api.post<CreateExternalResponse>('/mod/external', { event, properties, category, points_type })\n }\n\n #list<E>(params: EntriesListParams): Observable<EntriesResponse<E>> {\n return this.#api.get<EntriesResponse<E>>('/participant_entries', { params: asApiParams({ ...params, hide_undo: params.hide_undo ?? true, view: 'show' }) })\n }\n}\n","import { Entry, EntryTypes, KnownEntryType } from './entries-models'\n\n/**\n * Narrows an entry to its type.\n *\n * @example\n * ```ts\n * for (const entry of response.data) {\n * if (isEntryType(entry, 'Redeem')) console.log(entry.prize.name)\n * }\n * ```\n */\nexport function isEntryType<K extends KnownEntryType>(entry: Entry, type: K): entry is EntryTypes[K] {\n return entry._type === type\n}\n","import { inject, Service } from '@angular/core'\nimport { Observable } from 'rxjs'\n\nimport { ApiClient } from '../http/api-client'\nimport { EntryData, ExternalEntry } from '../entries/entries-models'\nimport { ExternalFormFieldsResponse, ExternalFormsListParams, ExternalFormsListResponse, ExternalFormSubmissionResponse, ExternalFormSubmissionsParams, ExternalFormSubmissionsResponse } from './external-forms-models'\n\n/** External forms (custom actions configured per campaign) and their submissions. */\n@Service()\nexport class ExternalFormsService {\n readonly #api = inject(ApiClient)\n\n listForms(params: ExternalFormsListParams = {}): Observable<ExternalFormsListResponse> {\n return this.#api.get<ExternalFormsListResponse>('/external_forms/actions/list', { params: { ...params, participant_match_rules: params.participant_match_rules ?? true } })\n }\n\n getFormFields(id: string): Observable<ExternalFormFieldsResponse> {\n return this.#api.get<ExternalFormFieldsResponse>(`/external_forms/actions/${id}/fields_info`)\n }\n\n submit(id: string, values: Record<string, unknown>, category?: string): Observable<ExternalFormSubmissionResponse> {\n return this.#api.post<ExternalFormSubmissionResponse>(`/external_forms/actions/${id}/fillup`, { external_form: values, category })\n }\n\n /** Submitted forms (`External` entries), paginated. It is a read, but the backend only accepts POST. `T`: shape of `data`. */\n listSubmissions<T = EntryData>(params: ExternalFormSubmissionsParams = {}): Observable<ExternalFormSubmissionsResponse<T>> {\n return this.#api.post<ExternalFormSubmissionsResponse<T>>('/external_forms/list', { ...params, hide_undo: params.hide_undo ?? true })\n }\n\n /** @param id The submission (entry) `_id`. */\n getSubmission<T = EntryData>(id: string): Observable<ExternalEntry<T>> {\n return this.#api.get<ExternalEntry<T>>(`/external_forms/${id}`)\n }\n\n updateSubmission(id: string, values: Record<string, unknown>): Observable<ExternalFormSubmissionResponse> {\n return this.#api.patch<ExternalFormSubmissionResponse>(`/external_forms/${id}`, { external_form: values })\n }\n}\n","import { inject, Service } from '@angular/core'\nimport { Observable } from 'rxjs'\n\nimport { ApiClient } from '../http/api-client'\nimport { GoalAcceptanceResponse, GoalData, GoalsListParams, GoalsListResponse, ParticipantGoalsParams, ParticipantGoalsResponse } from './goals-models'\n\n/** Campaign goals: the participant's goals with progress, the campaign catalog, and accepting goals. */\n@Service()\nexport class GoalsService {\n readonly #api = inject(ApiClient)\n\n /** Goals that apply to the logged participant (or `participant_uid`), with their progress. `T`: shape of `goal_data`. */\n listParticipantGoals<T = GoalData>(params: ParticipantGoalsParams = {}): Observable<ParticipantGoalsResponse<T>> {\n return this.#api.get<ParticipantGoalsResponse<T>>('/participants/goals', { params: { ...params } })\n }\n\n /** Every goal of the campaign (no progress), paginated. It is a read, but the backend only accepts POST. */\n list<T = GoalData>(params: GoalsListParams = {}): Observable<GoalsListResponse<T>> {\n return this.#api.post<GoalsListResponse<T>>('/goals/index', { ...params, include_ended: params.include_ended ?? true })\n }\n\n /** @param goalId The goal id (`ParticipantGoal.goal_id`, not its `_id`). */\n accept(goalId: string): Observable<GoalAcceptanceResponse> {\n return this.#api.post<GoalAcceptanceResponse>('/participants/goals/accept', { goal_id: goalId })\n }\n\n /** @param goalId The goal id (`ParticipantGoal.goal_id`, not its `_id`). */\n decline(goalId: string): Observable<GoalAcceptanceResponse> {\n return this.#api.post<GoalAcceptanceResponse>('/participants/goals/unaccept', { goal_id: goalId })\n }\n}\n","import { inject, Service } from '@angular/core'\nimport { Observable } from 'rxjs'\n\nimport { ApiClient } from '../http/api-client'\nimport { CalculateMetricParams, CalculateMetricResponse, MetricsListResponse, MetricsParams } from './metrics-models'\n\n/** Campaign metrics (custom aggregations configured per campaign). */\n@Service()\nexport class MetricsService {\n readonly #api = inject(ApiClient)\n\n list(params: MetricsParams = {}): Observable<MetricsListResponse> {\n return this.#api.get<MetricsListResponse>('/metrics/index', { params: { ...params } })\n }\n\n calculate(params: CalculateMetricParams): Observable<CalculateMetricResponse> {\n return this.#api.get<CalculateMetricResponse>('/metrics/exec', { params: { ...params } })\n }\n}\n","import { inject, Service } from '@angular/core'\nimport { Observable } from 'rxjs'\n\nimport { ApiClient } from '../http/api-client'\nimport {\n BaseCurrentParticipant,\n BaseParticipant,\n BaseParticipantRankData,\n CurrentParticipantResponse,\n ParticipantListParams,\n ParticipantListResponse,\n ParticipantRankResponse,\n ParticipantResponse,\n PushSubscriptionPayload,\n RemovePushSubscriptionsResponse,\n SavePushSubscriptionResponse\n} from './participant-models'\n\n/** Logged participant, participant lists and push notification subscriptions. */\n@Service()\nexport class ParticipantService {\n readonly #api = inject(ApiClient)\n\n /** Logged participant and site config. `T`: your participant interface (`extends BaseCurrentParticipant`). */\n getCurrent<T = BaseCurrentParticipant>(): Observable<CurrentParticipantResponse<T>> {\n return this.#api.get<CurrentParticipantResponse<T>>('/sconfig')\n }\n\n /** Points, level and position of the logged participant. `T`: shape of `data.data` (`extends BaseParticipantRankData`). */\n getRank<T = BaseParticipantRankData>(): Observable<ParticipantRankResponse<T>> {\n return this.#api.get<ParticipantRankResponse<T>>('/participant_rank')\n }\n\n /** `T`: your participant interface (`extends BaseParticipant`). */\n list<T = BaseParticipant>(params: ParticipantListParams = {}): Observable<ParticipantListResponse<T>> {\n return this.#api.get<ParticipantListResponse<T>>('/participants/list', { params: { ...params } })\n }\n\n /** `T`: your participant interface (`extends BaseParticipant`). */\n getByUid<T = BaseParticipant>(uid: string): Observable<ParticipantResponse<T>> {\n return this.#api.get<ParticipantResponse<T>>('/participants/show', { params: { uid } })\n }\n\n /** Sends the browser subscription as the request body, unwrapped. */\n savePushSubscription(subscription: PushSubscriptionPayload): Observable<SavePushSubscriptionResponse> {\n return this.#api.post<SavePushSubscriptionResponse>('/participants/save_push_subscription', subscription)\n }\n\n removePushSubscriptions(): Observable<RemovePushSubscriptionsResponse> {\n return this.#api.post<RemovePushSubscriptionsResponse>('/participants/remove_push_subscriptions', {})\n }\n}\n","import { inject, Service } from '@angular/core'\nimport { Observable } from 'rxjs'\n\nimport { ApiClient } from '../http/api-client'\nimport { ChangePasswordParams, ChangePasswordResponse, NotificationChannel, ResetPasswordParams, ResetPasswordResponse, SendResetTokenParams, SendResetTokenResponse, ValidateChannelResponse } from './password-models'\n\n/** Change password (logged participant) and the password recovery flow. */\n@Service()\nexport class PasswordService {\n readonly #api = inject(ApiClient)\n\n changePassword(params: ChangePasswordParams): Observable<ChangePasswordResponse> {\n return this.#api.put<ChangePasswordResponse>('/password/change', { participation: params })\n }\n\n /** Checks that a participant exists for the given channel value (e.g. an email or a phone number). */\n validateChannel(channel: NotificationChannel, value: string): Observable<ValidateChannelResponse> {\n return this.#api.post<ValidateChannelResponse>('/password/validate_channel', { [channel]: value })\n }\n\n sendResetToken({ channel, data, edit_password_url, uid }: SendResetTokenParams): Observable<SendResetTokenResponse> {\n const body: Record<string, unknown> = { participation: data, notification_channel: channel, edit_password_url }\n if (uid) body['uid'] = uid\n\n return this.#api.post<SendResetTokenResponse>('/password', body)\n }\n\n resetPassword({ password, password_confirmation, token, channel }: ResetPasswordParams): Observable<ResetPasswordResponse> {\n return this.#api.post<ResetPasswordResponse>('/password/update', { participation: { password, password_confirmation }, token, channel })\n }\n}\n","import { inject, Service } from '@angular/core'\nimport { Observable } from 'rxjs'\n\nimport { ApiClient } from '../http/api-client'\nimport { asApiParams } from '../http/query-params'\nimport { CheckRedeemResponse, ExternalCouponDataResponse, PrizesListResponse, PrizesParams, RedeemedPrize, RedeemFailure, ToggleWishlistResponse, WishlistResponse } from './prizes-models'\n\n/** Prizes and redemptions. */\n@Service()\nexport class PrizesService {\n readonly #api = inject(ApiClient)\n\n list(params: PrizesParams = {}): Observable<PrizesListResponse> {\n return this.#api.get<PrizesListResponse>('/prizes/index', { params: asApiParams({ ...params, page: params.page ?? 1, view: params.view ?? 'show' }) })\n }\n\n checkRedeem(id: string): Observable<CheckRedeemResponse> {\n return this.#api.get<CheckRedeemResponse>(`/prizes/${id}/redeem/check`)\n }\n\n redeem(id: string, opts: Record<string, unknown> = {}): Observable<RedeemedPrize> {\n return this.#api.post<RedeemedPrize>(`/prizes/${id}/redeem`, opts, { failureMessage: redeemFailureMessage })\n }\n\n getWishlist(page?: number): Observable<WishlistResponse> {\n return this.#api.get<WishlistResponse>('/prizes/whislist', { params: { page } })\n }\n\n toggleWishlist(id: string): Observable<ToggleWishlistResponse> {\n return this.#api.get<ToggleWishlistResponse>(`/prizes/${id}/whislist_toggle`, { params: { id } })\n }\n\n getExternalCouponData(id: string, key: string, city?: string): Observable<ExternalCouponDataResponse> {\n return this.#api.get<ExternalCouponDataResponse>(`/prizes/${id}/redeem/external/${key}`, { params: { city } })\n }\n}\n\n/** A rejected redemption answers with HTTP 200 and `success: false` (see {@link RedeemFailure}). */\nfunction redeemFailureMessage(body: unknown): string | null {\n const failure = body as Partial<RedeemFailure> | null\n if (!failure || failure.success !== false) return null\n return failure.missing_message || 'No pudimos canjear el premio.'\n}\n","import { inject, Service } from '@angular/core'\nimport { Observable } from 'rxjs'\n\nimport { ApiClient } from '../http/api-client'\nimport { AdvancedRankingParams, AdvancedRankingResponse, SegmentRankingParams, SegmentRankingResponse } from './ranking-models'\n\n/** Segment and advanced participant rankings. */\n@Service()\nexport class RankingService {\n readonly #api = inject(ApiClient)\n\n getSegment(params: SegmentRankingParams = {}): Observable<SegmentRankingResponse> {\n return this.#api.get<SegmentRankingResponse>('/participants/ranks/segment', { params: { ...params } })\n }\n\n getAdvanced<T = Record<string, unknown>>(params: AdvancedRankingParams = {}): Observable<AdvancedRankingResponse<T>> {\n return this.#api.get<AdvancedRankingResponse<T>>('/participants/ranks/advanced', { params: { ...params } })\n }\n}\n","import { inject, Service } from '@angular/core'\nimport { Observable } from 'rxjs'\n\nimport { ApiClient } from '../http/api-client'\nimport { ChangeReferralCodeResponse } from './referrals-models'\n\n/** The participant's referral code. */\n@Service()\nexport class ReferralsService {\n readonly #api = inject(ApiClient)\n\n changeCode(code: string): Observable<ChangeReferralCodeResponse> {\n return this.#api.post<ChangeReferralCodeResponse>('/mod/referrals', {}, { params: { code } })\n }\n}\n","import { inject, Service } from '@angular/core'\nimport { Observable } from 'rxjs'\n\nimport { ApiClient } from '../http/api-client'\nimport { ConfirmEmailResponse, SendEmailVerificationTokenResponse, SignupData, SignupFormResponse, SignupResponse, UpdateParticipantResponse, ValidateEmailTokenResponse } from './registrations-models'\n\n/** Signup and email verification. */\n@Service()\nexport class RegistrationsService {\n readonly #api = inject(ApiClient)\n\n getSignupForm(): Observable<SignupFormResponse> {\n return this.#api.get<SignupFormResponse>('/registrations/signupform')\n }\n\n signup(data: SignupData): Observable<SignupResponse> {\n return this.#api.post<SignupResponse>('/registrations/fillup', { participation: data })\n }\n\n updateParticipant(data: SignupData): Observable<UpdateParticipantResponse> {\n return this.#api.post<UpdateParticipantResponse>('/registrations/update', { participation: data })\n }\n\n /** Sends (or resends) the email verification token to the given address. */\n sendEmailVerificationToken(email: string): Observable<SendEmailVerificationTokenResponse> {\n return this.#api.post<SendEmailVerificationTokenResponse>('/registrations/reset_email_verify_token', { email })\n }\n\n validateEmailToken(token: string): Observable<ValidateEmailTokenResponse> {\n return this.#api.post<ValidateEmailTokenResponse>('/registrations/validate_email_token', { token })\n }\n\n confirmEmail(token: string): Observable<ConfirmEmailResponse> {\n return this.#api.post<ConfirmEmailResponse>('/registrations/confirm_email', { token })\n }\n}\n","import { inject, Service } from '@angular/core'\nimport { Observable } from 'rxjs'\n\nimport { ApiClient } from '../http/api-client'\nimport { LoginCredentials, LoginFormResponse, LoginRequirementsResponse, LoginResponse, LogoutResponse, SsoLoginResponse } from './session-models'\n\n/** Participant session: login form, login/logout, SSO and login requirements. */\n@Service()\nexport class SessionService {\n readonly #api = inject(ApiClient)\n\n /** Fields the microsite asks for on login (the login identifier varies: email, code, document…). */\n getLoginForm(): Observable<LoginFormResponse> {\n return this.#api.get<LoginFormResponse>('/sessions/loginform')\n }\n\n login(credentials: LoginCredentials): Observable<LoginResponse> {\n return this.#api.post<LoginResponse>('/sessions/login', { participation: credentials })\n }\n\n logout(): Observable<LogoutResponse> {\n return this.#api.get<LogoutResponse>('/sessions/logout')\n }\n\n /** URL to redirect the participant to the SSO provider. */\n getSsoLoginUrl(provider: string): Observable<SsoLoginResponse> {\n return this.#api.get<SsoLoginResponse>('/auth/sso_login', { params: { provider } })\n }\n\n /** Whether the logged participant can use the site or must complete something first (`redirect_page`). */\n checkLoginRequirements(): Observable<LoginRequirementsResponse> {\n return this.#api.get<LoginRequirementsResponse>('/participant_login_requirements')\n }\n}\n","import { inject, Service } from '@angular/core'\nimport { Observable } from 'rxjs'\n\nimport { ApiClient } from '../http/api-client'\nimport { CreateTeamParams, CreateTeamResponse, RemoveMemberResponse, TeamResponse, TeamsListResponse, TeamsParams } from './teams-models'\n\n/** Teams. */\n@Service()\nexport class TeamsService {\n readonly #api = inject(ApiClient)\n\n list(params: TeamsParams = {}): Observable<TeamsListResponse> {\n return this.#api.get<TeamsListResponse>('/mod/teams', { params: { ...params } })\n }\n\n get(id: string): Observable<TeamResponse> {\n return this.#api.get<TeamResponse>(`/mod/teams/${id}/show`)\n }\n\n create(params: CreateTeamParams): Observable<CreateTeamResponse> {\n return this.#api.post<CreateTeamResponse>('/mod/teams', { team: params })\n }\n\n /** Removes the logged participant, or `uid` when given, from the team. */\n removeMember(id: string, uid?: string): Observable<RemoveMemberResponse> {\n return this.#api.post<RemoveMemberResponse>(`/mod/teams/${id}/remove_member`, {}, { params: { participant_uid: uid } })\n }\n}\n","import { inject, Service } from '@angular/core'\nimport { Observable } from 'rxjs'\n\nimport { ApiClient } from '../http/api-client'\nimport { CreateVoteParams, UpdateVoteParams, VoteResponse, VotesResponse } from './votes-models'\n\n/** Votes on an activity (target): like, support, interest, curiosity. */\n@Service()\nexport class VotesService {\n readonly #api = inject(ApiClient)\n\n get(targetId: string): Observable<VotesResponse> {\n return this.#api.get<VotesResponse>(`/mod/votes/${targetId}`)\n }\n\n create(targetId: string, params: CreateVoteParams = {}): Observable<VoteResponse> {\n return this.#api.post<VoteResponse>(`/mod/votes/${targetId}`, params)\n }\n\n update(targetId: string, params: UpdateVoteParams = {}): Observable<VoteResponse> {\n return this.#api.patch<VoteResponse>(`/mod/votes/${targetId}`, params)\n }\n\n delete(targetId: string): Observable<VoteResponse> {\n return this.#api.delete<VoteResponse>(`/mod/votes/${targetId}`)\n }\n}\n","/*\n * Public API Surface of @superlikers/microsites-api\n *\n * Everything exported here is public API (the contract with consumers).\n * Domain folders only hold public models and their service, so they are exported through their\n * `index.ts`; `config`, `errors` and `http` also hold internal pieces and are exported one by one.\n */\n\n// Config\nexport type { MicrositesApiConfig } from './lib/config/microsites-api-config'\nexport { provideMicrositesApi } from './lib/config/provide-microsites-api'\n\n// Errors\nexport { ApiError, isApiError } from './lib/errors/api-error'\n\n// Shared models\nexport type * from './lib/shared/activity-participant'\nexport type * from './lib/shared/date-filter'\nexport type * from './lib/shared/field'\n\n// Domains\nexport * from './lib/achievements'\nexport * from './lib/activities'\nexport * from './lib/badges'\nexport * from './lib/blogs'\nexport * from './lib/boards'\nexport * from './lib/comments'\nexport * from './lib/entries'\nexport * from './lib/external-forms'\nexport * from './lib/goals'\nexport * from './lib/metrics'\nexport * from './lib/participant'\nexport * from './lib/password'\nexport * from './lib/prizes'\nexport * from './lib/ranking'\nexport * from './lib/referrals'\nexport * from './lib/registrations'\nexport * from './lib/session'\nexport * from './lib/teams'\nexport * from './lib/votes'\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -6,6 +6,9 @@ import { Observable } from 'rxjs';
|
|
|
6
6
|
/**
|
|
7
7
|
* Error thrown by every `@superlikers/microsites-api` request.
|
|
8
8
|
*
|
|
9
|
+
* `message` is meant to be shown to the participant, so the fallbacks are in Spanish, like the
|
|
10
|
+
* backend's own messages.
|
|
11
|
+
*
|
|
9
12
|
* @example
|
|
10
13
|
* ```ts
|
|
11
14
|
* try {
|
|
@@ -100,12 +103,14 @@ interface BaseParticipant {
|
|
|
100
103
|
name: string;
|
|
101
104
|
first_name: string;
|
|
102
105
|
last_name: string;
|
|
103
|
-
email
|
|
104
|
-
|
|
105
|
-
|
|
106
|
+
/** Missing in campaigns that don't ask for an email. */
|
|
107
|
+
email?: string;
|
|
108
|
+
/** Empty when there is no email pending confirmation; missing in campaigns without email. */
|
|
109
|
+
unconfirmed_email?: string;
|
|
106
110
|
email_verified: boolean;
|
|
107
111
|
cellphone_verified: boolean;
|
|
108
|
-
|
|
112
|
+
/** Missing when the participant never set one. */
|
|
113
|
+
avatar?: string;
|
|
109
114
|
picture_url: string;
|
|
110
115
|
large_picture_url: string;
|
|
111
116
|
points: number;
|
|
@@ -876,7 +881,20 @@ interface CheckRedeemResponse {
|
|
|
876
881
|
kind: PrizeType;
|
|
877
882
|
extra_form: string;
|
|
878
883
|
}
|
|
879
|
-
/**
|
|
884
|
+
/**
|
|
885
|
+
* What the backend answers with HTTP 200 when the redemption is rejected (not enough points, over the
|
|
886
|
+
* limit…). {@link PrizesService.redeem} throws it as an `ApiError` whose `message` is `missing_message`;
|
|
887
|
+
* the whole body is in `ApiError.cause`.
|
|
888
|
+
*/
|
|
889
|
+
interface RedeemFailure {
|
|
890
|
+
success: false;
|
|
891
|
+
missing_message: string;
|
|
892
|
+
missing: {
|
|
893
|
+
points: number;
|
|
894
|
+
overlimit: boolean;
|
|
895
|
+
};
|
|
896
|
+
}
|
|
897
|
+
/** `POST /prizes/:id/redeem` when it succeeds. */
|
|
880
898
|
interface RedeemedPrize {
|
|
881
899
|
_id: string;
|
|
882
900
|
redeem_id: string;
|
|
@@ -1955,4 +1973,4 @@ declare class VotesService {
|
|
|
1955
1973
|
}
|
|
1956
1974
|
|
|
1957
1975
|
export { AchievementsService, ActivitiesService, ApiError, BadgesService, BlogsService, BoardsService, CommentsService, EntriesService, ExternalFormsService, GoalsService, MetricsService, ParticipantService, PasswordService, PrizesService, RankingService, ReferralsService, RegistrationsService, SessionService, TeamsService, VotesService, isApiError, isEntryType, provideMicrositesApi };
|
|
1958
|
-
export type { AchievementType, AchievementsListResponse, AchievementsMetadata, AchievementsParams, ActivityParticipant, AdvancedRanking, AdvancedRankingParams, AdvancedRankingResponse, Badge, BadgeAchievement, BadgeConditions, BadgeResponse, BadgesListResponse, BadgesParams, BaseAchievement, BaseCurrentParticipant, BaseEntry, BaseGoal, BaseParticipant, BaseParticipantRankData, BlogPost, BlogPostEntry, BlogPostResponse, BlogPostsParams, BlogPostsResponse, BlogsMetadata, Board, BoardReportsResponse, BoardsFilter, BoardsListResponse, BoardsMetadata, BoardsParams, CalculateMetricParams, CalculateMetricResponse, Campaign, ChangePasswordParams, ChangePasswordResponse, ChangeReferralCodeResponse, CheckRedeemResponse, Coin, Comment, CommentEntry, CommentsListResponse, CommentsMetadata, CommentsParams, ConfirmEmailResponse, CreateBlogPostParams, CreateBlogPostResponse, CreateCommentParams, CreateCommentResponse, CreateExternalOptions, CreateExternalResponse, CreateTeamParams, CreateTeamResponse, CreateVoteParams, CreatedBlogPost, CreatedComment, CurrentParticipantResponse, DateFilter, DocumentEntry, EntriesListParams, EntriesMetadata, EntriesParams, EntriesResponse, Entry, EntryAdmin, EntryData, EntryFile, EntryPrize, EntryTypes, ExecuteReportParams, ExecuteReportResponse, ExternalCouponData, ExternalCouponDataResponse, ExternalEntry, ExternalForm, ExternalFormField, ExternalFormFieldChoice, ExternalFormFieldsResponse, ExternalFormFilter, ExternalFormSubmissionResponse, ExternalFormSubmissionsParams, ExternalFormSubmissionsResponse, ExternalFormsListParams, ExternalFormsListResponse, ExternalFormsMetadata, ExtraPointsEntry, Field, FieldChoice, FieldType, Goal, GoalAcceptanceResponse, GoalAchievement, GoalCondition, GoalConditionProgress, GoalData, GoalFilter, GoalsListParams, GoalsListResponse, Invoice, InvoiceProduct, KnownEntryType, LoginCredentials, LoginFormResponse, LoginRequirementsResponse, LoginResponse, LogoutResponse, Metric, MetricFilter, MetricsListResponse, MetricsParams, MicrositesApiConfig, ModuleEntry, NotificationChannel, ParticipantBadge, ParticipantBadgesResponse, ParticipantFilter, ParticipantGoal, ParticipantGoalsParams, ParticipantGoalsResponse, ParticipantListParams, ParticipantListResponse, ParticipantRank, ParticipantRankResponse, ParticipantResponse, PhotoEntry, PreRegistrationEntry, Prize, PrizeDetails, PrizeMetadata, PrizeType, PrizesListResponse, PrizesMetadata, PrizesParams, PurchaseEntry, PushSubscriptionPayload, RedeemEntry, RedeemedPrize, Redemption, RemoveMemberResponse, RemovePushSubscriptionsResponse, Report, ResetPasswordParams, ResetPasswordResponse, SavePushSubscriptionResponse, SegmentRanking, SegmentRankingParams, SegmentRankingResponse, SendEmailVerificationTokenResponse, SendResetTokenParams, SendResetTokenResponse, SignupData, SignupFormResponse, SignupResponse, SsoLoginResponse, Team, TeamResponse, TeamsListResponse, TeamsParams, ToggleWishlistResponse, UnknownEntry, UpdateParticipantResponse, UpdateVoteParams, UploadDocumentParams, UploadDocumentResponse, UploadPhotoParams, UploadPhotoResponse, ValidateChannelResponse, ValidateEmailTokenResponse, VoteCategory, VoteResponse, VotesResponse, WishlistResponse };
|
|
1976
|
+
export type { AchievementType, AchievementsListResponse, AchievementsMetadata, AchievementsParams, ActivityParticipant, AdvancedRanking, AdvancedRankingParams, AdvancedRankingResponse, Badge, BadgeAchievement, BadgeConditions, BadgeResponse, BadgesListResponse, BadgesParams, BaseAchievement, BaseCurrentParticipant, BaseEntry, BaseGoal, BaseParticipant, BaseParticipantRankData, BlogPost, BlogPostEntry, BlogPostResponse, BlogPostsParams, BlogPostsResponse, BlogsMetadata, Board, BoardReportsResponse, BoardsFilter, BoardsListResponse, BoardsMetadata, BoardsParams, CalculateMetricParams, CalculateMetricResponse, Campaign, ChangePasswordParams, ChangePasswordResponse, ChangeReferralCodeResponse, CheckRedeemResponse, Coin, Comment, CommentEntry, CommentsListResponse, CommentsMetadata, CommentsParams, ConfirmEmailResponse, CreateBlogPostParams, CreateBlogPostResponse, CreateCommentParams, CreateCommentResponse, CreateExternalOptions, CreateExternalResponse, CreateTeamParams, CreateTeamResponse, CreateVoteParams, CreatedBlogPost, CreatedComment, CurrentParticipantResponse, DateFilter, DocumentEntry, EntriesListParams, EntriesMetadata, EntriesParams, EntriesResponse, Entry, EntryAdmin, EntryData, EntryFile, EntryPrize, EntryTypes, ExecuteReportParams, ExecuteReportResponse, ExternalCouponData, ExternalCouponDataResponse, ExternalEntry, ExternalForm, ExternalFormField, ExternalFormFieldChoice, ExternalFormFieldsResponse, ExternalFormFilter, ExternalFormSubmissionResponse, ExternalFormSubmissionsParams, ExternalFormSubmissionsResponse, ExternalFormsListParams, ExternalFormsListResponse, ExternalFormsMetadata, ExtraPointsEntry, Field, FieldChoice, FieldType, Goal, GoalAcceptanceResponse, GoalAchievement, GoalCondition, GoalConditionProgress, GoalData, GoalFilter, GoalsListParams, GoalsListResponse, Invoice, InvoiceProduct, KnownEntryType, LoginCredentials, LoginFormResponse, LoginRequirementsResponse, LoginResponse, LogoutResponse, Metric, MetricFilter, MetricsListResponse, MetricsParams, MicrositesApiConfig, ModuleEntry, NotificationChannel, ParticipantBadge, ParticipantBadgesResponse, ParticipantFilter, ParticipantGoal, ParticipantGoalsParams, ParticipantGoalsResponse, ParticipantListParams, ParticipantListResponse, ParticipantRank, ParticipantRankResponse, ParticipantResponse, PhotoEntry, PreRegistrationEntry, Prize, PrizeDetails, PrizeMetadata, PrizeType, PrizesListResponse, PrizesMetadata, PrizesParams, PurchaseEntry, PushSubscriptionPayload, RedeemEntry, RedeemFailure, RedeemedPrize, Redemption, RemoveMemberResponse, RemovePushSubscriptionsResponse, Report, ResetPasswordParams, ResetPasswordResponse, SavePushSubscriptionResponse, SegmentRanking, SegmentRankingParams, SegmentRankingResponse, SendEmailVerificationTokenResponse, SendResetTokenParams, SendResetTokenResponse, SignupData, SignupFormResponse, SignupResponse, SsoLoginResponse, Team, TeamResponse, TeamsListResponse, TeamsParams, ToggleWishlistResponse, UnknownEntry, UpdateParticipantResponse, UpdateVoteParams, UploadDocumentParams, UploadDocumentResponse, UploadPhotoParams, UploadPhotoResponse, ValidateChannelResponse, ValidateEmailTokenResponse, VoteCategory, VoteResponse, VotesResponse, WishlistResponse };
|