Initial commit
This commit is contained in:
@@ -0,0 +1,79 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"net/http"
|
||||
|
||||
"go.mongodb.org/mongo-driver/v2/bson"
|
||||
|
||||
"logjensticks/internal/auth"
|
||||
"logjensticks/internal/db"
|
||||
)
|
||||
|
||||
type createLaneRequest struct {
|
||||
LaneID *string `json:"lane_id"`
|
||||
PickupState *string `json:"pickup_state"`
|
||||
DropoffState *string `json:"dropoff_state"`
|
||||
PickupAddress *string `json:"pickup_address"`
|
||||
DropoffAddress *string `json:"dropoff_address"`
|
||||
}
|
||||
|
||||
func handleCreateLane(dbc *db.Client) http.HandlerFunc {
|
||||
return func(w http.ResponseWriter, r *http.Request) {
|
||||
session := auth.SessionFromContext(r.Context())
|
||||
if session.Role != "broker" {
|
||||
writeError(w, http.StatusForbidden, "FORBIDDEN", "brokers only")
|
||||
return
|
||||
}
|
||||
|
||||
var req createLaneRequest
|
||||
if err := json.NewDecoder(r.Body).Decode(&req); err != nil {
|
||||
writeError(w, http.StatusBadRequest, "BAD_REQUEST", "invalid request body")
|
||||
return
|
||||
}
|
||||
|
||||
hasLaneID := req.LaneID != nil && *req.LaneID != ""
|
||||
hasStates := req.PickupState != nil && *req.PickupState != "" &&
|
||||
req.DropoffState != nil && *req.DropoffState != ""
|
||||
hasAddresses := req.PickupAddress != nil && *req.PickupAddress != "" &&
|
||||
req.DropoffAddress != nil && *req.DropoffAddress != ""
|
||||
|
||||
if !hasLaneID && !hasStates && !hasAddresses {
|
||||
writeError(w, http.StatusBadRequest, "VALIDATION_ERROR",
|
||||
"provide at least a lane ID, both state codes, or both addresses")
|
||||
return
|
||||
}
|
||||
|
||||
var creatingUser struct {
|
||||
ID bson.ObjectID `bson:"_id"`
|
||||
}
|
||||
err := dbc.Users().FindOne(r.Context(),
|
||||
bson.D{{Key: "username", Value: session.Username}},
|
||||
).Decode(&creatingUser)
|
||||
if err != nil {
|
||||
writeError(w, http.StatusInternalServerError, "SERVER_ERROR", "failed to resolve user")
|
||||
return
|
||||
}
|
||||
|
||||
doc := bson.D{
|
||||
{Key: "lane_id", Value: req.LaneID},
|
||||
{Key: "pickup_state", Value: req.PickupState},
|
||||
{Key: "dropoff_state", Value: req.DropoffState},
|
||||
{Key: "pickup_address", Value: req.PickupAddress},
|
||||
{Key: "dropoff_address", Value: req.DropoffAddress},
|
||||
{Key: "bidding_carriers", Value: bson.A{}},
|
||||
{Key: "created_by", Value: session.Username},
|
||||
{Key: "created_by_id", Value: creatingUser.ID},
|
||||
}
|
||||
|
||||
result, err := dbc.Lanes().InsertOne(r.Context(), doc)
|
||||
if err != nil {
|
||||
writeError(w, http.StatusInternalServerError, "SERVER_ERROR", "failed to create lane")
|
||||
return
|
||||
}
|
||||
|
||||
writeSuccess(w, http.StatusCreated, map[string]any{
|
||||
"id": result.InsertedID,
|
||||
})
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user