Compare commits
4 Commits
43b75b8e74
...
643545a18a
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
643545a18a | ||
|
|
b922487d76 | ||
|
|
54eb1ea735 | ||
|
|
9043c774f7 |
|
|
@ -0,0 +1,28 @@
|
||||||
|
package com.alttd.altitudeweb.controllers.application;
|
||||||
|
|
||||||
|
import com.alttd.altitudeweb.api.AppealsApi;
|
||||||
|
import com.alttd.altitudeweb.model.AppealResponseDto;
|
||||||
|
import com.alttd.altitudeweb.model.DiscordAppealDto;
|
||||||
|
import com.alttd.altitudeweb.model.MinecraftAppealDto;
|
||||||
|
import com.alttd.altitudeweb.model.UpdateMailDto;
|
||||||
|
import org.springframework.http.HttpStatusCode;
|
||||||
|
import org.springframework.http.ResponseEntity;
|
||||||
|
import org.springframework.web.server.ResponseStatusException;
|
||||||
|
|
||||||
|
public class AppealController implements AppealsApi {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ResponseEntity<MinecraftAppealDto> submitDiscordAppeal(DiscordAppealDto discordAppealDto) {
|
||||||
|
throw new ResponseStatusException(HttpStatusCode.valueOf(501), "Discord appeals are not yet supported");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ResponseEntity<AppealResponseDto> submitMinecraftAppeal(MinecraftAppealDto minecraftAppealDto) {
|
||||||
|
throw new ResponseStatusException(HttpStatusCode.valueOf(501), "Minecraft appeals are not yet supported");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ResponseEntity<AppealResponseDto> updateMail(UpdateMailDto updateMailDto) {
|
||||||
|
throw new ResponseStatusException(HttpStatusCode.valueOf(501), "Updating mail is not yet supported");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,22 @@
|
||||||
|
package com.alttd.altitudeweb.controllers.login;
|
||||||
|
|
||||||
|
import com.alttd.altitudeweb.api.LoginApi;
|
||||||
|
import com.alttd.altitudeweb.model.AddLoginDto;
|
||||||
|
import com.alttd.altitudeweb.model.LoginDataDto;
|
||||||
|
import com.alttd.altitudeweb.model.LoginResultDto;
|
||||||
|
import org.springframework.http.HttpStatusCode;
|
||||||
|
import org.springframework.http.ResponseEntity;
|
||||||
|
import org.springframework.web.server.ResponseStatusException;
|
||||||
|
|
||||||
|
public class LoginController implements LoginApi {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ResponseEntity<Void> addLogin(AddLoginDto addLoginDto) {
|
||||||
|
throw new ResponseStatusException(HttpStatusCode.valueOf(501), "Adding login is not yet supported");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ResponseEntity<LoginResultDto> login(LoginDataDto loginDataDto) {
|
||||||
|
throw new ResponseStatusException(HttpStatusCode.valueOf(501), "Logging in is not yet supported");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -2,13 +2,15 @@ import {Component} from '@angular/core';
|
||||||
import {ScrollService} from '../scroll/scroll.service';
|
import {ScrollService} from '../scroll/scroll.service';
|
||||||
import {CommonModule} from '@angular/common';
|
import {CommonModule} from '@angular/common';
|
||||||
import {HeaderComponent} from '../header/header.component';
|
import {HeaderComponent} from '../header/header.component';
|
||||||
|
import {RemoveTrailingPeriodPipe} from "../util/RemoveTrailingPeriodPipe";
|
||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
selector: 'app-about',
|
selector: 'app-about',
|
||||||
standalone: true,
|
standalone: true,
|
||||||
imports: [
|
imports: [
|
||||||
CommonModule,
|
CommonModule,
|
||||||
HeaderComponent
|
HeaderComponent,
|
||||||
|
RemoveTrailingPeriodPipe
|
||||||
],
|
],
|
||||||
templateUrl: './about.component.html',
|
templateUrl: './about.component.html',
|
||||||
styleUrl: './about.component.scss'
|
styleUrl: './about.component.scss'
|
||||||
|
|
|
||||||
|
|
@ -6,57 +6,104 @@
|
||||||
</div>
|
</div>
|
||||||
</app-header>
|
</app-header>
|
||||||
|
|
||||||
<ng-container *ngIf="punishment === undefined">
|
<main>
|
||||||
<p>Loading...</p>
|
<section class="darkmodeSection">
|
||||||
</ng-container>
|
<section class="columnSection">
|
||||||
|
<div class="detailsBackButton">
|
||||||
|
<ng-container *ngIf="punishment === undefined">
|
||||||
|
<p>Loading...</p>
|
||||||
|
</ng-container>
|
||||||
|
|
||||||
<ng-container *ngIf="punishment">
|
<a [routerLink]="['/bans']">< Back</a>
|
||||||
<table [cellSpacing]="0">
|
</div>
|
||||||
<div>
|
</section>
|
||||||
<p>type: {{ this.historyFormat.getType(punishment) }}</p>
|
<section class="columnSection center">
|
||||||
<p>is active: {{ this.historyFormat.isActive(punishment) }}</p>
|
<ng-container *ngIf="punishment">
|
||||||
<tbody>
|
<div>
|
||||||
<tr>
|
<span class="tag tagInfo"
|
||||||
<td>Player</td>
|
[ngClass]="{
|
||||||
<td>
|
'tagPermanent': this.historyFormat.isPermanent(punishment),
|
||||||
<div class="playerContainer">
|
'tagExpired': !this.historyFormat.isPermanent(punishment)
|
||||||
<img class="avatar" [ngSrc]="this.historyFormat.getAvatarUrl(punishment.uuid)" width="25" height="25"
|
}">
|
||||||
alt="{{punishment.username}}'s Minecraft skin">
|
{{ this.historyFormat.getType(punishment) }}
|
||||||
<span class="username">{{ punishment.username }}</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
</td>
|
<div>
|
||||||
</tr>
|
<span
|
||||||
<tr>
|
class="tag tagInfo"
|
||||||
<td>Moderator</td>
|
[ngClass]="{
|
||||||
<td>
|
'tagActive': this.historyFormat.isActive(punishment),
|
||||||
<div class="playerContainer">
|
'tagInactive': !this.historyFormat.isActive(punishment)
|
||||||
<img class="avatar" [ngSrc]="this.historyFormat.getAvatarUrl(punishment.punishedByUuid)" width="25"
|
}">
|
||||||
height="25"
|
{{ this.historyFormat.isActive(punishment) ? 'Active' : 'Inactive' }}
|
||||||
alt="{{punishment.punishedBy}}'s Minecraft skin">
|
</span>
|
||||||
<span class="username">{{ punishment.punishedBy }}</span>
|
</div>
|
||||||
</div>
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td>Reason</td>
|
|
||||||
<td>{{ punishment.reason | removeTrailingPeriod }}</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td>Date</td>
|
|
||||||
<td>{{ this.historyFormat.getPunishmentTime(punishment) }}</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td>Expires</td>
|
|
||||||
<td>{{ this.historyFormat.getExpiredTime(punishment) }}</td>
|
|
||||||
</tr>
|
|
||||||
<ng-container *ngIf="punishment.removedBy !== undefined && punishment.removedBy.length > 0">
|
|
||||||
<tr>
|
|
||||||
<td>Un{{ this.historyFormat.getType(punishment).toLocaleLowerCase() }} reason</td>
|
|
||||||
<td>{{ punishment.removedReason == null ? 'No reason specified' : punishment.removedReason }}</td>
|
|
||||||
</tr>
|
|
||||||
</ng-container>
|
</ng-container>
|
||||||
</tbody>
|
</section>
|
||||||
</div>
|
<section class="columnSection">
|
||||||
</table>
|
<div class="columnContainer">
|
||||||
</ng-container>
|
<div class="columnParagraph">
|
||||||
|
<ng-container *ngIf="punishment">
|
||||||
|
<div class="playerContainer">
|
||||||
|
<h2>Player</h2>
|
||||||
|
<img class="avatar" [ngSrc]="this.historyFormat.getAvatarUrl(punishment.uuid, '150')"
|
||||||
|
width="150"
|
||||||
|
height="150"
|
||||||
|
alt="{{punishment.username}}'s Minecraft skin"
|
||||||
|
>
|
||||||
|
<h3 class="detailsUsername">{{ punishment.username }}</h3>
|
||||||
|
</div>
|
||||||
|
</ng-container>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="columnContainer">
|
||||||
|
<div class="columnParagraph">
|
||||||
|
<ng-container *ngIf="punishment">
|
||||||
|
<div class="playerContainer">
|
||||||
|
<h2>Moderator</h2>
|
||||||
|
<img class="avatar" [ngSrc]="this.historyFormat.getAvatarUrl(punishment.punishedByUuid, '150')"
|
||||||
|
width="150"
|
||||||
|
height="150"
|
||||||
|
alt="{{punishment.punishedBy}}'s Minecraft skin"
|
||||||
|
>
|
||||||
|
<h3 class="detailsUsername">{{ punishment.punishedBy }}</h3>
|
||||||
|
</div>
|
||||||
|
</ng-container>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="columnContainer">
|
||||||
|
<div class="columnParagraph">
|
||||||
|
<ng-container *ngIf="punishment">
|
||||||
|
<div class="detailsInfo">
|
||||||
|
<h2>Reason</h2>
|
||||||
|
<p>{{ punishment.reason | removeTrailingPeriod }}</p>
|
||||||
|
</div>
|
||||||
|
</ng-container>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="columnContainer">
|
||||||
|
<div class="columnParagraph">
|
||||||
|
<ng-container *ngIf="punishment">
|
||||||
|
<div class="detailsInfo">
|
||||||
|
<h2>Date</h2>
|
||||||
|
<p>{{ this.historyFormat.getPunishmentTime(punishment) }}</p>
|
||||||
|
</div>
|
||||||
|
</ng-container>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
</section>
|
||||||
|
</main>
|
||||||
</ng-container>
|
</ng-container>
|
||||||
|
|
||||||
|
|
||||||
|
<section class="columnSection">
|
||||||
|
<ng-container *ngIf="punishment">
|
||||||
|
<span>Expires</span>
|
||||||
|
<span>{{ this.historyFormat.getExpiredTime(punishment) }}</span>
|
||||||
|
<ng-container *ngIf="punishment.removedBy !== undefined && punishment.removedBy.length > 0">
|
||||||
|
<span>Un{{ this.historyFormat.getType(punishment).toLocaleLowerCase() }} reason</span>
|
||||||
|
<span>{{ punishment.removedReason == null ? 'No reason specified' : punishment.removedReason }}</span>
|
||||||
|
</ng-container>
|
||||||
|
</ng-container>
|
||||||
|
</section>
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,68 @@
|
||||||
|
.detailsBackButton {
|
||||||
|
font-family: open-sans, sans-serif;
|
||||||
|
}
|
||||||
|
|
||||||
|
.columnSection {
|
||||||
|
padding-top: 30px;
|
||||||
|
}
|
||||||
|
|
||||||
|
h2 {
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
h3 {
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.avatar {
|
||||||
|
padding: 10px 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.detailsUsername {
|
||||||
|
font-size: 1.2em;
|
||||||
|
font-family: 'opensans-bold', sans-serif;
|
||||||
|
}
|
||||||
|
|
||||||
|
.detailsInfo {
|
||||||
|
padding-top: 50px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.detailsInfo p {
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.tag {
|
||||||
|
display: inline-block;
|
||||||
|
padding: 5px 10px;
|
||||||
|
line-height: 1;
|
||||||
|
text-align: center;
|
||||||
|
white-space: nowrap;
|
||||||
|
vertical-align: baseline;
|
||||||
|
border-radius: 0.25rem;
|
||||||
|
font-family: 'opensans-bold', sans-serif;
|
||||||
|
}
|
||||||
|
|
||||||
|
.tagInfo {
|
||||||
|
margin: 0 20px;
|
||||||
|
font-size: 1.1em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.tagActive {
|
||||||
|
color: #FFFFFF;
|
||||||
|
background-color: #EE5555;
|
||||||
|
}
|
||||||
|
|
||||||
|
.tagInactive {
|
||||||
|
color: #FFFFFF;
|
||||||
|
background-color: #F79720;
|
||||||
|
}
|
||||||
|
|
||||||
|
.tagPermanent {
|
||||||
|
color: #FFFFFF;
|
||||||
|
background-color: #EE5555;
|
||||||
|
}
|
||||||
|
|
||||||
|
.tagExpired {
|
||||||
|
color: #FFFFFF;
|
||||||
|
background-color: #777777
|
||||||
|
}
|
||||||
|
|
@ -1,9 +1,9 @@
|
||||||
import {Component, OnInit} from '@angular/core';
|
import {Component, OnInit} from '@angular/core';
|
||||||
import {HistoryService, PunishmentHistory} from '../../../api';
|
import {HistoryService, PunishmentHistory} from '../../../api';
|
||||||
import {NgIf, NgOptimizedImage} from '@angular/common';
|
import {NgClass, NgIf, NgOptimizedImage} from '@angular/common';
|
||||||
import {RemoveTrailingPeriodPipe} from '../../util/RemoveTrailingPeriodPipe';
|
import {RemoveTrailingPeriodPipe} from '../../util/RemoveTrailingPeriodPipe';
|
||||||
import {HistoryFormatService} from '../history-format.service';
|
import {HistoryFormatService} from '../history-format.service';
|
||||||
import {ActivatedRoute} from '@angular/router';
|
import {ActivatedRoute, RouterLink} from '@angular/router';
|
||||||
import {catchError, map} from 'rxjs';
|
import {catchError, map} from 'rxjs';
|
||||||
import {HeaderComponent} from '../../header/header.component';
|
import {HeaderComponent} from '../../header/header.component';
|
||||||
|
|
||||||
|
|
@ -13,7 +13,9 @@ import {HeaderComponent} from '../../header/header.component';
|
||||||
NgIf,
|
NgIf,
|
||||||
NgOptimizedImage,
|
NgOptimizedImage,
|
||||||
RemoveTrailingPeriodPipe,
|
RemoveTrailingPeriodPipe,
|
||||||
HeaderComponent
|
HeaderComponent,
|
||||||
|
RouterLink,
|
||||||
|
NgClass
|
||||||
],
|
],
|
||||||
templateUrl: './details.component.html',
|
templateUrl: './details.component.html',
|
||||||
styleUrl: './details.component.scss'
|
styleUrl: './details.component.scss'
|
||||||
|
|
|
||||||
|
|
@ -22,9 +22,19 @@ export class HistoryFormatService {
|
||||||
}
|
}
|
||||||
|
|
||||||
public isActive(entry: PunishmentHistory): boolean {
|
public isActive(entry: PunishmentHistory): boolean {
|
||||||
|
if (entry.removedBy !== null) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (entry.expiryTime <= 0) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
return entry.expiryTime > Date.now();
|
return entry.expiryTime > Date.now();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public isPermanent(entry: PunishmentHistory): boolean {
|
||||||
|
return entry.expiryTime <= 0;
|
||||||
|
}
|
||||||
|
|
||||||
public getType(entry: PunishmentHistory): string {
|
public getType(entry: PunishmentHistory): string {
|
||||||
return entry.type.charAt(0).toUpperCase() + entry.type.slice(1);
|
return entry.type.charAt(0).toUpperCase() + entry.type.slice(1);
|
||||||
}
|
}
|
||||||
|
|
@ -48,11 +58,11 @@ export class HistoryFormatService {
|
||||||
}) + " " + suffix;
|
}) + " " + suffix;
|
||||||
}
|
}
|
||||||
|
|
||||||
public getAvatarUrl(entry: string): string {
|
public getAvatarUrl(entry: string, size: string = '25'): string {
|
||||||
let uuid = entry.replace('-', '');
|
let uuid = entry.replace('-', '');
|
||||||
if (uuid === 'C') {
|
if (uuid === 'C') {
|
||||||
uuid = "f78a4d8dd51b4b3998a3230f2de0c670"
|
uuid = "f78a4d8dd51b4b3998a3230f2de0c670"
|
||||||
}
|
}
|
||||||
return `https://crafatar.com/avatars/${uuid}?size=25&overlay`;
|
return `https://crafatar.com/avatars/${uuid}?size=${size}&overlay`;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
5
frontend/src/app/forms/appeal/appeal.component.html
Normal file
5
frontend/src/app/forms/appeal/appeal.component.html
Normal file
|
|
@ -0,0 +1,5 @@
|
||||||
|
<app-forms [currentPage]="'appeal'" [formTitle]="'Minecraft Appeal'">
|
||||||
|
<div form-content>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</app-forms>
|
||||||
0
frontend/src/app/forms/appeal/appeal.component.scss
Normal file
0
frontend/src/app/forms/appeal/appeal.component.scss
Normal file
23
frontend/src/app/forms/appeal/appeal.component.spec.ts
Normal file
23
frontend/src/app/forms/appeal/appeal.component.spec.ts
Normal file
|
|
@ -0,0 +1,23 @@
|
||||||
|
import { ComponentFixture, TestBed } from '@angular/core/testing';
|
||||||
|
|
||||||
|
import { AppealComponent } from './appeal.component';
|
||||||
|
|
||||||
|
describe('AppealComponent', () => {
|
||||||
|
let component: AppealComponent;
|
||||||
|
let fixture: ComponentFixture<AppealComponent>;
|
||||||
|
|
||||||
|
beforeEach(async () => {
|
||||||
|
await TestBed.configureTestingModule({
|
||||||
|
imports: [AppealComponent]
|
||||||
|
})
|
||||||
|
.compileComponents();
|
||||||
|
|
||||||
|
fixture = TestBed.createComponent(AppealComponent);
|
||||||
|
component = fixture.componentInstance;
|
||||||
|
fixture.detectChanges();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should create', () => {
|
||||||
|
expect(component).toBeTruthy();
|
||||||
|
});
|
||||||
|
});
|
||||||
63
frontend/src/app/forms/appeal/appeal.component.ts
Normal file
63
frontend/src/app/forms/appeal/appeal.component.ts
Normal file
|
|
@ -0,0 +1,63 @@
|
||||||
|
import {Component, OnInit} from '@angular/core';
|
||||||
|
import {FormsComponent} from '../forms.component';
|
||||||
|
import {FormBuilder, FormGroup, Validators} from '@angular/forms';
|
||||||
|
import {AppealsService} from '../../../api';
|
||||||
|
|
||||||
|
@Component({
|
||||||
|
selector: 'app-appeal',
|
||||||
|
imports: [
|
||||||
|
FormsComponent
|
||||||
|
],
|
||||||
|
templateUrl: './appeal.component.html',
|
||||||
|
styleUrl: './appeal.component.scss'
|
||||||
|
})
|
||||||
|
export class AppealComponent implements OnInit {
|
||||||
|
|
||||||
|
public form: FormGroup | undefined;
|
||||||
|
|
||||||
|
constructor(private fb: FormBuilder, private appealApi: AppealsService) {
|
||||||
|
}
|
||||||
|
|
||||||
|
ngOnInit() {
|
||||||
|
this.initForm()
|
||||||
|
}
|
||||||
|
|
||||||
|
private initForm() {
|
||||||
|
this.form = this.fb.group({
|
||||||
|
name: ['', [Validators.required]],
|
||||||
|
punishmentId: ['', [Validators.required]],
|
||||||
|
email: ['', [Validators.required, Validators.email]],
|
||||||
|
message: ['', [Validators.required, Validators.minLength(10)]]
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
public onSubmit() {
|
||||||
|
if (this.form === undefined) {
|
||||||
|
console.error('Form is undefined');
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if (this.form.valid) {
|
||||||
|
console.log('Form submitted:', this.form.value);
|
||||||
|
// Process form submission here
|
||||||
|
} else {
|
||||||
|
// Mark all fields as touched to trigger validation display
|
||||||
|
Object.keys(this.form.controls).forEach(field => {
|
||||||
|
const control = this.form!.get(field);
|
||||||
|
if (!(control instanceof FormGroup)) {
|
||||||
|
console.error('Control [' + control + '] is not a FormGroup');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
control.markAsTouched({onlySelf: true});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private sendForm(validForm: FormGroup) {
|
||||||
|
// const appeal: MinecraftAppeal = {
|
||||||
|
//
|
||||||
|
// }
|
||||||
|
// this.appealApi.submitMinecraftAppeal()
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
12
frontend/src/app/forms/forms.component.html
Normal file
12
frontend/src/app/forms/forms.component.html
Normal file
|
|
@ -0,0 +1,12 @@
|
||||||
|
<ng-container>
|
||||||
|
<app-header [current_page]="currentPage" height="200px" background_image="/public/img/backgrounds/staff.png"
|
||||||
|
[overlay_gradient]="0.5">
|
||||||
|
<div class="title" header-content>
|
||||||
|
<h1>{{ formTitle }}</h1>
|
||||||
|
</div>
|
||||||
|
</app-header>
|
||||||
|
<!-- TODO add form styling in this div-->
|
||||||
|
<div>
|
||||||
|
<ng-content select="[form-content]"></ng-content>
|
||||||
|
</div>
|
||||||
|
</ng-container>
|
||||||
0
frontend/src/app/forms/forms.component.scss
Normal file
0
frontend/src/app/forms/forms.component.scss
Normal file
23
frontend/src/app/forms/forms.component.spec.ts
Normal file
23
frontend/src/app/forms/forms.component.spec.ts
Normal file
|
|
@ -0,0 +1,23 @@
|
||||||
|
import { ComponentFixture, TestBed } from '@angular/core/testing';
|
||||||
|
|
||||||
|
import { FormsComponent } from './forms.component';
|
||||||
|
|
||||||
|
describe('FormsComponent', () => {
|
||||||
|
let component: FormsComponent;
|
||||||
|
let fixture: ComponentFixture<FormsComponent>;
|
||||||
|
|
||||||
|
beforeEach(async () => {
|
||||||
|
await TestBed.configureTestingModule({
|
||||||
|
imports: [FormsComponent]
|
||||||
|
})
|
||||||
|
.compileComponents();
|
||||||
|
|
||||||
|
fixture = TestBed.createComponent(FormsComponent);
|
||||||
|
component = fixture.componentInstance;
|
||||||
|
fixture.detectChanges();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should create', () => {
|
||||||
|
expect(component).toBeTruthy();
|
||||||
|
});
|
||||||
|
});
|
||||||
15
frontend/src/app/forms/forms.component.ts
Normal file
15
frontend/src/app/forms/forms.component.ts
Normal file
|
|
@ -0,0 +1,15 @@
|
||||||
|
import {Component, Input} from '@angular/core';
|
||||||
|
import {HeaderComponent} from '../header/header.component';
|
||||||
|
|
||||||
|
@Component({
|
||||||
|
selector: 'app-forms',
|
||||||
|
imports: [
|
||||||
|
HeaderComponent
|
||||||
|
],
|
||||||
|
templateUrl: './forms.component.html',
|
||||||
|
styleUrl: './forms.component.scss'
|
||||||
|
})
|
||||||
|
export class FormsComponent {
|
||||||
|
@Input() formTitle: string = 'Form';
|
||||||
|
@Input() currentPage: string = 'forms';
|
||||||
|
}
|
||||||
|
|
@ -36,3 +36,7 @@ paths:
|
||||||
$ref: './schemas/forms/appeal/appeal.yml#/MinecraftAppeal'
|
$ref: './schemas/forms/appeal/appeal.yml#/MinecraftAppeal'
|
||||||
/appeal/discord-appeal:
|
/appeal/discord-appeal:
|
||||||
$ref: './schemas/forms/appeal/appeal.yml#/DiscordAppeal'
|
$ref: './schemas/forms/appeal/appeal.yml#/DiscordAppeal'
|
||||||
|
/login/addUserLogin:
|
||||||
|
$ref: './schemas/login/login.yml#/AddUserLogin'
|
||||||
|
/login/userLogin:
|
||||||
|
$ref: './schemas/login/login.yml#/UserLogin'
|
||||||
|
|
|
||||||
97
open_api/src/main/resources/schemas/login/login.yml
Normal file
97
open_api/src/main/resources/schemas/login/login.yml
Normal file
|
|
@ -0,0 +1,97 @@
|
||||||
|
UserLogin:
|
||||||
|
post:
|
||||||
|
tags:
|
||||||
|
- login
|
||||||
|
summary: Log in to the site
|
||||||
|
description: Log in to the site through a code from the server
|
||||||
|
operationId: login
|
||||||
|
requestBody:
|
||||||
|
required: true
|
||||||
|
content:
|
||||||
|
application/json:
|
||||||
|
schema:
|
||||||
|
$ref: '#/components/schemas/LoginData'
|
||||||
|
responses:
|
||||||
|
'200':
|
||||||
|
description: Logged in
|
||||||
|
content:
|
||||||
|
application/json:
|
||||||
|
schema:
|
||||||
|
$ref: '#/components/schemas/LoginResult'
|
||||||
|
'401':
|
||||||
|
description: Login failed - Invalid credentials
|
||||||
|
content:
|
||||||
|
application/json:
|
||||||
|
schema:
|
||||||
|
$ref: '../generic/errors.yml#/components/schemas/ApiError'
|
||||||
|
default:
|
||||||
|
description: Unexpected error
|
||||||
|
content:
|
||||||
|
application/json:
|
||||||
|
schema:
|
||||||
|
$ref: '../generic/errors.yml#/components/schemas/ApiError'
|
||||||
|
AddUserLogin:
|
||||||
|
post:
|
||||||
|
tags:
|
||||||
|
- login
|
||||||
|
summary: Add a login
|
||||||
|
description: Add a code, user combination that can be used to log in
|
||||||
|
operationId: addLogin
|
||||||
|
requestBody:
|
||||||
|
required: true
|
||||||
|
content:
|
||||||
|
application/json:
|
||||||
|
schema:
|
||||||
|
$ref: '#/components/schemas/AddLogin'
|
||||||
|
responses:
|
||||||
|
'200':
|
||||||
|
description: Success
|
||||||
|
default:
|
||||||
|
description: Unexpected error
|
||||||
|
content:
|
||||||
|
application/json:
|
||||||
|
schema:
|
||||||
|
$ref: '../generic/errors.yml#/components/schemas/ApiError'
|
||||||
|
components:
|
||||||
|
schemas:
|
||||||
|
LoginData:
|
||||||
|
type: object
|
||||||
|
required:
|
||||||
|
- loginCode
|
||||||
|
properties:
|
||||||
|
loginCode:
|
||||||
|
type: string
|
||||||
|
description: The code to log in
|
||||||
|
LoginResult:
|
||||||
|
type: object
|
||||||
|
required:
|
||||||
|
- uuid
|
||||||
|
- userName
|
||||||
|
- auth
|
||||||
|
properties:
|
||||||
|
uuid:
|
||||||
|
type: string
|
||||||
|
format: uuid
|
||||||
|
description: UUID of logged in user
|
||||||
|
userName:
|
||||||
|
type: string
|
||||||
|
description: Name of the logged in user
|
||||||
|
auth:
|
||||||
|
type: string
|
||||||
|
description: Token to use along side requests
|
||||||
|
AddLogin:
|
||||||
|
type: object
|
||||||
|
required:
|
||||||
|
- loginCode
|
||||||
|
- uuid
|
||||||
|
properties:
|
||||||
|
auth:
|
||||||
|
type: string
|
||||||
|
description: Token to verify the sender is allowed to add logins
|
||||||
|
loginCode:
|
||||||
|
type: string
|
||||||
|
description: The code that can be logged in with
|
||||||
|
uuid:
|
||||||
|
type: string
|
||||||
|
format: uuid
|
||||||
|
description: UUID of the user that will get logged in
|
||||||
Loading…
Reference in New Issue
Block a user