/
create.go
88 lines (76 loc) 路 2.39 KB
/
create.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
package message
import (
"context"
"errors"
"net/http"
"time"
"github.com/castyapp/libcasty-protocol-go/proto"
"github.com/castyapp/libcasty-protocol-go/protocol"
"github.com/castyapp/grpc.server/models"
"github.com/castyapp/grpc.server/helpers"
"github.com/castyapp/grpc.server/services/auth"
"github.com/golang/protobuf/ptypes"
"go.mongodb.org/mongo-driver/bson"
"go.mongodb.org/mongo-driver/mongo"
"google.golang.org/grpc/codes"
"google.golang.org/grpc/status"
)
func (s *Service) CreateMessage(ctx context.Context, req *proto.MessageRequest) (*proto.MessageResponse, error) {
var (
db = s.MustGet("db.mongo").(*mongo.Database)
reciever = new(models.User)
collection = db.Collection("messages")
usersCollection = db.Collection("users")
failedResponse = status.Error(codes.Internal, "Could not create message, Please try again later!")
)
user, err := auth.Authenticate(s.Context, req.AuthRequest)
if err != nil {
return nil, err
}
if user.Username == req.Message.Reciever.Id {
return nil, errors.New("receiver can not be you")
}
if err := usersCollection.FindOne(ctx, bson.M{"username": req.Message.Reciever.Id}).Decode(reciever); err != nil {
return nil, status.Error(codes.NotFound, "Could not find reciever!")
}
message := bson.M{
"content": req.Message.Content,
"sender_id": user.ID,
"receiver_id": reciever.ID,
"edited": false,
"deleted": false,
"created_at": time.Now(),
"updated_at": time.Now(),
}
if _, err := collection.InsertOne(ctx, message); err != nil {
return nil, failedResponse
}
nowTime, _ := ptypes.TimestampProto(time.Now())
protoMessage := &proto.Message{
Content: req.Message.Content,
Sender: helpers.NewProtoUser(user),
Reciever: helpers.NewProtoUser(reciever),
Edited: false,
Deleted: false,
CreatedAt: nowTime,
UpdatedAt: nowTime,
}
buffer, err := protocol.NewMsgProtobuf(proto.EMSG_CHAT_MESSAGES, &proto.ChatMsgEvent{
Message: []byte(protoMessage.Content),
Sender: protoMessage.Sender,
Reciever: protoMessage.Reciever,
CreatedAt: protoMessage.CreatedAt,
})
if err == nil {
helpers.SendEventToUsers(s.Context, buffer.Bytes(), []*proto.User{
protoMessage.Sender,
protoMessage.Reciever,
})
}
return &proto.MessageResponse{
Code: http.StatusOK,
Status: "success",
Message: "Message created successfully!",
Result: protoMessage,
}, nil
}