44using System . Linq ;
55using System . Net . Http ;
66using System . Web . Http ;
7+ using eFormAPI . Web . Infrastructure . Consts ;
78using eFormAPI . Web . Infrastructure . Data ;
9+ using eFormAPI . Web . Infrastructure . Data . Entities ;
810using eFormAPI . Web . Infrastructure . Identity ;
9- using eFormData ;
1011using eFromAPI . Common . API ;
1112using eFromAPI . Common . Models ;
12- using eFromAPI . Common . Models . Auth ;
1313using eFromAPI . Common . Models . User ;
1414using Microsoft . AspNet . Identity ;
1515using Microsoft . AspNet . Identity . Owin ;
16- using Microsoft . Owin . Security ;
16+ using NLog ;
1717
1818namespace eFormAPI . Web . Controllers
1919{
20- [ Authorize ]
20+ [ Authorize ( Roles = EformRoles . Admin ) ]
2121 [ RoutePrefix ( "api/admin" ) ]
2222 public class AdminController : ApiController
2323 {
24- private readonly BaseDbContext _dbContext ;
2524 private EformUserManager _eformUserManager ;
2625 private EformRoleManager _eformRoleManager ;
26+ private readonly Logger _logger = LogManager . GetCurrentClassLogger ( ) ;
2727
28- public AdminController ( BaseDbContext dbContext )
29- {
30- _dbContext = dbContext ;
31- }
32-
3328 public EformUserManager UserManager
3429 {
3530 get => _eformUserManager ?? Request . GetOwinContext ( ) . GetUserManager < EformUserManager > ( ) ;
@@ -38,7 +33,7 @@ public EformUserManager UserManager
3833
3934 public EformRoleManager RoleManager
4035 {
41- get => _eformRoleManager ?? Request . GetOwinContext ( ) . GetUserManager < EformRoleManager > ( ) ;
36+ get => _eformRoleManager ?? new EformRoleManager ( new EformRoleStore ( BaseDbContext . Create ( ) ) ) ;
4237 private set => _eformRoleManager = value ;
4338 }
4439
@@ -48,55 +43,73 @@ public OperationDataResult<UserRegisterModel> GetUser(int userId)
4843 {
4944 try
5045 {
51- var user = _dbContext . Users . Include ( x => x . Roles ) . FirstOrDefault ( x => x . Id == userId ) ;
52-
53-
54- var model = new UserRegisterModel
46+ var model = UserManager . Users
47+ . Include ( x => x . Roles )
48+ . Select ( userResult => new UserRegisterModel
49+ {
50+ Email = userResult . Email ,
51+ Id = userResult . Id ,
52+ FirstName = userResult . FirstName ,
53+ LastName = userResult . LastName ,
54+ UserName = userResult . UserName ,
55+ RoleId = userResult . Roles . FirstOrDefault ( ) . RoleId
56+ } ) . FirstOrDefault ( x => x . Id == userId ) ;
57+
58+ if ( model ? . RoleId != null )
5559 {
56- Email = user ? . Email ,
57- Id = userId ,
58- FirstName = user . FirstName ,
59- LastName = user . LastName
60- } ;
61-
62- // var userRoles = user.Roles.FirstOrDefault();
63- //
64- // if (userRoles != null)
65- // {
66- // model.Role = _eformRoleManager.FindById(userRoles.RoleId).Name;
67- // }
68-
60+ model . Role = RoleManager . FindById ( ( int ) model . RoleId ) . Name ;
61+ }
6962 return new OperationDataResult < UserRegisterModel > ( true , model ) ;
70-
7163 }
7264 catch ( Exception exception )
7365 {
66+ _logger . Error ( exception . Message ) ;
7467 return new OperationDataResult < UserRegisterModel > ( false , "Error when obtaining users" ) ;
7568 }
7669 }
7770
7871 [ HttpPost ]
7972 [ Route ( "get-users" ) ]
80- public OperationDataResult < List < UserInfoViewModel > > GetAllUsers ( PaginationModel paginationModel )
73+ public OperationDataResult < UserInfoModelList > GetAllUsers ( PaginationModel paginationModel )
8174 {
8275 try
8376 {
84- var userList = _dbContext . Users . Include ( x => x . Roles ) . ToList ( ) ;
85-
86- var model = userList . Select ( user => new UserInfoViewModel
87- {
88- FirstName = user . FirstName ,
89- LastName = user . LastName ,
90- Email = user . Email ,
91- Id = user . Id
92- } )
77+ var roles = RoleManager . Roles . ToList ( ) ;
78+ var userList = new List < UserInfoViewModel > ( ) ;
79+ var userResult = UserManager . Users
80+ . Include ( x => x . Roles )
81+ . OrderBy ( z => z . Id )
82+ . Skip ( paginationModel . Offset )
83+ . Take ( paginationModel . PageSize )
9384 . ToList ( ) ;
9485
95- return new OperationDataResult < List < UserInfoViewModel > > ( true , model ) ;
86+ userResult . ForEach ( userItem =>
87+ {
88+ var roleName =
89+ roles . FirstOrDefault ( x => x . Id == userItem . Roles . Select ( y => y . RoleId ) . FirstOrDefault ( ) ) ;
90+ var modelItem = new UserInfoViewModel ( ) ;
91+ if ( roleName != null )
92+ {
93+ modelItem . Role = roleName . Name ;
94+ }
95+ modelItem . FirstName = userItem . FirstName ;
96+ modelItem . LastName = userItem . LastName ;
97+ modelItem . Email = userItem . Email ;
98+ modelItem . Id = userItem . Id ;
99+ modelItem . UserName = userItem . UserName ;
100+ userList . Add ( modelItem ) ;
101+ } ) ;
102+ var totalUsers = UserManager . Users . Count ( ) ;
103+ return new OperationDataResult < UserInfoModelList > ( true , new UserInfoModelList ( )
104+ {
105+ TotalUsers = totalUsers ,
106+ UserList = userList
107+ } ) ;
96108 }
97109 catch ( Exception exception )
98110 {
99- return new OperationDataResult < List < UserInfoViewModel > > ( false , "Error when obtaining users" ) ;
111+ _logger . Error ( exception . Message ) ;
112+ return new OperationDataResult < UserInfoModelList > ( false , "Error when obtaining users" ) ;
100113 }
101114 }
102115
@@ -106,47 +119,105 @@ public OperationResult UpdateUser(UserRegisterModel userRegisterModel)
106119 {
107120 try
108121 {
109- var user = _dbContext . Users . Include ( x => x . Roles ) . FirstOrDefault ( x => x . Id == userRegisterModel . Id ) ;
110-
111- if ( user == null ) throw new Exception ( ) ;
112-
113-
114- if ( userRegisterModel . Password . Equals ( userRegisterModel . PasswordConfimation ) )
122+ var user = UserManager . FindById ( userRegisterModel . Id ) ;
123+ if ( user == null )
115124 {
116- user . Email = userRegisterModel . Email ;
117- user . UserName = userRegisterModel . UserName ;
118- user . FirstName = userRegisterModel . FirstName ;
119- user . LastName = userRegisterModel . LastName ;
120- user . PasswordHash = new PasswordHasher ( ) . HashPassword ( userRegisterModel . Password ) ;
125+ return new OperationResult ( false , $ "User { userRegisterModel . UserName } not found") ;
121126 }
122-
123- _dbContext . Entry ( user ) . State = EntityState . Modified ;
124- _dbContext . SaveChanges ( ) ;
125-
126- return new OperationResult ( true , $ "User { userRegisterModel . Id } was updated") ;
127+ if ( userRegisterModel . Role == null )
128+ {
129+ return new OperationResult ( false , $ "Role is required") ;
130+ }
131+ user . Email = userRegisterModel . Email ;
132+ user . UserName = userRegisterModel . UserName ;
133+ user . FirstName = userRegisterModel . FirstName ;
134+ user . LastName = userRegisterModel . LastName ;
135+ var result = UserManager . Update ( user ) ;
136+ if ( ! result . Succeeded )
137+ {
138+ return new OperationResult ( false , string . Join ( " " , result . Errors ) ) ;
139+ }
140+ // password
141+ if ( userRegisterModel . Password != null )
142+ {
143+ UserManager . RemovePassword ( user . Id ) ;
144+ UserManager . AddPassword ( user . Id , userRegisterModel . Password ) ;
145+ }
146+ // change role
147+ UserManager . RemoveFromRoles ( user . Id , EformRoles . Admin , EformRoles . User ) ;
148+ UserManager . AddToRole ( user . Id , userRegisterModel . Role ) ;
149+ return new OperationResult ( true , $ "User { user . UserName } was updated") ;
127150 }
128151 catch ( Exception exception )
129152 {
153+ _logger . Error ( exception . Message ) ;
130154 return new OperationResult ( false , "Error when updating user" ) ;
131155 }
132156 }
133157
134158 [ HttpPost ]
159+ [ Route ( "create-user" ) ]
160+ public OperationResult CreateUser ( UserRegisterModel userRegisterModel )
161+ {
162+ try
163+ {
164+ var userResult = UserManager . FindByName ( userRegisterModel . UserName ) ;
165+ if ( userResult != null )
166+ {
167+ return new OperationResult ( false , $ "User { userRegisterModel . UserName } already exist") ;
168+ }
169+ if ( userRegisterModel . Role == null )
170+ {
171+ return new OperationResult ( false , $ "Role is required") ;
172+ }
173+ var user = new EformUser
174+ {
175+ Email = userRegisterModel . Email ,
176+ UserName = userRegisterModel . UserName ,
177+ FirstName = userRegisterModel . FirstName ,
178+ LastName = userRegisterModel . LastName ,
179+ } ;
180+ var result = UserManager . Create ( user , userRegisterModel . Password ) ;
181+ if ( ! result . Succeeded )
182+ {
183+ return new OperationResult ( false , string . Join ( " " , result . Errors ) ) ;
184+ }
185+ // change role
186+ UserManager . AddToRole ( user . Id , userRegisterModel . Role . ToLower ( ) ) ;
187+ return new OperationResult ( true , $ "User { user . UserName } was created") ;
188+ }
189+ catch ( Exception exception )
190+ {
191+ _logger . Error ( exception . Message ) ;
192+ return new OperationResult ( false , "Error when creating user" ) ;
193+ }
194+ }
195+
196+ [ HttpGet ]
135197 [ Route ( "delete-user/{userId}" ) ]
136198 public OperationResult DeleteUser ( int userId )
137199 {
138200 try
139201 {
140- var user = _dbContext . Users . Include ( x => x . Roles ) . FirstOrDefault ( x => x . Id == userId ) ;
141-
142- if ( user == null ) throw new Exception ( ) ;
143-
144- _dbContext . Entry ( user ) . State = EntityState . Deleted ;
145-
202+ if ( userId == 1 )
203+ {
204+ return new OperationResult ( false , "Can't delete primary admin user" ) ;
205+ }
206+ var user = UserManager . FindById ( userId ) ;
207+ if ( user == null )
208+ {
209+ return new OperationResult ( false , $ "User { userId } not found") ;
210+ }
211+ var result = UserManager . Delete ( user ) ;
212+ if ( ! result . Succeeded )
213+ {
214+ return new OperationResult ( false , string . Join ( " " , result . Errors ) ) ;
215+ }
146216 return new OperationResult ( true , $ "User { userId } was deleted") ;
147217 }
148218 catch ( Exception exception )
149219 {
220+ _logger . Error ( exception . Message ) ;
150221 return new OperationResult ( false , "Error while deleting user" ) ;
151222 }
152223 }
0 commit comments