Documentation
¶
Overview ¶
Package log holds the system log row (the system_logs table) and the typed content of each kind of entry: the message and subscription logs, the login, registration, balance, commission, gift and order logs, and the traffic logs, rankings and daily statistics. Every domain may append to the audit log inside its own transaction.
Index ¶
- Constants
- func ExpirableTypes() []int
- type AdminAction
- type Balance
- type Commission
- type FilterParams
- type Gift
- type Login
- type Message
- type OrderCreated
- type Register
- type ResetSubscribe
- type ServerTraffic
- type ServerTrafficRank
- type Subscribe
- type SystemLog
- type Traffic
- type TrafficStat
- type Type
- type UnmatchedPayment
- type UserTraffic
- type UserTrafficRank
Constants ¶
const ( ResetSubscribeTypeAuto uint16 = 231 // Auto reset ResetSubscribeTypeAdvance uint16 = 232 // Advance reset ResetSubscribeTypePaid uint16 = 233 // Paid reset ResetSubscribeTypeQuota uint16 = 234 // Quota reset BalanceTypeRecharge uint16 = 321 // Recharge BalanceTypeWithdraw uint16 = 322 // Withdraw BalanceTypePayment uint16 = 323 // Payment BalanceTypeRefund uint16 = 324 // Refund BalanceTypeAdjust uint16 = 326 // Admin Adjust BalanceTypeReward uint16 = 325 // Reward CommissionTypePurchase uint16 = 331 // Purchase CommissionTypeRenewal uint16 = 332 // Renewal CommissionTypeRefund uint16 = 333 // Refund CommissionTypeWithdraw uint16 = 334 // withdraw CommissionTypeAdjust uint16 = 335 // Admin Adjust CommissionTypeConvertBalance uint16 = 336 // Convert to Balance GiftTypeIncrease uint16 = 341 // Increase GiftTypeReduce uint16 = 342 // Reduce )
const ( AdminActionSourceHTTP = "http" AdminActionSourceTelegram = "telegram" )
The sources an administrator mutation arrives from.
Variables ¶
This section is empty.
Functions ¶
func ExpirableTypes ¶ added in v1.19.0
func ExpirableTypes() []int
ExpirableTypes returns the operational log classes that may be removed by the configured retention policy. Financial logs are deliberately absent: balance, commission and gift entries are durable ledgers and are also used by business queries, so treating them as disposable logs corrupts history. Keep this as an allowlist so newly-added log types are retained by default.
Types ¶
type AdminAction ¶ added in v1.21.0
type AdminAction struct {
requestmeta.Metadata
Action string `json:"action"`
Object string `json:"object,omitempty"`
ObjectID int64 `json:"object_id,omitempty"`
Detail string `json:"detail,omitempty"`
Source string `json:"source"` // "http" or "telegram"
TelegramSenderID int64 `json:"telegram_sender_id,omitempty"`
Timestamp int64 `json:"timestamp"`
}
AdminAction records a mutation an administrator made: which action, on which object, from the HTTP API (ActorID) or the Telegram bot (TelegramSenderID). Detail is a short, bounded description and must never carry a secret: settings entries name the changed keys, not their values. The type is not expirable, so the trail survives a shortened retention.
func AdminActionFrom ¶ added in v1.21.0
func AdminActionFrom(ctx context.Context, action AdminAction) AdminAction
AdminActionFrom returns action with the request metadata of ctx (the administrator's request, ActorID included) as recorded by the HTTP middleware; without one the action is recorded as it is.
func (*AdminAction) Marshal ¶ added in v1.21.0
func (a *AdminAction) Marshal() ([]byte, error)
Marshal encodes the entry as stored, its request bounded.
func (*AdminAction) Unmarshal ¶ added in v1.21.0
func (a *AdminAction) Unmarshal(data []byte) error
Unmarshal decodes a stored entry, its request bounded.
type Balance ¶
type Balance struct {
requestmeta.Metadata
Type uint16 `json:"type"`
Amount int64 `json:"amount"`
OrderNo string `json:"order_no,omitempty"`
Balance int64 `json:"balance"`
Timestamp int64 `json:"timestamp"`
}
Balance represents a balance log entry.
type Commission ¶
type Commission struct {
requestmeta.Metadata
Type uint16 `json:"type"`
Amount int64 `json:"amount"`
OrderNo string `json:"order_no"`
// Balance is the commission balance after the movement, so the balance
// before it is Balance - Amount. Writers that do not know it leave it
// out; an administrator's adjustment always records it.
Balance int64 `json:"balance,omitempty"`
Timestamp int64 `json:"timestamp"`
}
Commission represents a commission log entry.
func (*Commission) Marshal ¶
func (c *Commission) Marshal() ([]byte, error)
Marshal encodes the entry as stored, its request bounded.
func (*Commission) Unmarshal ¶
func (c *Commission) Unmarshal(data []byte) error
Unmarshal decodes a stored entry, its request bounded.
type FilterParams ¶
type FilterParams struct {
Page int
Size int
Type uint8
Data string
StartDate string
EndDate string
Search string
ObjectID int64
SkipCount bool // when true, skip the COUNT(*) query (total will be 0)
// ContentInt64 keeps the rows whose JSON content has each named
// top-level field equal to the value, matched by the database's JSON
// extraction rather than by a text pattern (which "12" would share with
// "120"). The keys are field names of the content types in this package.
ContentInt64 map[string]int64
}
FilterParams selects a page of the system log.
type Gift ¶
type Gift struct {
requestmeta.Metadata
Type uint16 `json:"type"`
OrderNo string `json:"order_no"`
SubscribeId int64 `json:"subscribe_id"`
Amount int64 `json:"amount"`
Balance int64 `json:"balance"`
Remark string `json:"remark,omitempty"`
Timestamp int64 `json:"timestamp"`
}
Gift represents a gift log entry.
type Login ¶
type Login struct {
requestmeta.IPMetadata
Method string `json:"method"`
LoginIP string `json:"login_ip"`
UserAgent string `json:"user_agent"`
Success bool `json:"success"`
Timestamp int64 `json:"timestamp"`
ActorID int64 `json:"actor_id,omitempty"`
}
Login represents a login log entry.
func (*Login) Request ¶ added in v1.21.0
func (l *Login) Request() requestmeta.Metadata
Request returns the request the login came from; its address is LoginIP.
type Message ¶
type Message struct {
requestmeta.Metadata
To string `json:"to"`
Subject string `json:"subject,omitempty"`
Content map[string]any `json:"content"`
Platform string `json:"platform"`
Template string `json:"template"`
Status uint8 `json:"status"` // 0: Attempt started, 1: Sent, 2: Failed
}
Message represents a message log entry.
type OrderCreated ¶ added in v1.20.1
type OrderCreated struct {
requestmeta.Metadata
OrderNo string `json:"order_no"`
OrderType uint8 `json:"order_type"`
Quantity int64 `json:"quantity"`
Price int64 `json:"price"`
Amount int64 `json:"amount"`
GiftAmount int64 `json:"gift_amount"`
Discount int64 `json:"discount"`
CouponDiscount int64 `json:"coupon_discount"`
PaymentID int64 `json:"payment_id"`
Method string `json:"method"`
FeeAmount int64 `json:"fee_amount"`
SubscribeID int64 `json:"subscribe_id,omitempty"`
Source string `json:"source"`
Timestamp int64 `json:"timestamp"`
}
OrderCreated represents a durable order-creation audit entry. It contains only the order summary needed for operations and risk analysis; coupon codes, gateway trade numbers and guest credentials are deliberately absent.
func (*OrderCreated) Marshal ¶ added in v1.20.1
func (o *OrderCreated) Marshal() ([]byte, error)
Marshal encodes the entry as stored, its request bounded.
func (*OrderCreated) Unmarshal ¶ added in v1.20.1
func (o *OrderCreated) Unmarshal(data []byte) error
Unmarshal decodes a stored entry, its request bounded.
type Register ¶
type Register struct {
requestmeta.IPMetadata
AuthMethod string `json:"auth_method"`
Identifier string `json:"identifier"`
RegisterIP string `json:"register_ip"`
UserAgent string `json:"user_agent"`
Timestamp int64 `json:"timestamp"`
ActorID int64 `json:"actor_id,omitempty"`
}
Register represents a registration log entry.
func (*Register) Marshal ¶
Marshal encodes the entry as stored: the identifier redacted, the request bounded.
func (*Register) Request ¶ added in v1.21.0
func (r *Register) Request() requestmeta.Metadata
Request returns the request the registration came from; its address is RegisterIP.
type ResetSubscribe ¶
type ResetSubscribe struct {
requestmeta.Metadata
Type uint16 `json:"type"`
UserId int64 `json:"user_id"`
OrderNo string `json:"order_no,omitempty"`
Timestamp int64 `json:"timestamp"`
}
ResetSubscribe represents a reset subscription log entry.
func (*ResetSubscribe) Marshal ¶
func (r *ResetSubscribe) Marshal() ([]byte, error)
Marshal encodes the entry as stored, its request bounded.
func (*ResetSubscribe) Unmarshal ¶
func (r *ResetSubscribe) Unmarshal(data []byte) error
Unmarshal decodes a stored entry, its request bounded.
type ServerTraffic ¶
type ServerTraffic struct {
requestmeta.Metadata
ServerId int64 `json:"server_id"` // Server ID
Upload int64 `json:"upload"` // Upload traffic in bytes
Download int64 `json:"download"` // Download traffic in bytes
Total int64 `json:"total"` // Total traffic in bytes (Upload + Download)
}
ServerTraffic represents a server traffic log entry.
func (*ServerTraffic) Marshal ¶
func (s *ServerTraffic) Marshal() ([]byte, error)
Marshal encodes the entry as stored, its request bounded.
func (*ServerTraffic) Unmarshal ¶
func (s *ServerTraffic) Unmarshal(data []byte) error
Unmarshal decodes a stored entry, its request bounded.
type ServerTrafficRank ¶
type ServerTrafficRank struct {
Rank map[uint8]ServerTraffic `json:"rank"` // Key is rank ,type is ServerTraffic
}
ServerTrafficRank represents a server traffic rank entry.
func (*ServerTrafficRank) Marshal ¶
func (s *ServerTrafficRank) Marshal() ([]byte, error)
Marshal encodes the ranking as stored, each entry's request bounded.
func (*ServerTrafficRank) Unmarshal ¶
func (s *ServerTrafficRank) Unmarshal(data []byte) error
Unmarshal decodes a stored ranking, each entry's request bounded.
type Subscribe ¶
type Subscribe struct {
requestmeta.IPMetadata
Token string `json:"token"`
UserAgent string `json:"user_agent"`
ClientIP string `json:"client_ip"`
UserSubscribeId int64 `json:"user_subscribe_id"`
ActorID int64 `json:"actor_id,omitempty"`
}
Subscribe represents a subscription log entry.
func (*Subscribe) Marshal ¶
Marshal encodes the entry as stored: the token redacted, the request bounded.
func (*Subscribe) Request ¶ added in v1.21.0
func (s *Subscribe) Request() requestmeta.Metadata
Request returns the request that fetched the subscription.
type SystemLog ¶
type SystemLog struct {
Id int64 `gorm:"primaryKey;AUTO_INCREMENT"`
Type uint8 `` /* 236-byte string literal not displayed */
Date string `gorm:"index:idx_date;type:varchar(20);default:null;comment:Log Date"`
ObjectID int64 `gorm:"index:idx_object_id;type:bigint(20);not null;default:0;comment:Object ID"`
Content string `gorm:"type:text;not null;comment:Log Content"`
CreatedAt time.Time `gorm:"<-:create;comment:Create Time"`
}
SystemLog represents a log entry in the system.
func NewAdminActionLog ¶ added in v1.21.0
func NewAdminActionLog(action AdminAction) (*SystemLog, error)
NewAdminActionLog builds the system log row recording action, dated now. The row's object is the acting administrator (action.ActorID), so the trail of one administrator is an indexed read; the object the action changed is in the content. An unset Source is the HTTP API and an unset Timestamp is now.
type Traffic ¶
Traffic represents a subscription traffic log entry.
type TrafficStat ¶
type TrafficStat struct {
requestmeta.Metadata
Upload int64 `json:"upload"`
Download int64 `json:"download"`
Total int64 `json:"total"`
}
TrafficStat represents a daily traffic statistics log entry.
func (*TrafficStat) Marshal ¶
func (t *TrafficStat) Marshal() ([]byte, error)
Marshal encodes the entry as stored, its request bounded.
func (*TrafficStat) Unmarshal ¶
func (t *TrafficStat) Unmarshal(data []byte) error
Unmarshal decodes a stored entry, its request bounded.
type Type ¶
type Type uint8
const ( TypeEmailMessage Type = 10 // Message log TypeMobileMessage Type = 11 // Mobile message log TypeSubscribe Type = 20 // Subscription log TypeSubscribeTraffic Type = 21 // Subscription traffic log TypeServerTraffic Type = 22 // Server traffic log TypeResetSubscribe Type = 23 // Reset subscription log TypeLogin Type = 30 // Login log TypeRegister Type = 31 // Registration log TypeBalance Type = 32 // Balance log TypeCommission Type = 33 // Commission log TypeGift Type = 34 // Gift log TypeOrderCreated Type = 35 // Order creation audit log TypeUnmatchedPayment Type = 36 // Gateway-confirmed payment that could not settle an order TypeUserTrafficRank Type = 40 // Top 10 User traffic rank log TypeServerTrafficRank Type = 41 // Top 10 Server traffic rank log TypeTrafficStat Type = 42 // Daily traffic statistics log TypeAdminAction Type = 50 // Administrator mutation audit log )
type UnmatchedPayment ¶ added in v1.21.0
type UnmatchedPayment struct {
requestmeta.Metadata
OrderNo string `json:"order_no"`
TradeNo string `json:"trade_no"`
Platform string `json:"platform"`
Amount int64 `json:"amount"`
Currency string `json:"currency"`
Reason string `json:"reason"`
Timestamp int64 `json:"timestamp"`
}
UnmatchedPayment records a payment a gateway confirmed that could not settle its order: the order was already closed or finished, the trade differs from the one bound to it, or the gateway asks for manual review. It is the durable trace an operator refunds from, so it is a financial record and never expires.
func (*UnmatchedPayment) Marshal ¶ added in v1.21.0
func (u *UnmatchedPayment) Marshal() ([]byte, error)
Marshal encodes the entry as stored, its request bounded.
func (*UnmatchedPayment) Unmarshal ¶ added in v1.21.0
func (u *UnmatchedPayment) Unmarshal(data []byte) error
Unmarshal decodes a stored entry, its request bounded.
type UserTraffic ¶
type UserTraffic struct {
requestmeta.Metadata
SubscribeId int64 `json:"subscribe_id"` // Subscribe ID
UserId int64 `json:"user_id"` // User ID
Upload int64 `json:"upload"` // Upload traffic in bytes
Download int64 `json:"download"` // Download traffic in bytes
Total int64 `json:"total"` // Total traffic in bytes (Upload + Download)
}
UserTraffic represents a user traffic log entry.
func (*UserTraffic) Marshal ¶
func (u *UserTraffic) Marshal() ([]byte, error)
Marshal encodes the entry as stored, its request bounded.
func (*UserTraffic) Unmarshal ¶
func (u *UserTraffic) Unmarshal(data []byte) error
Unmarshal decodes a stored entry, its request bounded.
type UserTrafficRank ¶
type UserTrafficRank struct {
Rank map[uint8]UserTraffic `json:"rank"` // Key is rank ,type is UserTraffic
}
UserTrafficRank represents a user traffic rank entry.
func (*UserTrafficRank) Marshal ¶
func (u *UserTrafficRank) Marshal() ([]byte, error)
Marshal encodes the ranking as stored, each entry's request bounded.
func (*UserTrafficRank) Unmarshal ¶
func (u *UserTrafficRank) Unmarshal(data []byte) error
Unmarshal decodes a stored ranking, each entry's request bounded.