From 4ecc7d0ba2417862a500c1fd36426b1f0a6b9d70 Mon Sep 17 00:00:00 2001 From: Gowtham M Date: Thu, 16 Jan 2025 09:20:10 +0530 Subject: [PATCH] KPI name change : GWM --- main.go | 1218 ++++++++++++++++++----------------- pb_data/data.db | Bin 176128 -> 184320 bytes pb_data/data.db-shm | Bin 32768 -> 32768 bytes pb_data/data.db-wal | Bin 16512 -> 49472 bytes pb_data/logs.db | Bin 770048 -> 770048 bytes pb_data/logs.db-shm | Bin 32768 -> 32768 bytes pb_data/logs.db-wal | Bin 90672 -> 156592 bytes utils/process_chart_data.go | 48 ++ 8 files changed, 662 insertions(+), 604 deletions(-) create mode 100644 utils/process_chart_data.go diff --git a/main.go b/main.go index 3a4fbd0..53c515c 100644 --- a/main.go +++ b/main.go @@ -11,6 +11,8 @@ import ( "net/http" "net/mail" "os" + + // "pocketbase/utils" "strings" "time" @@ -337,6 +339,311 @@ func main() { app = pocketbase.New() + //app.Router.GET("/verify-email", verifyEmailHandler) + + app.OnBeforeServe().Add(func(e *core.ServeEvent) error { + + e.Router.GET("/api/custom/apicalltest", func(c echo.Context) error { + // Get the database instance + db := app.Dao().DB() + + // Define the struct for the expected result + type Chart struct { + Dataset string `json:"dataset"` + Key string `json:"key"` + Value string `json:"value"` + ValueEn string `json:"value_en"` + ValueAr string `json:"value_ar"` + } + + // Query to fetch the data + sqlQuery := "SELECT * FROM charts_variables" + var results []Chart + + // Execute the query + err := db.NewQuery(sqlQuery).All(&results) + if err != nil { + // Log the error details for better debugging + log.Printf("Failed to execute query: %v", err) + return c.JSON(http.StatusInternalServerError, map[string]string{"error": "Failed to execute query", "details": err.Error()}) + } + + // Check if results are empty + if len(results) == 0 { + return c.JSON(http.StatusNotFound, map[string]string{"error": "No records found"}) + } + + // Return the results + return c.JSON(http.StatusOK, results) + }) + + e.Router.GET("/api/getDataSet", func(c echo.Context) error { + + dataset := c.QueryParam("dataset") + if dataset == "" { + return c.JSON(http.StatusBadRequest, map[string]string{"error": "dataset is required"}) + } + + // Fetch all matching records manually + filter := dbx.NewExp("dataset = {:dataset}", dbx.Params{"dataset": dataset}) + records, err := app.Dao().FindRecordsByExpr("charts", filter) + if err != nil { + log.Printf("Failed to fetch records for dataset '%s': %v", dataset, err) + return c.JSON(http.StatusInternalServerError, map[string]string{"error": "Failed to fetch records"}) + } + if len(records) == 0 { + return c.JSON(http.StatusNotFound, map[string]string{"error": "No records found for the given dataset"}) + } + + var aggregatedResponse []map[string]interface{} + + param := dbx.NewExp("dataset = {:dataset}", dbx.Params{"dataset": dataset}) + languageSource, err := app.Dao().FindRecordsByExpr("charts_variables", param) + if err != nil { + log.Printf("Failed to fetch language source: %v", err) + } + // Convert languageSource to []map[string]interface{} + languageSourceConverted := []map[string]interface{}{} + for _, record := range languageSource { + languageSourceConverted = append(languageSourceConverted, record.SchemaData()) + } + + filterData, err := fetchfilterJSON(dataset) + + // Translate filter data using the desired dataset and language key + // fRes, err := TranslateFilters(app, dataset, filterData, "value_en") + // if err != nil { + // log.Fatalf("Error translating filters: %v", err) + // } + + for _, record := range records { + // Extract the URL for each record + apiURL := record.GetString("url") + file_name := record.GetString("kpi_file_name") + if apiURL == "" { + log.Printf("No URL for record '%v'", record) + continue // Skip records with no URL + } + + // Fetch and convert XML to JSON + saveToFile := record.GetBool("file_status") + chartId := record.GetString("id") + if !saveToFile { // Check if saveToFile is false + _, err := fetchAndConvertXMLToJSON(apiURL, "kpi_files", file_name, "charts", chartId) + if err != nil { + log.Printf("Failed to process URL '%s': %v", apiURL, err) + continue // Skip this record and proceed with others + } + } + + // Read the JSON data from the file + chartData, err := readJSONFromFile("kpi_files", file_name) + if err != nil { + log.Printf("Failed to read JSON for KPI '%s': %v", file_name, err) + } + + // langKey := "value_en" + // cRes := utils.ProcessChartData(chartData, languageSourceConverted, langKey) + + // Prepare the structure with URL and its response + recordResult := map[string]interface{}{ + "url": apiURL, + "dataset": record.GetString("dataset"), + "main_id": record.GetString("main_id"), + "sub_id": record.GetString("sub_id"), + "kpi": record.GetString("kpi"), + "is_chart": record.GetString("is_chart"), + "chart_type": record.GetString("chart_type"), + "response": chartData, + "group_by": record.GetString("group_by"), + "chart_heading": record.GetString("chart_heading"), + } + + // Add the result to the aggregated response + aggregatedResponse = append(aggregatedResponse, recordResult) + + } + + // Create the response structure + response := map[string]interface{}{ + "filter_data": filterData, + "data": aggregatedResponse, + } + + if len(aggregatedResponse) == 0 { + return c.JSON(http.StatusInternalServerError, map[string]string{"error": "No data could be fetched from the provided URLs"}) + } + + return c.JSON(http.StatusOK, response) + }) + + e.Router.GET("/api/getHomePageData", func(c echo.Context) error { + + // Define the struct for holding the query results + mainTopics := []struct { + MainTopic string `db:"main_topic" json:"main_topic"` + MainTopicListOrder string `db:"main_topic_list_order" json:"main_topic_list_order"` + ColorPattern string `db:"color_pattern" json:"color_pattern"` + }{} + + // Execute the query + err := app.DB(). + Select("main_topic", "main_topic_list_order", "color_pattern"). + From("home_screen"). + GroupBy("main_topic", "color_pattern"). + OrderBy("main_topic_list_order ASC"). + All(&mainTopics) + + if err != nil { + log.Printf("Failed to fetch home_screen data: %v", err) + return c.JSON(http.StatusInternalServerError, map[string]string{"error": "Failed to fetch records"}) + } + + // If no records are found + if len(mainTopics) == 0 { + return c.JSON(http.StatusNotFound, map[string]string{"error": "No records found for home screen"}) + } + + // Final result structure + result := []map[string]interface{}{} + + // Loop through main topics and fetch sub-topic data for each + for _, mainTopic := range mainTopics { + + dataSets := []struct { + DataSet string `db:"data_set" json:"data_set"` + DataSetTileHeading string `db:"data_set_tile_heading" json:"data_set_tile_heading"` + ValueSource string `db:"value_source" json:"value_source"` + Value string `db:"value" json:"value"` + DataSetListOrder string `db:"data_set_list_order" json:"data_set_list_order"` + }{} + + err := app.DB(). + NewQuery("SELECT data_set, data_set_tile_heading, value_source, value, data_set_list_order FROM home_screen WHERE main_topic={:topic} "). + Bind(dbx.Params{ + "topic": mainTopic.MainTopic, + }). + All(&dataSets) + + if err != nil { + log.Printf("Error fetching data sets: %v", err) + continue + } + + // Add the main topic and its sub-topics to the result + result = append(result, map[string]interface{}{ + "main_topic": mainTopic.MainTopic, + "main_topic_list_order": mainTopic.MainTopicListOrder, + "color_pattern": mainTopic.ColorPattern, + "tile_data": dataSets, + }) + } + + // Send the combined result as JSON + return c.JSON(http.StatusOK, result) + + }) + + e.Router.GET("/api/getUAENumbersData", func(c echo.Context) error { + + // Define the struct for holding the query results + mainTopics := []struct { + MainTopic string `db:"main_topic" json:"main_topic"` + MainTopicListOrder string `db:"main_topic_list_order" json:"main_topic_list_order"` + ColorPattern string `db:"color_pattern" json:"color_pattern"` + }{} + + // Execute the query + err := app.DB(). + Select("main_topic", "main_topic_list_order", "color_pattern"). + From("uae_numbers_screen"). + GroupBy("main_topic", "color_pattern"). + OrderBy("main_topic_list_order ASC"). + All(&mainTopics) + + if err != nil { + log.Printf("Failed to fetch uae_numbers_screen data: %v", err) + return c.JSON(http.StatusInternalServerError, map[string]string{"error": "Failed to fetch records"}) + } + + // If no records are found + if len(mainTopics) == 0 { + return c.JSON(http.StatusNotFound, map[string]string{"error": "No records found for home screen"}) + } + + // Final result structure + result := []map[string]interface{}{} + + // Loop through main topics and fetch sub-topic data for each + for _, mainTopic := range mainTopics { + subTopics := []struct { + SubTopic string `db:"sub_topic" json:"sub_topic"` + SubTopicListOrder string `db:"sub_topic_list_order" json:"sub_topic_list_order"` + }{} + + // Query to get sub-topics for the current main topic + err := app.DB(). + Select("sub_topic", "sub_topic_list_order"). + From("uae_numbers_screen"). + Where(dbx.HashExp{"main_topic": mainTopic.MainTopic}). + GroupBy("sub_topic"). + OrderBy("sub_topic_list_order ASC"). + All(&subTopics) + + if err != nil { + log.Printf("Failed to fetch sub-topics for main topic %s: %v", mainTopic.MainTopic, err) + continue + } + + result2 := []map[string]interface{}{} + // Loop through sub Topics topics and fetch dataSet data for each + for _, subTopic := range subTopics { + + dataSets := []struct { + DataSet string `db:"data_set" json:"data_set"` + DataSetTileHeading string `db:"data_set_tile_heading" json:"data_set_tile_heading"` + ValueSource string `db:"value_source" json:"value_source"` + Value string `db:"value" json:"value"` + DataSetListOrder string `db:"data_set_list_order" json:"data_set_list_order"` + }{} + + // Query to get data-set for the current sub topic + err := app.DB(). + Select("data_set", "data_set_tile_heading", "value_source", "value", "data_set_list_order"). + From("uae_numbers_screen"). + Where(dbx.HashExp{"sub_topic": subTopic.SubTopic}). + OrderBy("data_set_list_order ASC"). + All(&dataSets) + + if err != nil { + log.Printf("Failed to fetch data-set for sub topic %s: %v", subTopic.SubTopic, err) + continue + } + + result2 = append(result2, map[string]interface{}{ + "sub_topic": subTopic.SubTopic, + "sub_topic_list_order": subTopic.SubTopicListOrder, + "tile_data": dataSets, + }) + } + + // Add the main topic and its sub-topics to the result + result = append(result, map[string]interface{}{ + "main_topic": mainTopic.MainTopic, + "main_topic_list_order": mainTopic.MainTopicListOrder, + "color_pattern": mainTopic.ColorPattern, + "sub_topics": result2, + }) + } + + // Send the combined result as JSON + return c.JSON(http.StatusOK, result) + + }) + + return nil + }) + //send mail while status changed from app admin app.OnRecordBeforeUpdateRequest().Add(func(e *core.RecordUpdateEvent) error { if e.Collection.Name == "users" { @@ -375,17 +682,17 @@ func main() { // Email body body := fmt.Sprintf(` - - -

Dear %s,

-

Thank you for registering. Please click the link below to verify your email address:

-

- Verify Email -

-

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

- - - `, name, verificationURL) + + +

Dear %s,

+

Thank you for registering. Please click the link below to verify your email address:

+

+ Verify Email +

+

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

+ + + `, name, verificationURL) // Create the email message message := &mailer.Message{ @@ -436,6 +743,147 @@ func main() { }) } + // Check if the email is already verified + if record.GetBool("reviewed") { + return c.HTML(http.StatusOK, ` + + + + + +
+
+

Your Already Reviewed

+

You have already been reviewed. No further action is required.

+
+ + + `) + } + + // Update the status + newStatus := "Approved" + record.Set("verified", true) + record.Set("status", newStatus) + record.Set("reviewed", true) + if err := app.Dao().SaveRecord(record); err != nil { + return c.JSON(500, map[string]interface{}{ + "code": 500, + "message": "Failed to verify user.", + }) + } + + // Send the status change email + err = sendStatusChangeEmail(app, record, newStatus) + if err != nil { + return c.JSON(500, map[string]interface{}{ + "code": 500, + "message": "Failed to send approval email.", + }) + } + + return c.HTML(http.StatusOK, ` + + + + + +
+ +

User Approved Successfully

+

The user has been approved, and the approval email has been sent.

+
+ + + `) + }) + + return nil + }) + + app.OnBeforeServe().Add(func(e *core.ServeEvent) error { + + // Approve Endpoint + e.Router.GET("/api/custom/reject", func(c echo.Context) error { + userId := c.QueryParam("userId") + if userId == "" { + return c.JSON(400, map[string]interface{}{ + "code": 400, + "message": "Missing userId query parameter.", + }) + } + + // Find the user record in PocketBase by userId + record, err := app.Dao().FindRecordById("users", userId) + if err != nil { + return c.JSON(500, map[string]interface{}{ + "code": 500, + "message": "Error finding user.", + }) + } + // Check if the email is already verified if record.GetBool("reviewed") { return c.HTML(http.StatusOK, ` @@ -485,147 +933,6 @@ func main() { `) } - // Update the status - newStatus := "Approved" - record.Set("verified", true) - record.Set("status", newStatus) - record.Set("reviewed", true) - if err := app.Dao().SaveRecord(record); err != nil { - return c.JSON(500, map[string]interface{}{ - "code": 500, - "message": "Failed to verify user.", - }) - } - - // Send the status change email - err = sendStatusChangeEmail(app, record, newStatus) - if err != nil { - return c.JSON(500, map[string]interface{}{ - "code": 500, - "message": "Failed to send approval email.", - }) - } - - return c.HTML(http.StatusOK, ` - - - - - -
- -

User Approved Successfully

-

The user has been approved, and the approval email has been sent.

-
- - - `) - }) - - return nil - }) - - app.OnBeforeServe().Add(func(e *core.ServeEvent) error { - - // Approve Endpoint - e.Router.GET("/api/custom/reject", func(c echo.Context) error { - userId := c.QueryParam("userId") - if userId == "" { - return c.JSON(400, map[string]interface{}{ - "code": 400, - "message": "Missing userId query parameter.", - }) - } - - // Find the user record in PocketBase by userId - record, err := app.Dao().FindRecordById("users", userId) - if err != nil { - return c.JSON(500, map[string]interface{}{ - "code": 500, - "message": "Error finding user.", - }) - } - - // Check if the email is already verified - if record.GetBool("reviewed") { - return c.HTML(http.StatusOK, ` - - - - - -
-
-

Your Already Reviewed

-

You have already been reviewed. No further action is required.

-
- - - `) - } - // Check if the status is already "Denied" to avoid duplicate email if record.GetString("status") == "Denied" { return c.JSON(400, map[string]interface{}{ @@ -657,45 +964,45 @@ func main() { // Render a success message as an HTML response return c.HTML(http.StatusOK, ` - - - - - - User Rejected - - - -
- -

User Rejected

-

Rejection email sent successfully.

-
- - - `) + + + + + + User Rejected + + + +
+ +

User Rejected

+

Rejection email sent successfully.

+
+ + + `) }) return nil @@ -750,32 +1057,32 @@ func main() { // Email body in HTML format body := fmt.Sprintf(` - - -

Dear %s,

-

You have received new feedback from a user through the mobile application.

-

User Details:

- -

Feedback:

-
-				1. How was your experience with us today? Rating: %s
-				2. How did we perform in key areas?
-					1. Ease of Use: %s
-					2. Quality: %s
-					3. Design: %s
-					4. Redundancy: %s
-				3. Additional Feedback:
-					1. %s
-				
-

Thank you,

-

The FCSC App Team

- - - `, adminName, userName, formattedDate, formattedDateTime, emojiRating, easeOfUse, quality, design, redundancy, additionalFeedback) + + +

Dear %s,

+

You have received new feedback from a user through the mobile application.

+

User Details:

+ +

Feedback:

+
+					1. How was your experience with us today? Rating: %s
+					2. How did we perform in key areas?
+						1. Ease of Use: %s
+						2. Quality: %s
+						3. Design: %s
+						4. Redundancy: %s
+					3. Additional Feedback:
+						1. %s
+					
+

Thank you,

+

The FCSC App Team

+ + + `, adminName, userName, formattedDate, formattedDateTime, emojiRating, easeOfUse, quality, design, redundancy, additionalFeedback) // Define the target type (e.g., "smtp") targetType := "feedback_receive_mail" @@ -852,8 +1159,8 @@ func main() { Subject: "YOUR VERIFICATION CODE", HTML: fmt.Sprintf( `

Thanks for verifying your %s account!

-

Your code is: %d

-

Sincerely,
Support team.

`, +

Your code is: %d

+

Sincerely,
Support team.

`, email, otp, ), } @@ -884,303 +1191,6 @@ func main() { } }() - //app.Router.GET("/verify-email", verifyEmailHandler) - - app.OnBeforeServe().Add(func(e *core.ServeEvent) error { - - e.Router.GET("/api/custom/apicalltest", func(c echo.Context) error { - // Get the database instance - db := app.Dao().DB() - - // Define the struct for the expected result - type Chart struct { - Dataset string `json:"dataset"` - Key string `json:"key"` - Value string `json:"value"` - ValueEn string `json:"value_en"` - ValueAr string `json:"value_ar"` - } - - // Query to fetch the data - sqlQuery := "SELECT * FROM charts_variables" - var results []Chart - - // Execute the query - err := db.NewQuery(sqlQuery).All(&results) - if err != nil { - // Log the error details for better debugging - log.Printf("Failed to execute query: %v", err) - return c.JSON(http.StatusInternalServerError, map[string]string{"error": "Failed to execute query", "details": err.Error()}) - } - - // Check if results are empty - if len(results) == 0 { - return c.JSON(http.StatusNotFound, map[string]string{"error": "No records found"}) - } - - // Return the results - return c.JSON(http.StatusOK, results) - }) - - e.Router.GET("/api/getDataSet", func(c echo.Context) error { - - dataset := c.QueryParam("dataset") - if dataset == "" { - return c.JSON(http.StatusBadRequest, map[string]string{"error": "dataset is required"}) - } - - // Fetch all matching records manually - filter := dbx.NewExp("dataset = {:dataset}", dbx.Params{"dataset": dataset}) - records, err := app.Dao().FindRecordsByExpr("charts", filter) - if err != nil { - log.Printf("Failed to fetch records for dataset '%s': %v", dataset, err) - return c.JSON(http.StatusInternalServerError, map[string]string{"error": "Failed to fetch records"}) - } - if len(records) == 0 { - return c.JSON(http.StatusNotFound, map[string]string{"error": "No records found for the given dataset"}) - } - - var aggregatedResponse []map[string]interface{} - - // param := dbx.NewExp("dataset = {:dataset}", dbx.Params{"dataset": dataset}) - // languageSourceRaw, err := app.Dao().FindRecordsByExpr("charts_variables", param) - // if err != nil { - // log.Printf("Failed to fetch language source: %v", err) - // } - - filterData, err := fetchfilterJSON(dataset) - - // Translate filter data using the desired dataset and language key - // fRes, err := TranslateFilters(app, dataset, filterData, "value_en") - // if err != nil { - // log.Fatalf("Error translating filters: %v", err) - // } - - for _, record := range records { - // Extract the URL for each record - apiURL := record.GetString("url") - kpi := record.GetString("kpi") - if apiURL == "" { - log.Printf("No URL for record '%v'", record) - continue // Skip records with no URL - } - - // Fetch and convert XML to JSON - saveToFile := record.GetBool("file_status") - chartId := record.GetString("id") - if !saveToFile { // Check if saveToFile is false - _, err := fetchAndConvertXMLToJSON(apiURL, "kpi_files", kpi, "charts", chartId) - if err != nil { - log.Printf("Failed to process URL '%s': %v", apiURL, err) - continue // Skip this record and proceed with others - } - } - - // Read the JSON data from the file - response, err := readJSONFromFile("kpi_files", kpi) - if err != nil { - log.Printf("Failed to read JSON for KPI '%s': %v", kpi, err) - } - - // Prepare the structure with URL and its response - recordResult := map[string]interface{}{ - "url": apiURL, - "dataset": record.GetString("dataset"), - "main_id": record.GetString("main_id"), - "sub_id": record.GetString("sub_id"), - "kpi": record.GetString("kpi"), - "is_chart": record.GetString("is_chart"), - "chart_type": record.GetString("chart_type"), - "response": response, - "group_by": record.GetString("group_by"), - "chart_heading": record.GetString("chart_heading"), - } - - // Add the result to the aggregated response - aggregatedResponse = append(aggregatedResponse, recordResult) - - } - - // Create the response structure - response := map[string]interface{}{ - "filter_data": filterData, - "data": aggregatedResponse, - } - - if len(aggregatedResponse) == 0 { - return c.JSON(http.StatusInternalServerError, map[string]string{"error": "No data could be fetched from the provided URLs"}) - } - - return c.JSON(http.StatusOK, response) - }) - - e.Router.GET("/api/getHomePageData", func(c echo.Context) error { - - // Define the struct for holding the query results - mainTopics := []struct { - MainTopic string `db:"main_topic" json:"main_topic"` - MainTopicListOrder string `db:"main_topic_list_order" json:"main_topic_list_order"` - ColorPattern string `db:"color_pattern" json:"color_pattern"` - }{} - - // Execute the query - err := app.DB(). - Select("main_topic", "main_topic_list_order", "color_pattern"). - From("home_screen"). - GroupBy("main_topic", "color_pattern"). - OrderBy("main_topic_list_order ASC"). - All(&mainTopics) - - if err != nil { - log.Printf("Failed to fetch home_screen data: %v", err) - return c.JSON(http.StatusInternalServerError, map[string]string{"error": "Failed to fetch records"}) - } - - // If no records are found - if len(mainTopics) == 0 { - return c.JSON(http.StatusNotFound, map[string]string{"error": "No records found for home screen"}) - } - - // Final result structure - result := []map[string]interface{}{} - - // Loop through main topics and fetch sub-topic data for each - for _, mainTopic := range mainTopics { - - dataSets := []struct { - DataSet string `db:"data_set" json:"data_set"` - DataSetTileHeading string `db:"data_set_tile_heading" json:"data_set_tile_heading"` - ValueSource string `db:"value_source" json:"value_source"` - Value string `db:"value" json:"value"` - DataSetListOrder string `db:"data_set_list_order" json:"data_set_list_order"` - }{} - - // Query to get data-set for the current sub topic - err := app.DB(). - Select("data_set", "data_set_tile_heading", "value_source", "value", "data_set_list_order"). - From("home_screen"). - Where(dbx.HashExp{"show_in_home_page": 1}). - OrderBy("data_set_list_order ASC"). - All(&dataSets) - - if err != nil { - continue - } - - // Add the main topic and its sub-topics to the result - result = append(result, map[string]interface{}{ - "main_topic": mainTopic.MainTopic, - "main_topic_list_order": mainTopic.MainTopicListOrder, - "color_pattern": mainTopic.ColorPattern, - "tile_data": dataSets, - }) - } - - // Send the combined result as JSON - return c.JSON(http.StatusOK, result) - - }) - - e.Router.GET("/api/getUAENumbersData", func(c echo.Context) error { - - // Define the struct for holding the query results - mainTopics := []struct { - MainTopic string `db:"main_topic" json:"main_topic"` - MainTopicListOrder string `db:"main_topic_list_order" json:"main_topic_list_order"` - ColorPattern string `db:"color_pattern" json:"color_pattern"` - }{} - - // Execute the query - err := app.DB(). - Select("main_topic", "main_topic_list_order", "color_pattern"). - From("home_screen"). - GroupBy("main_topic", "color_pattern"). - OrderBy("main_topic_list_order ASC"). - All(&mainTopics) - - if err != nil { - log.Printf("Failed to fetch home_screen data: %v", err) - return c.JSON(http.StatusInternalServerError, map[string]string{"error": "Failed to fetch records"}) - } - - // If no records are found - if len(mainTopics) == 0 { - return c.JSON(http.StatusNotFound, map[string]string{"error": "No records found for home screen"}) - } - - // Final result structure - result := []map[string]interface{}{} - - // Loop through main topics and fetch sub-topic data for each - for _, mainTopic := range mainTopics { - subTopics := []struct { - SubTopic string `db:"sub_topic" json:"sub_topic"` - SubTopicListOrder string `db:"sub_topic_list_order" json:"sub_topic_list_order"` - }{} - - // Query to get sub-topics for the current main topic - err := app.DB(). - Select("sub_topic", "sub_topic_list_order"). - From("home_screen"). - Where(dbx.HashExp{"main_topic": mainTopic.MainTopic}). - GroupBy("sub_topic"). - OrderBy("sub_topic_list_order ASC"). - All(&subTopics) - - if err != nil { - log.Printf("Failed to fetch sub-topics for main topic %s: %v", mainTopic.MainTopic, err) - continue - } - - result2 := []map[string]interface{}{} - // Loop through sub Topics topics and fetch dataSet data for each - for _, subTopic := range subTopics { - - dataSets := []struct { - DataSet string `db:"data_set" json:"data_set"` - DataSetTileHeading string `db:"data_set_tile_heading" json:"data_set_tile_heading"` - ValueSource string `db:"value_source" json:"value_source"` - Value string `db:"value" json:"value"` - DataSetListOrder string `db:"data_set_list_order" json:"data_set_list_order"` - }{} - - // Query to get data-set for the current sub topic - err := app.DB(). - Select("data_set", "data_set_tile_heading", "value_source", "value", "data_set_list_order"). - From("home_screen"). - Where(dbx.HashExp{"sub_topic": subTopic.SubTopic}). - OrderBy("data_set_list_order ASC"). - All(&dataSets) - - if err != nil { - log.Printf("Failed to fetch data-set for sub topic %s: %v", subTopic.SubTopic, err) - continue - } - - result2 = append(result2, map[string]interface{}{ - "sub_topic": subTopic.SubTopic, - "sub_topic_list_order": subTopic.SubTopicListOrder, - "tile_data": dataSets, - }) - } - - // Add the main topic and its sub-topics to the result - result = append(result, map[string]interface{}{ - "main_topic": mainTopic.MainTopic, - "main_topic_list_order": mainTopic.MainTopicListOrder, - "color_pattern": mainTopic.ColorPattern, - "sub_topics": result2, - }) - } - - // Send the combined result as JSON - return c.JSON(http.StatusOK, result) - - }) - - return nil - }) - // Start your custom HTTP server on port 8091 log.Println("Starting custom HTTP server on :8091") if err := http.ListenAndServe(":8091", nil); err != nil { @@ -1232,50 +1242,50 @@ func verifyEmailHandler(c echo.Context) error { // Check if the email is already verified if record.GetBool("user_mail_verify") { return c.HTML(http.StatusOK, ` - - - - - -
-
-

Email Already Verified

-

Your email has already been verified. No further action is required.

-
- - -`) + + + + + +
+
+

Email Already Verified

+

Your email has already been verified. No further action is required.

+
+ + + `) } // Set the verified status to true @@ -1289,50 +1299,50 @@ func verifyEmailHandler(c echo.Context) error { } response := c.HTML(http.StatusOK, ` - - - - - -
-
-

Your registration is pending for Admin Approval

-

Access will be granted once your account is approved.

-
- - -`) + + + + + +
+
+

Your registration is pending for Admin Approval

+

Access will be granted once your account is approved.

+
+ + + `) // Fetch user details for email notification username := record.GetString("username") diff --git a/pb_data/data.db b/pb_data/data.db index e304572096c4c3595470a7bff635a145d312441a..e0bc26406e1a2c60dacc7a96b5069c1cef8ad5d0 100644 GIT binary patch delta 1829 zcma)7Z)_7~7{B-F*7n-%UOE_MENuP5=0?|YckQ*k;*CE724$dt5*Ky5wO3YHd!yHG zEd)nZ2rxi#A#XG&TSNniQwed^L=*f#_+Uar!v_+Be({SD{AARGMBlP7O$WhC?$7f) z_dM_K`G4>y+rdfuo6Qa{!!Uk&-@hWKx`N1ivH#rIVixx>_$a=Oui!ksiQmO4?!gx? zIo1U6qJ<_O(g%x)q-+#M!iE^;d3Hj5<9(`>Wbh0=fZxL3;a~8F_-mZRe^8~(*tysw zpuDQ}W%B6(Eo<}{@vNq0%o7LBMiKkk%-QnHS+upEg_jxjRr=^UwYKH6E)XGl(rsSg zvo;Fv9B|yj=}?rYCMTpJH4}~w=!Pf_sD?J*^l25GWe>olne?#Gh6Ucmhhw4`6Quwj zmC7X+4z@S5hZvj1hq#-TYZf0Dw*F~-q5iym+SXuqUJ@2yi=*T+af%apea$F{lqT6t zE_cHcb1thUG(^U`!Hp2%x}lw1i$cH-oU#xtq(A!+`Mn$DZD@;{OX(SP$h9^e*YlYi z5_wVb^Maq3U4jq`^08nfAVm3IArO*wbWo|#>FQX!VSOiG*tk*V*YWGarDijytVAn) zO~{SN=Z`}lJ=Cdy!0{zpEvLAVdsbwTp`D8SGOVDloiYS!Y?I81@=+O_$XX{cqlypt z$O##ikjpW69+k*s3=B?o@zIzh#{@AD79+&H3L44uDmYSuN03pL9|w%+Cv%5vR^UZT z$!_5kFCxcf@Y7?ykfGP+s^OF-)J8ogR~2}YvT0DBag>&#N<<>}BBD6k+@!P`nyK{6 zYVbA84-RRMLa>1*`q*q7SwCCRvXZ~LVatmDAF-J=P{Z3yrW;Is3wy+LgC_H;$urKg zm0I$i?wqToszN4r5wu(Nl$=Wz(s8l^;63Y}#OPqAD8$LP08>_NUvW=l*hr9;8aUIS zC3Pb�NcHo{XB-JTVXXZ5kRUO8bvl^Mk{?lcE?WMlDQQ2Xo1h>|jD8t^46^D=(zf zUB$vE`O*xX6XW|!mcs5)y_hTzpA{aXj1>814C*^(t2P*lg@OSgBK6)co@##iND+$d zO?5voZ0%hJe_wkSpR~8weqLmxiof|9JOm%Lh3DZi)N~8R5k5*+STFICcm3vd^VLh7@cIY`e12)|wLW#VP z3x-CuT-F$l7#rexMo$;Thgk?m!|OVpQZp{UtA}jt1`47UCsAZMt;IcvWRnRR!Br;Z^wy4JIF3b?`rqJokD4 delta 789 zcmZWnT}V@57(UhMX@Zt3 zgjE-6gTAZKup$UC5jO%u3%c*;svpU#3c>3r2s&ojMIXHH&HM0v&(AwPYaZV)O*zUu z6h#HK`un2Op$PIUcHF!!vHp4 z_i*>+`0)82Z^+x5>PdSQ?_g)&aC=v8duLxyy8S}xY&sVlY9%c+_%SEDxwsM)m8ihR zqf#M5!+5}97Accql`^a{UyY|ME5;uskLd~Xys6wYyTq5y87vtaVpJPMYhX)|_z`F{+LBX$T@p;3G*1JY-aYHnW~lJ+voiM;@B!WeAWF750%z z6)dDnhDt-mWMEVuO%_xLlczF#F=nhLMh&7Md7{EzvZlZZaz%k+lgM(Bcv4_xKbcaX z!t6oYYkf$y+lfzslUQ1QBoS`m~W))7mI6lnn zpgASNvm!4i`HV})sCMMv*3g)ML)-KNWFY~yrMREE`A1$v`%Wfx5>)MKtRhVk;3`p+ zS@}Tq(NwQH>~2X7WQsv^4Ow?w`yhe*+b|~X<|IXnf#cbjC=fLcm8IGNP3}6Z+WcfQ z0gitryEU#cEi{FXv9Y+2)EEnG)dD97HSX%hrh_&42GDUvptF?4NoTdxM(IL!1V#cC z7As}YuT%J~e!b+Q*=hPjmm6PefERi^G2}GZCi=DJ^PyWcg`#_C87e~V|1ZdUX8^eh euO2~(4q`6Sx&TqVpQ2!`@N*We0NHwg!oL7n+R1PL diff --git a/pb_data/data.db-shm b/pb_data/data.db-shm index 3c61e2320a32e70283f5abfdcc1e5878dc733103..dc00d5dfe68d8c8a52a5d4cf0e4d5cd75748ef7f 100644 GIT binary patch delta 241 zcmZo@U}|V!s+V}A%K!t63=9H1Kn_Txi9>qszn$~HFZP+B8G8AM!UFlahaVgdz9LmU z%xsXk|B(Px+>8Mv0RlkF8MuI08i*CK@RfjK%0LXJH!k#aVrFDu-MH{1FEcX(`^JUx jyv$4tY#SGzXJKYx;MlnEHxn}_12>rFV&K`h&{-S+EEqeC delta 181 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 cMgSv#5x@vw1TX>^0gM1f;He?dW`BYI0nOI>v zByA6%tl+?D{{kc~2m}Je6)oBehzmmEzyU5G?h6uogA3!NNnK~F4Wd-5<;`jGdSpNT z&CL5+GmrM>;B{{9*Yh0r5EuNOcJ>7%omusoY}B`k z$k^Uja#gyRam#LL?*+#%xMim(&Sx@iwd{B9s*AE_%DO32Nmf-GNffWmu&a1hoS9!- zn3Z>zmJIo_yg(a|_a&|I_!Lv7@K(x*Dx;>1B}|CzdrmgD=KAbuYe93XxKE3_C8YW_ zMRD4Smdk$5E4O7eJH{faG?P$CL)50!kc`VS&pKssPF!(3k#$sOS(_;g2^=0sT9fg~ zbc&yhTdC9$fz(8@sj$~WhFx(h)nfC>tDRQK-N%YjRJOBz4d>OD+)TkK#tyG{NmGf0 zv2G(-qWVfeOgUsl8i}E#HN{w^_$l5x*CmCRm`VmFcG1~zz4cAk%jBL9n&MK>bT+eY z&OnNx<9$*p9Eb^Z=q9BQ$)K98Nd&isufv5jM&gVMA8=t}y18hkVn|3)?P@t!subP5 zT(wv^s;CJZg(+TXM)p*%p5NW6 zP}$h77OFk0Uq%BVTak2a`sz$=C&(#bB+09sA4(<>Bqx(gS~xoQLXC<3q?O{QTPgNj zSBhn8LzNIgcA->pJwMh;vdhgsS=rMHCAJg_nQOFOKFIsMWmzN{nqgC&-ZRH?9DhDs z1j1NYbvnr!z~F@M7_9+~!5Ax){Md1YQemr>l{8{+W(%>Ug=Njxb=8sGZQWy0r{}te zBtkK(iz;c>MbuRn*(byet1%Q4j;M)8$oxw=hRA9(F-%#LG<+{P(@avjyf z00d5(z*t|Jk8Cz3f>>l@G#8fsn1QolE|?UtswS=gIf~_-Fw90zG|yK_?&p1b_e#00KY&2mk>f00e*l P5ct0m2+rdl0KdTBr5O(_ diff --git a/pb_data/logs.db b/pb_data/logs.db index 358112fdc5d572b83b28b2324181089359f3e114..3379b35a35cf9ca95aafeb56dbb82d767f65a338 100644 GIT binary patch delta 27902 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 JZV3_W{{dqKB$EID diff --git a/pb_data/logs.db-shm b/pb_data/logs.db-shm index 3ab8181a7d40c4c43bf6ecbb76996095f5bec973..cfbe788955ba131e43e481a7bfb623281f245039 100644 GIT binary patch literal 32768 zcmeI*NlpS$5CG6ZK@=yP5NB~pTzCc(kKl?JS8lnBI~Th35-!+z0Po-lynxZ)%7U0q zh$IjouaZjt)bFmY{|?Yyf4_(<3cp!BOV@VF`=__k&3UU``?##Uw5~p1n|ICY+H9&&nRH9>#? z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UATUUQnb;a+d%Xz|AV7e?Py|Y`G?e#v$+!!YV|(0>V15F9 z3KY^e=9XhUcH*ed4jv;gt^!jr7uDE^-8dfCBaGbKi*Yz|GZ`pPU^*(X61CWile}#; z0uwAyjQLoN&Df9A2|lHx5gk@Z z*Kx7|qYEPskol8?krzn)W@Tjr8qEh}`ZF?$PF7@G$;!&W%^(I8_{h)9&cF|3{A6Wi rV&Gs905ZRFurf1nG6;f1nOIpExEO?h%yL#nk;#gT^^C$mjyekf@k2y2 diff --git a/pb_data/logs.db-wal b/pb_data/logs.db-wal index 6244edc9ceeda1936c0deb98a4ab53c2e981906a..2ff397872576d2ea571c8fd84729ffdc1b9ff249 100644 GIT binary patch literal 156592 zcmeHw2Y?&Zx%FsQy1HBJCBWK&kf1Es*x25cMt#j@~J&yDB4T)JD>%(`;Nq z3t$s^2Lr~04yKvjNkV%h5E7ESKuF;6fD}kxNb>(@W>>OSd$p{)fsy>3@qTA!G;`

6FF?Bh&u<+p&Kg|D$6aYv3|e`bW<`^N%0?-$OrW zG`hKF@(9D~E+Ky)uNn^~k2FTfBjxX@1Yg6(t@tiCu)fC`hWnjr z7|wU1VF!L`4>`5|&*YyYnhlQ|53c)+nwo!KH?r{(`a<12y}AD62BTp#Z8CmN{-D3y z_}|8S)BE}vbq9@nd&F-VZ)=>^@?`TEvJbhrvA*HX5l1&XQCpo~+fLPuclERLszEB>&8%YM_q&@4FsHiwIPNy}Q3a9)oN6_tc(~#nHWh6fD zR=>oXQ=w#}D7oxK8c>|EpgrS_M||nLoC)cBd_zPe&4Q zOCm;l6{kyd#-l}dFc@?N{bG>zsGH~gxv*G}q!1rS@qT);;`Ap%nL;*K%x0q2V8KF9 zQk?OCPs#)nF0;dxir~VXs5moXF5(bvUau=oP|L|7_{2|1S!g`M#*U8*=Oygg}2$Nlb5F>Nn|=n}>0w0J#I z)a#9gGZ{xQK#x3zo%XQLoQUV7h%aOb1n4ZqnMq2vd_0`a zIDMigm!LBhC-cHF3s*57m)yx@oDaJk-fWPbX}FkcEyiRK7cU-&#(i=$OS{y4#vHMt zMF=IV88PiB(jOWg$C|9tQAoxzW~&f!*`2OrJVS3JYq>`Y&VacP6cV|(J>*IHX{WN! zT;5V}*z8g^$mhi@Pp>5lx$Z%wn2h6EnHMgbv`Id@EO>I^Xv!6!S77s2=HVe0Gn!SfHDfeI^`PXVSuZQlUcJACJ>V6lXjY zKo%3iqJvMmg*<&&aRy_7LZsmH6fJQn5b@B56sJdaTLbC5hc6Zbp-g~2s5sL?A{>%s zM^faS-hx0MXndmndugY|6|hSYv)@&WIqme$2BU8Mpo+!#0C%XID7YLUhtC?d#y!Xk zhb#MJ7DL&aEhG|YGb(UDZ_m)xw2AAMy&dI;E^(+e8S@Ln(5ifK9g~m-IEUF91geNDhu?E1|xS-(pB(= z!yd6+hgU=^Zab&rqKO)=c8r5l*Ekd$rPCERtq7_X{?==qsdBE_!!Eg6kesdpFGFTA4N2pqo^~YOa-8RYu)WmnU8* zWNkT7u;u7IjZf$%54yiMe9Rp>=pF}WE3;0HIPHRHu}c!~^GWs`y{7RA?vLSQGUX2h z^VVF_V=2h=5;$KE$DNYbB1N6PU^?``bo{%T)4pWCXrgEi=J;$u@X*H< zXF-qx(MXZc`ph1GC`TVtoEC3UO8dN0+;7j=V?O$*;&cU4c{%ILxLuKeGnAy86=$HB zu=6RGk9Q}1?qHGL*Swc*GV>nCd^8Fq0~yICh9$dADii{Axw_9NZ_R`f86oNv9WkC> z*|dmj4Tw_CC&(#Z!kcz@lJspVys9m~)9V zy{YMa?sOq-6Y@T*;E!1onQW0>(6o+g72E;dY_r<%Xp%361v*99r(h4bymG)M1#_W9 zI!iCZ=2HeeT{JJ?4)u$I&zJMMLU>{e1{`#H^Nn1qU-Tz!Zl^cswuVwUD|IOQ^rfRh zFcz0m-bB!zm+5Ud&Q_ny+tYr*Z{>?Qk7T8%sB0!I5k8lcQ(4|6*`oA*j;sHa`CRAo z6{37R8s%N_h@8sMtMKdHK3?!-)3S>Xi%Hp=qh~0G#C&4$#zV3o@Uks0Bm^r@*Qsj; zLXsEHOMZvThet2ELOCR_LvV!?k+_%(1S2*p-8iC`+u${OJr-*qmq>Z-5qF+Cl{J}< zub!mMlXQCoYsexy3x1j%;ozotSoe44lK}HM#GTIKE}4j?vu=067pE8DkXqfrgfE`A zr=yW{G-pfE$;u(Q{a&}6FC?8}+!=FQ>Af6RcbzLA6a7Ia&+~;qf=|&?N8HC9I_Qyj z#EV=j^ZC;i5<-zo6c0>dDw&D)Lxm?s)kOKCI7^i7Cr!b!Y9jwP!=EJkY z<*~T4VYkaIM$HkP-o^-(8II6XwJHPnUIk8dfetTEsRWZt@eyl5Ji93oVR(h zW*f~b31UaZk#Sg4anYKL4M>Q}i%pO+2NVLq4k{W^CqY zz)4qO%~s~~yiJtc-jI||MIv5n-b^o4H+RUHs32KAK8Gb?6X>NaG46D$zI;)# zxDviFoz~LMwOT{??W{Qy5?wY|(m|&xn_C08w?^%P!ye|Nf|s6#&8G}{QpH=_p;oue zmzNSAE1xJ7!~%6IoAbqNwkYQ;qR$oLLlJs}>MU3TlGPbZh9W6B?4du#<`?mjGZxDV z(U{BPx7Z^zqpm5&&2C$O&)AdMK*mLH#hN1XJr2b$$!Cjv&|J*K{4%``YffRl4w%#7 zxGfS2d9$vtPx8@=v1aR__f0qntlVDEduP*G;tlPuHa5=SnsH}noYLrSv^Gv^`De@D zT0U<1Q_CAIFSq=6%iE2Uw&MGLjoSAskOD1l?~E_$(Z1W30{U}VUve|KmRv^Gl5@yP zw8&*hoCHZPSwm%-ic1tE^}0H0_+G=`3_LY_7mEqhZ~ztuQ^U6#iQ&7{FdBk z-i8)x*t_xD21*SLjk66pY9Ni>`hQYGU1LE1S8C8<@e$SkZ{u6~KT!QgSp0_S{|AdV zss49O`|4k%`nQ@6*S|>hZ({Kj)&ByEN2vbwrepN?QT=OJ+)nkcVsSIozkYu?PL-kK%5vTg6un1E9lUVdp{S#O$qx#3O zP|x-Qj-xvACyq0ILH-E*jJyy0g!}>c0eKJjE_oOD4*5OsP4eGZe+2m*&`5r(Zu=Yf zzaZ}bKO?^eenNf){D8a-e3$$Z_zrms_$GN1_!{{I@F(Qwz-P%Dz{kmd0Usi-1MelT z0dL1!IcL0uyaK$QybQdO{0w+8`6=)M@)O|M8#LP8e+2w3xd`}6vJUuPXgcA@ z&&Y+q=g9@YC&~H1N5~I>_mlI0can2~w~}*!H$W3IRoe+rvpzQXr(5L$*I5vQUo4J3cxOs2Rca(XdzkP z1d;)cA!*=&L->j!fd3%9z`u|l;78z&FV8 zz?aD~;0t6a@F}tcxS1RW+(Z@w?;_p6jbssUJ=(lDat%2aco{hcxQ;9Uo=4^b*N}O@ zlmk6h(uPDi6yB zj{b<_aPPPX_&2%^_%U4z{1d$p_dJrj5yMQPNpp(u^|<&>g0>I)RbQ7=;zM}3T< zIO5)c;;8pf6i59D6va`$n4&o97f=*O{Tzzos6UdTIO@A-8t9}l&_Ywd2{Z{DLleLQ zsRZ1Q#)13L7;prQ0*y2R)X^{+1HPal@G}|$enNx54`=}RE){_9P(ScZ>I1$;y}+MP z6vz5!X)o|`v=egm4^b4y`gzmlRj)?Z9f9P2NjD30}K zQxwPgl@!IX{xsSR%+W=_BwYxMPWV!&jl+Fh(r1OAt>0IDUdNl9|dK9pe z&H>u!Y+yT`1sq3b0^8^e-~n_xa1=cfxEGxUY@{fU^?G^)-rWB~Q6B65K~Wy-{z6e6 z>pr3=k9F@;l*hW?QIyBJw<*eF-5V6;vF>Gx@>ur*MR}}yilRK$ZKgKhCTa!VMS0*x zY5}gNX5cln19%y22d<-&falSPz%_INa5+5`Sft~DX*v!Vr}Pjkf^;milj zPg{Y%qx%BiruzWjpnC&frr!d-K=%SZMO%QI=}6!vIs$kXZ3b>c(>=$nr;WgCXan#v zN`dRB5qKUYz%|qWTu$}CBCQ9eX&o?5b-<9aI_EY1Kj4YR50yW-ZsP~Q`Nls1XB+fqIi7O6z&U4KaLFy-`_KK2 zh8wtM{fAuRuNzw$g@()Mwe&N?Nd}$%L&MC5GaI7%59{yTmaqP2ji=FzjE(h=H1jQQ zj<{olUN^DyRgPo$pR9gGtZvqfZc~RRA$ItrXjJf}MJX^;19Pv{2hE#t)D_36p238; zCngv-kE-w3vJY8Er^R?sHa^l?KdH|h@MJ}w6mJI@AFh2K(Ofid4|{!R4oiyuLapRu zoySA9FUm0Yx=k15!5xu&53rMO6Epel--Rd2*9Ys4S+Iyv7^G0aA3$4m)*dE7S{e%+&59XAdsIHIBL?7_<6idmtYP#B3g0 zk=~3$npR^UF2U`$M?Gw&;Gn>worE{H(Bpes*WvndsxYu)^N*xIiCc)=Q5vy_;(v z;+ChLAs;QaDWg78JH3bbvy3MJ`ta^KnN2(8WFEk4$jj{9U3DWW-GX;W6>`VOg|(`X zo%ypjjNDMG3fY-Ido_NxMisI%fA+GLZtmk(U***Q>DCx*fjP%kgge;~l=&A7QV@?eM*>#a`9shtm9lvxKXEo4S3; zg2uXQx#qgbXuGP5)pgfRZuuj|3EbauRm;kjaLchRuDZ$J_-|WXgYHw^o4UtzH|fsP z$-3ipQ*|437wEFOlXTO$Z`WJvcr$OGWVTE)yG>?mr`e2ubZISONiE{ITEya7M0YJ> zQ7vL&E#lY#gv(@h_MgWwwTK0kgvGJt%pa&lY^p`vUyHbpRyf; zF`Gr)1EPaP+znzBi?|EF@oyG^8m{?07I6oNpRkDALEOV4ehh+n9=Cy5&e~!lh#-r& z6~ufNu>pjgMce}702XmGh~$7I6)T$t>b(5N#|1H-x4J7I7t-pg(01SAckvMc^*b_!x`048%<=;!+Ujv4~4R z$SmSw5XZ9!+$tt{dPxHbN(l2Gbz{8M`T=({XpHHeog z2(znyi&Y@*W)UkvT*e~K1aSt7SOEgVjH8u3-^*5UVSR(w#F0BFZANAQrKR42Vt^kp}U7 z79oS6EFy*O`A=9x62vc9L;}R4EJ6aYo<+n#oXa9&AW|$M3St?Hh=4ePMT9{d!XiWv zBUwZUUFV;%h#-hxvxoqQr&)vmVk3+2gILQVd?4~H!V98@MR-8WWD&g}Cb5Vf5c{%- zlkuwm1&cTd#P30!pb5RgV>)% zbc4{bh(+j2{}YQ?2;vnMaV&^UWuo!{62#RkVgZO%EMh*02#c5pVj+u|3&PDJjs{_3 z5l4YAvWPk8mj9SV%m(pu7BLINW)?9M#EmRs28eT5#B>lz7I7qqr7U6^h$$>$Du}Tx z;s_8USi}^(CI5{@91h}FETRjZozwYTBF#=A5!OM-fvgzT5w~ZP6SNmuwprwG80$K{}kQ7+evUWeITqs^;7>hd~W`9X%cDN--%d%t>IaG7Yz!_M|g% z8{Wvw6Wh{-1bznlOJ)Q)4K|aC;_pF&yoNrz6EkKr?FTPQalJiRVq5x%hsZOQcBk9w=G|YdOk*?m zWt0Kq|N3292G^A`lR6Tx?~nfBfF(xFW_x%hv%1~POs4o(p18J)PS8zS)7sTlJ%L}% zWEDdO%b6h9UwHjO+9O6$w%dG?Ul~qmn`nv&vaF1)oG+zKGo?&iDS<*NB`K9h+1IW( z%e4-w5#DUKZgmDyMurB3^mI?!vq(r!@neZGk6nH-E2S{&AHR_jhOCm51Fl&mRh;;q zdwuy%v%TG6A5@8y{VPvedzgBCM|X8q$70xZ*VpW@xSU&GLueP+>geQgkFmI_3h)*` z?h=#BcZsT)In2AnFo*Q);Jbvq-D$DdZT77$ekCKFbD0Ja&1 z#!(Kvt!h9+J(i`9y1&vNHI@%>?b)+OwETlJHZSH{4sUsK#OjuPM)1wQY+gLlI?`HW zE6uH?fR+MU3TP>yrGShu{ir!Jn`ZE9<)UbC;2OkH{4ns_T6v~piNn7Zi?Ud67?X`dAWiQqp@cZNBbSjWWqvW_l#w?pOCN^n|-!x`+=a_k&V*jHRZU>zkzbzzobz33X7?Avoev3XUJ&(o}cTgadWSfyW~z1{?)t zA4T6X3d)01RqeVm{K_U&j-yBGR%iMu$G%N) zgw>UzLJY1D)#6fF9hPdPafhT1IrY@2loL|p5F>D03e%va7@}r+$2rI2Q(Xl64hIFf zx_TQ_xs_65V38kOzbY+yO3knp)yTFL{!-0fszkPJFG>|Me!QNH?i#J*)C(*pqj*2= zK}PSt;63Wav8W5f3QlJneb7O=6|?#-Tucn6JnAI(o-O~a>(39RJKGipmlAy*g6X)a z3y+*Vb>TSPZXeISubDjP)({1M`O1{;c;oGLWb~YaY98&DAM3GH98*0WDro{3Gd1tO@m*RXZ z6lFGZt=emCXJ3cf8C_jfVWXKF4BakNjv26Z9cuP=m)nW&SF73UtJ$OW<;_^DzO~k= z=7}}BuCA(B;JYqQSnTb*leandfNs{I^ZdZJ(64Bw;5)6>c9(5X+h*Cn%DdLlSF?D! zx~d}4Z%?M!!42pZOFM6aBnAJ~s!F~gE$Dr@$;wx^pqKqC6Km~CE^AngT;>}XubY+2 zs;3Xvj`~vWm1Pa*F!MZm=XZOS=|7u+6$(zN&ruQ0rr)6iSTN>w`OYhk8{}DeO?6^--;0*ZHn7IUyZ+^C zG0%i+Sc~Z!2)v3641n!po9u_7yTIso=8v=@W{xYR;6VQ>f__YC46QPNAk#xF_orhI9HS zCfwp0tLPNA)Y2(@q2;NT&0C>X_!ZFT)07k&|8Hlg6t=v*Z5n;rR-}ieQm8*y(<#(+ z3g1O|G)<>a(<#(+3N@X=JzJ+Rr|A@GI)xY*py?E9I)!hb|5?*1-1$0%s?y+7Dn6;= z6Dn?(PT`_AM*sPVQP zgb!28Zky@|O{cJ5ihXA$vZhmb73M8zI)!SSfzmvJ!(N>7=fju(-KOXiwhWnoeOUNy>VQr(&Fnrc*dTcUaRYEa#Gvproc#I4DUpox;8(sd!F22BQcxox(}x ziX_o=3J2wqU7}N1ORevzTEvsJh$m_hUqPM1#>)5thkSggXY5b+Uaja9>PCFT;h*-= zQb0=qEd{g`&{9B40WAfz6wp#YO93qfv=sQ7qyPfEPg8?=uSS6Ps^B5zV1E@65j(1e zZ*9e>=OID`+S(mfEAQO>A$Gsy^acik{A$MXwmCb^mUf%1A||LBk8q10SzFN?EXN)E zsq2)?eZKvh`?LIASY8b4f%U=;f_Y$Gm=ETM&4UTBAS?tEVG&pq7K6oMXjSJ@up3}9 zEDg)Ta%JHU)-J9o$W@@4|izGsE(*A`DH_+$pfrV5h^*fGvlu zfSm~&0~-&U2s;*rMoMl0Y(8uuY!R#gI}|n-rf4u81v?sc1?+g(QrHq$0)}>9ZZT{Q z>_@OLY&L8b44o;Q1e*an33eoG8ti+p17S*}$Kzm!!@6LTVd$pgEHF3hESL-CgdGgK z17?CbU{;t7#>2h?I~lea_Au-r*n_Z5u=`?XV1NBkWe#2H14i zBd}XwH^bJ$ZiHPAYlB?}yB2m1>>AkBuq$Eb!+r=m7uEt>3mXk}GI!DhlbVHd*M zVIyJRhkYA13APvPTd@6Md&BmHjet#nErT5b+Xprlb_C20I}COJ><6$>ux{7|ur;tI zSTpPr*rl+`VEe%?hBYcC`n%fFDUV+`&J)cDZDY4Y(N3o_Lb=Kstkn!rl1@`xGNq)P zY!c(9lptrKX%oVZBI0OCs<}HPfKXN1p&No#pl0L~OgWDnKO_yoPY63#i#S_dPdnPIuZY4vT#l((yy;G%F&(mDT*5xL@>n(o#yUs^N#K0u`m1cF{k^I(-b! zZ%I}BQ5`Z_N!+0#v#NUXlTB0O{*)y8O^$Z+WYc^hpOH;=)3l5j^>@r$IMwc&ztvjv zyt`j(exBr2WM76UId7X}u}m`COlE7R)z!)K?Pj-GiImOsujW^_HcZg1SajBYU0n{h zHC)K}GM2nEl&}kwc~h;K+Jgso_owk5mTPSe-sN(BdAw#V*Y2)d>+H1I+bw2Wb*?S@ zk!$xY=UShoASE+?XCjujyNcr1HP^Z)o!+_>JXK6EuLZf{0Na9 zE$7;NK3mMYBL0Bvj{5xRuW7Eex_F0c7_UlNuH9X^*3oITv^!mDWcSKkTlS-_-MgG? zbCHN>v!;rnXs8&^+rOr{*2X(s!x8J!a_#QQwf0UsG``G(a&6g<_od5Wn@jTu+WtNI zyoHxs^lRk>&8Rzy8*ydR!wqj6GX`({o%mDxY;_8(@~oZOr=r%=)m0U>m-*r_%+|PV znV?mE_Z_T=WykA}#csBJ`SX5R^0(84H>QrBVZ5e7F=k?0x{wgsIw8oczB?;#im536 z?x=oE9s2wSzN>ySMAZ75@vQDDA*U_=l^tu3fV|7H)!*vsstN)V^f}@y*J2xGf6m zC^$<+%d6F)wkR1(Awt*fglM)&sA3yjIHLtI>EyTxs{45Mvo7hl+|Xrbz> z5dxwR^~+tNf6vVlcvR%uZ5B&)DK7hQt2n%Tt0)LkAQ~z1S)bYC59PKeOYGoV1)hW5 zRySW+AK>WrfZAZlO!E!7Rj8TC>K=5fDEn8QxVDQ<&`ny?id%)ZD5ZT~Dekvt>@i>8 zYf8YA6@5~?9Z;?~2Dg>_B)`z5G(VgAHOsr^OKH$fq^BtDrf8h+@{3ssZSb<11!GcLn3KRAsk|-Ra@v#5$ZefNwwG6& zI5x@1LTYMIh^Miuc~Vh~Mm-&PNHUGvz4sNq(`;{d*auZ2W&g^P)*hx_-_c!Nu0Sd; zXMGvBD-v*qlDqKwnjIF`Hi&y`7Z?(9JRUnN3@N{UKkgEf%Xf){BkN3Bcuy)+i2LJl z=3QcFE$ec3#16ho*xQ}x^|IM_{|m*?=l@N7q4;t^c)aEslvmwSyFhE_<@@pT9!V)W zg?kUuDQx&;Fvt zIilI{xbfh+�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 z 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 diff --git a/utils/process_chart_data.go b/utils/process_chart_data.go new file mode 100644 index 0000000..2577917 --- /dev/null +++ b/utils/process_chart_data.go @@ -0,0 +1,48 @@ +package utils + +// ProcessChartData processes chart data with language source data to produce the result based on the language key. +func ProcessChartData(chartData []map[string]interface{}, languageSource []map[string]interface{}, langKey string) []map[string]interface{} { + // Helper function to find translation + findTranslation := func(key string, value string) string { + for _, langEntry := range languageSource { + if langEntry["key"] == key && langEntry["value"] == value { + if translatedValue, ok := langEntry[langKey]; ok { + return translatedValue.(string) + } + } + } + return value // Return the original value if no translation is found + } + + // Extract unique translation keys from languageSource + translationKeys := map[string]bool{} + for _, langEntry := range languageSource { + if key, ok := langEntry["key"].(string); ok { + translationKeys[key] = true + } + } + + // Process each chart data entry + result := []map[string]interface{}{} + for _, entry := range chartData { + obsKey := entry["ObsKey"].(map[string]interface{}) + translatedObsKey := map[string]interface{}{} + + // Translate fields in ObsKey dynamically based on extracted translation keys + for key, value := range obsKey { + if translationKeys[key] { + translatedObsKey[key] = findTranslation(key, value.(string)) + } else { + translatedObsKey[key] = value + } + } + + // Append the translated entry to the result + result = append(result, map[string]interface{}{ + "ObsKey": translatedObsKey, + "ObsValue": entry["ObsValue"], + }) + } + + return result +}