go-common/app/admin/main/usersuit/model/invite.go

124 lines
2.6 KiB
Go
Raw Normal View History

2019-04-22 10:49:16 +00:00
package model
import (
"net"
"strconv"
accmdl "go-common/app/service/main/account/model"
xtime "go-common/library/time"
)
const (
// StatusOK status ok
StatusOK = 0
// StatusUsed status used
StatusUsed = 1
// StatusExpires status expires
StatusExpires = 2
)
// Invite invite.
type Invite struct {
Status int64 `json:"status"`
Mid int64 `json:"mid"`
Code string `json:"invite_code"`
IP uint32 `json:"-"` // legacy IP field
IPng []byte `json:"-"`
Ctime xtime.Time `json:"buy_time"`
Expires int64 `json:"expires"`
Imid int64 `json:"invited_mid,omitempty"`
UsedAt int64 `json:"used_at,omitempty"`
}
// BuyIPString is
func (inv *Invite) BuyIPString() string {
if inv.IP != 0 {
return inetNtoA(inv.IP)
}
return net.IP(inv.IPng).String()
}
func inetNtoA(sum uint32) string {
ip := make(net.IP, net.IPv4len)
ip[0] = byte((sum >> 24) & 0xFF)
ip[1] = byte((sum >> 16) & 0xFF)
ip[2] = byte((sum >> 8) & 0xFF)
ip[3] = byte(sum & 0xFF)
return ip.String()
}
// FillStatus fill status.
func (inv *Invite) FillStatus(now int64) {
if inv.Used() {
inv.Status = StatusUsed
return
}
if inv.Expired(now) {
inv.Status = StatusExpires
return
}
inv.Status = StatusOK
}
// Used check if used.
func (inv *Invite) Used() bool {
return inv.UsedAt > 0 && inv.Imid > 0
}
// Expired check if expired.
func (inv *Invite) Expired(now int64) bool {
return now > inv.Expires
}
// RichInvite rich invite with invitee info.
type RichInvite struct {
Status int64 `json:"status"`
Mid int64 `json:"mid"`
Code string `json:"invite_code"`
BuyIP string `json:"buy_ip"`
Ctime xtime.Time `json:"buy_time"`
Expires int64 `json:"expires"`
Invitee *Invitee `json:"invitee,omitempty"`
UsedAt int64 `json:"used_at,omitempty"`
}
// NewRichInvite new a rich invite.
func NewRichInvite(inv *Invite, info *accmdl.Info) *RichInvite {
if inv == nil {
return nil
}
var invt *Invitee
if inv.Used() {
if info != nil {
invt = &Invitee{
Mid: inv.Imid,
Uname: info.Name,
Face: info.Face,
}
} else {
invt = &Invitee{
Mid: inv.Imid,
Uname: "用户" + strconv.FormatInt(inv.Imid, 10),
Face: "http://static.hdslb.com/images/member/noface.gif",
}
}
}
return &RichInvite{
Status: inv.Status,
Mid: inv.Mid,
Code: inv.Code,
Ctime: inv.Ctime,
Expires: inv.Expires,
Invitee: invt,
UsedAt: inv.UsedAt,
BuyIP: inv.BuyIPString(),
}
}
// Invitee invited.
type Invitee struct {
Mid int64 `json:"mid"`
Uname string `json:"uname"`
Face string `json:"face"`
}