From e008e66a515dd9fb8e642136be80121908083150 Mon Sep 17 00:00:00 2001 From: venbaittech Date: Fri, 24 Jan 2025 17:01:30 +0530 Subject: [PATCH] logo and username change --- main.go | 92 +++++++++++++++++++++++++++++++++++++------- pb_data/config.json | 3 ++ pb_data/logs.db | Bin 770048 -> 770048 bytes 3 files changed, 82 insertions(+), 13 deletions(-) diff --git a/main.go b/main.go index bb036b6..fe2792f 100644 --- a/main.go +++ b/main.go @@ -336,6 +336,7 @@ func TranslateFilters(app *pocketbase.PocketBase, dataset string, filterGroups [ var app *pocketbase.PocketBase func main() { + const baseUrl = "https://pb.venbait.in" app = pocketbase.New() @@ -670,10 +671,23 @@ func main() { app.OnRecordAfterCreateRequest().Add(func(e *core.RecordCreateEvent) error { if e.Record.Collection().Name == "users" { // Retrieve user details - name := e.Record.GetString("username") + name := e.Record.GetString("uname") email := e.Record.GetString("email") userID := e.Record.Id // User ID + imageRecord, err := app.Dao().FindFirstRecordByData("images", "file_name", "app_logo") + if err != nil { + log.Printf("Failed to fetch logo from images collection: %v", err) + return nil + } + + // Construct the logo URL + logoURL := fmt.Sprintf("%s/api/files/images/%s/%s", + baseUrl, + imageRecord.Id, + imageRecord.GetString("file"), + ) + // Email subject subject := "Please Verify Your Email Address" @@ -690,9 +704,12 @@ func main() { Verify Email

If you did not register for this account, please ignore this email.

+
+

Best regards,

+ FCSC Logo - `, name, verificationURL) + `, name, verificationURL, logoURL) // Create the email message message := &mailer.Message{ @@ -711,7 +728,7 @@ func main() { } // Send the email - err := app.NewMailClient().Send(message) + err = app.NewMailClient().Send(message) if err != nil { log.Printf("Failed to send verification email to user: %v", err) return err @@ -1039,7 +1056,7 @@ func main() { return err } - userName := user.GetString("username") + userName := user.GetString("uname") // Extract and format the creation time createdTime := e.Record.Get("created").(types.DateTime) // Extract created time @@ -1055,6 +1072,19 @@ func main() { // Email subject subject := "UAE Stats Feedback" + imageRecord, err := app.Dao().FindFirstRecordByData("images", "file_name", "app_logo") + if err != nil { + log.Printf("Failed to fetch logo from images collection: %v", err) + return nil + } + + // Construct the logo URL + logoURL := fmt.Sprintf("%s/api/files/images/%s/%s", + baseUrl, + imageRecord.Id, + imageRecord.GetString("file"), + ) + // Email body in HTML format body := fmt.Sprintf(` @@ -1079,10 +1109,10 @@ func main() { 1. %s

Thank you,

-

The FCSC App Team

+ FCSC Logo - `, adminName, userName, formattedDate, formattedDateTime, emojiRating, easeOfUse, quality, design, redundancy, additionalFeedback) + `, adminName, userName, formattedDate, formattedDateTime, emojiRating, easeOfUse, quality, design, redundancy, additionalFeedback, logoURL) // Define the target type (e.g., "smtp") targetType := "feedback_receive_mail" @@ -1198,6 +1228,8 @@ func main() { } } +const baseUrl = "https://pb.venbait.in" + // generateOTP generates a random 4-digit OTP func generateOTP() (int, error) { max := big.NewInt(10000) // 4-digit numbers range: 0000 to 9999 @@ -1345,7 +1377,7 @@ func verifyEmailHandler(c echo.Context) error { `) // Fetch user details for email notification - username := record.GetString("username") + username := record.GetString("uname") userEmail := record.GetString("email") // Send admin email asynchronously @@ -1364,6 +1396,20 @@ func sendAdminEmail(app *pocketbase.PocketBase, userID, username, userEmail stri adminName := "Admin" subject := "New User Registration Pending Review" + // Fetch the image file URL from the PocketBase collection + imageRecord, err := app.Dao().FindFirstRecordByData("images", "file_name", "app_logo") + if err != nil { + log.Printf("Failed to fetch logo from images collection: %v", err) + return nil + } + + // Construct the logo URL + logoURL := fmt.Sprintf("%s/api/files/images/%s/%s", + baseUrl, + imageRecord.Id, + imageRecord.GetString("file"), + ) + body := fmt.Sprintf(` @@ -1377,9 +1423,11 @@ func sendAdminEmail(app *pocketbase.PocketBase, userID, username, userEmail stri Approve Reject

+

Thank you,

+ FCSC Logo - `, adminName, username, userEmail, userID, userID) + `, adminName, username, userEmail, userID, userID, logoURL) emailConfig, err := app.Dao().FindFirstRecordByData("email_configuration", "type", "admin_receive_mail") if err != nil { @@ -1412,12 +1460,25 @@ func sendAdminEmail(app *pocketbase.PocketBase, userID, username, userEmail stri func sendStatusChangeEmail(app *pocketbase.PocketBase, record *models.Record, newStatus string) error { userEmail := record.GetString("email") - userName := record.GetString("username") + userName := record.GetString("uname") if userEmail == "" { return fmt.Errorf("user email is empty") } + imageRecord, err := app.Dao().FindFirstRecordByData("images", "file_name", "app_logo") + if err != nil { + log.Printf("Failed to fetch logo from images collection: %v", err) + return nil + } + + // Construct the logo URL + logoURL := fmt.Sprintf("%s/api/files/images/%s/%s", + baseUrl, + imageRecord.Id, + imageRecord.GetString("file"), + ) + var subject, body string if newStatus == "Approved" { @@ -1427,7 +1488,10 @@ func sendStatusChangeEmail(app *pocketbase.PocketBase, record *models.Record, ne

We are pleased to inform you that your registration with FCSC has been approved. You can now log in using the credentials that you had created.

Please access your account using the following link: Login.

If you have any questions, please feel free to contact us for further clarification.

- `, userName) +
+

Best regards,

+ FCSC Logo + `, userName, logoURL) } else if newStatus == "Denied" { subject = "Registration Update – FCSC" body = fmt.Sprintf(` @@ -1435,8 +1499,10 @@ func sendStatusChangeEmail(app *pocketbase.PocketBase, record *models.Record, ne

Thank you for registering with FCSC. After careful review, we regret to inform you that your registration has not been approved at this time.

If you have any questions or believe this decision was made in error, please feel free to contact us for further clarification.

We appreciate your understanding and thank you for your interest.

-

Best regards,

- `, userName) +
+

Best regards,

+ FCSC Logo + `, userName, logoURL) } else { // If the status is neither "Approved" nor "Denied", skip sending an email return nil @@ -1458,7 +1524,7 @@ func sendStatusChangeEmail(app *pocketbase.PocketBase, record *models.Record, ne HTML: body, } - err := app.NewMailClient().Send(message) + err = app.NewMailClient().Send(message) if err != nil { return fmt.Errorf("failed to send email: %v", err) } diff --git a/pb_data/config.json b/pb_data/config.json index ad7082d..fdc6296 100644 --- a/pb_data/config.json +++ b/pb_data/config.json @@ -7,6 +7,9 @@ "tls": true, "fromAddress": "bbone@venbait.in", "fromName": "FCSC" + }, + "meta": { + "publicUrl": "https://pb.venbait.in" } } diff --git a/pb_data/logs.db b/pb_data/logs.db index ad90531cb6f2eabbddf8784685b6122fb4c86650..bfd14c7bb0f6cb0c6e3468bc7740ac53767a727f 100644 GIT binary patch delta 11640 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