From 648b4f9ef00e8a07563feb6fe2e6a565cce87d12 Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Wed, 11 Jun 2025 19:33:21 +0530 Subject: [PATCH] Implemented firebase client and sended push notification to mobile app --- .../Dtos/Attendance/RecordAttendanceDot.cs | 1 + .../Controllers/AttendanceController.cs | 14 ++++++++++++++ Marco.Pms.Services/FireBase/service-account.json | 13 +++++++++++++ Marco.Pms.Services/Marco.Pms.Services.csproj | 2 ++ Marco.Pms.Services/Program.cs | 9 +++++++++ 5 files changed, 39 insertions(+) create mode 100644 Marco.Pms.Services/FireBase/service-account.json diff --git a/Marco.Pms.Model/Dtos/Attendance/RecordAttendanceDot.cs b/Marco.Pms.Model/Dtos/Attendance/RecordAttendanceDot.cs index 14967e8..0df6f66 100644 --- a/Marco.Pms.Model/Dtos/Attendance/RecordAttendanceDot.cs +++ b/Marco.Pms.Model/Dtos/Attendance/RecordAttendanceDot.cs @@ -19,6 +19,7 @@ namespace Marco.Pms.Model.Dtos.Attendance public ATTENDANCE_MARK_TYPE Action { get; set; } public FileUploadModel? Image { get; set; } + public string DeviceToken { get; set; } = string.Empty; } public enum ATTENDANCE_MARK_TYPE diff --git a/Marco.Pms.Services/Controllers/AttendanceController.cs b/Marco.Pms.Services/Controllers/AttendanceController.cs index 5c7104d..e54fca0 100644 --- a/Marco.Pms.Services/Controllers/AttendanceController.cs +++ b/Marco.Pms.Services/Controllers/AttendanceController.cs @@ -1,4 +1,5 @@ using System.Globalization; +using FirebaseAdmin.Messaging; using Marco.Pms.DataAccess.Data; using Marco.Pms.Model.AttendanceModule; using Marco.Pms.Model.Dtos.Attendance; @@ -599,6 +600,7 @@ namespace MarcoBMS.Services.Controllers using var transaction = await _context.Database.BeginTransactionAsync(); try { + Attendance? attendance = await _context.Attendes.FirstOrDefaultAsync(a => a.Id == recordAttendanceDot.Id && a.TenantId == TenantId); ; if (recordAttendanceDot.MarkTime == null) @@ -806,6 +808,18 @@ namespace MarcoBMS.Services.Controllers PreSignedUrl = string.Empty }; } + var message = new Message() + { + Token = recordAttendanceDot.DeviceToken, + Notification = new Notification + { + Title = "Hello from .NET", + Body = "This is a test message" + } + }; + string response = await FirebaseMessaging.DefaultInstance.SendAsync(message); + _logger.LogInfo("Firebase push notification messageId: {MessageId}", response); + _logger.LogInfo("Attendance for employee {FirstName} {LastName} has been marked", employee.FirstName ?? string.Empty, employee.LastName ?? string.Empty); return Ok(ApiResponse.SuccessResponse(vm, "Attendance marked successfully.", 200)); diff --git a/Marco.Pms.Services/FireBase/service-account.json b/Marco.Pms.Services/FireBase/service-account.json new file mode 100644 index 0000000..cf4715d --- /dev/null +++ b/Marco.Pms.Services/FireBase/service-account.json @@ -0,0 +1,13 @@ +{ + "type": "service_account", + "project_id": "marcopms-mobileapp", + "private_key_id": "5ee56ae12fbbfd95f46c613db3aa966fe26fe1b6", + "private_key": "-----BEGIN PRIVATE KEY-----\nMIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDJrORK61zoPVTw\nr8TkLbgV9qejyTD6OP67fMsxgJDSr8Fq6AJxKNfIMD+RhH44/etUeoHMDoYXQY5k\nu9sRaHnh1Hk62FJSm4SnhwwMdjVZT4xakuq4cfWfXBu3lQJHXfZEXJIjTwLr3Jb4\nryWVndEAI0/mT2drJc3riGLYCDEf4A79RXAzqGqg4A539JJ5+3zAtqepTbGpZ/cO\nJOmLP8k27Pm7lvuiyl4f16Xw0V00s1RCnFJIyBrrCqtCT5vTWdZ7a5ka10HgCFlW\nPUwjfB7b1rqSXmxsCOuRma2fQYc0cIhnFvXh71pC4kP0/V9K6cWxS97i1URU0hhi\nVOPoZ+j3AgMBAAECggEAOfUXvngZQRyvFmRM/w4sgxNZZfZhvuc2PYdFlbpO5F1i\nBmkamo6URJGpExayd4pxYNu8BXp/CpvqYgSilkQiEsZO+JxGPDs5SjPDQKmP91Sn\nDzh9f/gwEFYWGRIXj47vQQIhdUg1nLbOJDWhZXfvIk0DnzpejCpXHUMatN7Vz0TA\nAfj9mMcptXBNtLKl59sDkkscEj3Uf/s0d//jrhhEOsyid+slgIpRpQzgHQBavi0d\nhT/aVnBE9NiCgkZARVjcljIXTg24rYrARHYjsN066WdOF2uVnUNrxOgLQfzE7ZOe\nWzF0PDWyJe4FBjabIOHqFw4Nt3j2EakXUJ6Q/PVukQKBgQDvj2mv+0myeP5Wc5Cu\nW9BVrE41Q8nBq0D5CTIyklAP7SVOakmzjzbRV2rjL3Gnzo27tK3aUQjetTMYv5fk\nUUMJkzGvpgJW44qtULHP5gvkaPjV18CwvQv8KyyEOnF7uWkXquJ+9nfrzDaocx/X\nA1wx3Csvd/tTePSCY0uBCIMCFQKBgQDXg+tAiTUesGB3YpS77oc1XHdB9j+/anzx\n2e/PcGMzY2BZdNZ23avS0dnWfkZ1Eocxma8UP+okIvSyMpD4kSlJeya56HZU748E\nvJM7HlqCuYRvVbXVAiHrdC87eKhCzA9MNwBpy0fTbuudaDU2Z9WhoRgHqnte8vvw\nLCNTcKXd2wKBgQCT+cBM5in1xmtEt4ntSeV8pjyBBmh/6urtadLKDjrKO7BJqbnw\n4kv4L8lkoA/SmfJOuiKRsnCKMN9pMCAA9nk0VungF+lmBpPIzwmm4/EAnB7o6Kas\nBXp7v6d13ivvQu45omLaDiCxVKmGj+ZhCEBQxDEg1zo1q4dNa0xeXgWeqQKBgC0Z\n41qPHDm+6YEydTPbGBqXrjF0qiSR0XH/jMsZlvkDG/+8jsEzZKjq166moHIRnY9I\nvTX8pjBHzHOaV3JdVomVJyaSumjN9V0lZZ5inMhssIVoJ3RbTOPsXZIRjwzjjXQC\nsqhxLSfXN6GqVDB9jFyVzOSVzdmx+f1qDz5//YYvAoGAKPZazVtNAXf1/qgBEivE\ncSFaGhdcw35Pwk9CNwKtRT2DFOVQEvd18xY5Naqnm6thYv+UUEAQzGS/6mBUXsOi\n7nDsEN2P40o/eR6x10ZExwsqzIeOTd16fRiQyoMIEOQ7bkGO4KeZ8zAeqKelQxhU\njigmeDSw8y+HfTx74P7yAtI=\n-----END PRIVATE KEY-----\n", + "client_email": "firebase-adminsdk-fbsvc@marcopms-mobileapp.iam.gserviceaccount.com", + "client_id": "107885185225751718454", + "auth_uri": "https://accounts.google.com/o/oauth2/auth", + "token_uri": "https://oauth2.googleapis.com/token", + "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs", + "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/firebase-adminsdk-fbsvc%40marcopms-mobileapp.iam.gserviceaccount.com", + "universe_domain": "googleapis.com" +} diff --git a/Marco.Pms.Services/Marco.Pms.Services.csproj b/Marco.Pms.Services/Marco.Pms.Services.csproj index 6482198..bf0a08f 100644 --- a/Marco.Pms.Services/Marco.Pms.Services.csproj +++ b/Marco.Pms.Services/Marco.Pms.Services.csproj @@ -12,6 +12,8 @@ + + diff --git a/Marco.Pms.Services/Program.cs b/Marco.Pms.Services/Program.cs index e57fa15..2443f37 100644 --- a/Marco.Pms.Services/Program.cs +++ b/Marco.Pms.Services/Program.cs @@ -1,4 +1,6 @@ using System.Text; +using FirebaseAdmin; +using Google.Apis.Auth.OAuth2; using Marco.Pms.DataAccess.Data; using Marco.Pms.Model.Authentication; using Marco.Pms.Model.Entitlements; @@ -170,6 +172,13 @@ builder.WebHost.ConfigureKestrel(options => options.AddServerHeader = false; // Disable the "Server" header }); +string path = Path.Combine(builder.Environment.ContentRootPath, "FireBase", "service-account.json"); + +FirebaseApp.Create(new AppOptions() +{ + Credential = GoogleCredential.FromFile(path), +}); + var app = builder.Build(); app.UseMiddleware();