heruvym/service/service.go

919 lines
20 KiB
Go
Raw Normal View History

2021-04-11 09:48:15 +00:00
package service
import (
2021-05-01 12:36:22 +00:00
"context"
2021-04-11 09:48:15 +00:00
"encoding/json"
2021-05-01 12:36:22 +00:00
"errors"
2021-05-15 20:10:07 +00:00
"fmt"
2021-09-05 15:24:13 +00:00
"heruvym/dal/minio"
"heruvym/dal/mongo"
"heruvym/jwt_adapter"
"heruvym/model"
"heruvym/tools"
2021-04-11 09:48:15 +00:00
"net/http"
2021-09-05 15:24:13 +00:00
"strings"
"sync"
2022-11-02 18:52:02 +00:00
"github.com/rs/xid"
"github.com/themakers/hlog"
tb "gopkg.in/tucnak/telebot.v2"
2021-04-11 09:48:15 +00:00
)
type Heruvym struct {
logger hlog.Logger
2021-09-05 15:24:13 +00:00
dal *mongo.DAL
bs *minio.BlobStore
2022-04-14 17:43:13 +00:00
2022-11-02 18:52:02 +00:00
notifier *tb.Bot
2021-04-11 09:48:15 +00:00
}
2023-03-01 17:38:03 +00:00
func New(
blobs *minio.BlobStore,
dataAccessLayer *mongo.DAL,
log hlog.Logger,
notifier *tb.Bot) *Heruvym {
2021-04-11 09:48:15 +00:00
return &Heruvym{
2022-11-02 18:52:02 +00:00
logger: log.Module("Service"),
dal: dataAccessLayer,
bs: blobs,
notifier: notifier,
2021-04-11 09:48:15 +00:00
}
}
2021-05-01 17:50:03 +00:00
func (h Heruvym) Register(m *http.ServeMux) *http.ServeMux {
2021-04-11 09:48:15 +00:00
m.HandleFunc("/create", h.CreateTicket)
2021-05-02 22:25:12 +00:00
m.HandleFunc("/subscribe", tools.SseWrapper(h.GetList))
m.HandleFunc("/ticket", tools.SseWrapper(h.Subscribe))
m.HandleFunc("/send", tools.HandlerWrapper(h.PutMessage))
2021-05-11 10:57:58 +00:00
m.HandleFunc("/getTickets", tools.HandlerWrapper(h.GetTickets))
m.HandleFunc("/getMessages", tools.HandlerWrapper(h.GetMessages))
m.HandleFunc("/pick", tools.HandlerWrapper(h.Pick))
m.HandleFunc("/delegate", tools.HandlerWrapper(h.Delegate))
m.HandleFunc("/vote", tools.HandlerWrapper(h.Vote))
m.HandleFunc("/close", tools.HandlerWrapper(h.CloseTicket))
2021-04-11 09:48:15 +00:00
return m
}
type CreateTicketReq struct {
Title string `json:"Title"`
Message string `json:"Message"`
}
type CreateTicketResp struct {
Ticket string `json:"Ticket"`
2023-04-05 21:10:08 +00:00
Sess string `json:"sess"`
2021-04-11 09:48:15 +00:00
}
func (h *Heruvym) CreateTicket(w http.ResponseWriter, r *http.Request) {
defer func() {
if err := r.Body.Close(); err != nil {
h.logger.Emit(ErrorClose{
Err: err,
})
}
}()
2021-09-05 15:24:13 +00:00
var (
err error
2021-09-05 15:24:13 +00:00
request CreateTicketReq
)
2021-04-11 09:48:15 +00:00
if err := json.NewDecoder(r.Body).Decode(&request); err != nil {
http.Error(w, "Invalid json", http.StatusBadRequest)
return
}
if request.Title == "" {
http.Error(w, "No Title", http.StatusBadRequest)
2021-04-11 09:48:15 +00:00
return
}
if request.Message == "" {
http.Error(w, "No Message", http.StatusBadRequest)
2021-04-11 09:48:15 +00:00
return
}
ctx := r.Context()
session := jwt_adapter.Get(ctx)
if session == nil {
http.Error(w, "No session", http.StatusUnauthorized)
2021-04-11 09:48:15 +00:00
return
}
2021-09-05 15:24:13 +00:00
var (
ticketID string
tickets []model.Ticket
2023-03-01 17:38:03 +00:00
role = jwt_adapter.GetRole(ctx)
2021-04-11 09:48:15 +00:00
)
2023-03-01 17:38:03 +00:00
if role == "" {
tickets, _, err = h.dal.GetTickets4Sess(ctx, session.Id)
2021-04-11 09:48:15 +00:00
}
2021-09-05 15:24:13 +00:00
if err != nil || len(tickets) == 0 {
2022-04-14 17:43:13 +00:00
2021-09-05 15:24:13 +00:00
ticketID, err = h.dal.CreateTicket(
ctx,
2023-03-01 17:38:03 +00:00
session.Id,
session.Id,
2021-09-05 15:24:13 +00:00
request.Title,
request.Message,
[]string{},
)
if err != nil {
http.Error(w, "CannotCreateTicket", http.StatusInternalServerError)
return
}
if _, err := h.dal.PutMessage(ctx,
request.Message,
2023-03-01 17:38:03 +00:00
session.Id,
session.Id,
2021-09-05 15:24:13 +00:00
ticketID,
[]string{},
); err != nil {
http.Error(w, "CannotCreateMessage", http.StatusInternalServerError)
return
}
} else {
ticketID = tickets[0].ID
2021-04-11 09:48:15 +00:00
}
2023-04-05 21:10:08 +00:00
response, err := json.Marshal(CreateTicketResp{Ticket: ticketID, Sess: session.Id})
2021-04-11 09:48:15 +00:00
if err != nil {
h.logger.Emit(ErrorMarshal{
Err: err,
})
http.Error(w, "CannotMarshalMessage", http.StatusInternalServerError)
return
}
if _, err := w.Write(response); err != nil {
h.logger.Emit(ErrorMarshal{
Err: err,
})
return
}
}
2021-05-01 10:05:45 +00:00
2021-05-02 22:25:12 +00:00
var _ tools.DataEmitter = (&Heruvym{}).GetList
2021-05-01 10:05:45 +00:00
2021-05-01 12:36:22 +00:00
func (h *Heruvym) GetList(ctx context.Context) chan interface{} {
2021-09-05 15:24:13 +00:00
defer func() {
if rec := recover(); rec != nil {
fmt.Println(rec)
}
}()
2021-05-01 12:36:22 +00:00
sess := jwt_adapter.Get(ctx)
2021-09-05 15:24:13 +00:00
if sess == nil {
return nil
}
2021-05-01 12:36:22 +00:00
output := make(chan interface{})
2023-03-01 17:38:03 +00:00
if sess.Id == "" {
go h.unauthorizedTickets(ctx, sess.Id, output)
2021-05-01 12:36:22 +00:00
} else {
2023-03-01 17:38:03 +00:00
role := jwt_adapter.GetRole(ctx)
2021-09-05 15:24:13 +00:00
2023-03-01 17:38:03 +00:00
fmt.Println("ALL TICKETS Sess ", sess.Id, role)
2021-05-02 22:25:12 +00:00
if role == "admin" || role == "manager" {
go h.allTickets(ctx, output)
} else {
2023-03-01 17:38:03 +00:00
go h.userTickets(ctx, sess.Id, output)
2021-05-02 22:25:12 +00:00
}
2021-05-01 12:36:22 +00:00
}
return output
2021-05-01 10:05:45 +00:00
}
2021-05-01 12:36:22 +00:00
2021-05-02 22:25:12 +00:00
func (h *Heruvym) allTickets(ctx context.Context, output chan interface{}) {
2021-09-05 15:24:13 +00:00
defer func() {
if v := recover(); v != nil {
fmt.Println("AllTicketsRec", v)
}
}()
2022-04-14 17:43:13 +00:00
//data, count, err := h.dal.YieldTickets(ctx, 20)
//
//if err != nil {
// output <- errors.New("cannot get tickets:" + err.Error())
// return
//}
//
//if data != nil {
// output <- GetTicketsResp{data, count}
//}
if err := h.dal.WatchAllTickets(ctx, func(ticket model.Ticket) error {
2021-05-02 22:25:12 +00:00
output <- ticket
return nil
}); err != nil {
2021-09-05 15:24:13 +00:00
output <- errors.New("cannot watch all tickets" + err.Error())
2021-05-02 22:25:12 +00:00
}
}
func (h *Heruvym) userTickets(ctx context.Context, userID string, output chan interface{}) {
2022-02-27 15:27:44 +00:00
defer func() {
if v := recover(); v != nil {
fmt.Println("USERTICKS", v)
}
}()
2022-02-27 15:27:44 +00:00
data, count, err := h.dal.YieldUserTickets(ctx, userID, 20, 0)
2022-02-27 15:27:44 +00:00
if err != nil {
2021-09-05 15:24:13 +00:00
output <- errors.New("cannot get tickets:" + err.Error())
2021-05-15 20:10:07 +00:00
return
2021-05-02 22:25:12 +00:00
}
if data != nil {
output <- GetTicketsResp{data, count}
}
2021-05-02 22:25:12 +00:00
if err := h.dal.WatchTickets(ctx, userID, func(ticket model.Ticket) error {
output <- ticket
return nil
}); err != nil {
output <- errors.New("cannot watch tickets")
2021-05-15 20:10:07 +00:00
return
2021-05-02 22:25:12 +00:00
}
}
func (h *Heruvym) hasNoRole(output chan interface{}) {
output <- errors.New("no role in profile")
}
2021-05-01 12:36:22 +00:00
func (h *Heruvym) unauthorizedTickets(ctx context.Context, sess string, output chan interface{}) {
2021-09-05 15:24:13 +00:00
//defer close(output)
2021-05-01 12:36:22 +00:00
tickets, count, err := h.dal.GetTickets4Sess(ctx, sess)
2021-05-01 17:50:03 +00:00
if err != nil {
2021-05-01 12:36:22 +00:00
output <- errors.New("no tickets for session")
2021-09-05 15:24:13 +00:00
return
2021-05-01 12:36:22 +00:00
}
2021-09-05 15:24:13 +00:00
if tickets != nil {
output <- GetTicketsResp{tickets, count}
2021-05-01 12:36:22 +00:00
}
2021-05-01 17:50:03 +00:00
}
2021-05-02 22:25:12 +00:00
type ReqPutMessage struct {
Message string `json:"message"`
TicketID string `json:"ticket"`
Files []string `json:"files"`
Lang string `json:"lang"`
}
func (h *Heruvym) PutMessage(
ctx context.Context,
request ReqPutMessage,
) (interface{}, int) {
sess := jwt_adapter.Get(ctx)
2023-04-13 18:08:35 +00:00
fmt.Println("PUTMES", sess)
2021-05-02 22:25:12 +00:00
2021-09-05 15:24:13 +00:00
request.Files = []string{}
2021-05-02 22:25:12 +00:00
message, err := h.dal.PutMessage(
ctx,
request.Message,
2023-03-01 17:38:03 +00:00
sess.Id,
sess.Id,
2021-05-02 22:25:12 +00:00
request.TicketID,
2022-02-27 15:27:44 +00:00
[]string{},
2021-05-02 22:25:12 +00:00
)
if err != nil {
2023-04-13 18:08:35 +00:00
fmt.Println("PUTMES1", err)
2021-05-02 22:25:12 +00:00
return errors.New("can not put message"), http.StatusInternalServerError
}
2022-04-14 17:43:13 +00:00
go func() {
/*if sess.Id != "" {
additional, err := h.dal.GetAdditionalData(context.TODO(), sess.Id)
fmt.Println("CAN NOT NOTIFY", err)
2022-04-14 17:43:13 +00:00
2022-11-02 18:52:02 +00:00
if err == nil && h.notifier != nil {
2023-04-13 17:11:50 +00:00
additional, err := h.dal.GetAdditionalData(context.TODO(), sess.Id)
fmt.Println("CAN NOT NOTIFY", err)
2022-04-14 17:43:13 +00:00
if _, err := h.notifier.Send(tb.ChatID(-1001344671794),
fmt.Sprintf("Поступило новое сообщение от пользователя %d с почтой %s",
additional.Uid, additional.Email)); err != nil {
fmt.Println("CAN NOT NOTIFY", err)
}
return
}
}*/
2022-11-02 18:52:02 +00:00
if h.notifier != nil {
if _, err := h.notifier.Send(tb.ChatID(-1001802261459),
2022-11-02 18:52:02 +00:00
fmt.Sprintf(
"Поступило новое сообщение")); err != nil {
2022-11-02 18:52:02 +00:00
fmt.Println("CAN NOT NOTIFY", err)
}
2022-04-14 17:43:13 +00:00
}
}()
2021-05-02 22:25:12 +00:00
if err := h.dal.UpdateTopMessage(ctx, request.TicketID, message); err != nil {
return errors.New("can not update ticket"), http.StatusInternalServerError
}
return nil, http.StatusOK
}
2022-02-27 15:27:44 +00:00
type ReqScreenshot struct {
TicketID string `json:"ticket"`
Lang string `json:"lang"`
2022-02-27 15:27:44 +00:00
}
func (h *Heruvym) RequestScreenshot(
ctx context.Context,
request ReqScreenshot,
) (interface{}, int) {
sess := jwt_adapter.Get(ctx)
_, err := h.dal.PutSCRequest(
ctx,
2023-03-01 17:38:03 +00:00
sess.Id,
sess.Id,
2022-02-27 15:27:44 +00:00
request.TicketID,
)
if err != nil {
return errors.New("can not put message"), http.StatusInternalServerError
}
return nil, http.StatusOK
}
2021-05-02 22:25:12 +00:00
var _ tools.DataEmitter = (&Heruvym{}).Subscribe
func (h *Heruvym) Subscribe(ctx context.Context) chan interface{} {
sess := jwt_adapter.Get(ctx)
2022-02-27 15:27:44 +00:00
fmt.Println("SESS Subsc", sess)
2021-05-02 22:25:12 +00:00
2021-05-15 20:10:07 +00:00
ticketID := ctx.Value(tools.ContextURLKey).(string)
2021-05-02 22:25:12 +00:00
output := make(chan interface{})
2023-03-01 17:38:03 +00:00
if sess.Id == "" {
2021-05-02 22:25:12 +00:00
go func() {
2023-03-01 17:38:03 +00:00
ticket, err := h.dal.GetTicket4Sess(ctx, ticketID, sess.Id)
2021-05-02 22:25:12 +00:00
if err != nil || ticket == nil {
output <- errors.New("no tickets 4 session")
return
}
2023-04-14 16:34:55 +00:00
/*if err := h.dal.YieldMessages(ctx, ticketID, func(message model.Message) error {
2021-05-02 22:25:12 +00:00
output <- message
2021-09-05 15:24:13 +00:00
fmt.Println("OOOOOOLd")
2021-05-02 22:25:12 +00:00
2021-09-05 15:24:13 +00:00
//if err := h.dal.SetShown(ctx, message.ID, sess.Session); err != nil {
//
// output <- errors.New("cannot show message " + err.Error())
// return err
//}
2021-05-02 22:25:12 +00:00
return nil
}); err != nil {
2021-05-15 20:10:07 +00:00
output <- errors.New("cannot read messages " + err.Error())
2023-04-14 16:34:55 +00:00
}*/
2021-05-02 22:25:12 +00:00
if err := h.dal.WatchMessages(ctx, ticketID,
func(message model.Message) error {
output <- message
2021-09-05 15:24:13 +00:00
//if err := h.dal.SetShown(ctx, message.ID, sess.Session); err != nil {
// fmt.Println("3", err)
// output <- errors.New("cannot show watch message " + err.Error())
// return err
//}
2021-05-02 22:25:12 +00:00
return nil
}); err != nil {
2021-05-15 20:10:07 +00:00
fmt.Println("4", err)
output <- errors.New("cannot watch messages " + err.Error())
2021-05-02 22:25:12 +00:00
}
}()
} else {
2023-03-01 17:38:03 +00:00
role := jwt_adapter.GetRole(ctx)
2021-05-02 22:25:12 +00:00
if role == "admin" || role == "manager" {
go func() {
if err := h.dal.YieldMessages(ctx, ticketID, func(message model.Message) error {
output <- message
2021-09-05 15:24:13 +00:00
//if err := h.dal.SetShown(ctx, message.ID, sess.User); err != nil {
// fmt.Println("2", err)
// output <- errors.New("cannot show message " + err.Error())
// return err
//}
2021-05-02 22:25:12 +00:00
return nil
}); err != nil {
2021-05-15 20:10:07 +00:00
fmt.Println("1", err)
output <- errors.New("cannot read messages " + err.Error())
2021-05-02 22:25:12 +00:00
}
if err := h.dal.WatchMessages(ctx, ticketID,
func(message model.Message) error {
output <- message
2021-09-05 15:24:13 +00:00
//if err := h.dal.SetShown(ctx, message.ID, sess.Session); err != nil {
// fmt.Println("3", err)
// output <- errors.New("cannot show watch message " + err.Error())
// return err
//}
2021-05-02 22:25:12 +00:00
return nil
}); err != nil {
2021-05-15 20:10:07 +00:00
fmt.Println("4", err)
output <- errors.New("cannot watch messages " + err.Error())
2021-05-02 22:25:12 +00:00
}
}()
} else {
go func() {
2022-04-14 17:43:13 +00:00
defer func() {
if v := recover(); v != nil {
fmt.Println("heryvym panic", v)
}
}()
2023-03-01 17:38:03 +00:00
ticket, err := h.dal.GetTicket4User(ctx, ticketID, sess.Id)
2021-05-02 22:25:12 +00:00
if err != nil || ticket == nil {
output <- errors.New("no tickets 4 user")
}
2023-04-14 17:38:55 +00:00
/*if err := h.dal.YieldMessages(ctx, ticketID, func(message model.Message) error {
2021-05-02 22:25:12 +00:00
output <- message
2021-09-05 15:24:13 +00:00
//if err := h.dal.SetShown(ctx, message.ID, sess.User); err != nil {
// fmt.Println("2", err)
// output <- errors.New("cannot show message " + err.Error())
// return err
//}
2021-05-02 22:25:12 +00:00
return nil
}); err != nil {
2021-05-15 20:10:07 +00:00
fmt.Println("1", err)
output <- errors.New("cannot read messages " + err.Error())
2023-04-14 17:38:55 +00:00
}*/
2021-05-02 22:25:12 +00:00
if err := h.dal.WatchMessages(ctx, ticketID,
func(message model.Message) error {
output <- message
2021-09-05 15:24:13 +00:00
//if err := h.dal.SetShown(ctx, message.ID, sess.Session); err != nil {
// fmt.Println("3", err)
// output <- errors.New("cannot show watch message " + err.Error())
// return err
//}
2021-05-02 22:25:12 +00:00
return nil
}); err != nil {
2021-05-15 20:10:07 +00:00
fmt.Println("4", err)
output <- errors.New("cannot watch messages " + err.Error())
2021-05-02 22:25:12 +00:00
}
}()
}
}
return output
}
func (h *Heruvym) handleOwnMessages(output chan interface{}) {
defer close(output)
2021-05-11 10:57:58 +00:00
}
type GetTicketsReq struct {
Amount int64 `json:"amt"`
Page int64 `json:"page"`
Search string `json:"srch"`
Status string `json:"status"`
}
2022-02-27 15:27:44 +00:00
type GetTicketsResp struct {
Data []model.Ticket `json:"data"`
Count int64 `json:"count"`
2022-02-27 15:27:44 +00:00
}
2021-05-11 10:57:58 +00:00
func (h *Heruvym) GetTickets(
ctx context.Context,
2022-02-27 15:27:44 +00:00
request GetTicketsReq) (GetTicketsResp, int) {
2023-04-05 21:10:08 +00:00
role := jwt_adapter.GetRole(ctx)
if role == "admin" {
result, count, err := h.dal.GetTicketPage(ctx,
request.Status,
request.Search,
request.Amount,
request.Page,
)
if err != nil {
return GetTicketsResp{}, http.StatusNoContent
}
return GetTicketsResp{
Data: *result,
Count: count,
}, http.StatusOK
} else {
2023-04-05 21:10:08 +00:00
sess := jwt_adapter.Get(ctx)
2021-05-11 10:57:58 +00:00
2023-03-29 13:37:17 +00:00
result, count, err := h.dal.YieldUserTickets(ctx, sess.Id, request.Amount, request.Page*request.Amount)
if err != nil {
return GetTicketsResp{}, http.StatusNoContent
}
return GetTicketsResp{
2023-03-29 14:01:34 +00:00
Data: result,
Count: count,
}, http.StatusOK
}
2021-05-11 10:57:58 +00:00
}
type GetMessagesReq struct {
Amount int64 `json:"amt"`
Page int64 `json:"page"`
Search string `json:"srch"`
TicketID string `json:"ticket"`
}
func (h *Heruvym) GetMessages(
ctx context.Context,
request GetMessagesReq) ([]model.Message, int) {
result, err := h.dal.GetMessagesPage(ctx,
request.Search,
request.TicketID,
request.Amount,
request.Page,
)
if err != nil {
return nil, http.StatusNoContent
}
return result, http.StatusOK
}
type CloseTicketReq struct {
TicketID string `json:"ticket"`
}
2022-02-27 15:27:44 +00:00
type CloseTicketResp struct {
TicketID string `json:"ticket"`
}
2021-05-11 10:57:58 +00:00
2022-02-27 15:27:44 +00:00
func (h *Heruvym) CloseTicket(ctx context.Context, req CloseTicketReq) (*CloseTicketResp, int) {
2021-05-11 10:57:58 +00:00
if err := h.dal.SetTicketStatus(ctx, req.TicketID, model.StateClose); err != nil {
2022-02-27 15:27:44 +00:00
return nil, http.StatusBadRequest
2021-05-11 10:57:58 +00:00
}
2021-05-02 22:25:12 +00:00
2022-04-14 17:43:13 +00:00
if _, err := h.dal.PutMessage(ctx, "close", "close", "close", req.TicketID, []string{}); err != nil {
return nil, http.StatusBadRequest
}
2022-02-27 15:27:44 +00:00
return &CloseTicketResp{
TicketID: req.TicketID,
}, http.StatusOK
2021-05-11 10:57:58 +00:00
}
type VoteReq struct {
TicketID string `json:"ticket"`
Rate int `json:"rate"`
}
func (h *Heruvym) Vote(ctx context.Context, req VoteReq) (error, int) {
if err := h.dal.SetRate(ctx, req.TicketID, req.Rate); err != nil {
return err, http.StatusBadRequest
}
return nil, http.StatusOK
}
type PickReq struct {
TicketID string `json:"ticket"`
}
func (h *Heruvym) Pick(ctx context.Context, req PickReq) (error, int) {
sess := jwt_adapter.Get(ctx)
2023-03-01 17:38:03 +00:00
if err := h.dal.SetAnswerer(ctx, req.TicketID, sess.Id); err != nil {
2021-05-11 10:57:58 +00:00
return err, http.StatusBadRequest
}
return nil, http.StatusOK
}
type DelegateReq struct {
TicketID string `json:"ticket"`
AnswererID string `json:"answerer"`
}
func (h *Heruvym) Delegate(ctx context.Context, req DelegateReq) (error, int) {
if err := h.dal.SetAnswerer(ctx, req.TicketID, req.AnswererID); err != nil {
return err, http.StatusBadRequest
}
return nil, http.StatusOK
2021-05-02 22:25:12 +00:00
}
2021-09-05 15:24:13 +00:00
// MB Size constants
const (
MB = 1 << 20
)
type PutFileReq struct {
Ticket string `json:"ticket"`
}
type PutFileResp struct {
Message string `json:"message"`
}
func (h *Heruvym) PutFile(w http.ResponseWriter, r *http.Request) {
2021-09-05 15:24:13 +00:00
defer r.Body.Close()
if err := r.ParseMultipartForm(10 * MB); err != nil {
if _, err := w.Write([]byte("can not parse multipart " + err.Error())); err != nil {
2021-09-05 15:24:13 +00:00
fmt.Println("CAN NOT WRITE", err)
}
w.WriteHeader(http.StatusBadRequest)
return
}
if r.MultipartForm == nil {
if _, err := w.Write([]byte("no multipart")); err != nil {
fmt.Println("CAN NOT WRITE", err)
}
w.WriteHeader(http.StatusBadRequest)
return
}
if r.MultipartForm.File == nil {
if _, err := w.Write([]byte("no file")); err != nil {
fmt.Println("CAN NOT WRITE", err)
}
w.WriteHeader(http.StatusBadRequest)
return
}
filesCount := len(r.MultipartForm.File)
2021-09-05 15:24:13 +00:00
if filesCount == 0 {
if _, err := w.Write([]byte("no files")); err != nil {
fmt.Println("CAN NOT WRITE", err)
}
w.WriteHeader(http.StatusBadRequest)
return
}
sess := jwt_adapter.Get(r.Context())
if sess == nil {
if _, err := w.Write([]byte("not authorized")); err != nil {
fmt.Println("CAN NOT WRITE", err)
}
w.WriteHeader(http.StatusBadRequest)
return
}
var req PutFileReq
2022-11-02 18:52:02 +00:00
req.Ticket = r.MultipartForm.Value["ticket"][0]
2021-09-05 15:24:13 +00:00
var (
fileIDs, filenames []string
errFile error
2021-09-05 15:24:13 +00:00
)
wg := new(sync.WaitGroup)
m := new(sync.Mutex)
2021-09-05 15:24:13 +00:00
wg.Add(filesCount)
for name, file := range r.MultipartForm.File {
file := file
name := name
go func() {
defer wg.Done()
freader, err := file[0].Open()
if err != nil {
fmt.Println("can not open ", err.Error())
}
defer func() {
if err := freader.Close(); err != nil {
errFile = err
}
}()
splitted := strings.Split(name, ".")
filename := fmt.Sprintf("%s.%s", xid.New().String(), splitted[len(splitted)-1])
2021-09-05 15:24:13 +00:00
if err := h.bs.PutFile(
r.Context(),
filename,
freader,
file[0].Size); err != nil {
errFile = err
}
m.Lock()
defer m.Unlock()
fileIDs = append(fileIDs, filename)
filenames = append(filenames, name)
}()
}
wg.Wait()
if errFile != nil {
if _, err := w.Write([]byte("can not store files " + errFile.Error())); err != nil {
2021-09-05 15:24:13 +00:00
fmt.Println("CAN NOT WRITE", err)
}
w.WriteHeader(http.StatusInternalServerError)
return
}
message, err := h.dal.PutMessage(
r.Context(),
strings.Join(filenames, ", "),
2023-03-01 17:38:03 +00:00
sess.Id,
sess.Id,
2021-09-05 15:24:13 +00:00
req.Ticket,
fileIDs,
)
if err != nil {
2021-09-05 15:24:13 +00:00
for _, filename := range filenames {
if err := h.bs.DeleteFile(r.Context(), filename); err != nil {
fmt.Println("can not delete", err)
}
}
if _, err := w.Write([]byte("can not store message " + err.Error())); err != nil {
2021-09-05 15:24:13 +00:00
fmt.Println("CAN NOT WRITE", err)
}
w.WriteHeader(http.StatusInternalServerError)
return
}
resp, err := json.Marshal(&PutFileResp{Message: message.ID})
if err != nil {
if _, err := w.Write([]byte("can not marshal resp " + err.Error())); err != nil {
2021-09-05 15:24:13 +00:00
fmt.Println("CAN NOT WRITE", err)
}
w.WriteHeader(http.StatusInternalServerError)
return
}
2022-02-27 15:27:44 +00:00
if _, err := w.Write(resp); err != nil {
fmt.Println("CAN NOT WRITE", err)
}
w.WriteHeader(http.StatusOK)
}
type PutSCReq struct {
Ticket string `json:"ticket"`
}
type PutSCResp struct {
Message string `json:"message"`
}
func (h *Heruvym) PutSC(w http.ResponseWriter, r *http.Request) {
2022-02-27 15:27:44 +00:00
defer r.Body.Close()
if err := r.ParseMultipartForm(10 * MB); err != nil {
if _, err := w.Write([]byte("can not parse multipart " + err.Error())); err != nil {
2022-02-27 15:27:44 +00:00
fmt.Println("CAN NOT WRITE", err)
}
w.WriteHeader(http.StatusBadRequest)
return
}
if r.MultipartForm == nil {
if _, err := w.Write([]byte("no multipart")); err != nil {
fmt.Println("CAN NOT WRITE", err)
}
w.WriteHeader(http.StatusBadRequest)
return
}
if r.MultipartForm.File == nil {
if _, err := w.Write([]byte("no file")); err != nil {
fmt.Println("CAN NOT WRITE", err)
}
w.WriteHeader(http.StatusBadRequest)
return
}
filesCount := len(r.MultipartForm.File)
2022-02-27 15:27:44 +00:00
if filesCount == 0 {
if _, err := w.Write([]byte("no files")); err != nil {
fmt.Println("CAN NOT WRITE", err)
}
w.WriteHeader(http.StatusBadRequest)
return
}
sess := jwt_adapter.Get(r.Context())
if sess == nil {
if _, err := w.Write([]byte("not authorized")); err != nil {
fmt.Println("CAN NOT WRITE", err)
}
w.WriteHeader(http.StatusBadRequest)
return
}
var req PutFileReq
2022-11-02 18:52:02 +00:00
req.Ticket = r.MultipartForm.Value["ticket"][0]
2022-02-27 15:27:44 +00:00
var (
fileIDs, filenames []string
errFile error
2022-02-27 15:27:44 +00:00
)
wg := new(sync.WaitGroup)
m := new(sync.Mutex)
2022-02-27 15:27:44 +00:00
wg.Add(filesCount)
for name, file := range r.MultipartForm.File {
file := file
name := name
go func() {
defer wg.Done()
freader, err := file[0].Open()
if err != nil {
fmt.Println("can not open ", err.Error())
}
defer func() {
if err := freader.Close(); err != nil {
errFile = err
}
}()
splitted := strings.Split(name, ".")
filename := fmt.Sprintf("%s.%s", xid.New().String(), splitted[len(splitted)-1])
2022-02-27 15:27:44 +00:00
if err := h.bs.PutFile(
r.Context(),
filename,
freader,
file[0].Size); err != nil {
errFile = err
}
m.Lock()
defer m.Unlock()
fileIDs = append(fileIDs, filename)
filenames = append(filenames, name)
}()
}
wg.Wait()
if errFile != nil {
if _, err := w.Write([]byte("can not store files " + errFile.Error())); err != nil {
2022-02-27 15:27:44 +00:00
fmt.Println("CAN NOT WRITE", err)
}
w.WriteHeader(http.StatusInternalServerError)
return
}
message, err := h.dal.PutSCResponse(
r.Context(),
strings.Join(filenames, ", "),
2023-03-01 17:38:03 +00:00
sess.Id,
sess.Id,
2022-02-27 15:27:44 +00:00
req.Ticket,
fileIDs,
)
if err != nil {
2022-02-27 15:27:44 +00:00
for _, filename := range filenames {
if err := h.bs.DeleteFile(r.Context(), filename); err != nil {
fmt.Println("can not delete", err)
}
}
if _, err := w.Write([]byte("can not store message " + err.Error())); err != nil {
2022-02-27 15:27:44 +00:00
fmt.Println("CAN NOT WRITE", err)
}
w.WriteHeader(http.StatusInternalServerError)
return
}
resp, err := json.Marshal(&PutFileResp{Message: message.ID})
if err != nil {
if _, err := w.Write([]byte("can not marshal resp " + err.Error())); err != nil {
2022-02-27 15:27:44 +00:00
fmt.Println("CAN NOT WRITE", err)
}
w.WriteHeader(http.StatusInternalServerError)
return
}
2021-09-05 15:24:13 +00:00
if _, err := w.Write(resp); err != nil {
fmt.Println("CAN NOT WRITE", err)
}
w.WriteHeader(http.StatusOK)
}