You've already forked openaccounting-server
mirror of
https://github.com/openaccounting/oa-server.git
synced 2025-12-09 00:50:59 +13:00
initial commit
This commit is contained in:
183
core/api/price.go
Normal file
183
core/api/price.go
Normal file
@@ -0,0 +1,183 @@
|
||||
package api
|
||||
|
||||
import (
|
||||
"github.com/ant0ine/go-json-rest/rest"
|
||||
"github.com/openaccounting/oa-server/core/model"
|
||||
"github.com/openaccounting/oa-server/core/model/types"
|
||||
"net/http"
|
||||
"strconv"
|
||||
"time"
|
||||
)
|
||||
|
||||
/**
|
||||
* @api {get} /org/:orgId/prices Get prices nearest in time or by currency
|
||||
* @apiVersion 1.0.0
|
||||
* @apiName GetPrices
|
||||
* @apiGroup Price
|
||||
*
|
||||
* @apiHeader {String} Authorization HTTP Basic Auth
|
||||
* @apiHeader {String} Accept-Version ^1.0.0 semver versioning
|
||||
*
|
||||
* @apiParam {Number} nearestDate Milliseconds since epoch
|
||||
* @apiParam {String} currency Currency code
|
||||
*
|
||||
* @apiSuccess {String} id Id of the Price.
|
||||
* @apiSuccess {String} orgId Id of the Org.
|
||||
* @apiSuccess {String} currency Currency code.
|
||||
* @apiSuccess {Date} date Date of the Price.
|
||||
* @apiSuccess {Date} inserted Date when Price was posted.
|
||||
* @apiSuccess {Date} updated Date when Price was updated.
|
||||
* @apiSuccess {Number} price Price of currency measured in native Org currency.
|
||||
*
|
||||
* @apiSuccessExample Success-Response:
|
||||
* HTTP/1.1 200 OK
|
||||
* [
|
||||
* {
|
||||
* "id": "11111111111111111111111111111111",
|
||||
* "orgId": "11111111111111111111111111111111",
|
||||
* "currency": "EUR",
|
||||
* "date": "2018-09-11T18:05:04.420Z",
|
||||
* "inserted": "2018-09-11T18:05:04.420Z",
|
||||
* "updated": "2018-09-11T18:05:04.420Z",
|
||||
* "price": 1.16
|
||||
* }
|
||||
* ]
|
||||
*
|
||||
* @apiUse NotAuthorizedError
|
||||
* @apiUse InternalServerError
|
||||
*/
|
||||
func GetPrices(w rest.ResponseWriter, r *rest.Request) {
|
||||
user := r.Env["USER"].(*types.User)
|
||||
orgId := r.PathParam("orgId")
|
||||
|
||||
// TODO how do we make date an optional parameter
|
||||
// instead of resorting to this hack?
|
||||
nearestDate := time.Date(2100, time.January, 1, 0, 0, 0, 0, time.UTC)
|
||||
|
||||
nearestDateParam := r.URL.Query().Get("nearestDate")
|
||||
currencyParam := r.URL.Query().Get("currency")
|
||||
|
||||
// If currency was specified, get all prices for that currency
|
||||
if currencyParam != "" {
|
||||
prices, err := model.Instance.GetPricesByCurrency(orgId, currencyParam, user.Id)
|
||||
|
||||
if err != nil {
|
||||
rest.Error(w, err.Error(), http.StatusInternalServerError)
|
||||
return
|
||||
}
|
||||
|
||||
w.WriteJson(prices)
|
||||
return
|
||||
}
|
||||
|
||||
if nearestDateParam != "" {
|
||||
nearestDateParamNumeric, err := strconv.ParseInt(nearestDateParam, 10, 64)
|
||||
|
||||
if err != nil {
|
||||
rest.Error(w, "invalid date", 400)
|
||||
return
|
||||
}
|
||||
nearestDate = time.Unix(0, nearestDateParamNumeric*1000000)
|
||||
}
|
||||
|
||||
// Get prices nearest in time
|
||||
prices, err := model.Instance.GetPricesNearestInTime(orgId, nearestDate, user.Id)
|
||||
|
||||
if err != nil {
|
||||
rest.Error(w, err.Error(), http.StatusInternalServerError)
|
||||
return
|
||||
}
|
||||
|
||||
w.WriteJson(prices)
|
||||
}
|
||||
|
||||
/**
|
||||
* @api {post} /orgs/:orgId/prices Create a new Price
|
||||
* @apiVersion 1.0.0
|
||||
* @apiName PostPrice
|
||||
* @apiGroup Price
|
||||
*
|
||||
* @apiHeader {String} Authorization HTTP Basic Auth
|
||||
* @apiHeader {String} Accept-Version ^1.0.0 semver versioning
|
||||
*
|
||||
* @apiParam {String} id Id 32 character hex string.
|
||||
* @apiParam {String} orgId Id of the Org.
|
||||
* @apiParam {String} currency Currency code.
|
||||
* @apiParam {Date} date Date of the Price.
|
||||
* @apiParam {Number} price Price of currency measured in native Org currency.
|
||||
*
|
||||
* @apiSuccess {String} id Id of the Price.
|
||||
* @apiSuccess {String} orgId Id of the Org.
|
||||
* @apiSuccess {String} currency Currency code.
|
||||
* @apiSuccess {Date} date Date of the Price.
|
||||
* @apiSuccess {Date} inserted Date when Price was posted.
|
||||
* @apiSuccess {Date} updated Date when Price was updated.
|
||||
* @apiSuccess {Number} price Price of currency measured in native Org currency.
|
||||
*
|
||||
* @apiSuccessExample Success-Response:
|
||||
* HTTP/1.1 200 OK
|
||||
* {
|
||||
* "id": "11111111111111111111111111111111",
|
||||
* "orgId": "11111111111111111111111111111111",
|
||||
* "currency": "EUR",
|
||||
* "date": "2018-09-11T18:05:04.420Z",
|
||||
* "inserted": "2018-09-11T18:05:04.420Z",
|
||||
* "updated": "2018-09-11T18:05:04.420Z",
|
||||
* "price": 1.16
|
||||
* }
|
||||
*
|
||||
* @apiUse NotAuthorizedError
|
||||
* @apiUse InternalServerError
|
||||
*/
|
||||
func PostPrice(w rest.ResponseWriter, r *rest.Request) {
|
||||
user := r.Env["USER"].(*types.User)
|
||||
orgId := r.PathParam("orgId")
|
||||
|
||||
price := types.Price{}
|
||||
|
||||
err := r.DecodeJsonPayload(&price)
|
||||
|
||||
if err != nil {
|
||||
rest.Error(w, err.Error(), http.StatusInternalServerError)
|
||||
return
|
||||
}
|
||||
|
||||
price.OrgId = orgId
|
||||
err = model.Instance.CreatePrice(&price, user.Id)
|
||||
|
||||
if err != nil {
|
||||
rest.Error(w, err.Error(), http.StatusInternalServerError)
|
||||
return
|
||||
}
|
||||
|
||||
w.WriteJson(&price)
|
||||
}
|
||||
|
||||
/**
|
||||
* @api {delete} /orgs/:orgId/prices/:priceId Delete a Price
|
||||
* @apiVersion 1.0.0
|
||||
* @apiName DeletePrice
|
||||
* @apiGroup Price
|
||||
*
|
||||
* @apiHeader {String} Authorization HTTP Basic Auth
|
||||
* @apiHeader {String} Accept-Version ^1.0.0 semver versioning
|
||||
*
|
||||
* @apiSuccessExample Success-Response:
|
||||
* HTTP/1.1 200 OK
|
||||
*
|
||||
* @apiUse NotAuthorizedError
|
||||
* @apiUse InternalServerError
|
||||
*/
|
||||
func DeletePrice(w rest.ResponseWriter, r *rest.Request) {
|
||||
user := r.Env["USER"].(*types.User)
|
||||
priceId := r.PathParam("priceId")
|
||||
|
||||
err := model.Instance.DeletePrice(priceId, user.Id)
|
||||
|
||||
if err != nil {
|
||||
rest.Error(w, err.Error(), http.StatusInternalServerError)
|
||||
return
|
||||
}
|
||||
|
||||
w.WriteHeader(http.StatusOK)
|
||||
}
|
||||
Reference in New Issue
Block a user