/
msg_server_writer.go
70 lines (56 loc) · 2.54 KB
/
msg_server_writer.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
package keeper
import (
"context"
"cosmossdk.io/errors"
sdk "github.com/cosmos/cosmos-sdk/types"
sdkerrors "github.com/cosmos/cosmos-sdk/types/errors"
"github.com/medibloc/panacea-core/v2/x/aol/types"
)
func (k msgServer) AddWriter(goCtx context.Context, msg *types.MsgAddWriterRequest) (*types.MsgAddWriterResponse, error) {
ctx := sdk.UnwrapSDKContext(goCtx)
ownerAddr, err := sdk.AccAddressFromBech32(msg.OwnerAddress)
if err != nil {
return nil, errors.Wrapf(sdkerrors.ErrInvalidAddress, "invalid owner address: %v", err)
}
writerAddr, err := sdk.AccAddressFromBech32(msg.WriterAddress)
if err != nil {
return nil, errors.Wrapf(sdkerrors.ErrInvalidAddress, "invalid writer address: %v", err)
}
topicKey := types.TopicCompositeKey{OwnerAddress: ownerAddr, TopicName: msg.TopicName}
if !k.HasTopic(ctx, topicKey) {
return nil, errors.Wrapf(types.ErrTopicNotFound, "topic <%s, %s>", msg.OwnerAddress, msg.TopicName)
}
writerKey := types.WriterCompositeKey{OwnerAddress: ownerAddr, TopicName: msg.TopicName, WriterAddress: writerAddr}
if k.HasWriter(ctx, writerKey) {
return nil, errors.Wrapf(types.ErrWriterExists, "writer <%s, %s, %s>", msg.OwnerAddress, msg.TopicName, msg.WriterAddress)
}
topic := k.GetTopic(ctx, topicKey).IncreaseTotalWriters()
k.SetTopic(ctx, topicKey, topic)
writer := types.Writer{
Moniker: msg.Moniker,
Description: msg.Description,
NanoTimestamp: ctx.BlockTime().UnixNano(),
}
k.SetWriter(ctx, writerKey, writer)
return &types.MsgAddWriterResponse{}, nil
}
func (k msgServer) DeleteWriter(goCtx context.Context, msg *types.MsgDeleteWriterRequest) (*types.MsgDeleteWriterResponse, error) {
ctx := sdk.UnwrapSDKContext(goCtx)
ownerAddr, err := sdk.AccAddressFromBech32(msg.OwnerAddress)
if err != nil {
return nil, errors.Wrapf(sdkerrors.ErrInvalidAddress, "invalid owner address: %v", err)
}
writerAddr, err := sdk.AccAddressFromBech32(msg.WriterAddress)
if err != nil {
return nil, errors.Wrapf(sdkerrors.ErrInvalidAddress, "invalid writer address: %v", err)
}
topicKey := types.TopicCompositeKey{OwnerAddress: ownerAddr, TopicName: msg.TopicName}
writerKey := types.WriterCompositeKey{OwnerAddress: ownerAddr, TopicName: msg.TopicName, WriterAddress: writerAddr}
if !k.HasWriter(ctx, writerKey) {
return nil, errors.Wrapf(types.ErrWriterNotFound, "writer <%s, %s, %s>", msg.OwnerAddress, msg.TopicName, msg.WriterAddress)
}
topic := k.GetTopic(ctx, topicKey).DecreaseTotalWriters()
k.SetTopic(ctx, topicKey, topic)
k.RemoveWriter(ctx, writerKey)
return &types.MsgDeleteWriterResponse{}, nil
}