SKE-66 save points
This commit is contained in:
parent
9ecd87db5d
commit
180830c921
@ -3,12 +3,14 @@ import { appModuleAnimation } from '@shared/animations/routerTransition';
|
|||||||
import { AppComponentBase } from '@shared/app-component-base';
|
import { AppComponentBase } from '@shared/app-component-base';
|
||||||
import { Subscription } from 'rxjs/Rx';
|
import { Subscription } from 'rxjs/Rx';
|
||||||
import { ActivatedRoute } from '@angular/router';
|
import { ActivatedRoute } from '@angular/router';
|
||||||
|
import { mergeMap } from 'rxjs/operators';
|
||||||
import { finalize } from 'rxjs/operators';
|
import { finalize } from 'rxjs/operators';
|
||||||
import { forkJoin } from 'rxjs';
|
import { forkJoin } from 'rxjs';
|
||||||
import { CompetitionServiceProxy,
|
import { CompetitionServiceProxy,
|
||||||
CompetitionDto,
|
CompetitionDto,
|
||||||
QuestionDto,
|
QuestionDto,
|
||||||
QuestionOptionDto } from '@shared/service-proxies/service-proxies';
|
QuestionOptionDto,
|
||||||
|
CreateRankingPositionDto } from '@shared/service-proxies/service-proxies';
|
||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
templateUrl: './competition-detail.component.html',
|
templateUrl: './competition-detail.component.html',
|
||||||
@ -19,6 +21,7 @@ export class CompetitionDetailComponent extends AppComponentBase implements OnIn
|
|||||||
|
|
||||||
private paramSubscription: Subscription;
|
private paramSubscription: Subscription;
|
||||||
private routeSubscription: Subscription;
|
private routeSubscription: Subscription;
|
||||||
|
private solveSubscription: Subscription;
|
||||||
|
|
||||||
public competitionId: number;
|
public competitionId: number;
|
||||||
public competition: CompetitionDto = null;
|
public competition: CompetitionDto = null;
|
||||||
@ -121,7 +124,23 @@ export class CompetitionDetailComponent extends AppComponentBase implements OnIn
|
|||||||
) points += 1;
|
) points += 1;
|
||||||
});
|
});
|
||||||
|
|
||||||
console.log('Punkty: ' + points);
|
console.log('Points: ' + points);
|
||||||
|
let rankingPosition = new CreateRankingPositionDto();
|
||||||
|
|
||||||
|
rankingPosition.competitionId = this.competitionId;
|
||||||
|
rankingPosition.points = points;
|
||||||
|
|
||||||
|
this.setBusy(this.competitionDetailAreaId);
|
||||||
|
|
||||||
|
this.solveSubscription = this._competitionService.solveCompetition(rankingPosition)
|
||||||
|
.pipe(mergeMap((result: number) => {
|
||||||
|
const solveCompetitionStream = this._competitionService.canSolveCompetition(this.competitionId);
|
||||||
|
return solveCompetitionStream.pipe(finalize(() => { this.clearBusy(this.competitionDetailAreaId); }));
|
||||||
|
}))
|
||||||
|
.subscribe((data: boolean) => {
|
||||||
|
this.canSolveCompetition = data;
|
||||||
|
});
|
||||||
|
|
||||||
this.mode = 'result';
|
this.mode = 'result';
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -133,6 +152,10 @@ export class CompetitionDetailComponent extends AppComponentBase implements OnIn
|
|||||||
if (this.routeSubscription) {
|
if (this.routeSubscription) {
|
||||||
this.routeSubscription.unsubscribe();
|
this.routeSubscription.unsubscribe();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (this.solveSubscription) {
|
||||||
|
this.solveSubscription.unsubscribe();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
@ -329,6 +329,62 @@ export class CompetitionServiceProxy {
|
|||||||
return _observableOf<CompetitionDto>(<any>null);
|
return _observableOf<CompetitionDto>(<any>null);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @input (optional)
|
||||||
|
* @return Success
|
||||||
|
*/
|
||||||
|
solveCompetition(input: CreateRankingPositionDto | null | undefined): Observable<number> {
|
||||||
|
let url_ = this.baseUrl + "/api/services/app/Competition/SolveCompetition";
|
||||||
|
url_ = url_.replace(/[?&]$/, "");
|
||||||
|
|
||||||
|
const content_ = JSON.stringify(input);
|
||||||
|
|
||||||
|
let options_ : any = {
|
||||||
|
body: content_,
|
||||||
|
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.processSolveCompetition(response_);
|
||||||
|
})).pipe(_observableCatch((response_: any) => {
|
||||||
|
if (response_ instanceof HttpResponseBase) {
|
||||||
|
try {
|
||||||
|
return this.processSolveCompetition(<any>response_);
|
||||||
|
} catch (e) {
|
||||||
|
return <Observable<number>><any>_observableThrow(e);
|
||||||
|
}
|
||||||
|
} else
|
||||||
|
return <Observable<number>><any>_observableThrow(response_);
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
|
||||||
|
protected processSolveCompetition(response: HttpResponseBase): Observable<number> {
|
||||||
|
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<number>(<any>null);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @competitionId (optional)
|
* @competitionId (optional)
|
||||||
* @return Success
|
* @return Success
|
||||||
@ -2508,6 +2564,53 @@ export interface IQuestionOptionDto {
|
|||||||
id: number | undefined;
|
id: number | undefined;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export class CreateRankingPositionDto implements ICreateRankingPositionDto {
|
||||||
|
competitionId: number | undefined;
|
||||||
|
points: number | undefined;
|
||||||
|
|
||||||
|
constructor(data?: ICreateRankingPositionDto) {
|
||||||
|
if (data) {
|
||||||
|
for (var property in data) {
|
||||||
|
if (data.hasOwnProperty(property))
|
||||||
|
(<any>this)[property] = (<any>data)[property];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
init(data?: any) {
|
||||||
|
if (data) {
|
||||||
|
this.competitionId = data["competitionId"];
|
||||||
|
this.points = data["points"];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static fromJS(data: any): CreateRankingPositionDto {
|
||||||
|
data = typeof data === 'object' ? data : {};
|
||||||
|
let result = new CreateRankingPositionDto();
|
||||||
|
result.init(data);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
toJSON(data?: any) {
|
||||||
|
data = typeof data === 'object' ? data : {};
|
||||||
|
data["competitionId"] = this.competitionId;
|
||||||
|
data["points"] = this.points;
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
|
||||||
|
clone(): CreateRankingPositionDto {
|
||||||
|
const json = this.toJSON();
|
||||||
|
let result = new CreateRankingPositionDto();
|
||||||
|
result.init(json);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface ICreateRankingPositionDto {
|
||||||
|
competitionId: number | undefined;
|
||||||
|
points: number | undefined;
|
||||||
|
}
|
||||||
|
|
||||||
export class ChangeUiThemeInput implements IChangeUiThemeInput {
|
export class ChangeUiThemeInput implements IChangeUiThemeInput {
|
||||||
theme: string;
|
theme: string;
|
||||||
|
|
||||||
|
@ -18,13 +18,15 @@ namespace SystemKonkursow.Competition.CompetitionCategory
|
|||||||
private readonly IRepository<Domain.QuestionOption, int> _questionOptionRepository;
|
private readonly IRepository<Domain.QuestionOption, int> _questionOptionRepository;
|
||||||
private readonly UserManager _userManager;
|
private readonly UserManager _userManager;
|
||||||
private readonly IRepository<Domain.Participant, int> _participantRepository;
|
private readonly IRepository<Domain.Participant, int> _participantRepository;
|
||||||
|
private readonly IRepository<Domain.RankingPosition, int> _rankingPositionRepository;
|
||||||
|
|
||||||
public CompetitionAppService(IRepository<Domain.CompetitionCategory, int> competitionCategoryRepository,
|
public CompetitionAppService(IRepository<Domain.CompetitionCategory, int> competitionCategoryRepository,
|
||||||
IRepository<Domain.Competition, long> competitionRepository,
|
IRepository<Domain.Competition, long> competitionRepository,
|
||||||
IRepository<Domain.Question, int> questionRepository,
|
IRepository<Domain.Question, int> questionRepository,
|
||||||
IRepository<Domain.QuestionOption, int> questionOptionRepository,
|
IRepository<Domain.QuestionOption, int> questionOptionRepository,
|
||||||
UserManager userManager,
|
UserManager userManager,
|
||||||
IRepository<Domain.Participant, int> participantRepository)
|
IRepository<Domain.Participant, int> participantRepository,
|
||||||
|
IRepository<Domain.RankingPosition, int> rankingPositionRepository)
|
||||||
{
|
{
|
||||||
_competitionCategoryRepository = competitionCategoryRepository;
|
_competitionCategoryRepository = competitionCategoryRepository;
|
||||||
_competitionRepository = competitionRepository;
|
_competitionRepository = competitionRepository;
|
||||||
@ -32,6 +34,7 @@ namespace SystemKonkursow.Competition.CompetitionCategory
|
|||||||
_questionOptionRepository = questionOptionRepository;
|
_questionOptionRepository = questionOptionRepository;
|
||||||
_userManager = userManager;
|
_userManager = userManager;
|
||||||
_participantRepository = participantRepository;
|
_participantRepository = participantRepository;
|
||||||
|
_rankingPositionRepository = rankingPositionRepository;
|
||||||
}
|
}
|
||||||
|
|
||||||
[AbpAuthorize]
|
[AbpAuthorize]
|
||||||
@ -123,6 +126,20 @@ namespace SystemKonkursow.Competition.CompetitionCategory
|
|||||||
return mappedObject;
|
return mappedObject;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[AbpAuthorize]
|
||||||
|
public async Task<int> SolveCompetition(CreateRankingPositionDto input)
|
||||||
|
{
|
||||||
|
var user = await GetCurrentUserAsync();
|
||||||
|
|
||||||
|
var mappedRankingPosition = ObjectMapper.Map<Domain.RankingPosition>(input);
|
||||||
|
|
||||||
|
mappedRankingPosition.UserId = user.Id;
|
||||||
|
|
||||||
|
var newRankingPositionId = await _rankingPositionRepository.InsertAndGetIdAsync(mappedRankingPosition);
|
||||||
|
|
||||||
|
return newRankingPositionId;
|
||||||
|
}
|
||||||
|
|
||||||
[AbpAuthorize]
|
[AbpAuthorize]
|
||||||
public async Task<bool> CanSolveCompetition(int competitionId)
|
public async Task<bool> CanSolveCompetition(int competitionId)
|
||||||
{
|
{
|
||||||
@ -143,6 +160,13 @@ namespace SystemKonkursow.Competition.CompetitionCategory
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var rankingPosition = await _rankingPositionRepository.GetAll().Where(t => t.UserId == user.Id).FirstOrDefaultAsync();
|
||||||
|
|
||||||
|
if (null != rankingPosition)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -22,6 +22,8 @@ namespace SystemKonkursow.Competition.CompetitionCategory.Dto
|
|||||||
|
|
||||||
CreateMap<Domain.Competition, CompetitionDto>()
|
CreateMap<Domain.Competition, CompetitionDto>()
|
||||||
.ForMember(dest => dest.CreatorName, opt => opt.MapFrom(src => src.Creator.UserName));
|
.ForMember(dest => dest.CreatorName, opt => opt.MapFrom(src => src.Creator.UserName));
|
||||||
|
|
||||||
|
CreateMap<CreateRankingPositionDto, Domain.RankingPosition>();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,9 @@
|
|||||||
|
namespace SystemKonkursow.Competition.CompetitionCategory.Dto
|
||||||
|
{
|
||||||
|
public class CreateRankingPositionDto
|
||||||
|
{
|
||||||
|
public long CompetitionId { get; set; }
|
||||||
|
|
||||||
|
public int Points { get; set; }
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,22 @@
|
|||||||
|
using Abp.Domain.Entities;
|
||||||
|
using System.ComponentModel.DataAnnotations.Schema;
|
||||||
|
using SystemKonkursow.Authorization.Users;
|
||||||
|
|
||||||
|
namespace SystemKonkursow.Domain
|
||||||
|
{
|
||||||
|
[Table("RankingPositions")]
|
||||||
|
public class RankingPosition : Entity<int>
|
||||||
|
{
|
||||||
|
public long UserId { get; set; }
|
||||||
|
|
||||||
|
public long CompetitionId { get; set; }
|
||||||
|
|
||||||
|
public int Points { get; set; }
|
||||||
|
|
||||||
|
[ForeignKey(nameof(UserId))]
|
||||||
|
public virtual User User { get; set; }
|
||||||
|
|
||||||
|
[ForeignKey(nameof(CompetitionId))]
|
||||||
|
public virtual Competition Competition { get; set; }
|
||||||
|
}
|
||||||
|
}
|
@ -28,5 +28,7 @@ namespace SystemKonkursow.EntityFrameworkCore
|
|||||||
|
|
||||||
public DbSet<Domain.QuestionOption> QuestionOptions { get; set; }
|
public DbSet<Domain.QuestionOption> QuestionOptions { get; set; }
|
||||||
|
|
||||||
|
public DbSet<Domain.RankingPosition> RankingPositions { get; set; }
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1134,6 +1134,27 @@ namespace SystemKonkursow.Migrations
|
|||||||
b.ToTable("QuestionOptions");
|
b.ToTable("QuestionOptions");
|
||||||
});
|
});
|
||||||
|
|
||||||
|
modelBuilder.Entity("SystemKonkursow.Domain.RankingPosition", b =>
|
||||||
|
{
|
||||||
|
b.Property<int>("Id")
|
||||||
|
.ValueGeneratedOnAdd()
|
||||||
|
.HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
|
||||||
|
|
||||||
|
b.Property<long>("CompetitionId");
|
||||||
|
|
||||||
|
b.Property<int>("Points");
|
||||||
|
|
||||||
|
b.Property<long>("UserId");
|
||||||
|
|
||||||
|
b.HasKey("Id");
|
||||||
|
|
||||||
|
b.HasIndex("CompetitionId");
|
||||||
|
|
||||||
|
b.HasIndex("UserId");
|
||||||
|
|
||||||
|
b.ToTable("RankingPositions");
|
||||||
|
});
|
||||||
|
|
||||||
modelBuilder.Entity("SystemKonkursow.MultiTenancy.Tenant", b =>
|
modelBuilder.Entity("SystemKonkursow.MultiTenancy.Tenant", b =>
|
||||||
{
|
{
|
||||||
b.Property<int>("Id")
|
b.Property<int>("Id")
|
||||||
@ -1379,6 +1400,19 @@ namespace SystemKonkursow.Migrations
|
|||||||
.OnDelete(DeleteBehavior.Cascade);
|
.OnDelete(DeleteBehavior.Cascade);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
modelBuilder.Entity("SystemKonkursow.Domain.RankingPosition", b =>
|
||||||
|
{
|
||||||
|
b.HasOne("SystemKonkursow.Domain.Competition", "Competition")
|
||||||
|
.WithMany()
|
||||||
|
.HasForeignKey("CompetitionId")
|
||||||
|
.OnDelete(DeleteBehavior.Cascade);
|
||||||
|
|
||||||
|
b.HasOne("SystemKonkursow.Authorization.Users.User", "User")
|
||||||
|
.WithMany()
|
||||||
|
.HasForeignKey("UserId")
|
||||||
|
.OnDelete(DeleteBehavior.Cascade);
|
||||||
|
});
|
||||||
|
|
||||||
modelBuilder.Entity("SystemKonkursow.MultiTenancy.Tenant", b =>
|
modelBuilder.Entity("SystemKonkursow.MultiTenancy.Tenant", b =>
|
||||||
{
|
{
|
||||||
b.HasOne("SystemKonkursow.Authorization.Users.User", "CreatorUser")
|
b.HasOne("SystemKonkursow.Authorization.Users.User", "CreatorUser")
|
||||||
|
@ -25,7 +25,4 @@
|
|||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<DotNetCliToolReference Include="Microsoft.EntityFrameworkCore.Tools.DotNet" Version="2.0.0" />
|
<DotNetCliToolReference Include="Microsoft.EntityFrameworkCore.Tools.DotNet" Version="2.0.0" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
|
||||||
<Folder Include="Migrations\" />
|
|
||||||
</ItemGroup>
|
|
||||||
</Project>
|
</Project>
|
Loading…
Reference in New Issue
Block a user