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> GetUser(string id) [Authorize(Roles = "Admin")] public async Task BanUser(string id) { - IdentityUser user = _userService.GetUser(id); if (id != user.Id) return BadRequest(); - else _userService.BanUser(id); + else + _userService.BanUser(id); return NoContent(); } - [HttpPut("{id}/unban")] [Authorize(Roles = "Admin")] public async Task UnbanUser(string id) @@ -143,14 +130,14 @@ public async Task UnbanUser(string id) IdentityUser user = _userService.GetUser(id); if (id != user.Id) return BadRequest(); - else _userService.UnBanUser(id); + else + _userService.UnBanUser(id); return NoContent(); } [HttpGet("GetUserDetailByUserEmail/{userEmail}")] [Authorize] - public async Task>> GetUserByEmail(string userEmail) { if (string.IsNullOrEmpty(userEmail)) @@ -174,7 +161,5 @@ public async Task>> GetUserByEmail(string return StatusCode(500, $"Internal server error: {ex}"); } } - - } } diff --git a/API/Controllers/VnpayController.cs b/API/Controllers/VnpayController.cs index 53a4bde2..8db3be3b 100644 --- a/API/Controllers/VnpayController.cs +++ b/API/Controllers/VnpayController.cs @@ -3,7 +3,6 @@ using Microsoft.Extensions.Logging; using Services; - namespace VNPAYAPI.Areas.VNPayAPI.Controllers { [Area("VNPayAPI")] @@ -52,8 +51,7 @@ public async Task PaymentConfirm() if (validationResult.IsSuccessful) { - - return Redirect(validationResult.RedirectUrl); + return Redirect(validationResult.RedirectUrl); } else { @@ -69,6 +67,5 @@ public async Task PaymentConfirm() return StatusCode(500, "Internal server error"); } } - } } diff --git a/API/Controllers/WeatherForecastController.cs b/API/Controllers/WeatherForecastController.cs deleted file mode 100644 index aaf3a935..00000000 --- a/API/Controllers/WeatherForecastController.cs +++ /dev/null @@ -1,33 +0,0 @@ -using Microsoft.AspNetCore.Mvc; - -namespace API.Controllers -{ - [ApiController] - [Route("[controller]")] - public class WeatherForecastController : ControllerBase - { - private static readonly string[] Summaries = new[] - { - "Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching" - }; - - private readonly ILogger _logger; - - public WeatherForecastController(ILogger logger) - { - _logger = logger; - } - - [HttpGet(Name = "GetWeatherForecast")] - public IEnumerable Get() - { - return Enumerable.Range(1, 5).Select(index => new WeatherForecast - { - Date = DateOnly.FromDateTime(DateTime.Now.AddDays(index)), - TemperatureC = Random.Shared.Next(-20, 55), - Summary = Summaries[Random.Shared.Next(Summaries.Length)] - }) - .ToArray(); - } - } -} diff --git a/API/Helper/FormEmail.cs b/API/Helper/FormEmail.cs index c707615c..0b7d253c 100644 --- a/API/Helper/FormEmail.cs +++ b/API/Helper/FormEmail.cs @@ -1,5 +1,5 @@ -using NuGet.Common; -using System.ComponentModel; +using System.ComponentModel; +using NuGet.Common; namespace API.Helper { @@ -7,9 +7,8 @@ public class FormEmail { public static string WarningLogin(string email) { - string style = - @" + @"