diff --git a/.gitignore b/.gitignore
index 862ec5d1..3fb55eec 100644
--- a/.gitignore
+++ b/.gitignore
@@ -410,6 +410,6 @@ FodyWeavers.xsd
.azure
src/Services/STEMify-Backend/STEMify-Backend.AppHost/appsettings.json
src/Services/STEMify-Backend/STEMify-Backend.AppHost/appsettings.json
-docs/*
.vs/*
API/appsettings.json
+/docsShev
diff --git a/.vs/CourtManagament/DesignTimeBuild/.dtbcache.v2 b/.vs/CourtManagament/DesignTimeBuild/.dtbcache.v2
deleted file mode 100644
index 0789c3b7..00000000
Binary files a/.vs/CourtManagament/DesignTimeBuild/.dtbcache.v2 and /dev/null differ
diff --git a/.vs/CourtManagament/config/applicationhost.config b/.vs/CourtManagament/config/applicationhost.config
deleted file mode 100644
index cdd2df8f..00000000
--- a/.vs/CourtManagament/config/applicationhost.config
+++ /dev/null
@@ -1,1026 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/.vs/CourtManagament/copilot-chat/063d9464/sessions/2d2f4c42-2b39-443b-bd10-b64e879eed49 b/.vs/CourtManagament/copilot-chat/063d9464/sessions/2d2f4c42-2b39-443b-bd10-b64e879eed49
deleted file mode 100644
index ff0cb976..00000000
Binary files a/.vs/CourtManagament/copilot-chat/063d9464/sessions/2d2f4c42-2b39-443b-bd10-b64e879eed49 and /dev/null differ
diff --git a/.vs/CourtManagament/v17/.futdcache.v2 b/.vs/CourtManagament/v17/.futdcache.v2
deleted file mode 100644
index 201e6507..00000000
Binary files a/.vs/CourtManagament/v17/.futdcache.v2 and /dev/null differ
diff --git a/.vs/CourtManagament/v17/.suo b/.vs/CourtManagament/v17/.suo
deleted file mode 100644
index 4b92e250..00000000
Binary files a/.vs/CourtManagament/v17/.suo and /dev/null differ
diff --git a/.vs/CourtManagament/v17/DocumentLayout.json b/.vs/CourtManagament/v17/DocumentLayout.json
deleted file mode 100644
index 86999232..00000000
--- a/.vs/CourtManagament/v17/DocumentLayout.json
+++ /dev/null
@@ -1,265 +0,0 @@
-{
- "Version": 1,
- "WorkspaceRootPath": "C:\\FPTUNI\\5\\SWP391_Project\\",
- "Documents": [
- {
- "AbsoluteMoniker": "D:0:0:{8EA2F50E-1B7A-4722-A75D-612DC6470D35}|TestLoginAndAuthen\\UnitTests.csproj|c:\\fptuni\\5\\swp391_project\\testloginandauthen\\controllertests\\bookingcontrollertests.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
- "RelativeMoniker": "D:0:0:{8EA2F50E-1B7A-4722-A75D-612DC6470D35}|TestLoginAndAuthen\\UnitTests.csproj|solutionrelative:testloginandauthen\\controllertests\\bookingcontrollertests.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
- },
- {
- "AbsoluteMoniker": "D:0:0:{8EA2F50E-1B7A-4722-A75D-612DC6470D35}|TestLoginAndAuthen\\UnitTests.csproj|c:\\fptuni\\5\\swp391_project\\testloginandauthen\\controllertests\\authservicetests.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
- "RelativeMoniker": "D:0:0:{8EA2F50E-1B7A-4722-A75D-612DC6470D35}|TestLoginAndAuthen\\UnitTests.csproj|solutionrelative:testloginandauthen\\controllertests\\authservicetests.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
- },
- {
- "AbsoluteMoniker": "D:0:0:{79F1DFD1-89B5-4FBC-87AF-D524FCAE1A72}|Services\\Services.csproj|c:\\fptuni\\5\\swp391_project\\services\\modeltrainingservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
- "RelativeMoniker": "D:0:0:{79F1DFD1-89B5-4FBC-87AF-D524FCAE1A72}|Services\\Services.csproj|solutionrelative:services\\modeltrainingservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
- },
- {
- "AbsoluteMoniker": "D:0:0:{994C4531-032B-4181-8AC7-DFA991C89FC7}|API\\API.csproj|c:\\fptuni\\5\\swp391_project\\api\\program.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
- "RelativeMoniker": "D:0:0:{994C4531-032B-4181-8AC7-DFA991C89FC7}|API\\API.csproj|solutionrelative:api\\program.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
- },
- {
- "AbsoluteMoniker": "D:0:0:{994C4531-032B-4181-8AC7-DFA991C89FC7}|API\\API.csproj|c:\\fptuni\\5\\swp391_project\\api\\controllers\\authencontroller.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
- "RelativeMoniker": "D:0:0:{994C4531-032B-4181-8AC7-DFA991C89FC7}|API\\API.csproj|solutionrelative:api\\controllers\\authencontroller.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
- },
- {
- "AbsoluteMoniker": "D:0:0:{994C4531-032B-4181-8AC7-DFA991C89FC7}|API\\API.csproj|c:\\fptuni\\5\\swp391_project\\api\\controllers\\userscontroller.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
- "RelativeMoniker": "D:0:0:{994C4531-032B-4181-8AC7-DFA991C89FC7}|API\\API.csproj|solutionrelative:api\\controllers\\userscontroller.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
- },
- {
- "AbsoluteMoniker": "D:0:0:{79F1DFD1-89B5-4FBC-87AF-D524FCAE1A72}|Services\\Services.csproj|c:\\fptuni\\5\\swp391_project\\services\\tokenservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
- "RelativeMoniker": "D:0:0:{79F1DFD1-89B5-4FBC-87AF-D524FCAE1A72}|Services\\Services.csproj|solutionrelative:services\\tokenservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
- },
- {
- "AbsoluteMoniker": "D:0:0:{79F1DFD1-89B5-4FBC-87AF-D524FCAE1A72}|Services\\Services.csproj|c:\\fptuni\\5\\swp391_project\\services\\interface\\itokenservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
- "RelativeMoniker": "D:0:0:{79F1DFD1-89B5-4FBC-87AF-D524FCAE1A72}|Services\\Services.csproj|solutionrelative:services\\interface\\itokenservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
- },
- {
- "AbsoluteMoniker": "D:0:0:{994C4531-032B-4181-8AC7-DFA991C89FC7}|API\\API.csproj|c:\\fptuni\\5\\swp391_project\\api\\helper\\formemail.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
- "RelativeMoniker": "D:0:0:{994C4531-032B-4181-8AC7-DFA991C89FC7}|API\\API.csproj|solutionrelative:api\\helper\\formemail.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
- },
- {
- "AbsoluteMoniker": "D:0:0:{994C4531-032B-4181-8AC7-DFA991C89FC7}|API\\API.csproj|c:\\fptuni\\5\\swp391_project\\api\\controllers\\bookingscontroller.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
- "RelativeMoniker": "D:0:0:{994C4531-032B-4181-8AC7-DFA991C89FC7}|API\\API.csproj|solutionrelative:api\\controllers\\bookingscontroller.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
- },
- {
- "AbsoluteMoniker": "D:0:0:{93C92229-04F6-491E-9580-96BFD4E448A5}|DAOs\\DAOs.csproj|c:\\fptuni\\5\\swp391_project\\daos\\models\\refreshtokenmodel.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
- "RelativeMoniker": "D:0:0:{93C92229-04F6-491E-9580-96BFD4E448A5}|DAOs\\DAOs.csproj|solutionrelative:daos\\models\\refreshtokenmodel.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
- },
- {
- "AbsoluteMoniker": "D:0:0:{79F1DFD1-89B5-4FBC-87AF-D524FCAE1A72}|Services\\Services.csproj|c:\\fptuni\\5\\swp391_project\\services\\userservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
- "RelativeMoniker": "D:0:0:{79F1DFD1-89B5-4FBC-87AF-D524FCAE1A72}|Services\\Services.csproj|solutionrelative:services\\userservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
- },
- {
- "AbsoluteMoniker": "D:0:0:{93C92229-04F6-491E-9580-96BFD4E448A5}|DAOs\\DAOs.csproj|c:\\fptuni\\5\\swp391_project\\daos\\courtcallerdbcontext.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
- "RelativeMoniker": "D:0:0:{93C92229-04F6-491E-9580-96BFD4E448A5}|DAOs\\DAOs.csproj|solutionrelative:daos\\courtcallerdbcontext.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
- },
- {
- "AbsoluteMoniker": "D:0:0:{994C4531-032B-4181-8AC7-DFA991C89FC7}|API\\API.csproj|c:\\fptuni\\5\\swp391_project\\api\\appsettings.json||{90A6B3A7-C1A3-4009-A288-E2FF89E96FA0}",
- "RelativeMoniker": "D:0:0:{994C4531-032B-4181-8AC7-DFA991C89FC7}|API\\API.csproj|solutionrelative:api\\appsettings.json||{90A6B3A7-C1A3-4009-A288-E2FF89E96FA0}"
- }
- ],
- "DocumentGroupContainers": [
- {
- "Orientation": 0,
- "VerticalTabListWidth": 256,
- "DocumentGroups": [
- {
- "DockedWidth": 200,
- "SelectedChildIndex": 5,
- "Children": [
- {
- "$type": "Bookmark",
- "Name": "ST:1:0:{e8b06f52-6d01-11d2-aa7d-00c04f990343}"
- },
- {
- "$type": "Bookmark",
- "Name": "ST:0:0:{1c64b9c2-e352-428e-a56d-0ace190b99a6}"
- },
- {
- "$type": "Bookmark",
- "Name": "ST:0:0:{3ae79031-e1bc-11d0-8f78-00a0c9110057}"
- },
- {
- "$type": "Bookmark",
- "Name": "ST:0:0:{0174dea2-fdbe-4ef1-8f99-c0beae78880f}"
- },
- {
- "$type": "Bookmark",
- "Name": "ST:0:0:{aa2115a1-9712-457b-9047-dbb71ca2cdd2}"
- },
- {
- "$type": "Document",
- "DocumentIndex": 0,
- "Title": "BookingControllerTests.cs",
- "DocumentMoniker": "C:\\FPTUNI\\5\\SWP391_Project\\TestLoginAndAuthen\\ControllerTests\\BookingControllerTests.cs",
- "RelativeDocumentMoniker": "TestLoginAndAuthen\\ControllerTests\\BookingControllerTests.cs",
- "ToolTip": "C:\\FPTUNI\\5\\SWP391_Project\\TestLoginAndAuthen\\ControllerTests\\BookingControllerTests.cs",
- "RelativeToolTip": "TestLoginAndAuthen\\ControllerTests\\BookingControllerTests.cs",
- "ViewState": "AgIAAAsAAAAAAAAAAAAQwBYAAAAAAAAAAAAAAA==",
- "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
- "WhenOpened": "2024-09-18T02:55:20.398Z",
- "EditorCaption": ""
- },
- {
- "$type": "Document",
- "DocumentIndex": 1,
- "Title": "AuthServiceTests.cs",
- "DocumentMoniker": "C:\\FPTUNI\\5\\SWP391_Project\\TestLoginAndAuthen\\ControllerTests\\AuthServiceTests.cs",
- "RelativeDocumentMoniker": "TestLoginAndAuthen\\ControllerTests\\AuthServiceTests.cs",
- "ToolTip": "C:\\FPTUNI\\5\\SWP391_Project\\TestLoginAndAuthen\\ControllerTests\\AuthServiceTests.cs",
- "RelativeToolTip": "TestLoginAndAuthen\\ControllerTests\\AuthServiceTests.cs",
- "ViewState": "AgIAAAAAAAAAAAAAAAAAAD8AAAAQAAAAAAAAAA==",
- "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
- "WhenOpened": "2024-09-18T02:54:04.73Z"
- },
- {
- "$type": "Document",
- "DocumentIndex": 2,
- "Title": "ModelTrainingService.cs",
- "DocumentMoniker": "C:\\FPTUNI\\5\\SWP391_Project\\Services\\ModelTrainingService.cs",
- "RelativeDocumentMoniker": "Services\\ModelTrainingService.cs",
- "ToolTip": "C:\\FPTUNI\\5\\SWP391_Project\\Services\\ModelTrainingService.cs",
- "RelativeToolTip": "Services\\ModelTrainingService.cs",
- "ViewState": "AgIAAAAAAAAAAAAAAAAAAA4AAAAJAAAAAAAAAA==",
- "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
- "WhenOpened": "2024-08-10T09:19:47.7Z"
- },
- {
- "$type": "Document",
- "DocumentIndex": 3,
- "Title": "Program.cs",
- "DocumentMoniker": "C:\\FPTUNI\\5\\SWP391_Project\\API\\Program.cs",
- "RelativeDocumentMoniker": "API\\Program.cs",
- "ToolTip": "C:\\FPTUNI\\5\\SWP391_Project\\API\\Program.cs",
- "RelativeToolTip": "API\\Program.cs",
- "ViewState": "AQIAANMAAAAAAAAAAAAQwOUAAAAFAAAA",
- "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
- "WhenOpened": "2024-08-07T10:50:18.29Z"
- },
- {
- "$type": "Document",
- "DocumentIndex": 7,
- "Title": "ITokenService.cs",
- "DocumentMoniker": "C:\\FPTUNI\\5\\SWP391_Project\\Services\\Interface\\ITokenService.cs",
- "RelativeDocumentMoniker": "Services\\Interface\\ITokenService.cs",
- "ToolTip": "C:\\FPTUNI\\5\\SWP391_Project\\Services\\Interface\\ITokenService.cs",
- "RelativeToolTip": "Services\\Interface\\ITokenService.cs",
- "ViewState": "AQIAAAAAAAAAAAAAAAAAAAsAAAAZAAAA",
- "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
- "WhenOpened": "2024-08-07T10:40:26.971Z"
- },
- {
- "$type": "Document",
- "DocumentIndex": 6,
- "Title": "TokenService.cs",
- "DocumentMoniker": "C:\\FPTUNI\\5\\SWP391_Project\\Services\\TokenService.cs",
- "RelativeDocumentMoniker": "Services\\TokenService.cs",
- "ToolTip": "C:\\FPTUNI\\5\\SWP391_Project\\Services\\TokenService.cs",
- "RelativeToolTip": "Services\\TokenService.cs",
- "ViewState": "AQIAAD4AAAAAAAAAAAAQwE8AAAA1AAAA",
- "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
- "WhenOpened": "2024-08-07T10:36:56.959Z"
- },
- {
- "$type": "Document",
- "DocumentIndex": 5,
- "Title": "UsersController.cs",
- "DocumentMoniker": "C:\\FPTUNI\\5\\SWP391_Project\\API\\Controllers\\UsersController.cs",
- "RelativeDocumentMoniker": "API\\Controllers\\UsersController.cs",
- "ToolTip": "C:\\FPTUNI\\5\\SWP391_Project\\API\\Controllers\\UsersController.cs",
- "RelativeToolTip": "API\\Controllers\\UsersController.cs",
- "ViewState": "AQIAACcAAAAAAAAAAAArwCAAAAAIAAAA",
- "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
- "WhenOpened": "2024-08-07T08:38:54.048Z"
- },
- {
- "$type": "Document",
- "DocumentIndex": 4,
- "Title": "AuthenController.cs",
- "DocumentMoniker": "C:\\FPTUNI\\5\\SWP391_Project\\API\\Controllers\\AuthenController.cs",
- "RelativeDocumentMoniker": "API\\Controllers\\AuthenController.cs",
- "ToolTip": "C:\\FPTUNI\\5\\SWP391_Project\\API\\Controllers\\AuthenController.cs",
- "RelativeToolTip": "API\\Controllers\\AuthenController.cs",
- "ViewState": "AQIAAOIBAAAAAAAAAAAtwPEBAAAIAAAA",
- "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
- "WhenOpened": "2024-08-07T08:02:55.775Z"
- },
- {
- "$type": "Document",
- "DocumentIndex": 8,
- "Title": "FormEmail.cs",
- "DocumentMoniker": "C:\\FPTUNI\\5\\SWP391_Project\\API\\Helper\\FormEmail.cs",
- "RelativeDocumentMoniker": "API\\Helper\\FormEmail.cs",
- "ToolTip": "C:\\FPTUNI\\5\\SWP391_Project\\API\\Helper\\FormEmail.cs",
- "RelativeToolTip": "API\\Helper\\FormEmail.cs",
- "ViewState": "AQIAAAAAAAAAAAAAAAAAAAkAAAAAAAAA",
- "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
- "WhenOpened": "2024-08-07T09:52:34.245Z"
- },
- {
- "$type": "Document",
- "DocumentIndex": 9,
- "Title": "BookingsController.cs",
- "DocumentMoniker": "C:\\FPTUNI\\5\\SWP391_Project\\API\\Controllers\\BookingsController.cs",
- "RelativeDocumentMoniker": "API\\Controllers\\BookingsController.cs",
- "ToolTip": "C:\\FPTUNI\\5\\SWP391_Project\\API\\Controllers\\BookingsController.cs",
- "RelativeToolTip": "API\\Controllers\\BookingsController.cs",
- "ViewState": "AQIAABsAAAAAAAAAAAAAwDEAAAAAAAAA",
- "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
- "WhenOpened": "2024-08-07T08:02:55.814Z"
- },
- {
- "$type": "Document",
- "DocumentIndex": 10,
- "Title": "RefreshTokenModel.cs",
- "DocumentMoniker": "C:\\FPTUNI\\5\\SWP391_Project\\DAOs\\Models\\RefreshTokenModel.cs",
- "RelativeDocumentMoniker": "DAOs\\Models\\RefreshTokenModel.cs",
- "ToolTip": "C:\\FPTUNI\\5\\SWP391_Project\\DAOs\\Models\\RefreshTokenModel.cs",
- "RelativeToolTip": "DAOs\\Models\\RefreshTokenModel.cs",
- "ViewState": "AQIAAAAAAAAAAAAAAAAuwAsAAAAiAAAA",
- "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
- "WhenOpened": "2024-08-07T09:28:48.878Z"
- },
- {
- "$type": "Document",
- "DocumentIndex": 11,
- "Title": "UserService.cs",
- "DocumentMoniker": "C:\\FPTUNI\\5\\SWP391_Project\\Services\\UserService.cs",
- "RelativeDocumentMoniker": "Services\\UserService.cs",
- "ToolTip": "C:\\FPTUNI\\5\\SWP391_Project\\Services\\UserService.cs",
- "RelativeToolTip": "Services\\UserService.cs",
- "ViewState": "AQIAAEEAAAAAAAAAAAAowFAAAAAoAAAA",
- "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
- "WhenOpened": "2024-08-02T15:14:18.479Z"
- },
- {
- "$type": "Document",
- "DocumentIndex": 12,
- "Title": "CourtCallerDbContext.cs",
- "DocumentMoniker": "C:\\FPTUNI\\5\\SWP391_Project\\DAOs\\CourtCallerDbContext.cs",
- "RelativeDocumentMoniker": "DAOs\\CourtCallerDbContext.cs",
- "ToolTip": "C:\\FPTUNI\\5\\SWP391_Project\\DAOs\\CourtCallerDbContext.cs",
- "RelativeToolTip": "DAOs\\CourtCallerDbContext.cs",
- "ViewState": "AQIAACcAAAAAAAAAAIA7wCsAAAAMAAAA",
- "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
- "WhenOpened": "2024-08-07T08:04:14.494Z"
- },
- {
- "$type": "Document",
- "DocumentIndex": 13,
- "Title": "appsettings.json",
- "DocumentMoniker": "C:\\FPTUNI\\5\\SWP391_Project\\API\\appsettings.json",
- "RelativeDocumentMoniker": "API\\appsettings.json",
- "ToolTip": "C:\\FPTUNI\\5\\SWP391_Project\\API\\appsettings.json",
- "RelativeToolTip": "API\\appsettings.json",
- "ViewState": "AQIAABIAAAAAAAAAAAAAACwAAAADAAAA",
- "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.001642|",
- "WhenOpened": "2024-08-02T15:11:05.445Z"
- }
- ]
- }
- ]
- }
- ]
-}
\ No newline at end of file
diff --git a/API/API.csproj b/API/API.csproj
index e6d7f199..49953512 100644
--- a/API/API.csproj
+++ b/API/API.csproj
@@ -1,24 +1,21 @@
-
net8.0
enable
enable
- <_FunctionsSkipCleanOutput>true
+ <_FunctionsSkipCleanOutput>true
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
@@ -29,13 +26,12 @@
-
-
+
True
+
-
diff --git a/API/API.csproj.user b/API/API.csproj.user
deleted file mode 100644
index d5912f9f..00000000
--- a/API/API.csproj.user
+++ /dev/null
@@ -1,18 +0,0 @@
-
-
-
- https
- <_SelectedScaffolderID>ApiControllerWithContextScaffolder
- <_SelectedScaffolderCategoryPath>root/Common/Api
- 650
- True
- False
- True
-
- BusinessObjects.CourtCallerDbContext
- False
- MvcControllerEmptyScaffolder
- root/Common/MVC/Controller
- C:\FPTUNI\5\SWP391_Project\API\Properties\PublishProfiles\CourtCaller - Web Deploy.pubxml
-
-
\ No newline at end of file
diff --git a/API/Controllers/AuthenController.cs b/API/Controllers/AuthenController.cs
index 7967e9dc..c5cee087 100644
--- a/API/Controllers/AuthenController.cs
+++ b/API/Controllers/AuthenController.cs
@@ -1,28 +1,22 @@
using System.IdentityModel.Tokens.Jwt;
+using System.Net;
using System.Security.Claims;
using System.Text;
using Azure;
using BusinessObjects;
+using DAOs.Helper;
using DAOs.Models;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Identity;
using Microsoft.AspNetCore.Mvc;
-using DAOs.Helper;
-using Services;
-using Repositories.Helper;
-using Services.Interface;
+using Microsoft.AspNetCore.WebUtilities;
using Microsoft.VisualStudio.Web.CodeGenerators.Mvc.Templates.BlazorIdentity.Pages.Manage;
using NuGet.Common;
-using System.Net;
-using Microsoft.AspNetCore.WebUtilities;
+using Repositories.Helper;
+using Services;
+using Services.Interface;
using StackExchange.Redis;
-
-
-
-
-
-
namespace API.Controllers
{
[Route("api/authentication")]
@@ -37,8 +31,14 @@ public class AuthenticationController : Controller
private readonly IConfiguration _configuration;
private readonly IMailService _mailService;
-
- public AuthenticationController(UserManager userManager, RoleManager roleManager, IConfiguration configuration, IMailService mailService, ITokenService tokenService, IConnectionMultiplexer redis)
+ public AuthenticationController(
+ UserManager userManager,
+ RoleManager roleManager,
+ IConfiguration configuration,
+ IMailService mailService,
+ ITokenService tokenService,
+ IConnectionMultiplexer redis
+ )
{
_userManager = userManager;
_roleManager = roleManager;
@@ -53,24 +53,43 @@ public AuthenticationController(UserManager userManager, RoleManag
public async Task Login([FromBody] LoginModel model)
{
if (ValidatePassword.ValidatePass(model.Password) == false)
- return StatusCode(StatusCodes.Status500InternalServerError, new ResponseModel { Status = "Error", Message = "Password format is incorrect." });
- if (model.Email == null || model.Password == null || model.Email == "" || model.Password == "")
- return StatusCode(StatusCodes.Status500InternalServerError, new ResponseModel { Status = "Error", Message = "Email or password is empty." });
+ return StatusCode(
+ StatusCodes.Status500InternalServerError,
+ new ResponseModel
+ {
+ Status = "Error",
+ Message = "Password format is incorrect.",
+ }
+ );
+ if (
+ model.Email == null
+ || model.Password == null
+ || model.Email == ""
+ || model.Password == ""
+ )
+ return StatusCode(
+ StatusCodes.Status500InternalServerError,
+ new ResponseModel { Status = "Error", Message = "Email or password is empty." }
+ );
//var ip = Utils.GetIpAddress(HttpContext);
var user = await _userManager.FindByEmailAsync(model.Email);
if (user == null)
{
- return
- StatusCode(StatusCodes.Status500InternalServerError, new ResponseModel { Status = "Error", Message = "User not found!" });
+ return StatusCode(
+ StatusCodes.Status500InternalServerError,
+ new ResponseModel { Status = "Error", Message = "User not found!" }
+ );
}
//check if user is banned
//if (BanList.BannedUsers.Contains(ip) || userDetail.Status == false)
if (user.LockoutEnabled == false)
{
- return
- StatusCode(StatusCodes.Status500InternalServerError, new ResponseModel { Status = "Error", Message = "User is banned!" });
+ return StatusCode(
+ StatusCodes.Status500InternalServerError,
+ new ResponseModel { Status = "Error", Message = "User is banned!" }
+ );
}
else
{
@@ -84,12 +103,14 @@ public async Task Login([FromBody] LoginModel model)
string token = generateToken.Item1;
DateTime dateTime = generateToken.Item2;
_userService.SendJwtToRedis(token);
- return Ok(new
- {
- Token = token,
- RefreshToken = _tokenService.GenerateRefreshToken(),
- ExpiredTime = dateTime
- });
+ return Ok(
+ new
+ {
+ Token = token,
+ RefreshToken = _tokenService.GenerateRefreshToken(),
+ ExpiredTime = dateTime,
+ }
+ );
}
else
{
@@ -117,19 +138,25 @@ public async Task Register([FromBody] RegisterModel model)
{
var userExists = await _userManager.FindByEmailAsync(model.Email);
if (userExists != null)
- return StatusCode(StatusCodes.Status500InternalServerError, new ResponseModel { Status = "Error", Message = "User already exists!" });
+ return StatusCode(
+ StatusCodes.Status500InternalServerError,
+ new ResponseModel { Status = "Error", Message = "User already exists!" }
+ );
IdentityUser user = new IdentityUser()
{
Email = model.Email,
SecurityStamp = Guid.NewGuid().ToString(),
- UserName = model.Email
+ UserName = model.Email,
};
var result = await _userManager.CreateAsync(user, model.Password);
if (!result.Succeeded)
{
var errors = result.Errors.Select(e => e.Description);
- return StatusCode(StatusCodes.Status400BadRequest, new ResponseModel { Status = "Error", Message = string.Join(" ", errors) });
+ return StatusCode(
+ StatusCodes.Status400BadRequest,
+ new ResponseModel { Status = "Error", Message = string.Join(" ", errors) }
+ );
}
if (!await _roleManager.RoleExistsAsync("Customer"))
@@ -162,21 +189,25 @@ public async Task Register([FromBody] RegisterModel model)
UserId = user.Id,
Point = 0,
FullName = model.FullName,
- ProfilePicture = $"https://firebasestorage.googleapis.com/v0/b/court-callers.appspot.com/o/UserImage%2F2b24782f-6bef-439a-b46a-57feb2bd38f5?alt=media&token=54e5cc04-60ff-40d6-923d-1ccd3953a9b6"
-
+ ProfilePicture =
+ $"https://firebasestorage.googleapis.com/v0/b/court-callers.appspot.com/o/UserImage%2F2b24782f-6bef-439a-b46a-57feb2bd38f5?alt=media&token=54e5cc04-60ff-40d6-923d-1ccd3953a9b6",
};
_userDetailService.AddUserDetail(userDetail);
- return Ok(new ResponseModel() { Status = "Success", Message = "User created successfully!" });
+ return Ok(
+ new ResponseModel() { Status = "Success", Message = "User created successfully!" }
+ );
}
-
[HttpGet]
[Route("confirm-email")]
public async Task ConfirmEmail(string email, string token)
{
var user = await _userManager.FindByEmailAsync(email);
if (user == null)
- return StatusCode(StatusCodes.Status400BadRequest, new ResponseModel { Status = "Error", Message = "Invalid email." });
+ return StatusCode(
+ StatusCodes.Status400BadRequest,
+ new ResponseModel { Status = "Error", Message = "Invalid email." }
+ );
var base64 = WebEncoders.Base64UrlDecode(token);
var decodedToken = Encoding.UTF8.GetString(base64);
Console.WriteLine("code nhận: " + token);
@@ -184,50 +215,60 @@ public async Task ConfirmEmail(string email, string token)
var result = _userManager.ConfirmEmailAsync(user, decodedToken);
if (!result.IsCompleted)
- return StatusCode(StatusCodes.Status400BadRequest, new ResponseModel { Status = "Error", Message = "Email confirmation failed." });
+ return StatusCode(
+ StatusCodes.Status400BadRequest,
+ new ResponseModel { Status = "Error", Message = "Email confirmation failed." }
+ );
await _userManager.AddToRoleAsync(user, "Customer");
UserDetail userDetail = new UserDetail()
{
UserId = user.Id,
Point = 0,
- FullName = user.UserName, // Replace with actual full name if available
- ProfilePicture = $"https://firebasestorage.googleapis.com/v0/b/court-callers.appspot.com/o/user.jpg?alt=media&token=3601d057-9503-4cc8-b203-2eb0b89f900d"
+ FullName = user.UserName, // Replace with actual full name if available
+ ProfilePicture =
+ $"https://firebasestorage.googleapis.com/v0/b/court-callers.appspot.com/o/user.jpg?alt=media&token=3601d057-9503-4cc8-b203-2eb0b89f900d",
};
_userDetailService.AddUserDetail(userDetail);
- return Ok(new ResponseModel() { Status = "Success", Message = "Email confirmed successfully!" });
-
+ return Ok(
+ new ResponseModel()
+ {
+ Status = "Success",
+ Message = "Email confirmed successfully!",
+ }
+ );
}
-
-
-
[HttpPost]
[Route("register-admin")]
-
public async Task RegisterAdmin([FromBody] RegisterModel model)
{
var userExists = await _userManager.FindByEmailAsync(model.Email);
if (userExists != null)
- return StatusCode(StatusCodes.Status500InternalServerError, new ResponseModel { Status = "Error", Message = "User already exists!" });
+ return StatusCode(
+ StatusCodes.Status500InternalServerError,
+ new ResponseModel { Status = "Error", Message = "User already exists!" }
+ );
IdentityUser user = new IdentityUser()
{
Email = model.Email,
SecurityStamp = Guid.NewGuid().ToString(),
- UserName = model.Email
+ UserName = model.Email,
};
var result = await _userManager.CreateAsync(user, model.Password);
if (!result.Succeeded)
{
var errors = result.Errors.Select(e => e.Description);
- return StatusCode(StatusCodes.Status400BadRequest, new ResponseModel { Status = "Error", Message = string.Join(" ", errors) });
+ return StatusCode(
+ StatusCodes.Status400BadRequest,
+ new ResponseModel { Status = "Error", Message = string.Join(" ", errors) }
+ );
}
if (!await _roleManager.RoleExistsAsync("Admin"))
await _roleManager.CreateAsync(new IdentityRole("Admin"));
-
await _userManager.AddToRoleAsync(user, "Admin");
UserDetail userDetail = new UserDetail()
@@ -235,36 +276,39 @@ public async Task RegisterAdmin([FromBody] RegisterModel model)
UserId = user.Id,
Point = 0,
FullName = model.FullName,
-
};
_userDetailService.AddUserDetail(userDetail);
- return Ok(new ResponseModel { Status = "Success", Message = "User created successfully!" });
+ return Ok(
+ new ResponseModel { Status = "Success", Message = "User created successfully!" }
+ );
}
-
-
-
-
[HttpPost]
[Route("register-staff")]
public async Task RegisterStaff([FromBody] RegisterModel model)
{
var userExists = await _userManager.FindByEmailAsync(model.Email);
if (userExists != null)
- return StatusCode(StatusCodes.Status500InternalServerError, new ResponseModel { Status = "Error", Message = "User already exists!" });
+ return StatusCode(
+ StatusCodes.Status500InternalServerError,
+ new ResponseModel { Status = "Error", Message = "User already exists!" }
+ );
IdentityUser user = new IdentityUser()
{
Email = model.Email,
SecurityStamp = Guid.NewGuid().ToString(),
- UserName = model.Email
+ UserName = model.Email,
};
var result = await _userManager.CreateAsync(user, model.Password);
if (!result.Succeeded)
{
var errors = result.Errors.Select(e => e.Description);
- return StatusCode(StatusCodes.Status400BadRequest, new ResponseModel { Status = "Error", Message = string.Join(" ", errors) });
+ return StatusCode(
+ StatusCodes.Status400BadRequest,
+ new ResponseModel { Status = "Error", Message = string.Join(" ", errors) }
+ );
}
if (!await _roleManager.RoleExistsAsync("Staff"))
@@ -277,15 +321,14 @@ public async Task RegisterStaff([FromBody] RegisterModel model)
UserId = user.Id,
Point = 0,
FullName = model.FullName,
-
};
_userDetailService.AddUserDetail(userDetail);
- return Ok(new ResponseModel { Status = "Success", Message = "Staff created successfully!" });
+ return Ok(
+ new ResponseModel { Status = "Success", Message = "Staff created successfully!" }
+ );
}
-
-
[HttpPost]
[Route("google-login")]
public async Task GoogleLogin(string token)
@@ -303,7 +346,7 @@ public async Task GoogleLogin(string token)
{
Email = email,
UserName = email,
- SecurityStamp = Guid.NewGuid().ToString()
+ SecurityStamp = Guid.NewGuid().ToString(),
};
await _userManager.CreateAsync(user);
UserDetail userDetail = new UserDetail()
@@ -311,21 +354,17 @@ public async Task GoogleLogin(string token)
UserId = user.Id,
Point = 0,
FullName = name,
- ProfilePicture = picture
+ ProfilePicture = picture,
//Id = user.Id
};
_userDetailService.AddUserDetail(userDetail);
await _userManager.AddToRoleAsync(user, "Customer");
-
}
var roles = await _userManager.GetRolesAsync(user);
var userRole = roles.FirstOrDefault();
- return Ok(new
- {
- Token = _tokenService.GenerateToken(user, userRole)
- });
+ return Ok(new { Token = _tokenService.GenerateToken(user, userRole) });
}
//Facebook Login
@@ -346,7 +385,7 @@ public async Task FacebookLogin(string token)
{
Email = email,
UserName = email,
- SecurityStamp = Guid.NewGuid().ToString()
+ SecurityStamp = Guid.NewGuid().ToString(),
};
await _userManager.CreateAsync(user);
UserDetail userDetail = new UserDetail()
@@ -354,25 +393,18 @@ public async Task FacebookLogin(string token)
UserId = user.Id,
Point = 0,
FullName = name,
- ProfilePicture = picture
+ ProfilePicture = picture,
};
_userDetailService.AddUserDetail(userDetail);
await _userManager.AddToRoleAsync(user, "Customer");
-
}
var roles = await _userManager.GetRolesAsync(user);
var userRole = roles.FirstOrDefault();
- return Ok(new
- {
- Token = _tokenService.GenerateToken(user, userRole)
- });
+ return Ok(new { Token = _tokenService.GenerateToken(user, userRole) });
}
-
-
-
//ForgetPassword
[HttpPost]
[Route("forget-password")]
@@ -380,22 +412,36 @@ public async Task ForgetPassword([FromBody] ForgetPasswordModel m
{
var user = await _userManager.FindByEmailAsync(model.Email);
if (user == null)
- return StatusCode(StatusCodes.Status404NotFound, new ResponseModel { Status = "Error", Message = "User does not exist!" });
+ return StatusCode(
+ StatusCodes.Status404NotFound,
+ new ResponseModel { Status = "Error", Message = "User does not exist!" }
+ );
var token = await _userManager.GeneratePasswordResetTokenAsync(user);
var base64 = Encoding.UTF8.GetBytes(token);
var encodeToken = WebEncoders.Base64UrlEncode(base64);
- var callbackUrl = Url.Action("ResetPassword", "Authentication", new { token = encodeToken, email = user.Email }, Request.Scheme);
+ var callbackUrl = Url.Action(
+ "ResetPassword",
+ "Authentication",
+ new { token = encodeToken, email = user.Email },
+ Request.Scheme
+ );
var mailRequest = new MailRequest
{
ToEmail = user.Email,
Subject = "Court Caller Confirmation Email (Reset Password)",
- Body = API.Helper.FormEmail.EnailContent(user.Email, callbackUrl)
+ Body = API.Helper.FormEmail.EnailContent(user.Email, callbackUrl),
};
await _mailService.SendEmailAsync(mailRequest);
- return Ok(new ResponseModel { Status = "Success", Message = "Reset password link has been sent to your email address." });
+ return Ok(
+ new ResponseModel
+ {
+ Status = "Success",
+ Message = "Reset password link has been sent to your email address.",
+ }
+ );
}
[HttpGet]
@@ -420,27 +466,27 @@ public async Task ResetPassword(string token, string email)
//}
// Redirect to the React app's reset password page with token and email
- var resetPasswordUrl = $"https://localhost:3000/reset-password?token={token}&email={email}";
+ var resetPasswordUrl =
+ $"https://localhost:3000/reset-password?token={token}&email={email}";
return Redirect(resetPasswordUrl);
}
-
-
//ResetPassword
[HttpPost]
[Route("reset-password")]
public async Task ResetPassword([FromBody] ResetPasswordModel model)
{
-
-
var user = await _userManager.FindByEmailAsync(model.Email);
if (user == null)
return RedirectToAction("ResetPasswordConfirmation", "Authentication");
var base64 = WebEncoders.Base64UrlDecode(model.Token);
var decodedToken = Encoding.UTF8.GetString(base64);
- var resetPassResult = await _userManager.ResetPasswordAsync(user, decodedToken, model.Password);
-
+ var resetPassResult = await _userManager.ResetPasswordAsync(
+ user,
+ decodedToken,
+ model.Password
+ );
if (!resetPassResult.Succeeded)
{
@@ -448,11 +494,18 @@ public async Task ResetPassword([FromBody] ResetPasswordModel mod
{
ModelState.AddModelError(string.Empty, error.Description);
}
- return BadRequest(new ResponseModel { Status = "Error", Message = "Something Wrong, Please Try Again" });
+ return BadRequest(
+ new ResponseModel
+ {
+ Status = "Error",
+ Message = "Something Wrong, Please Try Again",
+ }
+ );
}
return Ok(new ResponseModel { Status = "Complele", Message = "Confirmed" });
}
+
[HttpPost("refresh")]
public async Task RefreshToken([FromBody] RefreshTokenModel model)
{
@@ -460,8 +513,12 @@ public async Task RefreshToken([FromBody] RefreshTokenModel model
{
var handler = new JwtSecurityTokenHandler();
var jsonToken = handler.ReadToken(model.Token) as JwtSecurityToken;
- var emailClaim = jsonToken?.Claims.FirstOrDefault(claim => claim.Type == ClaimTypes.Email);
- var email = jsonToken?.Claims.FirstOrDefault(claim => claim.Type == "email").ToString();
+ var emailClaim = jsonToken?.Claims.FirstOrDefault(claim =>
+ claim.Type == ClaimTypes.Email
+ );
+ var email = jsonToken
+ ?.Claims.FirstOrDefault(claim => claim.Type == "email")
+ .ToString();
var cleanEmail = email.Replace("email: ", "").Trim();
if (_userService.IsBlacklisted(model.Token, model.RefreshToken))
{
@@ -469,7 +526,7 @@ public async Task RefreshToken([FromBody] RefreshTokenModel model
{
ToEmail = cleanEmail,
Subject = "Court Callers Warning Email",
- Body = API.Helper.FormEmail.WarningLogin(cleanEmail)
+ Body = API.Helper.FormEmail.WarningLogin(cleanEmail),
};
return BadRequest(new { Message = "Warning Email" });
}
@@ -484,12 +541,14 @@ public async Task RefreshToken([FromBody] RefreshTokenModel model
string token = generateToken.Item1;
DateTime expiredTime = generateToken.Item2;
var refreshToken = _tokenService.GenerateRefreshToken();
- return Ok(new
- {
- Token = token,
- RefreshToken = refreshToken,
- ExpiredTime = expiredTime
- });
+ return Ok(
+ new
+ {
+ Token = token,
+ RefreshToken = refreshToken,
+ ExpiredTime = expiredTime,
+ }
+ );
}
catch (Exception ex)
{
diff --git a/API/Controllers/BookingsController.cs b/API/Controllers/BookingsController.cs
index 9508e059..b85de0d2 100644
--- a/API/Controllers/BookingsController.cs
+++ b/API/Controllers/BookingsController.cs
@@ -1,29 +1,28 @@
using System;
using System.Collections.Generic;
+using System.IdentityModel.Tokens.Jwt;
using System.Linq;
using System.Threading.Tasks;
-using Microsoft.AspNetCore.Http;
-using Microsoft.AspNetCore.Mvc;
-using Microsoft.EntityFrameworkCore;
+using API.Helper;
using BusinessObjects;
using DAOs.Models;
-using Services;
using Microsoft.AspNetCore.Authorization;
+using Microsoft.AspNetCore.Http;
+using Microsoft.AspNetCore.Identity;
+using Microsoft.AspNetCore.Mvc;
+using Microsoft.EntityFrameworkCore;
+using Newtonsoft.Json;
using QRCoder;
-using Page = DAOs.Helper;
using Repositories;
-using Newtonsoft.Json;
-using Qr = API.Helper;
-using API.Helper;
-using Microsoft.AspNetCore.Identity;
+using Services;
using Services.Interface;
-using System.IdentityModel.Tokens.Jwt;
+using Page = DAOs.Helper;
+using Qr = API.Helper;
+
namespace API.Controllers
{
[Route("api/[controller]")]
[ApiController]
-
-
public class BookingsController : ControllerBase
{
private readonly IBookingService _bookingService;
@@ -39,47 +38,44 @@ public IActionResult GetCurrentTime()
var currentUtcTime = DateTime.UtcNow;
var currentLocalTime = DateTime.Now; // Thời gian cục bộ trên máy chủ
- return Ok(new
- {
- UtcTime = currentUtcTime,
- LocalTime = currentLocalTime,
- TimeZone = TimeZoneInfo.Local.StandardName
- });
+ return Ok(
+ new
+ {
+ UtcTime = currentUtcTime,
+ LocalTime = currentLocalTime,
+ TimeZone = TimeZoneInfo.Local.StandardName,
+ }
+ );
}
-
[HttpGet("CheckAuthor")]
[Authorize(Roles = "Staff")]
public IActionResult GetProtectedData()
{
var claims = User.Claims;
- var expiryClaim = claims.FirstOrDefault(c => c.Type == JwtRegisteredClaimNames.Exp)?.Value;
+ var expiryClaim = claims
+ .FirstOrDefault(c => c.Type == JwtRegisteredClaimNames.Exp)
+ ?.Value;
// Logging expiration claim
Console.WriteLine($"Token Expiry: {expiryClaim}");
return Ok("This is protected data.");
}
+
// GET: api/Bookings
[HttpGet]
[Authorize(Roles = "Admin,Staff")]
- public async Task>> GetBookings([FromQuery] int pageNumber = 1,
+ public async Task>> GetBookings(
+ [FromQuery] int pageNumber = 1,
[FromQuery] int pageSize = 10,
- [FromQuery] string searchQuery = null)
+ [FromQuery] string searchQuery = null
+ )
{
-
- var pageResult = new Page.PageResult
- {
- PageSize = pageSize,
- PageNumber = pageNumber,
- };
+ var pageResult = new Page.PageResult { PageSize = pageSize, PageNumber = pageNumber };
var (bookings, total) = await _bookingService.GetBookings(pageResult, searchQuery);
- var response = new PagingResponse
- {
- Data = bookings,
- Total = total
- };
+ var response = new PagingResponse { Data = bookings, Total = total };
return Ok(response);
}
@@ -130,9 +126,6 @@ public async Task> GetBookingByUserId(string userId)
// POST: api/Bookings
// To protect from overposting attacks, see https://go.microsoft.com/fwlink/?linkid=2123754
-
-
-
// DELETE: api/Bookings/5
[HttpDelete("{id}")]
[Authorize]
@@ -163,28 +156,29 @@ public async Task>> GetBookingsByStatus(string
[HttpGet("search/{start}/{end}")]
[Authorize]
- public async Task>> SearchBookingsByTime(DateTime start, DateTime end)
+ public async Task>> SearchBookingsByTime(
+ DateTime start,
+ DateTime end
+ )
{
return _bookingService.SearchBookingsByTime(start, end).ToList();
}
[HttpGet("search/{userId}")]
[Authorize]
- public async Task>> GetBookingsByUser(string userId,
- [FromQuery] int pageNumber = 1, [FromQuery] int pageSize = 10)
+ public async Task>> GetBookingsByUser(
+ string userId,
+ [FromQuery] int pageNumber = 1,
+ [FromQuery] int pageSize = 10
+ )
{
- var pageResult = new Page.PageResult
- {
- PageNumber = pageNumber,
- PageSize = pageSize
- };
+ var pageResult = new Page.PageResult { PageNumber = pageNumber, PageSize = pageSize };
List bookings = await _bookingService.GetBookingsByUserId(userId, pageResult);
return Ok(bookings);
}
-
//[HttpPost("reserve")]
//public async Task ReserveSlot(string[] slotId, string userId)
//{
@@ -210,6 +204,7 @@ public async Task ReserveSlotV2(SlotModel[] slotModels, string us
return StatusCode(500, ex.Message);
}
}
+
[HttpDelete("cancel/{bookingId}")]
public async Task CancelBooking(string bookingId)
{
@@ -226,12 +221,13 @@ public async Task CancelBooking(string bookingId)
catch (Exception ex)
{
// Handle other unexpected exceptions
- return StatusCode(500, new { error = "An error occurred while cancelling the booking." });
+ return StatusCode(
+ 500,
+ new { error = "An error occurred while cancelling the booking." }
+ );
}
}
-
-
[HttpDelete("delete/{bookingId}")]
[Authorize]
public async Task DeleteBookingAndSetTimeSlot(string bookingId)
@@ -249,33 +245,48 @@ public async Task DeleteBookingAndSetTimeSlot(string bookingId)
//post booking type flex
[HttpPost("flex")]
[Authorize]
- public async Task> PostBookingTypeFlex(string userId, int numberOfSlot, string branchId)
+ public async Task> PostBookingTypeFlex(
+ string userId,
+ int numberOfSlot,
+ string branchId
+ )
{
-
var booking = _bookingService.AddBookingTypeFlex(userId, numberOfSlot, branchId);
return CreatedAtAction("GetBooking", new { id = booking.BookingId }, booking);
}
[HttpPost("fix-slot")]
[Authorize]
- public async Task PostBookingTypeFix([FromQuery] int numberOfMonths,
- [FromQuery] string[] dayOfWeek, [FromQuery] DateOnly startDate, [FromBody] TimeSlotModel[] timeSlotModel,
- [FromQuery] string userId, string branchId)
+ public async Task PostBookingTypeFix(
+ [FromQuery] int numberOfMonths,
+ [FromQuery] string[] dayOfWeek,
+ [FromQuery] DateOnly startDate,
+ [FromBody] TimeSlotModel[] timeSlotModel,
+ [FromQuery] string userId,
+ string branchId
+ )
{
- var booking = await _bookingService.AddBookingTypeFix(numberOfMonths, dayOfWeek, startDate, timeSlotModel, userId,
- branchId);
+ var booking = await _bookingService.AddBookingTypeFix(
+ numberOfMonths,
+ dayOfWeek,
+ startDate,
+ timeSlotModel,
+ userId,
+ branchId
+ );
return booking is not null ? Ok(booking) : BadRequest("Fail to reserve slot type fix");
}
[HttpGet("sortBooking/{sortBy}")]
[Authorize]
- public async Task>> SortBookings(string sortBy, bool isAsc, [FromQuery] int pageNumber = 1, [FromQuery] int pageSize = 10)
+ public async Task>> SortBookings(
+ string sortBy,
+ bool isAsc,
+ [FromQuery] int pageNumber = 1,
+ [FromQuery] int pageSize = 10
+ )
{
- var pageResult = new Page.PageResult
- {
- PageNumber = pageNumber,
- PageSize = pageSize
- };
+ var pageResult = new Page.PageResult { PageNumber = pageNumber, PageSize = pageSize };
List bookings = await _bookingService.SortBookings(sortBy, isAsc, pageResult);
@@ -300,13 +311,16 @@ public async Task>> SortBookings(string sortBy
[HttpGet("checkbookingtypeflex")]
[Authorize]
- public ActionResult CheckAvaiableSlotsFromBookingTypeFlex(string userId, string branchId)
+ public ActionResult CheckAvaiableSlotsFromBookingTypeFlex(
+ string userId,
+ string branchId
+ )
{
var bookingFlexModel = _bookingService.NumberOfSlotsAvailable(userId, branchId);
var result = new CheckBookingTypeFlexModel
{
bookingId = bookingFlexModel.Item1,
- numberOfSlot = bookingFlexModel.Item2
+ numberOfSlot = bookingFlexModel.Item2,
};
return Ok(result);
@@ -324,18 +338,13 @@ public async Task GetQRCode(string bookingId)
return NotFound("Booking not found.");
}
-
// "bookingId": "12345",
//"userId": "67890",
//"branchId": "B001",
//"courtId": "C002",
//"slotDate": "2024-07-01", nên tạo các thứ này
- var qrData = new
- {
- BookingId = booking.Result.BookingId,
-
- };
+ var qrData = new { BookingId = booking.Result.BookingId };
string qrString = JsonConvert.SerializeObject(qrData);
string qrCodeBase64 = Qr.QrCode.GenerateQRCode(qrString);
@@ -344,7 +353,6 @@ public async Task GetQRCode(string bookingId)
[HttpGet("daily-bookings")]
[Authorize]
-
public async Task> GetDailyBookings(string? branchId)
{
var (todayCount, changePercentage) = await _bookingService.GetDailyBookings(branchId);
@@ -352,23 +360,24 @@ public async Task> GetDailyBookings(string? b
var response = new DailyBookingResponse
{
TodayCount = todayCount,
- ChangePercentage = changePercentage
+ ChangePercentage = changePercentage,
};
return Ok(response);
}
-
[HttpGet("weekly-bookings")]
[Authorize]
public async Task> GetWeeklyBookings(string? branchId)
{
- var (weeklyCount, changePercentage) = await _bookingService.GetWeeklyBookingsAsync(branchId);
+ var (weeklyCount, changePercentage) = await _bookingService.GetWeeklyBookingsAsync(
+ branchId
+ );
var response = new DailyBookingResponse
{
TodayCount = weeklyCount,
- ChangePercentage = changePercentage
+ ChangePercentage = changePercentage,
};
return Ok(response);
@@ -378,12 +387,14 @@ public async Task> GetWeeklyBookings(string?
[Authorize]
public async Task> GetMonthlyBookings(string? branchId)
{
- var (monthlyCount, changePercentage) = await _bookingService.GetMonthlyBookingsAsync(branchId);
+ var (monthlyCount, changePercentage) = await _bookingService.GetMonthlyBookingsAsync(
+ branchId
+ );
var response = new DailyBookingResponse
{
TodayCount = monthlyCount,
- ChangePercentage = changePercentage
+ ChangePercentage = changePercentage,
};
return Ok(response);
@@ -403,8 +414,8 @@ public async Task GetBookingsFromStartOfWeek(string? branchId)
return StatusCode(500, "Internal server error");
}
}
- [HttpGet("weekly-bookings-from-start-of-month")]
+ [HttpGet("weekly-bookings-from-start-of-month")]
public async Task GetWeeklyBookingsFromStartOfMonth(string? branchId)
{
try
@@ -414,7 +425,6 @@ public async Task GetWeeklyBookingsFromStartOfMonth(string? branc
}
catch (Exception ex)
{
-
return StatusCode(500, "Internal server error");
}
}
@@ -443,7 +453,7 @@ public async Task> GetDailyRevenue(string? branchI
var response = new RevenueResponse
{
Revenue = todayRevenue,
- ChangePercentage = changePercentage
+ ChangePercentage = changePercentage,
};
return Ok(response);
@@ -453,12 +463,14 @@ public async Task> GetDailyRevenue(string? branchI
[Authorize]
public async Task> GetWeeklyRevenue(string? branchId)
{
- var (weeklyRevenue, changePercentage) = await _bookingService.GetWeeklyRevenueAsync(branchId);
+ var (weeklyRevenue, changePercentage) = await _bookingService.GetWeeklyRevenueAsync(
+ branchId
+ );
var response = new RevenueResponse
{
Revenue = weeklyRevenue,
- ChangePercentage = changePercentage
+ ChangePercentage = changePercentage,
};
return Ok(response);
@@ -468,12 +480,14 @@ public async Task> GetWeeklyRevenue(string? branch
[Authorize]
public async Task> GetMonthlyRevenue(string? branchId)
{
- var (monthlyRevenue, changePercentage) = await _bookingService.GetMonthlyRevenueAsync(branchId);
+ var (monthlyRevenue, changePercentage) = await _bookingService.GetMonthlyRevenueAsync(
+ branchId
+ );
var response = new RevenueResponse
{
Revenue = monthlyRevenue,
- ChangePercentage = changePercentage
+ ChangePercentage = changePercentage,
};
return Ok(response);
@@ -523,7 +537,5 @@ public async Task GetMonthlyRevenueFromStartOfYear(string? branch
return StatusCode(500, "Internal server error");
}
}
-
-
}
}
diff --git a/API/Controllers/BranchesController.cs b/API/Controllers/BranchesController.cs
index 6d601958..82f536d2 100644
--- a/API/Controllers/BranchesController.cs
+++ b/API/Controllers/BranchesController.cs
@@ -1,27 +1,26 @@
using System;
using System.Collections.Generic;
using System.Linq;
+using System.Text.Json;
using System.Threading.Tasks;
-using Microsoft.AspNetCore.Http;
-using Microsoft.AspNetCore.Mvc;
-using Microsoft.EntityFrameworkCore;
using BusinessObjects;
-using Repositories;
-using Services;
-using Microsoft.AspNetCore.Authorization;
using DAOs.Helper;
using DAOs.Models;
-using Firebase.Storage;
using Firebase.Auth;
-using System.Text.Json;
+using Firebase.Storage;
using MailKit.Search;
+using Microsoft.AspNetCore.Authorization;
+using Microsoft.AspNetCore.Http;
+using Microsoft.AspNetCore.Mvc;
+using Microsoft.EntityFrameworkCore;
+using Repositories;
+using Services;
using static Microsoft.ApplicationInsights.MetricDimensionNames.TelemetryContext;
namespace API.Controllers
{
[Route("api/[controller]")]
[ApiController]
-
public class BranchesController : ControllerBase
{
private readonly BranchService _branchService;
@@ -32,50 +31,46 @@ public BranchesController()
}
// GET: api/Branches
-
+
[HttpGet]
- public async Task>> GetBranches([FromQuery] int pageNumber = 1, [FromQuery] int pageSize = 10, [FromQuery] string searchQuery = null)
+ public async Task>> GetBranches(
+ [FromQuery] int pageNumber = 1,
+ [FromQuery] int pageSize = 10,
+ [FromQuery] string searchQuery = null
+ )
{
- var pageResult = new PageResult
- {
- PageNumber = pageNumber,
- PageSize = pageSize
- };
+ var pageResult = new PageResult { PageNumber = pageNumber, PageSize = pageSize };
- var (branches,total) = await _branchService.GetBranches(pageResult,searchQuery);
+ var (branches, total) = await _branchService.GetBranches(pageResult, searchQuery);
- var response = new PagingResponse
- {
- Data = branches,
- Total = total
- };
-
+ var response = new PagingResponse { Data = branches, Total = total };
return Ok(response);
}
+
[HttpGet("HomePage")]
- public async Task>> GetBranches([FromQuery] int pageNumber = 1, [FromQuery] int pageSize = 10, [FromQuery] string status = "Active", [FromQuery] string searchQuery = null)
+ public async Task>> GetBranches(
+ [FromQuery] int pageNumber = 1,
+ [FromQuery] int pageSize = 10,
+ [FromQuery] string status = "Active",
+ [FromQuery] string searchQuery = null
+ )
{
- var pageResult = new PageResult
- {
- PageNumber = pageNumber,
- PageSize = pageSize
- };
+ var pageResult = new PageResult { PageNumber = pageNumber, PageSize = pageSize };
- var (branches,total) = await _branchService.GetBranches(pageResult, status, searchQuery);
+ var (branches, total) = await _branchService.GetBranches(
+ pageResult,
+ status,
+ searchQuery
+ );
- var response = new PagingResponse
- {
- Data = branches,
- Total = total
- };
-
+ var response = new PagingResponse { Data = branches, Total = total };
return Ok(response);
}
// GET: api/Branches/5
-
+
[HttpGet("{id}")]
public async Task> GetBranch(string id)
{
@@ -93,8 +88,12 @@ public async Task> GetBranch(string id)
// To protect from overposting attacks, see https://go.microsoft.com/fwlink/?linkid=2123754
[HttpPut("{id}")]
- [Authorize(Roles="Admin")]
- public async Task PutBranch(string id, [FromForm] PutBranch branchModel, [FromForm] List ExistingImages)
+ [Authorize(Roles = "Admin")]
+ public async Task PutBranch(
+ string id,
+ [FromForm] PutBranch branchModel,
+ [FromForm] List ExistingImages
+ )
{
var branch = _branchService.GetBranch(id);
if (branch == null)
@@ -102,10 +101,10 @@ public async Task PutBranch(string id, [FromForm] PutBranch branc
return NotFound();
}
-
- Console.WriteLine("Existing Images: " + string.Join(", ", ExistingImages ?? new List()));
+ Console.WriteLine(
+ "Existing Images: " + string.Join(", ", ExistingImages ?? new List())
+ );
-
var existingImageUrls = ExistingImages ?? new List();
var imageUrls = new List(existingImageUrls);
@@ -144,8 +143,6 @@ public async Task PutBranch(string id, [FromForm] PutBranch branc
return CreatedAtAction("GetBranch", new { id = branch.BranchId }, branch);
}
-
-
// POST: api/Branches
//[HttpPost]
@@ -156,7 +153,6 @@ public async Task PutBranch(string id, [FromForm] PutBranch branc
// return CreatedAtAction("GetBranch", new { id = branch.BranchId }, branch);
//}
-
[HttpPost]
[Authorize(Roles = "Admin")]
public async Task> PostBranch([FromForm] BranchModel branchModel)
@@ -228,82 +224,73 @@ public async Task> GetLastBranch(string userId)
}
[HttpGet("sortBranch/{sortBy}")]
- public async Task>> SortBranch(string sortBy, bool isAsc, [FromQuery] int pageNumber = 1, [FromQuery] int pageSize = 10)
+ public async Task>> SortBranch(
+ string sortBy,
+ bool isAsc,
+ [FromQuery] int pageNumber = 1,
+ [FromQuery] int pageSize = 10
+ )
{
- var pageResult = new PageResult
- {
- PageNumber = pageNumber,
- PageSize = pageSize
- };
+ var pageResult = new PageResult { PageNumber = pageNumber, PageSize = pageSize };
return await _branchService.SortBranch(sortBy, isAsc, pageResult);
}
[HttpGet("sortBranchByDistance")]
- public async Task>> SortBranchByDistance([FromQuery] LocationModel user, [FromQuery] int pageNumber = 1, [FromQuery] int pageSize = 10)
+ public async Task>> SortBranchByDistance(
+ [FromQuery] LocationModel user,
+ [FromQuery] int pageNumber = 1,
+ [FromQuery] int pageSize = 10
+ )
{
- var pageResult = new PageResult
- {
- PageNumber = pageNumber,
- PageSize = pageSize
- };
+ var pageResult = new PageResult { PageNumber = pageNumber, PageSize = pageSize };
var (branches, total) = await _branchService.SortBranchByDistance(user, pageResult);
if (total == 0)
{
return NotFound("No branches found or unable to sort branches by distance.");
}
- var response = new PagingResponse
- {
- Data = branches,
- Total = total
- };
+ var response = new PagingResponse { Data = branches, Total = total };
return Ok(response);
}
[HttpGet("GetBranchByPrice/{minPrice}&&{maxPrice}")]
- public async Task>> GetBranchByPrice([FromQuery] decimal minPrice = 0, [FromQuery] decimal maxPrice = 200, [FromQuery] int pageNumber = 1, [FromQuery] int pageSize = 10)
+ public async Task>> GetBranchByPrice(
+ [FromQuery] decimal minPrice = 0,
+ [FromQuery] decimal maxPrice = 200,
+ [FromQuery] int pageNumber = 1,
+ [FromQuery] int pageSize = 10
+ )
{
-
- var pageResult = new PageResult
- {
- PageNumber = pageNumber,
- PageSize = pageSize
- };
- var (branches, total) = await _branchService.GetBranchByPrice(minPrice, maxPrice, pageResult);
+ var pageResult = new PageResult { PageNumber = pageNumber, PageSize = pageSize };
+ var (branches, total) = await _branchService.GetBranchByPrice(
+ minPrice,
+ maxPrice,
+ pageResult
+ );
if (total == 0)
{
return NotFound("No branches found.");
}
- var response = new PagingResponse
- {
- Data = branches,
- Total = total
- };
+ var response = new PagingResponse { Data = branches, Total = total };
return Ok(response);
}
[HttpGet("GetBranchByRating/{rating}")]
- public async Task>> GetBranchByRating([FromQuery] int rating = 5, [FromQuery] int pageNumber = 1, [FromQuery] int pageSize = 10)
+ public async Task>> GetBranchByRating(
+ [FromQuery] int rating = 5,
+ [FromQuery] int pageNumber = 1,
+ [FromQuery] int pageSize = 10
+ )
{
-
- var pageResult = new PageResult
- {
- PageNumber = pageNumber,
- PageSize = pageSize
- };
+ var pageResult = new PageResult { PageNumber = pageNumber, PageSize = pageSize };
var (branches, total) = await _branchService.GetBranchByRating(rating, pageResult);
if (total == 0)
{
return NotFound("No branches found.");
}
- var response = new PagingResponse
- {
- Data = branches,
- Total = total
- };
+ var response = new PagingResponse { Data = branches, Total = total };
return Ok(response);
}
-
}
}
diff --git a/API/Controllers/CourtsController.cs b/API/Controllers/CourtsController.cs
index e4207bf8..d697cafd 100644
--- a/API/Controllers/CourtsController.cs
+++ b/API/Controllers/CourtsController.cs
@@ -2,17 +2,14 @@
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
+using BusinessObjects;
+using DAOs.Helper;
+using DAOs.Models;
+using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
-using BusinessObjects;
using Services;
-using Microsoft.AspNetCore.Authorization;
-using DAOs.Helper;
-using DAOs.Models;
-
-
-
namespace API.Controllers
{
@@ -29,21 +26,16 @@ public CourtsController()
// GET: api/Courts
[HttpGet]
- public async Task>> GetCourts([FromQuery] int pageNumber = 1, [FromQuery] int pageSize = 10, [FromQuery] string searchQuery = null)
+ public async Task>> GetCourts(
+ [FromQuery] int pageNumber = 1,
+ [FromQuery] int pageSize = 10,
+ [FromQuery] string searchQuery = null
+ )
{
- var pageResult = new PageResult
- {
- PageNumber = pageNumber,
- PageSize = pageSize
- };
+ var pageResult = new PageResult { PageNumber = pageNumber, PageSize = pageSize };
- var (court,total) = await _courtService.GetCourts(pageResult, searchQuery);
- var response = new PagingResponse
- {
- Data = court,
- Total = total
-
- };
+ var (court, total) = await _courtService.GetCourts(pageResult, searchQuery);
+ var response = new PagingResponse { Data = court, Total = total };
return Ok(response);
}
@@ -84,7 +76,6 @@ public async Task PutCourt(string id, CourtModel courtModel)
[Authorize(Roles = "Admin")]
public async Task> PostCourt(CourtModel courtModel)
{
-
var court = _courtService.AddCourt(courtModel);
return CreatedAtAction("GetCourt", new { id = court.CourtId }, court);
@@ -118,13 +109,14 @@ public async Task>> GetCourtsByStatus(string sta
}
[HttpGet("{sortBy}")]
- public async Task>> SortCourt(string sortBy, bool isAsc, [FromQuery] int pageNumber = 1, [FromQuery] int pageSize = 10)
+ public async Task>> SortCourt(
+ string sortBy,
+ bool isAsc,
+ [FromQuery] int pageNumber = 1,
+ [FromQuery] int pageSize = 10
+ )
{
- var pageResult = new PageResult
- {
- PageNumber = pageNumber,
- PageSize = pageSize
- };
+ var pageResult = new PageResult { PageNumber = pageNumber, PageSize = pageSize };
return await _courtService.SortCourt(sortBy, isAsc, pageResult);
}
@@ -152,22 +144,22 @@ public ActionResult> AvailableCourts([FromBody] SlotModel slo
}
[HttpGet("GetCourtsByBranchId")]
- public async Task>> GetCourtsByBranchId([FromQuery] string branchId, [FromQuery] int pageNumber = 1, [FromQuery] int pageSize = 10, [FromQuery] string searchQuery = null)
+ public async Task>> GetCourtsByBranchId(
+ [FromQuery] string branchId,
+ [FromQuery] int pageNumber = 1,
+ [FromQuery] int pageSize = 10,
+ [FromQuery] string searchQuery = null
+ )
{
- var pageResult = new PageResult
- {
- PageNumber = pageNumber,
- PageSize = pageSize
- };
- var (court,total) = await _courtService.GetCourtsByBranchId(branchId, pageResult, searchQuery);
- var response = new PagingResponse
- {
- Data = court,
- Total = total
- };
-
+ var pageResult = new PageResult { PageNumber = pageNumber, PageSize = pageSize };
+ var (court, total) = await _courtService.GetCourtsByBranchId(
+ branchId,
+ pageResult,
+ searchQuery
+ );
+ var response = new PagingResponse { Data = court, Total = total };
+
return Ok(response);
}
-
}
}
diff --git a/API/Controllers/LocationController.cs b/API/Controllers/LocationController.cs
index ec8274f2..3b69e501 100644
--- a/API/Controllers/LocationController.cs
+++ b/API/Controllers/LocationController.cs
@@ -1,5 +1,5 @@
-using DAOs.Models;
-using DAOs.Helper;
+using DAOs.Helper;
+using DAOs.Models;
using Microsoft.AspNetCore.Mvc;
using static QRCoder.PayloadGenerator;
@@ -9,14 +9,12 @@ namespace API.Controllers
[ApiController]
public class LocationController : ControllerBase
{
-
[HttpPost]
public IActionResult Post([FromBody] LocationModel location)
{
return Ok(new { message = "Location received successfully", location });
}
-
[HttpPost("get-geolocation")]
public async Task GetGeolocation([FromBody] string addressModel)
{
@@ -24,34 +22,33 @@ public async Task GetGeolocation([FromBody] string addressModel)
{
var geolocation = await GeocodingService.GetGeocodeAsync(addressModel);
return Ok(geolocation);
-
}
catch (Exception ex)
{
return BadRequest(new { message = ex.Message });
}
}
-
+
[HttpPost("pathdistance")]
public async Task GetRouteDistanceAsync(LocationModel user)
{
try
{
- var s = await LocationService.GetRouteDistanceAsync(user, new LocationModel
- {
- Latitude = 10.875323976132528,
- Longitude = 106.80076631184579
- });
+ var s = await LocationService.GetRouteDistanceAsync(
+ user,
+ new LocationModel
+ {
+ Latitude = 10.875323976132528,
+ Longitude = 106.80076631184579,
+ }
+ );
return Ok(s);
-
}
catch (Exception ex)
{
return BadRequest(new { message = ex.Message });
}
}
-
-
}
}
diff --git a/API/Controllers/MailController.cs b/API/Controllers/MailController.cs
index 8ad05dc7..f83df297 100644
--- a/API/Controllers/MailController.cs
+++ b/API/Controllers/MailController.cs
@@ -10,6 +10,7 @@ namespace API.Controllers
public class MailController : ControllerBase
{
private readonly IMailService _mailService;
+
public MailController(IMailService mailService)
{
_mailService = mailService;
diff --git a/API/Controllers/NewsController.cs b/API/Controllers/NewsController.cs
index a3c8c257..6ed6d63c 100644
--- a/API/Controllers/NewsController.cs
+++ b/API/Controllers/NewsController.cs
@@ -1,11 +1,11 @@
-using BusinessObjects;
+using System.Text.Json;
+using BusinessObjects;
using DAOs.Helper;
using DAOs.Models;
using Firebase.Storage;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Services;
-using System.Text.Json;
namespace API.Controllers
{
@@ -21,36 +21,35 @@ public NewsController()
}
[HttpGet]
- public async Task>> GetNews([FromQuery] int pageNumber = 1, [FromQuery] int pageSize = 10, [FromQuery] string searchQuery = null)
+ public async Task>> GetNews(
+ [FromQuery] int pageNumber = 1,
+ [FromQuery] int pageSize = 10,
+ [FromQuery] string searchQuery = null
+ )
{
- var pageResult = new PageResult
- {
- PageNumber = pageNumber,
- PageSize = pageSize
- };
+ var pageResult = new PageResult { PageNumber = pageNumber, PageSize = pageSize };
var (news, total) = await newsService.GetNews(pageResult, searchQuery);
- var response = new PagingResponse
- {
- Data = news,
- Total = total
- };
+ var response = new PagingResponse { Data = news, Total = total };
return Ok(response);
}
[HttpGet("NewsPage")]
- public async Task>> GetNews([FromQuery] int pageNumber = 1, [FromQuery] int pageSize = 10, [FromQuery] bool IsHomepageSlideshow = true, [FromQuery] string status = "Active", [FromQuery] string searchQuery = null)
+ public async Task>> GetNews(
+ [FromQuery] int pageNumber = 1,
+ [FromQuery] int pageSize = 10,
+ [FromQuery] bool IsHomepageSlideshow = true,
+ [FromQuery] string status = "Active",
+ [FromQuery] string searchQuery = null
+ )
{
- var pageResult = new PageResult
- {
- PageNumber = pageNumber,
- PageSize = pageSize
- };
- var (news, total) = await newsService.GetNews(pageResult, IsHomepageSlideshow, status, searchQuery);
- var response = new PagingResponse
- {
- Data = news,
- Total = total
- };
+ var pageResult = new PageResult { PageNumber = pageNumber, PageSize = pageSize };
+ var (news, total) = await newsService.GetNews(
+ pageResult,
+ IsHomepageSlideshow,
+ status,
+ searchQuery
+ );
+ var response = new PagingResponse { Data = news, Total = total };
return Ok(response);
}
@@ -100,7 +99,6 @@ public async Task PutNew(string id, NewsModel news)
[Authorize(Roles = "Admin")]
public async Task> PostNew(NewsModel newsModel)
{
-
var file = newsModel.NewsImage;
var fileName = Guid.NewGuid() + Path.GetExtension(file.FileName);
@@ -117,7 +115,6 @@ public async Task> PostNew(NewsModel newsModel)
var newNews = newsService.AddNew(newsModel);
return CreatedAtAction("GetNew", new { id = newNews.NewId }, newNews);
-
}
[HttpDelete("{id}")]
@@ -127,7 +124,5 @@ public async Task DeleteNew(string id)
newsService.DeleteNew(id);
return NoContent();
}
-
-
}
}
diff --git a/API/Controllers/PaymentsController.cs b/API/Controllers/PaymentsController.cs
index e7d30555..b3d80d30 100644
--- a/API/Controllers/PaymentsController.cs
+++ b/API/Controllers/PaymentsController.cs
@@ -2,15 +2,15 @@
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
+using BusinessObjects;
+using DAOs.Helper;
+using DAOs.Models;
+using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
-using BusinessObjects;
-using DAOs.Helper;
using Services;
-using DAOs.Models;
using Services.Interface;
-using Microsoft.AspNetCore.Authorization;
namespace API.Controllers
{
@@ -23,7 +23,6 @@ public class PaymentsController : ControllerBase
public PaymentsController(TokenForPayment tokenForPayment)
{
-
_tokenForPayment = tokenForPayment;
}
@@ -37,56 +36,37 @@ public async Task>> GetPayments()
[HttpGet("GetPayments")]
[Authorize]
-
- public async Task>> GetPayments([FromQuery] int pageNumber = 1,
- [FromQuery] int pageSize = 10)
+ public async Task>> GetPayments(
+ [FromQuery] int pageNumber = 1,
+ [FromQuery] int pageSize = 10
+ )
{
-
- var pageResult = new PageResult
- {
- PageSize = pageSize,
- PageNumber = pageNumber,
- };
+ var pageResult = new PageResult { PageSize = pageSize, PageNumber = pageNumber };
var (payments, total) = await _paymentService.GetPayments(pageResult);
- var response = new PagingResponse
- {
- Data = payments,
- Total = total
- };
+ var response = new PagingResponse { Data = payments, Total = total };
return Ok(response);
}
[HttpGet("GetPaymentsByDate")]
[Authorize]
public async Task>> GetPaymentsByDate(
- [FromQuery] int? day,
- [FromQuery] int? month,
+ [FromQuery] int? day,
+ [FromQuery] int? month,
[FromQuery] int? year,
- [FromQuery] int pageNumber = 1,
+ [FromQuery] int pageNumber = 1,
[FromQuery] int pageSize = 10
- )
+ )
{
-
- var pageResult = new PageResult
- {
- PageSize = pageSize,
- PageNumber = pageNumber,
- };
+ var pageResult = new PageResult { PageSize = pageSize, PageNumber = pageNumber };
var (payments, total) = await _paymentService.GetPayments(pageResult, day, month, year);
- var response = new PagingResponse
- {
- Data = payments,
- Total = total
- };
+ var response = new PagingResponse { Data = payments, Total = total };
return Ok(response);
}
-
[HttpGet("bookingid/{bookingId}")]
[Authorize]
-
public async Task> GetPaymentByBookingId(string bookingId)
{
var payment = _paymentService.GetPaymentByBookingId(bookingId);
@@ -102,7 +82,6 @@ public async Task> GetPaymentByBookingId(string bookingId)
// GET: api/Payments/5
[HttpGet("{id}")]
[Authorize]
-
public async Task> GetPayment(string id)
{
var payment = _paymentService.GetPayment(id);
@@ -150,7 +129,6 @@ public async Task> GetPayment(string id)
// To protect from overposting attacks, see https://go.microsoft.com/fwlink/?linkid=2123754
[HttpPost]
[Authorize]
-
public async Task> PostPayment(Payment payment)
{
_paymentService.AddPayment(payment);
@@ -161,7 +139,6 @@ public async Task> PostPayment(Payment payment)
// DELETE: api/Payments/5
[HttpDelete("{id}")]
[Authorize]
-
public async Task DeletePayment(string id)
{
var payment = _paymentService.GetPayment(id);
@@ -182,13 +159,14 @@ public async Task DeletePayment(string id)
[HttpGet("SearchByDate")]
[Authorize]
-
- public async Task>> SearchByDate(DateTime start, DateTime end)
+ public async Task>> SearchByDate(
+ DateTime start,
+ DateTime end
+ )
{
return _paymentService.SearchByDate(start, end);
}
-
[HttpGet("GeneratePaymentToken/{bookingId}")]
public IActionResult GeneratePaymentToken(string bookingId)
{
@@ -197,7 +175,7 @@ public IActionResult GeneratePaymentToken(string bookingId)
}
[HttpPost("ProcessPayment")]
- public async Task ProcessPayment(string role ,string token)
+ public async Task ProcessPayment(string role, string token)
{
//if (bookingId == null)
//{
@@ -208,7 +186,7 @@ public async Task ProcessPayment(string role ,string token)
// });
//}
var bookingId = _tokenForPayment.ValidateToken(token);
- var response = await _paymentService.ProcessBookingPayment(role,bookingId);
+ var response = await _paymentService.ProcessBookingPayment(role, bookingId);
return Ok(response);
}
@@ -217,7 +195,6 @@ public async Task ProcessPaymentByBalance(string token)
{
try
{
-
var bookingId = _tokenForPayment.ValidateToken(token);
var response = await _paymentService.ProcessBookingPaymentByBalance(bookingId);
if (response.Status == "Error")
@@ -225,7 +202,9 @@ public async Task ProcessPaymentByBalance(string token)
return response.Message switch
{
"Booking information is required." => BadRequest(response.Message),
- "Error While Processing Balance(Not enough balance)" => BadRequest(response.Message),
+ "Error While Processing Balance(Not enough balance)" => BadRequest(
+ response.Message
+ ),
_ => BadRequest(response.Message),
};
}
@@ -233,65 +212,56 @@ public async Task ProcessPaymentByBalance(string token)
}
catch (Exception e)
{
- return BadRequest(new ResponseModel
- {
- Status = "Error",
- Message = e.Message
- });
+ return BadRequest(new ResponseModel { Status = "Error", Message = e.Message });
}
}
-
-
-
[HttpGet("SortPayment/{sortBy}")]
[Authorize]
-
- public async Task> > SortPayment(string sortBy, bool isAsc, [FromQuery] int pageNumber = 1, [FromQuery] int pageSize = 10)
+ public async Task>> SortPayment(
+ string sortBy,
+ bool isAsc,
+ [FromQuery] int pageNumber = 1,
+ [FromQuery] int pageSize = 10
+ )
{
- var pageResult = new PageResult
- {
- PageNumber = pageNumber,
- PageSize = pageSize
- };
+ var pageResult = new PageResult { PageNumber = pageNumber, PageSize = pageSize };
return await _paymentService.SortPayment(sortBy, isAsc, pageResult);
}
[HttpGet("GetDailyRevenue")]
[Authorize]
-
public async Task> GetDailyRevenue()
{
try
{
var date = DateTime.UtcNow;
- TimeZoneInfo asianZone = TimeZoneInfo.FindSystemTimeZoneById("SE Asia Standard Time");
+ TimeZoneInfo asianZone = TimeZoneInfo.FindSystemTimeZoneById(
+ "SE Asia Standard Time"
+ );
date = TimeZoneInfo.ConvertTimeFromUtc(date, asianZone);
- Console.WriteLine(date);
+ Console.WriteLine(date);
return Ok(await _paymentService.GetDailyRevenue(date));
}
catch (Exception e)
{
- return BadRequest(new ResponseModel
- {
- Status = "Error",
- Message = e.Message
- });
+ return BadRequest(new ResponseModel { Status = "Error", Message = e.Message });
}
}
[HttpGet("GetRevenueByDate")]
[Authorize]
-
public async Task> GetRevenueByDate(DateTime start, DateTime end)
- {
+ {
if (start > end)
{
- return BadRequest(new ResponseModel
- {
- Status = "Error",
- Message = "Start date must be before end date"
- });
+ return BadRequest(
+ new ResponseModel
+ {
+ Status = "Error",
+ Message = "Start date must be before end date",
+ }
+ );
}
try
{
@@ -299,13 +269,8 @@ public async Task> GetRevenueByDate(DateTime start, DateTi
}
catch (Exception e)
{
- return BadRequest(new ResponseModel
- {
- Status = "Error",
- Message = e.Message
- });
+ return BadRequest(new ResponseModel { Status = "Error", Message = e.Message });
}
}
-
}
}
diff --git a/API/Controllers/PricesController.cs b/API/Controllers/PricesController.cs
index 8bd472d6..ed2a9e47 100644
--- a/API/Controllers/PricesController.cs
+++ b/API/Controllers/PricesController.cs
@@ -8,7 +8,6 @@
namespace API.Controllers
{
-
[Route("api/[controller]")]
[ApiController]
public class PricesController : ControllerBase
@@ -28,7 +27,6 @@ public IActionResult GetPriceByBranchAndType(string branchId, string type, bool?
return Ok(price);
}
-
[HttpGet("branchId/{branchId}")]
public ActionResult> GetPrices(string branchId)
{
@@ -48,23 +46,22 @@ public async Task> GetPrice(string id)
return Price;
}
+
[HttpPost("PostPrice")]
[Authorize(Roles = "Admin")]
public async Task> PostPrice(PriceModel price)
{
-
var Price = _priceService.AddPrice(price);
return CreatedAtAction("GetPrice", new { id = Price.PriceId }, Price);
}
+
// PUT: api/Prices/5
// To protect from overposting attacks, see https://go.microsoft.com/fwlink/?linkid=2123754
[HttpPut("UpdatePrice")]
[Authorize(Roles = "Admin")]
public async Task PutPrice(PriceModel priceModel)
{
-
-
var Price = _priceService.UpdatePriceByPriceModel(priceModel);
return CreatedAtAction("GetPrice", new { id = Price.PriceId }, Price);
@@ -73,16 +70,12 @@ public async Task PutPrice(PriceModel priceModel)
// POST: api/Prices
// To protect from overposting attacks, see https://go.microsoft.com/fwlink/?linkid=2123754
[HttpPost("showprice")]
- public IActionResult GetPricesForWeek(bool isVip,string branchId)
+ public IActionResult GetPricesForWeek(bool isVip, string branchId)
{
- var price = _priceService.ShowPrice(isVip,branchId);
+ var price = _priceService.ShowPrice(isVip, branchId);
var weekdayPrice = price[0];
var weekendPrice = price[1];
- return Ok(new
- {
- WeekdayPrice = weekdayPrice,
- WeekendPrice = weekendPrice
- });
+ return Ok(new { WeekdayPrice = weekdayPrice, WeekendPrice = weekendPrice });
}
// DELETE: api/Prices/5
@@ -101,18 +94,16 @@ public async Task DeletePrice(string id)
return NoContent();
}
-
-
[HttpGet("sortPrice/{sortBy}")]
- public async Task>> SortPrice(string sortBy, bool isAsc, [FromQuery] int pageNumber = 1, [FromQuery] int pageSize = 10)
+ public async Task>> SortPrice(
+ string sortBy,
+ bool isAsc,
+ [FromQuery] int pageNumber = 1,
+ [FromQuery] int pageSize = 10
+ )
{
- var pageResult = new PageResult
- {
- PageNumber = pageNumber,
- PageSize = pageSize
- };
+ var pageResult = new PageResult { PageNumber = pageNumber, PageSize = pageSize };
return await _priceService.SortPrice(sortBy, isAsc, pageResult);
}
}
-
}
diff --git a/API/Controllers/ReviewsController.cs b/API/Controllers/ReviewsController.cs
index 290a0edc..5f6ed481 100644
--- a/API/Controllers/ReviewsController.cs
+++ b/API/Controllers/ReviewsController.cs
@@ -2,15 +2,15 @@
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
-using Microsoft.AspNetCore.Http;
-using Microsoft.AspNetCore.Mvc;
-using Microsoft.EntityFrameworkCore;
using BusinessObjects;
-using Services;
-using Microsoft.AspNetCore.Identity;
using DAOs.Helper;
using DAOs.Models;
using Microsoft.AspNetCore.Authorization;
+using Microsoft.AspNetCore.Http;
+using Microsoft.AspNetCore.Identity;
+using Microsoft.AspNetCore.Mvc;
+using Microsoft.EntityFrameworkCore;
+using Services;
namespace API.Controllers
{
@@ -27,21 +27,17 @@ public ReviewsController()
// GET: api/Reviews
[HttpGet]
- public async Task>> GetReviews([FromQuery] int pageNumber = 1, [FromQuery] int pageSize = 10, [FromQuery] string searchQuery = null)
+ public async Task>> GetReviews(
+ [FromQuery] int pageNumber = 1,
+ [FromQuery] int pageSize = 10,
+ [FromQuery] string searchQuery = null
+ )
{
- var pageResult = new PageResult
- {
- PageNumber = pageNumber,
- PageSize = pageSize
- };
+ var pageResult = new PageResult { PageNumber = pageNumber, PageSize = pageSize };
- var (review,total) = await _reviewService.GetReview(pageResult,searchQuery);
+ var (review, total) = await _reviewService.GetReview(pageResult, searchQuery);
- var response = new PagingResponse
- {
- Data = review,
- Total = total
- };
+ var response = new PagingResponse { Data = review, Total = total };
return Ok(response);
}
@@ -64,7 +60,6 @@ public async Task> GetReview(string id)
// To protect from overposting attacks, see https://go.microsoft.com/fwlink/?linkid=2123754
[HttpPut("{id}")]
[Authorize]
-
public async Task PutReview(string id, ReviewModel reviewModel)
{
var review = _reviewService.GetReview(id);
@@ -82,7 +77,6 @@ public async Task PutReview(string id, ReviewModel reviewModel)
// To protect from overposting attacks, see https://go.microsoft.com/fwlink/?linkid=2123754
[HttpPost]
[Authorize]
-
public async Task> PostReview(ReviewModel reviewModel)
{
var review = _reviewService.AddReview(reviewModel);
@@ -93,7 +87,6 @@ public async Task> PostReview(ReviewModel reviewModel)
// DELETE: api/Reviews/5
[HttpDelete("{id}")]
[Authorize]
-
public async Task DeleteReview(string id)
{
var review = _reviewService.GetReview(id);
@@ -108,7 +101,6 @@ public async Task DeleteReview(string id)
// return reviewService.GetReviews().Any(e => e.ReviewId == id);
//}
-
[HttpGet("GetReviewsByBranch/{id}")]
public async Task>> GetReviewsByBranch(string id)
{
@@ -122,7 +114,10 @@ public async Task>> SearchByUser(string id)
}
[HttpGet("SearchByDate/{start}/{end}")]
- public async Task>> SearchByDate(DateTime start, DateTime end)
+ public async Task>> SearchByDate(
+ DateTime start,
+ DateTime end
+ )
{
return _reviewService.SearchByDate(start, end);
}
@@ -133,15 +128,15 @@ public async Task>> SearchByRating(int rating)
return _reviewService.SearchByRating(rating);
}
-
[HttpGet("SortReview/{sortBy}")]
- public async Task>> SortReview(string sortBy, bool isAsc, [FromQuery] int pageNumber = 1, [FromQuery] int pageSize = 10)
+ public async Task>> SortReview(
+ string sortBy,
+ bool isAsc,
+ [FromQuery] int pageNumber = 1,
+ [FromQuery] int pageSize = 10
+ )
{
- var pageResult = new PageResult
- {
- PageNumber = pageNumber,
- PageSize = pageSize
- };
+ var pageResult = new PageResult { PageNumber = pageNumber, PageSize = pageSize };
return await _reviewService.SortReview(sortBy, isAsc, pageResult);
}
diff --git a/API/Controllers/RolesController.cs b/API/Controllers/RolesController.cs
index af12d1f9..221bec79 100644
--- a/API/Controllers/RolesController.cs
+++ b/API/Controllers/RolesController.cs
@@ -9,21 +9,21 @@ namespace API.Controllers
[Route("api/[controller]")]
[ApiController]
public class RolesController : ControllerBase
- {
- private readonly RoleService _roleService;
+ {
+ private readonly RoleService _roleService;
- public RolesController()
- {
+ public RolesController()
+ {
_roleService = new RoleService();
- }
+ }
- // GET: api/Roles
- [HttpGet]
+ // GET: api/Roles
+ [HttpGet]
[Authorize(Roles = "Admin")]
public async Task>> GetRoles()
- {
- return _roleService.GetRoles();
- }
+ {
+ return _roleService.GetRoles();
+ }
// GET: api/Roles/5
[HttpGet("roleId/{id}")]
@@ -54,18 +54,16 @@ public async Task> GetRoleNameByUserId(string userId)
return Role;
}
-
[HttpPut("{id}")]
[Authorize(Roles = "Admin")]
- public IActionResult PutRole(string id,[FromBody] string role)
+ public IActionResult PutRole(string id, [FromBody] string role)
{
- var roleUser = _roleService.GetRoleNameByUserId(id);
+ var roleUser = _roleService.GetRoleNameByUserId(id);
try
{
- _roleService.UpdateRole(id, role);
+ _roleService.UpdateRole(id, role);
- return Ok();
-
+ return Ok();
}
catch (Exception ex)
{
diff --git a/API/Controllers/TimeSlotsController.cs b/API/Controllers/TimeSlotsController.cs
index 07f924ae..781b7e2b 100644
--- a/API/Controllers/TimeSlotsController.cs
+++ b/API/Controllers/TimeSlotsController.cs
@@ -2,17 +2,17 @@
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
+using BusinessObjects;
+using DAOs.Models;
+using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
+using Microsoft.AspNetCore.SignalR;
using Microsoft.EntityFrameworkCore;
-using BusinessObjects;
-using DAOs.Models;
-using Services;
-using Page = DAOs.Helper;
using Newtonsoft.Json;
-using Microsoft.AspNetCore.SignalR;
+using Services;
using Services.SignalRHub;
-using Microsoft.AspNetCore.Authorization;
+using Page = DAOs.Helper;
namespace API.Controllers
{
@@ -23,8 +23,10 @@ public class TimeSlotsController : ControllerBase
private readonly TimeSlotService _timeSlotService;
private readonly IHubContext _hubContext;
-
- public TimeSlotsController(TimeSlotService timeSlotService, IHubContext hubContext)
+ public TimeSlotsController(
+ TimeSlotService timeSlotService,
+ IHubContext hubContext
+ )
{
_timeSlotService = timeSlotService;
_hubContext = hubContext;
@@ -38,34 +40,37 @@ public async Task>> GetTimeSlots()
}
[HttpGet("page/")]
- public async Task>> GetTimeSlotsPage([FromQuery] int pageNumber = 1, [FromQuery] int pageSize = 10, [FromQuery] string searchQuery = null)
+ public async Task>> GetTimeSlotsPage(
+ [FromQuery] int pageNumber = 1,
+ [FromQuery] int pageSize = 10,
+ [FromQuery] string searchQuery = null
+ )
{
- var pageResult = new Page.PageResult
- {
- PageSize = pageSize,
- PageNumber = pageNumber,
- };
+ var pageResult = new Page.PageResult { PageSize = pageSize, PageNumber = pageNumber };
List timeSlots = await _timeSlotService.GetTimeSlots(pageResult, searchQuery);
return Ok(timeSlots);
}
-
+
[HttpGet("GetTimeSlotsByCourtId")]
- public async Task>> GetTimeSlotsByCourtId([FromQuery] string courtId ,[FromQuery] int pageNumber = 1, [FromQuery] int pageSize = 10, [FromQuery] string searchQuery = null)
+ public async Task>> GetTimeSlotsByCourtId(
+ [FromQuery] string courtId,
+ [FromQuery] int pageNumber = 1,
+ [FromQuery] int pageSize = 10,
+ [FromQuery] string searchQuery = null
+ )
{
-
- var pageResult = new Page.PageResult
- {
- PageSize = pageSize,
- PageNumber = pageNumber,
- };
- List timeSlots = await _timeSlotService.GetTimeSlotsByCourtId(courtId, pageResult, searchQuery);
+ var pageResult = new Page.PageResult { PageSize = pageSize, PageNumber = pageNumber };
+ List timeSlots = await _timeSlotService.GetTimeSlotsByCourtId(
+ courtId,
+ pageResult,
+ searchQuery
+ );
return Ok(timeSlots);
}
// GET: api/TimeSlots/5
[HttpGet("{id}")]
[Authorize]
-
public async Task> GetTimeSlot(string id)
{
var timeSlot = _timeSlotService.GetTimeSlot(id);
@@ -80,8 +85,9 @@ public async Task> GetTimeSlot(string id)
[HttpGet("bookingId/{bookingId}")]
[Authorize]
-
- public async Task>> GetTimeSlotByBookingId(string bookingId)
+ public async Task>> GetTimeSlotByBookingId(
+ string bookingId
+ )
{
var timeSlot = _timeSlotService.GetTimeSlotsByBookingId(bookingId);
@@ -97,7 +103,6 @@ public async Task>> GetTimeSlotByBookingId(st
// To protect from overposting attacks, see https://go.microsoft.com/fwlink/?linkid=2123754
[HttpPut("{id}")]
[Authorize]
-
public async Task PutTimeSlot(string id, SlotModel slotModel)
{
var timeSlot = _timeSlotService.GetTimeSlot(id);
@@ -115,7 +120,6 @@ public async Task PutTimeSlot(string id, SlotModel slotModel)
// To protect from overposting attacks, see https://go.microsoft.com/fwlink/?linkid=2123754
[HttpPost]
[Authorize]
-
public async Task> PostTimeSlot(TimeSlot timeSlot)
{
_timeSlotService.AddTimeSlot(timeSlot);
@@ -151,53 +155,56 @@ public async Task> ChangeSlot(SlotModel slotModel, string
{
TimeSlot timeSlot = _timeSlotService.ChangeSlot(slotModel, slotId);
- return Ok(new TimeSlot()
- {
- SlotId = timeSlot.SlotId,
- CourtId = timeSlot.CourtId,
- BookingId = timeSlot.BookingId,
- SlotDate = timeSlot.SlotDate,
- SlotStartTime = timeSlot.SlotStartTime,
- SlotEndTime = timeSlot.SlotEndTime,
- Price = timeSlot.Price,
- Status = timeSlot.Status
- });
+ return Ok(
+ new TimeSlot()
+ {
+ SlotId = timeSlot.SlotId,
+ CourtId = timeSlot.CourtId,
+ BookingId = timeSlot.BookingId,
+ SlotDate = timeSlot.SlotDate,
+ SlotStartTime = timeSlot.SlotStartTime,
+ SlotEndTime = timeSlot.SlotEndTime,
+ Price = timeSlot.Price,
+ Status = timeSlot.Status,
+ }
+ );
}
[HttpGet("userId/{userId}")]
[Authorize]
-
- public async Task>> GetTimeSlotsByUserId(string userId, [FromQuery] int pageNumber = 1, [FromQuery] int pageSize = 10)
+ public async Task>> GetTimeSlotsByUserId(
+ string userId,
+ [FromQuery] int pageNumber = 1,
+ [FromQuery] int pageSize = 10
+ )
{
- var pageResult = new Page.PageResult
- {
- PageSize = pageSize,
- PageNumber = pageNumber,
- };
- List timeSlots = await _timeSlotService.GetTimeSlotsByUserId(userId, pageResult);
+ var pageResult = new Page.PageResult { PageSize = pageSize, PageNumber = pageNumber };
+ List timeSlots = await _timeSlotService.GetTimeSlotsByUserId(
+ userId,
+ pageResult
+ );
return Ok(timeSlots);
}
[HttpGet("sortSlot/{sortBy}")]
[Authorize]
-
- public async Task>> SortTimeSlot(string sortBy, bool isAsc, [FromQuery] int pageNumber = 1, [FromQuery] int pageSize = 10)
+ public async Task>> SortTimeSlot(
+ string sortBy,
+ bool isAsc,
+ [FromQuery] int pageNumber = 1,
+ [FromQuery] int pageSize = 10
+ )
{
- var pageResult = new Page.PageResult
- {
- PageNumber = pageNumber,
- PageSize = pageSize
- };
+ var pageResult = new Page.PageResult { PageNumber = pageNumber, PageSize = pageSize };
return await _timeSlotService.SortTimeSlot(sortBy, isAsc, pageResult);
}
+
private bool TimeSlotExists(string id)
{
return _timeSlotService.GetTimeSlots().Any(e => e.SlotId == id);
}
-
-
[HttpPost("checkin/qr")]
public async Task CheckInWithQR([FromBody] QRCheckInModel request)
{
@@ -210,33 +217,34 @@ public async Task CheckInWithQR([FromBody] QRCheckInModel request
var allTimeSlot = _timeSlotService.GetTimeSlotsByBookingId(qrData.BookingId);
bool check = false;
- foreach (var timeSlot in allTimeSlot) {
- if (timeSlot != null && timeSlot.Status == "Reserved" && timeSlot.BookingId == qrData.BookingId)
+ foreach (var timeSlot in allTimeSlot)
+ {
+ if (
+ timeSlot != null
+ && timeSlot.Status == "Reserved"
+ && timeSlot.BookingId == qrData.BookingId
+ )
{
//cần phải checked-in tất cả time slot ngày hôm đó luôn chứ không phải chỉ 1 time slot
-
- _timeSlotService.GetTimeSlotsByDate(timeSlot.SlotDate).ForEach(async t =>
- {
- t.Status = "checked-in";
- await _timeSlotService.UpdateTimeSlotWithObject(t);
- check = true;
- });
-
+ _timeSlotService
+ .GetTimeSlotsByDate(timeSlot.SlotDate)
+ .ForEach(async t =>
+ {
+ t.Status = "checked-in";
+ await _timeSlotService.UpdateTimeSlotWithObject(t);
+ check = true;
+ });
}
-
-
}
if (check)
return Ok("Check-in successful.");
return BadRequest("Invalid QR code or timeslot.");
}
-
[HttpPost("lock")]
public async Task LockSlot([FromBody] SlotModel slotInfo)
{
-
if (slotInfo == null)
{
return BadRequest("Invalid slot information.");
@@ -272,9 +280,11 @@ public async Task ConfirmBooking(SlotCheckModel slotCheckModel)
}
[HttpGet("unavailable_slot")]
- public ActionResult> UnavailableSlot([FromQuery] DateOnly date, [FromQuery] string branchId)
+ public ActionResult> UnavailableSlot(
+ [FromQuery] DateOnly date,
+ [FromQuery] string branchId
+ )
{
-
var result = _timeSlotService.UnavailableSlot(date, branchId);
if (result == null)
{
@@ -282,6 +292,7 @@ public ActionResult> UnavailableSlot([FromQuery] DateOnly da
}
return Ok(result);
}
+
//[HttpPost("checkSlotAvailability")]
//public async Task CheckSlotAvailability([FromBody] List slotCheckModels)
//{
@@ -300,7 +311,10 @@ public ActionResult> UnavailableSlot([FromQuery] DateOnly da
//}
[HttpPost("add_timeslot_if_exist_booking")]
- public ActionResult> AddSlotToBooking(SlotModel[] slotModel, string bookingId)
+ public ActionResult> AddSlotToBooking(
+ SlotModel[] slotModel,
+ string bookingId
+ )
{
try
{
@@ -312,7 +326,6 @@ public ActionResult> AddSlotToBooking(SlotModel[] slotModel, stri
}
}
-
private QRData DecryptQRCode(string qrCodeData)
{
// Implement logic to decrypt and parse the QR code data
@@ -324,6 +337,5 @@ public class QRData
public string BookingId { get; set; }
public string UserId { get; set; }
}
-
}
}
diff --git a/API/Controllers/TrainingController.cs b/API/Controllers/TrainingController.cs
index 6e8c49c1..b5406f1e 100644
--- a/API/Controllers/TrainingController.cs
+++ b/API/Controllers/TrainingController.cs
@@ -11,7 +11,10 @@ public class TrainingController : ControllerBase
private readonly ModelTrainingService _modelTrainingService;
private readonly TrainingService _trainingService;
- public TrainingController(ModelTrainingService modelTrainingService, TrainingService trainingService)
+ public TrainingController(
+ ModelTrainingService modelTrainingService,
+ TrainingService trainingService
+ )
{
_modelTrainingService = modelTrainingService;
_trainingService = trainingService;
@@ -30,11 +33,16 @@ public IActionResult TrainModel()
return StatusCode(500, $"Internal server error: {ex.Message}");
}
}
+
[HttpGet("weekly-growth")]
- public async Task> PredictWeeklyBookingGrowth()
+ public async Task<
+ ActionResult<(float predictedCount, float growthRate)>
+ > PredictWeeklyBookingGrowth()
{
var result = await _trainingService.PredictWeeklyBookingGrowthAsync();
- Console.WriteLine($"Controller result: Predicted Count={result.predictedCount}, Growth Rate={result.growthRate}");
+ Console.WriteLine(
+ $"Controller result: Predicted Count={result.predictedCount}, Growth Rate={result.growthRate}"
+ );
var response = new MachineResponse
{
predictedCount = result.Item1,
diff --git a/API/Controllers/UserDetailsController.cs b/API/Controllers/UserDetailsController.cs
index 9fc05692..c82d852e 100644
--- a/API/Controllers/UserDetailsController.cs
+++ b/API/Controllers/UserDetailsController.cs
@@ -2,15 +2,15 @@
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
-using Microsoft.AspNetCore.Http;
-using Microsoft.AspNetCore.Mvc;
-using Microsoft.EntityFrameworkCore;
using BusinessObjects;
using DAOs.Helper;
-using Services;
-using Microsoft.AspNetCore.Identity;
using DAOs.Models;
using Microsoft.AspNetCore.Authorization;
+using Microsoft.AspNetCore.Http;
+using Microsoft.AspNetCore.Identity;
+using Microsoft.AspNetCore.Mvc;
+using Microsoft.EntityFrameworkCore;
+using Services;
namespace API.Controllers
{
@@ -28,7 +28,6 @@ public UserDetailsController()
// GET: api/UserDetails
[HttpGet]
[Authorize]
-
public async Task>> GetUserDetails()
{
return _userDetailService.GetUserDetails().ToList();
@@ -37,7 +36,6 @@ public async Task>> GetUserDetails()
// GET: api/UserDetails/5
[HttpGet("{id}")]
[Authorize]
-
public async Task> GetUser(string id)
{
var user = _userDetailService.GetUserDetail(id);
@@ -54,7 +52,6 @@ public async Task> GetUser(string id)
// To protect from overposting attacks, see https://go.microsoft.com/fwlink/?linkid=2123754
[HttpPut("{id}")]
[Authorize]
-
public async Task PutUser(string id, UserDetailsModel userDetailsModel)
{
var user = _userDetailService.GetUserDetail(id);
@@ -70,7 +67,6 @@ public async Task PutUser(string id, UserDetailsModel userDetails
[HttpPut("foruser/{id}")]
[Authorize]
-
public async Task PutUserDetail(string id, PutUserDetail userDetailsModel)
{
var user = _userDetailService.GetUserDetail(id);
@@ -116,7 +112,6 @@ private bool UserExists(string id)
[HttpGet("GetUserDetailByUserId/{userId}")]
[Authorize]
-
public async Task> GetUserDetailByUserId(string userId)
{
var user = _userDetailService.GetUserDetail(userId);
@@ -131,7 +126,6 @@ public async Task> GetUserDetailByUserId(string userId)
[HttpGet("GetUserDetailByUserEmail/{userEmail}")]
[Authorize]
-
public async Task>> GetUserByEmail(string userEmail)
{
if (string.IsNullOrEmpty(userEmail))
@@ -151,24 +145,24 @@ public async Task>> GetUserByEmail(string userEmai
}
catch (Exception ex)
{
-
return StatusCode(500, $"Internal server error: {ex}");
}
}
[HttpGet("SortUser/{sortBy}")]
[Authorize]
-
- public async Task>> SortReview(string sortBy, bool isAsc, [FromQuery] int pageNumber = 1, [FromQuery] int pageSize = 10)
+ public async Task>> SortReview(
+ string sortBy,
+ bool isAsc,
+ [FromQuery] int pageNumber = 1,
+ [FromQuery] int pageSize = 10
+ )
{
- var pageResult = new PageResult
- {
- PageNumber = pageNumber,
- PageSize = pageSize
- };
+ var pageResult = new PageResult { PageNumber = pageNumber, PageSize = pageSize };
return await _userDetailService.SortUserDetail(sortBy, isAsc, pageResult);
}
+
[HttpGet("CountUser")]
[Authorize]
public int CountUser()
diff --git a/API/Controllers/UsersController.cs b/API/Controllers/UsersController.cs
index d00354ae..44a39297 100644
--- a/API/Controllers/UsersController.cs
+++ b/API/Controllers/UsersController.cs
@@ -2,15 +2,15 @@
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
-using Microsoft.AspNetCore.Http;
-using Microsoft.AspNetCore.Mvc;
-using Microsoft.EntityFrameworkCore;
using BusinessObjects;
-using Services;
-using Microsoft.AspNetCore.Identity;
using DAOs.Helper;
using DAOs.Models;
using Microsoft.AspNetCore.Authorization;
+using Microsoft.AspNetCore.Http;
+using Microsoft.AspNetCore.Identity;
+using Microsoft.AspNetCore.Mvc;
+using Microsoft.EntityFrameworkCore;
+using Services;
using StackExchange.Redis;
namespace API.Controllers
@@ -20,7 +20,6 @@ namespace API.Controllers
public class UsersController : ControllerBase
{
private readonly UserService _userService;
-
public UsersController(UserService userService, IConnectionMultiplexer redis)
{
@@ -30,31 +29,21 @@ public UsersController(UserService userService, IConnectionMultiplexer redis)
// GET: api/Users
[HttpGet]
- public async Task>> GetUsers([FromQuery] int pageNumber = 1, [FromQuery] int pageSize = 10, [FromQuery] string searchQuery = null)
+ public async Task>> GetUsers(
+ [FromQuery] int pageNumber = 1,
+ [FromQuery] int pageSize = 10,
+ [FromQuery] string searchQuery = null
+ )
{
- var pageResult = new PageResult
- {
- PageNumber = pageNumber,
- PageSize = pageSize
- };
+ var pageResult = new PageResult { PageNumber = pageNumber, PageSize = pageSize };
- var (users,total) = await _userService.GetUsers(pageResult,searchQuery);
+ var (users, total) = await _userService.GetUsers(pageResult, searchQuery);
- var response = new PagingResponse
- {
- Data = users,
- Total = total
- };
+ var response = new PagingResponse { Data = users, Total = total };
return Ok(response);
}
-
-
-
-
-
-
//[HttpGet]
//public async Task>> GetUsers()
//{
@@ -64,7 +53,6 @@ public async Task>> GetUsers([FromQuer
// GET: api/Users/5
[HttpGet("{id}")]
[Authorize]
-
public async Task> GetUser(string id)
{
var user = _userService.GetUser(id);
@@ -126,16 +114,15 @@ public async Task