Add profile pages to update your username and password.

This commit is contained in:
Roger Far 2022-02-06 12:27:36 -07:00
parent 7cc5de61fb
commit 444c547b15
9 changed files with 144 additions and 2 deletions

View file

@ -4,6 +4,7 @@ import { AddNewTorrentComponent } from './add-new-torrent/add-new-torrent.compon
import { AuthResolverService } from './auth-resolver.service';
import { LoginComponent } from './login/login.component';
import { MainLayoutComponent } from './main-layout/main-layout.component';
import { ProfileComponent } from './profile/profile.component';
import { SettingsComponent } from './settings/settings.component';
import { SetupComponent } from './setup/setup.component';
import { TorrentTableComponent } from './torrent-table/torrent-table.component';
@ -41,6 +42,10 @@ const routes: Routes = [
path: 'settings',
component: SettingsComponent,
},
{
path: 'profile',
component: ProfileComponent,
},
],
},
];

View file

@ -20,6 +20,7 @@ import { TorrentStatusPipe } from './torrent-status.pipe';
import { TorrentTableComponent } from './torrent-table/torrent-table.component';
import { TorrentComponent } from './torrent/torrent.component';
import { DecodeURIPipe } from './decode-uri.pipe';
import { ProfileComponent } from './profile/profile.component';
curray();
@ -37,6 +38,7 @@ curray();
SetupComponent,
TorrentComponent,
DecodeURIPipe,
ProfileComponent,
],
imports: [
BrowserModule,

View file

@ -29,4 +29,11 @@ export class AuthService {
public logout() {
return this.http.post<void>(`/Api/Authentication/Logout`, {});
}
public update(userName: string, password: string): Observable<void> {
return this.http.post<void>(`/Api/Authentication/Update`, {
userName,
password,
});
}
}

View file

@ -52,7 +52,7 @@
<span class="navbar-link"> Account </span>
<div class="navbar-dropdown is-right">
<a class="navbar-item"> Profile </a>
<a class="navbar-item" routerLink="profile"> Profile </a>
<a class="navbar-item" (click)="logout()"> Logout </a>
<hr class="navbar-divider" />
<div class="navbar-item">Version 2.0.5</div>
@ -61,7 +61,10 @@
</div>
</div>
</nav>
<div class="notification is-warning" *ngIf="profile && profile.latestVersion && profile.currentVersion !== profile.latestVersion">
<div
class="notification is-warning"
*ngIf="profile && profile.latestVersion && profile.currentVersion !== profile.latestVersion"
>
Version {{ profile.latestVersion }} of RealDebrid Client was found. You are currently on version
{{ profile.currentVersion }}.
</div>

View file

@ -0,0 +1,38 @@
<div class="field">
<label class="label">Login username</label>
<div class="control">
<input class="input" type="text" minlength="1" maxlength="100" [(ngModel)]="username" />
</div>
<p class="help">
This is the username you use to login Real-Debrid Client. Only change this if you want to change the username.
</p>
</div>
<div class="field">
<label class="label">Login password</label>
<div class="control">
<input class="input" type="password" minlength="1" maxlength="100" [(ngModel)]="password" />
</div>
<p class="help">
This is the password you use to login Real-Debrid Client. Only change this if you want to change the password.
</p>
</div>
<div class="field">
<div class="control">
<div class="notification is-danger is-light" *ngIf="error != null">Error saving: {{ error }}</div>
</div>
</div>
<div class="field">
<div class="control">
<div class="notification is-success is-light" *ngIf="success">Your profile has been updated</div>
</div>
</div>
<div class="field">
<div class="control">
<button class="button is-success" (click)="save()" [disabled]="saving" [ngClass]="{ 'is-loading': saving }">
Save Profile
</button>
</div>
</div>

View file

@ -0,0 +1,40 @@
import { Component, OnInit } from '@angular/core';
import { AuthService } from '../auth.service';
@Component({
selector: 'app-profile',
templateUrl: './profile.component.html',
styleUrls: ['./profile.component.scss'],
})
export class ProfileComponent implements OnInit {
constructor(private authService: AuthService) {}
public username: string;
public password: string;
public saving = false;
public success: boolean;
public error: string;
ngOnInit(): void {
}
public save(): void {
this.success = false;
this.error = null;
this.saving = true;
this.authService.update(this.username, this.password).subscribe(
() => {
this.success = true;
this.saving = false;
},
(err) => {
this.error = err.error;
this.success = false;
this.saving = false;
}
);
}
}

View file

@ -48,5 +48,32 @@ namespace RdtClient.Service.Services
{
await _signInManager.SignOutAsync();
}
public async Task<IdentityResult> Update(String newUserName, String newPassword)
{
var user = await GetUser();
if (user == null)
{
throw new Exception("No logged in user found");
}
if (!String.IsNullOrWhiteSpace(newUserName))
{
user.UserName = newUserName;
}
await _userManager.UpdateAsync(user);
if (!String.IsNullOrWhiteSpace(newPassword))
{
var token = await _userManager.GeneratePasswordResetTokenAsync(user);
var result = await _userManager.ResetPasswordAsync(user, token, newPassword);
return result;
}
return IdentityResult.Success;
}
}
}

View file

@ -90,6 +90,20 @@ namespace RdtClient.Web.Controllers
await _authentication.Logout();
return Ok();
}
[Route("Update")]
[HttpPost]
public async Task<ActionResult> Update([FromBody] AuthControllerUpdateRequest request)
{
var updateResult = await _authentication.Update(request.UserName, request.Password);
if (!updateResult.Succeeded)
{
return BadRequest(updateResult.Errors.First().Description);
}
return Ok();
}
}
public class AuthControllerLoginRequest
@ -97,4 +111,10 @@ namespace RdtClient.Web.Controllers
public String UserName { get; set; }
public String Password { get; set; }
}
public class AuthControllerUpdateRequest
{
public String UserName { get; set; }
public String Password { get; set; }
}
}