Skip to content

Commit

Permalink
feat(pmp-web): add single repository statistics
Browse files Browse the repository at this point in the history
single-repository-statistics-data.service.ts,
repository-statistics.component.ts
are not fully implemented because of missing data from API and
the desired model are not know.
  • Loading branch information
Arkadiusz Pałka authored and MaciejSikorski committed Jan 27, 2020
1 parent 116649c commit 7356a9e
Show file tree
Hide file tree
Showing 25 changed files with 442 additions and 17 deletions.
34 changes: 34 additions & 0 deletions angular.json
Original file line number Diff line number Diff line change
Expand Up @@ -1049,6 +1049,40 @@
"styleext": "scss"
}
}
},
"pmp-web-repository-data-access-single-repository-statistics": {
"projectType": "library",
"root": "libs/pmp-web/repository/data-access-single-repository-statistics",
"sourceRoot": "libs/pmp-web/repository/data-access-single-repository-statistics/src",
"prefix": "pimp-my-pr",
"architect": {
"lint": {
"builder": "@angular-devkit/build-angular:tslint",
"options": {
"tsConfig": [
"libs/pmp-web/repository/data-access-single-repository-statistics/tsconfig.lib.json",
"libs/pmp-web/repository/data-access-single-repository-statistics/tsconfig.spec.json"
],
"exclude": [
"**/node_modules/**",
"!libs/pmp-web/repository/data-access-single-repository-statistics/**"
]
}
},
"test": {
"builder": "@nrwl/jest:jest",
"options": {
"jestConfig": "libs/pmp-web/repository/data-access-single-repository-statistics/jest.config.js",
"tsConfig": "libs/pmp-web/repository/data-access-single-repository-statistics/tsconfig.spec.json",
"setupFile": "libs/pmp-web/repository/data-access-single-repository-statistics/src/test-setup.ts"
}
}
},
"schematics": {
"@nrwl/angular:component": {
"styleext": "scss"
}
}
}
},
"cli": {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
# pmp-web-repository-data-access-single-repository-statistics

This library was generated with [Nx](https://nx.dev).

## Running unit tests

Run `nx test pmp-web-repository-data-access-single-repository-statistics` to execute the unit tests.
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
module.exports = {
name: 'pmp-web-repository-data-access-single-repository-statistics',
preset: '../../../../jest.config.js',
coverageDirectory:
'../../../../coverage/libs/pmp-web/repository/data-access-single-repository-statistics',
snapshotSerializers: [
'jest-preset-angular/AngularSnapshotSerializer.js',
'jest-preset-angular/HTMLCommentSerializer.js'
]
};
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
export * from './lib/+state/single-repository-statistics.facade';
export * from './lib/+state/single-repository-statistics.reducer';
export * from './lib/+state/single-repository-statistics.selectors';
export * from './lib/pmp-web-repository-data-access-single-repository-statistics.module';
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
import { Action } from '@ngrx/store';
import { HttpErrorResponse } from '@angular/common/http';
import { GetRepositoryStatisticsRequestPayload } from '../resources/request-payloads/get-repository-statistics.request-payload';
import { RepositoryModel } from '@pimp-my-pr/shared/domain';

export namespace fromSingleRepositoryStatisticsActions {
export enum Types {
GetRepositoryStatistics = '[SingleRepositoryStatistics] Get Repository Statistics',
GetRepositoryStatisticsFail = '[SingleRepositoryStatistics] Get Repository Statistics Fail',
GetRepositoryStatisticsSuccess = '[SingleRepositoryStatistics] Get Repository Statistics Success'
}

export class GetRepositoryStatistics implements Action {
readonly type = Types.GetRepositoryStatistics;

constructor(public payload: GetRepositoryStatisticsRequestPayload) {}
}

export class GetRepositoryStatisticsFail implements Action {
readonly type = Types.GetRepositoryStatisticsFail;

constructor(public payload: HttpErrorResponse) {}
}

export class GetRepositoryStatisticsSuccess implements Action {
readonly type = Types.GetRepositoryStatisticsSuccess;

constructor(public payload: RepositoryModel) {}
}

export type CollectiveType =
| GetRepositoryStatistics
| GetRepositoryStatisticsFail
| GetRepositoryStatisticsSuccess;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
import { Injectable } from '@angular/core';
import { Effect } from '@ngrx/effects';
import { fromSingleRepositoryStatisticsActions } from './single-repository-statistics.actions';
import { SingleRepositoryStatisticsPartialState } from './single-repository-statistics.reducer';
import { SingleRepositoryStatisticsDataService } from '../services/single-repository-statistics-data.service';
import { HttpErrorResponse } from '@angular/common/http';
import { map } from 'rxjs/operators';
import { DataPersistence } from '@nrwl/angular';

@Injectable()
export class SingleRepositoryStatisticsEffects {
@Effect()
getRepositoryStatistics$ = this.dp.fetch(
fromSingleRepositoryStatisticsActions.Types.GetRepositoryStatistics,
{
id: () => {},
run: (action: fromSingleRepositoryStatisticsActions.GetRepositoryStatistics) => {
return this.singleRepositoryStatisticsDataService
.getRepositoryStatistics(action.payload)
.pipe(
map(
data => new fromSingleRepositoryStatisticsActions.GetRepositoryStatisticsSuccess(data)
)
);
},
onError: (
action: fromSingleRepositoryStatisticsActions.GetRepositoryStatistics,
error: HttpErrorResponse
) => {
return new fromSingleRepositoryStatisticsActions.GetRepositoryStatisticsFail(error);
}
}
);

constructor(
private dp: DataPersistence<SingleRepositoryStatisticsPartialState>,
private singleRepositoryStatisticsDataService: SingleRepositoryStatisticsDataService
) {}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
import { Injectable } from '@angular/core';
import { select, Store } from '@ngrx/store';
import { SingleRepositoryStatisticsPartialState } from './single-repository-statistics.reducer';
import { singleRepositoryStatisticsQuery } from './single-repository-statistics.selectors';
import { fromSingleRepositoryStatisticsActions } from './single-repository-statistics.actions';
import { GetRepositoryStatisticsRequestPayload } from '../resources/request-payloads/get-repository-statistics.request-payload';

@Injectable()
export class SingleRepositoryStatisticsFacade {
repositoryStatistics$ = this.store.pipe(
select(singleRepositoryStatisticsQuery.getRepositoryStatistics)
);
repositoryStatisticsLoading$ = this.store.pipe(
select(singleRepositoryStatisticsQuery.getRepositoryStatisticsLoading)
);
repositoryStatisticsLoadError$ = this.store.pipe(
select(singleRepositoryStatisticsQuery.getRepositoryStatisticsLoadError)
);
constructor(private store: Store<SingleRepositoryStatisticsPartialState>) {}

getRepositoryStatistics(data: GetRepositoryStatisticsRequestPayload): void {
this.store.dispatch(new fromSingleRepositoryStatisticsActions.GetRepositoryStatistics(data));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
import { fromSingleRepositoryStatisticsActions } from './single-repository-statistics.actions';
import { HttpErrorResponse } from '@angular/common/http';
import { RepositoryModel } from '@pimp-my-pr/shared/domain';

export const SINGLEREPOSITORYSTATISTICS_FEATURE_KEY = 'singleRepositoryStatistics';

export interface SingleRepositoryStatisticsState {
repositoryStatistics: RepositoryModel | null;
repositoryStatisticsLoading: boolean;
repositoryStatisticsLoadError: HttpErrorResponse | null;
}

export interface SingleRepositoryStatisticsPartialState {
readonly [SINGLEREPOSITORYSTATISTICS_FEATURE_KEY]: SingleRepositoryStatisticsState;
}

export const initialState: SingleRepositoryStatisticsState = {
repositoryStatistics: null,
repositoryStatisticsLoading: false,
repositoryStatisticsLoadError: null
};

export function singleRepositoryStatisticsReducer(
state: SingleRepositoryStatisticsState = initialState,
action: fromSingleRepositoryStatisticsActions.CollectiveType
): SingleRepositoryStatisticsState {
switch (action.type) {
case fromSingleRepositoryStatisticsActions.Types.GetRepositoryStatistics: {
state = {
...state,
repositoryStatistics: null,
repositoryStatisticsLoading: true,
repositoryStatisticsLoadError: null
};
break;
}

case fromSingleRepositoryStatisticsActions.Types.GetRepositoryStatisticsFail: {
state = {
...state,
repositoryStatistics: null,
repositoryStatisticsLoading: false,
repositoryStatisticsLoadError: action.payload
};
break;
}

case fromSingleRepositoryStatisticsActions.Types.GetRepositoryStatisticsSuccess: {
state = {
...state,
repositoryStatistics: action.payload,
repositoryStatisticsLoading: false,
repositoryStatisticsLoadError: null
};
break;
}
}

return state;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
import { createFeatureSelector, createSelector } from '@ngrx/store';
import {
SINGLEREPOSITORYSTATISTICS_FEATURE_KEY,
SingleRepositoryStatisticsState
} from './single-repository-statistics.reducer';

// Lookup the 'SingleRepositoryStatistics' feature state managed by NgRx
const getSingleRepositoryStatisticsState = createFeatureSelector<SingleRepositoryStatisticsState>(
SINGLEREPOSITORYSTATISTICS_FEATURE_KEY
);

const getRepositoryStatistics = createSelector(
getSingleRepositoryStatisticsState,
state => state.repositoryStatistics
);

const getRepositoryStatisticsLoading = createSelector(
getSingleRepositoryStatisticsState,
state => state.repositoryStatisticsLoading
);

const getRepositoryStatisticsLoadError = createSelector(
getSingleRepositoryStatisticsState,
state => state.repositoryStatisticsLoadError
);

export const singleRepositoryStatisticsQuery = {
getRepositoryStatistics,
getRepositoryStatisticsLoading,
getRepositoryStatisticsLoadError
};
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { StoreModule } from '@ngrx/store';
import { EffectsModule } from '@ngrx/effects';
import {
SINGLEREPOSITORYSTATISTICS_FEATURE_KEY,
initialState as singleRepositoryStatisticsInitialState,
singleRepositoryStatisticsReducer
} from './+state/single-repository-statistics.reducer';
import { SingleRepositoryStatisticsEffects } from './+state/single-repository-statistics.effects';
import { SingleRepositoryStatisticsFacade } from './+state/single-repository-statistics.facade';
import { SingleRepositoryStatisticsDataService } from './services/single-repository-statistics-data.service';

@NgModule({
imports: [
CommonModule,
StoreModule.forFeature(
SINGLEREPOSITORYSTATISTICS_FEATURE_KEY,
singleRepositoryStatisticsReducer,
{ initialState: singleRepositoryStatisticsInitialState }
),
EffectsModule.forFeature([SingleRepositoryStatisticsEffects])
],
providers: [SingleRepositoryStatisticsFacade, SingleRepositoryStatisticsDataService]
})
export class PmpWebRepositoryDataAccessSingleRepositoryStatisticsModule {}
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
export interface GetRepositoryStatisticsRequestPayload {
id: string | number;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
import { Injectable } from '@angular/core';
import { Observable } from 'rxjs';
import { HttpClient } from '@angular/common/http';
import { GetRepositoryStatisticsRequestPayload } from '../resources/request-payloads/get-repository-statistics.request-payload';
import { RepositoryModel } from '@pimp-my-pr/shared/domain';

@Injectable()
export class SingleRepositoryStatisticsDataService {
readonly endpoints = {
// TODO missing API url to get details about repository
getRepositoryStatistics: ''
};
constructor(private http: HttpClient) {}

getRepositoryStatistics(
payload: GetRepositoryStatisticsRequestPayload
): Observable<RepositoryModel> {
return this.http.get<any>(this.endpoints.getRepositoryStatistics);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
import 'jest-preset-angular';
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
{
"extends": "../../../../tsconfig.json",
"compilerOptions": {
"types": ["node", "jest"]
},
"include": ["**/*.ts"]
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
{
"extends": "./tsconfig.json",
"compilerOptions": {
"outDir": "../../../../dist/out-tsc",
"target": "es2015",
"declaration": true,
"inlineSources": true,
"types": [],
"lib": ["dom", "es2018"]
},
"angularCompilerOptions": {
"annotateForClosureCompiler": true,
"skipTemplateCodegen": true,
"strictMetadataEmit": true,
"fullTemplateTypeCheck": true,
"strictInjectionParameters": true,
"enableResourceInlining": true
},
"exclude": ["src/test-setup.ts", "**/*.spec.ts"]
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
{
"extends": "./tsconfig.json",
"compilerOptions": {
"outDir": "../../../../dist/out-tsc",
"module": "commonjs",
"types": ["jest", "node"]
},
"files": ["src/test-setup.ts"],
"include": ["**/*.spec.ts", "**/*.d.ts"]
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
{
"extends": "../../../../tslint.json",
"rules": {
"directive-selector": [true, "attribute", "pimpMyPr", "camelCase"],
"component-selector": [true, "element", "pimp-my-pr", "kebab-case"]
}
}
Original file line number Diff line number Diff line change
@@ -1,9 +1,19 @@
import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { RepositoryStatisticsComponent } from './repository-statistics/repository-statistics.component';
import { PmpWebSharedUiTableStatisticModule } from '@pimp-my-pr/pmp-web/shared/ui-table-statistic';
import { PmpWebSharedUiHeaderContainerModule } from '@pimp-my-pr/pmp-web/shared/ui-header-container';
import { PmpWebRepositoryRepositoryStatisticsRoutingModule } from './pmp-web-repository-repository-statistics-routing.module';
import { PmpWebRepositoryDataAccessSingleRepositoryStatisticsModule } from '@pimp-my-pr/pmp-web/repository/data-access-single-repository-statistics';

@NgModule({
imports: [CommonModule],
imports: [
CommonModule,
PmpWebSharedUiHeaderContainerModule,
PmpWebSharedUiTableStatisticModule,
PmpWebRepositoryRepositoryStatisticsRoutingModule,
PmpWebRepositoryDataAccessSingleRepositoryStatisticsModule
],
declarations: [RepositoryStatisticsComponent]
})
export class PmpWebRepositoryRepositoryStatisticsFeatureModule {}
Loading

0 comments on commit 7356a9e

Please sign in to comment.