Initial Comit
This commit is contained in:
403
DPMMobileB4X/test/MyWebApi/ProductHandler.bas
Normal file
403
DPMMobileB4X/test/MyWebApi/ProductHandler.bas
Normal file
@@ -0,0 +1,403 @@
|
||||
B4J=true
|
||||
Group=Handlers
|
||||
ModulesStructureVersion=1
|
||||
Type=Class
|
||||
Version=9.1
|
||||
@EndOfDesignText@
|
||||
' Product Handler class
|
||||
Sub Class_Globals
|
||||
Dim Request As ServletRequest
|
||||
Dim Response As ServletResponse
|
||||
Dim pool As ConnectionPool
|
||||
Dim Elements() As String
|
||||
End Sub
|
||||
|
||||
Public Sub Initialize
|
||||
|
||||
End Sub
|
||||
|
||||
Sub Handle (req As ServletRequest, resp As ServletResponse)
|
||||
Request = req
|
||||
Response = resp
|
||||
|
||||
Elements = Regex.Split("/", req.RequestURI)
|
||||
If CheckMaxElements = False Then
|
||||
Utility.ReturnError("Bad Request", 400, Response)
|
||||
Return
|
||||
End If
|
||||
If CheckAllowedVerb = False Then
|
||||
Utility.ReturnError("Method Not Allowed", 405, Response)
|
||||
Return
|
||||
End If
|
||||
ProcessRequest
|
||||
End Sub
|
||||
|
||||
Private Sub ProcessRequest
|
||||
Select Case Request.Method.ToUpperCase
|
||||
Case "GET"
|
||||
Select Case Elements.Length - 1
|
||||
Case Main.Element.Root ' /
|
||||
|
||||
Case Main.Element.Parent ' /category
|
||||
If Elements(Main.Element.Parent) = "category" Then
|
||||
GetCategories("")
|
||||
Else
|
||||
Utility.ReturnError("Bad Request", 400, Response)
|
||||
End If
|
||||
Case Main.Element.Parent_Id ' /category/{cat_id}
|
||||
If Elements(Main.Element.Parent) = "category" Then
|
||||
GetCategories(Elements(Main.Element.Parent_Id))
|
||||
Else
|
||||
Utility.ReturnError("Bad Request", 400, Response)
|
||||
End If
|
||||
Case Main.Element.Child ' /category/{cat_id}/product
|
||||
If Elements(Main.Element.Parent) = "category" And Elements(Main.Element.Child) = "product" Then
|
||||
GetProductsByCategories(Elements(Main.Element.Parent_Id), "")
|
||||
Else
|
||||
Utility.ReturnError("Bad Request", 400, Response)
|
||||
End If
|
||||
Case Main.Element.Child_Id ' /category/{cat_id}/product/{product_id}
|
||||
If Elements(Main.Element.Parent) = "category" And Elements(Main.Element.Child) = "product" Then
|
||||
GetProductsByCategories(Elements(Main.Element.Parent_Id), Elements(Main.Element.Child_Id))
|
||||
Else
|
||||
Utility.ReturnError("Bad Request", 400, Response)
|
||||
End If
|
||||
Case Else
|
||||
Utility.ReturnError("Bad Request", 400, Response)
|
||||
End Select
|
||||
Case "POST"
|
||||
Select Case Elements.Length - 1
|
||||
Case Main.Element.Parent ' /category
|
||||
If Elements(Main.Element.Parent) = "category" Then
|
||||
PostCategory
|
||||
Else
|
||||
Utility.ReturnError("Bad Request", 400, Response)
|
||||
End If
|
||||
Case Main.Element.Child ' /category/{cat_id}/product
|
||||
If Elements(Main.Element.Parent) = "category" And Elements(Main.Element.Child) = "product" Then
|
||||
PostProductByCategory(Elements(Main.Element.Parent_Id))
|
||||
Else
|
||||
Utility.ReturnError("Bad Request", 400, Response)
|
||||
End If
|
||||
Case Else
|
||||
Utility.ReturnError("Bad Request", 400, Response)
|
||||
End Select
|
||||
Case "PUT"
|
||||
Select Case Elements.Length - 1
|
||||
Case Main.Element.Parent_Id ' /category/{cat_id}
|
||||
If Elements(Main.Element.Parent) = "category" Then
|
||||
PutCategoryById(Elements(Main.Element.Parent_Id))
|
||||
Else
|
||||
Utility.ReturnError("Bad Request", 400, Response)
|
||||
End If
|
||||
Case Main.Element.Child_Id ' /category/{cat_id}/product/{product_id}
|
||||
If Elements(Main.Element.Parent) = "category" And Elements(Main.Element.Child) = "product" Then
|
||||
PutProductByCategoryAndId(Elements(Main.Element.Parent_Id), Elements(Main.Element.Child_Id))
|
||||
Else
|
||||
Utility.ReturnError("Bad Request", 400, Response)
|
||||
End If
|
||||
Case Else
|
||||
Utility.ReturnError("Bad Request", 400, Response)
|
||||
End Select
|
||||
Case "DELETE"
|
||||
Select Case Elements.Length - 1
|
||||
Case Main.Element.Parent_Id ' /category/{cat_id}
|
||||
If Elements(Main.Element.Parent) = "category" Then
|
||||
DeleteCategoryById(Elements(Main.Element.PARENT_ID))
|
||||
Else
|
||||
Utility.ReturnError("Bad Request", 400, Response)
|
||||
End If
|
||||
Case Main.Element.Child_Id ' /category/{cat_id}/product/{product_id}
|
||||
If Elements(Main.Element.Parent) = "category" And Elements(Main.Element.Child) = "product" Then
|
||||
DeleteProductsByCategoryAndId(Elements(Main.Element.Parent_Id), Elements(Main.Element.Child_Id))
|
||||
Else
|
||||
Utility.ReturnError("Bad Request", 400, Response)
|
||||
End If
|
||||
Case Else
|
||||
Utility.ReturnError("Bad Request", 400, Response)
|
||||
End Select
|
||||
End Select
|
||||
End Sub
|
||||
|
||||
Private Sub CheckMaxElements As Boolean
|
||||
If Elements.Length > Main.Element.Max_Elements Or Elements.Length = 0 Then
|
||||
Return False
|
||||
End If
|
||||
Return True
|
||||
End Sub
|
||||
|
||||
Private Sub CheckAllowedVerb As Boolean
|
||||
'Methods: POST, GET, PUT, PATCH, DELETE
|
||||
Dim SupportedMethods As List = Array As String("POST", "GET", "PUT", "DELETE")
|
||||
If SupportedMethods.IndexOf(Request.Method) = -1 Then
|
||||
Return False
|
||||
End If
|
||||
Return True
|
||||
End Sub
|
||||
|
||||
Sub OpenDB As SQL
|
||||
If Main.Conn.DbType.EqualsIgnoreCase("mysql") Then
|
||||
pool = Main.OpenConnection(pool)
|
||||
Return pool.GetConnection
|
||||
End If
|
||||
If Main.Conn.DbType.EqualsIgnoreCase("sqlite") Then
|
||||
Return Main.OpenSQLiteDB
|
||||
End If
|
||||
Return Null
|
||||
End Sub
|
||||
|
||||
Sub CloseDB (con As SQL)
|
||||
If con <> Null And con.IsInitialized Then con.Close
|
||||
If Main.Conn.DbType.EqualsIgnoreCase("mysql") Then
|
||||
If pool.IsInitialized Then pool.ClosePool
|
||||
End If
|
||||
End Sub
|
||||
|
||||
Sub GetCategories (cat_id As String)
|
||||
Dim con As SQL = OpenDB
|
||||
Dim strSQL As String
|
||||
Try
|
||||
If cat_id = "" Then
|
||||
strSQL = Main.queries.Get("GET_ALL_CATEGORIES")
|
||||
Dim res As ResultSet = con.ExecQuery(strSQL)
|
||||
Else
|
||||
strSQL = Main.queries.Get("GET_CATEGORY_BY_ID")
|
||||
Dim res As ResultSet = con.ExecQuery2(strSQL, Array As String(cat_id))
|
||||
End If
|
||||
|
||||
Dim List1 As List
|
||||
List1.Initialize
|
||||
Do While res.NextRow
|
||||
Dim Map2 As Map
|
||||
Map2.Initialize
|
||||
For i = 0 To res.ColumnCount - 1
|
||||
Map2.Put(res.GetColumnName(i), res.GetString2(i))
|
||||
Next
|
||||
List1.Add(Map2)
|
||||
Loop
|
||||
If List1.Size = 0 Then
|
||||
Utility.ReturnError("Category Not Found", 404, Response)
|
||||
Else
|
||||
Utility.ReturnSuccess2(List1, 200, Response)
|
||||
End If
|
||||
Catch
|
||||
LogDebug(LastException)
|
||||
Utility.ReturnError("Error Execute Query", 422, Response)
|
||||
End Try
|
||||
CloseDB(con)
|
||||
End Sub
|
||||
|
||||
Sub GetProductsByCategories (cat_id As String, id As String)
|
||||
Dim con As SQL = OpenDB
|
||||
Dim strSQL As String
|
||||
Try
|
||||
If id = "" Then
|
||||
strSQL = Main.queries.Get("GET_ALL_PRODUCTS_BY_CATEGORY")
|
||||
Dim res As ResultSet = con.ExecQuery2(strSQL, Array As String(cat_id))
|
||||
Else
|
||||
strSQL = Main.queries.Get("GET_PRODUCT_BY_CATEGORY_AND_ID")
|
||||
Dim res As ResultSet = con.ExecQuery2(strSQL, Array As String(cat_id, id))
|
||||
End If
|
||||
|
||||
Dim List1 As List
|
||||
List1.Initialize
|
||||
Do While res.NextRow
|
||||
Dim Map2 As Map
|
||||
Map2.Initialize
|
||||
For i = 0 To res.ColumnCount - 1
|
||||
If res.GetColumnName(i) = "product_price" Then
|
||||
Map2.Put(res.GetColumnName(i), res.GetDouble2(i))
|
||||
Else If res.GetColumnName(i) = "category_id" Or res.GetColumnName(i) = "id" Then
|
||||
Map2.Put(res.GetColumnName(i), res.GetInt2(i))
|
||||
Else
|
||||
Map2.Put(res.GetColumnName(i), res.GetString2(i))
|
||||
End If
|
||||
Next
|
||||
List1.Add(Map2)
|
||||
Loop
|
||||
If List1.Size = 0 Then
|
||||
Utility.ReturnError("Product Not Found", 404, Response)
|
||||
Else
|
||||
Utility.ReturnSuccess2(List1, 200, Response)
|
||||
End If
|
||||
Catch
|
||||
LogDebug(LastException)
|
||||
Utility.ReturnError("Error Execute Query", 422, Response)
|
||||
End Try
|
||||
CloseDB(con)
|
||||
End Sub
|
||||
|
||||
Sub PostCategory
|
||||
Dim con As SQL = OpenDB
|
||||
Dim strSQL As String
|
||||
Try
|
||||
Dim data As Map = Utility.RequestData(Request)
|
||||
If data.IsInitialized Then
|
||||
strSQL = Main.queries.Get("GET_ID_BY_CATEGORY_NAME")
|
||||
Dim res As ResultSet = con.ExecQuery2(strSQL, Array As String(data.Get("name")))
|
||||
If res.NextRow Then
|
||||
Utility.ReturnError("Category Already Exist", 409, Response)
|
||||
Else
|
||||
strSQL = Main.queries.Get("ADD_NEW_CATEGORY")
|
||||
con.BeginTransaction
|
||||
con.ExecNonQuery2(strSQL, Array As String(data.Get("name")))
|
||||
strSQL = Main.queries.Get("GET_LAST_INSERT_ID")
|
||||
Dim NewId As Int = con.ExecQuerySingleResult(strSQL)
|
||||
strSQL = Main.queries.Get("GET_CATEGORY_BY_ID")
|
||||
Dim res As ResultSet = con.ExecQuery2(strSQL, Array As String(NewId))
|
||||
con.TransactionSuccessful
|
||||
Dim List1 As List
|
||||
List1.Initialize
|
||||
Do While res.NextRow
|
||||
Dim Map2 As Map
|
||||
Map2.Initialize
|
||||
For i = 0 To res.ColumnCount - 1
|
||||
Map2.Put(res.GetColumnName(i), res.GetString2(i))
|
||||
Next
|
||||
List1.Add(Map2)
|
||||
Loop
|
||||
Utility.ReturnSuccess2(List1, 201, Response)
|
||||
'Dim URL As String = $"${Main.ROOT_URL}${Main.ROOT_PATH}category/${NewId}"$
|
||||
'Utility.ReturnLocation(URL, 201, Response)
|
||||
End If
|
||||
Else
|
||||
Utility.ReturnError("Bad Request", 400, Response)
|
||||
End If
|
||||
Catch
|
||||
LogDebug(LastException)
|
||||
Utility.ReturnError("Error Execute Query", 422, Response)
|
||||
End Try
|
||||
CloseDB(con)
|
||||
End Sub
|
||||
|
||||
Sub PostProductByCategory (cat_id As String)
|
||||
Dim con As SQL = OpenDB
|
||||
Dim strSQL As String
|
||||
Try
|
||||
strSQL = Main.queries.Get("GET_CATEGORY_BY_ID")
|
||||
Dim res As ResultSet = con.ExecQuery2(strSQL, Array As String(cat_id))
|
||||
If res.NextRow Then
|
||||
Dim data As Map = Utility.RequestData(Request)
|
||||
If data.IsInitialized Then
|
||||
strSQL = Main.queries.Get("ADD_NEW_PRODUCT_BY_CATEGORY")
|
||||
con.BeginTransaction
|
||||
con.ExecNonQuery2(strSQL, Array As String(cat_id, data.Get("code"), data.Get("name"), data.Get("price")))
|
||||
strSQL = Main.queries.Get("GET_LAST_INSERT_ID")
|
||||
Dim NewId As Int = con.ExecQuerySingleResult(strSQL)
|
||||
strSQL = Main.queries.Get("GET_PRODUCT_BY_CATEGORY_AND_ID")
|
||||
Dim res As ResultSet = con.ExecQuery2(strSQL, Array As String(cat_id, NewId))
|
||||
con.TransactionSuccessful
|
||||
Dim List1 As List
|
||||
List1.Initialize
|
||||
Do While res.NextRow
|
||||
Dim Map2 As Map
|
||||
Map2.Initialize
|
||||
For i = 0 To res.ColumnCount - 1
|
||||
Map2.Put(res.GetColumnName(i), res.GetString2(i))
|
||||
Next
|
||||
List1.Add(Map2)
|
||||
Loop
|
||||
Utility.ReturnSuccess2(List1, 201, Response)
|
||||
'Dim URL As String = $"${Main.ROOT_URL}${Main.ROOT_PATH}category/${cat_id}/${NewId}"$
|
||||
'Utility.Returnlocation(URL, 201, Response)
|
||||
Return
|
||||
End If
|
||||
Else
|
||||
Utility.ReturnError("Category Not Found", 404, Response)
|
||||
End If
|
||||
Catch
|
||||
LogDebug(LastException)
|
||||
Utility.ReturnError("Error Execute Query", 422, Response)
|
||||
End Try
|
||||
CloseDB(con)
|
||||
End Sub
|
||||
|
||||
Sub PutCategoryById (cat_id As String)
|
||||
Dim con As SQL = OpenDB
|
||||
Dim strSQL As String
|
||||
Try
|
||||
strSQL = Main.queries.Get("GET_CATEGORY_BY_ID")
|
||||
Dim res As ResultSet = con.ExecQuery2(strSQL, Array As String(cat_id))
|
||||
If res.NextRow Then
|
||||
Dim data As Map = Utility.RequestData(Request)
|
||||
If data.IsInitialized Then
|
||||
strSQL = Main.queries.Get("EDIT_CATEGORY_BY_ID")
|
||||
con.ExecNonQuery2(strSQL, Array As Object(data.Get("name"), cat_id))
|
||||
Utility.ReturnSuccess(CreateMap("result": "success"), 200, Response)
|
||||
Else
|
||||
Utility.ReturnError("Bad Request", 400, Response)
|
||||
End If
|
||||
Else
|
||||
Utility.ReturnError("Category Not Found", 404, Response)
|
||||
End If
|
||||
Catch
|
||||
LogDebug(LastException)
|
||||
Utility.ReturnError("Error Execute Query", 422, Response)
|
||||
End Try
|
||||
CloseDB(con)
|
||||
End Sub
|
||||
|
||||
Sub PutProductByCategoryAndId (cat_id As String, id As String)
|
||||
Dim con As SQL = OpenDB
|
||||
Dim strSQL As String
|
||||
Try
|
||||
strSQL = Main.queries.Get("GET_PRODUCT_BY_CATEGORY_AND_ID")
|
||||
Dim res As ResultSet = con.ExecQuery2(strSQL, Array As String(cat_id, id))
|
||||
If res.NextRow Then
|
||||
Dim data As Map = Utility.RequestData(Request)
|
||||
If data.IsInitialized Then
|
||||
strSQL = Main.queries.Get("EDIT_PRODUCT_BY_CATEGORY_AND_ID")
|
||||
con.ExecNonQuery2(strSQL, Array As Object(cat_id, data.Get("code"), data.Get("name"), data.Get("price"), cat_id, id))
|
||||
Utility.ReturnSuccess(CreateMap("result": "success"), 200, Response)
|
||||
Else
|
||||
Utility.ReturnError("Bad Request", 400, Response)
|
||||
End If
|
||||
Else
|
||||
Utility.ReturnError("Product Not Found", 404, Response)
|
||||
End If
|
||||
Catch
|
||||
LogDebug(LastException)
|
||||
Utility.ReturnError("Error Execute Query", 422, Response)
|
||||
End Try
|
||||
CloseDB(con)
|
||||
End Sub
|
||||
|
||||
Sub DeleteCategoryById (cat_id As String)
|
||||
Dim con As SQL = OpenDB
|
||||
Dim strSQL As String
|
||||
Try
|
||||
strSQL = Main.queries.Get("GET_CATEGORY_BY_ID")
|
||||
Dim res As ResultSet = con.ExecQuery2(strSQL, Array As Int(cat_id))
|
||||
If res.NextRow Then
|
||||
strSQL = Main.queries.Get("REMOVE_CATEGORY_BY_ID")
|
||||
con.ExecNonQuery2(strSQL, Array As Int(cat_id))
|
||||
Utility.ReturnSuccess(CreateMap("result": "success"), 200, Response)
|
||||
Else
|
||||
Utility.ReturnError("Category Not Found", 404, Response)
|
||||
End If
|
||||
Catch
|
||||
LogDebug(LastException)
|
||||
Utility.ReturnError("Error Execute Query", 422, Response)
|
||||
End Try
|
||||
CloseDB(con)
|
||||
End Sub
|
||||
|
||||
Sub DeleteProductsByCategoryAndId (cat_id As String, id As String)
|
||||
Dim con As SQL = OpenDB
|
||||
Dim strSQL As String
|
||||
Try
|
||||
strSQL = Main.queries.Get("GET_PRODUCT_BY_CATEGORY_AND_ID")
|
||||
Dim res As ResultSet = con.ExecQuery2(strSQL, Array As Int(cat_id, id))
|
||||
If res.NextRow Then
|
||||
strSQL = Main.queries.Get("REMOVE_PRODUCT_BY_CATEGORY_AND_ID")
|
||||
con.ExecNonQuery2(strSQL, Array As Int(cat_id, id))
|
||||
Utility.ReturnSuccess(CreateMap("result": "success"), 200, Response)
|
||||
Else
|
||||
Utility.ReturnError("Product Not Found", 404, Response)
|
||||
End If
|
||||
Catch
|
||||
LogDebug(LastException)
|
||||
Utility.ReturnError("Error Execute Query", 422, Response)
|
||||
End Try
|
||||
CloseDB(con)
|
||||
End Sub
|
||||
Reference in New Issue
Block a user