Add appeal and login functionality structure
Introduces initial structure for appeal and login forms in both the frontend and backend. New controllers, APIs, and components were created, but functionality has not been fully implemented yet. This serves as a foundation for future development of these features.
This commit is contained in:
parent
b922487d76
commit
643545a18a
|
|
@ -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");
|
||||
}
|
||||
}
|
||||
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'
|
||||
/appeal/discord-appeal:
|
||||
$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