166 lines
3.6 KiB
Go
166 lines
3.6 KiB
Go
package loginlog
|
|
|
|
import (
|
|
"bytes"
|
|
"context"
|
|
"fmt"
|
|
"strings"
|
|
"time"
|
|
|
|
"management/internal/erpserver/model/system"
|
|
"management/internal/erpserver/model/system/request"
|
|
"management/internal/erpserver/repository"
|
|
"management/internal/pkg/sqldb"
|
|
|
|
"github.com/drhin/logger"
|
|
)
|
|
|
|
type store struct {
|
|
db *repository.Store
|
|
log *logger.Logger
|
|
}
|
|
|
|
func NewStore(db *repository.Store, log *logger.Logger) system.LoginLogRepository {
|
|
return &store{
|
|
db: db,
|
|
log: log,
|
|
}
|
|
}
|
|
|
|
func (s *store) Create(ctx context.Context, obj *system.LoginLog) error {
|
|
//goland:noinspection ALL
|
|
const q = `
|
|
INSERT INTO sys_user_login_log (
|
|
email, is_success, message, referer_url, url, os, ip, browser
|
|
) VALUES (
|
|
:email, :is_success, :message, :referer_url, :url, :os, :ip, :browser
|
|
)`
|
|
|
|
return sqldb.NamedExecContext(ctx, s.log, s.db.DB(ctx), q, obj)
|
|
}
|
|
|
|
func (s *store) GetLatest(ctx context.Context, email string) ([]*system.LoginLog, error) {
|
|
//goland:noinspection ALL
|
|
const q = `
|
|
SELECT
|
|
id, created_at, email, is_success, message, referer_url, url, os, ip, browser
|
|
FROM
|
|
sys_user_login_log
|
|
WHERE
|
|
email = :email
|
|
ORDER BY
|
|
id DESC
|
|
LIMIT 2;`
|
|
|
|
data := map[string]any{
|
|
"email": email,
|
|
}
|
|
|
|
var logs []system.LoginLog
|
|
err := sqldb.NamedQuerySlice(ctx, s.log, s.db.DB(ctx), q, data, &logs)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return toPointer(logs), nil
|
|
}
|
|
|
|
func (s *store) Count(ctx context.Context, filter request.ListLoginLog) (int64, error) {
|
|
//goland:noinspection ALL
|
|
const q = `
|
|
SELECT
|
|
COUNT(1)
|
|
FROM
|
|
sys_user_login_log`
|
|
|
|
data := map[string]any{}
|
|
|
|
buf := bytes.NewBufferString(q)
|
|
applyFilter(filter, data, buf)
|
|
|
|
var count struct {
|
|
Count int64 `db:"count"`
|
|
}
|
|
|
|
err := sqldb.NamedQueryStruct(ctx, s.log, s.db.DB(ctx), buf.String(), data, &count)
|
|
if err != nil {
|
|
return 0, fmt.Errorf("select count login log: %w", err)
|
|
}
|
|
|
|
return count.Count, nil
|
|
}
|
|
|
|
func (s *store) List(ctx context.Context, filter request.ListLoginLog) ([]*system.LoginLog, error) {
|
|
//goland:noinspection ALL
|
|
const q = `
|
|
SELECT
|
|
id, created_at, email, is_success, message, referer_url, url, os, ip, browser
|
|
FROM
|
|
sys_user_login_log`
|
|
|
|
data := map[string]any{
|
|
"offset": (filter.PageID - 1) * filter.PageSize,
|
|
"rows_per_page": filter.PageSize,
|
|
}
|
|
|
|
buf := bytes.NewBufferString(q)
|
|
applyFilter(filter, data, buf)
|
|
|
|
buf.WriteString(" ORDER BY id DESC")
|
|
buf.WriteString(" LIMIT :rows_per_page OFFSET :offset")
|
|
|
|
var logs []system.LoginLog
|
|
err := sqldb.NamedQuerySlice(ctx, s.log, s.db.DB(ctx), buf.String(), data, &logs)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return toPointer(logs), nil
|
|
}
|
|
|
|
func (s *store) HistoricalLogin(ctx context.Context, email string, createdAt time.Time) ([]*system.LoginLog, error) {
|
|
//goland:noinspection ALL
|
|
const q = `
|
|
SELECT
|
|
id, created_at, email, is_success, message, referer_url, url, os, ip, browser
|
|
FROM
|
|
sys_user_login_log`
|
|
|
|
data := map[string]any{
|
|
"rows_per_page": 20,
|
|
}
|
|
|
|
buf := bytes.NewBufferString(q)
|
|
|
|
var wc []string
|
|
|
|
data["created_at"] = createdAt.Format(time.DateTime)
|
|
wc = append(wc, "created_at < :created_at")
|
|
|
|
if email != "" {
|
|
data["email"] = email
|
|
wc = append(wc, "email = :email")
|
|
}
|
|
|
|
if len(wc) > 0 {
|
|
buf.WriteString(" WHERE ")
|
|
buf.WriteString(strings.Join(wc, " AND "))
|
|
}
|
|
|
|
buf.WriteString(" ORDER BY created_at DESC ")
|
|
buf.WriteString(" LIMIT :rows_per_page")
|
|
|
|
var logs []system.LoginLog
|
|
err := sqldb.NamedQuerySlice(ctx, s.log, s.db.DB(ctx), buf.String(), data, &logs)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return toPointer(logs), nil
|
|
}
|
|
|
|
func toPointer(data []system.LoginLog) []*system.LoginLog {
|
|
var res []*system.LoginLog
|
|
for _, v := range data {
|
|
res = append(res, &v)
|
|
}
|
|
return res
|
|
}
|