11using System ;
22using System . Collections . Generic ;
33using System . Linq ;
4- using System . Reflection ;
54using WebExpress . WebCore ;
65using WebExpress . WebCore . WebMessage ;
76using WebExpress . WebCore . WebRestApi ;
7+ using WebExpress . WebCore . WebStatusPage ;
88using WebExpress . WebIndex ;
9- using WebExpress . WebIndex . WebAttribute ;
109using WebExpress . WebIndex . Wql ;
1110
1211namespace WebExpress . WebApp . WebRestApi
1312{
14-
1513 /// <summary>
1614 /// Abstract class providing CRUD operations for REST API.
1715 /// </summary>
1816 /// <typeparam name="TIndexItem">Type of the index item.</typeparam>
1917 public abstract class RestApiCrud < TIndexItem > : IRestApi
2018 where TIndexItem : IIndexItem
2119 {
22- /// <summary>
23- /// Returns the lock object.
24- /// </summary>
25- protected object Guard { get ; } = new object ( ) ;
26-
2720 /// <summary>
2821 /// Processing of the resource that was called via the get request.
2922 /// </summary>
3023 /// <param name="request">The request.</param>
31- /// <returns>An enumeration of which json serializer can be serialized .</returns>
32- public virtual object GetData ( Request request )
24+ /// <returns>The response containing the result of the operation .</returns>
25+ public virtual Response GetData ( Request request )
3326 {
34- var itemCount = 50 ;
35- var search = request . HasParameter ( "search" ) ? request . GetParameter ( "search" ) . Value : string . Empty ;
36- var wql = request . HasParameter ( "wql" ) ? request . GetParameter ( "wql" ) . Value : null ;
27+ var pageSize = 50 ;
28+ var filter = request . GetParameter ( "search" ) ? . Value ?? string . Empty ;
29+ var wql = request . GetParameter ( "wql" ) ? . Value ?? null ;
3730 var page = request . GetParameter ( "page" ) ;
38- var pagenumber = ! string . IsNullOrWhiteSpace ( page ? . Value ) ? Convert . ToInt32 ( page ? . Value ) : 0 ;
31+ var pageNumber = ! string . IsNullOrWhiteSpace ( page ? . Value ) ? Convert . ToInt32 ( page ? . Value ) : 0 ;
3932
40- lock ( Guard )
33+ try
4134 {
42- var wqlStatement = ! string . IsNullOrWhiteSpace ( search ) || ! string . IsNullOrWhiteSpace ( wql )
43- ? WebEx . ComponentHub . GetComponentManager < WebIndex . IndexManager > ( ) ? . Retrieve < TIndexItem > ( wql ?? $ "{ GetDefaultSearchAttribute ( ) } ='{ search } *'")
44- : WebEx . ComponentHub . GetComponentManager < WebIndex . IndexManager > ( ) ? . Retrieve < TIndexItem > ( "" ) ;
45- var data = GetData ( wqlStatement , request ) ;
35+ IEnumerable < TIndexItem > data = [ ] ;
4636
47- var count = data . Count ( ) ;
48- var totalpage = Math . Round ( count / ( double ) itemCount , MidpointRounding . ToEven ) ;
37+ if ( ! string . IsNullOrWhiteSpace ( wql ) )
38+ {
39+ var wqlStatement = WebEx . ComponentHub . GetComponentManager < WebIndex . IndexManager > ( ) ?
40+ . Retrieve < TIndexItem > ( wql ) ;
4941
50- if ( page == null )
42+ data = GetData ( wqlStatement , request ) ;
43+ }
44+ else
5145 {
52- return new { Data = data } ;
46+ data = GetData ( filter , request ) ;
5347 }
5448
55- return new { data = data . Skip ( itemCount * pagenumber ) . Take ( itemCount ) , pagination = new { pagenumber , totalpage } } ;
49+ var result = new RestApiResult ( )
50+ {
51+ Data = data . Skip ( pageSize * pageNumber ) . Take ( pageSize ) ,
52+ Pagination = new RestApiPaginationInfo ( )
53+ {
54+ PageNumber = pageNumber ,
55+ PageSize = pageSize ,
56+ TotalCount = data . Count ( )
57+ }
58+ } ;
59+
60+ return result . ToResponse ( ) ;
61+ }
62+ catch ( Exception ex )
63+ {
64+ return new ResponseBadRequest ( new StatusMessage ( $ "Error processing request.{ ex } ") ) ;
5665 }
5766 }
5867
@@ -67,11 +76,23 @@ public virtual IEnumerable<TIndexItem> GetData(IWqlStatement<TIndexItem> wql, Re
6776 throw new NotImplementedException ( ) ;
6877 }
6978
79+ /// <summary>
80+ /// Processing of the resource that was called via the get request.
81+ /// </summary>
82+ /// <param name="filter">The filtering and sorting options.</param>
83+ /// <param name="request">The request.</param>
84+ /// <returns>An enumeration of which json serializer can be serialized.</returns>
85+ public virtual IEnumerable < TIndexItem > GetData ( string filter , Request request )
86+ {
87+ throw new NotImplementedException ( ) ;
88+ }
89+
7090 /// <summary>
7191 /// Creates data.
7292 /// </summary>
7393 /// <param name="request">The request.</param>
74- public virtual void CreateData ( Request request )
94+ /// <returns>The response containing the result of the operation.</returns>
95+ public virtual Response CreateData ( Request request )
7596 {
7697 throw new NotImplementedException ( ) ;
7798 }
@@ -80,18 +101,41 @@ public virtual void CreateData(Request request)
80101 /// Updates data.
81102 /// </summary>
82103 /// <param name="request">The request.</param>
83- public virtual void UpdateData ( Request request )
104+ /// <returns>The response containing the result of the operation.</returns>
105+ public virtual Response UpdateData ( Request request )
84106 {
107+ var id = request . GetParameter ( "id" ) ? . Value ;
108+
109+ var errors = UpdateData ( id , request ) ;
110+
111+ var result = new RestApiResult ( )
112+ . AddError ( errors ) ;
113+
114+ return result . ToResponse ( ) ;
115+ }
116+
117+ /// <summary>
118+ /// Updates data.
119+ /// </summary>
120+ /// <param name="id">The id of the data to delete.</param>
121+ /// <param name="request">The request.</param>
122+ /// <returns>An enumeration of validation errors or null.</returns>
123+ public virtual IEnumerable < RestApiError > UpdateData ( string id , Request request )
124+ {
125+ return [ ] ;
85126 }
86127
87128 /// <summary>
88129 /// Deletes data.
89130 /// </summary>
90131 /// <param name="request">The request.</param>
91- public virtual void DeleteData ( Request request )
132+ /// <returns>The response containing the result of the operation.</returns>
133+ public virtual Response DeleteData ( Request request )
92134 {
93135 var id = request . GetParameter ( "id" ) ? . Value ;
94136 DeleteData ( id , request ) ;
137+
138+ return new ResponseOK ( ) ;
95139 }
96140
97141 /// <summary>
@@ -103,18 +147,5 @@ public virtual void DeleteData(string id, Request request)
103147 {
104148 throw new NotImplementedException ( ) ;
105149 }
106-
107- /// <summary>
108- /// Returns the attribute name that has been set as for search queries.
109- /// </summary>
110- /// <returns>The name of the default attribute.</returns>
111- protected virtual string GetDefaultSearchAttribute ( )
112- {
113- return typeof ( TIndexItem ) . GetProperties ( )
114- . Where ( x => x . GetCustomAttribute < IndexDefaultSearchAttribute > ( ) != null )
115- . Where ( x => x . GetCustomAttribute < IndexIgnoreAttribute > ( ) == null )
116- . Select ( x => x . Name )
117- . FirstOrDefault ( ) ;
118- }
119150 }
120151}
0 commit comments