Skip to content

Commit

Permalink
feat(web): add redirecting to repository page after adding
Browse files Browse the repository at this point in the history
-add new query for getting repository by userId and repo data
-add response to add new repository endpoint
-add payload to AddRepositorySuccessAction with repository data
-add redirection after repository added
-update e2e tests for /repository POST

resolve valueadd-poland#239
  • Loading branch information
maciejBart99 authored and MaciejSikorski committed Sep 8, 2020
1 parent a08b5cd commit 19a504a
Show file tree
Hide file tree
Showing 22 changed files with 289 additions and 37 deletions.
10 changes: 8 additions & 2 deletions apps/pmp-api-e2e/integration/repository.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -69,12 +69,18 @@ describe('Repository', () => {
});
});

test('valid request', () => {
test('valid request', done => {
return request(app.getHttpServer())
.post('/repository')
.set('Authorization', `Bearer ${token}`)
.send({ repositoryUrl: 'https://github.com/valueadd-poland/pimp-my-pr' })
.expect(201, { error: null });
.expect(201)
.then(response => {
expect(response.body).toHaveProperty('data');
expect(response.body).toHaveProperty('data.id');
expect(response.body.error).toBe(null);
done();
});
});
});

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import {
EditRepositoryPayload,
Repository
} from '@pimp-my-pr/pmp-web/repository/domain';
import { AddRepositorySuccessPayload } from '@pimp-my-pr/pmp-web/repository/domain';

export namespace fromRepositoryActions {
export enum Types {
Expand Down Expand Up @@ -53,6 +54,8 @@ export namespace fromRepositoryActions {

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

constructor(public payload: AddRepositorySuccessPayload) {}
}

export class DeleteRepository implements Action {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ export class RepositoryEffects {
run: (action: fromRepositoryActions.AddRepository) => {
return this.repositoryDataService
.addRepository(action.payload)
.pipe(map(() => new fromRepositoryActions.AddRepositorySuccess()));
.pipe(map(resp => new fromRepositoryActions.AddRepositorySuccess({ repository: resp })));
},
onError: (action: fromRepositoryActions.AddRepository, error: HttpErrorResponse) => {
return new fromRepositoryActions.AddRepositoryFail(error);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import { RepositoryPartialState } from './repository.reducer';
import { repositoryQuery } from './repository.selectors';
import { ActionStatusResolverService } from '@pimp-my-pr/pmp-web/shared/util-ngrx';
import { Observable } from 'rxjs';
import { AddRepositorySuccessPayload } from '@pimp-my-pr/pmp-web/repository/domain';

@Injectable()
export class RepositoryFacade {
Expand All @@ -26,8 +27,8 @@ export class RepositoryFacade {
this.store.dispatch(new fromRepositoryActions.GetRepositoryCollection());
}

addRepository(data: AddRepositoryPayload): Observable<void> {
return this.actionStatusResolverService.resolve(
addRepository(data: AddRepositoryPayload): Observable<AddRepositorySuccessPayload> {
return this.actionStatusResolverService.resolve<AddRepositorySuccessPayload>(
new fromRepositoryActions.AddRepository(data),
fromRepositoryActions.Types.AddRepositorySuccess,
fromRepositoryActions.Types.AddRepositoryFail
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,8 +28,10 @@ export class RepositoryDataService {
.pipe(map(res => res.data));
}

addRepository(data: AddRepositoryPayload): Observable<void> {
return this.http.post<void>(this.endpoints.addRepository.url(), data);
addRepository(data: AddRepositoryPayload): Observable<Repository> {
return this.http
.post<IResponse<Repository>>(this.endpoints.addRepository.url(), data)
.pipe(map(resp => resp.data));
}

deleteRepository(data: DeleteRepositoryPayload): Observable<void> {
Expand Down
7 changes: 4 additions & 3 deletions libs/pmp-web/repository/domain/src/index.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
export * from './lib/interfaces/repository.model';
export * from './lib/interfaces/add-edit-repository-dialog-data.interface';
export * from './lib/payloads/get-repository-collection.payload';
export * from './lib/payloads/get-repository-statistics.payload';
export * from './lib/payloads/get-reviewers-statistics-collection.payload';
export * from './lib/payloads/add-repository.payload';
export * from './lib/payloads/add-repository-success.payload';
export * from './lib/payloads/delete-repository.payload';
export * from './lib/payloads/edit-repository.payload';
export * from './lib/payloads/get-repository-collection.payload';
export * from './lib/payloads/get-repository-statistics.payload';
export * from './lib/payloads/get-reviewers-statistics-collection.payload';
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
import { Repository } from '../interfaces/repository.model';

export interface AddRepositorySuccessPayload {
repository: Repository;
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import { TimeUnit } from '@pimp-my-pr/shared/domain';
import { AddEditRepositoryDialogData, Repository } from '@pimp-my-pr/pmp-web/repository/domain';
import { SnackbarService } from '@pimp-my-pr/pmp-web/shared/domain';
import { AddEditRepositoryDialogService } from './add-edit-repository-dialog.service';
import { Router } from '@angular/router';

@UntilDestroy()
@Component({
Expand All @@ -31,6 +32,7 @@ export class AddEditRepositoryDialogComponent implements OnInit, OnDestroy {
private fb: FormBuilder,
private dialogRef: MatDialogRef<AddEditRepositoryDialogComponent>,
private snackbarService: SnackbarService,
private router: Router,
private addEditRepositoryDialogService: AddEditRepositoryDialogService
) {
if (!!data) {
Expand Down Expand Up @@ -106,8 +108,9 @@ export class AddEditRepositoryDialogComponent implements OnInit, OnDestroy {
maxWaitingTime
})
.subscribe(
() => {
payload => {
this.snackbarService.open('Repository has been added');
this.router.navigate(['repositories', payload.repository.id]);
this.dialogRef.close();
},
error => {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,8 @@ import {
DeleteRepositoryCommand,
EditRepositoryCommand,
RepositoryFacade,
ListRepositoriesReadModel
ListRepositoriesReadModel,
SingleRepositoryDataReadModel
} from '@pimp-my-pr/server/repository/core/application-services';
import { extractFullName } from '@pimp-my-pr/server/shared/util-repository';
import { AddRepositoryDto } from '../dtos/add-repository.dto';
Expand All @@ -37,7 +38,7 @@ export class RepositoryController {
@Body() addRepositoryDto: AddRepositoryDto,
@Credentials() credentials: RequestCredentials,
@CurrentUserId() userId: string
): Promise<void> {
): Promise<SingleRepositoryDataReadModel> {
return this.repositoryFacade.addRepository(
new AddRepositoryCommand(
extractFullName(addRepositoryDto.repositoryUrl),
Expand Down
2 changes: 2 additions & 0 deletions libs/server/repository/core/application-services/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,3 +10,5 @@ export * from './lib/commands/add-repository/add-repository.command';
export * from './lib/commands/delete-repository/delete-repository.command';
export * from './lib/queries/list-repositories/list-repositories.read-model';
export * from './lib/commands/edit-repository/edit-repository.command';
export * from './lib/queries/get-single-repository-data/get-single-repository-data.handler';
export * from './lib/queries/get-single-repository-data/single-repository-data.read-model';
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
import { QueryHandler, IQueryHandler } from '@nestjs/cqrs';
import { GetSingleRepositoryDataQuery } from './get-single-repository-data.query';
import { RepositoryRepository } from '@pimp-my-pr/server/repository/core/domain-services';
import { SingleRepositoryDataReadModel } from './single-repository-data.read-model';
import { singleRepositoryDataReadModelFactory } from '../../read-models/factories/single-repository-data-read-model.factory';
import {
getOwnerFromFullRepoName,
getRepoNameFromFullRepoName
} from '@pimp-my-pr/server/repository/core/domain';

@QueryHandler(GetSingleRepositoryDataQuery)
export class GetSingleRepositoryDataHandler
implements IQueryHandler<GetSingleRepositoryDataQuery, SingleRepositoryDataReadModel> {
constructor(private repositoryRepository: RepositoryRepository) {}

async execute(query: GetSingleRepositoryDataQuery): Promise<SingleRepositoryDataReadModel> {
const repository = await this.repositoryRepository.getByData(
query.currentUserId,
getRepoNameFromFullRepoName(query.fullName),
getOwnerFromFullRepoName(query.fullName)
);
return singleRepositoryDataReadModelFactory(repository);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
import { IQuery } from '@nestjs/cqrs';

export class GetSingleRepositoryDataQuery implements IQuery {
constructor(public currentUserId: string, public fullName: string) {}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
import { ApiProperty } from '@nestjs/swagger';

export class SingleRepositoryDataReadModel {
@ApiProperty()
id: string;

@ApiProperty()
maxLines?: number;

@ApiProperty()
maxWaitingTime?: number;

@ApiProperty()
name: string;

@ApiProperty()
owner: string;

@ApiProperty()
pictureUrl: string;

@ApiProperty()
repositoryId: string;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
import { RepositoryEntity } from '@pimp-my-pr/server/repository/core/domain';
import { ListRepositoriesReadModel } from '@pimp-my-pr/server/repository/core/application-services';
import { SingleRepositoryDataReadModel } from '../../queries/get-single-repository-data/single-repository-data.read-model';

export const singleRepositoryDataReadModelFactory = (
repository: RepositoryEntity
): ListRepositoriesReadModel => {
const singleRepositoryReadModel = new SingleRepositoryDataReadModel();

singleRepositoryReadModel.id = repository.id;
singleRepositoryReadModel.maxLines = repository.maxLines;
singleRepositoryReadModel.maxWaitingTime = repository.maxWaitingTime;
singleRepositoryReadModel.name = repository.name;
singleRepositoryReadModel.owner = repository.owner;
singleRepositoryReadModel.pictureUrl = repository.pictureUrl;
singleRepositoryReadModel.repositoryId = repository.repositoryId;

return singleRepositoryReadModel;
};
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,8 @@ import {
EditRepositoryCommand,
RepositoriesStatisticsItemReadModel,
ReviewersStatisticsItemReadModel,
ReviewerStatisticsReadModel
ReviewerStatisticsReadModel,
SingleRepositoryDataReadModel
} from '@pimp-my-pr/server/repository/core/application-services';
import { Platform } from '@pimp-my-pr/shared/domain';
import { AddRepositoryCommand } from './commands/add-repository/add-repository.command';
Expand All @@ -16,13 +17,20 @@ import { ListRepositoriesStatisticsQuery } from './queries/list-repositories-sta
import { ListRepositoriesQuery } from './queries/list-repositories/list-repositories.query';
import { ListReviewersStatisticsQuery } from './queries/list-reviewers-statistics/list-reviewers-statistics.query';
import { ListRepositoriesReadModel } from './queries/list-repositories/list-repositories.read-model';
import { GetSingleRepositoryDataQuery } from './queries/get-single-repository-data/get-single-repository-data.query';

@Injectable()
export class RepositoryFacade {
constructor(private commandBus: CommandBus, private queryBus: QueryBus) {}

addRepository(command: AddRepositoryCommand): Promise<void> {
return this.commandBus.execute(command);
addRepository(command: AddRepositoryCommand): Promise<SingleRepositoryDataReadModel> {
return this.commandBus
.execute(command)
.then(_ =>
this.queryBus.execute(
new GetSingleRepositoryDataQuery(command.userId, command.repositoryName)
)
);
}

deleteRepository(command: DeleteRepositoryCommand): Promise<void> {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,13 +9,15 @@ import { ListReviewersStatisticsHandler } from './queries/list-reviewers-statist
import { RepositoryFacade } from './repository.facade';
import { DeleteRepositoryHandler } from './commands/delete-repository/delete-repository.handler';
import { EditRepositoryHandler } from './commands/edit-repository/edit-repository.handler';
import { GetSingleRepositoryDataHandler } from './queries/get-single-repository-data/get-single-repository-data.handler';

const QueryHandlers = [
AddRepositoryHandler,
DeleteRepositoryHandler,
EditRepositoryHandler,
GetRepositoryStatisticsHandler,
GetReviewerStatisticsHandler,
GetSingleRepositoryDataHandler,
ListRepositoriesStatisticsHandler,
ListReviewersStatisticsHandler,
ListRepositoriesHandler
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@ export abstract class RepositoryRepository {

abstract getById(id: string): Promise<RepositoryEntity>;

abstract getByData(userId: string, name: string, owner: string): Promise<RepositoryEntity>;

abstract loadRepositoryByName(
fullName: string,
token: string,
Expand Down
1 change: 1 addition & 0 deletions libs/server/repository/core/domain/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,3 +3,4 @@ export * from './lib/entities/pr.entity';
export * from './lib/entities/repository.entity';
export * from './lib/entities/reviewer.entity';
export * from './lib/exceptions/repository-not-found.exception';
export * from './lib/utils/repository-name-extract.util';
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
export function getOwnerFromFullRepoName(fullName: string): string {
return fullName.split('/')[0];
}

export function getRepoNameFromFullRepoName(fullName: string): string {
return fullName.split('/')[1];
}
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,10 @@ export class RepositoryRepositoryAdapter extends RepositoryRepository {
return this.typeOrmRepository.findOneOrFail(id);
}

getByData(userId: string, name: string, owner: string): Promise<RepositoryEntity> {
return this.typeOrmRepository.findOne({ userId, name });
}

loadRepositoryByName(
fullName: string,
token: string,
Expand Down
Loading

0 comments on commit 19a504a

Please sign in to comment.