1+ using System . Security . Claims ;
2+ using AdminHubApi . Constants ;
3+ using AdminHubApi . Dtos . Orders ;
4+ using AdminHubApi . Entities ;
5+ using AdminHubApi . Interfaces ;
6+ using AdminHubApi . Security ;
7+ using Microsoft . AspNetCore . Authorization ;
8+ using Microsoft . AspNetCore . Mvc ;
9+
10+ namespace AdminHubApi . Controllers ;
11+
12+ [ ApiController ]
13+ [ Route ( "/api/orders" ) ]
14+ [ PermissionAuthorize ( Permissions . Orders . View ) ]
15+ public class OrdersController : ControllerBase
16+ {
17+ private readonly IOrderService _orderService ;
18+ private readonly ILogger < OrdersController > _logger ;
19+
20+ public OrdersController ( IOrderService orderService , ILogger < OrdersController > logger )
21+ {
22+ _orderService = orderService ;
23+ _logger = logger ;
24+ }
25+
26+ [ HttpGet ]
27+ public async Task < ActionResult < IEnumerable < OrderResponseDto > > > GetAllOrders ( )
28+ {
29+ var response = await _orderService . GetAllAsync ( ) ;
30+
31+ if ( ! response . Succeeded )
32+ {
33+ return BadRequest ( response ) ;
34+ }
35+
36+ return Ok ( response . Data ) ;
37+ }
38+
39+ [ HttpGet ( "{id}" ) ]
40+ public async Task < ActionResult < OrderResponseDto > > GetOrderById ( Guid id )
41+ {
42+ var response = await _orderService . GetByIdAsync ( id ) ;
43+
44+ if ( ! response . Succeeded )
45+ {
46+ return NotFound ( response ) ;
47+ }
48+
49+ return Ok ( response . Data ) ;
50+ }
51+
52+ [ HttpPost ]
53+ [ PermissionAuthorize ( Permissions . Orders . Create ) ]
54+ public async Task < ActionResult < OrderResponseDto > > CreateOrder ( CreateOrderDto createOrderDto )
55+ {
56+ var order = new Order
57+ {
58+ Id = Guid . NewGuid ( ) ,
59+
60+ // Include both registered user id and order-specific customer info
61+ CustomerId = createOrderDto . CustomerId ,
62+ CustomerName = createOrderDto . CustomerName ,
63+ CustomerEmail = createOrderDto . CustomerEmail ,
64+ CustomerPhone = createOrderDto . CustomerPhone ,
65+
66+ Status = createOrderDto . Status ,
67+ ShippingAddress = createOrderDto . ShippingAddress ,
68+ BillingAddress = createOrderDto . BillingAddress ,
69+ PaymentMethod = createOrderDto . PaymentMethod ,
70+ Created = DateTime . UtcNow ,
71+ CreatedById = createOrderDto . CreatedById ,
72+ Modified = DateTime . UtcNow ,
73+ ModifiedById = createOrderDto . CreatedById
74+ } ;
75+
76+ var orderItems = createOrderDto . OrderItems . Select ( item => new OrderItem
77+ {
78+ Id = Guid . NewGuid ( ) ,
79+ ProductId = item . ProductId ,
80+ Quantity = item . Quantity
81+ } ) . ToList ( ) ;
82+
83+ var response = await _orderService . CreateAsync ( order , orderItems ) ;
84+
85+ if ( ! response . Succeeded )
86+ {
87+ return BadRequest ( response ) ;
88+ }
89+
90+ return CreatedAtAction ( nameof ( GetOrderById ) , new { id = order . Id } , response . Data ) ;
91+ }
92+
93+ [ HttpPut ( "{id}" ) ]
94+ [ PermissionAuthorize ( Permissions . Orders . Edit ) ]
95+ public async Task < IActionResult > UpdateOrder ( Guid id , UpdateOrderDto updateOrderDto )
96+ {
97+ var orderResponse = await _orderService . GetByIdAsync ( id ) ;
98+
99+ if ( ! orderResponse . Succeeded )
100+ {
101+ return NotFound ( orderResponse ) ;
102+ }
103+
104+ var order = await _orderService . GetByIdAsync ( id ) ;
105+
106+ if ( ! order . Succeeded )
107+ {
108+ return NotFound ( order ) ;
109+ }
110+
111+ var existingOrder = await _orderService . GetByIdAsync ( id ) ;
112+
113+ if ( ! existingOrder . Succeeded )
114+ {
115+ return NotFound ( existingOrder ) ;
116+ }
117+
118+ var orderEntity = new Order
119+ {
120+ Id = id ,
121+
122+ // Update customer information
123+ CustomerName = updateOrderDto . CustomerName ,
124+ CustomerEmail = updateOrderDto . CustomerEmail ,
125+ CustomerPhone = updateOrderDto . CustomerPhone ,
126+
127+ OrderDate = existingOrder . Data . OrderDate ,
128+ TotalAmount = existingOrder . Data . TotalAmount ,
129+ Status = updateOrderDto . Status ,
130+ ShippingAddress = updateOrderDto . ShippingAddress ?? existingOrder . Data . ShippingAddress ,
131+ BillingAddress = updateOrderDto . BillingAddress ?? existingOrder . Data . BillingAddress ,
132+ PaymentMethod = updateOrderDto . PaymentMethod ?? existingOrder . Data . PaymentMethod ,
133+ Created = existingOrder . Data . Created ,
134+ CreatedById = existingOrder . Data . CreatedById ,
135+ Modified = DateTime . UtcNow ,
136+ ModifiedById = updateOrderDto . ModifiedById
137+ } ;
138+
139+ var updateResponse = await _orderService . UpdateAsync ( orderEntity ) ;
140+
141+ if ( ! updateResponse . Succeeded )
142+ {
143+ return BadRequest ( updateResponse ) ;
144+ }
145+
146+ return Ok ( updateResponse . Data ) ;
147+ }
148+
149+ [ HttpDelete ( "{id}" ) ]
150+ [ PermissionAuthorize ( Permissions . Orders . Delete ) ]
151+ public async Task < IActionResult > DeleteOrder ( Guid id )
152+ {
153+ var order = await _orderService . GetByIdAsync ( id ) ;
154+
155+ if ( ! order . Succeeded )
156+ {
157+ return NotFound ( order ) ;
158+ }
159+
160+ var deleteResponse = await _orderService . DeleteAsync ( id ) ;
161+
162+ if ( ! deleteResponse . Succeeded )
163+ {
164+ return BadRequest ( deleteResponse ) ;
165+ }
166+
167+ return NoContent ( ) ;
168+ }
169+
170+ [ HttpGet ( "customer/{customerId}" ) ]
171+ public async Task < ActionResult < IEnumerable < OrderResponseDto > > > GetOrdersByCustomer ( string customerId )
172+ {
173+ var response = await _orderService . GetByCustomerIdAsync ( customerId ) ;
174+
175+ if ( ! response . Succeeded )
176+ {
177+ return BadRequest ( response ) ;
178+ }
179+
180+ return Ok ( response . Data ) ;
181+ }
182+
183+ [ HttpGet ( "status/{status}" ) ]
184+ public async Task < ActionResult < IEnumerable < OrderResponseDto > > > GetOrdersByStatus ( OrderStatus status )
185+ {
186+ var response = await _orderService . GetByStatusAsync ( status ) ;
187+
188+ if ( ! response . Succeeded )
189+ {
190+ return BadRequest ( response ) ;
191+ }
192+
193+ return Ok ( response . Data ) ;
194+ }
195+
196+ [ HttpGet ( "customer-info" ) ]
197+ public async Task < ActionResult < CustomerInfo > > GetCustomerInfo ( )
198+ {
199+ var userId = User . FindFirstValue ( ClaimTypes . NameIdentifier ) ;
200+
201+ if ( string . IsNullOrEmpty ( userId ) )
202+ {
203+ return BadRequest ( "User ID not found" ) ;
204+ }
205+
206+ var response = await _orderService . GetCustomerInfoAsync ( userId ) ;
207+
208+ if ( ! response . Succeeded )
209+ {
210+ return BadRequest ( response ) ;
211+ }
212+
213+ return Ok ( response . Data ) ;
214+ }
215+ }
0 commit comments