2022-09-26 22:38:13 +02:00

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