33using Chats . BE . Controllers . Admin . AdminModels . Dtos ;
44using Chats . BE . Controllers . Admin . Common ;
55using Chats . BE . Controllers . Common . Dtos ;
6+ using Chats . BE . Services . Common ;
67using Chats . BE . Services ;
78using Microsoft . AspNetCore . Mvc ;
89using Microsoft . EntityFrameworkCore ;
@@ -13,10 +14,9 @@ namespace Chats.BE.Controllers.Admin.AdminModels;
1314public class AdminUserModelController ( ChatsDB db ) : ControllerBase
1415{
1516 [ HttpGet ( "users" ) ]
16- public async Task < ActionResult < PagedResult < UserModelPermissionUserDto > > > GetUsersForPermission ( QueryPagingRequest pagingRequest , CancellationToken cancellationToken )
17+ public async Task < ActionResult < PagedResult < UserModelPermissionUserDto > > > GetUsersForPermission ( [ FromQuery ] UserModelPermissionUserQuery pagingRequest , CancellationToken cancellationToken )
1718 {
18- IQueryable < User > query = db . Users
19- . OrderByDescending ( x => x . UpdatedAt ) ;
19+ IQueryable < User > query = BuildUserPermissionQuery ( pagingRequest ) ;
2020
2121 int totalModelProviderCount = await db . ModelProviderOrders
2222 . CountAsync ( cancellationToken ) ;
@@ -29,20 +29,15 @@ public async Task<ActionResult<PagedResult<UserModelPermissionUserDto>>> GetUser
2929 . CountAsync ( cancellationToken ) ;
3030 }
3131
32- if ( ! string . IsNullOrEmpty ( pagingRequest . Query ) )
33- {
34- query = query . Where ( x => x . UserName . Contains ( pagingRequest . Query )
35- || ( x . Email != null && x . Email . Contains ( pagingRequest . Query ) )
36- || ( x . Phone != null && x . Phone . Contains ( pagingRequest . Query ) ) ) ;
37- }
38-
3932 PagedResult < UserModelPermissionUserDto > result = await PagedResult . FromQuery (
4033 query . Select ( x => new UserModelPermissionUserDto
4134 {
4235 Id = x . Id ,
43- Username = x . UserName ,
36+ Username = x . DisplayName ?? x . UserName ,
37+ Account = x . UserName ,
4438 Email = x . Email ,
4539 Phone = x . Phone ,
40+ Provider = x . Provider ,
4641 Enabled = x . Enabled ,
4742 UserModelCount = x . UserModels . Count ( um => ! um . Model . IsDeleted ) ,
4843 ModelProviderCount = totalModelProviderCount ,
@@ -54,6 +49,61 @@ public async Task<ActionResult<PagedResult<UserModelPermissionUserDto>>> GetUser
5449 return Ok ( result ) ;
5550 }
5651
52+ private IQueryable < User > BuildUserPermissionQuery ( UserModelPermissionUserQuery query )
53+ {
54+ IQueryable < User > rows = db . Users
55+ . OrderByDescending ( x => x . UpdatedAt ) ;
56+
57+ if ( ! string . IsNullOrWhiteSpace ( query . Id ) )
58+ {
59+ if ( ! int . TryParse ( query . Id . Trim ( ) , out int parsedId ) )
60+ {
61+ return rows . Where ( _ => false ) ;
62+ }
63+
64+ rows = rows . Where ( x => x . Id == parsedId ) ;
65+ }
66+
67+ if ( ! string . IsNullOrWhiteSpace ( query . Username ) )
68+ {
69+ string keyword = query . Username . Trim ( ) ;
70+ rows = rows . Where ( x =>
71+ EF . Functions . Like ( x . DisplayName , $ "%{ keyword } %") ||
72+ EF . Functions . Like ( x . UserName , $ "%{ keyword } %") ) ;
73+ }
74+
75+ if ( ! string . IsNullOrWhiteSpace ( query . Phone ) )
76+ {
77+ string keyword = query . Phone . Trim ( ) ;
78+ rows = rows . Where ( x => x . Phone != null && EF . Functions . Like ( x . Phone , $ "%{ keyword } %") ) ;
79+ }
80+
81+ if ( ! string . IsNullOrWhiteSpace ( query . Email ) )
82+ {
83+ string keyword = query . Email . Trim ( ) ;
84+ rows = rows . Where ( x => x . Email != null && EF . Functions . Like ( x . Email , $ "%{ keyword } %") ) ;
85+ }
86+
87+ if ( ! string . IsNullOrWhiteSpace ( query . LoginType ) )
88+ {
89+ string normalized = query . LoginType . Trim ( ) . ToLowerInvariant ( ) ;
90+ if ( normalized == "password" )
91+ {
92+ rows = rows . Where ( x => x . Provider == null || x . Provider == "" ) ;
93+ }
94+ else if ( normalized == "phone" )
95+ {
96+ rows = rows . Where ( x => x . Provider != null && x . Provider . ToLower ( ) == KnownLoginProviders . Phone . ToLower ( ) ) ;
97+ }
98+ else if ( normalized == "keycloak" )
99+ {
100+ rows = rows . Where ( x => x . Provider != null && x . Provider . ToLower ( ) == KnownLoginProviders . Keycloak . ToLower ( ) ) ;
101+ }
102+ }
103+
104+ return rows ;
105+ }
106+
57107 [ HttpGet ( "user/{userId:int}/providers" ) ]
58108 public async Task < ActionResult < UserModelProviderDto [ ] > > GetModelProvidersForUser ( int userId , CancellationToken cancellationToken )
59109 {
0 commit comments