diff --git a/.idea/.idea.Fin-Backend/.idea/copilot.data.migration.agent.xml b/.idea/.idea.Fin-Backend/.idea/copilot.data.migration.agent.xml
new file mode 100644
index 0000000..4ea72a9
--- /dev/null
+++ b/.idea/.idea.Fin-Backend/.idea/copilot.data.migration.agent.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/.idea.Fin-Backend/.idea/dataSources.xml b/.idea/.idea.Fin-Backend/.idea/dataSources.xml
new file mode 100644
index 0000000..5f87bc2
--- /dev/null
+++ b/.idea/.idea.Fin-Backend/.idea/dataSources.xml
@@ -0,0 +1,13 @@
+
+
+
+
+ postgresql
+ true
+ true
+ org.postgresql.Driver
+ jdbc:postgresql://localhost:5432/postgres?password=postgres&user=postgres
+ $ProjectFileDir$
+
+
+
\ No newline at end of file
diff --git a/.idea/.idea.Fin-Backend/.idea/data_source_mapping.xml b/.idea/.idea.Fin-Backend/.idea/data_source_mapping.xml
new file mode 100644
index 0000000..3e9887f
--- /dev/null
+++ b/.idea/.idea.Fin-Backend/.idea/data_source_mapping.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/.idea.Fin-Backend/.idea/git_toolbox_prj.xml b/.idea/.idea.Fin-Backend/.idea/git_toolbox_prj.xml
new file mode 100644
index 0000000..02b915b
--- /dev/null
+++ b/.idea/.idea.Fin-Backend/.idea/git_toolbox_prj.xml
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.vs/Fin-Backend/CopilotIndices/17.14.734.62261/CodeChunks.db b/.vs/Fin-Backend/CopilotIndices/17.14.734.62261/CodeChunks.db
new file mode 100644
index 0000000..82e55a1
Binary files /dev/null and b/.vs/Fin-Backend/CopilotIndices/17.14.734.62261/CodeChunks.db differ
diff --git a/.vs/Fin-Backend/CopilotIndices/17.14.734.62261/SemanticSymbols.db b/.vs/Fin-Backend/CopilotIndices/17.14.734.62261/SemanticSymbols.db
new file mode 100644
index 0000000..a2a78ed
Binary files /dev/null and b/.vs/Fin-Backend/CopilotIndices/17.14.734.62261/SemanticSymbols.db differ
diff --git a/.vs/Fin-Backend/DesignTimeBuild/.dtbcache.v2 b/.vs/Fin-Backend/DesignTimeBuild/.dtbcache.v2
new file mode 100644
index 0000000..275c4e5
Binary files /dev/null and b/.vs/Fin-Backend/DesignTimeBuild/.dtbcache.v2 differ
diff --git a/.vs/Fin-Backend/FileContentIndex/6f825f2f-6b18-4bcc-9a27-756adc3ec514.vsidx b/.vs/Fin-Backend/FileContentIndex/6f825f2f-6b18-4bcc-9a27-756adc3ec514.vsidx
new file mode 100644
index 0000000..ebc3c49
Binary files /dev/null and b/.vs/Fin-Backend/FileContentIndex/6f825f2f-6b18-4bcc-9a27-756adc3ec514.vsidx differ
diff --git a/.vs/Fin-Backend/FileContentIndex/8be34b6f-428b-401a-b31e-b52358fdea5c.vsidx b/.vs/Fin-Backend/FileContentIndex/8be34b6f-428b-401a-b31e-b52358fdea5c.vsidx
new file mode 100644
index 0000000..89767a3
Binary files /dev/null and b/.vs/Fin-Backend/FileContentIndex/8be34b6f-428b-401a-b31e-b52358fdea5c.vsidx differ
diff --git a/.vs/Fin-Backend/v17/.futdcache.v2 b/.vs/Fin-Backend/v17/.futdcache.v2
new file mode 100644
index 0000000..f46f1a6
Binary files /dev/null and b/.vs/Fin-Backend/v17/.futdcache.v2 differ
diff --git a/.vs/Fin-Backend/v17/.suo b/.vs/Fin-Backend/v17/.suo
new file mode 100644
index 0000000..679eb1d
Binary files /dev/null and b/.vs/Fin-Backend/v17/.suo differ
diff --git a/.vs/Fin-Backend/v17/DocumentLayout.json b/.vs/Fin-Backend/v17/DocumentLayout.json
new file mode 100644
index 0000000..6d93739
--- /dev/null
+++ b/.vs/Fin-Backend/v17/DocumentLayout.json
@@ -0,0 +1,394 @@
+{
+ "Version": 1,
+ "WorkspaceRootPath": "C:\\Users\\Gustavo Passos\\Desktop\\Develop\\Fin\\fin-backend\\",
+ "Documents": [
+ {
+ "AbsoluteMoniker": "D:0:0:{8A2A53B4-B6F1-47DC-A681-E1819AE39A0B}|Fin.Infrastructure\\Fin.Infrastructure.csproj|c:\\users\\gustavo passos\\desktop\\develop\\fin\\fin-backend\\fin.infrastructure\\authentications\\activatedusermiddleware.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
+ "RelativeMoniker": "D:0:0:{8A2A53B4-B6F1-47DC-A681-E1819AE39A0B}|Fin.Infrastructure\\Fin.Infrastructure.csproj|solutionrelative:fin.infrastructure\\authentications\\activatedusermiddleware.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
+ },
+ {
+ "AbsoluteMoniker": "D:0:0:{E698F897-BB2D-42EF-879A-03B0DA36F212}|Fin.Domain\\Fin.Domain.csproj|c:\\users\\gustavo passos\\desktop\\develop\\fin\\fin-backend\\fin.domain\\tenants\\entities\\tenantuser.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
+ "RelativeMoniker": "D:0:0:{E698F897-BB2D-42EF-879A-03B0DA36F212}|Fin.Domain\\Fin.Domain.csproj|solutionrelative:fin.domain\\tenants\\entities\\tenantuser.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
+ },
+ {
+ "AbsoluteMoniker": "D:0:0:{E698F897-BB2D-42EF-879A-03B0DA36F212}|Fin.Domain\\Fin.Domain.csproj|c:\\users\\gustavo passos\\desktop\\develop\\fin\\fin-backend\\fin.domain\\tenants\\entities\\tenant.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
+ "RelativeMoniker": "D:0:0:{E698F897-BB2D-42EF-879A-03B0DA36F212}|Fin.Domain\\Fin.Domain.csproj|solutionrelative:fin.domain\\tenants\\entities\\tenant.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
+ },
+ {
+ "AbsoluteMoniker": "D:0:0:{1F2A1D01-85F1-46DC-A5BD-03B7FCF47B82}|Fin.Application\\Fin.Application.csproj|c:\\users\\gustavo passos\\desktop\\develop\\fin\\fin-backend\\fin.application\\globals\\services\\randomgenerator.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
+ "RelativeMoniker": "D:0:0:{1F2A1D01-85F1-46DC-A5BD-03B7FCF47B82}|Fin.Application\\Fin.Application.csproj|solutionrelative:fin.application\\globals\\services\\randomgenerator.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
+ },
+ {
+ "AbsoluteMoniker": "D:0:0:{1F2A1D01-85F1-46DC-A5BD-03B7FCF47B82}|Fin.Application\\Fin.Application.csproj|c:\\users\\gustavo passos\\desktop\\develop\\fin\\fin-backend\\fin.application\\authentications\\services\\authenticationservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
+ "RelativeMoniker": "D:0:0:{1F2A1D01-85F1-46DC-A5BD-03B7FCF47B82}|Fin.Application\\Fin.Application.csproj|solutionrelative:fin.application\\authentications\\services\\authenticationservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
+ },
+ {
+ "AbsoluteMoniker": "D:0:0:{E698F897-BB2D-42EF-879A-03B0DA36F212}|Fin.Domain\\Fin.Domain.csproj|c:\\users\\gustavo passos\\desktop\\develop\\fin\\fin-backend\\fin.domain\\users\\dtos\\userdto.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
+ "RelativeMoniker": "D:0:0:{E698F897-BB2D-42EF-879A-03B0DA36F212}|Fin.Domain\\Fin.Domain.csproj|solutionrelative:fin.domain\\users\\dtos\\userdto.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
+ },
+ {
+ "AbsoluteMoniker": "D:0:0:{E698F897-BB2D-42EF-879A-03B0DA36F212}|Fin.Domain\\Fin.Domain.csproj|c:\\users\\gustavo passos\\desktop\\develop\\fin\\fin-backend\\fin.domain\\users\\dtos\\userdeleterequestdto.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
+ "RelativeMoniker": "D:0:0:{E698F897-BB2D-42EF-879A-03B0DA36F212}|Fin.Domain\\Fin.Domain.csproj|solutionrelative:fin.domain\\users\\dtos\\userdeleterequestdto.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
+ },
+ {
+ "AbsoluteMoniker": "D:0:0:{E698F897-BB2D-42EF-879A-03B0DA36F212}|Fin.Domain\\Fin.Domain.csproj|c:\\users\\gustavo passos\\desktop\\develop\\fin\\fin-backend\\fin.domain\\notifications\\entities\\notificationuserdelivery.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
+ "RelativeMoniker": "D:0:0:{E698F897-BB2D-42EF-879A-03B0DA36F212}|Fin.Domain\\Fin.Domain.csproj|solutionrelative:fin.domain\\notifications\\entities\\notificationuserdelivery.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
+ },
+ {
+ "AbsoluteMoniker": "D:0:0:{E698F897-BB2D-42EF-879A-03B0DA36F212}|Fin.Domain\\Fin.Domain.csproj|c:\\users\\gustavo passos\\desktop\\develop\\fin\\fin-backend\\fin.domain\\notifications\\enums\\notificationway.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
+ "RelativeMoniker": "D:0:0:{E698F897-BB2D-42EF-879A-03B0DA36F212}|Fin.Domain\\Fin.Domain.csproj|solutionrelative:fin.domain\\notifications\\enums\\notificationway.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
+ },
+ {
+ "AbsoluteMoniker": "D:0:0:{8A2A53B4-B6F1-47DC-A681-E1819AE39A0B}|Fin.Infrastructure\\Fin.Infrastructure.csproj|c:\\users\\gustavo passos\\desktop\\develop\\fin\\fin-backend\\fin.infrastructure\\unitofworks\\unitofwork.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
+ "RelativeMoniker": "D:0:0:{8A2A53B4-B6F1-47DC-A681-E1819AE39A0B}|Fin.Infrastructure\\Fin.Infrastructure.csproj|solutionrelative:fin.infrastructure\\unitofworks\\unitofwork.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
+ },
+ {
+ "AbsoluteMoniker": "D:0:0:{8A2A53B4-B6F1-47DC-A681-E1819AE39A0B}|Fin.Infrastructure\\Fin.Infrastructure.csproj|c:\\users\\gustavo passos\\desktop\\develop\\fin\\fin-backend\\fin.infrastructure\\authentications\\enums\\loginerrorcode.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
+ "RelativeMoniker": "D:0:0:{8A2A53B4-B6F1-47DC-A681-E1819AE39A0B}|Fin.Infrastructure\\Fin.Infrastructure.csproj|solutionrelative:fin.infrastructure\\authentications\\enums\\loginerrorcode.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
+ },
+ {
+ "AbsoluteMoniker": "D:0:0:{8A2A53B4-B6F1-47DC-A681-E1819AE39A0B}|Fin.Infrastructure\\Fin.Infrastructure.csproj|c:\\users\\gustavo passos\\desktop\\develop\\fin\\fin-backend\\fin.infrastructure\\authentications\\dtos\\logininput.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
+ "RelativeMoniker": "D:0:0:{8A2A53B4-B6F1-47DC-A681-E1819AE39A0B}|Fin.Infrastructure\\Fin.Infrastructure.csproj|solutionrelative:fin.infrastructure\\authentications\\dtos\\logininput.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
+ },
+ {
+ "AbsoluteMoniker": "D:0:0:{8A2A53B4-B6F1-47DC-A681-E1819AE39A0B}|Fin.Infrastructure\\Fin.Infrastructure.csproj|c:\\users\\gustavo passos\\desktop\\develop\\fin\\fin-backend\\fin.infrastructure\\authentications\\dtos\\loginoutput.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
+ "RelativeMoniker": "D:0:0:{8A2A53B4-B6F1-47DC-A681-E1819AE39A0B}|Fin.Infrastructure\\Fin.Infrastructure.csproj|solutionrelative:fin.infrastructure\\authentications\\dtos\\loginoutput.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
+ },
+ {
+ "AbsoluteMoniker": "D:0:0:{8A2A53B4-B6F1-47DC-A681-E1819AE39A0B}|Fin.Infrastructure\\Fin.Infrastructure.csproj|c:\\users\\gustavo passos\\desktop\\develop\\fin\\fin-backend\\fin.infrastructure\\firebases\\firebaseclient.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
+ "RelativeMoniker": "D:0:0:{8A2A53B4-B6F1-47DC-A681-E1819AE39A0B}|Fin.Infrastructure\\Fin.Infrastructure.csproj|solutionrelative:fin.infrastructure\\firebases\\firebaseclient.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
+ },
+ {
+ "AbsoluteMoniker": "D:0:0:{8A2A53B4-B6F1-47DC-A681-E1819AE39A0B}|Fin.Infrastructure\\Fin.Infrastructure.csproj|c:\\users\\gustavo passos\\desktop\\develop\\fin\\fin-backend\\fin.infrastructure\\firebases\\firebasenotificationservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
+ "RelativeMoniker": "D:0:0:{8A2A53B4-B6F1-47DC-A681-E1819AE39A0B}|Fin.Infrastructure\\Fin.Infrastructure.csproj|solutionrelative:fin.infrastructure\\firebases\\firebasenotificationservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
+ },
+ {
+ "AbsoluteMoniker": "D:0:0:{8A2A53B4-B6F1-47DC-A681-E1819AE39A0B}|Fin.Infrastructure\\Fin.Infrastructure.csproj|c:\\users\\gustavo passos\\desktop\\develop\\fin\\fin-backend\\fin.infrastructure\\firebases\\addfirebaseextension.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
+ "RelativeMoniker": "D:0:0:{8A2A53B4-B6F1-47DC-A681-E1819AE39A0B}|Fin.Infrastructure\\Fin.Infrastructure.csproj|solutionrelative:fin.infrastructure\\firebases\\addfirebaseextension.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
+ },
+ {
+ "AbsoluteMoniker": "D:0:0:{8A2A53B4-B6F1-47DC-A681-E1819AE39A0B}|Fin.Infrastructure\\Fin.Infrastructure.csproj|c:\\users\\gustavo passos\\desktop\\develop\\fin\\fin-backend\\fin.infrastructure\\redis\\addredisextension.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
+ "RelativeMoniker": "D:0:0:{8A2A53B4-B6F1-47DC-A681-E1819AE39A0B}|Fin.Infrastructure\\Fin.Infrastructure.csproj|solutionrelative:fin.infrastructure\\redis\\addredisextension.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
+ },
+ {
+ "AbsoluteMoniker": "D:0:0:{8A2A53B4-B6F1-47DC-A681-E1819AE39A0B}|Fin.Infrastructure\\Fin.Infrastructure.csproj|c:\\users\\gustavo passos\\desktop\\develop\\fin\\fin-backend\\fin.infrastructure\\notifications\\hubs\\notificationhub.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
+ "RelativeMoniker": "D:0:0:{8A2A53B4-B6F1-47DC-A681-E1819AE39A0B}|Fin.Infrastructure\\Fin.Infrastructure.csproj|solutionrelative:fin.infrastructure\\notifications\\hubs\\notificationhub.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
+ },
+ {
+ "AbsoluteMoniker": "D:0:0:{8A2A53B4-B6F1-47DC-A681-E1819AE39A0B}|Fin.Infrastructure\\Fin.Infrastructure.csproj|c:\\users\\gustavo passos\\desktop\\develop\\fin\\fin-backend\\fin.infrastructure\\notifications\\hubs\\customuseridprovider.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
+ "RelativeMoniker": "D:0:0:{8A2A53B4-B6F1-47DC-A681-E1819AE39A0B}|Fin.Infrastructure\\Fin.Infrastructure.csproj|solutionrelative:fin.infrastructure\\notifications\\hubs\\customuseridprovider.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
+ },
+ {
+ "AbsoluteMoniker": "D:0:0:{8A2A53B4-B6F1-47DC-A681-E1819AE39A0B}|Fin.Infrastructure\\Fin.Infrastructure.csproj|c:\\users\\gustavo passos\\desktop\\develop\\fin\\fin-backend\\fin.infrastructure\\notifications\\hubs\\addnotificationbackgroundjob.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
+ "RelativeMoniker": "D:0:0:{8A2A53B4-B6F1-47DC-A681-E1819AE39A0B}|Fin.Infrastructure\\Fin.Infrastructure.csproj|solutionrelative:fin.infrastructure\\notifications\\hubs\\addnotificationbackgroundjob.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
+ },
+ {
+ "AbsoluteMoniker": "D:0:0:{8A2A53B4-B6F1-47DC-A681-E1819AE39A0B}|Fin.Infrastructure\\Fin.Infrastructure.csproj|c:\\users\\gustavo passos\\desktop\\develop\\fin\\fin-backend\\fin.infrastructure\\consts\\appconsts.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
+ "RelativeMoniker": "D:0:0:{8A2A53B4-B6F1-47DC-A681-E1819AE39A0B}|Fin.Infrastructure\\Fin.Infrastructure.csproj|solutionrelative:fin.infrastructure\\consts\\appconsts.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
+ },
+ {
+ "AbsoluteMoniker": "D:0:0:{8A2A53B4-B6F1-47DC-A681-E1819AE39A0B}|Fin.Infrastructure\\Fin.Infrastructure.csproj|c:\\users\\gustavo passos\\desktop\\develop\\fin\\fin-backend\\fin.infrastructure\\firebases\\firebasesendresult.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
+ "RelativeMoniker": "D:0:0:{8A2A53B4-B6F1-47DC-A681-E1819AE39A0B}|Fin.Infrastructure\\Fin.Infrastructure.csproj|solutionrelative:fin.infrastructure\\firebases\\firebasesendresult.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
+ }
+ ],
+ "DocumentGroupContainers": [
+ {
+ "Orientation": 0,
+ "VerticalTabListWidth": 256,
+ "DocumentGroups": [
+ {
+ "DockedWidth": 200,
+ "SelectedChildIndex": 8,
+ "Children": [
+ {
+ "$type": "Document",
+ "DocumentIndex": 3,
+ "Title": "RandomGenerator.cs",
+ "DocumentMoniker": "C:\\Users\\Gustavo Passos\\Desktop\\Develop\\Fin\\fin-backend\\Fin.Application\\Globals\\Services\\RandomGenerator.cs",
+ "RelativeDocumentMoniker": "Fin.Application\\Globals\\Services\\RandomGenerator.cs",
+ "ToolTip": "C:\\Users\\Gustavo Passos\\Desktop\\Develop\\Fin\\fin-backend\\Fin.Application\\Globals\\Services\\RandomGenerator.cs",
+ "RelativeToolTip": "Fin.Application\\Globals\\Services\\RandomGenerator.cs",
+ "ViewState": "AgIAAAAAAAAAAAAAAAAAAAsAAAAbAAAAAAAAAA==",
+ "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
+ "WhenOpened": "2025-08-15T14:49:22.412Z",
+ "EditorCaption": ""
+ },
+ {
+ "$type": "Document",
+ "DocumentIndex": 4,
+ "Title": "AuthenticationService.cs",
+ "DocumentMoniker": "C:\\Users\\Gustavo Passos\\Desktop\\Develop\\Fin\\fin-backend\\Fin.Application\\Authentications\\Services\\AuthenticationService.cs",
+ "RelativeDocumentMoniker": "Fin.Application\\Authentications\\Services\\AuthenticationService.cs",
+ "ToolTip": "C:\\Users\\Gustavo Passos\\Desktop\\Develop\\Fin\\fin-backend\\Fin.Application\\Authentications\\Services\\AuthenticationService.cs",
+ "RelativeToolTip": "Fin.Application\\Authentications\\Services\\AuthenticationService.cs",
+ "ViewState": "AgIAABMAAAAAAAAAAIAwwCAAAAAAAAAAAAAAAA==",
+ "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
+ "WhenOpened": "2025-08-15T14:18:54.877Z",
+ "EditorCaption": ""
+ },
+ {
+ "$type": "Document",
+ "DocumentIndex": 5,
+ "Title": "UserDto.cs",
+ "DocumentMoniker": "C:\\Users\\Gustavo Passos\\Desktop\\Develop\\Fin\\fin-backend\\Fin.Domain\\Users\\Dtos\\UserDto.cs",
+ "RelativeDocumentMoniker": "Fin.Domain\\Users\\Dtos\\UserDto.cs",
+ "ToolTip": "C:\\Users\\Gustavo Passos\\Desktop\\Develop\\Fin\\fin-backend\\Fin.Domain\\Users\\Dtos\\UserDto.cs*",
+ "RelativeToolTip": "Fin.Domain\\Users\\Dtos\\UserDto.cs*",
+ "ViewState": "AgIAAAMAAAAAAAAAAAAAABEAAAAWAAAAAAAAAA==",
+ "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
+ "WhenOpened": "2025-08-15T14:05:36.16Z",
+ "EditorCaption": ""
+ },
+ {
+ "$type": "Document",
+ "DocumentIndex": 6,
+ "Title": "UserDeleteRequestDto.cs",
+ "DocumentMoniker": "C:\\Users\\Gustavo Passos\\Desktop\\Develop\\Fin\\fin-backend\\Fin.Domain\\Users\\Dtos\\UserDeleteRequestDto.cs",
+ "RelativeDocumentMoniker": "Fin.Domain\\Users\\Dtos\\UserDeleteRequestDto.cs",
+ "ToolTip": "C:\\Users\\Gustavo Passos\\Desktop\\Develop\\Fin\\fin-backend\\Fin.Domain\\Users\\Dtos\\UserDeleteRequestDto.cs",
+ "RelativeToolTip": "Fin.Domain\\Users\\Dtos\\UserDeleteRequestDto.cs",
+ "ViewState": "AgIAAAcAAAAAAAAAAAAQwB4AAAA1AAAAAAAAAA==",
+ "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
+ "WhenOpened": "2025-08-15T14:05:29.028Z",
+ "EditorCaption": ""
+ },
+ {
+ "$type": "Document",
+ "DocumentIndex": 7,
+ "Title": "NotificationUserDelivery.cs",
+ "DocumentMoniker": "C:\\Users\\Gustavo Passos\\Desktop\\Develop\\Fin\\fin-backend\\Fin.Domain\\Notifications\\Entities\\NotificationUserDelivery.cs",
+ "RelativeDocumentMoniker": "Fin.Domain\\Notifications\\Entities\\NotificationUserDelivery.cs",
+ "ToolTip": "C:\\Users\\Gustavo Passos\\Desktop\\Develop\\Fin\\fin-backend\\Fin.Domain\\Notifications\\Entities\\NotificationUserDelivery.cs",
+ "RelativeToolTip": "Fin.Domain\\Notifications\\Entities\\NotificationUserDelivery.cs",
+ "ViewState": "AgIAAAAAAAAAAAAAAAAAABEAAAAFAAAAAAAAAA==",
+ "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
+ "WhenOpened": "2025-08-15T13:11:44.769Z",
+ "EditorCaption": ""
+ },
+ {
+ "$type": "Document",
+ "DocumentIndex": 8,
+ "Title": "NotificationWay.cs",
+ "DocumentMoniker": "C:\\Users\\Gustavo Passos\\Desktop\\Develop\\Fin\\fin-backend\\Fin.Domain\\Notifications\\Enums\\NotificationWay.cs",
+ "RelativeDocumentMoniker": "Fin.Domain\\Notifications\\Enums\\NotificationWay.cs",
+ "ToolTip": "C:\\Users\\Gustavo Passos\\Desktop\\Develop\\Fin\\fin-backend\\Fin.Domain\\Notifications\\Enums\\NotificationWay.cs",
+ "RelativeToolTip": "Fin.Domain\\Notifications\\Enums\\NotificationWay.cs",
+ "ViewState": "AgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
+ "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
+ "WhenOpened": "2025-08-15T12:39:58.617Z",
+ "EditorCaption": ""
+ },
+ {
+ "$type": "Document",
+ "DocumentIndex": 1,
+ "Title": "TenantUser.cs",
+ "DocumentMoniker": "C:\\Users\\Gustavo Passos\\Desktop\\Develop\\Fin\\fin-backend\\Fin.Domain\\Tenants\\Entities\\TenantUser.cs",
+ "RelativeDocumentMoniker": "Fin.Domain\\Tenants\\Entities\\TenantUser.cs",
+ "ToolTip": "C:\\Users\\Gustavo Passos\\Desktop\\Develop\\Fin\\fin-backend\\Fin.Domain\\Tenants\\Entities\\TenantUser.cs",
+ "RelativeToolTip": "Fin.Domain\\Tenants\\Entities\\TenantUser.cs",
+ "ViewState": "AgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
+ "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
+ "WhenOpened": "2025-08-15T12:39:48.55Z",
+ "EditorCaption": ""
+ },
+ {
+ "$type": "Document",
+ "DocumentIndex": 2,
+ "Title": "Tenant.cs",
+ "DocumentMoniker": "C:\\Users\\Gustavo Passos\\Desktop\\Develop\\Fin\\fin-backend\\Fin.Domain\\Tenants\\Entities\\Tenant.cs",
+ "RelativeDocumentMoniker": "Fin.Domain\\Tenants\\Entities\\Tenant.cs",
+ "ToolTip": "C:\\Users\\Gustavo Passos\\Desktop\\Develop\\Fin\\fin-backend\\Fin.Domain\\Tenants\\Entities\\Tenant.cs",
+ "RelativeToolTip": "Fin.Domain\\Tenants\\Entities\\Tenant.cs",
+ "ViewState": "AgIAAAUAAAAAAAAAAAAxwBwAAAABAAAAAAAAAA==",
+ "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
+ "WhenOpened": "2025-08-15T12:39:38.11Z",
+ "EditorCaption": ""
+ },
+ {
+ "$type": "Document",
+ "DocumentIndex": 0,
+ "Title": "ActivatedUserMiddleware.cs",
+ "DocumentMoniker": "C:\\Users\\Gustavo Passos\\Desktop\\Develop\\Fin\\fin-backend\\Fin.Infrastructure\\Authentications\\ActivatedUserMiddleware.cs",
+ "RelativeDocumentMoniker": "Fin.Infrastructure\\Authentications\\ActivatedUserMiddleware.cs",
+ "ToolTip": "C:\\Users\\Gustavo Passos\\Desktop\\Develop\\Fin\\fin-backend\\Fin.Infrastructure\\Authentications\\ActivatedUserMiddleware.cs",
+ "RelativeToolTip": "Fin.Infrastructure\\Authentications\\ActivatedUserMiddleware.cs",
+ "ViewState": "AgIAAAYAAAAAAAAAAAAAABcAAAAJAAAAAAAAAA==",
+ "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
+ "WhenOpened": "2025-08-15T12:38:34.582Z",
+ "EditorCaption": ""
+ },
+ {
+ "$type": "Document",
+ "DocumentIndex": 9,
+ "Title": "UnitOfWork.cs",
+ "DocumentMoniker": "C:\\Users\\Gustavo Passos\\Desktop\\Develop\\Fin\\fin-backend\\Fin.Infrastructure\\UnitOfWorks\\UnitOfWork.cs",
+ "RelativeDocumentMoniker": "Fin.Infrastructure\\UnitOfWorks\\UnitOfWork.cs",
+ "ToolTip": "C:\\Users\\Gustavo Passos\\Desktop\\Develop\\Fin\\fin-backend\\Fin.Infrastructure\\UnitOfWorks\\UnitOfWork.cs",
+ "RelativeToolTip": "Fin.Infrastructure\\UnitOfWorks\\UnitOfWork.cs",
+ "ViewState": "AgIAADIAAAAAAAAAAAAUwAAAAAAAAAAAAAAAAA==",
+ "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
+ "WhenOpened": "2025-08-15T12:39:08.167Z",
+ "EditorCaption": ""
+ },
+ {
+ "$type": "Document",
+ "DocumentIndex": 10,
+ "Title": "LoginErrorCode.cs",
+ "DocumentMoniker": "C:\\Users\\Gustavo Passos\\Desktop\\Develop\\Fin\\fin-backend\\Fin.Infrastructure\\Authentications\\Enums\\LoginErrorCode.cs",
+ "RelativeDocumentMoniker": "Fin.Infrastructure\\Authentications\\Enums\\LoginErrorCode.cs",
+ "ToolTip": "C:\\Users\\Gustavo Passos\\Desktop\\Develop\\Fin\\fin-backend\\Fin.Infrastructure\\Authentications\\Enums\\LoginErrorCode.cs",
+ "RelativeToolTip": "Fin.Infrastructure\\Authentications\\Enums\\LoginErrorCode.cs",
+ "ViewState": "AgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
+ "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
+ "WhenOpened": "2025-08-15T12:38:20.554Z",
+ "EditorCaption": ""
+ },
+ {
+ "$type": "Document",
+ "DocumentIndex": 12,
+ "Title": "LoginOutput.cs",
+ "DocumentMoniker": "C:\\Users\\Gustavo Passos\\Desktop\\Develop\\Fin\\fin-backend\\Fin.Infrastructure\\Authentications\\Dtos\\LoginOutput.cs",
+ "RelativeDocumentMoniker": "Fin.Infrastructure\\Authentications\\Dtos\\LoginOutput.cs",
+ "ToolTip": "C:\\Users\\Gustavo Passos\\Desktop\\Develop\\Fin\\fin-backend\\Fin.Infrastructure\\Authentications\\Dtos\\LoginOutput.cs",
+ "RelativeToolTip": "Fin.Infrastructure\\Authentications\\Dtos\\LoginOutput.cs",
+ "ViewState": "AgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
+ "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
+ "WhenOpened": "2025-08-15T12:38:03.449Z",
+ "EditorCaption": ""
+ },
+ {
+ "$type": "Document",
+ "DocumentIndex": 11,
+ "Title": "LoginInput.cs",
+ "DocumentMoniker": "C:\\Users\\Gustavo Passos\\Desktop\\Develop\\Fin\\fin-backend\\Fin.Infrastructure\\Authentications\\Dtos\\LoginInput.cs",
+ "RelativeDocumentMoniker": "Fin.Infrastructure\\Authentications\\Dtos\\LoginInput.cs",
+ "ToolTip": "C:\\Users\\Gustavo Passos\\Desktop\\Develop\\Fin\\fin-backend\\Fin.Infrastructure\\Authentications\\Dtos\\LoginInput.cs",
+ "RelativeToolTip": "Fin.Infrastructure\\Authentications\\Dtos\\LoginInput.cs",
+ "ViewState": "AgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
+ "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
+ "WhenOpened": "2025-08-15T12:38:02.088Z",
+ "EditorCaption": ""
+ },
+ {
+ "$type": "Document",
+ "DocumentIndex": 13,
+ "Title": "FirebaseClient.cs",
+ "DocumentMoniker": "C:\\Users\\Gustavo Passos\\Desktop\\Develop\\Fin\\fin-backend\\Fin.Infrastructure\\Firebases\\FirebaseClient.cs",
+ "RelativeDocumentMoniker": "Fin.Infrastructure\\Firebases\\FirebaseClient.cs",
+ "ToolTip": "C:\\Users\\Gustavo Passos\\Desktop\\Develop\\Fin\\fin-backend\\Fin.Infrastructure\\Firebases\\FirebaseClient.cs",
+ "RelativeToolTip": "Fin.Infrastructure\\Firebases\\FirebaseClient.cs",
+ "ViewState": "AgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
+ "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
+ "WhenOpened": "2025-08-15T12:37:26.15Z",
+ "EditorCaption": ""
+ },
+ {
+ "$type": "Document",
+ "DocumentIndex": 14,
+ "Title": "FirebaseNotificationService.cs",
+ "DocumentMoniker": "C:\\Users\\Gustavo Passos\\Desktop\\Develop\\Fin\\fin-backend\\Fin.Infrastructure\\Firebases\\FirebaseNotificationService.cs",
+ "RelativeDocumentMoniker": "Fin.Infrastructure\\Firebases\\FirebaseNotificationService.cs",
+ "ToolTip": "C:\\Users\\Gustavo Passos\\Desktop\\Develop\\Fin\\fin-backend\\Fin.Infrastructure\\Firebases\\FirebaseNotificationService.cs",
+ "RelativeToolTip": "Fin.Infrastructure\\Firebases\\FirebaseNotificationService.cs",
+ "ViewState": "AgIAAAEAAAAAAAAAAAAgwAwAAAAkAAAAAAAAAA==",
+ "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
+ "WhenOpened": "2025-08-15T12:36:52.361Z",
+ "EditorCaption": ""
+ },
+ {
+ "$type": "Document",
+ "DocumentIndex": 15,
+ "Title": "AddFirebaseExtension.cs",
+ "DocumentMoniker": "C:\\Users\\Gustavo Passos\\Desktop\\Develop\\Fin\\fin-backend\\Fin.Infrastructure\\Firebases\\AddFirebaseExtension.cs",
+ "RelativeDocumentMoniker": "Fin.Infrastructure\\Firebases\\AddFirebaseExtension.cs",
+ "ToolTip": "C:\\Users\\Gustavo Passos\\Desktop\\Develop\\Fin\\fin-backend\\Fin.Infrastructure\\Firebases\\AddFirebaseExtension.cs",
+ "RelativeToolTip": "Fin.Infrastructure\\Firebases\\AddFirebaseExtension.cs",
+ "ViewState": "AgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
+ "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
+ "WhenOpened": "2025-08-15T12:36:48.056Z",
+ "EditorCaption": ""
+ },
+ {
+ "$type": "Document",
+ "DocumentIndex": 16,
+ "Title": "AddRedisExtension.cs",
+ "DocumentMoniker": "C:\\Users\\Gustavo Passos\\Desktop\\Develop\\Fin\\fin-backend\\Fin.Infrastructure\\Redis\\AddRedisExtension.cs",
+ "RelativeDocumentMoniker": "Fin.Infrastructure\\Redis\\AddRedisExtension.cs",
+ "ToolTip": "C:\\Users\\Gustavo Passos\\Desktop\\Develop\\Fin\\fin-backend\\Fin.Infrastructure\\Redis\\AddRedisExtension.cs",
+ "RelativeToolTip": "Fin.Infrastructure\\Redis\\AddRedisExtension.cs",
+ "ViewState": "AgIAAAAAAAAAAAAAAAAAABcAAAABAAAAAAAAAA==",
+ "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
+ "WhenOpened": "2025-08-15T12:36:15.37Z",
+ "EditorCaption": ""
+ },
+ {
+ "$type": "Document",
+ "DocumentIndex": 17,
+ "Title": "NotificationHub.cs",
+ "DocumentMoniker": "C:\\Users\\Gustavo Passos\\Desktop\\Develop\\Fin\\fin-backend\\Fin.Infrastructure\\Notifications\\Hubs\\NotificationHub.cs",
+ "RelativeDocumentMoniker": "Fin.Infrastructure\\Notifications\\Hubs\\NotificationHub.cs",
+ "ToolTip": "C:\\Users\\Gustavo Passos\\Desktop\\Develop\\Fin\\fin-backend\\Fin.Infrastructure\\Notifications\\Hubs\\NotificationHub.cs",
+ "RelativeToolTip": "Fin.Infrastructure\\Notifications\\Hubs\\NotificationHub.cs",
+ "ViewState": "AgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
+ "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
+ "WhenOpened": "2025-08-15T12:36:12.834Z",
+ "EditorCaption": ""
+ },
+ {
+ "$type": "Document",
+ "DocumentIndex": 18,
+ "Title": "CustomUserIdProvider.cs",
+ "DocumentMoniker": "C:\\Users\\Gustavo Passos\\Desktop\\Develop\\Fin\\fin-backend\\Fin.Infrastructure\\Notifications\\Hubs\\CustomUserIdProvider.cs",
+ "RelativeDocumentMoniker": "Fin.Infrastructure\\Notifications\\Hubs\\CustomUserIdProvider.cs",
+ "ToolTip": "C:\\Users\\Gustavo Passos\\Desktop\\Develop\\Fin\\fin-backend\\Fin.Infrastructure\\Notifications\\Hubs\\CustomUserIdProvider.cs",
+ "RelativeToolTip": "Fin.Infrastructure\\Notifications\\Hubs\\CustomUserIdProvider.cs",
+ "ViewState": "AgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
+ "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
+ "WhenOpened": "2025-08-15T12:36:09.812Z",
+ "EditorCaption": ""
+ },
+ {
+ "$type": "Document",
+ "DocumentIndex": 19,
+ "Title": "AddNotificationBackgroundJob.cs",
+ "DocumentMoniker": "C:\\Users\\Gustavo Passos\\Desktop\\Develop\\Fin\\fin-backend\\Fin.Infrastructure\\Notifications\\Hubs\\AddNotificationBackgroundJob.cs",
+ "RelativeDocumentMoniker": "Fin.Infrastructure\\Notifications\\Hubs\\AddNotificationBackgroundJob.cs",
+ "ToolTip": "C:\\Users\\Gustavo Passos\\Desktop\\Develop\\Fin\\fin-backend\\Fin.Infrastructure\\Notifications\\Hubs\\AddNotificationBackgroundJob.cs",
+ "RelativeToolTip": "Fin.Infrastructure\\Notifications\\Hubs\\AddNotificationBackgroundJob.cs",
+ "ViewState": "AgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
+ "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
+ "WhenOpened": "2025-08-15T12:36:07.883Z",
+ "EditorCaption": ""
+ },
+ {
+ "$type": "Document",
+ "DocumentIndex": 20,
+ "Title": "AppConsts.cs",
+ "DocumentMoniker": "C:\\Users\\Gustavo Passos\\Desktop\\Develop\\Fin\\fin-backend\\Fin.Infrastructure\\Consts\\AppConsts.cs",
+ "RelativeDocumentMoniker": "Fin.Infrastructure\\Consts\\AppConsts.cs",
+ "ToolTip": "C:\\Users\\Gustavo Passos\\Desktop\\Develop\\Fin\\fin-backend\\Fin.Infrastructure\\Consts\\AppConsts.cs",
+ "RelativeToolTip": "Fin.Infrastructure\\Consts\\AppConsts.cs",
+ "ViewState": "AgIAAAAAAAAAAAAAAAAAAAUAAAABAAAAAAAAAA==",
+ "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
+ "WhenOpened": "2025-08-15T12:35:46.004Z",
+ "EditorCaption": ""
+ },
+ {
+ "$type": "Document",
+ "DocumentIndex": 21,
+ "Title": "FirebaseSendResult.cs",
+ "DocumentMoniker": "C:\\Users\\Gustavo Passos\\Desktop\\Develop\\Fin\\fin-backend\\Fin.Infrastructure\\Firebases\\FirebaseSendResult.cs",
+ "RelativeDocumentMoniker": "Fin.Infrastructure\\Firebases\\FirebaseSendResult.cs",
+ "ToolTip": "C:\\Users\\Gustavo Passos\\Desktop\\Develop\\Fin\\fin-backend\\Fin.Infrastructure\\Firebases\\FirebaseSendResult.cs",
+ "RelativeToolTip": "Fin.Infrastructure\\Firebases\\FirebaseSendResult.cs",
+ "ViewState": "AgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
+ "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
+ "WhenOpened": "2025-08-15T12:32:54.541Z",
+ "EditorCaption": ""
+ }
+ ]
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/.vs/ProjectEvaluation/fin-backend.metadata.v9.bin b/.vs/ProjectEvaluation/fin-backend.metadata.v9.bin
new file mode 100644
index 0000000..f3a089d
Binary files /dev/null and b/.vs/ProjectEvaluation/fin-backend.metadata.v9.bin differ
diff --git a/.vs/ProjectEvaluation/fin-backend.projects.v9.bin b/.vs/ProjectEvaluation/fin-backend.projects.v9.bin
new file mode 100644
index 0000000..8d5050b
Binary files /dev/null and b/.vs/ProjectEvaluation/fin-backend.projects.v9.bin differ
diff --git a/.vs/ProjectEvaluation/fin-backend.strings.v9.bin b/.vs/ProjectEvaluation/fin-backend.strings.v9.bin
new file mode 100644
index 0000000..c462925
Binary files /dev/null and b/.vs/ProjectEvaluation/fin-backend.strings.v9.bin differ
diff --git a/DOCKER.md b/DOCKER.md
new file mode 100644
index 0000000..f43d35e
--- /dev/null
+++ b/DOCKER.md
@@ -0,0 +1,67 @@
+[🇧🇷 Em portugês](./assets/DOCKER_pt-br.md)
+
+
+# Docker Compose - Fin Backend Infrastructure
+
+## How to run PostgreSQL and Redis databases
+
+1. **Start the services (PostgreSQL + Redis):**
+ ```
+ docker compose up -d
+ ```
+ This will create the following containers:
+
+ **PostgreSQL:**
+ - Container: `fin_app`
+ - Database: `fin_app`
+ - User: `fin_app`
+ - Password: `fin_app`
+ - Port: `5432`
+
+ **Redis:**
+ - Container: `fin_redis`
+ - Port: `6379`
+ - Version: Redis 7 (Alpine)
+
+ **Check if the containers are running:**
+ ```
+ docker ps -a
+ ```
+
+2. **Configure the connection strings in your `appsettings.json`:**
+ **To run the application locally:**
+ ```json
+ "ConnectionStrings": {
+ "DefaultConnection": "Host=localhost;Port=5432;Database=fin_app;Username=fin_app;Password=fin_app"
+ },
+ "ApiSettings": {
+ "Redis": "localhost:6379"
+ }
+ ```
+
+3. **Verify everything is ok:**
+ ```
+ dotnet build
+ ```
+
+4. **Start the application:**
+ ```
+ dotnet run --project .\Fin.Api\
+ ```
+---
+## Notes
+
+### PostgreSQL
+- The PostgreSQL container can be accessed via any PostgreSQL client on port `5432`.
+- Entity Framework Core migrations create all necessary tables for all project domains.
+
+### Redis
+- Redis is used for caching and sessions in the project.
+- Default port: `6379`
+- Redis data is persisted in the `redis_data` volume
+- Health check configured to verify if the service is active
+
+### Development
+- The `dotnet build` command checks if the project compiles correctly.
+- The `dotnet run` command starts the API.
+- Make sure both PostgreSQL and Redis are running before starting the application.
\ No newline at end of file
diff --git a/Fin-Backend.sln.DotSettings.user b/Fin-Backend.sln.DotSettings.user
new file mode 100644
index 0000000..67f132d
--- /dev/null
+++ b/Fin-Backend.sln.DotSettings.user
@@ -0,0 +1,4 @@
+
+ <SessionState ContinuousTestingMode="0" IsActive="True" Name="All tests from Solution" xmlns="urn:schemas-jetbrains-com:jetbrains-ut-session">
+ <Solution />
+</SessionState>
\ No newline at end of file
diff --git a/Fin.Api/Fin.Api.csproj.user b/Fin.Api/Fin.Api.csproj.user
new file mode 100644
index 0000000..9ff5820
--- /dev/null
+++ b/Fin.Api/Fin.Api.csproj.user
@@ -0,0 +1,6 @@
+
+
+
+ https
+
+
\ No newline at end of file
diff --git a/Fin.Api/appsettings.json b/Fin.Api/appsettings.json
index 1f56543..53bd729 100644
--- a/Fin.Api/appsettings.json
+++ b/Fin.Api/appsettings.json
@@ -6,11 +6,11 @@
}
},
"ConnectionStrings": {
- "DefaultConnection": "EXEMPLE"
+ "DefaultConnection": "Host=localhost;Port=5432;Database=fin_app;Username=fin_app;Password=fin_app"
},
"AllowedHosts": "*",
"ApiSettings": {
- "Redis": "EXEMPLE",
+ "Redis": "localhost:6379",
"Version": "EXEMPLE",
"EmailSender": {
"EmailAddress": "EXEMPLE",
diff --git a/README.md b/README.md
index 9365ca7..6cd1f81 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-[Em portugês](./assets/README_pt-br.md)
+[🇧🇷 Em portugês](./assets/README_pt-br.md)
## Overview
FinApp is a modern, intuitive personal finance management solution designed to help young adults and teenagers take control of their finances. This backend provides secure, scalable APIs powering Fin’s web and mobile experiences, replacing traditional spreadsheets with a more engaging and accessible digital approach.
diff --git a/assets/DOCKER_pt-br.md b/assets/DOCKER_pt-br.md
new file mode 100644
index 0000000..5148f4c
--- /dev/null
+++ b/assets/DOCKER_pt-br.md
@@ -0,0 +1,115 @@
+[🇺🇸 In english](../DOCKER.md)
+
+# Docker Compose - Fin Backend Infrastructure
+
+## Como rodar o banco de dados PostgreSQL e Redis
+
+1. **Suba os serviços (PostgreSQL + Redis):**
+ ```
+ docker compose up -d
+ ```
+ Isso irá criar os seguintes containers:
+
+ **PostgreSQL:**
+ - Container: `fin_app`
+ - Banco: `fin_app`
+ - Usuário: `fin_app`
+ - Senha: `fin_app`
+ - Porta: `5432`
+
+ **Redis:**
+ - Container: `fin_redis`
+ - Porta: `6379`
+ - Versão: Redis 7 (Alpine)
+
+ **Verificar se os containers estão rodando:**
+ ```
+ docker ps -a
+ ```
+
+2. **Configure as connection strings no seu `appsettings.json`:**
+ **Para rodar a aplicação localmente:**
+ ```json
+ "ConnectionStrings": {
+ "DefaultConnection": "Host=localhost;Port=5432;Database=fin_app;Username=fin_app;Password=fin_app"
+ },
+ "ApiSettings": {
+ "Redis": "localhost:6379"
+ }
+ ```
+
+3. **Verifique se tudo está ok:**
+ ```
+ dotnet build
+ ```
+
+4. **Inicie a aplicação:**
+ ```
+ dotnet run --project .\Fin.Api\
+ ```
+---
+## Observações
+
+### PostgreSQL
+- O container do PostgreSQL pode ser acessado via qualquer cliente PostgreSQL na porta `5432`.
+- As migrations do Entity Framework Core criam todas as tabelas necessárias para todos os domínios do projeto.
+
+### Redis
+- O Redis é usado para cache e sessões no projeto.
+- Porta padrão: `6379`
+- Os dados do Redis são persistidos no volume `redis_data`
+- Health check configurado para verificar se o serviço está ativo
+
+### Desenvolvimento
+- O comando `dotnet build` verifica se o projeto está compilando corretamente.
+- O comando `dotnet run` inicia a API.
+- Certifique-se de que tanto PostgreSQL quanto Redis estejam rodando antes de iniciar a aplicação.
+
+**Se já possui o banco e Redis configurados, utilize suas variáveis de ambiente em um `.env`:**
+ ```json
+ "ConnectionStrings": {
+ "DefaultConnection": "Host=${POSTGRES_HOST};Port=${POSTGRES_PORT};Database=${POSTGRES_DB};Username=${POSTGRES_USER};Password=${POSTGRES_PASSWORD}"
+ },
+ "ApiSettings": {
+ "Redis": "${REDIS_HOST}:${REDIS_PORT}"
+ }
+ ```
+
+ **Exemplo de arquivo `.env`:**
+ ```env
+ POSTGRES_HOST=localhost
+ POSTGRES_PORT=5432
+ POSTGRES_DB=fin_app
+ POSTGRES_USER=fin_app
+ POSTGRES_PASSWORD=fin_app
+ REDIS_HOST=localhost
+ REDIS_PORT=6379
+ ```
+
+---
+## Comandos úteis
+
+**Para parar os serviços:**
+```
+docker compose down
+```
+
+**Para parar e remover volumes (CUIDADO: apaga os dados):**
+```
+docker compose down -v
+```
+
+**Para ver os logs dos containers:**
+```
+docker compose logs -f
+```
+
+**Para conectar diretamente ao PostgreSQL:**
+```
+docker exec -it fin_app psql -U fin_app -d fin_app
+```
+
+**Para conectar diretamente ao Redis:**
+```
+docker exec -it fin_redis redis-cli
+```
\ No newline at end of file
diff --git a/assets/README_pt-br.md b/assets/README_pt-br.md
index 590368c..a01393c 100644
--- a/assets/README_pt-br.md
+++ b/assets/README_pt-br.md
@@ -1,4 +1,4 @@
-[In english](../README.md)
+[🇺🇸 In english](../README.md)
## Visão Geral
diff --git a/docker-compose.yml b/docker-compose.yml
new file mode 100644
index 0000000..7f54fc6
--- /dev/null
+++ b/docker-compose.yml
@@ -0,0 +1,38 @@
+version: '3.8'
+
+services:
+ postgres:
+ image: postgres:16
+ container_name: fin_app
+ restart: always
+ environment:
+ POSTGRES_DB: fin_app
+ POSTGRES_USER: fin_app
+ POSTGRES_PASSWORD: fin_app
+ ports:
+ - "5432:5432"
+ volumes:
+ - postgres_data:/var/lib/postgresql/data
+ healthcheck:
+ test: ["CMD-SHELL", "pg_isready -U fin_app"]
+ interval: 10s
+ timeout: 5s
+ retries: 5
+
+ redis:
+ image: redis:7-alpine
+ container_name: fin_redis
+ restart: always
+ ports:
+ - "6379:6379"
+ volumes:
+ - redis_data:/data
+ healthcheck:
+ test: ["CMD", "redis-cli", "ping"]
+ interval: 10s
+ timeout: 3s
+ retries: 5
+
+volumes:
+ postgres_data:
+ redis_data:
diff --git a/notifications.md b/notifications.md
deleted file mode 100644
index e1f9e87..0000000
--- a/notifications.md
+++ /dev/null
@@ -1,45 +0,0 @@
-# Notification System Rules - Technical Specification
-
-## Email & Snack Notifications
-
-### Delivery Rules
-- **Single delivery**: Sent once and immediately marked as sent
-- **Scheduled delivery**: Must have a specific time to be sent
-- **No end date**: Cannot have an end date configured
-- **Non-continuous**: Cannot be set as continuous notifications
-
-### Trigger Behavior
-- **On start**: Send email immediately when notification starts
-- **User logged in**: Send push notification if user is logged in when notification starts
-- **Firebase integration**: Send to Firebase but do NOT mark as read (frontend must handle marking as read)
-
-### Visibility Rules
-- **Email**: Not available in `GetUnvisualizedNotifications` endpoint (called by frontend on startup or notification loading)
-- **Push**: Automatically marked as visualized in `GetUnvisualizedNotifications`
-
-## Push & Message Notifications
-
-### Delivery Rules
-- **End date support**: Can have an end date for delivery
-- **Continuous support**: Messages can be set as continuous notifications
-- **Trigger condition**: Send when start date is reached, if user is logged in OR send to Firebase
-
-### Visibility Rules
-- **Availability**: Available in `GetUnvisualizedNotifications` but NOT automatically marked as visualized
-- **Push notifications**: Must wait for user to click or clear to mark as visualized
-- **Messages (non-continuous)**: Marked as visualized when user clicks "OK"
-- **Messages (continuous)**: Marked as visualized only when user clicks "Don't show again"
-- **Message Clicked**: open the message on screen
-- **Messages**: message can be removed, than mark as read
-
-### UI Behavior
-- **Side menu**: Both message and push notifications remain in side menu until marked as visualized
-- **Screen display**: Messages appear on screen when received via notification hub
-
-## API Endpoint Specifications
-
-### GetUnvisualizedNotifications
-- **Includes**: Push notifications, Message notifications, Snack notifications
-- **Excludes**: Email notifications
-- **Auto-marking**: Only Push notifications are automatically marked as visualized
-- **Manual marking**: Message asn push notifications require user interaction to be marked as visualized
\ No newline at end of file