80 lines
2.5 KiB
Go
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,
|
|
})
|
|
}
|
|
}
|