40 lines
1.1 KiB
Go
40 lines
1.1 KiB
Go
package postgres
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
|
|
"github.com/jackc/pgx/v5"
|
|
|
|
"telesrv/internal/domain"
|
|
)
|
|
|
|
func (s *ChannelStore) SetAvailableReactions(ctx context.Context, userID, channelID int64, policy domain.ChannelReactionPolicy) (domain.Channel, error) {
|
|
if userID == 0 || channelID == 0 {
|
|
return domain.Channel{}, domain.ErrChannelInvalid
|
|
}
|
|
policyJSON, err := marshalJSON(policy, "{}")
|
|
if err != nil {
|
|
return domain.Channel{}, err
|
|
}
|
|
var channel domain.Channel
|
|
if err := withTx(ctx, s.db, "set channel available reactions", func(tx pgx.Tx) error {
|
|
var err error
|
|
var member domain.ChannelMember
|
|
channel, member, err = s.getChannelForMember(ctx, tx, userID, channelID)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
if !canChangeChannelInfo(member) {
|
|
return domain.ErrChannelAdminRequired
|
|
}
|
|
if _, err := tx.Exec(ctx, `UPDATE channels SET available_reactions = $2, updated_at = now() WHERE id = $1`, channelID, policyJSON); err != nil {
|
|
return fmt.Errorf("update channel available reactions: %w", err)
|
|
}
|
|
channel.ReactionPolicy = policy
|
|
return nil
|
|
}); err != nil {
|
|
return domain.Channel{}, err
|
|
}
|
|
return channel, nil
|
|
}
|