feat(challenge7): reorganisation

This commit is contained in:
thomas
2022-11-23 09:51:59 +01:00
parent cc1c6e8b26
commit ca86f5558b
29 changed files with 355 additions and 32 deletions

View File

@@ -1,31 +1,27 @@
import { Injectable } from '@angular/core';
import { filter } from 'rxjs';
import { PushService } from '../backend/push.service';
import { Push } from '../model/push.model';
import { isStudent } from '../model/student.model';
import { isTeacher } from '../model/teacher.model';
import {
isStudent,
isTeacher,
Push,
} from '@angular-challenges/ngrx-notification/model';
import { inject, Injectable } from '@angular/core';
import { PUSH_ACTION } from './notification.token';
import { StudentStore } from './student.store';
import { TeacherStore } from './teacher.store';
@Injectable({ providedIn: 'root' })
export class NotificationService {
constructor(
private pushService: PushService,
private teacherStore: TeacherStore,
private studentStore: StudentStore
) {}
private notification$ = inject(PUSH_ACTION);
private teacherStore = inject(TeacherStore);
private studentStore = inject(StudentStore);
init() {
this.pushService.notification$
.pipe(filter(Boolean))
.subscribe((notification: Push) => {
console.log(notification);
if (isTeacher(notification)) {
this.teacherStore.addOne(notification);
}
if (isStudent(notification)) {
this.studentStore.addOne(notification);
}
});
this.notification$.subscribe((notification: Push) => {
if (isTeacher(notification)) {
this.teacherStore.addOne(notification);
}
if (isStudent(notification)) {
this.studentStore.addOne(notification);
}
});
}
}

View File

@@ -0,0 +1,12 @@
import { PushService } from '@angular-challenges/ngrx-notification/backend';
import { Push } from '@angular-challenges/ngrx-notification/model';
import { inject, InjectionToken } from '@angular/core';
import { filter, Observable, share } from 'rxjs';
export const PUSH_ACTION = new InjectionToken<Observable<Push>>(
'Push messaging action stream',
{
factory: () =>
inject(PushService).notification$.pipe(filter(Boolean), share()),
}
);

View File

@@ -1,6 +1,6 @@
import { Student } from '@angular-challenges/ngrx-notification/model';
import { Injectable } from '@angular/core';
import { BehaviorSubject } from 'rxjs';
import { Student } from '../model/student.model';
@Injectable({
providedIn: 'root',

View File

@@ -1,6 +1,6 @@
import { Teacher } from '@angular-challenges/ngrx-notification/model';
import { Injectable } from '@angular/core';
import { BehaviorSubject } from 'rxjs';
import { Teacher } from '../model/teacher.model';
@Injectable({
providedIn: 'root',

View File

@@ -1,8 +1,8 @@
import { APP_INITIALIZER, enableProdMode, inject } from '@angular/core';
import { bootstrapApplication } from '@angular/platform-browser';
import { of } from 'rxjs';
import { PushService } from '../../../libs/ngrx-notification/backend/src/lib/push.service';
import { AppComponent } from './app/app.component';
import { PushService } from './app/backend/push.service';
import { NotificationService } from './app/data-access/notification.service';
import { environment } from './environments/environment';

View File

@@ -1,7 +1,10 @@
{
"extends": "./tsconfig.json",
"include": ["**/*.ts"],
"include": [
"**/*.ts",
"../../libs/ngrx-notification/backend/src/lib/push.service.ts"
],
"compilerOptions": {
"types": []
}
}
}

View File

@@ -0,0 +1,36 @@
{
"extends": ["../../../.eslintrc.json"],
"ignorePatterns": ["!**/*"],
"overrides": [
{
"files": ["*.ts"],
"extends": [
"plugin:@nrwl/nx/angular",
"plugin:@angular-eslint/template/process-inline-templates"
],
"rules": {
"@angular-eslint/directive-selector": [
"error",
{
"type": "attribute",
"prefix": "angularChallenges",
"style": "camelCase"
}
],
"@angular-eslint/component-selector": [
"error",
{
"type": "element",
"prefix": "angular-challenges",
"style": "kebab-case"
}
]
}
},
{
"files": ["*.html"],
"extends": ["plugin:@nrwl/nx/angular-template"],
"rules": {}
}
]
}

View File

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

View File

@@ -0,0 +1,22 @@
/* eslint-disable */
export default {
displayName: 'ngrx-notification-backend',
preset: '../../../jest.preset.js',
setupFilesAfterEnv: ['<rootDir>/src/test-setup.ts'],
globals: {
'ts-jest': {
tsconfig: '<rootDir>/tsconfig.spec.json',
stringifyContentPathRegex: '\\.(html|svg)$',
},
},
coverageDirectory: '../../../coverage/libs/ngrx-notification/backend',
transform: {
'^.+\\.(ts|mjs|js|html)$': 'jest-preset-angular',
},
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,27 @@
{
"name": "ngrx-notification-backend",
"$schema": "../../../node_modules/nx/schemas/project-schema.json",
"projectType": "library",
"sourceRoot": "libs/ngrx-notification/backend/src",
"prefix": "angular-challenges",
"targets": {
"test": {
"executor": "@nrwl/jest:jest",
"outputs": ["{workspaceRoot}/coverage/{projectRoot}"],
"options": {
"jestConfig": "libs/ngrx-notification/backend/jest.config.ts",
"passWithNoTests": true
}
},
"lint": {
"executor": "@nrwl/linter:eslint",
"options": {
"lintFilePatterns": [
"libs/ngrx-notification/backend/**/*.ts",
"libs/ngrx-notification/backend/**/*.html"
]
}
}
},
"tags": []
}

View File

@@ -0,0 +1 @@
export * from './lib/push.service';

View File

@@ -1,11 +1,16 @@
import {
Push,
randStudent,
randTeacher,
} from '@angular-challenges/ngrx-notification/model';
import { Injectable } from '@angular/core';
import { BehaviorSubject, tap, timer } from 'rxjs';
import { randStudent } from '../model/student.model';
import { randTeacher } from '../model/teacher.model';
@Injectable({ providedIn: 'root' })
export class PushService {
private notificationSubject = new BehaviorSubject<any>(undefined);
private notificationSubject = new BehaviorSubject<Push | undefined>(
undefined
);
notification$ = this.notificationSubject.asObservable();
init() {

View File

@@ -0,0 +1 @@
import 'jest-preset-angular/setup-jest';

View File

@@ -0,0 +1,28 @@
{
"extends": "../../../tsconfig.base.json",
"files": [],
"include": [],
"references": [
{
"path": "./tsconfig.lib.json"
},
{
"path": "./tsconfig.spec.json"
}
],
"compilerOptions": {
"target": "es2020",
"forceConsistentCasingInFileNames": true,
"strict": true,
"noImplicitOverride": true,
"noPropertyAccessFromIndexSignature": true,
"noImplicitReturns": true,
"noFallthroughCasesInSwitch": true
},
"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/test-setup.ts",
"**/*.spec.ts",
"jest.config.ts",
"**/*.test.ts"
],
"include": ["**/*.ts"]
}

View File

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

View File

@@ -0,0 +1,36 @@
{
"extends": ["../../../.eslintrc.json"],
"ignorePatterns": ["!**/*"],
"overrides": [
{
"files": ["*.ts"],
"extends": [
"plugin:@nrwl/nx/angular",
"plugin:@angular-eslint/template/process-inline-templates"
],
"rules": {
"@angular-eslint/directive-selector": [
"error",
{
"type": "attribute",
"prefix": "angularChallenges",
"style": "camelCase"
}
],
"@angular-eslint/component-selector": [
"error",
{
"type": "element",
"prefix": "angular-challenges",
"style": "kebab-case"
}
]
}
},
{
"files": ["*.html"],
"extends": ["plugin:@nrwl/nx/angular-template"],
"rules": {}
}
]
}

View File

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

View File

@@ -0,0 +1,22 @@
/* eslint-disable */
export default {
displayName: 'ngrx-notification-model',
preset: '../../../jest.preset.js',
setupFilesAfterEnv: ['<rootDir>/src/test-setup.ts'],
globals: {
'ts-jest': {
tsconfig: '<rootDir>/tsconfig.spec.json',
stringifyContentPathRegex: '\\.(html|svg)$',
},
},
coverageDirectory: '../../../coverage/libs/ngrx-notification/model',
transform: {
'^.+\\.(ts|mjs|js|html)$': 'jest-preset-angular',
},
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,27 @@
{
"name": "ngrx-notification-model",
"$schema": "../../../node_modules/nx/schemas/project-schema.json",
"projectType": "library",
"sourceRoot": "libs/ngrx-notification/model/src",
"prefix": "angular-challenges",
"targets": {
"test": {
"executor": "@nrwl/jest:jest",
"outputs": ["{workspaceRoot}/coverage/{projectRoot}"],
"options": {
"jestConfig": "libs/ngrx-notification/model/jest.config.ts",
"passWithNoTests": true
}
},
"lint": {
"executor": "@nrwl/linter:eslint",
"options": {
"lintFilePatterns": [
"libs/ngrx-notification/model/**/*.ts",
"libs/ngrx-notification/model/**/*.html"
]
}
}
},
"tags": []
}

View File

@@ -0,0 +1,3 @@
export * from './lib/push.model';
export * from './lib/student.model';
export * from './lib/teacher.model';

View File

@@ -24,7 +24,7 @@ export interface Teacher extends Push {
const factoryTeacher = incrementalNumber();
export const randTeacher = () => ({
export const randTeacher = (): Teacher => ({
id: factoryTeacher(),
firstname: randFirstName(),
lastname: randLastName(),

View File

@@ -0,0 +1 @@
import 'jest-preset-angular/setup-jest';

View File

@@ -0,0 +1,28 @@
{
"extends": "../../../tsconfig.base.json",
"files": [],
"include": [],
"references": [
{
"path": "./tsconfig.lib.json"
},
{
"path": "./tsconfig.spec.json"
}
],
"compilerOptions": {
"target": "es2020",
"forceConsistentCasingInFileNames": true,
"strict": true,
"noImplicitOverride": true,
"noPropertyAccessFromIndexSignature": true,
"noImplicitReturns": true,
"noFallthroughCasesInSwitch": true
},
"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/test-setup.ts",
"**/*.spec.ts",
"jest.config.ts",
"**/*.test.ts"
],
"include": ["**/*.ts"]
}

View File

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

View File

@@ -14,7 +14,14 @@
"skipLibCheck": true,
"skipDefaultLibCheck": true,
"baseUrl": ".",
"paths": {}
"paths": {
"@angular-challenges/ngrx-notification/backend": [
"libs/ngrx-notification/backend/src/index.ts"
],
"@angular-challenges/ngrx-notification/model": [
"libs/ngrx-notification/model/src/index.ts"
]
}
},
"exclude": ["node_modules", "tmp"]
}