From b5d0bfabd8251e7184fa32e1682a729202f4d36b Mon Sep 17 00:00:00 2001 From: Gowtham M Date: Sat, 25 Oct 2025 15:25:14 +0530 Subject: [PATCH] GWM : New api --- .env | 2 +- firebase-adminsdk-old.json | 14 +++++++ firebase-adminsdk.json | 25 ++++++------- main.go | 73 +++++++++++++++++++++++++++++++++---- pb_data/logs.db | Bin 32026624 -> 32026624 bytes 5 files changed, 92 insertions(+), 22 deletions(-) create mode 100755 firebase-adminsdk-old.json diff --git a/.env b/.env index 67b5888..b178225 100644 --- a/.env +++ b/.env @@ -1,4 +1,4 @@ APP_SIGNATURE = fcsc.gov.ae.X7pL9qZm2A -LIVE_BASE_URL = https://pb.venbait.in +LIVE_BASE_URL = https://pocket.fcsc.gov.ae BASE_URL = http://127.0.0.1:8090 diff --git a/firebase-adminsdk-old.json b/firebase-adminsdk-old.json new file mode 100755 index 0000000..c0c3bbe --- /dev/null +++ b/firebase-adminsdk-old.json @@ -0,0 +1,14 @@ +{ + "type": "service_account", + "project_id": "fcsc-a161c", + "private_key_id": "3660545901d4b2f8c2413d8643933dc941a51ea8", + "private_key": "-----BEGIN PRIVATE KEY-----\nMIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQC/WXF6EXdOVrKE\n2tExjsyWi1HCmganKM78DACYoxsNddN/vI9ptqijS/I9nPJ4dKb+bmkdUDq3c5Vf\nFkh1KrAVknKAWHz938eZiXz8P5FwTx0yP9SnBYp3MsSZ8ZGalAY8bsOf3SC2IGnU\nAdcv8TQPm39Br84TSV+5dwUljwTn2SxmjCrkvL/7MRHELvFsNGG6GyXQA9uTHq+K\nWtZ5vqSYerAg1+Lnven78nnpvtk9D+dCr17Y5x+Z0+V9dLYhXDlRFZFClvoC/Vws\n9ZeSKtYwo2KPq9f5IEfpo5SonES1Fen2iwlRr3PTuHP9iEC2XyjBcWo5X4ts7D4z\nJJ7WP/3HAgMBAAECggEAJISx8v19Wv6R0Gggb4hUxFBveKfDqEhSBGlX/cl3IsD/\nbcvzRNYe5hda8mZPIi0FJ96zgewrYJKXCdArYO0WMO/DmXoJ1LvOEJ/cMhoBrED1\nDf9/mqakj+4o9kZTpwAkFol/HTXrBcc220bEpjou2OGwzjz6o9Snh7JO0aWzZnnH\n4/h9ycIOffMdf4HCJ3StJYQ/mITOhgauFy5kKfx+7BNnS0pbA1DHSuP3EaqqloSn\nzPoIMkmalVroOjq7CV5gxUfPpEU8n0nZMmpSnk9bxh04bipJNPOSlve8+sx4FKs3\nlK6L4KBEnos+GMqCSQyFbdsQ3YHJSQF4fU0FFiLWWQKBgQDsmPoAK3rOO8fvK25R\nTEkK0zPAUCwGqGx7XeWdPK7f1pzx30J2+gCz8ZsvU6OnZt7JH9cnTdyIqf7dMMT+\ndRsRHjrkY7aldrM8FLCoK9XIjl6BPsbK2Bl4EeWo0SsWWQJDPC5UGmSdlgCADqvZ\ntrVpx3bAsdtVAxDKo9kHa40u3wKBgQDPCov1ukYf9rO4eBSpo0Y8CL07DdmhyrYM\nogO+VRZhq+2o1S7+sv2kKdsijxyXbKfDNz59mPvle4jmqxWZr4VXploUBBltWrej\nYSzFtuoD/n8pO06dvSNvZeTKYEe0qoDCdB1EV90dWYwZD5DyT5/J9b4QIe6bpq6b\nUq4QYLjWGQKBgArkS/YACmo+FEktXam+ckpeSK6cwjoYPM49F1nytjY1wgncdknV\n3nxqLfOyzQDi2nS104jKq9FayhHSse7o4zMZiiqDcKATY9LrPOqxAel2rGEUy8AA\nzMNbR5BK+MnRlSoVNijHAkTC6Aj9I+ok4BsbhJsAVRGHz5kUi+QsjlZPAoGAY2PX\nvnXWlh+TNRoIKUtlOwqi9Md4U1ABxty72VH1dZvYcjUs4z4/vuAM/3EeM58IhhFu\nIVMgkZCVLs6wht+YrnQASB2Tq0hiYb8ThDKD8rjoiH2dBuI2MZMDmxdPNO6o8zBU\noGthjWZgd+NeHMSWm5gpzorLhdMlfRDa2Kfl83kCgYEAkewjSqqUrYeFk9Bt02Vc\nwK3kxsanKOXutpdqDIwzSkzTJPgfMQPFI9I3SkjKgLaXZWFoT62o+XIOu2M0WnkR\nIhOSYSNQGK54Bbt2S6foosY72gcSLkzLb/W2K0uhygCATKE6FV+gq9seLeei7nhe\nXkRwkd9LZkEdjN/raXYg6eE=\n-----END PRIVATE KEY-----\n", + "client_email": "firebase-adminsdk-fbsvc@fcsc-a161c.iam.gserviceaccount.com", + "client_id": "100047472401187709093", + "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%40fcsc-a161c.iam.gserviceaccount.com", + "universe_domain": "googleapis.com" + } + \ No newline at end of file diff --git a/firebase-adminsdk.json b/firebase-adminsdk.json index c0c3bbe..ba3ad1e 100755 --- a/firebase-adminsdk.json +++ b/firebase-adminsdk.json @@ -1,14 +1,13 @@ { - "type": "service_account", - "project_id": "fcsc-a161c", - "private_key_id": "3660545901d4b2f8c2413d8643933dc941a51ea8", - "private_key": "-----BEGIN PRIVATE KEY-----\nMIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQC/WXF6EXdOVrKE\n2tExjsyWi1HCmganKM78DACYoxsNddN/vI9ptqijS/I9nPJ4dKb+bmkdUDq3c5Vf\nFkh1KrAVknKAWHz938eZiXz8P5FwTx0yP9SnBYp3MsSZ8ZGalAY8bsOf3SC2IGnU\nAdcv8TQPm39Br84TSV+5dwUljwTn2SxmjCrkvL/7MRHELvFsNGG6GyXQA9uTHq+K\nWtZ5vqSYerAg1+Lnven78nnpvtk9D+dCr17Y5x+Z0+V9dLYhXDlRFZFClvoC/Vws\n9ZeSKtYwo2KPq9f5IEfpo5SonES1Fen2iwlRr3PTuHP9iEC2XyjBcWo5X4ts7D4z\nJJ7WP/3HAgMBAAECggEAJISx8v19Wv6R0Gggb4hUxFBveKfDqEhSBGlX/cl3IsD/\nbcvzRNYe5hda8mZPIi0FJ96zgewrYJKXCdArYO0WMO/DmXoJ1LvOEJ/cMhoBrED1\nDf9/mqakj+4o9kZTpwAkFol/HTXrBcc220bEpjou2OGwzjz6o9Snh7JO0aWzZnnH\n4/h9ycIOffMdf4HCJ3StJYQ/mITOhgauFy5kKfx+7BNnS0pbA1DHSuP3EaqqloSn\nzPoIMkmalVroOjq7CV5gxUfPpEU8n0nZMmpSnk9bxh04bipJNPOSlve8+sx4FKs3\nlK6L4KBEnos+GMqCSQyFbdsQ3YHJSQF4fU0FFiLWWQKBgQDsmPoAK3rOO8fvK25R\nTEkK0zPAUCwGqGx7XeWdPK7f1pzx30J2+gCz8ZsvU6OnZt7JH9cnTdyIqf7dMMT+\ndRsRHjrkY7aldrM8FLCoK9XIjl6BPsbK2Bl4EeWo0SsWWQJDPC5UGmSdlgCADqvZ\ntrVpx3bAsdtVAxDKo9kHa40u3wKBgQDPCov1ukYf9rO4eBSpo0Y8CL07DdmhyrYM\nogO+VRZhq+2o1S7+sv2kKdsijxyXbKfDNz59mPvle4jmqxWZr4VXploUBBltWrej\nYSzFtuoD/n8pO06dvSNvZeTKYEe0qoDCdB1EV90dWYwZD5DyT5/J9b4QIe6bpq6b\nUq4QYLjWGQKBgArkS/YACmo+FEktXam+ckpeSK6cwjoYPM49F1nytjY1wgncdknV\n3nxqLfOyzQDi2nS104jKq9FayhHSse7o4zMZiiqDcKATY9LrPOqxAel2rGEUy8AA\nzMNbR5BK+MnRlSoVNijHAkTC6Aj9I+ok4BsbhJsAVRGHz5kUi+QsjlZPAoGAY2PX\nvnXWlh+TNRoIKUtlOwqi9Md4U1ABxty72VH1dZvYcjUs4z4/vuAM/3EeM58IhhFu\nIVMgkZCVLs6wht+YrnQASB2Tq0hiYb8ThDKD8rjoiH2dBuI2MZMDmxdPNO6o8zBU\noGthjWZgd+NeHMSWm5gpzorLhdMlfRDa2Kfl83kCgYEAkewjSqqUrYeFk9Bt02Vc\nwK3kxsanKOXutpdqDIwzSkzTJPgfMQPFI9I3SkjKgLaXZWFoT62o+XIOu2M0WnkR\nIhOSYSNQGK54Bbt2S6foosY72gcSLkzLb/W2K0uhygCATKE6FV+gq9seLeei7nhe\nXkRwkd9LZkEdjN/raXYg6eE=\n-----END PRIVATE KEY-----\n", - "client_email": "firebase-adminsdk-fbsvc@fcsc-a161c.iam.gserviceaccount.com", - "client_id": "100047472401187709093", - "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%40fcsc-a161c.iam.gserviceaccount.com", - "universe_domain": "googleapis.com" - } - \ No newline at end of file + "type": "service_account", + "project_id": "fcsc-uae-stats-9cb1e", + "private_key_id": "b1944c2fa5dd344d5c0f0b8b860d4a1dbd655939", + "private_key": "-----BEGIN PRIVATE KEY-----\nMIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQCd8sShEI4WCm92\nWbFEjdasqp/ZvMTP132vO0aApiXKqXea8LNgk+SSix5r4XDxz7VN0yRhkKl/oFKB\n93n5X6kt2ewVzJZT4e4UB8OAK1JS6Sir5g82f3hbTX2p4WY0jyo+FOe3I+hpiw1v\nKyQpuksPplHZKsyIenlvSFxMwW628OZTzsIQGGRrRznyrifC9dc8FUyU+Lfk8SpJ\nzjNbgilhufqUlbworQ+Bm+RzM+Fg5JsxRDw8PVB8mtj54+R761MDs5glYD91S8q+\nlM21rCF2HnKHVH5ojAeUVZv0rgP9pPoKtCNdv0BLcPyPs72REPc6mHJePe/fSknQ\nd+iTVy9dAgMBAAECggEAC4IPr4iMQbDa9C2Oy+bluEjqQqwNTvNtdeIEvgTdBgoY\n69ITz7qW0dKPEd8oIoY2uIfkw7MNln3w5QVJ/tBofC2/lMsGPPBeL1ltdh4x7laM\nnxGxFBBvjX9043bHwpaXxlQxmddk7KO0A+CJzvyC0Y4VspP6uQrrZB9KklEZpvyD\nAg0hEjOjyx0AHyniQ4iJo2ltb1GFHobHeLmuetbYGiefJNBfxp1AQ2ZaovZz5rkm\nqNOQ2mkB3VZ9VPg1pzaLGc4re79bC6pSOZGRZVgvrViRodIL5eHkv61oX0aQnnr0\n8wrUO5nM8qcsJPTZlEuRf7AP5nq+vNQ06fgTXQI94QKBgQDU4zuQEzlGJ1cQHuUZ\nVM7WF4KdDLWlooT/sFSlQRM7rTfW7Fr7cajrnpqXZlBHJCuve4nLcEyK8jcxKwtE\nQe6dCeUkFGZWvAy8W9TIE8oxKHvNR2kR/ulTYxFfHi72iJwIoa8bLvn7TzNE0Aex\nu+R9pGNt1HEuLBNMq28I06TBKQKBgQC9707HcR59EM2EXr+0ci8XO+QT6Jsv2eIq\n8p/SzoAkLO/eQlZ+Ezp0zousTYqBdXEPM93Xkr5Ot3Vdh6xctKRk5Rj1mUSaO9Ot\nFbhNvvaGVhfKRmyJoqMLmpta/DB2UifodPy1D2fLGYHRDARDh0RKO63UNE6KgIAT\nmVIlAwB/FQKBgE5lV5vY2HCTMCaJmghYCMsiYUEAWywhyyR1hNZOPoztXvDQnTiX\nRINwJrG2Rb3M/iFjNv0p36YTSGvc1AtQ1FQUPsOol389RNtgXd1IHF85701LDNBJ\ntRa2FsGWVekHqZ4sHFXAWOJI6jJfAVZcQOpbzRm27+724CyNvRfdCIDxAoGAU0Wh\nN2XL5S9Bu6BC0l0hckFKzMO1jjQrqYK4OZdZrQKao8pX22yYu2924zMX34xa5jxq\nLcJjd2WNqlT6Z6a3UJj06XCqGCjUtFUKeeOYd+s1APUBTxKkA0lkhW593NJGNu9b\ngBJiAjSLqthm4ihi81zY6GmKacTO4kjdL+byB8UCgYBdZQPCxq5jXw48AQGGmpoW\nyO7UQeWoFqw4RiSCyqzmymJHlB3Uq8leIABPML8uyp7IAl6UFE0As4n8AGhCrp2L\nwthxEpVHU0j8J4fre39ulz5gm34SKKnMwD+nxzvr4Xx7FWPcZCKTuKZXxzeqWEbu\n9SJUF4auw4x/l/GgtqVBag==\n-----END PRIVATE KEY-----\n", + "client_email": "firebase-adminsdk-fbsvc@fcsc-uae-stats-9cb1e.iam.gserviceaccount.com", + "client_id": "112238772816806612469", + "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%40fcsc-uae-stats-9cb1e.iam.gserviceaccount.com", + "universe_domain": "googleapis.com" +} diff --git a/main.go b/main.go index 60bb2d4..93180e7 100755 --- a/main.go +++ b/main.go @@ -478,7 +478,6 @@ func main() { } var baseUrl = os.Getenv("BASE_URL") - var liveBaseUrl = os.Getenv("LIVE_BASE_URL") app = pocketbase.New() @@ -1702,6 +1701,64 @@ func main() { }) + e.Router.POST("/api/checkUserWithUhid", func(c echo.Context) error { + + type RequestData struct { + Email string `json:"email"` + UUID string `json:"uuid"` + } + + var requestData RequestData + + // Bind JSON request to struct + if err := c.Bind(&requestData); err != nil { + return c.JSON(http.StatusBadRequest, map[string]string{ + "error": "Invalid request format", + }) + } + + // Validate required fields + if requestData.Email == "" || requestData.UUID == "" { + return c.JSON(http.StatusBadRequest, map[string]string{ + "error": "email and uuid are required", + }) + } + + // Try to find user by UUID (emiratesid) + user, err := e.App.Dao().FindFirstRecordByData("users", "emiratesid", requestData.UUID) + if err == nil && user != nil { + return c.JSON(http.StatusOK, map[string]interface{}{ + "status": "success", + "message": "User found by UUID", + }) + } + + // If UUID not found, try to find by email + userByEmail, err2 := e.App.Dao().FindFirstRecordByData("users", "email", requestData.Email) + if err2 != nil || userByEmail == nil { + return c.JSON(http.StatusOK, map[string]interface{}{ + "status": "failed", + "message": "User not found", + }) + } + + // Update UUID (emiratesid) using email-found record + userByEmail.Set("emiratesid", requestData.UUID) + if err := e.App.Dao().SaveRecord(userByEmail); err != nil { + return c.JSON(http.StatusInternalServerError, map[string]interface{}{ + "status": "error", + "message": "Failed to update UUID for existing user", + "error": err.Error(), + }) + } + + // Return success after update + return c.JSON(http.StatusOK, map[string]interface{}{ + "status": "success", + "message": "User found by email and UUID updated successfully", + }) + }) + type DownloadRequest struct { Username string `json:"username"` Password string `json:"password"` @@ -1721,7 +1778,7 @@ func main() { Records []map[string]interface{} `json:"records"` } - e.Router.POST("/api/downloadWithLogin", func(c echo.Context) error { + e.Router.POST("/api/syncFromVIT", func(c echo.Context) error { reqBody := new(DownloadRequest) if err := c.Bind(reqBody); err != nil { return c.JSON(400, map[string]string{"error": "invalid request"}) @@ -1738,7 +1795,7 @@ func main() { } data, _ := json.Marshal(loginPayload) - loginReq, _ := http.NewRequest("POST", fmt.Sprintf("%s/api/admins/auth-with-password", baseUrl), bytes.NewBuffer(data)) + loginReq, _ := http.NewRequest("POST", fmt.Sprintf("%s/api/admins/auth-with-password", "https://pb.venbait.in"), bytes.NewBuffer(data)) loginReq.Header.Set("Content-Type", "application/json") loginResp, err := http.DefaultClient.Do(loginReq) @@ -1759,7 +1816,7 @@ func main() { } // 2️⃣ Use token to fetch records - url := fmt.Sprintf("%s/api/collections/%s/records?perPage=500", baseUrl, reqBody.Collection) + url := fmt.Sprintf("%s/api/collections/%s/records?perPage=500", "https://pb.venbait.in", reqBody.Collection) fmt.Println("Fetching collection from URL:", url) req, _ := http.NewRequest("GET", url, nil) @@ -1808,10 +1865,10 @@ func main() { "password": reqBody.LivePassword, } data, _ := json.Marshal(livePayload) - liveReq, _ := http.NewRequest("POST", fmt.Sprintf("%s/api/admins/auth-with-password", liveBaseUrl), bytes.NewBuffer(data)) + liveReq, _ := http.NewRequest("POST", fmt.Sprintf("%s/api/admins/auth-with-password", "https://pocket.fcsc.gov.ae"), bytes.NewBuffer(data)) liveReq.Header.Set("Content-Type", "application/json") liveResp, err := http.DefaultClient.Do(liveReq) - fmt.Println("Live url:", liveBaseUrl) + fmt.Println("Live url:", "https://pocket.fcsc.gov.ae") fmt.Println("Live req:", liveReq) if err != nil { return c.JSON(500, map[string]string{"error": "failed to connect to Live PB"}) @@ -1834,7 +1891,7 @@ func main() { data, _ := json.Marshal(rec) // Try PATCH first - patchURL := fmt.Sprintf("%s/api/collections/%s/records/%s", liveBaseUrl, reqBody.Collection, id) + patchURL := fmt.Sprintf("%s/api/collections/%s/records/%s", "https://pocket.fcsc.gov.ae", reqBody.Collection, id) req, _ := http.NewRequest("PATCH", patchURL, bytes.NewBuffer(data)) req.Header.Set("Authorization", liveLogin.Token) req.Header.Set("Content-Type", "application/json") @@ -1848,7 +1905,7 @@ func main() { if resp.StatusCode == 404 { // Create instead - postURL := fmt.Sprintf("%s/api/collections/%s/records", liveBaseUrl, reqBody.Collection) + postURL := fmt.Sprintf("%s/api/collections/%s/records", "https://pocket.fcsc.gov.ae", reqBody.Collection) req, _ := http.NewRequest("POST", postURL, bytes.NewBuffer(data)) req.Header.Set("Authorization", liveLogin.Token) req.Header.Set("Content-Type", "application/json") diff --git a/pb_data/logs.db b/pb_data/logs.db index 85996454b1b64876242cab8c223d554a01a1ae0b..b78d7cf75c9d5d5f92244462f556684f10cc7197 100644 GIT binary patch delta 4205 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