meifamily/ptt-alertor

View on GitHub
command/actions.go

Summary

Maintainability
D
1 day
Test Coverage
package command

import (
    "strconv"
    "strings"

    "github.com/Ptt-Alertor/ptt-alertor/models"
    "github.com/Ptt-Alertor/ptt-alertor/models/author"
    "github.com/Ptt-Alertor/ptt-alertor/models/keyword"
    "github.com/Ptt-Alertor/ptt-alertor/models/pushsum"
    "github.com/Ptt-Alertor/ptt-alertor/models/subscription"
    "github.com/Ptt-Alertor/ptt-alertor/models/user"
    "github.com/Ptt-Alertor/ptt-alertor/myutil"
)

type updateAction func(u *user.User, sub subscription.Subscription, inputs ...string) error

func addKeywords(u *user.User, sub subscription.Subscription, inputs ...string) error {
    sub.Keywords = inputs
    err := u.Subscribes.Add(sub)
    if err == nil {
        err = keyword.AddSubscriber(sub.Board, u.Profile.Account)
    }
    return err
}

func removeKeywords(u *user.User, sub subscription.Subscription, inputs ...string) error {
    sub.Keywords = inputs
    if inputs[0] == "*" {
        for _, uSub := range u.Subscribes {
            if strings.EqualFold(uSub.Board, sub.Board) {
                sub.Keywords = make(myutil.StringSlice, len(uSub.Keywords))
                copy(sub.Keywords, uSub.Keywords)
            }
        }
    }
    err := u.Subscribes.Remove(sub)
    if err == nil {
        for _, uSub := range u.Subscribes {
            if strings.EqualFold(sub.Board, uSub.Board) && len(uSub.Keywords) > 0 {
                return nil
            }
        }
        err = keyword.RemoveSubscriber(sub.Board, u.Profile.Account)
    }
    return err
}

func addAuthors(u *user.User, sub subscription.Subscription, inputs ...string) error {
    sub.Authors = inputs
    err := u.Subscribes.Add(sub)
    if err == nil {
        err = author.AddSubscriber(sub.Board, u.Profile.Account)
    }
    return err
}

func removeAuthors(u *user.User, sub subscription.Subscription, inputs ...string) error {
    sub.Authors = inputs
    if inputs[0] == "*" {
        for _, uSub := range u.Subscribes {
            if strings.EqualFold(uSub.Board, sub.Board) {
                sub.Authors = make(myutil.StringSlice, len(uSub.Authors))
                copy(sub.Authors, uSub.Authors)
            }
        }
    }
    err := u.Subscribes.Remove(sub)
    if err == nil {
        for _, uSub := range u.Subscribes {
            if strings.EqualFold(sub.Board, uSub.Board) && len(uSub.Authors) > 0 {
                return nil
            }
        }
        err = author.RemoveSubscriber(sub.Board, u.Profile.Account)
    }
    return err
}

func updatePushUp(u *user.User, sub subscription.Subscription, inputs ...string) error {
    up, err := strconv.Atoi(inputs[0])
    if err != nil {
        return err
    }
    for _, s := range u.Subscribes {
        if strings.EqualFold(s.Board, sub.Board) {
            sub.PushSum.Down = s.PushSum.Down
        }
    }
    sub.PushSum.Up = up
    err = u.Subscribes.Update(sub)
    if err == nil {
        err = dealPushSum(u.Profile.Account, sub)
    }
    return err
}

func updatePushDown(u *user.User, sub subscription.Subscription, inputs ...string) error {
    down, err := strconv.Atoi(inputs[0])
    if err != nil {
        return err
    }
    for _, s := range u.Subscribes {
        if strings.EqualFold(s.Board, sub.Board) {
            sub.PushSum.Up = s.PushSum.Up
        }
    }
    sub.PushSum.Down = down
    err = u.Subscribes.Update(sub)
    if err == nil {
        err = dealPushSum(u.Profile.Account, sub)
    }
    return err
}

func dealPushSum(account string, sub subscription.Subscription) (err error) {
    if !pushsum.Exist(sub.Board) {
        err = pushsum.Add(sub.Board)
    }
    if sub.Up == 0 {
        err = pushsum.DelDiffList(account, sub.Board, "up")
    }
    if sub.Down == 0 {
        err = pushsum.DelDiffList(account, sub.Board, "down")
    }
    if sub.Up == 0 && sub.Down == 0 {
        err = pushsum.RemoveSubscriber(sub.Board, account)
    } else {
        err = pushsum.AddSubscriber(sub.Board, account)
    }
    return err
}

func addArticles(u *user.User, sub subscription.Subscription, inputs ...string) error {
    sub.Articles = inputs
    a := models.Article()
    a.Code = inputs[0]
    a.AddSubscriber(u.Profile.Account)
    return u.Subscribes.Add(sub)
}

func removeArticles(u *user.User, sub subscription.Subscription, inputs ...string) error {
    sub.Articles = inputs
    a := models.Article()
    a.Code = inputs[0]
    a.RemoveSubscriber(u.Profile.Account)
    return u.Subscribes.Remove(sub)
}