Utils Lib angelegt, safeParse Funktion ausgelagert und eingebunden in return service

This commit is contained in:
Nino
2025-03-07 16:31:47 +01:00
parent 944fb8a186
commit 4a3c934fe0
12 changed files with 172 additions and 10 deletions

View File

@@ -1,17 +1,18 @@
import { inject, Injectable } from "@angular/core";
import { QuerySettingsDTO, ReceiptService } from "@generated/swagger/oms-api";
import { map, Observable, throwError } from "rxjs";
import { inject, Injectable } from '@angular/core';
import { QuerySettingsDTO, ReceiptService } from '@generated/swagger/oms-api';
import { map, Observable, throwError } from 'rxjs';
import {
QueryTokenSchema,
QueryTokenInput,
} from "./schemas/query-token.schema";
} from './schemas/query-token.schema';
import {
ListResponseArgs,
ListResponseArgsSchema,
ReceiptListItemSchema,
} from "./schemas/receipt-list-item.schema";
} from './schemas/receipt-list-item.schema';
import { safeParse } from '@isa/utils/z-safe-parse';
@Injectable({ providedIn: "root" })
@Injectable({ providedIn: 'root' })
export class ReturnSearchService {
#receiptService = inject(ReceiptService);
@@ -19,7 +20,7 @@ export class ReturnSearchService {
return this.#receiptService.ReceiptQueryReceiptSettings().pipe(
map((res) => {
if (res.error || !res.result) {
throw new Error("Failed to fetch query settings");
throw new Error('Failed to fetch query settings');
}
return res.result;
}),
@@ -40,16 +41,16 @@ export class ReturnSearchService {
.pipe(
map((res) => {
if (res.error || !res.result) {
throw new Error("Failed to fetch receipt list items");
throw new Error('Failed to fetch receipt list items');
}
return ListResponseArgsSchema.parse({
return safeParse(ListResponseArgsSchema, {
hits: res.hits,
skip: res.skip,
take: res.take,
error: res.error,
invalidProperties: res.invalidProperties,
result: res.result.map((res) => ReceiptListItemSchema.parse(res)),
result: safeParse(ReceiptListItemSchema, res.result),
});
}),
);

View File

@@ -0,0 +1,7 @@
# utils-z-safe-parse
This library was generated with [Nx](https://nx.dev).
## Running unit tests
Run `nx test utils-z-safe-parse` to execute the unit tests.

View File

@@ -0,0 +1,34 @@
import nx from '@nx/eslint-plugin';
import baseConfig from '../../../eslint.config.mjs';
export default [
...baseConfig,
...nx.configs['flat/angular'],
...nx.configs['flat/angular-template'],
{
files: ['**/*.ts'],
rules: {
'@angular-eslint/directive-selector': [
'error',
{
type: 'attribute',
prefix: 'util',
style: 'camelCase',
},
],
'@angular-eslint/component-selector': [
'error',
{
type: 'element',
prefix: 'util',
style: 'kebab-case',
},
],
},
},
{
files: ['**/*.html'],
// Override or add rules here
rules: {},
},
];

View File

@@ -0,0 +1,21 @@
export default {
displayName: 'utils-z-safe-parse',
preset: '../../../jest.preset.js',
setupFilesAfterEnv: ['<rootDir>/src/test-setup.ts'],
coverageDirectory: '../../../coverage/libs/utils/z-safe-parse',
transform: {
'^.+\\.(ts|mjs|js|html)$': [
'jest-preset-angular',
{
tsconfig: '<rootDir>/tsconfig.spec.json',
stringifyContentPathRegex: '\\.(html|svg)$',
},
],
},
transformIgnorePatterns: ['node_modules/(?!.*\\.mjs$)'],
snapshotSerializers: [
'jest-preset-angular/build/serializers/no-ng-attributes',
'jest-preset-angular/build/serializers/ng-snapshot',
'jest-preset-angular/build/serializers/html-comment',
],
};

View File

@@ -0,0 +1,20 @@
{
"name": "utils-z-safe-parse",
"$schema": "../../../node_modules/nx/schemas/project-schema.json",
"sourceRoot": "libs/utils/z-safe-parse/src",
"prefix": "util",
"projectType": "library",
"tags": [],
"targets": {
"test": {
"executor": "@nx/jest:jest",
"outputs": ["{workspaceRoot}/coverage/{projectRoot}"],
"options": {
"jestConfig": "libs/utils/z-safe-parse/jest.config.ts"
}
},
"lint": {
"executor": "@nx/eslint:lint"
}
}
}

View File

@@ -0,0 +1 @@
export * from './lib/utils-z-safe-parse/utils-z-safe-parse';

View File

@@ -0,0 +1,10 @@
import { z } from 'zod';
export function safeParse<T>(schema: z.ZodSchema<T>, data: unknown): T {
const parsed = schema.safeParse(data);
if (!parsed.success) {
console.warn('Failed to parse data', parsed.error);
return data as T;
}
return parsed.data;
}

View File

@@ -0,0 +1,6 @@
import { setupZoneTestEnv } from 'jest-preset-angular/setup-env/zone';
setupZoneTestEnv({
errorOnUnknownElements: true,
errorOnUnknownProperties: true,
});

View File

@@ -0,0 +1,28 @@
{
"compilerOptions": {
"target": "es2022",
"forceConsistentCasingInFileNames": true,
"strict": true,
"noImplicitOverride": true,
"noPropertyAccessFromIndexSignature": true,
"noImplicitReturns": true,
"noFallthroughCasesInSwitch": true
},
"files": [],
"include": [],
"references": [
{
"path": "./tsconfig.lib.json"
},
{
"path": "./tsconfig.spec.json"
}
],
"extends": "../../../tsconfig.base.json",
"angularCompilerOptions": {
"enableI18nLegacyMessageIdFormat": false,
"strictInjectionParameters": true,
"strictInputAccessModifiers": true,
"strictTemplates": true
}
}

View File

@@ -0,0 +1,17 @@
{
"extends": "./tsconfig.json",
"compilerOptions": {
"outDir": "../../../dist/out-tsc",
"declaration": true,
"declarationMap": true,
"inlineSources": true,
"types": []
},
"exclude": [
"src/**/*.spec.ts",
"src/test-setup.ts",
"jest.config.ts",
"src/**/*.test.ts"
],
"include": ["src/**/*.ts"]
}

View File

@@ -0,0 +1,16 @@
{
"extends": "./tsconfig.json",
"compilerOptions": {
"outDir": "../../../dist/out-tsc",
"module": "commonjs",
"target": "es2016",
"types": ["jest", "node"]
},
"files": ["src/test-setup.ts"],
"include": [
"jest.config.ts",
"src/**/*.test.ts",
"src/**/*.spec.ts",
"src/**/*.d.ts"
]
}

View File

@@ -54,6 +54,7 @@
"@isa/ui/input-controls": ["libs/ui/input-controls/src/index.ts"],
"@isa/ui/item-rows": ["libs/ui/item-rows/src/index.ts"],
"@isa/ui/search-bar": ["libs/ui/search-bar/src/index.ts"],
"@isa/utils/z-safe-parse": ["libs/utils/z-safe-parse/src/index.ts"],
"@modal/*": ["apps/isa-app/src/modal/*/index.ts"],
"@page/*": ["apps/isa-app/src/page/*/index.ts"],
"@shared/*": ["apps/isa-app/src/shared/*/index.ts"],