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());
info.put("userCredentialsEnabled", userCredentials.isEnabled());
info.put("userActivated", userCredentials.getActivateToken() == null);
info.put("lastLoginTs", userCredentials.getLastLoginTs());
}

View File

@ -83,6 +83,7 @@ public class AuthControllerTest extends AbstractControllerTest {
assertThat(user.getEmail()).isEqualTo(CUSTOMER_USER_EMAIL);
user = getUser(customerUserId);
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));
}
@ -243,6 +244,7 @@ public class AuthControllerTest extends AbstractControllerTest {
user.setAuthority(Authority.TENANT_ADMIN);
user.setEmail("tenant-admin-2@thingsboard.org");
user = doPost("/api/user", user, User.class);
assertThat(getUser(user.getId()).getAdditionalInfo().get("userActivated").asBoolean()).isFalse();
UserCredentials userCredentials = userCredentialsDao.findByUserId(tenantId, user.getUuidId());
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()
.put("activateToken", newActivationToken)
.put("password", "wefewe")).andExpect(status().isOk());
assertThat(getUser(user.getId()).getAdditionalInfo().get("userActivated").asBoolean()).isTrue();
}
@Test

View File

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

View File

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

View File

@ -29,7 +29,19 @@ export interface User extends BaseData<UserId>, HasTenantId {
authority: Authority;
firstName: 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 {