Merge pull request #12292 from thingsboard/fix/user-info

Fix user info
This commit is contained in:
Viacheslav Klimov 2024-12-18 13:45:45 +02:00 committed by GitHub
commit b584bead50
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
5 changed files with 24 additions and 8 deletions

View File

@ -923,6 +923,7 @@ public abstract class BaseController {
UserCredentials userCredentials = userService.findUserCredentialsByUserId(user.getTenantId(), user.getId()); UserCredentials userCredentials = userService.findUserCredentialsByUserId(user.getTenantId(), user.getId());
info.put("userCredentialsEnabled", userCredentials.isEnabled()); info.put("userCredentialsEnabled", userCredentials.isEnabled());
info.put("userActivated", userCredentials.getActivateToken() == null);
info.put("lastLoginTs", userCredentials.getLastLoginTs()); info.put("lastLoginTs", userCredentials.getLastLoginTs());
} }

View File

@ -83,6 +83,7 @@ public class AuthControllerTest extends AbstractControllerTest {
assertThat(user.getEmail()).isEqualTo(CUSTOMER_USER_EMAIL); assertThat(user.getEmail()).isEqualTo(CUSTOMER_USER_EMAIL);
user = getUser(customerUserId); user = getUser(customerUserId);
assertThat(user.getAdditionalInfo().get("userCredentialsEnabled").asBoolean()).isTrue(); assertThat(user.getAdditionalInfo().get("userCredentialsEnabled").asBoolean()).isTrue();
assertThat(user.getAdditionalInfo().get("userActivated").asBoolean()).isTrue();
assertThat(user.getAdditionalInfo().get("lastLoginTs").asLong()).isCloseTo(System.currentTimeMillis(), within(10000L)); assertThat(user.getAdditionalInfo().get("lastLoginTs").asLong()).isCloseTo(System.currentTimeMillis(), within(10000L));
} }
@ -243,6 +244,7 @@ public class AuthControllerTest extends AbstractControllerTest {
user.setAuthority(Authority.TENANT_ADMIN); user.setAuthority(Authority.TENANT_ADMIN);
user.setEmail("tenant-admin-2@thingsboard.org"); user.setEmail("tenant-admin-2@thingsboard.org");
user = doPost("/api/user", user, User.class); user = doPost("/api/user", user, User.class);
assertThat(getUser(user.getId()).getAdditionalInfo().get("userActivated").asBoolean()).isFalse();
UserCredentials userCredentials = userCredentialsDao.findByUserId(tenantId, user.getUuidId()); UserCredentials userCredentials = userCredentialsDao.findByUserId(tenantId, user.getUuidId());
assertThat(userCredentials.getActivateTokenExpTime()).isCloseTo(System.currentTimeMillis() + TimeUnit.HOURS.toMillis(ttl), Offset.offset(120000L)); assertThat(userCredentials.getActivateTokenExpTime()).isCloseTo(System.currentTimeMillis() + TimeUnit.HOURS.toMillis(ttl), Offset.offset(120000L));
@ -289,6 +291,7 @@ public class AuthControllerTest extends AbstractControllerTest {
doPost("/api/noauth/activate", JacksonUtil.newObjectNode() doPost("/api/noauth/activate", JacksonUtil.newObjectNode()
.put("activateToken", newActivationToken) .put("activateToken", newActivationToken)
.put("password", "wefewe")).andExpect(status().isOk()); .put("password", "wefewe")).andExpect(status().isOk());
assertThat(getUser(user.getId()).getAdditionalInfo().get("userActivated").asBoolean()).isTrue();
} }
@Test @Test

View File

@ -25,25 +25,25 @@
<button mat-raised-button color="primary" <button mat-raised-button color="primary"
[disabled]="(isLoading$ | async)" [disabled]="(isLoading$ | async)"
(click)="onEntityAction($event, 'disableAccount')" (click)="onEntityAction($event, 'disableAccount')"
[class.!hidden]="isEdit || !isUserCredentialPresent() || !isUserCredentialsEnabled()"> [class.!hidden]="isEdit || !isUserActivated() || !isUserCredentialsEnabled()">
{{'user.disable-account' | translate }} {{'user.disable-account' | translate }}
</button> </button>
<button mat-raised-button color="primary" <button mat-raised-button color="primary"
[disabled]="(isLoading$ | async)" [disabled]="(isLoading$ | async)"
(click)="onEntityAction($event, 'enableAccount')" (click)="onEntityAction($event, 'enableAccount')"
[class.!hidden]="isEdit || !isUserCredentialPresent() || isUserCredentialsEnabled()"> [class.!hidden]="isEdit || !isUserActivated() || isUserCredentialsEnabled()">
{{'user.enable-account' | translate }} {{'user.enable-account' | translate }}
</button> </button>
<button mat-raised-button color="primary" <button mat-raised-button color="primary"
[disabled]="(isLoading$ | async)" [disabled]="(isLoading$ | async)"
(click)="onEntityAction($event, 'displayActivationLink')" (click)="onEntityAction($event, 'displayActivationLink')"
[class.!hidden]="isEdit || isUserCredentialPresent()"> [class.!hidden]="isEdit || isUserActivated()">
{{'user.display-activation-link' | translate }} {{'user.display-activation-link' | translate }}
</button> </button>
<button mat-raised-button color="primary" <button mat-raised-button color="primary"
[disabled]="(isLoading$ | async)" [disabled]="(isLoading$ | async)"
(click)="onEntityAction($event, 'resendActivation')" (click)="onEntityAction($event, 'resendActivation')"
[class.!hidden]="isEdit || isUserCredentialPresent()"> [class.!hidden]="isEdit || isUserActivated()">
{{'user.resend-activation' | translate }} {{'user.resend-activation' | translate }}
</button> </button>
<button mat-raised-button color="primary" <button mat-raised-button color="primary"

View File

@ -60,11 +60,11 @@ export class UserComponent extends EntityComponent<User> {
} }
isUserCredentialsEnabled(): boolean { isUserCredentialsEnabled(): boolean {
return this.entity.additionalInfo.userCredentialsEnabled === true; return this.entity?.additionalInfo?.userCredentialsEnabled === true;
} }
isUserCredentialPresent(): boolean { isUserActivated(): boolean {
return isDefinedAndNotNull(this.entity?.additionalInfo?.userCredentialsEnabled); return this.entity?.additionalInfo?.userActivated === true;
} }
buildForm(entity: User): UntypedFormGroup { buildForm(entity: User): UntypedFormGroup {

View File

@ -29,7 +29,19 @@ export interface User extends BaseData<UserId>, HasTenantId {
authority: Authority; authority: Authority;
firstName: string; firstName: string;
lastName: string; lastName: string;
additionalInfo: any; additionalInfo: Partial<UserAdditionalInfo>;
}
export interface UserAdditionalInfo {
userCredentialsEnabled: boolean;
userActivated: boolean;
description: string;
defaultDashboardId: string;
defaultDashboardFullscreen: boolean;
homeDashboardId: string;
homeDashboardHideToolbar: boolean;
lang: string;
[key: string]: any;
} }
export enum ActivationMethod { export enum ActivationMethod {