You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
113 lines
2.9 KiB
113 lines
2.9 KiB
package widgets
|
|
|
|
import (
|
|
"context"
|
|
"encoding/json"
|
|
"fmt"
|
|
"net/http"
|
|
"strconv"
|
|
|
|
"github.com/jacobmveber-01839764/BudgetBuddy/db"
|
|
"github.com/jacobmveber-01839764/BudgetBuddy/money"
|
|
"go.mongodb.org/mongo-driver/bson"
|
|
"go.mongodb.org/mongo-driver/bson/primitive"
|
|
"go.mongodb.org/mongo-driver/mongo/options"
|
|
)
|
|
|
|
// TODO: Put user info fetching code into middleware
|
|
|
|
type GetBalanceResponse struct {
|
|
Status int `json:"status"`
|
|
Balance money.Money `json:"balance"`
|
|
}
|
|
|
|
func GetBalance(w http.ResponseWriter, r *http.Request) {
|
|
// get session key from request
|
|
session := r.Header.Get("x-session-key")
|
|
|
|
// get collection handle from db
|
|
var userCollection = db.Client.Database("budgetbuddy").Collection("users")
|
|
|
|
var user = db.UserSchema{}
|
|
|
|
err := userCollection.FindOne(context.Background(), bson.D{primitive.E{Key: "session", Value: session}}).Decode(&user)
|
|
if err != nil {
|
|
w.WriteHeader(http.StatusUnauthorized)
|
|
fmt.Fprintf(w, "{\"error\":\"invalid session key\"}")
|
|
return
|
|
}
|
|
|
|
response := GetBalanceResponse{
|
|
Status: 200,
|
|
Balance: money.Money{
|
|
Currency: user.Balance.Currency,
|
|
Whole: user.Balance.Whole,
|
|
Decimal: user.Balance.Decimal,
|
|
},
|
|
}
|
|
ret, err := json.Marshal(response)
|
|
if err != nil {
|
|
w.WriteHeader(http.StatusInternalServerError)
|
|
fmt.Fprintf(w, "{\"error\":\"problem marshalling response\"}")
|
|
return
|
|
}
|
|
|
|
w.Write(ret)
|
|
}
|
|
|
|
func SetBalance(w http.ResponseWriter, r *http.Request) {
|
|
// get session key from request
|
|
session := r.Header.Get("x-session-key")
|
|
|
|
// get form values
|
|
r.ParseForm()
|
|
newWhole, err := strconv.Atoi(r.Form.Get("whole"))
|
|
if err != nil {
|
|
w.WriteHeader(http.StatusBadRequest)
|
|
fmt.Fprintf(w, "{\"error\":\"incorrect whole value\"}")
|
|
return
|
|
}
|
|
newDecimal, err := strconv.Atoi(r.Form.Get("decimal"))
|
|
if err != nil || newDecimal < 0 || newDecimal > 99 {
|
|
w.WriteHeader(http.StatusBadRequest)
|
|
fmt.Fprintf(w, "{\"error\":\"incorrect decimal value\"}")
|
|
return
|
|
}
|
|
// TODO: figure out how to efficiently determing currency
|
|
newBalance := money.Money{
|
|
Currency: "USD",
|
|
Whole: newWhole,
|
|
Decimal: newDecimal,
|
|
}
|
|
|
|
// get collection handle from db
|
|
var userCollection = db.Client.Database("budgetbuddy").Collection("users")
|
|
|
|
filter := bson.D{primitive.E{Key: "session", Value: session}}
|
|
opts := options.Update().SetUpsert(true)
|
|
update := bson.D{primitive.E{Key: "$set", Value: bson.D{primitive.E{Key: "balance", Value: newBalance}}}}
|
|
_, err = userCollection.UpdateOne(context.TODO(), filter, update, opts)
|
|
if err != nil {
|
|
w.WriteHeader(http.StatusUnauthorized)
|
|
fmt.Fprintf(w, "{\"error\":\"invalid session key\"}")
|
|
return
|
|
}
|
|
|
|
response := GetBalanceResponse{
|
|
Status: 200,
|
|
Balance: money.Money{
|
|
Currency: newBalance.Currency,
|
|
Whole: newBalance.Whole,
|
|
Decimal: newBalance.Decimal,
|
|
},
|
|
}
|
|
ret, err := json.Marshal(response)
|
|
if err != nil {
|
|
w.WriteHeader(http.StatusInternalServerError)
|
|
fmt.Fprintf(w, "{\"error\":\"problem marshalling response\"}")
|
|
return
|
|
}
|
|
|
|
w.Write(ret)
|
|
}
|