333 lines
11 KiB
Go
333 lines
11 KiB
Go
package support
|
|
|
|
import (
|
|
"context"
|
|
"encoding/json"
|
|
"errors"
|
|
"fmt"
|
|
"io/ioutil"
|
|
"net/http"
|
|
"time"
|
|
|
|
"github.com/FrankenBotDev/FrankenAPI/ent"
|
|
"github.com/FrankenBotDev/FrankenAPI/ent/support"
|
|
"github.com/FrankenBotDev/FrankenAPI/ent/supportresponse"
|
|
"github.com/FrankenBotDev/FrankenAPI/pkg/routes/logger"
|
|
"github.com/FrankenBotDev/FrankenAPI/pkg/sys"
|
|
"github.com/go-chi/chi/v5"
|
|
)
|
|
|
|
// TODO: error handle route properly
|
|
func SupportRouter() http.Handler {
|
|
r := chi.NewRouter()
|
|
|
|
r.Get("/", getTicket)
|
|
r.Get("/search", getTicketByID)
|
|
r.Post("/", openTicket)
|
|
r.Put("/", updateTicket)
|
|
r.Delete("/", deleteTicket)
|
|
r.Post("/message", writetMessage)
|
|
r.Get("/message", getMessages)
|
|
r.Get("/message/unread", getUnreadMessages)
|
|
return r
|
|
}
|
|
|
|
func getTicket(w http.ResponseWriter, r *http.Request) {
|
|
ticketQuery := r.URL.Query()
|
|
|
|
if ticketQuery.Get("serverid") != "" {
|
|
ticket, err := r.Context().Value(sys.EntClientKey).(*ent.Client).Support.Query().
|
|
Where(support.Serverid(ticketQuery.Get("serverid")), support.Not(support.Status("closed"))).
|
|
All(r.Context().Value(sys.ContextClientKey).(context.Context))
|
|
if err != nil {
|
|
sys.ErrorJsonResponse(w, "could_not_get_user", errors.New("requested user could not be fetched from the database"))
|
|
}
|
|
|
|
sys.SuccessJsonResponse(w, ticket)
|
|
} else {
|
|
sys.ErrorJsonResponse(w, "missing_param", errors.New("serverid needs to be set"))
|
|
}
|
|
}
|
|
|
|
func getTicketByID(w http.ResponseWriter, r *http.Request) {
|
|
ticketQuery := r.URL.Query()
|
|
|
|
if ticketQuery.Get("serverid") != "" {
|
|
if ticketQuery.Get("refid") != "" {
|
|
|
|
// replace with actual api data
|
|
ticket, err := r.Context().Value(sys.EntClientKey).(*ent.Client).Support.Query().
|
|
Where(support.Serverid(ticketQuery.Get("serverid")), support.Refid(ticketQuery.Get("refid"))).
|
|
All(r.Context().Value(sys.ContextClientKey).(context.Context))
|
|
if err != nil {
|
|
sys.ErrorJsonResponse(w, "could_not_get_user", errors.New("requested user could not be fetched from the database"))
|
|
}
|
|
|
|
sys.SuccessJsonResponse(w, ticket)
|
|
|
|
} else {
|
|
sys.ErrorJsonResponse(w, "missing_param", errors.New("refid needs to be set"))
|
|
}
|
|
} else {
|
|
sys.ErrorJsonResponse(w, "missing_param", errors.New("serverid needs to be set"))
|
|
}
|
|
}
|
|
|
|
func openTicket(w http.ResponseWriter, r *http.Request) {
|
|
// daten fetchen
|
|
ticketData, err := ioutil.ReadAll(r.Body)
|
|
if err != nil {
|
|
sys.ErrorJsonResponse(w, "could_not_find_data_in_request", errors.New("the request appears to be empty"))
|
|
}
|
|
|
|
// proccess data
|
|
ticketJson := make(map[string]any)
|
|
err = json.Unmarshal(ticketData, &ticketJson)
|
|
if err != nil {
|
|
sys.ErrorJsonResponse(w, "could_not_proccess_data", errors.New("request data could not be proccessed"))
|
|
}
|
|
|
|
devRefid := sys.RandStringRunes(16)
|
|
|
|
if serveridStr, ok := ticketJson["serverid"].(string); ok {
|
|
if devRefid != "" {
|
|
if titleStr, ok := ticketJson["title"].(string); ok {
|
|
if descStr, ok := ticketJson["description"].(string); ok {
|
|
if creatorStr, ok := ticketJson["creator"].(string); ok {
|
|
// replace with actual api data
|
|
err := r.Context().Value(sys.EntClientKey).(*ent.Client).Support.Create().
|
|
SetServerid(serveridStr).
|
|
SetRefid(devRefid).
|
|
SetStatus("open").
|
|
SetTitle(titleStr).
|
|
SetDescription(descStr).
|
|
SetCreator(creatorStr).
|
|
Exec(r.Context().Value(sys.ContextClientKey).(context.Context))
|
|
if err != nil {
|
|
sys.ErrorJsonResponse(w, "could_not_get_user", errors.New("requested user could not be fetched from the database"))
|
|
}
|
|
|
|
logger.Logtodb([]string{
|
|
creatorStr,
|
|
"Opened Support Ticket with RefiD: " + devRefid,
|
|
"Support Ticket Open",
|
|
serveridStr,
|
|
}, r.Context().Value(sys.EntClientKey).(*ent.Client), r.Context().Value(sys.ContextClientKey).(context.Context))
|
|
|
|
sys.SuccessJsonResponse(w, "ticket_created")
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
func updateTicket(w http.ResponseWriter, r *http.Request) {
|
|
// daten fetchen
|
|
ticketData, err := ioutil.ReadAll(r.Body)
|
|
if err != nil {
|
|
sys.ErrorJsonResponse(w, "could_not_find_data_in_request", errors.New("the request appears to be empty"))
|
|
}
|
|
|
|
// proccess data
|
|
ticketJson := make(map[string]any)
|
|
err = json.Unmarshal(ticketData, &ticketJson)
|
|
if err != nil {
|
|
sys.ErrorJsonResponse(w, "could_not_proccess_data", errors.New("request data could not be proccessed"))
|
|
}
|
|
|
|
fmt.Println(ticketJson)
|
|
|
|
if commiteridStr, ok := ticketJson["commiterid"].(string); ok {
|
|
fmt.Println(0)
|
|
if serveridStr, ok := ticketJson["serverid"].(string); ok {
|
|
fmt.Println(1)
|
|
if refidStr, ok := ticketJson["refid"].(string); ok {
|
|
fmt.Println(2)
|
|
if statusStr, ok := ticketJson["status"].(string); ok {
|
|
fmt.Println(3)
|
|
if titleStr, ok := ticketJson["title"].(string); ok {
|
|
fmt.Println(4)
|
|
if descStr, ok := ticketJson["description"].(string); ok {
|
|
fmt.Println(5)
|
|
if creatorStr, ok := ticketJson["creator"].(string); ok {
|
|
fmt.Println(6)
|
|
// replace with actual api data
|
|
err := r.Context().Value(sys.EntClientKey).(*ent.Client).Support.Update().
|
|
Where(support.Refid(refidStr), support.Serverid(serveridStr)).
|
|
SetServerid(serveridStr).
|
|
SetRefid(refidStr).
|
|
SetStatus(statusStr).
|
|
SetTitle(titleStr).
|
|
SetDescription(descStr).
|
|
SetCreator(creatorStr).
|
|
Exec(r.Context().Value(sys.ContextClientKey).(context.Context))
|
|
if err != nil {
|
|
sys.ErrorJsonResponse(w, "could_not_get_user", errors.New("requested user could not be fetched from the database"))
|
|
}
|
|
|
|
logger.Logtodb([]string{
|
|
commiteridStr,
|
|
"Updated Support Ticket with RefiD: " + refidStr,
|
|
"Support Ticket Update",
|
|
serveridStr,
|
|
}, r.Context().Value(sys.EntClientKey).(*ent.Client), r.Context().Value(sys.ContextClientKey).(context.Context))
|
|
sys.SuccessJsonResponse(w, "ticket_created")
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
func deleteTicket(w http.ResponseWriter, r *http.Request) {
|
|
// daten fetchen
|
|
ticketData, err := ioutil.ReadAll(r.Body)
|
|
if err != nil {
|
|
sys.ErrorJsonResponse(w, "could_not_find_data_in_request", errors.New("the request appears to be empty"))
|
|
}
|
|
|
|
// proccess data
|
|
ticketJson := make(map[string]any)
|
|
err = json.Unmarshal(ticketData, &ticketJson)
|
|
if err != nil {
|
|
sys.ErrorJsonResponse(w, "could_not_proccess_data", errors.New("request data could not be proccessed"))
|
|
}
|
|
|
|
if commiteridStr, ok := ticketJson["commiterid"].(string); ok {
|
|
if serveridStr, ok := ticketJson["serverid"].(string); ok {
|
|
if refidStr, ok := ticketJson["refid"].(string); ok {
|
|
// replace with actual api data
|
|
_, err := r.Context().Value(sys.EntClientKey).(*ent.Client).Support.Delete().
|
|
Where(support.Serverid(serveridStr), support.Refid(refidStr)).
|
|
Exec(r.Context().Value(sys.ContextClientKey).(context.Context))
|
|
if err != nil {
|
|
sys.ErrorJsonResponse(w, "could_not_get_user", errors.New("requested user could not be fetched from the database"))
|
|
}
|
|
|
|
logger.Logtodb([]string{
|
|
commiteridStr,
|
|
"Removed Support Ticket with RefiD: " + refidStr,
|
|
"Support Ticket Remove",
|
|
serveridStr,
|
|
}, r.Context().Value(sys.EntClientKey).(*ent.Client), r.Context().Value(sys.ContextClientKey).(context.Context))
|
|
sys.SuccessJsonResponse(w, "ticket_created")
|
|
|
|
sys.SuccessJsonResponse(w, "ticket_created")
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
func getMessages(w http.ResponseWriter, r *http.Request) {
|
|
tickerResponseQuery := r.URL.Query()
|
|
|
|
if tickerResponseQuery.Get("refid") != "" {
|
|
if tickerResponseQuery.Get("commiterid") != "" {
|
|
replies, err := r.Context().Value(sys.EntClientKey).(*ent.Client).SupportResponse.Query().
|
|
Where(supportresponse.Refid(tickerResponseQuery.Get("refid"))).
|
|
All(r.Context().Value(sys.ContextClientKey).(context.Context))
|
|
|
|
if err != nil {
|
|
sys.ErrorJsonResponse(w, "database_error", errors.New("could not get responses from database"))
|
|
}
|
|
|
|
sys.SuccessJsonResponse(w, replies)
|
|
} else {
|
|
sys.ErrorJsonResponse(w, "missing_params", errors.New("commiterid needs to be set"))
|
|
}
|
|
} else {
|
|
sys.ErrorJsonResponse(w, "missing_params", errors.New("refid needs to be set"))
|
|
}
|
|
}
|
|
|
|
func getUnreadMessages(w http.ResponseWriter, r *http.Request) {
|
|
tickerResponseQuery := r.URL.Query()
|
|
|
|
if tickerResponseQuery.Get("refid") != "" {
|
|
if tickerResponseQuery.Get("commiterid") != "" {
|
|
replies, err := r.Context().Value(sys.EntClientKey).(*ent.Client).SupportResponse.Query().
|
|
Where(supportresponse.Refid(tickerResponseQuery.Get("refid")), supportresponse.Not(supportresponse.Isread(false))).
|
|
All(r.Context().Value(sys.ContextClientKey).(context.Context))
|
|
|
|
if err != nil {
|
|
sys.ErrorJsonResponse(w, "database_error", errors.New("could not get responses from database"))
|
|
}
|
|
|
|
sys.SuccessJsonResponse(w, replies)
|
|
} else {
|
|
sys.ErrorJsonResponse(w, "missing_params", errors.New("commiterid needs to be set"))
|
|
}
|
|
} else {
|
|
sys.ErrorJsonResponse(w, "missing_params", errors.New("refid needs to be set"))
|
|
}
|
|
}
|
|
|
|
func writetMessage(w http.ResponseWriter, r *http.Request) {
|
|
// fetch data
|
|
ticketResponseJson := make(map[string]any)
|
|
ticketResponseData, err := ioutil.ReadAll(r.Body)
|
|
if err != nil {
|
|
http.Error(w, `"type":"error", "code":"could_not_find_data_in_request"`, http.StatusInternalServerError)
|
|
return
|
|
}
|
|
|
|
// process data
|
|
err = json.Unmarshal(ticketResponseData, &ticketResponseJson)
|
|
if err != nil {
|
|
http.Error(w, `{"type":"error", "code":"could_not_proccess_data"}`, http.StatusInternalServerError)
|
|
return
|
|
}
|
|
if refidStr, ok := ticketResponseJson["refid"].(string); ok {
|
|
fmt.Println(0)
|
|
if messageStr, ok := ticketResponseJson["message"].(string); ok {
|
|
fmt.Println(1)
|
|
if rtcChannelStr, ok := ticketResponseJson["rtcchannel"].(string); ok {
|
|
fmt.Println(2)
|
|
if writerStr, ok := ticketResponseJson["writer"].(string); ok {
|
|
fmt.Println(3)
|
|
if isReadBool, ok := ticketResponseJson["isread"].(bool); ok {
|
|
fmt.Println(4)
|
|
if typeStr, ok := ticketResponseJson["type"].(string); ok {
|
|
fmt.Println(5)
|
|
err := r.Context().Value(sys.EntClientKey).(*ent.Client).SupportResponse.Create().
|
|
SetRefid(refidStr).
|
|
SetMessage(messageStr).
|
|
SetRtcchannel(rtcChannelStr).
|
|
SetWriter(writerStr).
|
|
SetIsread(isReadBool).
|
|
SetType(typeStr).
|
|
SetCreated(time.Now()).
|
|
Exec(r.Context().Value(sys.ContextClientKey).(context.Context))
|
|
|
|
if err != nil {
|
|
fmt.Println(err)
|
|
sys.ErrorJsonResponse(w, "database_error", errors.New("could not post to database"))
|
|
}
|
|
} else {
|
|
sys.ErrorJsonResponse(w, "missing_param", errors.New("type needs to be set"))
|
|
}
|
|
} else {
|
|
sys.ErrorJsonResponse(w, "missing_param", errors.New("isread needs to be set"))
|
|
}
|
|
} else {
|
|
sys.ErrorJsonResponse(w, "missing_param", errors.New("writer need sto e set"))
|
|
}
|
|
} else {
|
|
sys.ErrorJsonResponse(w, "missing_param", errors.New("rtcchannel needs to be set"))
|
|
}
|
|
} else {
|
|
sys.ErrorJsonResponse(w, "missing_param", errors.New("message needs to be set"))
|
|
}
|
|
} else {
|
|
sys.ErrorJsonResponse(w, "missing_param", errors.New("refid needs to be set"))
|
|
}
|
|
}
|
|
|
|
/* =====================================================
|
|
Websocket Code
|
|
===================================================== */
|
|
// TODO: move code to this route
|