Files
mocksnow/server/handler/newSnow.go
2025-03-22 21:28:09 +11:00

130 lines
3.5 KiB
Go

package handler
import (
"database/sql"
"encoding/json"
"fmt"
"io"
"math/rand"
"mocksnow/db/queries"
"mocksnow/server/models"
"net/http"
"os"
"github.com/google/uuid"
)
// NewSnow receives data from the DMSP Snow New() function
func (h *Handler) NewSnow(w http.ResponseWriter, r *http.Request) {
var hostname string
reqBody, err := io.ReadAll(r.Body)
if err != nil {
h.Logger.Error("Invalid data received", "error", err)
fmt.Fprintf(w, "Invalid data received")
w.WriteHeader(http.StatusInternalServerError)
return
} else {
h.Logger.Debug("received input data", "length", len(reqBody))
}
// Decode the JSON body
var incident models.Incident
if err := json.Unmarshal(reqBody, &incident); err != nil {
h.Logger.Error("unable to decode json", "error", err)
http.Error(w, "Invalid JSON body", http.StatusBadRequest)
return
} else {
h.Logger.Debug("successfully decoded JSON")
prettyPrint(incident)
}
ctx := r.Context()
// 1. Insert into incoming table
params := queries.CreateIncomingParams{
IncidentNumber: nullStr(incident.IncidentNumber),
Description: nullStr(incident.Description),
ShortDescription: nullStr(incident.ShortDescription),
Urgency: nullStr(incident.Urgency),
Impact: nullStr(incident.Impact),
State: nullStr(incident.State),
ExternalID: nullStr(incident.ExternalID),
WorkNotes: nullStr(incident.WorkNotes),
AssignmentGroup: nullStr(incident.AssignmentGroup),
AssignedTo: nullStr(incident.AssignedTo),
Category: nullStr(incident.Category),
Subcategory: nullStr(incident.SubCategory),
}
h.Logger.Debug("database params", "params", params)
// Insert the new inventory record into the database
result, err := h.Database.Queries().CreateIncoming(ctx, params)
if err != nil {
h.Logger.Error("unable to perform database insert", "error", err)
w.WriteHeader(http.StatusInternalServerError)
fmt.Fprintf(w, "Error : %v\n", err)
return
} else {
h.Logger.Debug("created database record", "insert_result", result)
}
// Create record in incidents table
incidentRecord, err := h.Database.Queries().CreateIncident(ctx, incident.ExternalID)
if err != nil {
h.Logger.Error("failed to create incident", "error", err)
w.WriteHeader(http.StatusInternalServerError)
fmt.Fprintf(w, "Error : %v\n", err)
return
} else {
h.Logger.Debug("created database record", "incident_record", incidentRecord)
}
// Simulate response
ticket := fmt.Sprintf("TKT%06d", incidentRecord)
sysID := uuid.New().String()
// Produce dummy record link
hostname, err = os.Hostname()
if err != nil {
h.Logger.Error("failed to lookup hostname", "error", err)
hostname = "localhost"
}
recordLink := fmt.Sprintf("https://%s/api/now/table/incident/%s", hostname, sysID)
response := models.IncidentResponse{
ImportSet: randomImportSet(),
StagingTable: "x_dusa2_itom_inc_imp",
Result: []models.IncidentResultItem{
{
TransformMap: "Incident Import",
Table: "incident",
DisplayName: "number",
DisplayValue: ticket,
RecordLink: recordLink,
Status: "inserted",
SysID: sysID,
},
},
}
w.Header().Set("Content-Type", "application/json")
json.NewEncoder(w).Encode(response)
}
func nullStr(s string) sql.NullString {
return sql.NullString{String: s, Valid: s != ""}
}
// Helper to generate random import_set ID
func randomImportSet() string {
const letters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
b := make([]byte, 8)
for i := range b {
b[i] = letters[rand.Intn(len(letters))]
}
return string(b)
}