SKE-65 can solve competition method
This commit is contained in:
parent
4ef8928ec9
commit
9ecd87db5d
@ -7,7 +7,7 @@
|
||||
<div class="description">
|
||||
<div class="section-color">Nagrody:</div> {{competition.prize}}
|
||||
</div>
|
||||
<button type="button" style="margin-top: 20px" [disabled]="mode==='quiz'" class="btn btn-success" (click)="solveCompetition()">
|
||||
<button type="button" style="margin-top: 20px" [disabled]="mode==='quiz' || !canSolveCompetition" class="btn btn-success" (click)="solveCompetition()">
|
||||
{{l("Start")}}
|
||||
</button>
|
||||
<hr />
|
||||
|
@ -3,8 +3,8 @@ import { appModuleAnimation } from '@shared/animations/routerTransition';
|
||||
import { AppComponentBase } from '@shared/app-component-base';
|
||||
import { Subscription } from 'rxjs/Rx';
|
||||
import { ActivatedRoute } from '@angular/router';
|
||||
import { mergeMap } from 'rxjs/operators';
|
||||
import { finalize } from 'rxjs/operators';
|
||||
import { forkJoin } from 'rxjs';
|
||||
import { CompetitionServiceProxy,
|
||||
CompetitionDto,
|
||||
QuestionDto,
|
||||
@ -18,11 +18,14 @@ import { CompetitionServiceProxy,
|
||||
export class CompetitionDetailComponent extends AppComponentBase implements OnInit, OnDestroy {
|
||||
|
||||
private paramSubscription: Subscription;
|
||||
private routeSubscription: Subscription;
|
||||
|
||||
public competitionId: number;
|
||||
public competition: CompetitionDto = null;
|
||||
public competitionDetailAreaId: string = 'competition-detail-area';
|
||||
|
||||
public canSolveCompetition: boolean = false;
|
||||
|
||||
public mode = 'detail';
|
||||
|
||||
public pager = {
|
||||
@ -41,25 +44,31 @@ export class CompetitionDetailComponent extends AppComponentBase implements OnIn
|
||||
|
||||
public ngOnInit() {
|
||||
this.competition = new CompetitionDto();
|
||||
this.getCompetition();
|
||||
|
||||
this.routeSubscription = this.route.params
|
||||
.subscribe(params => {
|
||||
this.competitionId = +params['id'];
|
||||
console.log('competitionId: ' + this.competitionId);
|
||||
this.getCompetition();
|
||||
})
|
||||
|
||||
}
|
||||
|
||||
private getCompetition(): void {
|
||||
this.paramSubscription = this.route.params
|
||||
.pipe(mergeMap(params => {
|
||||
this.competitionId = +params['id'];
|
||||
console.log('competitionId: ' + this.competitionId);
|
||||
this.setBusy(this.competitionDetailAreaId);
|
||||
const competitionDetailStream = this._competitionService
|
||||
.getCompetition(this.competitionId)
|
||||
.pipe(finalize(() => { this.clearBusy(this.competitionDetailAreaId); }))
|
||||
return competitionDetailStream
|
||||
})).subscribe((result: CompetitionDto) => {
|
||||
this.competition = result;
|
||||
this.competition.questions.forEach((x) => this.shuffleOptions(x.questionOptions));
|
||||
this.pager.count = this.competition.questions.length;
|
||||
console.log(this.competition);
|
||||
});
|
||||
this.setBusy(this.competitionDetailAreaId);
|
||||
|
||||
this.paramSubscription = forkJoin([this._competitionService.getCompetition(this.competitionId),
|
||||
this._competitionService.canSolveCompetition(this.competitionId)])
|
||||
.pipe(finalize(() => { this.clearBusy(this.competitionDetailAreaId); }))
|
||||
.subscribe((data: [CompetitionDto, boolean]) => {
|
||||
this.competition = data[0];
|
||||
this.competition.questions.forEach((x) => this.shuffleOptions(x.questionOptions));
|
||||
this.pager.count = this.competition.questions.length;
|
||||
console.log(this.competition);
|
||||
|
||||
this.canSolveCompetition = data[1];
|
||||
console.log(this.canSolveCompetition);
|
||||
});
|
||||
}
|
||||
|
||||
private shuffleOptions(array) {
|
||||
@ -120,6 +129,10 @@ export class CompetitionDetailComponent extends AppComponentBase implements OnIn
|
||||
if (this.paramSubscription) {
|
||||
this.paramSubscription.unsubscribe();
|
||||
}
|
||||
|
||||
if (this.routeSubscription) {
|
||||
this.routeSubscription.unsubscribe();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
@ -328,6 +328,61 @@ export class CompetitionServiceProxy {
|
||||
}
|
||||
return _observableOf<CompetitionDto>(<any>null);
|
||||
}
|
||||
|
||||
/**
|
||||
* @competitionId (optional)
|
||||
* @return Success
|
||||
*/
|
||||
canSolveCompetition(competitionId: number | null | undefined): Observable<boolean> {
|
||||
let url_ = this.baseUrl + "/api/services/app/Competition/CanSolveCompetition?";
|
||||
if (competitionId !== undefined)
|
||||
url_ += "competitionId=" + encodeURIComponent("" + competitionId) + "&";
|
||||
url_ = url_.replace(/[?&]$/, "");
|
||||
|
||||
let options_ : any = {
|
||||
observe: "response",
|
||||
responseType: "blob",
|
||||
headers: new HttpHeaders({
|
||||
"Content-Type": "application/json",
|
||||
"Accept": "application/json"
|
||||
})
|
||||
};
|
||||
|
||||
return this.http.request("post", url_, options_).pipe(_observableMergeMap((response_ : any) => {
|
||||
return this.processCanSolveCompetition(response_);
|
||||
})).pipe(_observableCatch((response_: any) => {
|
||||
if (response_ instanceof HttpResponseBase) {
|
||||
try {
|
||||
return this.processCanSolveCompetition(<any>response_);
|
||||
} catch (e) {
|
||||
return <Observable<boolean>><any>_observableThrow(e);
|
||||
}
|
||||
} else
|
||||
return <Observable<boolean>><any>_observableThrow(response_);
|
||||
}));
|
||||
}
|
||||
|
||||
protected processCanSolveCompetition(response: HttpResponseBase): Observable<boolean> {
|
||||
const status = response.status;
|
||||
const responseBlob =
|
||||
response instanceof HttpResponse ? response.body :
|
||||
(<any>response).error instanceof Blob ? (<any>response).error : undefined;
|
||||
|
||||
let _headers: any = {}; if (response.headers) { for (let key of response.headers.keys()) { _headers[key] = response.headers.get(key); }};
|
||||
if (status === 200) {
|
||||
return blobToText(responseBlob).pipe(_observableMergeMap(_responseText => {
|
||||
let result200: any = null;
|
||||
let resultData200 = _responseText === "" ? null : JSON.parse(_responseText, this.jsonParseReviver);
|
||||
result200 = resultData200 !== undefined ? resultData200 : <any>null;
|
||||
return _observableOf(result200);
|
||||
}));
|
||||
} else if (status !== 200 && status !== 204) {
|
||||
return blobToText(responseBlob).pipe(_observableMergeMap(_responseText => {
|
||||
return throwException("An unexpected server error occurred.", status, _responseText, _headers);
|
||||
}));
|
||||
}
|
||||
return _observableOf<boolean>(<any>null);
|
||||
}
|
||||
}
|
||||
|
||||
@Injectable()
|
||||
|
@ -5,6 +5,7 @@ using Microsoft.EntityFrameworkCore;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Threading.Tasks;
|
||||
using SystemKonkursow.Authorization.Users;
|
||||
using SystemKonkursow.Competition.CompetitionCategory.Dto;
|
||||
|
||||
namespace SystemKonkursow.Competition.CompetitionCategory
|
||||
@ -15,16 +16,22 @@ namespace SystemKonkursow.Competition.CompetitionCategory
|
||||
private readonly IRepository<Domain.Competition, long> _competitionRepository;
|
||||
private readonly IRepository<Domain.Question, int> _questionRepository;
|
||||
private readonly IRepository<Domain.QuestionOption, int> _questionOptionRepository;
|
||||
private readonly UserManager _userManager;
|
||||
private readonly IRepository<Domain.Participant, int> _participantRepository;
|
||||
|
||||
public CompetitionAppService(IRepository<Domain.CompetitionCategory, int> competitionCategoryRepository,
|
||||
IRepository<Domain.Competition, long> competitionRepository,
|
||||
IRepository<Domain.Question, int> questionRepository,
|
||||
IRepository<Domain.QuestionOption, int> questionOptionRepository)
|
||||
IRepository<Domain.QuestionOption, int> questionOptionRepository,
|
||||
UserManager userManager,
|
||||
IRepository<Domain.Participant, int> participantRepository)
|
||||
{
|
||||
_competitionCategoryRepository = competitionCategoryRepository;
|
||||
_competitionRepository = competitionRepository;
|
||||
_questionRepository = questionRepository;
|
||||
_questionOptionRepository = questionOptionRepository;
|
||||
_userManager = userManager;
|
||||
_participantRepository = participantRepository;
|
||||
}
|
||||
|
||||
[AbpAuthorize]
|
||||
@ -116,5 +123,34 @@ namespace SystemKonkursow.Competition.CompetitionCategory
|
||||
return mappedObject;
|
||||
}
|
||||
|
||||
[AbpAuthorize]
|
||||
public async Task<bool> CanSolveCompetition(int competitionId)
|
||||
{
|
||||
var user = await GetCurrentUserAsync();
|
||||
|
||||
var isParticipant = await _userManager.IsParticipantUserAsync(user);
|
||||
|
||||
if (isParticipant)
|
||||
{
|
||||
var participant = await _participantRepository.GetAll()
|
||||
.FirstOrDefaultAsync(t => t.UserId == user.Id);
|
||||
|
||||
var competition = await _competitionRepository.GetAll()
|
||||
.FirstOrDefaultAsync(t => t.Id == competitionId);
|
||||
|
||||
if (participant.ParticipantClass < competition.MinClass || participant.ParticipantClass > competition.MaxClass)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
@ -11,6 +11,7 @@ using Abp.Domain.Uow;
|
||||
using Abp.Organizations;
|
||||
using Abp.Runtime.Caching;
|
||||
using SystemKonkursow.Authorization.Roles;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace SystemKonkursow.Authorization.Users
|
||||
{
|
||||
@ -54,5 +55,16 @@ namespace SystemKonkursow.Authorization.Users
|
||||
settingManager)
|
||||
{
|
||||
}
|
||||
|
||||
public async Task<bool> CheckHasUserRole(User user, string roleName)
|
||||
{
|
||||
return await IsInRoleAsync(user, roleName);
|
||||
}
|
||||
|
||||
public async Task<bool> IsParticipantUserAsync(User user)
|
||||
{
|
||||
return await CheckHasUserRole(user, StaticRoleNames.Host.Participant);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user