Files
syketagCompliance/cmd/server/lanes.go
T
2026-05-12 15:40:22 -06:00

80 lines
2.5 KiB
Go

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,
})
}
}