2021-09-05 15:24:13 +00:00
|
|
|
package mongo
|
2021-04-10 18:46:51 +00:00
|
|
|
|
|
|
|
import (
|
|
|
|
"context"
|
2021-05-15 20:10:07 +00:00
|
|
|
"fmt"
|
2021-04-10 18:46:51 +00:00
|
|
|
"github.com/rs/xid"
|
|
|
|
"github.com/themakers/hlog"
|
2021-05-01 12:36:22 +00:00
|
|
|
"go.mongodb.org/mongo-driver/bson"
|
2021-09-05 15:24:13 +00:00
|
|
|
"go.mongodb.org/mongo-driver/bson/primitive"
|
2021-04-10 18:46:51 +00:00
|
|
|
"go.mongodb.org/mongo-driver/mongo"
|
|
|
|
"go.mongodb.org/mongo-driver/mongo/options"
|
|
|
|
"go.mongodb.org/mongo-driver/mongo/readpref"
|
2021-09-05 15:24:13 +00:00
|
|
|
"heruvym/model"
|
2021-04-10 18:46:51 +00:00
|
|
|
"time"
|
|
|
|
)
|
|
|
|
|
2021-04-11 09:48:15 +00:00
|
|
|
const (
|
|
|
|
collMessages = "messages"
|
|
|
|
collTickets = "tickets"
|
|
|
|
)
|
2021-04-10 18:46:51 +00:00
|
|
|
|
|
|
|
type DAL struct {
|
2021-04-11 09:48:15 +00:00
|
|
|
logger hlog.Logger
|
|
|
|
colMsg, colTck *mongo.Collection
|
|
|
|
client *mongo.Client
|
2021-04-10 18:46:51 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
type ErrorConnectToDB struct {
|
|
|
|
Err error
|
|
|
|
MongoURI string
|
|
|
|
}
|
|
|
|
|
|
|
|
type ErrorPingDB struct {
|
|
|
|
Err error
|
|
|
|
MongoURI string
|
|
|
|
}
|
|
|
|
|
|
|
|
type InfoPing struct {
|
|
|
|
MongoURI string
|
2021-04-11 09:48:15 +00:00
|
|
|
Nanoseconds int64
|
2021-04-10 18:46:51 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
func New(
|
|
|
|
ctx context.Context,
|
|
|
|
mongoURI, database string,
|
|
|
|
log hlog.Logger,
|
|
|
|
) (*DAL, error) {
|
|
|
|
client, err := mongo.Connect(ctx, options.Client().ApplyURI(mongoURI))
|
|
|
|
if err != nil {
|
|
|
|
log.Emit(ErrorConnectToDB{
|
|
|
|
Err: err,
|
|
|
|
MongoURI: mongoURI,
|
|
|
|
})
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
|
2021-04-11 09:48:15 +00:00
|
|
|
before := time.Now().Unix()
|
2021-04-10 18:46:51 +00:00
|
|
|
|
|
|
|
if err := client.Ping(ctx, readpref.PrimaryPreferred()); err != nil {
|
|
|
|
log.Emit(ErrorPingDB{
|
|
|
|
Err: err,
|
|
|
|
MongoURI: mongoURI,
|
|
|
|
})
|
|
|
|
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
|
|
|
|
log.Emit(InfoPing{
|
|
|
|
MongoURI: mongoURI,
|
2021-04-11 09:48:15 +00:00
|
|
|
Nanoseconds: time.Now().Unix() - before,
|
2021-04-10 18:46:51 +00:00
|
|
|
})
|
|
|
|
|
|
|
|
return &DAL{
|
|
|
|
client: client,
|
2021-04-11 09:48:15 +00:00
|
|
|
colMsg: client.Database(database).Collection(collMessages),
|
|
|
|
colTck: client.Database(database).Collection(collTickets),
|
2021-04-10 18:46:51 +00:00
|
|
|
logger: log.Module("DAL"),
|
|
|
|
}, nil
|
|
|
|
}
|
|
|
|
|
|
|
|
type ErrorInsert struct {
|
2021-04-11 09:48:15 +00:00
|
|
|
Err error
|
2021-04-10 18:46:51 +00:00
|
|
|
UserID, SessionID string
|
|
|
|
}
|
|
|
|
|
|
|
|
func (d *DAL) PutMessage(
|
|
|
|
ctx context.Context,
|
2021-04-11 09:48:15 +00:00
|
|
|
message, userID, sessionID, ticketID string,
|
2021-04-10 18:46:51 +00:00
|
|
|
files []string,
|
2021-05-02 22:25:12 +00:00
|
|
|
) (*model.Message, error) {
|
|
|
|
insertable := model.Message{
|
2021-04-10 18:46:51 +00:00
|
|
|
ID: xid.New().String(),
|
|
|
|
UserID: userID,
|
|
|
|
SessionID: sessionID,
|
2021-04-11 09:48:15 +00:00
|
|
|
TicketID: ticketID,
|
2021-04-10 18:46:51 +00:00
|
|
|
Message: message,
|
2022-02-27 15:27:44 +00:00
|
|
|
Files: files,
|
|
|
|
Shown: map[string]int{},
|
|
|
|
CreatedAt: time.Now(),
|
|
|
|
}
|
|
|
|
|
|
|
|
if _, err := d.colMsg.InsertOne(ctx, &insertable); err != nil {
|
|
|
|
d.logger.Emit(ErrorInsert{
|
|
|
|
Err: err,
|
|
|
|
UserID: userID,
|
|
|
|
SessionID: sessionID,
|
|
|
|
})
|
|
|
|
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
|
|
|
|
return &insertable, nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func (d *DAL) PutSCResponse(
|
|
|
|
ctx context.Context,
|
|
|
|
message, userID, sessionID, ticketID string,
|
|
|
|
files []string,
|
|
|
|
) (*model.Message, error) {
|
|
|
|
insertable := model.Message{
|
|
|
|
ID: xid.New().String(),
|
|
|
|
UserID: userID,
|
|
|
|
SessionID: sessionID,
|
|
|
|
TicketID: ticketID,
|
|
|
|
Message: message,
|
|
|
|
Files: files,
|
|
|
|
RequestScreenshot: "response",
|
|
|
|
Shown: map[string]int{},
|
|
|
|
CreatedAt: time.Now(),
|
|
|
|
}
|
|
|
|
|
|
|
|
if _, err := d.colMsg.InsertOne(ctx, &insertable); err != nil {
|
|
|
|
d.logger.Emit(ErrorInsert{
|
|
|
|
Err: err,
|
|
|
|
UserID: userID,
|
|
|
|
SessionID: sessionID,
|
|
|
|
})
|
|
|
|
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
|
|
|
|
return &insertable, nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func (d *DAL) PutSCRequest(
|
|
|
|
ctx context.Context,
|
|
|
|
userID, sessionID, ticketID string,
|
|
|
|
) (*model.Message, error) {
|
|
|
|
insertable := model.Message{
|
|
|
|
ID: xid.New().String(),
|
|
|
|
UserID: userID,
|
|
|
|
SessionID: sessionID,
|
|
|
|
TicketID: ticketID,
|
|
|
|
Message: "",
|
2021-09-05 15:24:13 +00:00
|
|
|
Files: []string{},
|
2021-05-02 22:25:12 +00:00
|
|
|
Shown: map[string]int{},
|
2022-02-27 15:27:44 +00:00
|
|
|
RequestScreenshot: "acquisition",
|
2021-04-10 18:46:51 +00:00
|
|
|
CreatedAt: time.Now(),
|
2021-05-02 22:25:12 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
if _, err := d.colMsg.InsertOne(ctx, &insertable); err != nil {
|
2021-04-10 18:46:51 +00:00
|
|
|
d.logger.Emit(ErrorInsert{
|
|
|
|
Err: err,
|
|
|
|
UserID: userID,
|
|
|
|
SessionID: sessionID,
|
|
|
|
})
|
|
|
|
|
2021-05-02 22:25:12 +00:00
|
|
|
return nil, err
|
2021-04-10 18:46:51 +00:00
|
|
|
}
|
|
|
|
|
2021-05-02 22:25:12 +00:00
|
|
|
return &insertable, nil
|
2021-04-10 18:46:51 +00:00
|
|
|
}
|
2021-04-11 09:48:15 +00:00
|
|
|
|
|
|
|
func (d *DAL) CreateTicket(
|
|
|
|
ctx context.Context,
|
|
|
|
userID,
|
|
|
|
sessionID,
|
2021-05-02 22:25:12 +00:00
|
|
|
title, message string,
|
|
|
|
files []string,
|
2021-04-11 09:48:15 +00:00
|
|
|
) (string, error) {
|
|
|
|
|
2021-05-02 22:25:12 +00:00
|
|
|
ticketID := xid.New().String()
|
2021-04-11 09:48:15 +00:00
|
|
|
|
|
|
|
if _, err := d.colTck.InsertOne(ctx, &model.Ticket{
|
2021-05-02 22:25:12 +00:00
|
|
|
ID: ticketID,
|
2021-04-11 09:48:15 +00:00
|
|
|
UserID: userID,
|
|
|
|
SessionID: sessionID,
|
|
|
|
Title: title,
|
2021-05-02 22:25:12 +00:00
|
|
|
State: model.StateOpen,
|
2021-04-11 09:53:26 +00:00
|
|
|
CreatedAt: time.Now(),
|
2021-05-11 10:57:58 +00:00
|
|
|
Rate: -1,
|
2021-05-02 22:25:12 +00:00
|
|
|
TopMessage: model.Message{
|
|
|
|
ID: xid.New().String(),
|
|
|
|
UserID: userID,
|
|
|
|
SessionID: sessionID,
|
|
|
|
TicketID: ticketID,
|
|
|
|
Message: message,
|
2021-09-05 15:24:13 +00:00
|
|
|
Files: []string{},
|
|
|
|
Shown: map[string]int{},
|
2021-05-02 22:25:12 +00:00
|
|
|
CreatedAt: time.Now(),
|
|
|
|
},
|
2021-04-11 09:48:15 +00:00
|
|
|
}); err != nil {
|
|
|
|
d.logger.Emit(ErrorInsert{
|
|
|
|
Err: err,
|
|
|
|
UserID: userID,
|
|
|
|
SessionID: sessionID,
|
|
|
|
})
|
|
|
|
|
|
|
|
return "", err
|
|
|
|
}
|
|
|
|
|
2021-05-02 22:25:12 +00:00
|
|
|
return ticketID, nil
|
2021-04-11 09:48:15 +00:00
|
|
|
}
|
2021-05-01 12:36:22 +00:00
|
|
|
|
|
|
|
func (d *DAL) GetTickets4Sess(ctx context.Context, sessID string) ([]model.Ticket, error) {
|
|
|
|
cur, err := d.colTck.Find(ctx, bson.M{
|
|
|
|
"SessionID": sessID,
|
|
|
|
})
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
|
|
|
|
var result []model.Ticket
|
|
|
|
if err := cur.All(ctx, &result); err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
|
|
|
|
return result, nil
|
|
|
|
}
|
2021-05-02 22:25:12 +00:00
|
|
|
|
|
|
|
func (d *DAL) GetTicket4Sess(
|
|
|
|
ctx context.Context,
|
|
|
|
ticketID,
|
|
|
|
sessID string) (*model.Ticket, error) {
|
|
|
|
|
|
|
|
var result model.Ticket
|
|
|
|
if err := d.colTck.FindOne(ctx, bson.M{
|
|
|
|
"_id": ticketID,
|
|
|
|
"SessionID": sessID,
|
|
|
|
}).Decode(&result); err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
|
|
|
|
return &result, nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func (d *DAL) GetTicket4User(
|
|
|
|
ctx context.Context,
|
|
|
|
ticketID,
|
|
|
|
userID string) (*model.Ticket, error) {
|
|
|
|
|
|
|
|
var result model.Ticket
|
|
|
|
if err := d.colTck.FindOne(ctx, bson.M{
|
|
|
|
"_id": ticketID,
|
|
|
|
"UserID": userID,
|
|
|
|
}).Decode(&result); err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
|
|
|
|
return &result, nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func (d *DAL) WatchTickets(
|
|
|
|
ctx context.Context,
|
|
|
|
userID string,
|
|
|
|
yield func(ticket model.Ticket) error) error {
|
|
|
|
operationTypes := []bson.D{{{"operationType", "insert"}},
|
|
|
|
{{"operationType", "update"}}}
|
|
|
|
|
2021-05-15 20:10:07 +00:00
|
|
|
matchStage := bson.M{
|
|
|
|
"$and": bson.A{
|
|
|
|
bson.M{"$or": operationTypes},
|
|
|
|
bson.M{"fullDocument.UserID": userID},
|
|
|
|
},
|
2021-05-02 22:25:12 +00:00
|
|
|
}
|
|
|
|
|
2021-05-15 20:10:07 +00:00
|
|
|
matchPipeline := mongo.Pipeline{
|
|
|
|
bson.D{{"$match", matchStage}},
|
2021-05-02 22:25:12 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
cs, err := d.colTck.Watch(ctx, matchPipeline,
|
2021-09-05 15:24:13 +00:00
|
|
|
options.ChangeStream().SetFullDocument(options.UpdateLookup))
|
2021-05-02 22:25:12 +00:00
|
|
|
if err != nil {
|
2021-05-15 20:10:07 +00:00
|
|
|
fmt.Println("111",err,matchPipeline)
|
2021-05-02 22:25:12 +00:00
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
var piece model.Ticket
|
2021-09-05 15:24:13 +00:00
|
|
|
|
|
|
|
var change Change
|
2021-05-02 22:25:12 +00:00
|
|
|
for cs.Next(ctx) {
|
2021-09-05 15:24:13 +00:00
|
|
|
if err := cs.Decode(&change); err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
if err := bson.Unmarshal(change.FullDocument, &piece);err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
if err := yield(piece); err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func (d *DAL) YieldActiveTickets(
|
|
|
|
ctx context.Context,
|
|
|
|
yield func(ticket model.Ticket) error) error {
|
|
|
|
cursor, err := d.colTck.Find(ctx, bson.M{
|
|
|
|
"State": model.StateOpen,
|
2022-02-27 15:27:44 +00:00
|
|
|
}, options.Find().SetLimit(20))
|
2021-09-05 15:24:13 +00:00
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
var piece model.Ticket
|
|
|
|
for cursor.Next(ctx) {
|
|
|
|
if err := cursor.Decode(&piece); err != nil {
|
2021-05-02 22:25:12 +00:00
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
if err := yield(piece); err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func (d *DAL) YieldUserTickets(
|
|
|
|
ctx context.Context,
|
|
|
|
userID string,
|
|
|
|
yield func(ticket model.Ticket) error) error {
|
|
|
|
cursor, err := d.colTck.Find(ctx, bson.M{
|
|
|
|
"UserID": userID,
|
|
|
|
})
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
var piece model.Ticket
|
|
|
|
for cursor.Next(ctx) {
|
|
|
|
if err := cursor.Decode(&piece); err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
if err := yield(piece); err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func (d *DAL) WatchActiveTickets(ctx context.Context, yield func(ticket model.Ticket) error) error {
|
2022-02-27 15:27:44 +00:00
|
|
|
operationTypes := []bson.D{
|
|
|
|
{{"operationType", "insert"}},
|
|
|
|
{{"operationType", "update"}},
|
|
|
|
}
|
2021-05-02 22:25:12 +00:00
|
|
|
|
|
|
|
matchStage := bson.D{{"$and", []bson.D{
|
|
|
|
{
|
|
|
|
{"$or", operationTypes},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
{
|
|
|
|
"fullDocument.State", bson.D{{
|
|
|
|
"$ne", model.StateClose,
|
|
|
|
}},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
}}}
|
|
|
|
|
2021-09-05 15:24:13 +00:00
|
|
|
matchPipeline := mongo.Pipeline{
|
|
|
|
bson.D{
|
|
|
|
{"$match", matchStage},
|
|
|
|
},
|
2021-05-02 22:25:12 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
cs, err := d.colTck.Watch(ctx, matchPipeline,
|
2021-09-05 15:24:13 +00:00
|
|
|
options.ChangeStream().SetFullDocument(options.UpdateLookup))
|
2021-05-02 22:25:12 +00:00
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
var piece model.Ticket
|
2021-09-05 15:24:13 +00:00
|
|
|
var change Change
|
2021-05-02 22:25:12 +00:00
|
|
|
for cs.Next(ctx) {
|
2021-09-05 15:24:13 +00:00
|
|
|
if err := cs.Decode(&change); err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
if err := bson.Unmarshal(change.FullDocument, &piece);err != nil {
|
2021-05-02 22:25:12 +00:00
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
if err := yield(piece); err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func (d *DAL) UpdateTopMessage(ctx context.Context, ticketID string, msg *model.Message) error {
|
|
|
|
if err := d.colTck.FindOneAndUpdate(ctx, bson.M{
|
|
|
|
"_id": ticketID,
|
|
|
|
}, bson.M{
|
|
|
|
"$set": bson.M{
|
|
|
|
"UpdatedAt": time.Now(),
|
|
|
|
"TopMessage": msg,
|
|
|
|
},
|
|
|
|
}).Decode(&model.Ticket{}); err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func (d *DAL) YieldMessages(
|
|
|
|
ctx context.Context,
|
|
|
|
ticketID string,
|
|
|
|
yield func(ticket model.Message) error) error {
|
2021-05-15 20:10:07 +00:00
|
|
|
cursor, err := d.colMsg.Find(ctx, bson.M{
|
2021-05-02 22:25:12 +00:00
|
|
|
"TicketID": ticketID,
|
|
|
|
})
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
var piece model.Message
|
|
|
|
for cursor.Next(ctx) {
|
|
|
|
if err := cursor.Decode(&piece); err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
if err := yield(piece); err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
2021-09-05 15:24:13 +00:00
|
|
|
type OpType string
|
|
|
|
|
|
|
|
const (
|
|
|
|
OpInsert OpType = "insert"
|
|
|
|
OpDelete OpType = "delete"
|
|
|
|
OpReplace OpType = "replace"
|
|
|
|
OpUpdate OpType = "update"
|
|
|
|
)
|
|
|
|
|
|
|
|
type Change struct {
|
|
|
|
ID struct {
|
|
|
|
Data string `bson:"_data"`
|
|
|
|
} `bson:"_id"`
|
|
|
|
|
|
|
|
OperationType OpType `bson:"operationType"`
|
|
|
|
|
|
|
|
FullDocument bson.Raw `bson:"fullDocument"`
|
|
|
|
|
|
|
|
NS struct {
|
|
|
|
DB string `bson:"db"`
|
|
|
|
Coll string `bson:"coll"`
|
|
|
|
} `bson:"ns"`
|
|
|
|
|
|
|
|
To *struct {
|
|
|
|
DB string `bson:"db"`
|
|
|
|
Coll string `bson:"coll"`
|
|
|
|
} `bson:"to"`
|
|
|
|
|
|
|
|
DocumentKey bson.Raw `bson:"documentKey"`
|
|
|
|
|
|
|
|
UpdateDescription *struct {
|
|
|
|
UpdatedFields bson.Raw `bson:"updatedFields"`
|
|
|
|
RemovedFields []string `bson:"removedFields"`
|
|
|
|
} `bson:"updateDescription"`
|
|
|
|
|
|
|
|
ClusterTime primitive.Timestamp `bson:"clusterTime"`
|
|
|
|
|
|
|
|
TxnNumber int64 `bson:"txnNumber"`
|
|
|
|
|
|
|
|
LSID bson.Raw `bson:"lsid"`
|
|
|
|
|
|
|
|
//LSID *struct {
|
|
|
|
// ID primitive.ObjectID `bson:"id"`
|
|
|
|
// UID primitive.Binary `bson:"uid"`
|
|
|
|
//} `bson:"lsid"`
|
|
|
|
}
|
|
|
|
|
2021-05-02 22:25:12 +00:00
|
|
|
func (d *DAL) WatchMessages(
|
|
|
|
ctx context.Context, ticketID string, yield func(ticket model.Message) error) error {
|
|
|
|
operationTypes := []bson.D{{{"operationType", "insert"}},
|
|
|
|
{{"operationType", "update"}}}
|
|
|
|
|
|
|
|
matchStage := bson.D{{"$and", []bson.D{
|
|
|
|
{
|
|
|
|
{"$or", operationTypes},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
{
|
|
|
|
"fullDocument.TicketID", ticketID,
|
|
|
|
},
|
|
|
|
},
|
|
|
|
}}}
|
|
|
|
|
2021-05-15 20:10:07 +00:00
|
|
|
matchPipeline := mongo.Pipeline{
|
|
|
|
bson.D{{"$match", matchStage}},
|
2021-05-02 22:25:12 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
cs, err := d.colMsg.Watch(ctx, matchPipeline,
|
2021-09-05 15:24:13 +00:00
|
|
|
options.ChangeStream().SetFullDocument(options.UpdateLookup))
|
2021-05-02 22:25:12 +00:00
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
var piece model.Message
|
2021-09-05 15:24:13 +00:00
|
|
|
var change Change
|
2021-05-02 22:25:12 +00:00
|
|
|
for cs.Next(ctx) {
|
2021-09-05 15:24:13 +00:00
|
|
|
if err := cs.Decode(&change); err != nil {
|
2021-05-02 22:25:12 +00:00
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
2021-09-05 15:24:13 +00:00
|
|
|
bson.Unmarshal(change.FullDocument, &piece)
|
|
|
|
|
2021-05-02 22:25:12 +00:00
|
|
|
if err := yield(piece); err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func (d *DAL) SetShown(ctx context.Context, messageID, userID string) error {
|
|
|
|
if err := d.colMsg.FindOneAndUpdate(ctx, bson.M{
|
|
|
|
"_id": messageID,
|
|
|
|
}, bson.M{
|
|
|
|
"$set": bson.M{
|
2021-09-05 15:24:13 +00:00
|
|
|
fmt.Sprintf("Shown.%s",userID): 1,
|
2021-05-02 22:25:12 +00:00
|
|
|
},
|
|
|
|
}).Decode(&model.Message{}); err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
return nil
|
|
|
|
}
|
2021-05-11 10:57:58 +00:00
|
|
|
|
|
|
|
func (d *DAL) GetTicketPage(
|
|
|
|
ctx context.Context,
|
|
|
|
state, srch string,
|
|
|
|
limit, skip int64,
|
2022-02-27 15:27:44 +00:00
|
|
|
) (*[]model.Ticket, int64, error) {
|
2021-05-11 10:57:58 +00:00
|
|
|
query := bson.M{}
|
|
|
|
|
|
|
|
if state != "" {
|
|
|
|
query["State"] = state
|
|
|
|
}
|
|
|
|
|
|
|
|
if srch != "" {
|
|
|
|
query["$test"] = bson.M{
|
|
|
|
"$search": srch,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
cur, err := d.colTck.Find(ctx, query, options.Find().SetLimit(limit).SetSkip(skip*limit))
|
|
|
|
if err != nil {
|
2022-02-27 15:27:44 +00:00
|
|
|
return nil,0, err
|
2021-05-11 10:57:58 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
var result []model.Ticket
|
|
|
|
|
|
|
|
if err := cur.All(ctx, &result); err != nil {
|
2022-02-27 15:27:44 +00:00
|
|
|
return nil,0, err
|
2021-05-11 10:57:58 +00:00
|
|
|
}
|
|
|
|
|
2022-02-27 15:27:44 +00:00
|
|
|
col, err := d.colTck.CountDocuments(ctx, query)
|
|
|
|
if err != nil {
|
|
|
|
return nil, 0, err
|
|
|
|
}
|
|
|
|
|
|
|
|
return &result, col, nil
|
2021-05-11 10:57:58 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
func (d *DAL) GetMessagesPage(ctx context.Context,
|
|
|
|
search, ticketID string,
|
|
|
|
limit, offset int64) ([]model.Message, error) {
|
|
|
|
|
|
|
|
var (
|
|
|
|
query bson.M
|
|
|
|
result []model.Message
|
|
|
|
)
|
|
|
|
|
|
|
|
if search != "" {
|
|
|
|
query = bson.M{
|
|
|
|
"TicketID": ticketID,
|
|
|
|
"$text": bson.M{
|
|
|
|
"$search": search,
|
|
|
|
},
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
query = bson.M{
|
|
|
|
"TicketID": ticketID,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
cur, err := d.colMsg.Find(ctx, query, options.Find().SetLimit(limit).SetSkip(limit*offset))
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
|
|
|
|
if err := cur.All(ctx, &result); err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
|
|
|
|
return nil, nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func (d *DAL) SetTicketStatus(ctx context.Context,
|
|
|
|
ticket, status string) error {
|
|
|
|
if _, err := d.colTck.UpdateByID(ctx, ticket, bson.M{
|
2022-02-27 15:27:44 +00:00
|
|
|
"$set": bson.M{
|
|
|
|
"State": status,
|
|
|
|
"UpdatedAt": time.Now(),
|
|
|
|
},
|
2021-05-11 10:57:58 +00:00
|
|
|
}); err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func (d *DAL) SetRate(ctx context.Context, ticket string, rate int) error {
|
|
|
|
if _, err := d.colTck.UpdateByID(ctx, ticket, bson.M{"$set": bson.M{
|
|
|
|
"Rate": rate,
|
|
|
|
"UpdatedAt": time.Now(),
|
|
|
|
}}); err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func (d *DAL) SetAnswerer(ctx context.Context, ticket, answerer string) error {
|
|
|
|
if _, err := d.colTck.UpdateByID(ctx, ticket, bson.M{"$set": bson.M{
|
|
|
|
"AnswererID": answerer,
|
|
|
|
"UpdatedAt": time.Now(),
|
|
|
|
}}); err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
return nil
|
|
|
|
}
|