package controllers import ( "nearle/db" "nearle/domain" "nearle/models" "nearle/utils" "strconv" "strings" "time" "net/http" "github.com/gofiber/fiber/v2" "gorm.io/gorm" ) func Createtenant(c *fiber.Ctx) error { var data models.Tenants var seq models.Ordersequences var result models.Tenantinfo if err := c.BodyParser(&data); err != nil { return err } tid := domain.Checktenantbyno(data.Primarycontact) if tid != 0 { return c.JSON(fiber.Map{ "code": http.StatusConflict, "message": "Tenant Already Exists", "status": false, }) } tx := db.DB.Begin() t1 := tx.Create(&data) if t1.Error != nil { utils.Error("Createtenant t1 error", "error", t1.Error) tx.Rollback() } seq.Tenantid = data.Tenantid t2 := tx.Table("ordersequences").Create(&seq) if t2.Error != nil { utils.Error("Createtenant t2 error", "error", t2.Error) tx.Rollback() } err := tx.Commit().Error if err != nil { return c.JSON(fiber.Map{ "code": http.StatusConflict, "message": err.Error(), "status": false, }) } result = domain.GetTeanantById(data.Tenantid) return c.JSON(fiber.Map{ "code": http.StatusCreated, "message": "Successfully Created", "status": true, "details": result, }) } func CreateLocation(c *fiber.Ctx) error { var data models.Tenantlocations if err := c.BodyParser(&data); err != nil { return err } err := domain.CreateLocation(data) if err != nil { return c.JSON(fiber.Map{ "code": http.StatusConflict, "message": err.Error(), "status": false, }) } return c.JSON(fiber.Map{ "code": http.StatusCreated, "message": "Location Successfully Created", "status": true, }) } func CreatetenantUser(c *fiber.Ctx) error { var data models.Tenants var result models.UserInfo if err := c.BodyParser(&data); err != nil { return err } tid := domain.Checktenantbyno(data.Primarycontact) if tid != 0 { return c.JSON(fiber.Map{ "code": http.StatusConflict, "message": "Tenant Already Exists", "status": false, }) } status, err := domain.CreateTenantUser(data) if !status { return c.JSON(fiber.Map{ "code": http.StatusCreated, "message": err.Error(), "status": false, }) } else { result = domain.Getuserbyno(data.Primarycontact) } return c.JSON(fiber.Map{ "code": http.StatusCreated, "message": "Successfully Created", "status": true, "details": result, }) } func GetTenantInfo(c *fiber.Ctx) error { tid, _ := strconv.Atoi(c.Query("tenantid")) data := domain.GetTeanantById(tid) return c.JSON(fiber.Map{ "code": http.StatusOK, "message": "Success", "status": true, "details": data, }) } func GetTenantStatus(c *fiber.Ctx) error { tid, _ := strconv.Atoi(c.Query("tenantid")) data := domain.GetTeanantById(tid) return c.JSON(fiber.Map{ "code": http.StatusOK, "message": "Success", "status": true, "details": data, }) } func GetTenantPricing(c *fiber.Ctx) error { tid, _ := strconv.Atoi(c.Query("tenantid")) aid, _ := strconv.Atoi(c.Query("applocationid")) data := domain.GetTeanantPricing(tid, aid) return c.JSON(fiber.Map{ "code": http.StatusOK, "message": "Success", "status": true, "details": data, }) } func GetPricingList(c *fiber.Ctx) error { tid, _ := strconv.Atoi(c.Query("tenantid")) data := domain.GetPricinglist(tid) return c.JSON(fiber.Map{ "code": http.StatusOK, "message": "Success", "status": true, "details": data, }) } func CreateStaff(c *fiber.Ctx) error { var data models.User if err := c.BodyParser(&data); err != nil { return err } err := db.DB.Table("app_users").Create(&data).Error if err != nil { return c.JSON(fiber.Map{ "code": http.StatusCreated, "message": err.Error(), "status": false, }) } return c.JSON(fiber.Map{ "code": http.StatusCreated, "message": "Success", "status": true, }) } func CreatePricing(c *fiber.Ctx) error { var data models.Tenantpricing if err := c.BodyParser(&data); err != nil { return err } err := db.DB.Table("tenantpricing").Create(&data).Error if err != nil { return c.JSON(fiber.Map{ "code": http.StatusCreated, "message": err.Error(), "status": false, }) } return c.JSON(fiber.Map{ "code": http.StatusCreated, "message": "Success", "status": true, }) } func UpdateStaff(c *fiber.Ctx) error { var data models.User if err := c.BodyParser(&data); err != nil { return err } err := db.DB.Table("app_users").Where("userid=?", data.Userid).Updates(&data).Error if err != nil { return c.JSON(fiber.Map{ "status": false, "code": http.StatusConflict, "message": err.Error(), }) } return c.JSON(fiber.Map{ "status": true, "code": http.StatusAccepted, "message": "User update successful", }) } func GetStaffs(c *fiber.Ctx) error { tid, _ := strconv.Atoi(c.Query("tenantid")) var data []models.StaffInfo q1 := `SELECT a.userid,a.firstname,a.lastname,concat(a.firstname,'',a.lastname) as fullname,a.email,a.contactno,a.address,a.suburb,a.city,a.state,a.postcode,a.userfcmtoken,a.pin,a.applocationid, a.roleid,a.partnerid,a.tenantid,a.locationid,b.locationname from app_users a INNER JOIN tenantlocations b ON a.locationid=b.locationid where a.tenantid=?` db.DB.Raw(q1, tid).Find(&data) return c.JSON(fiber.Map{ "code": http.StatusOK, "message": "Success", "status": true, "details": data, }) } func GetTenants(c *fiber.Ctx) error { aid, _ := strconv.Atoi(c.Query("applocationid")) pid, _ := strconv.Atoi(c.Query("partnerid")) Stat := strings.ToUpper(c.Query("status")) var data []models.Tenantinfo query := db.DB.Table("tenants as a"). Select("a.*, b.subcategoryname"). Joins("INNER JOIN app_subcategory b ON b.subcategoryid = a.subcategoryid") // 🔥 Fixed conditions (always applied) query = query.Where("a.tenanttype = ? AND a.approved = ?", "E", 1) // 🔍 Dynamic filters if aid != 0 { query = query.Where("a.applocationid = ?", aid) } if pid != 0 { query = query.Where("a.partnerid = ?", pid) } if Stat != "" { query = query.Where("UPPER(a.status) = ?", Stat) } query.Find(&data) return c.JSON(fiber.Map{ "code": http.StatusOK, "message": "Success", "status": true, "details": data, }) } func SearchTenant(c *fiber.Ctx) error { status := c.Query("status") searchstr := c.Query("keyword") var data []models.Tenantinfo // Use query builder for safer and cleaner code query := db.DB.Table("tenants as a"). Select("a.*, b.subcategoryname, c.firstname, c.lastname, concat(c.firstname,' ',c.lastname) AS accountname"). Joins("INNER JOIN app_subcategory b on a.subcategoryid=b.subcategoryid"). Joins("LEFT JOIN app_users c on c.userid=a.partneruserid") if status != "pending" { query = query.Where("a.approved = 1 AND lower(a.status) = ?", strings.ToLower(status)) } else { query = query.Where("a.approved = 0") } if searchstr != "" { query = query.Where("lower(a.tenantname) like ?", strings.ToLower(searchstr)+"%") } query.Find(&data) return c.JSON(fiber.Map{ "code": http.StatusOK, "message": "Success", "status": true, "details": data, }) } // func GetAllTenants(c *fiber.Ctx) error { // pageno, _ := strconv.Atoi(c.Query("pageno")) // pagesize, _ := strconv.Atoi(c.Query("pagesize")) // status := c.Query("status") // aid, _ := strconv.Atoi(c.Query("applocationid")) // offset := (pageno - 1) * pagesize // var data []models.Tenantinfo // var q1 string // if status == "active" { // if aid != 0 { // q1 = `SELECT a.*,b.subcategoryname, c.locationname as applocation FROM tenants a // INNER JOIN app_subcategory b on a.subcategoryid=b.subcategoryid // INNER JOIN app_location c on a.applocationid=c.applocationid // where a.approved=1 and a.status='Active' and a.applocationid=` + strconv.Itoa(aid) + ` ORDER BY a.tenantid desc LIMIT ` + strconv.Itoa(pagesize) + ` OFFSET ` + strconv.Itoa(offset) // } else { // q1 = `SELECT a.*,b.subcategoryname, c.locationname as applocation // FROM tenants a // INNER JOIN app_subcategory b on a.subcategoryid=b.subcategoryid // INNER JOIN app_location c on a.applocationid=c.applocationid // where a.approved=1 and a.status='Active' ORDER BY a.tenantid desc LIMIT ` + strconv.Itoa(pagesize) + ` OFFSET ` + strconv.Itoa(offset) // } // } else if status == "inactive" { // if aid != 0 { // q1 = `SELECT a.*,b.subcategoryname, c.locationname as applocation FROM tenants a // INNER JOIN app_subcategory b on a.subcategoryid=b.subcategoryid // INNER JOIN app_location c on a.applocationid=c.applocationid // where a.approved=1 and a.status='InActive' and a.applocationid=` + strconv.Itoa(aid) + ` ORDER BY a.tenantid desc LIMIT ` + strconv.Itoa(pagesize) + ` OFFSET ` + strconv.Itoa(offset) // } else { // q1 = `SELECT a.*,b.subcategoryname, c.locationname as applocation // FROM tenants a // INNER JOIN app_subcategory b on a.subcategoryid=b.subcategoryid // INNER JOIN app_location c on a.applocationid=c.applocationid // where a.approved=1 and a.status='InActive' ORDER BY a.tenantid desc LIMIT ` + strconv.Itoa(pagesize) + ` OFFSET ` + strconv.Itoa(offset) // } // } else if status == "pending" { // if aid != 0 { // q1 = `SELECT a.*,b.subcategoryname, c.locationname as applocation FROM tenants a // INNER JOIN app_subcategory b on a.subcategoryid=b.subcategoryid // INNER JOIN app_location c on a.applocationid=c.applocationid // where a.approved=0 and a.applocationid=` + strconv.Itoa(aid) + ` ORDER BY a.tenantid desc LIMIT ` + strconv.Itoa(pagesize) + ` OFFSET ` + strconv.Itoa(offset) // } else { // q1 = `SELECT a.*,b.subcategoryname, c.locationname as applocation // FROM tenants a // INNER JOIN app_subcategory b on a.subcategoryid=b.subcategoryid // INNER JOIN app_location c on a.applocationid=c.applocationid // where a.approved=0 ORDER BY a.tenantid desc LIMIT ` + strconv.Itoa(pagesize) + ` OFFSET ` + strconv.Itoa(offset) // } // } // // println(q1) // db.DB.Raw(q1).Find(&data) // return c.JSON(fiber.Map{ // "code": http.StatusOK, // "message": "Success", // "status": true, // "details": data, // }) // } func GetAllTenants(c *fiber.Ctx) error { pageno, _ := strconv.Atoi(c.Query("pageno")) pagesize, _ := strconv.Atoi(c.Query("pagesize")) status := c.Query("status") aid, _ := strconv.Atoi(c.Query("applocationid")) moduleid, _ := strconv.Atoi(c.Query("moduleid")) tenanttype := c.Query("tenanttype") keyword := c.Query("keyword") details := domain.Getalltenants(pageno, pagesize, aid, moduleid, status, tenanttype, keyword) return c.JSON(fiber.Map{ "code": http.StatusOK, "message": "Success", "status": true, "details": details, }) } func GetTenantSummary(c *fiber.Ctx) error { aid, _ := strconv.Atoi(c.Query("applocationid", "0")) moduleid, _ := strconv.Atoi(c.Query("moduleid", "0")) tenanttype := c.Query("tenanttype", "0") keyword := c.Query("keyword", "") type Result struct { Total int64 Active int64 Inactive int64 Pending int64 } var result Result query := db.DB.Table("tenants"). Select(` COUNT(*) AS total, COUNT(*) FILTER (WHERE approved = 1 AND status = 'Active') AS active, COUNT(*) FILTER (WHERE approved = 1 AND status = 'InActive') AS inactive, COUNT(*) FILTER (WHERE approved = 0) AS pending `) // Apply filters if aid != 0 { query = query.Where("applocationid = ?", aid) } if moduleid != 0 { query = query.Where("moduleid = ?", moduleid) } if tenanttype != "0" { query = query.Where("tenanttype = ?", tenanttype) } if keyword != "" { k := "%" + keyword + "%" query = query.Where("tenantname ILIKE ? OR primarycontact ILIKE ?", k, k) } // Execute single query err := query.Scan(&result).Error if err != nil { return c.Status(500).JSON(fiber.Map{ "status": false, "message": err.Error(), }) } return c.JSON(fiber.Map{ "code": http.StatusOK, "message": "Summary fetched successfully", "status": true, "summary": fiber.Map{ "total": result.Total, "active": result.Active, "inactive": result.Inactive, "pending": result.Pending, }, }) } func GetCloudStore(c *fiber.Ctx) error { pageno, _ := strconv.Atoi(c.Query("pageno")) pagesize, _ := strconv.Atoi(c.Query("pagesize")) status := c.Query("status") aid, _ := strconv.Atoi(c.Query("applocationid")) offset := (pageno - 1) * pagesize var data []models.Tenantinfo query := db.DB.Table("tenants as a"). Select("a.*, c.locationname as applocation"). Joins("INNER JOIN app_location c on a.applocationid=c.applocationid"). Where("a.tenanttype = ?", "C") if status == "active" { query = query.Where("a.approved = 1 AND a.status = ?", "Active") } else if status == "inactive" { query = query.Where("a.approved = 1 AND a.status = ?", "InActive") } else if status == "pending" { query = query.Where("a.approved = 0") } if aid != 0 { query = query.Where("a.applocationid = ?", aid) } query.Order("a.tenantid desc").Limit(pagesize).Offset(offset).Find(&data) return c.JSON(fiber.Map{ "code": http.StatusOK, "message": "Success", "status": true, "details": data, }) } func GetTenantLocations(c *fiber.Ctx) error { tid, _ := strconv.Atoi(c.Query("tenantid")) keyword := strings.ToLower(c.Query("keyword")) var data []models.Tenantlocations db.DB.Table("tenantlocations as a"). Select("a.*, b.roleid"). Joins("LEFT JOIN app_users b ON a.locationid = b.locationid AND a.tenantid = b.tenantid"). Where("a.tenantid = ?", tid). Scopes(func(db *gorm.DB) *gorm.DB { if keyword != "" { k := "%" + keyword + "%" return db.Where("LOWER(a.locationname) LIKE ? OR LOWER(a.contactno) LIKE ?", k, k) } return db }). Find(&data) var result []map[string]interface{} for _, loc := range data { // ✅ Build slots in required format slots := []map[string]string{} if loc.Slot1 != "" { slots = append(slots, map[string]string{ "name": "Slot 1", "time": loc.Slot1, }) } if loc.Slot2 != "" { slots = append(slots, map[string]string{ "name": "Slot 2", "time": loc.Slot2, }) } if loc.Slot3 != "" { slots = append(slots, map[string]string{ "name": "Slot 3", "time": loc.Slot3, }) } if loc.Slot4 != "" { slots = append(slots, map[string]string{ "name": "Slot 4", "time": loc.Slot4, }) } if loc.Slot5 != "" { slots = append(slots, map[string]string{ "name": "Slot 5", "time": loc.Slot5, }) } m := map[string]interface{}{ "locationid": loc.Locationid, "tenantid": loc.Tenantid, "applocationid": loc.Applocationid, "moduleid": loc.Moduleid, "locationname": loc.Locationname, "email": loc.Email, "contactno": loc.Contactno, "latitude": loc.Latitude, "longitude": loc.Longitude, "address": loc.Address, "suburb": loc.Suburb, "city": loc.City, "state": loc.State, "postcode": loc.Postcode, "opentime": loc.Opentime, "closetime": loc.Closetime, "partnerid": loc.Partnerid, "deliveryradius": loc.Deliveryradius, "deliverymins": loc.Deliverymins, "cancelsecs": loc.Cancelsecs, "slots": slots, "status": loc.Status, } result = append(result, m) } return c.JSON(fiber.Map{ "code": http.StatusOK, "message": "Success", "status": true, "details": result, }) } func GetTenantSlot(c *fiber.Ctx) error { var data models.Tenantslot q1 := `SELECT * FROM tenantslot` utils.Logger.Debugf("Query: %s", q1) db.DB.Raw(q1).Find(&data) return c.JSON(fiber.Map{ "code": http.StatusOK, "message": "Success", "status": true, "details": data, }) } func GetTenantLocation(c *fiber.Ctx) error { tid, _ := strconv.Atoi(c.Query("tenantid")) lid, _ := strconv.Atoi(c.Query("locationid")) var data models.Tenantlocations db.DB.Table("tenantlocations").Where("tenantid = ? AND locationid = ?", tid, lid).Find(&data) result := map[string]interface{}{ "locationid": data.Locationid, "tenantid": data.Tenantid, "applocationid": data.Applocationid, "moduleid": data.Moduleid, "locationname": data.Locationname, "email": data.Email, "contactno": data.Contactno, "latitude": data.Latitude, "longitude": data.Longitude, "address": data.Address, "suburb": data.Suburb, "city": data.City, "state": data.State, "postcode": data.Postcode, "opentime": data.Opentime, "closetime": data.Closetime, "partnerid": data.Partnerid, "deliveryradius": data.Deliveryradius, "deliverymins": data.Deliverymins, "cancelsecs": data.Cancelsecs, "slots": []map[string]string{ {"slot1": data.Slot1}, {"slot2": data.Slot2}, {"slot3": data.Slot3}, {"slot4": data.Slot4}, {"slot5": data.Slot5}, }, "status": data.Status, } return c.JSON(fiber.Map{ "code": http.StatusOK, "message": "Success", "status": true, "details": result, }) } func UpdateTenant(c *fiber.Ctx) error { var data models.Tenants if err := c.BodyParser(&data); err != nil { return err } err := domain.UpdateTenant(data) if err != nil { return c.JSON(fiber.Map{ "status": false, "code": http.StatusConflict, "message": err, }) } return c.JSON(fiber.Map{ "status": true, "code": http.StatusAccepted, "message": "Tenant update successful", }) } func UpdateLocation(c *fiber.Ctx) error { var data models.Tenantlocations if err := c.BodyParser(&data); err != nil { return err } err := domain.UpdateLocation(data) if err != nil { return c.JSON(fiber.Map{ "status": false, "code": http.StatusConflict, "message": err, }) } return c.JSON(fiber.Map{ "status": true, "code": http.StatusAccepted, "message": "Location update successful", }) } func Createtenantcustomer(c *fiber.Ctx) error { var req models.CreateTenantCustomerRequest if err := c.BodyParser(&req); err != nil { return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{ "code": 400, "status": false, "message": "Invalid request body", "data": fiber.Map{}, }) } tenantcustomers := models.TenantCustomer{ TenantID: req.TenantID, LocationID: req.LocationID, CustomerID: req.CustomerID, CustomerLocationID: req.CustomerLocationID, Status: req.Status, } if err := db.DB.Create(&tenantcustomers).Error; err != nil { utils.Logger.Errorf("Error inserting tenant customer: %v", err) return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{ "code": 500, "status": false, "message": "Failed to create tenant customer", "data": fiber.Map{}, }) } return c.Status(fiber.StatusOK).JSON(fiber.Map{ "code": 200, "status": true, "message": "Tenant customer created successfully", "data": tenantcustomers, }) } func GetCustomerTenants(c *fiber.Ctx) error { customerID, err := strconv.Atoi(c.Query("customerid")) if err != nil || customerID == 0 { return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{ "code": 400, "message": "Invalid customerid", "status": false, "data": fiber.Map{}, }) } // categoryIDStr := c.Query("categoryid") // var categoryID int // if categoryIDStr != "" { // categoryID, _ = strconv.Atoi(categoryIDStr) // } data := domain.GetCustomerLocations(customerID) return c.Status(http.StatusOK).JSON(fiber.Map{ "code": http.StatusOK, "message": "Success", "status": true, "data": data, }) } func CreateTenantLocation(c *fiber.Ctx) error { var data models.Tenantlocations if err := c.BodyParser(&data); err != nil { return err } err := domain.CreateTenantLocation(data) if err != nil { return c.JSON(fiber.Map{ "code": http.StatusConflict, "message": err.Error(), "status": false, }) } return c.JSON(fiber.Map{ "code": http.StatusCreated, "message": "Tenant Location Successfully Created", "status": true, }) } func UpdateTenantLocation(c *fiber.Ctx) error { var data models.Tenantlocations if err := c.BodyParser(&data); err != nil { return err } err := domain.UpdateTenantLocation(data) if err != nil { return c.JSON(fiber.Map{ "status": false, "code": http.StatusConflict, "message": err, }) } return c.JSON(fiber.Map{ "status": true, "code": http.StatusAccepted, "message": "Tenant Location update successful", }) } func GetLocationSummary(c *fiber.Ctx) error { tenantID, err := strconv.Atoi(c.Query("tenantid")) if err != nil || tenantID <= 0 { return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{ "code": 400, "status": false, "message": "Invalid tenantid", }) } summary := domain.FetchLocationSummary(tenantID) return c.Status(fiber.StatusOK).JSON(fiber.Map{ "code": 200, "status": true, "message": "Success", "details": summary, }) } func GetTenantStaffSummary(c *fiber.Ctx) error { tenantID, err := strconv.Atoi(c.Query("tenantid")) if err != nil || tenantID == 0 { return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{ "code": 400, "status": false, "message": "Invalid tenantid", "details": fiber.Map{}, }) } summary := domain.FetchTenantStaffSummary(tenantID) return c.JSON(fiber.Map{ "code": http.StatusOK, "status": true, "message": "Success", "details": summary, }) } func GetTenantRiderSummary(c *fiber.Ctx) error { tenantID, err := strconv.Atoi(c.Query("tenantid")) if err != nil || tenantID == 0 { return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{ "code": 400, "status": false, "message": "Invalid tenantid", "details": fiber.Map{}, }) } summary := domain.FetchTenantRiderSummary(tenantID) return c.JSON(fiber.Map{ "code": http.StatusOK, "status": true, "message": "Success", "details": summary, }) } func CreateTenantRequest(c *fiber.Ctx) error { var request models.TenantRequest if err := c.BodyParser(&request); err != nil { return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{ "code": 400, "message": "Invalid request body", "status": false, }) } // Set timestamps if not already set request.Requestdate = time.Now() request.Created = time.Now() request.Updated = time.Now() // Insert into tenantrequests table if err := db.DB.Table("tenantrequests").Create(&request).Error; err != nil { return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{ "code": 500, "message": "Failed to create tenant request", "status": false, }) } return c.Status(fiber.StatusCreated).JSON(fiber.Map{ "code": 201, "message": "Tenant request created successfully", "status": true, "data": request, }) } func GetTenantRequests(c *fiber.Ctx) error { tenantIDStr := c.Query("tenantid") pageNoStr := c.Query("pageno", "1") pageSizeStr := c.Query("pagesize", "10") pageNo, _ := strconv.Atoi(pageNoStr) pageSize, _ := strconv.Atoi(pageSizeStr) if pageNo < 1 { pageNo = 1 } if pageSize < 1 { pageSize = 10 } offset := (pageNo - 1) * pageSize var requests []models.TenantRequest query := db.DB.Table("tenantrequests") // Optional filter by tenantid if tenantIDStr != "" { tenantID, err := strconv.Atoi(tenantIDStr) if err != nil { return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{ "code": 400, "message": "Invalid tenantid", "status": false, }) } if tenantID != 0 { query = query.Where("tenantid = ?", tenantID) } } var total int64 query.Count(&total) if err := query.Order("created desc").Offset(offset).Limit(pageSize).Find(&requests).Error; err != nil { return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{ "code": 500, "message": "Failed to fetch tenant requests", "status": false, }) } return c.Status(fiber.StatusOK).JSON(fiber.Map{ "code": 200, "message": "Tenant requests fetched successfully", "status": true, "data": requests, }) } func CreateTenantPromotion(c *fiber.Ctx) error { var data models.Tenantpromotions // Parse body (Locationid comes as []string) if err := c.BodyParser(&data); err != nil { return c.Status(http.StatusBadRequest).JSON(fiber.Map{ "status": false, "code": http.StatusBadRequest, "message": "Invalid JSON body", }) } if len(data.Locationid) > 0 { data.LocationidStr = strings.Join(data.Locationid, ",") } // Save to DB if err := domain.CreateTenantPromotion(&data); err != nil { return c.Status(http.StatusInternalServerError).JSON(fiber.Map{ "status": false, "code": http.StatusInternalServerError, "message": err.Error(), }) } return c.Status(http.StatusCreated).JSON(fiber.Map{ "status": true, "code": http.StatusCreated, "message": "Promotion created successfully", "data": data, }) } func GetTenantPromotions(c *fiber.Ctx) error { tid, _ := strconv.Atoi(c.Query("tenantid")) lid := c.Query("locationid") // user sends single location id data := domain.GetTenantPromotions(tid, lid) return c.JSON(fiber.Map{ "status": true, "code": 200, "message": "Success", "details": data, }) }