/
msgs_server_profile.go
113 lines (94 loc) · 3.15 KB
/
msgs_server_profile.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
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
package keeper
import (
"context"
"time"
"cosmossdk.io/errors"
sdk "github.com/cosmos/cosmos-sdk/types"
sdkerrors "github.com/cosmos/cosmos-sdk/types/errors"
"github.com/desmos-labs/desmos/v6/x/profiles/types"
)
var _ types.MsgServer = &MsgServer{}
type MsgServer struct {
// To ensure setting IBC keepers properly, keeper must be a reference as DesmosApp
*Keeper
}
// NewMsgServerImpl returns an implementation of the profiles MsgServer interface
// for the provided Keeper.
func NewMsgServerImpl(keeper *Keeper) types.MsgServer {
return &MsgServer{keeper}
}
// SaveProfile defines a rpc method for MsgSaveProfile
func (k MsgServer) SaveProfile(goCtx context.Context, msg *types.MsgSaveProfile) (*types.MsgSaveProfileResponse, error) {
ctx := sdk.UnwrapSDKContext(goCtx)
profile, found, err := k.GetProfile(ctx, msg.Creator)
if err != nil {
return nil, err
}
// Create a new profile if not found
if !found {
addr, err := sdk.AccAddressFromBech32(msg.Creator)
if err != nil {
return nil, err
}
profile, err = types.NewProfileFromAccount(msg.DTag, k.ak.GetAccount(ctx, addr), ctx.BlockTime())
if err != nil {
return nil, err
}
}
// Update the existing profile with the values provided from the user
updated, err := profile.Update(types.NewProfileUpdate(
msg.DTag,
msg.Nickname,
msg.Bio,
types.NewPictures(msg.ProfilePicture, msg.CoverPicture),
))
if err != nil {
return nil, errors.Wrap(sdkerrors.ErrInvalidRequest, err.Error())
}
// Validate the profile
err = k.ValidateProfile(ctx, updated)
if err != nil {
return nil, errors.Wrap(sdkerrors.ErrInvalidRequest, err.Error())
}
// Save the profile
err = k.Keeper.SaveProfile(ctx, updated)
if err != nil {
return nil, errors.Wrap(sdkerrors.ErrInvalidRequest, err.Error())
}
ctx.EventManager().EmitEvents(sdk.Events{
sdk.NewEvent(
sdk.EventTypeMessage,
sdk.NewAttribute(sdk.AttributeKeyModule, types.AttributeValueCategory),
sdk.NewAttribute(sdk.AttributeKeyAction, sdk.MsgTypeURL(msg)),
sdk.NewAttribute(sdk.AttributeKeySender, msg.Creator),
),
sdk.NewEvent(
types.EventTypeProfileSaved,
sdk.NewAttribute(types.AttributeKeyProfileDTag, updated.DTag),
sdk.NewAttribute(types.AttributeKeyProfileCreator, updated.GetAddress().String()),
sdk.NewAttribute(types.AttributeKeyProfileCreationTime, updated.CreationDate.Format(time.RFC3339Nano)),
),
})
return &types.MsgSaveProfileResponse{}, nil
}
// DeleteProfile defines a rpc method for MsgDeleteProfile
func (k MsgServer) DeleteProfile(goCtx context.Context, msg *types.MsgDeleteProfile) (*types.MsgDeleteProfileResponse, error) {
ctx := sdk.UnwrapSDKContext(goCtx)
err := k.RemoveProfile(ctx, msg.Creator)
if err != nil {
return nil, err
}
ctx.EventManager().EmitEvents(sdk.Events{
sdk.NewEvent(
sdk.EventTypeMessage,
sdk.NewAttribute(sdk.AttributeKeyModule, types.AttributeValueCategory),
sdk.NewAttribute(sdk.AttributeKeyAction, sdk.MsgTypeURL(msg)),
sdk.NewAttribute(sdk.AttributeKeySender, msg.Creator),
),
sdk.NewEvent(
types.EventTypeProfileDeleted,
sdk.NewAttribute(types.AttributeKeyProfileCreator, msg.Creator),
),
})
return &types.MsgDeleteProfileResponse{}, nil
}