1

my function receives a http request and sends back json string as http response. This is my Code:

func homePage(res http.ResponseWriter, req *http.Request) {
    type Resp struct {
        Result []map[string]interface{} `json:"result,omitempty"`
        Status string                   `json:"status"`
    }
    type Inputs struct {
        ShopID   string `json:"ShopID"`
        DeviceID string `json:"DeviceID"`
        EmpID    string `json:"EmpID"`
        Token    string `json:"Token"`
        Version  string `json:"Version"`
    }

    var Response Resp
    Response.Status = "failed"

    db, err := sql.Open("mysql", "root:password@tcp(127.0.0.1:3306)/b2b")

    if err != nil {
        panic(err.Error())
    }
    defer db.Close()

    rnd := render.New()
    b, err := ioutil.ReadAll(req.Body)
    defer req.Body.Close()

    if err != nil {
        panic(err.Error())
    }
    // Unmarshal the request body
    var msg Inputs
    err = json.Unmarshal(b, &msg)
    if err != nil {
        panic(err.Error())
    }

    bookingrows, bookingerr := db.Query("SELECT DISTINCT b2b_booking_id,b2b_check_in_report,b2b_vehicle_at_garage,b2b_service_under_progress,b2b_vehicle_ready,b2b_vehicle_delivered FROM b2b_booking_tbl WHERE b2b_flag=0 and b2b_shop_id=?", msg.ShopID)
    if bookingerr != nil {
        panic(bookingerr.Error())
    } else {

        Result := make(map[string]interface{})
        for bookingrows.Next() {
            var bookingid, checkinreported, vehicleingarage, serviceinprogress, vehicleready, vehicledelivered string
            err = bookingrows.Scan(&bookingid, &checkinreported, &vehicleingarage, &serviceinprogress, &vehicleready, &vehicledelivered)
            type Output struct {
                checkins   int `json:"checkins"`
                inprogress int `json:"inprogress"`
                ready      int `json:"ready"`
                completed  int `json:"completed"`
            }
            var output Output
            if err != nil {
                panic(err.Error())
                Response.Status = "failed"
            }
            if vehicledelivered == "1" {
                output.completed = output.completed + 1
            }
            if vehicledelivered == "0" && vehicleready == "1" {
                output.ready = output.ready + 1
            }
            if vehicledelivered == "0" && vehicleready == "0" && serviceinprogress == "1" {
                output.inprogress = output.inprogress + 1
            }
            if vehicledelivered == "0" && vehicleready == "0" && serviceinprogress == "0" && (checkinreported == "1" || vehicleingarage == "1") {
                output.checkins = output.checkins + 1
            }

            values := make([]string, 4)
            val := reflect.ValueOf(output)
            for i := range values {
                //Result[usercolumns[i]] = fmt.Sprintf("%s", v)
                Result[val.Type().Field(i).Tag.Get("json")] = fmt.Sprintf("%v", i)
            }
        }

        Response.Result = append(Response.Result, Result)
        Response.Status = "success"

    }

    res.Header().Set("Content-Type", "application/json")
    rnd.JSON(res, http.StatusOK, Response)
}

Im getting the desired output when the input values are correct and the corresponding row exists in Db. but when the input is wrong or the query fails, i should return only the status as "failed" but my output contains the result [] which is empty like this.

{
    "result": [
        {}
    ],
    "status": "success"
} 

I tried checking Result == nil and add the array only on true. but this doesn't help me. it might be because the struct is not nill. I need some help to to find the issue and solve it.

0

1 Answer 1

2

Trying checking the length of the Result array before appending it to output

Something like this

if (len(Result) != 0) {
    Response.Result = append(Response.Result, Result)
}

Maybe you also need to write this also Result := make(map[string]interface{}) inside the if condition, before the append statement

Sign up to request clarification or add additional context in comments.

3 Comments

You can accept this as solution/upvote stackoverflow.com/help/someone-answers
Result := make(map[string]interface{}) i cant use this in the condition because the output struct is local to the above block, and it should be inside it , if not the value gets initiated and when i send another request to the same function and the query fails, it shows the previous output @Umair
Ok then try only putting append statement in if condition and without altering initialization statement

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.