1+ using Microsoft . AspNet . Identity ;
2+ using personal_site_api . Infrastructure ;
3+ using System ;
4+ using System . Linq ;
5+ using System . Threading . Tasks ;
6+ using System . Web . Http ;
7+ using static personal_site_api . Models . AccountBindingModels ;
8+
9+ namespace personal_site_api . Controllers
10+ {
11+ [ RoutePrefix ( "api/accounts" ) ]
12+ public class AccountsController : BaseApiController
13+ {
14+ [ Route ( "users" ) ]
15+ public IHttpActionResult GetUsers ( )
16+ {
17+ return Ok ( AppUserManager . Users . ToList ( ) . Select ( u => TheModelFactory . Create ( u ) ) ) ;
18+ }
19+
20+ [ Route ( "user/{id:guid}" , Name = "GetUserById" ) ]
21+ public async Task < IHttpActionResult > GetUser ( string Id )
22+ {
23+ var user = await AppUserManager . FindByIdAsync ( Id ) ;
24+
25+ if ( user != null )
26+ return Ok ( TheModelFactory . Create ( user ) ) ;
27+
28+ return NotFound ( ) ;
29+ }
30+
31+ [ Route ( "create" ) ]
32+ public async Task < IHttpActionResult > CreateUser ( CreateUserBindingModel createUserModel )
33+ {
34+ if ( ! ModelState . IsValid )
35+ return BadRequest ( ModelState ) ;
36+
37+ var user = new ApplicationUser ( )
38+ {
39+ UserName = createUserModel . Username ,
40+ Email = createUserModel . Email
41+ } ;
42+
43+ IdentityResult addUserResult = await AppUserManager . CreateAsync ( user , createUserModel . Password ) ;
44+
45+ if ( ! addUserResult . Succeeded )
46+ return GetErrorResult ( addUserResult ) ;
47+
48+ //email configuration
49+ string code = await AppUserManager . GenerateEmailConfirmationTokenAsync ( user . Id ) ;
50+ var callbackUrl = new Uri ( Url . Link ( "ConfirmEmailRoute" , new { userId = user . Id , code } ) ) ;
51+ await AppUserManager . SendEmailAsync ( user . Id , "Confirm your account" , "Please confirm your email by clicking <a href=\" " + callbackUrl + "\" >here</a>" ) ;
52+
53+ Uri locationHeader = new Uri ( Url . Link ( "GetUserById" , new { id = user . Id } ) ) ;
54+
55+ return Created ( locationHeader , TheModelFactory . Create ( user ) ) ;
56+ }
57+
58+ [ HttpGet ]
59+ [ Route ( "ConfirmEmail" , Name = "ConfirmEmailRoute" ) ]
60+ public async Task < IHttpActionResult > ConfirmEmail ( string userId = "" , string code = "" )
61+ {
62+ if ( string . IsNullOrWhiteSpace ( userId ) || string . IsNullOrWhiteSpace ( code ) )
63+ {
64+ ModelState . AddModelError ( "" , "User Id and Code are required" ) ;
65+ return BadRequest ( ModelState ) ;
66+ }
67+
68+ IdentityResult result = await AppUserManager . ConfirmEmailAsync ( userId , code ) ;
69+
70+ if ( result . Succeeded )
71+ return Ok ( ) ;
72+ else
73+ return GetErrorResult ( result ) ;
74+ }
75+
76+ [ Route ( "ChangePassword" ) ]
77+ public async Task < IHttpActionResult > ChangePassword ( ChangePasswordBindingModel model )
78+ {
79+ if ( ! ModelState . IsValid )
80+ return BadRequest ( ModelState ) ;
81+
82+ var userId = User . Identity . GetUserId ( ) ;
83+
84+ IdentityResult result = await AppUserManager . ChangePasswordAsync ( userId , model . OldPassword , model . NewPassword ) ;
85+
86+ if ( ! result . Succeeded )
87+ return GetErrorResult ( result ) ;
88+
89+ await AppUserManager . SendEmailAsync ( userId , "Password Change" , "Your password has been changed" ) ;
90+
91+ return Ok ( ) ;
92+ }
93+
94+ [ HttpDelete ]
95+ [ Route ( "user/{id:guid}" ) ]
96+ public async Task < IHttpActionResult > DeleteUser ( string id )
97+ {
98+ var appUser = await AppUserManager . FindByIdAsync ( id ) ;
99+
100+ if ( appUser == null )
101+ return NotFound ( ) ;
102+
103+ IdentityResult result = await AppUserManager . DeleteAsync ( appUser ) ;
104+
105+ if ( ! result . Succeeded )
106+ return GetErrorResult ( result ) ;
107+
108+ return Ok ( ) ;
109+ }
110+ }
111+ }
0 commit comments