package icshttp import ( "batchmodule/icsconf" "batchmodule/icserror" "batchmodule/icslog" "bytes" "crypto/tls" "encoding/json" "fmt" "io" "log" "net/http" "strconv" "strings" "time" "github.com/gorilla/websocket" ) var ( conf icsconf.AppInfo l *log.Logger ) func init() { conf = icsconf.Getconfig() l = icslog.InitializeLogger() } type TAInfoJSON struct { Cmd string `json:"cmd"` ConnId string `json:"connId"` Tel string `json:"tel"` Ext string `json:"ext"` EmpId string `json:"empId"` DateTime string `json:"dateTime"` CallStartTime string `json:"callStartTime"` Index string `json:"index"` Stt string `json:"stt"` Dir string `json:"dir"` IoGbn string `json:"ioGbn"` } type FailedList struct { No int `json:"no"` ConnId string `json:"connid"` Ext string `json:"ext"` StartTime string `json:"starttime"` } type FailedDataListReqBody struct { StartTime string `json:"starttime"` Ext string `json:"ext"` ConnId string `json:"connid"` } type FailedDataListResBody struct { TotalCnt string `json:"totalCnt"` ReturnCode string `json:"returnCode"` ReturnMsg string `json:"returnMsg"` List []FailedList `json:"list"` } type FailedDataVoiceResBody struct { VoiceFile string `json:"voiceFile"` ReturnCode string `json:"returnCode"` ReturnMsg string `json:"returnMsg"` } type IcsHttpClient struct { Method string URL string Request *http.Request http.Client } type TAResp struct { Success bool `json:"success"` ReturnCode string `json:"returnCode"` Message string `json:"message"` } type NockChiReqBody struct { Uid string `json:"uid"` Ext string `json:"ext"` SpeakerTag string `json:"speackertag"` Transcripts string `json:"transcripts"` } func NewIcsHttpClient(method, url string, body io.Reader) *IcsHttpClient { c := &IcsHttpClient{Method: method, URL: url} r, err := http.NewRequest(method, url, body) if err != nil { l.Println("HTTP Client error while http.NewRequest(). error: ", err) return nil } c.Request = r c.SetTimeout(time.Millisecond * 1000 * 5) return c } func (c *IcsHttpClient) SetTimeout(timeout time.Duration) { c.Timeout = timeout } func HttpRequest(url, method, requestBody string) (*http.Response, error) { // TLS 설정 tr := &http.Transport{ TLSClientConfig: &tls.Config{InsecureSkipVerify: true}, // 인증서 검증 비활성화 } client := &http.Client{Transport: tr} // client := &http.Client{} payload := strings.NewReader(requestBody) req, _ := http.NewRequest(method, url, payload) req.Header.Set("Content-Type", "application/json") // 요청 res, err := client.Do(req) if err != nil { return nil, fmt.Errorf("요청 오류: %w", err) } if res.StatusCode != http.StatusOK { return nil, fmt.Errorf("error: received non-200 response status: %s", res.Status) } return res, nil } func PostReqForFailedDataList() (response *FailedDataListResBody, cerr *icserror.IcsError) { url := conf.Urls.FailedDataListUrl currentDate := time.Now().Format("20060102") currentDateUint64, _ := strconv.ParseUint(currentDate, 10, 64) starttime := currentDateUint64 - 1 starttimeStr := strconv.FormatUint(starttime, 10) body := FailedDataListReqBody{ StartTime: starttimeStr, Ext: "", ConnId: "", } jsonBody, err := json.Marshal(body) if err != nil { return nil, icserror.ICSERRMarshal } reqBody := bytes.NewBuffer(jsonBody) l.Printf("client.go>PostReqForFailedDataList()> url: %s, reqBody: %+v", url, reqBody.String()) client := NewIcsHttpClient("POST", url, reqBody) if client == nil { return nil, icserror.ICSERRHTTPClientCreate } client.Request.Header.Add("Content-Type", "application/json;charset=utf-8") client.Request.Header.Add("Accept", "application/json") l.Printf("Error at client.go>PostReqForFailedDataList()> client.Request: %+v", client) resp, err := client.Do(client.Request) if err != nil { l.Printf("Err at client.go>PostReqForFailedDataList()> client.Do failed. resp: %+v", resp) l.Printf("The err: %+v", err) return nil, icserror.ICSERRHTTPClientExcecution } l.Printf("client.go>PostReqForFailedDataList()> resp: %+v", resp) resBody, err := io.ReadAll(resp.Body) if err != nil { l.Printf("client.go>PostReqForFailedDataList()> ReadAll err: %+v", err) return nil, icserror.ICSERRRead } defer resp.Body.Close() if err := json.Unmarshal(resBody, &response); err != nil { l.Printf("Error at client.go>PostReqForFailedDataList()> Unmarshal err: %+v", err) return nil, icserror.ICSERRUnmarshal } if strings.Contains(response.ReturnCode, "9999") { l.Printf("Error at client.go>PostReqForFailedDataList()> response returnCode is 9999 with the message: %s", response.ReturnMsg) return nil, icserror.ICSERRHTTPClientResponseFail } return response, nil } func PostReqForEachVoiceFile(reqDataForVoiceFile FailedDataListReqBody) (response *FailedDataVoiceResBody, cerr *icserror.IcsError) { url := conf.Urls.FailedDataListUrl jsonBody, err := json.Marshal(reqDataForVoiceFile) if err != nil { return nil, icserror.ICSERRMarshal } reqBody := bytes.NewBuffer(jsonBody) l.Printf("client.go>PostReqForEachVoiceFile()> url: %s, reqBody: %+v", url, reqBody.String()) client := NewIcsHttpClient("POST", url, reqBody) if client == nil { return nil, icserror.ICSERRHTTPClientCreate } client.Request.Header.Add("Content-Type", "application/json;charset=utf-8") client.Request.Header.Add("Accept", "application/json") l.Printf("Error at client.go>PostReqForEachVoiceFile()> client.Request: %+v", client) resp, err := client.Do(client.Request) if err != nil { l.Printf("Error at client.go>PostReqForEachVoiceFile()> client.Do failed. resp: %+v", resp) l.Printf("The err: %+v", err) return nil, icserror.ICSERRHTTPClientExcecution } l.Printf("client.go>PostReqForEachVoiceFile()> resp: %+v", resp) resBody, err := io.ReadAll(resp.Body) if err != nil { l.Printf("client.go>PostReqForEachVoiceFile()> ReadAll err: %+v", err) return nil, icserror.ICSERRRead } defer resp.Body.Close() if err := json.Unmarshal(resBody, &response); err != nil { l.Printf("Error at client.go>PostReqForEachVoiceFile()> Unmarshal err: %+v", err) return nil, icserror.ICSERRUnmarshal } if strings.Contains(response.ReturnCode, "9999") { l.Printf("Error at client.go>PostReqForEachVoiceFile()> response returnCode is 9999 with the message: %s", response.ReturnMsg) return nil, icserror.ICSERRHTTPClientResponseFail } l.Printf("client.go>PostReqForEachVoiceFile()> response: %+v", response) return response, nil } func SendSTTResToNockChiServer(parsedRes FailedDataListReqBody, sttRes string, dir string) *icserror.IcsError { fullURL := conf.Urls.NockChiServer.BaseURL + conf.Urls.NockChiServer.EndPoint headers := http.Header{ "Origin": {conf.Urls.NockChiServer.BaseURL}, } conn, _, err := websocket.DefaultDialer.Dial(fullURL, headers) if err != nil { l.Printf("[ERR] client.go>SendSTTResToNockChiServer()> connecting websocket failed. err: %v", err) return icserror.ICSERRWEBSOCKETConnectFailError } defer conn.Close() reqData := NockChiReqBody{ Uid: parsedRes.ConnId, Ext: parsedRes.Ext, SpeakerTag: dir, Transcripts: sttRes, } jsonData, _ := json.Marshal(reqData) reqBody := fmt.Sprintf(`{"data":"%s"}`, jsonData) err = conn.WriteMessage(websocket.TextMessage, []byte(reqBody)) if err != nil { l.Println("[ERR] client.go>SendSTTResToNockChiServer()> conn.WriteMessage() failed. err: ", err) return icserror.ICSERRWEBSOCKETWriteError } l.Println("[LOG] client.go>SendSTTResToNockChiServer()> the stt result(connId: %s) was successfully sent via websocket. reqBody: %s", parsedRes.ConnId, reqBody) return nil } func PostProcessTA(url, cmd string, connId string, tel string, ext string, empId string, dateTime string, callStartTime string, index string, stt string, dir string, ioGbn string) (tAResp *TAResp, cerr *icserror.IcsError) { tAInfoJSON := TAInfoJSON{ Cmd: cmd, ConnId: connId, Tel: tel, Ext: ext, EmpId: empId, DateTime: dateTime, CallStartTime: callStartTime, Index: index, Stt: stt, Dir: dir, IoGbn: ioGbn, } b, err := json.Marshal(tAInfoJSON) if err != nil { return nil, icserror.ICSERRMarshal } body := bytes.NewBuffer(b) client := NewIcsHttpClient("POST", url, body) if client == nil { l.Printf("[ERR] client.go>PostProcessTA()> NewIcsHttpClient() failed. err: %v", err) l.Printf("[ERR] client.go>PostProcessTA()> NewIcsHttpClient() failed. url: %s, body: %s", url, body) return nil, icserror.ICSERRHTTPClientCreate } client.Request.Header.Add("Content-Type", "application/json;charset=utf-8") client.Request.Header.Add("Accept", "application/json") l.Printf("[LOG] client.go>PostProcessTA()> Post Request Body: %+v", client.Request.Body) resp, err := client.Do(client.Request) if err != nil { l.Printf("[ERR] client.go>PostProcessTA()> client.Do failed. err: %v", err) l.Printf("[ERR] client.go>PostProcessTA()> client.Do failed. resp: %v", resp) return nil, icserror.ICSERRHTTPClientPostRequest } l.Printf("[LOG] client.go>PostProcessTA()> client.Do() resp: %v", resp) resBody, err := io.ReadAll(resp.Body) if err != nil { l.Printf("[ERR] client.go>PostProcessTA()> ReadAll failed. err: %v", err) return nil, icserror.ICSERRRead } defer resp.Body.Close() if err := json.Unmarshal(resBody, &tAResp); err != nil { l.Printf("[ERR] client.go>PostProcessTA()> Unmarshal failed. err: %v", err) return nil, icserror.ICSERRUnmarshal } return tAResp, nil }