GWM : New api

This commit is contained in:
Gowtham M 2025-10-25 15:25:14 +05:30
parent f4b3beab61
commit b5d0bfabd8
5 changed files with 92 additions and 22 deletions

2
.env
View File

@ -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

14
firebase-adminsdk-old.json Executable file
View File

@ -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"
}

View File

@ -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"
}
"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"
}

73
main.go
View File

@ -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")

Binary file not shown.