Responses

One envelope for every endpoint, so clients always know where to look.

Import
github.com/HiWay-Media/hwm-go-utils/api/models

Success

{ "response": "OK", "message": "optional text", "data": { "id": 1 } }
Constructor Produces
ApiDefault() {"response":"OK"}
ApiDefaultResponse(data) {"response":"OK","data":…}
ApiDefaultMsgOnly(msg) {"response":"OK","message":"…"}
ApiDefaultMsgResponse(data, msg) {"response":"OK","message":"…","data":…}

Error

{ "response": "KO", "message": "not found" }
Constructor Produces
ApiDefaultError(msg) {"response":"KO","message":"…"}

Empty fields are omitted from the JSON.

In a handler

func getChannel(c *fiber.Ctx) error {
	ch, err := repo.Find(c.Params("id"))
	if errors.Is(err, gorm.ErrRecordNotFound) {
		return c.Status(fiber.StatusNotFound).JSON(models.ApiDefaultError("not found"))
	}
	if err != nil {
		logger.Errorf("find channel: %v", err)
		return c.Status(fiber.StatusInternalServerError).JSON(models.ApiDefaultError("internal error"))
	}
	return c.JSON(models.ApiDefaultResponse(ch))
}

Send users a stable, generic message and keep the real error in the logs — the same rule the generic CRUD follows.