feat(user): 记录登录历史

This commit is contained in:
yokowu
2025-07-16 18:32:36 +08:00
parent 3ec45bc780
commit 97524b1ffe
37 changed files with 1792 additions and 360 deletions

1
.gitattributes vendored Normal file
View File

@@ -0,0 +1 @@
*.xdb filter=lfs diff=lfs merge=lfs -text

View File

@@ -32,6 +32,7 @@ import (
repo5 "github.com/chaitin/MonkeyCode/backend/internal/user/repo"
usecase4 "github.com/chaitin/MonkeyCode/backend/internal/user/usecase"
"github.com/chaitin/MonkeyCode/backend/pkg"
"github.com/chaitin/MonkeyCode/backend/pkg/ipdb"
"github.com/chaitin/MonkeyCode/backend/pkg/logger"
"github.com/chaitin/MonkeyCode/backend/pkg/session"
"github.com/chaitin/MonkeyCode/backend/pkg/store"
@@ -68,7 +69,11 @@ func newServer() (*Server, error) {
sessionSession := session.NewSession(configConfig)
authMiddleware := middleware.NewAuthMiddleware(sessionSession, slogLogger)
modelHandler := v1_2.NewModelHandler(web, modelUsecase, authMiddleware, slogLogger)
userRepo := repo5.NewUserRepo(client)
ipdbIPDB, err := ipdb.NewIPDB(slogLogger)
if err != nil {
return nil, err
}
userRepo := repo5.NewUserRepo(client, ipdbIPDB)
userUsecase := usecase4.NewUserUsecase(configConfig, redisClient, userRepo, slogLogger)
userHandler := v1_3.NewUserHandler(web, userUsecase, extensionUsecase, authMiddleware, sessionSession, slogLogger, configConfig)
dashboardRepo := repo6.NewDashboardRepo(client)

17
backend/consts/os.go Normal file
View File

@@ -0,0 +1,17 @@
package consts
import "strings"
type OSType string
func (o OSType) Name() string {
if strings.HasPrefix(string(o), "Windows") {
return "Windows"
}
if strings.HasPrefix(string(o), "Darwin") {
return "MacOS"
}
return string(o)
}
type OSRelease string

View File

@@ -36,7 +36,7 @@ const (
// It exists in this package in order to avoid circular dependency with the "adminloginhistory" package.
LoginHistoriesInverseTable = "admin_login_histories"
// LoginHistoriesColumn is the table column denoting the login_histories relation/edge.
LoginHistoriesColumn = "admin_login_histories"
LoginHistoriesColumn = "admin_id"
)
// Columns holds all SQL columns for admin fields.

View File

@@ -420,7 +420,9 @@ func (aq *AdminQuery) loadLoginHistories(ctx context.Context, query *AdminLoginH
init(nodes[i])
}
}
query.withFKs = true
if len(query.ctx.Fields) > 0 {
query.ctx.AppendFieldOnce(adminloginhistory.FieldAdminID)
}
query.Where(predicate.AdminLoginHistory(func(s *sql.Selector) {
s.Where(sql.InValues(s.C(admin.LoginHistoriesColumn), fks...))
}))
@@ -429,13 +431,10 @@ func (aq *AdminQuery) loadLoginHistories(ctx context.Context, query *AdminLoginH
return err
}
for _, n := range neighbors {
fk := n.admin_login_histories
if fk == nil {
return fmt.Errorf(`foreign-key "admin_login_histories" is nil for node %v`, n.ID)
}
node, ok := nodeids[*fk]
fk := n.AdminID
node, ok := nodeids[fk]
if !ok {
return fmt.Errorf(`unexpected referenced foreign-key "admin_login_histories" returned %v for node %v`, *fk, n.ID)
return fmt.Errorf(`unexpected referenced foreign-key "admin_id" returned %v for node %v`, fk, n.ID)
}
assign(node, n)
}

View File

@@ -41,9 +41,8 @@ type AdminLoginHistory struct {
CreatedAt time.Time `json:"created_at,omitempty"`
// Edges holds the relations/edges for other nodes in the graph.
// The values are being populated by the AdminLoginHistoryQuery when eager-loading is set.
Edges AdminLoginHistoryEdges `json:"edges"`
admin_login_histories *uuid.UUID
selectValues sql.SelectValues
Edges AdminLoginHistoryEdges `json:"edges"`
selectValues sql.SelectValues
}
// AdminLoginHistoryEdges holds the relations/edges for other nodes in the graph.
@@ -77,8 +76,6 @@ func (*AdminLoginHistory) scanValues(columns []string) ([]any, error) {
values[i] = new(sql.NullTime)
case adminloginhistory.FieldID, adminloginhistory.FieldAdminID:
values[i] = new(uuid.UUID)
case adminloginhistory.ForeignKeys[0]: // admin_login_histories
values[i] = &sql.NullScanner{S: new(uuid.UUID)}
default:
values[i] = new(sql.UnknownType)
}
@@ -160,13 +157,6 @@ func (alh *AdminLoginHistory) assignValues(columns []string, values []any) error
} else if value.Valid {
alh.CreatedAt = value.Time
}
case adminloginhistory.ForeignKeys[0]:
if value, ok := values[i].(*sql.NullScanner); !ok {
return fmt.Errorf("unexpected type %T for field admin_login_histories", values[i])
} else if value.Valid {
alh.admin_login_histories = new(uuid.UUID)
*alh.admin_login_histories = *value.S.(*uuid.UUID)
}
default:
alh.selectValues.Set(columns[i], values[i])
}

View File

@@ -44,7 +44,7 @@ const (
// It exists in this package in order to avoid circular dependency with the "admin" package.
OwnerInverseTable = "admins"
// OwnerColumn is the table column denoting the owner relation/edge.
OwnerColumn = "admin_login_histories"
OwnerColumn = "admin_id"
)
// Columns holds all SQL columns for adminloginhistory fields.
@@ -62,12 +62,6 @@ var Columns = []string{
FieldCreatedAt,
}
// ForeignKeys holds the SQL foreign-keys that are owned by the "admin_login_histories"
// table and are not defined as standalone fields in the schema.
var ForeignKeys = []string{
"admin_login_histories",
}
// ValidColumn reports if the column name is valid (part of the table columns).
func ValidColumn(column string) bool {
for i := range Columns {
@@ -75,11 +69,6 @@ func ValidColumn(column string) bool {
return true
}
}
for i := range ForeignKeys {
if column == ForeignKeys[i] {
return true
}
}
return false
}

View File

@@ -126,24 +126,14 @@ func AdminIDNotIn(vs ...uuid.UUID) predicate.AdminLoginHistory {
return predicate.AdminLoginHistory(sql.FieldNotIn(FieldAdminID, vs...))
}
// AdminIDGT applies the GT predicate on the "admin_id" field.
func AdminIDGT(v uuid.UUID) predicate.AdminLoginHistory {
return predicate.AdminLoginHistory(sql.FieldGT(FieldAdminID, v))
// AdminIDIsNil applies the IsNil predicate on the "admin_id" field.
func AdminIDIsNil() predicate.AdminLoginHistory {
return predicate.AdminLoginHistory(sql.FieldIsNull(FieldAdminID))
}
// AdminIDGTE applies the GTE predicate on the "admin_id" field.
func AdminIDGTE(v uuid.UUID) predicate.AdminLoginHistory {
return predicate.AdminLoginHistory(sql.FieldGTE(FieldAdminID, v))
}
// AdminIDLT applies the LT predicate on the "admin_id" field.
func AdminIDLT(v uuid.UUID) predicate.AdminLoginHistory {
return predicate.AdminLoginHistory(sql.FieldLT(FieldAdminID, v))
}
// AdminIDLTE applies the LTE predicate on the "admin_id" field.
func AdminIDLTE(v uuid.UUID) predicate.AdminLoginHistory {
return predicate.AdminLoginHistory(sql.FieldLTE(FieldAdminID, v))
// AdminIDNotNil applies the NotNil predicate on the "admin_id" field.
func AdminIDNotNil() predicate.AdminLoginHistory {
return predicate.AdminLoginHistory(sql.FieldNotNull(FieldAdminID))
}
// IPEQ applies the EQ predicate on the "ip" field.
@@ -461,6 +451,16 @@ func IspHasSuffix(v string) predicate.AdminLoginHistory {
return predicate.AdminLoginHistory(sql.FieldHasSuffix(FieldIsp, v))
}
// IspIsNil applies the IsNil predicate on the "isp" field.
func IspIsNil() predicate.AdminLoginHistory {
return predicate.AdminLoginHistory(sql.FieldIsNull(FieldIsp))
}
// IspNotNil applies the NotNil predicate on the "isp" field.
func IspNotNil() predicate.AdminLoginHistory {
return predicate.AdminLoginHistory(sql.FieldNotNull(FieldIsp))
}
// IspEqualFold applies the EqualFold predicate on the "isp" field.
func IspEqualFold(v string) predicate.AdminLoginHistory {
return predicate.AdminLoginHistory(sql.FieldEqualFold(FieldIsp, v))
@@ -526,6 +526,16 @@ func AsnHasSuffix(v string) predicate.AdminLoginHistory {
return predicate.AdminLoginHistory(sql.FieldHasSuffix(FieldAsn, v))
}
// AsnIsNil applies the IsNil predicate on the "asn" field.
func AsnIsNil() predicate.AdminLoginHistory {
return predicate.AdminLoginHistory(sql.FieldIsNull(FieldAsn))
}
// AsnNotNil applies the NotNil predicate on the "asn" field.
func AsnNotNil() predicate.AdminLoginHistory {
return predicate.AdminLoginHistory(sql.FieldNotNull(FieldAsn))
}
// AsnEqualFold applies the EqualFold predicate on the "asn" field.
func AsnEqualFold(v string) predicate.AdminLoginHistory {
return predicate.AdminLoginHistory(sql.FieldEqualFold(FieldAsn, v))
@@ -591,6 +601,16 @@ func ClientVersionHasSuffix(v string) predicate.AdminLoginHistory {
return predicate.AdminLoginHistory(sql.FieldHasSuffix(FieldClientVersion, v))
}
// ClientVersionIsNil applies the IsNil predicate on the "client_version" field.
func ClientVersionIsNil() predicate.AdminLoginHistory {
return predicate.AdminLoginHistory(sql.FieldIsNull(FieldClientVersion))
}
// ClientVersionNotNil applies the NotNil predicate on the "client_version" field.
func ClientVersionNotNil() predicate.AdminLoginHistory {
return predicate.AdminLoginHistory(sql.FieldNotNull(FieldClientVersion))
}
// ClientVersionEqualFold applies the EqualFold predicate on the "client_version" field.
func ClientVersionEqualFold(v string) predicate.AdminLoginHistory {
return predicate.AdminLoginHistory(sql.FieldEqualFold(FieldClientVersion, v))
@@ -656,6 +676,16 @@ func DeviceHasSuffix(v string) predicate.AdminLoginHistory {
return predicate.AdminLoginHistory(sql.FieldHasSuffix(FieldDevice, v))
}
// DeviceIsNil applies the IsNil predicate on the "device" field.
func DeviceIsNil() predicate.AdminLoginHistory {
return predicate.AdminLoginHistory(sql.FieldIsNull(FieldDevice))
}
// DeviceNotNil applies the NotNil predicate on the "device" field.
func DeviceNotNil() predicate.AdminLoginHistory {
return predicate.AdminLoginHistory(sql.FieldNotNull(FieldDevice))
}
// DeviceEqualFold applies the EqualFold predicate on the "device" field.
func DeviceEqualFold(v string) predicate.AdminLoginHistory {
return predicate.AdminLoginHistory(sql.FieldEqualFold(FieldDevice, v))

View File

@@ -31,6 +31,14 @@ func (alhc *AdminLoginHistoryCreate) SetAdminID(u uuid.UUID) *AdminLoginHistoryC
return alhc
}
// SetNillableAdminID sets the "admin_id" field if the given value is not nil.
func (alhc *AdminLoginHistoryCreate) SetNillableAdminID(u *uuid.UUID) *AdminLoginHistoryCreate {
if u != nil {
alhc.SetAdminID(*u)
}
return alhc
}
// SetIP sets the "ip" field.
func (alhc *AdminLoginHistoryCreate) SetIP(s string) *AdminLoginHistoryCreate {
alhc.mutation.SetIP(s)
@@ -61,24 +69,56 @@ func (alhc *AdminLoginHistoryCreate) SetIsp(s string) *AdminLoginHistoryCreate {
return alhc
}
// SetNillableIsp sets the "isp" field if the given value is not nil.
func (alhc *AdminLoginHistoryCreate) SetNillableIsp(s *string) *AdminLoginHistoryCreate {
if s != nil {
alhc.SetIsp(*s)
}
return alhc
}
// SetAsn sets the "asn" field.
func (alhc *AdminLoginHistoryCreate) SetAsn(s string) *AdminLoginHistoryCreate {
alhc.mutation.SetAsn(s)
return alhc
}
// SetNillableAsn sets the "asn" field if the given value is not nil.
func (alhc *AdminLoginHistoryCreate) SetNillableAsn(s *string) *AdminLoginHistoryCreate {
if s != nil {
alhc.SetAsn(*s)
}
return alhc
}
// SetClientVersion sets the "client_version" field.
func (alhc *AdminLoginHistoryCreate) SetClientVersion(s string) *AdminLoginHistoryCreate {
alhc.mutation.SetClientVersion(s)
return alhc
}
// SetNillableClientVersion sets the "client_version" field if the given value is not nil.
func (alhc *AdminLoginHistoryCreate) SetNillableClientVersion(s *string) *AdminLoginHistoryCreate {
if s != nil {
alhc.SetClientVersion(*s)
}
return alhc
}
// SetDevice sets the "device" field.
func (alhc *AdminLoginHistoryCreate) SetDevice(s string) *AdminLoginHistoryCreate {
alhc.mutation.SetDevice(s)
return alhc
}
// SetNillableDevice sets the "device" field if the given value is not nil.
func (alhc *AdminLoginHistoryCreate) SetNillableDevice(s *string) *AdminLoginHistoryCreate {
if s != nil {
alhc.SetDevice(*s)
}
return alhc
}
// SetCreatedAt sets the "created_at" field.
func (alhc *AdminLoginHistoryCreate) SetCreatedAt(t time.Time) *AdminLoginHistoryCreate {
alhc.mutation.SetCreatedAt(t)
@@ -161,9 +201,6 @@ func (alhc *AdminLoginHistoryCreate) defaults() {
// check runs all checks and user-defined validators on the builder.
func (alhc *AdminLoginHistoryCreate) check() error {
if _, ok := alhc.mutation.AdminID(); !ok {
return &ValidationError{Name: "admin_id", err: errors.New(`db: missing required field "AdminLoginHistory.admin_id"`)}
}
if _, ok := alhc.mutation.IP(); !ok {
return &ValidationError{Name: "ip", err: errors.New(`db: missing required field "AdminLoginHistory.ip"`)}
}
@@ -176,18 +213,6 @@ func (alhc *AdminLoginHistoryCreate) check() error {
if _, ok := alhc.mutation.City(); !ok {
return &ValidationError{Name: "city", err: errors.New(`db: missing required field "AdminLoginHistory.city"`)}
}
if _, ok := alhc.mutation.Isp(); !ok {
return &ValidationError{Name: "isp", err: errors.New(`db: missing required field "AdminLoginHistory.isp"`)}
}
if _, ok := alhc.mutation.Asn(); !ok {
return &ValidationError{Name: "asn", err: errors.New(`db: missing required field "AdminLoginHistory.asn"`)}
}
if _, ok := alhc.mutation.ClientVersion(); !ok {
return &ValidationError{Name: "client_version", err: errors.New(`db: missing required field "AdminLoginHistory.client_version"`)}
}
if _, ok := alhc.mutation.Device(); !ok {
return &ValidationError{Name: "device", err: errors.New(`db: missing required field "AdminLoginHistory.device"`)}
}
if _, ok := alhc.mutation.CreatedAt(); !ok {
return &ValidationError{Name: "created_at", err: errors.New(`db: missing required field "AdminLoginHistory.created_at"`)}
}
@@ -227,10 +252,6 @@ func (alhc *AdminLoginHistoryCreate) createSpec() (*AdminLoginHistory, *sqlgraph
_node.ID = id
_spec.ID.Value = &id
}
if value, ok := alhc.mutation.AdminID(); ok {
_spec.SetField(adminloginhistory.FieldAdminID, field.TypeUUID, value)
_node.AdminID = value
}
if value, ok := alhc.mutation.IP(); ok {
_spec.SetField(adminloginhistory.FieldIP, field.TypeString, value)
_node.IP = value
@@ -281,7 +302,7 @@ func (alhc *AdminLoginHistoryCreate) createSpec() (*AdminLoginHistory, *sqlgraph
for _, k := range nodes {
edge.Target.Nodes = append(edge.Target.Nodes, k)
}
_node.admin_login_histories = &nodes[0]
_node.AdminID = nodes[0]
_spec.Edges = append(_spec.Edges, edge)
}
return _node, _spec
@@ -348,6 +369,12 @@ func (u *AdminLoginHistoryUpsert) UpdateAdminID() *AdminLoginHistoryUpsert {
return u
}
// ClearAdminID clears the value of the "admin_id" field.
func (u *AdminLoginHistoryUpsert) ClearAdminID() *AdminLoginHistoryUpsert {
u.SetNull(adminloginhistory.FieldAdminID)
return u
}
// SetIP sets the "ip" field.
func (u *AdminLoginHistoryUpsert) SetIP(v string) *AdminLoginHistoryUpsert {
u.Set(adminloginhistory.FieldIP, v)
@@ -408,6 +435,12 @@ func (u *AdminLoginHistoryUpsert) UpdateIsp() *AdminLoginHistoryUpsert {
return u
}
// ClearIsp clears the value of the "isp" field.
func (u *AdminLoginHistoryUpsert) ClearIsp() *AdminLoginHistoryUpsert {
u.SetNull(adminloginhistory.FieldIsp)
return u
}
// SetAsn sets the "asn" field.
func (u *AdminLoginHistoryUpsert) SetAsn(v string) *AdminLoginHistoryUpsert {
u.Set(adminloginhistory.FieldAsn, v)
@@ -420,6 +453,12 @@ func (u *AdminLoginHistoryUpsert) UpdateAsn() *AdminLoginHistoryUpsert {
return u
}
// ClearAsn clears the value of the "asn" field.
func (u *AdminLoginHistoryUpsert) ClearAsn() *AdminLoginHistoryUpsert {
u.SetNull(adminloginhistory.FieldAsn)
return u
}
// SetClientVersion sets the "client_version" field.
func (u *AdminLoginHistoryUpsert) SetClientVersion(v string) *AdminLoginHistoryUpsert {
u.Set(adminloginhistory.FieldClientVersion, v)
@@ -432,6 +471,12 @@ func (u *AdminLoginHistoryUpsert) UpdateClientVersion() *AdminLoginHistoryUpsert
return u
}
// ClearClientVersion clears the value of the "client_version" field.
func (u *AdminLoginHistoryUpsert) ClearClientVersion() *AdminLoginHistoryUpsert {
u.SetNull(adminloginhistory.FieldClientVersion)
return u
}
// SetDevice sets the "device" field.
func (u *AdminLoginHistoryUpsert) SetDevice(v string) *AdminLoginHistoryUpsert {
u.Set(adminloginhistory.FieldDevice, v)
@@ -444,6 +489,12 @@ func (u *AdminLoginHistoryUpsert) UpdateDevice() *AdminLoginHistoryUpsert {
return u
}
// ClearDevice clears the value of the "device" field.
func (u *AdminLoginHistoryUpsert) ClearDevice() *AdminLoginHistoryUpsert {
u.SetNull(adminloginhistory.FieldDevice)
return u
}
// SetCreatedAt sets the "created_at" field.
func (u *AdminLoginHistoryUpsert) SetCreatedAt(v time.Time) *AdminLoginHistoryUpsert {
u.Set(adminloginhistory.FieldCreatedAt, v)
@@ -518,6 +569,13 @@ func (u *AdminLoginHistoryUpsertOne) UpdateAdminID() *AdminLoginHistoryUpsertOne
})
}
// ClearAdminID clears the value of the "admin_id" field.
func (u *AdminLoginHistoryUpsertOne) ClearAdminID() *AdminLoginHistoryUpsertOne {
return u.Update(func(s *AdminLoginHistoryUpsert) {
s.ClearAdminID()
})
}
// SetIP sets the "ip" field.
func (u *AdminLoginHistoryUpsertOne) SetIP(v string) *AdminLoginHistoryUpsertOne {
return u.Update(func(s *AdminLoginHistoryUpsert) {
@@ -588,6 +646,13 @@ func (u *AdminLoginHistoryUpsertOne) UpdateIsp() *AdminLoginHistoryUpsertOne {
})
}
// ClearIsp clears the value of the "isp" field.
func (u *AdminLoginHistoryUpsertOne) ClearIsp() *AdminLoginHistoryUpsertOne {
return u.Update(func(s *AdminLoginHistoryUpsert) {
s.ClearIsp()
})
}
// SetAsn sets the "asn" field.
func (u *AdminLoginHistoryUpsertOne) SetAsn(v string) *AdminLoginHistoryUpsertOne {
return u.Update(func(s *AdminLoginHistoryUpsert) {
@@ -602,6 +667,13 @@ func (u *AdminLoginHistoryUpsertOne) UpdateAsn() *AdminLoginHistoryUpsertOne {
})
}
// ClearAsn clears the value of the "asn" field.
func (u *AdminLoginHistoryUpsertOne) ClearAsn() *AdminLoginHistoryUpsertOne {
return u.Update(func(s *AdminLoginHistoryUpsert) {
s.ClearAsn()
})
}
// SetClientVersion sets the "client_version" field.
func (u *AdminLoginHistoryUpsertOne) SetClientVersion(v string) *AdminLoginHistoryUpsertOne {
return u.Update(func(s *AdminLoginHistoryUpsert) {
@@ -616,6 +688,13 @@ func (u *AdminLoginHistoryUpsertOne) UpdateClientVersion() *AdminLoginHistoryUps
})
}
// ClearClientVersion clears the value of the "client_version" field.
func (u *AdminLoginHistoryUpsertOne) ClearClientVersion() *AdminLoginHistoryUpsertOne {
return u.Update(func(s *AdminLoginHistoryUpsert) {
s.ClearClientVersion()
})
}
// SetDevice sets the "device" field.
func (u *AdminLoginHistoryUpsertOne) SetDevice(v string) *AdminLoginHistoryUpsertOne {
return u.Update(func(s *AdminLoginHistoryUpsert) {
@@ -630,6 +709,13 @@ func (u *AdminLoginHistoryUpsertOne) UpdateDevice() *AdminLoginHistoryUpsertOne
})
}
// ClearDevice clears the value of the "device" field.
func (u *AdminLoginHistoryUpsertOne) ClearDevice() *AdminLoginHistoryUpsertOne {
return u.Update(func(s *AdminLoginHistoryUpsert) {
s.ClearDevice()
})
}
// SetCreatedAt sets the "created_at" field.
func (u *AdminLoginHistoryUpsertOne) SetCreatedAt(v time.Time) *AdminLoginHistoryUpsertOne {
return u.Update(func(s *AdminLoginHistoryUpsert) {
@@ -873,6 +959,13 @@ func (u *AdminLoginHistoryUpsertBulk) UpdateAdminID() *AdminLoginHistoryUpsertBu
})
}
// ClearAdminID clears the value of the "admin_id" field.
func (u *AdminLoginHistoryUpsertBulk) ClearAdminID() *AdminLoginHistoryUpsertBulk {
return u.Update(func(s *AdminLoginHistoryUpsert) {
s.ClearAdminID()
})
}
// SetIP sets the "ip" field.
func (u *AdminLoginHistoryUpsertBulk) SetIP(v string) *AdminLoginHistoryUpsertBulk {
return u.Update(func(s *AdminLoginHistoryUpsert) {
@@ -943,6 +1036,13 @@ func (u *AdminLoginHistoryUpsertBulk) UpdateIsp() *AdminLoginHistoryUpsertBulk {
})
}
// ClearIsp clears the value of the "isp" field.
func (u *AdminLoginHistoryUpsertBulk) ClearIsp() *AdminLoginHistoryUpsertBulk {
return u.Update(func(s *AdminLoginHistoryUpsert) {
s.ClearIsp()
})
}
// SetAsn sets the "asn" field.
func (u *AdminLoginHistoryUpsertBulk) SetAsn(v string) *AdminLoginHistoryUpsertBulk {
return u.Update(func(s *AdminLoginHistoryUpsert) {
@@ -957,6 +1057,13 @@ func (u *AdminLoginHistoryUpsertBulk) UpdateAsn() *AdminLoginHistoryUpsertBulk {
})
}
// ClearAsn clears the value of the "asn" field.
func (u *AdminLoginHistoryUpsertBulk) ClearAsn() *AdminLoginHistoryUpsertBulk {
return u.Update(func(s *AdminLoginHistoryUpsert) {
s.ClearAsn()
})
}
// SetClientVersion sets the "client_version" field.
func (u *AdminLoginHistoryUpsertBulk) SetClientVersion(v string) *AdminLoginHistoryUpsertBulk {
return u.Update(func(s *AdminLoginHistoryUpsert) {
@@ -971,6 +1078,13 @@ func (u *AdminLoginHistoryUpsertBulk) UpdateClientVersion() *AdminLoginHistoryUp
})
}
// ClearClientVersion clears the value of the "client_version" field.
func (u *AdminLoginHistoryUpsertBulk) ClearClientVersion() *AdminLoginHistoryUpsertBulk {
return u.Update(func(s *AdminLoginHistoryUpsert) {
s.ClearClientVersion()
})
}
// SetDevice sets the "device" field.
func (u *AdminLoginHistoryUpsertBulk) SetDevice(v string) *AdminLoginHistoryUpsertBulk {
return u.Update(func(s *AdminLoginHistoryUpsert) {
@@ -985,6 +1099,13 @@ func (u *AdminLoginHistoryUpsertBulk) UpdateDevice() *AdminLoginHistoryUpsertBul
})
}
// ClearDevice clears the value of the "device" field.
func (u *AdminLoginHistoryUpsertBulk) ClearDevice() *AdminLoginHistoryUpsertBulk {
return u.Update(func(s *AdminLoginHistoryUpsert) {
s.ClearDevice()
})
}
// SetCreatedAt sets the "created_at" field.
func (u *AdminLoginHistoryUpsertBulk) SetCreatedAt(v time.Time) *AdminLoginHistoryUpsertBulk {
return u.Update(func(s *AdminLoginHistoryUpsert) {

View File

@@ -26,7 +26,6 @@ type AdminLoginHistoryQuery struct {
inters []Interceptor
predicates []predicate.AdminLoginHistory
withOwner *AdminQuery
withFKs bool
modifiers []func(*sql.Selector)
// intermediate query (i.e. traversal path).
sql *sql.Selector
@@ -374,18 +373,11 @@ func (alhq *AdminLoginHistoryQuery) prepareQuery(ctx context.Context) error {
func (alhq *AdminLoginHistoryQuery) sqlAll(ctx context.Context, hooks ...queryHook) ([]*AdminLoginHistory, error) {
var (
nodes = []*AdminLoginHistory{}
withFKs = alhq.withFKs
_spec = alhq.querySpec()
loadedTypes = [1]bool{
alhq.withOwner != nil,
}
)
if alhq.withOwner != nil {
withFKs = true
}
if withFKs {
_spec.Node.Columns = append(_spec.Node.Columns, adminloginhistory.ForeignKeys...)
}
_spec.ScanValues = func(columns []string) ([]any, error) {
return (*AdminLoginHistory).scanValues(nil, columns)
}
@@ -420,10 +412,7 @@ func (alhq *AdminLoginHistoryQuery) loadOwner(ctx context.Context, query *AdminQ
ids := make([]uuid.UUID, 0, len(nodes))
nodeids := make(map[uuid.UUID][]*AdminLoginHistory)
for i := range nodes {
if nodes[i].admin_login_histories == nil {
continue
}
fk := *nodes[i].admin_login_histories
fk := nodes[i].AdminID
if _, ok := nodeids[fk]; !ok {
ids = append(ids, fk)
}
@@ -440,7 +429,7 @@ func (alhq *AdminLoginHistoryQuery) loadOwner(ctx context.Context, query *AdminQ
for _, n := range neighbors {
nodes, ok := nodeids[n.ID]
if !ok {
return fmt.Errorf(`unexpected foreign-key "admin_login_histories" returned %v`, n.ID)
return fmt.Errorf(`unexpected foreign-key "admin_id" returned %v`, n.ID)
}
for i := range nodes {
assign(nodes[i], n)
@@ -477,6 +466,9 @@ func (alhq *AdminLoginHistoryQuery) querySpec() *sqlgraph.QuerySpec {
_spec.Node.Columns = append(_spec.Node.Columns, fields[i])
}
}
if alhq.withOwner != nil {
_spec.Node.AddColumnOnce(adminloginhistory.FieldAdminID)
}
}
if ps := alhq.predicates; len(ps) > 0 {
_spec.Predicate = func(selector *sql.Selector) {

View File

@@ -45,6 +45,12 @@ func (alhu *AdminLoginHistoryUpdate) SetNillableAdminID(u *uuid.UUID) *AdminLogi
return alhu
}
// ClearAdminID clears the value of the "admin_id" field.
func (alhu *AdminLoginHistoryUpdate) ClearAdminID() *AdminLoginHistoryUpdate {
alhu.mutation.ClearAdminID()
return alhu
}
// SetIP sets the "ip" field.
func (alhu *AdminLoginHistoryUpdate) SetIP(s string) *AdminLoginHistoryUpdate {
alhu.mutation.SetIP(s)
@@ -115,6 +121,12 @@ func (alhu *AdminLoginHistoryUpdate) SetNillableIsp(s *string) *AdminLoginHistor
return alhu
}
// ClearIsp clears the value of the "isp" field.
func (alhu *AdminLoginHistoryUpdate) ClearIsp() *AdminLoginHistoryUpdate {
alhu.mutation.ClearIsp()
return alhu
}
// SetAsn sets the "asn" field.
func (alhu *AdminLoginHistoryUpdate) SetAsn(s string) *AdminLoginHistoryUpdate {
alhu.mutation.SetAsn(s)
@@ -129,6 +141,12 @@ func (alhu *AdminLoginHistoryUpdate) SetNillableAsn(s *string) *AdminLoginHistor
return alhu
}
// ClearAsn clears the value of the "asn" field.
func (alhu *AdminLoginHistoryUpdate) ClearAsn() *AdminLoginHistoryUpdate {
alhu.mutation.ClearAsn()
return alhu
}
// SetClientVersion sets the "client_version" field.
func (alhu *AdminLoginHistoryUpdate) SetClientVersion(s string) *AdminLoginHistoryUpdate {
alhu.mutation.SetClientVersion(s)
@@ -143,6 +161,12 @@ func (alhu *AdminLoginHistoryUpdate) SetNillableClientVersion(s *string) *AdminL
return alhu
}
// ClearClientVersion clears the value of the "client_version" field.
func (alhu *AdminLoginHistoryUpdate) ClearClientVersion() *AdminLoginHistoryUpdate {
alhu.mutation.ClearClientVersion()
return alhu
}
// SetDevice sets the "device" field.
func (alhu *AdminLoginHistoryUpdate) SetDevice(s string) *AdminLoginHistoryUpdate {
alhu.mutation.SetDevice(s)
@@ -157,6 +181,12 @@ func (alhu *AdminLoginHistoryUpdate) SetNillableDevice(s *string) *AdminLoginHis
return alhu
}
// ClearDevice clears the value of the "device" field.
func (alhu *AdminLoginHistoryUpdate) ClearDevice() *AdminLoginHistoryUpdate {
alhu.mutation.ClearDevice()
return alhu
}
// SetCreatedAt sets the "created_at" field.
func (alhu *AdminLoginHistoryUpdate) SetCreatedAt(t time.Time) *AdminLoginHistoryUpdate {
alhu.mutation.SetCreatedAt(t)
@@ -243,9 +273,6 @@ func (alhu *AdminLoginHistoryUpdate) sqlSave(ctx context.Context) (n int, err er
}
}
}
if value, ok := alhu.mutation.AdminID(); ok {
_spec.SetField(adminloginhistory.FieldAdminID, field.TypeUUID, value)
}
if value, ok := alhu.mutation.IP(); ok {
_spec.SetField(adminloginhistory.FieldIP, field.TypeString, value)
}
@@ -261,15 +288,27 @@ func (alhu *AdminLoginHistoryUpdate) sqlSave(ctx context.Context) (n int, err er
if value, ok := alhu.mutation.Isp(); ok {
_spec.SetField(adminloginhistory.FieldIsp, field.TypeString, value)
}
if alhu.mutation.IspCleared() {
_spec.ClearField(adminloginhistory.FieldIsp, field.TypeString)
}
if value, ok := alhu.mutation.Asn(); ok {
_spec.SetField(adminloginhistory.FieldAsn, field.TypeString, value)
}
if alhu.mutation.AsnCleared() {
_spec.ClearField(adminloginhistory.FieldAsn, field.TypeString)
}
if value, ok := alhu.mutation.ClientVersion(); ok {
_spec.SetField(adminloginhistory.FieldClientVersion, field.TypeString, value)
}
if alhu.mutation.ClientVersionCleared() {
_spec.ClearField(adminloginhistory.FieldClientVersion, field.TypeString)
}
if value, ok := alhu.mutation.Device(); ok {
_spec.SetField(adminloginhistory.FieldDevice, field.TypeString, value)
}
if alhu.mutation.DeviceCleared() {
_spec.ClearField(adminloginhistory.FieldDevice, field.TypeString)
}
if value, ok := alhu.mutation.CreatedAt(); ok {
_spec.SetField(adminloginhistory.FieldCreatedAt, field.TypeTime, value)
}
@@ -338,6 +377,12 @@ func (alhuo *AdminLoginHistoryUpdateOne) SetNillableAdminID(u *uuid.UUID) *Admin
return alhuo
}
// ClearAdminID clears the value of the "admin_id" field.
func (alhuo *AdminLoginHistoryUpdateOne) ClearAdminID() *AdminLoginHistoryUpdateOne {
alhuo.mutation.ClearAdminID()
return alhuo
}
// SetIP sets the "ip" field.
func (alhuo *AdminLoginHistoryUpdateOne) SetIP(s string) *AdminLoginHistoryUpdateOne {
alhuo.mutation.SetIP(s)
@@ -408,6 +453,12 @@ func (alhuo *AdminLoginHistoryUpdateOne) SetNillableIsp(s *string) *AdminLoginHi
return alhuo
}
// ClearIsp clears the value of the "isp" field.
func (alhuo *AdminLoginHistoryUpdateOne) ClearIsp() *AdminLoginHistoryUpdateOne {
alhuo.mutation.ClearIsp()
return alhuo
}
// SetAsn sets the "asn" field.
func (alhuo *AdminLoginHistoryUpdateOne) SetAsn(s string) *AdminLoginHistoryUpdateOne {
alhuo.mutation.SetAsn(s)
@@ -422,6 +473,12 @@ func (alhuo *AdminLoginHistoryUpdateOne) SetNillableAsn(s *string) *AdminLoginHi
return alhuo
}
// ClearAsn clears the value of the "asn" field.
func (alhuo *AdminLoginHistoryUpdateOne) ClearAsn() *AdminLoginHistoryUpdateOne {
alhuo.mutation.ClearAsn()
return alhuo
}
// SetClientVersion sets the "client_version" field.
func (alhuo *AdminLoginHistoryUpdateOne) SetClientVersion(s string) *AdminLoginHistoryUpdateOne {
alhuo.mutation.SetClientVersion(s)
@@ -436,6 +493,12 @@ func (alhuo *AdminLoginHistoryUpdateOne) SetNillableClientVersion(s *string) *Ad
return alhuo
}
// ClearClientVersion clears the value of the "client_version" field.
func (alhuo *AdminLoginHistoryUpdateOne) ClearClientVersion() *AdminLoginHistoryUpdateOne {
alhuo.mutation.ClearClientVersion()
return alhuo
}
// SetDevice sets the "device" field.
func (alhuo *AdminLoginHistoryUpdateOne) SetDevice(s string) *AdminLoginHistoryUpdateOne {
alhuo.mutation.SetDevice(s)
@@ -450,6 +513,12 @@ func (alhuo *AdminLoginHistoryUpdateOne) SetNillableDevice(s *string) *AdminLogi
return alhuo
}
// ClearDevice clears the value of the "device" field.
func (alhuo *AdminLoginHistoryUpdateOne) ClearDevice() *AdminLoginHistoryUpdateOne {
alhuo.mutation.ClearDevice()
return alhuo
}
// SetCreatedAt sets the "created_at" field.
func (alhuo *AdminLoginHistoryUpdateOne) SetCreatedAt(t time.Time) *AdminLoginHistoryUpdateOne {
alhuo.mutation.SetCreatedAt(t)
@@ -566,9 +635,6 @@ func (alhuo *AdminLoginHistoryUpdateOne) sqlSave(ctx context.Context) (_node *Ad
}
}
}
if value, ok := alhuo.mutation.AdminID(); ok {
_spec.SetField(adminloginhistory.FieldAdminID, field.TypeUUID, value)
}
if value, ok := alhuo.mutation.IP(); ok {
_spec.SetField(adminloginhistory.FieldIP, field.TypeString, value)
}
@@ -584,15 +650,27 @@ func (alhuo *AdminLoginHistoryUpdateOne) sqlSave(ctx context.Context) (_node *Ad
if value, ok := alhuo.mutation.Isp(); ok {
_spec.SetField(adminloginhistory.FieldIsp, field.TypeString, value)
}
if alhuo.mutation.IspCleared() {
_spec.ClearField(adminloginhistory.FieldIsp, field.TypeString)
}
if value, ok := alhuo.mutation.Asn(); ok {
_spec.SetField(adminloginhistory.FieldAsn, field.TypeString, value)
}
if alhuo.mutation.AsnCleared() {
_spec.ClearField(adminloginhistory.FieldAsn, field.TypeString)
}
if value, ok := alhuo.mutation.ClientVersion(); ok {
_spec.SetField(adminloginhistory.FieldClientVersion, field.TypeString, value)
}
if alhuo.mutation.ClientVersionCleared() {
_spec.ClearField(adminloginhistory.FieldClientVersion, field.TypeString)
}
if value, ok := alhuo.mutation.Device(); ok {
_spec.SetField(adminloginhistory.FieldDevice, field.TypeString, value)
}
if alhuo.mutation.DeviceCleared() {
_spec.ClearField(adminloginhistory.FieldDevice, field.TypeString)
}
if value, ok := alhuo.mutation.CreatedAt(); ok {
_spec.SetField(adminloginhistory.FieldCreatedAt, field.TypeTime, value)
}

View File

@@ -28,17 +28,16 @@ var (
// AdminLoginHistoriesColumns holds the columns for the "admin_login_histories" table.
AdminLoginHistoriesColumns = []*schema.Column{
{Name: "id", Type: field.TypeUUID},
{Name: "admin_id", Type: field.TypeUUID},
{Name: "ip", Type: field.TypeString},
{Name: "country", Type: field.TypeString},
{Name: "province", Type: field.TypeString},
{Name: "city", Type: field.TypeString},
{Name: "isp", Type: field.TypeString},
{Name: "asn", Type: field.TypeString},
{Name: "client_version", Type: field.TypeString},
{Name: "device", Type: field.TypeString},
{Name: "isp", Type: field.TypeString, Nullable: true},
{Name: "asn", Type: field.TypeString, Nullable: true},
{Name: "client_version", Type: field.TypeString, Nullable: true},
{Name: "device", Type: field.TypeString, Nullable: true},
{Name: "created_at", Type: field.TypeTime},
{Name: "admin_login_histories", Type: field.TypeUUID, Nullable: true},
{Name: "admin_id", Type: field.TypeUUID, Nullable: true},
}
// AdminLoginHistoriesTable holds the schema information for the "admin_login_histories" table.
AdminLoginHistoriesTable = &schema.Table{
@@ -48,7 +47,7 @@ var (
ForeignKeys: []*schema.ForeignKey{
{
Symbol: "admin_login_histories_admins_login_histories",
Columns: []*schema.Column{AdminLoginHistoriesColumns[11]},
Columns: []*schema.Column{AdminLoginHistoriesColumns[10]},
RefColumns: []*schema.Column{AdminsColumns[0]},
OnDelete: schema.SetNull,
},
@@ -370,17 +369,18 @@ var (
// UserLoginHistoriesColumns holds the columns for the "user_login_histories" table.
UserLoginHistoriesColumns = []*schema.Column{
{Name: "id", Type: field.TypeUUID},
{Name: "user_id", Type: field.TypeUUID},
{Name: "ip", Type: field.TypeString},
{Name: "country", Type: field.TypeString},
{Name: "province", Type: field.TypeString},
{Name: "city", Type: field.TypeString},
{Name: "isp", Type: field.TypeString},
{Name: "asn", Type: field.TypeString},
{Name: "client_version", Type: field.TypeString},
{Name: "device", Type: field.TypeString},
{Name: "isp", Type: field.TypeString, Nullable: true},
{Name: "asn", Type: field.TypeString, Nullable: true},
{Name: "client_version", Type: field.TypeString, Nullable: true},
{Name: "os_type", Type: field.TypeString, Nullable: true},
{Name: "os_release", Type: field.TypeString, Nullable: true},
{Name: "hostname", Type: field.TypeString, Nullable: true},
{Name: "created_at", Type: field.TypeTime},
{Name: "user_login_histories", Type: field.TypeUUID, Nullable: true},
{Name: "user_id", Type: field.TypeUUID, Nullable: true},
}
// UserLoginHistoriesTable holds the schema information for the "user_login_histories" table.
UserLoginHistoriesTable = &schema.Table{
@@ -390,7 +390,7 @@ var (
ForeignKeys: []*schema.ForeignKey{
{
Symbol: "user_login_histories_users_login_histories",
Columns: []*schema.Column{UserLoginHistoriesColumns[11]},
Columns: []*schema.Column{UserLoginHistoriesColumns[12]},
RefColumns: []*schema.Column{UsersColumns[0]},
OnDelete: schema.SetNull,
},

View File

@@ -765,7 +765,6 @@ type AdminLoginHistoryMutation struct {
op Op
typ string
id *uuid.UUID
admin_id *uuid.UUID
ip *string
country *string
province *string
@@ -889,12 +888,12 @@ func (m *AdminLoginHistoryMutation) IDs(ctx context.Context) ([]uuid.UUID, error
// SetAdminID sets the "admin_id" field.
func (m *AdminLoginHistoryMutation) SetAdminID(u uuid.UUID) {
m.admin_id = &u
m.owner = &u
}
// AdminID returns the value of the "admin_id" field in the mutation.
func (m *AdminLoginHistoryMutation) AdminID() (r uuid.UUID, exists bool) {
v := m.admin_id
v := m.owner
if v == nil {
return
}
@@ -918,9 +917,22 @@ func (m *AdminLoginHistoryMutation) OldAdminID(ctx context.Context) (v uuid.UUID
return oldValue.AdminID, nil
}
// ClearAdminID clears the value of the "admin_id" field.
func (m *AdminLoginHistoryMutation) ClearAdminID() {
m.owner = nil
m.clearedFields[adminloginhistory.FieldAdminID] = struct{}{}
}
// AdminIDCleared returns if the "admin_id" field was cleared in this mutation.
func (m *AdminLoginHistoryMutation) AdminIDCleared() bool {
_, ok := m.clearedFields[adminloginhistory.FieldAdminID]
return ok
}
// ResetAdminID resets all changes to the "admin_id" field.
func (m *AdminLoginHistoryMutation) ResetAdminID() {
m.admin_id = nil
m.owner = nil
delete(m.clearedFields, adminloginhistory.FieldAdminID)
}
// SetIP sets the "ip" field.
@@ -1098,9 +1110,22 @@ func (m *AdminLoginHistoryMutation) OldIsp(ctx context.Context) (v string, err e
return oldValue.Isp, nil
}
// ClearIsp clears the value of the "isp" field.
func (m *AdminLoginHistoryMutation) ClearIsp() {
m.isp = nil
m.clearedFields[adminloginhistory.FieldIsp] = struct{}{}
}
// IspCleared returns if the "isp" field was cleared in this mutation.
func (m *AdminLoginHistoryMutation) IspCleared() bool {
_, ok := m.clearedFields[adminloginhistory.FieldIsp]
return ok
}
// ResetIsp resets all changes to the "isp" field.
func (m *AdminLoginHistoryMutation) ResetIsp() {
m.isp = nil
delete(m.clearedFields, adminloginhistory.FieldIsp)
}
// SetAsn sets the "asn" field.
@@ -1134,9 +1159,22 @@ func (m *AdminLoginHistoryMutation) OldAsn(ctx context.Context) (v string, err e
return oldValue.Asn, nil
}
// ClearAsn clears the value of the "asn" field.
func (m *AdminLoginHistoryMutation) ClearAsn() {
m.asn = nil
m.clearedFields[adminloginhistory.FieldAsn] = struct{}{}
}
// AsnCleared returns if the "asn" field was cleared in this mutation.
func (m *AdminLoginHistoryMutation) AsnCleared() bool {
_, ok := m.clearedFields[adminloginhistory.FieldAsn]
return ok
}
// ResetAsn resets all changes to the "asn" field.
func (m *AdminLoginHistoryMutation) ResetAsn() {
m.asn = nil
delete(m.clearedFields, adminloginhistory.FieldAsn)
}
// SetClientVersion sets the "client_version" field.
@@ -1170,9 +1208,22 @@ func (m *AdminLoginHistoryMutation) OldClientVersion(ctx context.Context) (v str
return oldValue.ClientVersion, nil
}
// ClearClientVersion clears the value of the "client_version" field.
func (m *AdminLoginHistoryMutation) ClearClientVersion() {
m.client_version = nil
m.clearedFields[adminloginhistory.FieldClientVersion] = struct{}{}
}
// ClientVersionCleared returns if the "client_version" field was cleared in this mutation.
func (m *AdminLoginHistoryMutation) ClientVersionCleared() bool {
_, ok := m.clearedFields[adminloginhistory.FieldClientVersion]
return ok
}
// ResetClientVersion resets all changes to the "client_version" field.
func (m *AdminLoginHistoryMutation) ResetClientVersion() {
m.client_version = nil
delete(m.clearedFields, adminloginhistory.FieldClientVersion)
}
// SetDevice sets the "device" field.
@@ -1206,9 +1257,22 @@ func (m *AdminLoginHistoryMutation) OldDevice(ctx context.Context) (v string, er
return oldValue.Device, nil
}
// ClearDevice clears the value of the "device" field.
func (m *AdminLoginHistoryMutation) ClearDevice() {
m.device = nil
m.clearedFields[adminloginhistory.FieldDevice] = struct{}{}
}
// DeviceCleared returns if the "device" field was cleared in this mutation.
func (m *AdminLoginHistoryMutation) DeviceCleared() bool {
_, ok := m.clearedFields[adminloginhistory.FieldDevice]
return ok
}
// ResetDevice resets all changes to the "device" field.
func (m *AdminLoginHistoryMutation) ResetDevice() {
m.device = nil
delete(m.clearedFields, adminloginhistory.FieldDevice)
}
// SetCreatedAt sets the "created_at" field.
@@ -1255,11 +1319,12 @@ func (m *AdminLoginHistoryMutation) SetOwnerID(id uuid.UUID) {
// ClearOwner clears the "owner" edge to the Admin entity.
func (m *AdminLoginHistoryMutation) ClearOwner() {
m.clearedowner = true
m.clearedFields[adminloginhistory.FieldAdminID] = struct{}{}
}
// OwnerCleared reports if the "owner" edge to the Admin entity was cleared.
func (m *AdminLoginHistoryMutation) OwnerCleared() bool {
return m.clearedowner
return m.AdminIDCleared() || m.clearedowner
}
// OwnerID returns the "owner" edge ID in the mutation.
@@ -1321,7 +1386,7 @@ func (m *AdminLoginHistoryMutation) Type() string {
// AddedFields().
func (m *AdminLoginHistoryMutation) Fields() []string {
fields := make([]string, 0, 10)
if m.admin_id != nil {
if m.owner != nil {
fields = append(fields, adminloginhistory.FieldAdminID)
}
if m.ip != nil {
@@ -1516,7 +1581,23 @@ func (m *AdminLoginHistoryMutation) AddField(name string, value ent.Value) error
// ClearedFields returns all nullable fields that were cleared during this
// mutation.
func (m *AdminLoginHistoryMutation) ClearedFields() []string {
return nil
var fields []string
if m.FieldCleared(adminloginhistory.FieldAdminID) {
fields = append(fields, adminloginhistory.FieldAdminID)
}
if m.FieldCleared(adminloginhistory.FieldIsp) {
fields = append(fields, adminloginhistory.FieldIsp)
}
if m.FieldCleared(adminloginhistory.FieldAsn) {
fields = append(fields, adminloginhistory.FieldAsn)
}
if m.FieldCleared(adminloginhistory.FieldClientVersion) {
fields = append(fields, adminloginhistory.FieldClientVersion)
}
if m.FieldCleared(adminloginhistory.FieldDevice) {
fields = append(fields, adminloginhistory.FieldDevice)
}
return fields
}
// FieldCleared returns a boolean indicating if a field with the given name was
@@ -1529,6 +1610,23 @@ func (m *AdminLoginHistoryMutation) FieldCleared(name string) bool {
// ClearField clears the value of the field with the given name. It returns an
// error if the field is not defined in the schema.
func (m *AdminLoginHistoryMutation) ClearField(name string) error {
switch name {
case adminloginhistory.FieldAdminID:
m.ClearAdminID()
return nil
case adminloginhistory.FieldIsp:
m.ClearIsp()
return nil
case adminloginhistory.FieldAsn:
m.ClearAsn()
return nil
case adminloginhistory.FieldClientVersion:
m.ClearClientVersion()
return nil
case adminloginhistory.FieldDevice:
m.ClearDevice()
return nil
}
return fmt.Errorf("unknown AdminLoginHistory nullable field %s", name)
}
@@ -14189,7 +14287,6 @@ type UserLoginHistoryMutation struct {
op Op
typ string
id *uuid.UUID
user_id *uuid.UUID
ip *string
country *string
province *string
@@ -14197,7 +14294,9 @@ type UserLoginHistoryMutation struct {
isp *string
asn *string
client_version *string
device *string
os_type *consts.OSType
os_release *consts.OSRelease
hostname *string
created_at *time.Time
clearedFields map[string]struct{}
owner *uuid.UUID
@@ -14313,12 +14412,12 @@ func (m *UserLoginHistoryMutation) IDs(ctx context.Context) ([]uuid.UUID, error)
// SetUserID sets the "user_id" field.
func (m *UserLoginHistoryMutation) SetUserID(u uuid.UUID) {
m.user_id = &u
m.owner = &u
}
// UserID returns the value of the "user_id" field in the mutation.
func (m *UserLoginHistoryMutation) UserID() (r uuid.UUID, exists bool) {
v := m.user_id
v := m.owner
if v == nil {
return
}
@@ -14342,9 +14441,22 @@ func (m *UserLoginHistoryMutation) OldUserID(ctx context.Context) (v uuid.UUID,
return oldValue.UserID, nil
}
// ClearUserID clears the value of the "user_id" field.
func (m *UserLoginHistoryMutation) ClearUserID() {
m.owner = nil
m.clearedFields[userloginhistory.FieldUserID] = struct{}{}
}
// UserIDCleared returns if the "user_id" field was cleared in this mutation.
func (m *UserLoginHistoryMutation) UserIDCleared() bool {
_, ok := m.clearedFields[userloginhistory.FieldUserID]
return ok
}
// ResetUserID resets all changes to the "user_id" field.
func (m *UserLoginHistoryMutation) ResetUserID() {
m.user_id = nil
m.owner = nil
delete(m.clearedFields, userloginhistory.FieldUserID)
}
// SetIP sets the "ip" field.
@@ -14522,9 +14634,22 @@ func (m *UserLoginHistoryMutation) OldIsp(ctx context.Context) (v string, err er
return oldValue.Isp, nil
}
// ClearIsp clears the value of the "isp" field.
func (m *UserLoginHistoryMutation) ClearIsp() {
m.isp = nil
m.clearedFields[userloginhistory.FieldIsp] = struct{}{}
}
// IspCleared returns if the "isp" field was cleared in this mutation.
func (m *UserLoginHistoryMutation) IspCleared() bool {
_, ok := m.clearedFields[userloginhistory.FieldIsp]
return ok
}
// ResetIsp resets all changes to the "isp" field.
func (m *UserLoginHistoryMutation) ResetIsp() {
m.isp = nil
delete(m.clearedFields, userloginhistory.FieldIsp)
}
// SetAsn sets the "asn" field.
@@ -14558,9 +14683,22 @@ func (m *UserLoginHistoryMutation) OldAsn(ctx context.Context) (v string, err er
return oldValue.Asn, nil
}
// ClearAsn clears the value of the "asn" field.
func (m *UserLoginHistoryMutation) ClearAsn() {
m.asn = nil
m.clearedFields[userloginhistory.FieldAsn] = struct{}{}
}
// AsnCleared returns if the "asn" field was cleared in this mutation.
func (m *UserLoginHistoryMutation) AsnCleared() bool {
_, ok := m.clearedFields[userloginhistory.FieldAsn]
return ok
}
// ResetAsn resets all changes to the "asn" field.
func (m *UserLoginHistoryMutation) ResetAsn() {
m.asn = nil
delete(m.clearedFields, userloginhistory.FieldAsn)
}
// SetClientVersion sets the "client_version" field.
@@ -14594,45 +14732,169 @@ func (m *UserLoginHistoryMutation) OldClientVersion(ctx context.Context) (v stri
return oldValue.ClientVersion, nil
}
// ClearClientVersion clears the value of the "client_version" field.
func (m *UserLoginHistoryMutation) ClearClientVersion() {
m.client_version = nil
m.clearedFields[userloginhistory.FieldClientVersion] = struct{}{}
}
// ClientVersionCleared returns if the "client_version" field was cleared in this mutation.
func (m *UserLoginHistoryMutation) ClientVersionCleared() bool {
_, ok := m.clearedFields[userloginhistory.FieldClientVersion]
return ok
}
// ResetClientVersion resets all changes to the "client_version" field.
func (m *UserLoginHistoryMutation) ResetClientVersion() {
m.client_version = nil
delete(m.clearedFields, userloginhistory.FieldClientVersion)
}
// SetDevice sets the "device" field.
func (m *UserLoginHistoryMutation) SetDevice(s string) {
m.device = &s
// SetOsType sets the "os_type" field.
func (m *UserLoginHistoryMutation) SetOsType(ct consts.OSType) {
m.os_type = &ct
}
// Device returns the value of the "device" field in the mutation.
func (m *UserLoginHistoryMutation) Device() (r string, exists bool) {
v := m.device
// OsType returns the value of the "os_type" field in the mutation.
func (m *UserLoginHistoryMutation) OsType() (r consts.OSType, exists bool) {
v := m.os_type
if v == nil {
return
}
return *v, true
}
// OldDevice returns the old "device" field's value of the UserLoginHistory entity.
// OldOsType returns the old "os_type" field's value of the UserLoginHistory entity.
// If the UserLoginHistory object wasn't provided to the builder, the object is fetched from the database.
// An error is returned if the mutation operation is not UpdateOne, or the database query fails.
func (m *UserLoginHistoryMutation) OldDevice(ctx context.Context) (v string, err error) {
func (m *UserLoginHistoryMutation) OldOsType(ctx context.Context) (v consts.OSType, err error) {
if !m.op.Is(OpUpdateOne) {
return v, errors.New("OldDevice is only allowed on UpdateOne operations")
return v, errors.New("OldOsType is only allowed on UpdateOne operations")
}
if m.id == nil || m.oldValue == nil {
return v, errors.New("OldDevice requires an ID field in the mutation")
return v, errors.New("OldOsType requires an ID field in the mutation")
}
oldValue, err := m.oldValue(ctx)
if err != nil {
return v, fmt.Errorf("querying old value for OldDevice: %w", err)
return v, fmt.Errorf("querying old value for OldOsType: %w", err)
}
return oldValue.Device, nil
return oldValue.OsType, nil
}
// ResetDevice resets all changes to the "device" field.
func (m *UserLoginHistoryMutation) ResetDevice() {
m.device = nil
// ClearOsType clears the value of the "os_type" field.
func (m *UserLoginHistoryMutation) ClearOsType() {
m.os_type = nil
m.clearedFields[userloginhistory.FieldOsType] = struct{}{}
}
// OsTypeCleared returns if the "os_type" field was cleared in this mutation.
func (m *UserLoginHistoryMutation) OsTypeCleared() bool {
_, ok := m.clearedFields[userloginhistory.FieldOsType]
return ok
}
// ResetOsType resets all changes to the "os_type" field.
func (m *UserLoginHistoryMutation) ResetOsType() {
m.os_type = nil
delete(m.clearedFields, userloginhistory.FieldOsType)
}
// SetOsRelease sets the "os_release" field.
func (m *UserLoginHistoryMutation) SetOsRelease(cr consts.OSRelease) {
m.os_release = &cr
}
// OsRelease returns the value of the "os_release" field in the mutation.
func (m *UserLoginHistoryMutation) OsRelease() (r consts.OSRelease, exists bool) {
v := m.os_release
if v == nil {
return
}
return *v, true
}
// OldOsRelease returns the old "os_release" field's value of the UserLoginHistory entity.
// If the UserLoginHistory object wasn't provided to the builder, the object is fetched from the database.
// An error is returned if the mutation operation is not UpdateOne, or the database query fails.
func (m *UserLoginHistoryMutation) OldOsRelease(ctx context.Context) (v consts.OSRelease, err error) {
if !m.op.Is(OpUpdateOne) {
return v, errors.New("OldOsRelease is only allowed on UpdateOne operations")
}
if m.id == nil || m.oldValue == nil {
return v, errors.New("OldOsRelease requires an ID field in the mutation")
}
oldValue, err := m.oldValue(ctx)
if err != nil {
return v, fmt.Errorf("querying old value for OldOsRelease: %w", err)
}
return oldValue.OsRelease, nil
}
// ClearOsRelease clears the value of the "os_release" field.
func (m *UserLoginHistoryMutation) ClearOsRelease() {
m.os_release = nil
m.clearedFields[userloginhistory.FieldOsRelease] = struct{}{}
}
// OsReleaseCleared returns if the "os_release" field was cleared in this mutation.
func (m *UserLoginHistoryMutation) OsReleaseCleared() bool {
_, ok := m.clearedFields[userloginhistory.FieldOsRelease]
return ok
}
// ResetOsRelease resets all changes to the "os_release" field.
func (m *UserLoginHistoryMutation) ResetOsRelease() {
m.os_release = nil
delete(m.clearedFields, userloginhistory.FieldOsRelease)
}
// SetHostname sets the "hostname" field.
func (m *UserLoginHistoryMutation) SetHostname(s string) {
m.hostname = &s
}
// Hostname returns the value of the "hostname" field in the mutation.
func (m *UserLoginHistoryMutation) Hostname() (r string, exists bool) {
v := m.hostname
if v == nil {
return
}
return *v, true
}
// OldHostname returns the old "hostname" field's value of the UserLoginHistory entity.
// If the UserLoginHistory object wasn't provided to the builder, the object is fetched from the database.
// An error is returned if the mutation operation is not UpdateOne, or the database query fails.
func (m *UserLoginHistoryMutation) OldHostname(ctx context.Context) (v string, err error) {
if !m.op.Is(OpUpdateOne) {
return v, errors.New("OldHostname is only allowed on UpdateOne operations")
}
if m.id == nil || m.oldValue == nil {
return v, errors.New("OldHostname requires an ID field in the mutation")
}
oldValue, err := m.oldValue(ctx)
if err != nil {
return v, fmt.Errorf("querying old value for OldHostname: %w", err)
}
return oldValue.Hostname, nil
}
// ClearHostname clears the value of the "hostname" field.
func (m *UserLoginHistoryMutation) ClearHostname() {
m.hostname = nil
m.clearedFields[userloginhistory.FieldHostname] = struct{}{}
}
// HostnameCleared returns if the "hostname" field was cleared in this mutation.
func (m *UserLoginHistoryMutation) HostnameCleared() bool {
_, ok := m.clearedFields[userloginhistory.FieldHostname]
return ok
}
// ResetHostname resets all changes to the "hostname" field.
func (m *UserLoginHistoryMutation) ResetHostname() {
m.hostname = nil
delete(m.clearedFields, userloginhistory.FieldHostname)
}
// SetCreatedAt sets the "created_at" field.
@@ -14679,11 +14941,12 @@ func (m *UserLoginHistoryMutation) SetOwnerID(id uuid.UUID) {
// ClearOwner clears the "owner" edge to the User entity.
func (m *UserLoginHistoryMutation) ClearOwner() {
m.clearedowner = true
m.clearedFields[userloginhistory.FieldUserID] = struct{}{}
}
// OwnerCleared reports if the "owner" edge to the User entity was cleared.
func (m *UserLoginHistoryMutation) OwnerCleared() bool {
return m.clearedowner
return m.UserIDCleared() || m.clearedowner
}
// OwnerID returns the "owner" edge ID in the mutation.
@@ -14744,8 +15007,8 @@ func (m *UserLoginHistoryMutation) Type() string {
// order to get all numeric fields that were incremented/decremented, call
// AddedFields().
func (m *UserLoginHistoryMutation) Fields() []string {
fields := make([]string, 0, 10)
if m.user_id != nil {
fields := make([]string, 0, 12)
if m.owner != nil {
fields = append(fields, userloginhistory.FieldUserID)
}
if m.ip != nil {
@@ -14769,8 +15032,14 @@ func (m *UserLoginHistoryMutation) Fields() []string {
if m.client_version != nil {
fields = append(fields, userloginhistory.FieldClientVersion)
}
if m.device != nil {
fields = append(fields, userloginhistory.FieldDevice)
if m.os_type != nil {
fields = append(fields, userloginhistory.FieldOsType)
}
if m.os_release != nil {
fields = append(fields, userloginhistory.FieldOsRelease)
}
if m.hostname != nil {
fields = append(fields, userloginhistory.FieldHostname)
}
if m.created_at != nil {
fields = append(fields, userloginhistory.FieldCreatedAt)
@@ -14799,8 +15068,12 @@ func (m *UserLoginHistoryMutation) Field(name string) (ent.Value, bool) {
return m.Asn()
case userloginhistory.FieldClientVersion:
return m.ClientVersion()
case userloginhistory.FieldDevice:
return m.Device()
case userloginhistory.FieldOsType:
return m.OsType()
case userloginhistory.FieldOsRelease:
return m.OsRelease()
case userloginhistory.FieldHostname:
return m.Hostname()
case userloginhistory.FieldCreatedAt:
return m.CreatedAt()
}
@@ -14828,8 +15101,12 @@ func (m *UserLoginHistoryMutation) OldField(ctx context.Context, name string) (e
return m.OldAsn(ctx)
case userloginhistory.FieldClientVersion:
return m.OldClientVersion(ctx)
case userloginhistory.FieldDevice:
return m.OldDevice(ctx)
case userloginhistory.FieldOsType:
return m.OldOsType(ctx)
case userloginhistory.FieldOsRelease:
return m.OldOsRelease(ctx)
case userloginhistory.FieldHostname:
return m.OldHostname(ctx)
case userloginhistory.FieldCreatedAt:
return m.OldCreatedAt(ctx)
}
@@ -14897,12 +15174,26 @@ func (m *UserLoginHistoryMutation) SetField(name string, value ent.Value) error
}
m.SetClientVersion(v)
return nil
case userloginhistory.FieldDevice:
case userloginhistory.FieldOsType:
v, ok := value.(consts.OSType)
if !ok {
return fmt.Errorf("unexpected type %T for field %s", value, name)
}
m.SetOsType(v)
return nil
case userloginhistory.FieldOsRelease:
v, ok := value.(consts.OSRelease)
if !ok {
return fmt.Errorf("unexpected type %T for field %s", value, name)
}
m.SetOsRelease(v)
return nil
case userloginhistory.FieldHostname:
v, ok := value.(string)
if !ok {
return fmt.Errorf("unexpected type %T for field %s", value, name)
}
m.SetDevice(v)
m.SetHostname(v)
return nil
case userloginhistory.FieldCreatedAt:
v, ok := value.(time.Time)
@@ -14940,7 +15231,29 @@ func (m *UserLoginHistoryMutation) AddField(name string, value ent.Value) error
// ClearedFields returns all nullable fields that were cleared during this
// mutation.
func (m *UserLoginHistoryMutation) ClearedFields() []string {
return nil
var fields []string
if m.FieldCleared(userloginhistory.FieldUserID) {
fields = append(fields, userloginhistory.FieldUserID)
}
if m.FieldCleared(userloginhistory.FieldIsp) {
fields = append(fields, userloginhistory.FieldIsp)
}
if m.FieldCleared(userloginhistory.FieldAsn) {
fields = append(fields, userloginhistory.FieldAsn)
}
if m.FieldCleared(userloginhistory.FieldClientVersion) {
fields = append(fields, userloginhistory.FieldClientVersion)
}
if m.FieldCleared(userloginhistory.FieldOsType) {
fields = append(fields, userloginhistory.FieldOsType)
}
if m.FieldCleared(userloginhistory.FieldOsRelease) {
fields = append(fields, userloginhistory.FieldOsRelease)
}
if m.FieldCleared(userloginhistory.FieldHostname) {
fields = append(fields, userloginhistory.FieldHostname)
}
return fields
}
// FieldCleared returns a boolean indicating if a field with the given name was
@@ -14953,6 +15266,29 @@ func (m *UserLoginHistoryMutation) FieldCleared(name string) bool {
// ClearField clears the value of the field with the given name. It returns an
// error if the field is not defined in the schema.
func (m *UserLoginHistoryMutation) ClearField(name string) error {
switch name {
case userloginhistory.FieldUserID:
m.ClearUserID()
return nil
case userloginhistory.FieldIsp:
m.ClearIsp()
return nil
case userloginhistory.FieldAsn:
m.ClearAsn()
return nil
case userloginhistory.FieldClientVersion:
m.ClearClientVersion()
return nil
case userloginhistory.FieldOsType:
m.ClearOsType()
return nil
case userloginhistory.FieldOsRelease:
m.ClearOsRelease()
return nil
case userloginhistory.FieldHostname:
m.ClearHostname()
return nil
}
return fmt.Errorf("unknown UserLoginHistory nullable field %s", name)
}
@@ -14984,8 +15320,14 @@ func (m *UserLoginHistoryMutation) ResetField(name string) error {
case userloginhistory.FieldClientVersion:
m.ResetClientVersion()
return nil
case userloginhistory.FieldDevice:
m.ResetDevice()
case userloginhistory.FieldOsType:
m.ResetOsType()
return nil
case userloginhistory.FieldOsRelease:
m.ResetOsRelease()
return nil
case userloginhistory.FieldHostname:
m.ResetHostname()
return nil
case userloginhistory.FieldCreatedAt:
m.ResetCreatedAt()

View File

@@ -319,7 +319,7 @@ func init() {
userloginhistoryFields := schema.UserLoginHistory{}.Fields()
_ = userloginhistoryFields
// userloginhistoryDescCreatedAt is the schema descriptor for created_at field.
userloginhistoryDescCreatedAt := userloginhistoryFields[10].Descriptor()
userloginhistoryDescCreatedAt := userloginhistoryFields[12].Descriptor()
// userloginhistory.DefaultCreatedAt holds the default value on creation for the created_at field.
userloginhistory.DefaultCreatedAt = userloginhistoryDescCreatedAt.Default.(func() time.Time)
}

View File

@@ -50,7 +50,7 @@ const (
// It exists in this package in order to avoid circular dependency with the "userloginhistory" package.
LoginHistoriesInverseTable = "user_login_histories"
// LoginHistoriesColumn is the table column denoting the login_histories relation/edge.
LoginHistoriesColumn = "user_login_histories"
LoginHistoriesColumn = "user_id"
// ModelsTable is the table that holds the models relation/edge.
ModelsTable = "models"
// ModelsInverseTable is the table name for the Model entity.

View File

@@ -552,7 +552,9 @@ func (uq *UserQuery) loadLoginHistories(ctx context.Context, query *UserLoginHis
init(nodes[i])
}
}
query.withFKs = true
if len(query.ctx.Fields) > 0 {
query.ctx.AppendFieldOnce(userloginhistory.FieldUserID)
}
query.Where(predicate.UserLoginHistory(func(s *sql.Selector) {
s.Where(sql.InValues(s.C(user.LoginHistoriesColumn), fks...))
}))
@@ -561,13 +563,10 @@ func (uq *UserQuery) loadLoginHistories(ctx context.Context, query *UserLoginHis
return err
}
for _, n := range neighbors {
fk := n.user_login_histories
if fk == nil {
return fmt.Errorf(`foreign-key "user_login_histories" is nil for node %v`, n.ID)
}
node, ok := nodeids[*fk]
fk := n.UserID
node, ok := nodeids[fk]
if !ok {
return fmt.Errorf(`unexpected referenced foreign-key "user_login_histories" returned %v for node %v`, *fk, n.ID)
return fmt.Errorf(`unexpected referenced foreign-key "user_id" returned %v for node %v`, fk, n.ID)
}
assign(node, n)
}

View File

@@ -9,6 +9,7 @@ import (
"entgo.io/ent"
"entgo.io/ent/dialect/sql"
"github.com/chaitin/MonkeyCode/backend/consts"
"github.com/chaitin/MonkeyCode/backend/db/user"
"github.com/chaitin/MonkeyCode/backend/db/userloginhistory"
"github.com/google/uuid"
@@ -35,15 +36,18 @@ type UserLoginHistory struct {
Asn string `json:"asn,omitempty"`
// ClientVersion holds the value of the "client_version" field.
ClientVersion string `json:"client_version,omitempty"`
// Device holds the value of the "device" field.
Device string `json:"device,omitempty"`
// OsType holds the value of the "os_type" field.
OsType consts.OSType `json:"os_type,omitempty"`
// OsRelease holds the value of the "os_release" field.
OsRelease consts.OSRelease `json:"os_release,omitempty"`
// Hostname holds the value of the "hostname" field.
Hostname string `json:"hostname,omitempty"`
// CreatedAt holds the value of the "created_at" field.
CreatedAt time.Time `json:"created_at,omitempty"`
// Edges holds the relations/edges for other nodes in the graph.
// The values are being populated by the UserLoginHistoryQuery when eager-loading is set.
Edges UserLoginHistoryEdges `json:"edges"`
user_login_histories *uuid.UUID
selectValues sql.SelectValues
Edges UserLoginHistoryEdges `json:"edges"`
selectValues sql.SelectValues
}
// UserLoginHistoryEdges holds the relations/edges for other nodes in the graph.
@@ -71,14 +75,12 @@ func (*UserLoginHistory) scanValues(columns []string) ([]any, error) {
values := make([]any, len(columns))
for i := range columns {
switch columns[i] {
case userloginhistory.FieldIP, userloginhistory.FieldCountry, userloginhistory.FieldProvince, userloginhistory.FieldCity, userloginhistory.FieldIsp, userloginhistory.FieldAsn, userloginhistory.FieldClientVersion, userloginhistory.FieldDevice:
case userloginhistory.FieldIP, userloginhistory.FieldCountry, userloginhistory.FieldProvince, userloginhistory.FieldCity, userloginhistory.FieldIsp, userloginhistory.FieldAsn, userloginhistory.FieldClientVersion, userloginhistory.FieldOsType, userloginhistory.FieldOsRelease, userloginhistory.FieldHostname:
values[i] = new(sql.NullString)
case userloginhistory.FieldCreatedAt:
values[i] = new(sql.NullTime)
case userloginhistory.FieldID, userloginhistory.FieldUserID:
values[i] = new(uuid.UUID)
case userloginhistory.ForeignKeys[0]: // user_login_histories
values[i] = &sql.NullScanner{S: new(uuid.UUID)}
default:
values[i] = new(sql.UnknownType)
}
@@ -148,11 +150,23 @@ func (ulh *UserLoginHistory) assignValues(columns []string, values []any) error
} else if value.Valid {
ulh.ClientVersion = value.String
}
case userloginhistory.FieldDevice:
case userloginhistory.FieldOsType:
if value, ok := values[i].(*sql.NullString); !ok {
return fmt.Errorf("unexpected type %T for field device", values[i])
return fmt.Errorf("unexpected type %T for field os_type", values[i])
} else if value.Valid {
ulh.Device = value.String
ulh.OsType = consts.OSType(value.String)
}
case userloginhistory.FieldOsRelease:
if value, ok := values[i].(*sql.NullString); !ok {
return fmt.Errorf("unexpected type %T for field os_release", values[i])
} else if value.Valid {
ulh.OsRelease = consts.OSRelease(value.String)
}
case userloginhistory.FieldHostname:
if value, ok := values[i].(*sql.NullString); !ok {
return fmt.Errorf("unexpected type %T for field hostname", values[i])
} else if value.Valid {
ulh.Hostname = value.String
}
case userloginhistory.FieldCreatedAt:
if value, ok := values[i].(*sql.NullTime); !ok {
@@ -160,13 +174,6 @@ func (ulh *UserLoginHistory) assignValues(columns []string, values []any) error
} else if value.Valid {
ulh.CreatedAt = value.Time
}
case userloginhistory.ForeignKeys[0]:
if value, ok := values[i].(*sql.NullScanner); !ok {
return fmt.Errorf("unexpected type %T for field user_login_histories", values[i])
} else if value.Valid {
ulh.user_login_histories = new(uuid.UUID)
*ulh.user_login_histories = *value.S.(*uuid.UUID)
}
default:
ulh.selectValues.Set(columns[i], values[i])
}
@@ -232,8 +239,14 @@ func (ulh *UserLoginHistory) String() string {
builder.WriteString("client_version=")
builder.WriteString(ulh.ClientVersion)
builder.WriteString(", ")
builder.WriteString("device=")
builder.WriteString(ulh.Device)
builder.WriteString("os_type=")
builder.WriteString(fmt.Sprintf("%v", ulh.OsType))
builder.WriteString(", ")
builder.WriteString("os_release=")
builder.WriteString(fmt.Sprintf("%v", ulh.OsRelease))
builder.WriteString(", ")
builder.WriteString("hostname=")
builder.WriteString(ulh.Hostname)
builder.WriteString(", ")
builder.WriteString("created_at=")
builder.WriteString(ulh.CreatedAt.Format(time.ANSIC))

View File

@@ -30,8 +30,12 @@ const (
FieldAsn = "asn"
// FieldClientVersion holds the string denoting the client_version field in the database.
FieldClientVersion = "client_version"
// FieldDevice holds the string denoting the device field in the database.
FieldDevice = "device"
// FieldOsType holds the string denoting the os_type field in the database.
FieldOsType = "os_type"
// FieldOsRelease holds the string denoting the os_release field in the database.
FieldOsRelease = "os_release"
// FieldHostname holds the string denoting the hostname field in the database.
FieldHostname = "hostname"
// FieldCreatedAt holds the string denoting the created_at field in the database.
FieldCreatedAt = "created_at"
// EdgeOwner holds the string denoting the owner edge name in mutations.
@@ -44,7 +48,7 @@ const (
// It exists in this package in order to avoid circular dependency with the "user" package.
OwnerInverseTable = "users"
// OwnerColumn is the table column denoting the owner relation/edge.
OwnerColumn = "user_login_histories"
OwnerColumn = "user_id"
)
// Columns holds all SQL columns for userloginhistory fields.
@@ -58,16 +62,12 @@ var Columns = []string{
FieldIsp,
FieldAsn,
FieldClientVersion,
FieldDevice,
FieldOsType,
FieldOsRelease,
FieldHostname,
FieldCreatedAt,
}
// ForeignKeys holds the SQL foreign-keys that are owned by the "user_login_histories"
// table and are not defined as standalone fields in the schema.
var ForeignKeys = []string{
"user_login_histories",
}
// ValidColumn reports if the column name is valid (part of the table columns).
func ValidColumn(column string) bool {
for i := range Columns {
@@ -75,11 +75,6 @@ func ValidColumn(column string) bool {
return true
}
}
for i := range ForeignKeys {
if column == ForeignKeys[i] {
return true
}
}
return false
}
@@ -136,9 +131,19 @@ func ByClientVersion(opts ...sql.OrderTermOption) OrderOption {
return sql.OrderByField(FieldClientVersion, opts...).ToFunc()
}
// ByDevice orders the results by the device field.
func ByDevice(opts ...sql.OrderTermOption) OrderOption {
return sql.OrderByField(FieldDevice, opts...).ToFunc()
// ByOsType orders the results by the os_type field.
func ByOsType(opts ...sql.OrderTermOption) OrderOption {
return sql.OrderByField(FieldOsType, opts...).ToFunc()
}
// ByOsRelease orders the results by the os_release field.
func ByOsRelease(opts ...sql.OrderTermOption) OrderOption {
return sql.OrderByField(FieldOsRelease, opts...).ToFunc()
}
// ByHostname orders the results by the hostname field.
func ByHostname(opts ...sql.OrderTermOption) OrderOption {
return sql.OrderByField(FieldHostname, opts...).ToFunc()
}
// ByCreatedAt orders the results by the created_at field.

View File

@@ -7,6 +7,7 @@ import (
"entgo.io/ent/dialect/sql"
"entgo.io/ent/dialect/sql/sqlgraph"
"github.com/chaitin/MonkeyCode/backend/consts"
"github.com/chaitin/MonkeyCode/backend/db/predicate"
"github.com/google/uuid"
)
@@ -96,9 +97,21 @@ func ClientVersion(v string) predicate.UserLoginHistory {
return predicate.UserLoginHistory(sql.FieldEQ(FieldClientVersion, v))
}
// Device applies equality check predicate on the "device" field. It's identical to DeviceEQ.
func Device(v string) predicate.UserLoginHistory {
return predicate.UserLoginHistory(sql.FieldEQ(FieldDevice, v))
// OsType applies equality check predicate on the "os_type" field. It's identical to OsTypeEQ.
func OsType(v consts.OSType) predicate.UserLoginHistory {
vc := string(v)
return predicate.UserLoginHistory(sql.FieldEQ(FieldOsType, vc))
}
// OsRelease applies equality check predicate on the "os_release" field. It's identical to OsReleaseEQ.
func OsRelease(v consts.OSRelease) predicate.UserLoginHistory {
vc := string(v)
return predicate.UserLoginHistory(sql.FieldEQ(FieldOsRelease, vc))
}
// Hostname applies equality check predicate on the "hostname" field. It's identical to HostnameEQ.
func Hostname(v string) predicate.UserLoginHistory {
return predicate.UserLoginHistory(sql.FieldEQ(FieldHostname, v))
}
// CreatedAt applies equality check predicate on the "created_at" field. It's identical to CreatedAtEQ.
@@ -126,24 +139,14 @@ func UserIDNotIn(vs ...uuid.UUID) predicate.UserLoginHistory {
return predicate.UserLoginHistory(sql.FieldNotIn(FieldUserID, vs...))
}
// UserIDGT applies the GT predicate on the "user_id" field.
func UserIDGT(v uuid.UUID) predicate.UserLoginHistory {
return predicate.UserLoginHistory(sql.FieldGT(FieldUserID, v))
// UserIDIsNil applies the IsNil predicate on the "user_id" field.
func UserIDIsNil() predicate.UserLoginHistory {
return predicate.UserLoginHistory(sql.FieldIsNull(FieldUserID))
}
// UserIDGTE applies the GTE predicate on the "user_id" field.
func UserIDGTE(v uuid.UUID) predicate.UserLoginHistory {
return predicate.UserLoginHistory(sql.FieldGTE(FieldUserID, v))
}
// UserIDLT applies the LT predicate on the "user_id" field.
func UserIDLT(v uuid.UUID) predicate.UserLoginHistory {
return predicate.UserLoginHistory(sql.FieldLT(FieldUserID, v))
}
// UserIDLTE applies the LTE predicate on the "user_id" field.
func UserIDLTE(v uuid.UUID) predicate.UserLoginHistory {
return predicate.UserLoginHistory(sql.FieldLTE(FieldUserID, v))
// UserIDNotNil applies the NotNil predicate on the "user_id" field.
func UserIDNotNil() predicate.UserLoginHistory {
return predicate.UserLoginHistory(sql.FieldNotNull(FieldUserID))
}
// IPEQ applies the EQ predicate on the "ip" field.
@@ -461,6 +464,16 @@ func IspHasSuffix(v string) predicate.UserLoginHistory {
return predicate.UserLoginHistory(sql.FieldHasSuffix(FieldIsp, v))
}
// IspIsNil applies the IsNil predicate on the "isp" field.
func IspIsNil() predicate.UserLoginHistory {
return predicate.UserLoginHistory(sql.FieldIsNull(FieldIsp))
}
// IspNotNil applies the NotNil predicate on the "isp" field.
func IspNotNil() predicate.UserLoginHistory {
return predicate.UserLoginHistory(sql.FieldNotNull(FieldIsp))
}
// IspEqualFold applies the EqualFold predicate on the "isp" field.
func IspEqualFold(v string) predicate.UserLoginHistory {
return predicate.UserLoginHistory(sql.FieldEqualFold(FieldIsp, v))
@@ -526,6 +539,16 @@ func AsnHasSuffix(v string) predicate.UserLoginHistory {
return predicate.UserLoginHistory(sql.FieldHasSuffix(FieldAsn, v))
}
// AsnIsNil applies the IsNil predicate on the "asn" field.
func AsnIsNil() predicate.UserLoginHistory {
return predicate.UserLoginHistory(sql.FieldIsNull(FieldAsn))
}
// AsnNotNil applies the NotNil predicate on the "asn" field.
func AsnNotNil() predicate.UserLoginHistory {
return predicate.UserLoginHistory(sql.FieldNotNull(FieldAsn))
}
// AsnEqualFold applies the EqualFold predicate on the "asn" field.
func AsnEqualFold(v string) predicate.UserLoginHistory {
return predicate.UserLoginHistory(sql.FieldEqualFold(FieldAsn, v))
@@ -591,6 +614,16 @@ func ClientVersionHasSuffix(v string) predicate.UserLoginHistory {
return predicate.UserLoginHistory(sql.FieldHasSuffix(FieldClientVersion, v))
}
// ClientVersionIsNil applies the IsNil predicate on the "client_version" field.
func ClientVersionIsNil() predicate.UserLoginHistory {
return predicate.UserLoginHistory(sql.FieldIsNull(FieldClientVersion))
}
// ClientVersionNotNil applies the NotNil predicate on the "client_version" field.
func ClientVersionNotNil() predicate.UserLoginHistory {
return predicate.UserLoginHistory(sql.FieldNotNull(FieldClientVersion))
}
// ClientVersionEqualFold applies the EqualFold predicate on the "client_version" field.
func ClientVersionEqualFold(v string) predicate.UserLoginHistory {
return predicate.UserLoginHistory(sql.FieldEqualFold(FieldClientVersion, v))
@@ -601,69 +634,267 @@ func ClientVersionContainsFold(v string) predicate.UserLoginHistory {
return predicate.UserLoginHistory(sql.FieldContainsFold(FieldClientVersion, v))
}
// DeviceEQ applies the EQ predicate on the "device" field.
func DeviceEQ(v string) predicate.UserLoginHistory {
return predicate.UserLoginHistory(sql.FieldEQ(FieldDevice, v))
// OsTypeEQ applies the EQ predicate on the "os_type" field.
func OsTypeEQ(v consts.OSType) predicate.UserLoginHistory {
vc := string(v)
return predicate.UserLoginHistory(sql.FieldEQ(FieldOsType, vc))
}
// DeviceNEQ applies the NEQ predicate on the "device" field.
func DeviceNEQ(v string) predicate.UserLoginHistory {
return predicate.UserLoginHistory(sql.FieldNEQ(FieldDevice, v))
// OsTypeNEQ applies the NEQ predicate on the "os_type" field.
func OsTypeNEQ(v consts.OSType) predicate.UserLoginHistory {
vc := string(v)
return predicate.UserLoginHistory(sql.FieldNEQ(FieldOsType, vc))
}
// DeviceIn applies the In predicate on the "device" field.
func DeviceIn(vs ...string) predicate.UserLoginHistory {
return predicate.UserLoginHistory(sql.FieldIn(FieldDevice, vs...))
// OsTypeIn applies the In predicate on the "os_type" field.
func OsTypeIn(vs ...consts.OSType) predicate.UserLoginHistory {
v := make([]any, len(vs))
for i := range v {
v[i] = string(vs[i])
}
return predicate.UserLoginHistory(sql.FieldIn(FieldOsType, v...))
}
// DeviceNotIn applies the NotIn predicate on the "device" field.
func DeviceNotIn(vs ...string) predicate.UserLoginHistory {
return predicate.UserLoginHistory(sql.FieldNotIn(FieldDevice, vs...))
// OsTypeNotIn applies the NotIn predicate on the "os_type" field.
func OsTypeNotIn(vs ...consts.OSType) predicate.UserLoginHistory {
v := make([]any, len(vs))
for i := range v {
v[i] = string(vs[i])
}
return predicate.UserLoginHistory(sql.FieldNotIn(FieldOsType, v...))
}
// DeviceGT applies the GT predicate on the "device" field.
func DeviceGT(v string) predicate.UserLoginHistory {
return predicate.UserLoginHistory(sql.FieldGT(FieldDevice, v))
// OsTypeGT applies the GT predicate on the "os_type" field.
func OsTypeGT(v consts.OSType) predicate.UserLoginHistory {
vc := string(v)
return predicate.UserLoginHistory(sql.FieldGT(FieldOsType, vc))
}
// DeviceGTE applies the GTE predicate on the "device" field.
func DeviceGTE(v string) predicate.UserLoginHistory {
return predicate.UserLoginHistory(sql.FieldGTE(FieldDevice, v))
// OsTypeGTE applies the GTE predicate on the "os_type" field.
func OsTypeGTE(v consts.OSType) predicate.UserLoginHistory {
vc := string(v)
return predicate.UserLoginHistory(sql.FieldGTE(FieldOsType, vc))
}
// DeviceLT applies the LT predicate on the "device" field.
func DeviceLT(v string) predicate.UserLoginHistory {
return predicate.UserLoginHistory(sql.FieldLT(FieldDevice, v))
// OsTypeLT applies the LT predicate on the "os_type" field.
func OsTypeLT(v consts.OSType) predicate.UserLoginHistory {
vc := string(v)
return predicate.UserLoginHistory(sql.FieldLT(FieldOsType, vc))
}
// DeviceLTE applies the LTE predicate on the "device" field.
func DeviceLTE(v string) predicate.UserLoginHistory {
return predicate.UserLoginHistory(sql.FieldLTE(FieldDevice, v))
// OsTypeLTE applies the LTE predicate on the "os_type" field.
func OsTypeLTE(v consts.OSType) predicate.UserLoginHistory {
vc := string(v)
return predicate.UserLoginHistory(sql.FieldLTE(FieldOsType, vc))
}
// DeviceContains applies the Contains predicate on the "device" field.
func DeviceContains(v string) predicate.UserLoginHistory {
return predicate.UserLoginHistory(sql.FieldContains(FieldDevice, v))
// OsTypeContains applies the Contains predicate on the "os_type" field.
func OsTypeContains(v consts.OSType) predicate.UserLoginHistory {
vc := string(v)
return predicate.UserLoginHistory(sql.FieldContains(FieldOsType, vc))
}
// DeviceHasPrefix applies the HasPrefix predicate on the "device" field.
func DeviceHasPrefix(v string) predicate.UserLoginHistory {
return predicate.UserLoginHistory(sql.FieldHasPrefix(FieldDevice, v))
// OsTypeHasPrefix applies the HasPrefix predicate on the "os_type" field.
func OsTypeHasPrefix(v consts.OSType) predicate.UserLoginHistory {
vc := string(v)
return predicate.UserLoginHistory(sql.FieldHasPrefix(FieldOsType, vc))
}
// DeviceHasSuffix applies the HasSuffix predicate on the "device" field.
func DeviceHasSuffix(v string) predicate.UserLoginHistory {
return predicate.UserLoginHistory(sql.FieldHasSuffix(FieldDevice, v))
// OsTypeHasSuffix applies the HasSuffix predicate on the "os_type" field.
func OsTypeHasSuffix(v consts.OSType) predicate.UserLoginHistory {
vc := string(v)
return predicate.UserLoginHistory(sql.FieldHasSuffix(FieldOsType, vc))
}
// DeviceEqualFold applies the EqualFold predicate on the "device" field.
func DeviceEqualFold(v string) predicate.UserLoginHistory {
return predicate.UserLoginHistory(sql.FieldEqualFold(FieldDevice, v))
// OsTypeIsNil applies the IsNil predicate on the "os_type" field.
func OsTypeIsNil() predicate.UserLoginHistory {
return predicate.UserLoginHistory(sql.FieldIsNull(FieldOsType))
}
// DeviceContainsFold applies the ContainsFold predicate on the "device" field.
func DeviceContainsFold(v string) predicate.UserLoginHistory {
return predicate.UserLoginHistory(sql.FieldContainsFold(FieldDevice, v))
// OsTypeNotNil applies the NotNil predicate on the "os_type" field.
func OsTypeNotNil() predicate.UserLoginHistory {
return predicate.UserLoginHistory(sql.FieldNotNull(FieldOsType))
}
// OsTypeEqualFold applies the EqualFold predicate on the "os_type" field.
func OsTypeEqualFold(v consts.OSType) predicate.UserLoginHistory {
vc := string(v)
return predicate.UserLoginHistory(sql.FieldEqualFold(FieldOsType, vc))
}
// OsTypeContainsFold applies the ContainsFold predicate on the "os_type" field.
func OsTypeContainsFold(v consts.OSType) predicate.UserLoginHistory {
vc := string(v)
return predicate.UserLoginHistory(sql.FieldContainsFold(FieldOsType, vc))
}
// OsReleaseEQ applies the EQ predicate on the "os_release" field.
func OsReleaseEQ(v consts.OSRelease) predicate.UserLoginHistory {
vc := string(v)
return predicate.UserLoginHistory(sql.FieldEQ(FieldOsRelease, vc))
}
// OsReleaseNEQ applies the NEQ predicate on the "os_release" field.
func OsReleaseNEQ(v consts.OSRelease) predicate.UserLoginHistory {
vc := string(v)
return predicate.UserLoginHistory(sql.FieldNEQ(FieldOsRelease, vc))
}
// OsReleaseIn applies the In predicate on the "os_release" field.
func OsReleaseIn(vs ...consts.OSRelease) predicate.UserLoginHistory {
v := make([]any, len(vs))
for i := range v {
v[i] = string(vs[i])
}
return predicate.UserLoginHistory(sql.FieldIn(FieldOsRelease, v...))
}
// OsReleaseNotIn applies the NotIn predicate on the "os_release" field.
func OsReleaseNotIn(vs ...consts.OSRelease) predicate.UserLoginHistory {
v := make([]any, len(vs))
for i := range v {
v[i] = string(vs[i])
}
return predicate.UserLoginHistory(sql.FieldNotIn(FieldOsRelease, v...))
}
// OsReleaseGT applies the GT predicate on the "os_release" field.
func OsReleaseGT(v consts.OSRelease) predicate.UserLoginHistory {
vc := string(v)
return predicate.UserLoginHistory(sql.FieldGT(FieldOsRelease, vc))
}
// OsReleaseGTE applies the GTE predicate on the "os_release" field.
func OsReleaseGTE(v consts.OSRelease) predicate.UserLoginHistory {
vc := string(v)
return predicate.UserLoginHistory(sql.FieldGTE(FieldOsRelease, vc))
}
// OsReleaseLT applies the LT predicate on the "os_release" field.
func OsReleaseLT(v consts.OSRelease) predicate.UserLoginHistory {
vc := string(v)
return predicate.UserLoginHistory(sql.FieldLT(FieldOsRelease, vc))
}
// OsReleaseLTE applies the LTE predicate on the "os_release" field.
func OsReleaseLTE(v consts.OSRelease) predicate.UserLoginHistory {
vc := string(v)
return predicate.UserLoginHistory(sql.FieldLTE(FieldOsRelease, vc))
}
// OsReleaseContains applies the Contains predicate on the "os_release" field.
func OsReleaseContains(v consts.OSRelease) predicate.UserLoginHistory {
vc := string(v)
return predicate.UserLoginHistory(sql.FieldContains(FieldOsRelease, vc))
}
// OsReleaseHasPrefix applies the HasPrefix predicate on the "os_release" field.
func OsReleaseHasPrefix(v consts.OSRelease) predicate.UserLoginHistory {
vc := string(v)
return predicate.UserLoginHistory(sql.FieldHasPrefix(FieldOsRelease, vc))
}
// OsReleaseHasSuffix applies the HasSuffix predicate on the "os_release" field.
func OsReleaseHasSuffix(v consts.OSRelease) predicate.UserLoginHistory {
vc := string(v)
return predicate.UserLoginHistory(sql.FieldHasSuffix(FieldOsRelease, vc))
}
// OsReleaseIsNil applies the IsNil predicate on the "os_release" field.
func OsReleaseIsNil() predicate.UserLoginHistory {
return predicate.UserLoginHistory(sql.FieldIsNull(FieldOsRelease))
}
// OsReleaseNotNil applies the NotNil predicate on the "os_release" field.
func OsReleaseNotNil() predicate.UserLoginHistory {
return predicate.UserLoginHistory(sql.FieldNotNull(FieldOsRelease))
}
// OsReleaseEqualFold applies the EqualFold predicate on the "os_release" field.
func OsReleaseEqualFold(v consts.OSRelease) predicate.UserLoginHistory {
vc := string(v)
return predicate.UserLoginHistory(sql.FieldEqualFold(FieldOsRelease, vc))
}
// OsReleaseContainsFold applies the ContainsFold predicate on the "os_release" field.
func OsReleaseContainsFold(v consts.OSRelease) predicate.UserLoginHistory {
vc := string(v)
return predicate.UserLoginHistory(sql.FieldContainsFold(FieldOsRelease, vc))
}
// HostnameEQ applies the EQ predicate on the "hostname" field.
func HostnameEQ(v string) predicate.UserLoginHistory {
return predicate.UserLoginHistory(sql.FieldEQ(FieldHostname, v))
}
// HostnameNEQ applies the NEQ predicate on the "hostname" field.
func HostnameNEQ(v string) predicate.UserLoginHistory {
return predicate.UserLoginHistory(sql.FieldNEQ(FieldHostname, v))
}
// HostnameIn applies the In predicate on the "hostname" field.
func HostnameIn(vs ...string) predicate.UserLoginHistory {
return predicate.UserLoginHistory(sql.FieldIn(FieldHostname, vs...))
}
// HostnameNotIn applies the NotIn predicate on the "hostname" field.
func HostnameNotIn(vs ...string) predicate.UserLoginHistory {
return predicate.UserLoginHistory(sql.FieldNotIn(FieldHostname, vs...))
}
// HostnameGT applies the GT predicate on the "hostname" field.
func HostnameGT(v string) predicate.UserLoginHistory {
return predicate.UserLoginHistory(sql.FieldGT(FieldHostname, v))
}
// HostnameGTE applies the GTE predicate on the "hostname" field.
func HostnameGTE(v string) predicate.UserLoginHistory {
return predicate.UserLoginHistory(sql.FieldGTE(FieldHostname, v))
}
// HostnameLT applies the LT predicate on the "hostname" field.
func HostnameLT(v string) predicate.UserLoginHistory {
return predicate.UserLoginHistory(sql.FieldLT(FieldHostname, v))
}
// HostnameLTE applies the LTE predicate on the "hostname" field.
func HostnameLTE(v string) predicate.UserLoginHistory {
return predicate.UserLoginHistory(sql.FieldLTE(FieldHostname, v))
}
// HostnameContains applies the Contains predicate on the "hostname" field.
func HostnameContains(v string) predicate.UserLoginHistory {
return predicate.UserLoginHistory(sql.FieldContains(FieldHostname, v))
}
// HostnameHasPrefix applies the HasPrefix predicate on the "hostname" field.
func HostnameHasPrefix(v string) predicate.UserLoginHistory {
return predicate.UserLoginHistory(sql.FieldHasPrefix(FieldHostname, v))
}
// HostnameHasSuffix applies the HasSuffix predicate on the "hostname" field.
func HostnameHasSuffix(v string) predicate.UserLoginHistory {
return predicate.UserLoginHistory(sql.FieldHasSuffix(FieldHostname, v))
}
// HostnameIsNil applies the IsNil predicate on the "hostname" field.
func HostnameIsNil() predicate.UserLoginHistory {
return predicate.UserLoginHistory(sql.FieldIsNull(FieldHostname))
}
// HostnameNotNil applies the NotNil predicate on the "hostname" field.
func HostnameNotNil() predicate.UserLoginHistory {
return predicate.UserLoginHistory(sql.FieldNotNull(FieldHostname))
}
// HostnameEqualFold applies the EqualFold predicate on the "hostname" field.
func HostnameEqualFold(v string) predicate.UserLoginHistory {
return predicate.UserLoginHistory(sql.FieldEqualFold(FieldHostname, v))
}
// HostnameContainsFold applies the ContainsFold predicate on the "hostname" field.
func HostnameContainsFold(v string) predicate.UserLoginHistory {
return predicate.UserLoginHistory(sql.FieldContainsFold(FieldHostname, v))
}
// CreatedAtEQ applies the EQ predicate on the "created_at" field.

View File

@@ -12,6 +12,7 @@ import (
"entgo.io/ent/dialect/sql"
"entgo.io/ent/dialect/sql/sqlgraph"
"entgo.io/ent/schema/field"
"github.com/chaitin/MonkeyCode/backend/consts"
"github.com/chaitin/MonkeyCode/backend/db/user"
"github.com/chaitin/MonkeyCode/backend/db/userloginhistory"
"github.com/google/uuid"
@@ -31,6 +32,14 @@ func (ulhc *UserLoginHistoryCreate) SetUserID(u uuid.UUID) *UserLoginHistoryCrea
return ulhc
}
// SetNillableUserID sets the "user_id" field if the given value is not nil.
func (ulhc *UserLoginHistoryCreate) SetNillableUserID(u *uuid.UUID) *UserLoginHistoryCreate {
if u != nil {
ulhc.SetUserID(*u)
}
return ulhc
}
// SetIP sets the "ip" field.
func (ulhc *UserLoginHistoryCreate) SetIP(s string) *UserLoginHistoryCreate {
ulhc.mutation.SetIP(s)
@@ -61,21 +70,81 @@ func (ulhc *UserLoginHistoryCreate) SetIsp(s string) *UserLoginHistoryCreate {
return ulhc
}
// SetNillableIsp sets the "isp" field if the given value is not nil.
func (ulhc *UserLoginHistoryCreate) SetNillableIsp(s *string) *UserLoginHistoryCreate {
if s != nil {
ulhc.SetIsp(*s)
}
return ulhc
}
// SetAsn sets the "asn" field.
func (ulhc *UserLoginHistoryCreate) SetAsn(s string) *UserLoginHistoryCreate {
ulhc.mutation.SetAsn(s)
return ulhc
}
// SetNillableAsn sets the "asn" field if the given value is not nil.
func (ulhc *UserLoginHistoryCreate) SetNillableAsn(s *string) *UserLoginHistoryCreate {
if s != nil {
ulhc.SetAsn(*s)
}
return ulhc
}
// SetClientVersion sets the "client_version" field.
func (ulhc *UserLoginHistoryCreate) SetClientVersion(s string) *UserLoginHistoryCreate {
ulhc.mutation.SetClientVersion(s)
return ulhc
}
// SetDevice sets the "device" field.
func (ulhc *UserLoginHistoryCreate) SetDevice(s string) *UserLoginHistoryCreate {
ulhc.mutation.SetDevice(s)
// SetNillableClientVersion sets the "client_version" field if the given value is not nil.
func (ulhc *UserLoginHistoryCreate) SetNillableClientVersion(s *string) *UserLoginHistoryCreate {
if s != nil {
ulhc.SetClientVersion(*s)
}
return ulhc
}
// SetOsType sets the "os_type" field.
func (ulhc *UserLoginHistoryCreate) SetOsType(ct consts.OSType) *UserLoginHistoryCreate {
ulhc.mutation.SetOsType(ct)
return ulhc
}
// SetNillableOsType sets the "os_type" field if the given value is not nil.
func (ulhc *UserLoginHistoryCreate) SetNillableOsType(ct *consts.OSType) *UserLoginHistoryCreate {
if ct != nil {
ulhc.SetOsType(*ct)
}
return ulhc
}
// SetOsRelease sets the "os_release" field.
func (ulhc *UserLoginHistoryCreate) SetOsRelease(cr consts.OSRelease) *UserLoginHistoryCreate {
ulhc.mutation.SetOsRelease(cr)
return ulhc
}
// SetNillableOsRelease sets the "os_release" field if the given value is not nil.
func (ulhc *UserLoginHistoryCreate) SetNillableOsRelease(cr *consts.OSRelease) *UserLoginHistoryCreate {
if cr != nil {
ulhc.SetOsRelease(*cr)
}
return ulhc
}
// SetHostname sets the "hostname" field.
func (ulhc *UserLoginHistoryCreate) SetHostname(s string) *UserLoginHistoryCreate {
ulhc.mutation.SetHostname(s)
return ulhc
}
// SetNillableHostname sets the "hostname" field if the given value is not nil.
func (ulhc *UserLoginHistoryCreate) SetNillableHostname(s *string) *UserLoginHistoryCreate {
if s != nil {
ulhc.SetHostname(*s)
}
return ulhc
}
@@ -161,9 +230,6 @@ func (ulhc *UserLoginHistoryCreate) defaults() {
// check runs all checks and user-defined validators on the builder.
func (ulhc *UserLoginHistoryCreate) check() error {
if _, ok := ulhc.mutation.UserID(); !ok {
return &ValidationError{Name: "user_id", err: errors.New(`db: missing required field "UserLoginHistory.user_id"`)}
}
if _, ok := ulhc.mutation.IP(); !ok {
return &ValidationError{Name: "ip", err: errors.New(`db: missing required field "UserLoginHistory.ip"`)}
}
@@ -176,18 +242,6 @@ func (ulhc *UserLoginHistoryCreate) check() error {
if _, ok := ulhc.mutation.City(); !ok {
return &ValidationError{Name: "city", err: errors.New(`db: missing required field "UserLoginHistory.city"`)}
}
if _, ok := ulhc.mutation.Isp(); !ok {
return &ValidationError{Name: "isp", err: errors.New(`db: missing required field "UserLoginHistory.isp"`)}
}
if _, ok := ulhc.mutation.Asn(); !ok {
return &ValidationError{Name: "asn", err: errors.New(`db: missing required field "UserLoginHistory.asn"`)}
}
if _, ok := ulhc.mutation.ClientVersion(); !ok {
return &ValidationError{Name: "client_version", err: errors.New(`db: missing required field "UserLoginHistory.client_version"`)}
}
if _, ok := ulhc.mutation.Device(); !ok {
return &ValidationError{Name: "device", err: errors.New(`db: missing required field "UserLoginHistory.device"`)}
}
if _, ok := ulhc.mutation.CreatedAt(); !ok {
return &ValidationError{Name: "created_at", err: errors.New(`db: missing required field "UserLoginHistory.created_at"`)}
}
@@ -227,10 +281,6 @@ func (ulhc *UserLoginHistoryCreate) createSpec() (*UserLoginHistory, *sqlgraph.C
_node.ID = id
_spec.ID.Value = &id
}
if value, ok := ulhc.mutation.UserID(); ok {
_spec.SetField(userloginhistory.FieldUserID, field.TypeUUID, value)
_node.UserID = value
}
if value, ok := ulhc.mutation.IP(); ok {
_spec.SetField(userloginhistory.FieldIP, field.TypeString, value)
_node.IP = value
@@ -259,9 +309,17 @@ func (ulhc *UserLoginHistoryCreate) createSpec() (*UserLoginHistory, *sqlgraph.C
_spec.SetField(userloginhistory.FieldClientVersion, field.TypeString, value)
_node.ClientVersion = value
}
if value, ok := ulhc.mutation.Device(); ok {
_spec.SetField(userloginhistory.FieldDevice, field.TypeString, value)
_node.Device = value
if value, ok := ulhc.mutation.OsType(); ok {
_spec.SetField(userloginhistory.FieldOsType, field.TypeString, value)
_node.OsType = value
}
if value, ok := ulhc.mutation.OsRelease(); ok {
_spec.SetField(userloginhistory.FieldOsRelease, field.TypeString, value)
_node.OsRelease = value
}
if value, ok := ulhc.mutation.Hostname(); ok {
_spec.SetField(userloginhistory.FieldHostname, field.TypeString, value)
_node.Hostname = value
}
if value, ok := ulhc.mutation.CreatedAt(); ok {
_spec.SetField(userloginhistory.FieldCreatedAt, field.TypeTime, value)
@@ -281,7 +339,7 @@ func (ulhc *UserLoginHistoryCreate) createSpec() (*UserLoginHistory, *sqlgraph.C
for _, k := range nodes {
edge.Target.Nodes = append(edge.Target.Nodes, k)
}
_node.user_login_histories = &nodes[0]
_node.UserID = nodes[0]
_spec.Edges = append(_spec.Edges, edge)
}
return _node, _spec
@@ -348,6 +406,12 @@ func (u *UserLoginHistoryUpsert) UpdateUserID() *UserLoginHistoryUpsert {
return u
}
// ClearUserID clears the value of the "user_id" field.
func (u *UserLoginHistoryUpsert) ClearUserID() *UserLoginHistoryUpsert {
u.SetNull(userloginhistory.FieldUserID)
return u
}
// SetIP sets the "ip" field.
func (u *UserLoginHistoryUpsert) SetIP(v string) *UserLoginHistoryUpsert {
u.Set(userloginhistory.FieldIP, v)
@@ -408,6 +472,12 @@ func (u *UserLoginHistoryUpsert) UpdateIsp() *UserLoginHistoryUpsert {
return u
}
// ClearIsp clears the value of the "isp" field.
func (u *UserLoginHistoryUpsert) ClearIsp() *UserLoginHistoryUpsert {
u.SetNull(userloginhistory.FieldIsp)
return u
}
// SetAsn sets the "asn" field.
func (u *UserLoginHistoryUpsert) SetAsn(v string) *UserLoginHistoryUpsert {
u.Set(userloginhistory.FieldAsn, v)
@@ -420,6 +490,12 @@ func (u *UserLoginHistoryUpsert) UpdateAsn() *UserLoginHistoryUpsert {
return u
}
// ClearAsn clears the value of the "asn" field.
func (u *UserLoginHistoryUpsert) ClearAsn() *UserLoginHistoryUpsert {
u.SetNull(userloginhistory.FieldAsn)
return u
}
// SetClientVersion sets the "client_version" field.
func (u *UserLoginHistoryUpsert) SetClientVersion(v string) *UserLoginHistoryUpsert {
u.Set(userloginhistory.FieldClientVersion, v)
@@ -432,15 +508,63 @@ func (u *UserLoginHistoryUpsert) UpdateClientVersion() *UserLoginHistoryUpsert {
return u
}
// SetDevice sets the "device" field.
func (u *UserLoginHistoryUpsert) SetDevice(v string) *UserLoginHistoryUpsert {
u.Set(userloginhistory.FieldDevice, v)
// ClearClientVersion clears the value of the "client_version" field.
func (u *UserLoginHistoryUpsert) ClearClientVersion() *UserLoginHistoryUpsert {
u.SetNull(userloginhistory.FieldClientVersion)
return u
}
// UpdateDevice sets the "device" field to the value that was provided on create.
func (u *UserLoginHistoryUpsert) UpdateDevice() *UserLoginHistoryUpsert {
u.SetExcluded(userloginhistory.FieldDevice)
// SetOsType sets the "os_type" field.
func (u *UserLoginHistoryUpsert) SetOsType(v consts.OSType) *UserLoginHistoryUpsert {
u.Set(userloginhistory.FieldOsType, v)
return u
}
// UpdateOsType sets the "os_type" field to the value that was provided on create.
func (u *UserLoginHistoryUpsert) UpdateOsType() *UserLoginHistoryUpsert {
u.SetExcluded(userloginhistory.FieldOsType)
return u
}
// ClearOsType clears the value of the "os_type" field.
func (u *UserLoginHistoryUpsert) ClearOsType() *UserLoginHistoryUpsert {
u.SetNull(userloginhistory.FieldOsType)
return u
}
// SetOsRelease sets the "os_release" field.
func (u *UserLoginHistoryUpsert) SetOsRelease(v consts.OSRelease) *UserLoginHistoryUpsert {
u.Set(userloginhistory.FieldOsRelease, v)
return u
}
// UpdateOsRelease sets the "os_release" field to the value that was provided on create.
func (u *UserLoginHistoryUpsert) UpdateOsRelease() *UserLoginHistoryUpsert {
u.SetExcluded(userloginhistory.FieldOsRelease)
return u
}
// ClearOsRelease clears the value of the "os_release" field.
func (u *UserLoginHistoryUpsert) ClearOsRelease() *UserLoginHistoryUpsert {
u.SetNull(userloginhistory.FieldOsRelease)
return u
}
// SetHostname sets the "hostname" field.
func (u *UserLoginHistoryUpsert) SetHostname(v string) *UserLoginHistoryUpsert {
u.Set(userloginhistory.FieldHostname, v)
return u
}
// UpdateHostname sets the "hostname" field to the value that was provided on create.
func (u *UserLoginHistoryUpsert) UpdateHostname() *UserLoginHistoryUpsert {
u.SetExcluded(userloginhistory.FieldHostname)
return u
}
// ClearHostname clears the value of the "hostname" field.
func (u *UserLoginHistoryUpsert) ClearHostname() *UserLoginHistoryUpsert {
u.SetNull(userloginhistory.FieldHostname)
return u
}
@@ -518,6 +642,13 @@ func (u *UserLoginHistoryUpsertOne) UpdateUserID() *UserLoginHistoryUpsertOne {
})
}
// ClearUserID clears the value of the "user_id" field.
func (u *UserLoginHistoryUpsertOne) ClearUserID() *UserLoginHistoryUpsertOne {
return u.Update(func(s *UserLoginHistoryUpsert) {
s.ClearUserID()
})
}
// SetIP sets the "ip" field.
func (u *UserLoginHistoryUpsertOne) SetIP(v string) *UserLoginHistoryUpsertOne {
return u.Update(func(s *UserLoginHistoryUpsert) {
@@ -588,6 +719,13 @@ func (u *UserLoginHistoryUpsertOne) UpdateIsp() *UserLoginHistoryUpsertOne {
})
}
// ClearIsp clears the value of the "isp" field.
func (u *UserLoginHistoryUpsertOne) ClearIsp() *UserLoginHistoryUpsertOne {
return u.Update(func(s *UserLoginHistoryUpsert) {
s.ClearIsp()
})
}
// SetAsn sets the "asn" field.
func (u *UserLoginHistoryUpsertOne) SetAsn(v string) *UserLoginHistoryUpsertOne {
return u.Update(func(s *UserLoginHistoryUpsert) {
@@ -602,6 +740,13 @@ func (u *UserLoginHistoryUpsertOne) UpdateAsn() *UserLoginHistoryUpsertOne {
})
}
// ClearAsn clears the value of the "asn" field.
func (u *UserLoginHistoryUpsertOne) ClearAsn() *UserLoginHistoryUpsertOne {
return u.Update(func(s *UserLoginHistoryUpsert) {
s.ClearAsn()
})
}
// SetClientVersion sets the "client_version" field.
func (u *UserLoginHistoryUpsertOne) SetClientVersion(v string) *UserLoginHistoryUpsertOne {
return u.Update(func(s *UserLoginHistoryUpsert) {
@@ -616,17 +761,73 @@ func (u *UserLoginHistoryUpsertOne) UpdateClientVersion() *UserLoginHistoryUpser
})
}
// SetDevice sets the "device" field.
func (u *UserLoginHistoryUpsertOne) SetDevice(v string) *UserLoginHistoryUpsertOne {
// ClearClientVersion clears the value of the "client_version" field.
func (u *UserLoginHistoryUpsertOne) ClearClientVersion() *UserLoginHistoryUpsertOne {
return u.Update(func(s *UserLoginHistoryUpsert) {
s.SetDevice(v)
s.ClearClientVersion()
})
}
// UpdateDevice sets the "device" field to the value that was provided on create.
func (u *UserLoginHistoryUpsertOne) UpdateDevice() *UserLoginHistoryUpsertOne {
// SetOsType sets the "os_type" field.
func (u *UserLoginHistoryUpsertOne) SetOsType(v consts.OSType) *UserLoginHistoryUpsertOne {
return u.Update(func(s *UserLoginHistoryUpsert) {
s.UpdateDevice()
s.SetOsType(v)
})
}
// UpdateOsType sets the "os_type" field to the value that was provided on create.
func (u *UserLoginHistoryUpsertOne) UpdateOsType() *UserLoginHistoryUpsertOne {
return u.Update(func(s *UserLoginHistoryUpsert) {
s.UpdateOsType()
})
}
// ClearOsType clears the value of the "os_type" field.
func (u *UserLoginHistoryUpsertOne) ClearOsType() *UserLoginHistoryUpsertOne {
return u.Update(func(s *UserLoginHistoryUpsert) {
s.ClearOsType()
})
}
// SetOsRelease sets the "os_release" field.
func (u *UserLoginHistoryUpsertOne) SetOsRelease(v consts.OSRelease) *UserLoginHistoryUpsertOne {
return u.Update(func(s *UserLoginHistoryUpsert) {
s.SetOsRelease(v)
})
}
// UpdateOsRelease sets the "os_release" field to the value that was provided on create.
func (u *UserLoginHistoryUpsertOne) UpdateOsRelease() *UserLoginHistoryUpsertOne {
return u.Update(func(s *UserLoginHistoryUpsert) {
s.UpdateOsRelease()
})
}
// ClearOsRelease clears the value of the "os_release" field.
func (u *UserLoginHistoryUpsertOne) ClearOsRelease() *UserLoginHistoryUpsertOne {
return u.Update(func(s *UserLoginHistoryUpsert) {
s.ClearOsRelease()
})
}
// SetHostname sets the "hostname" field.
func (u *UserLoginHistoryUpsertOne) SetHostname(v string) *UserLoginHistoryUpsertOne {
return u.Update(func(s *UserLoginHistoryUpsert) {
s.SetHostname(v)
})
}
// UpdateHostname sets the "hostname" field to the value that was provided on create.
func (u *UserLoginHistoryUpsertOne) UpdateHostname() *UserLoginHistoryUpsertOne {
return u.Update(func(s *UserLoginHistoryUpsert) {
s.UpdateHostname()
})
}
// ClearHostname clears the value of the "hostname" field.
func (u *UserLoginHistoryUpsertOne) ClearHostname() *UserLoginHistoryUpsertOne {
return u.Update(func(s *UserLoginHistoryUpsert) {
s.ClearHostname()
})
}
@@ -873,6 +1074,13 @@ func (u *UserLoginHistoryUpsertBulk) UpdateUserID() *UserLoginHistoryUpsertBulk
})
}
// ClearUserID clears the value of the "user_id" field.
func (u *UserLoginHistoryUpsertBulk) ClearUserID() *UserLoginHistoryUpsertBulk {
return u.Update(func(s *UserLoginHistoryUpsert) {
s.ClearUserID()
})
}
// SetIP sets the "ip" field.
func (u *UserLoginHistoryUpsertBulk) SetIP(v string) *UserLoginHistoryUpsertBulk {
return u.Update(func(s *UserLoginHistoryUpsert) {
@@ -943,6 +1151,13 @@ func (u *UserLoginHistoryUpsertBulk) UpdateIsp() *UserLoginHistoryUpsertBulk {
})
}
// ClearIsp clears the value of the "isp" field.
func (u *UserLoginHistoryUpsertBulk) ClearIsp() *UserLoginHistoryUpsertBulk {
return u.Update(func(s *UserLoginHistoryUpsert) {
s.ClearIsp()
})
}
// SetAsn sets the "asn" field.
func (u *UserLoginHistoryUpsertBulk) SetAsn(v string) *UserLoginHistoryUpsertBulk {
return u.Update(func(s *UserLoginHistoryUpsert) {
@@ -957,6 +1172,13 @@ func (u *UserLoginHistoryUpsertBulk) UpdateAsn() *UserLoginHistoryUpsertBulk {
})
}
// ClearAsn clears the value of the "asn" field.
func (u *UserLoginHistoryUpsertBulk) ClearAsn() *UserLoginHistoryUpsertBulk {
return u.Update(func(s *UserLoginHistoryUpsert) {
s.ClearAsn()
})
}
// SetClientVersion sets the "client_version" field.
func (u *UserLoginHistoryUpsertBulk) SetClientVersion(v string) *UserLoginHistoryUpsertBulk {
return u.Update(func(s *UserLoginHistoryUpsert) {
@@ -971,17 +1193,73 @@ func (u *UserLoginHistoryUpsertBulk) UpdateClientVersion() *UserLoginHistoryUpse
})
}
// SetDevice sets the "device" field.
func (u *UserLoginHistoryUpsertBulk) SetDevice(v string) *UserLoginHistoryUpsertBulk {
// ClearClientVersion clears the value of the "client_version" field.
func (u *UserLoginHistoryUpsertBulk) ClearClientVersion() *UserLoginHistoryUpsertBulk {
return u.Update(func(s *UserLoginHistoryUpsert) {
s.SetDevice(v)
s.ClearClientVersion()
})
}
// UpdateDevice sets the "device" field to the value that was provided on create.
func (u *UserLoginHistoryUpsertBulk) UpdateDevice() *UserLoginHistoryUpsertBulk {
// SetOsType sets the "os_type" field.
func (u *UserLoginHistoryUpsertBulk) SetOsType(v consts.OSType) *UserLoginHistoryUpsertBulk {
return u.Update(func(s *UserLoginHistoryUpsert) {
s.UpdateDevice()
s.SetOsType(v)
})
}
// UpdateOsType sets the "os_type" field to the value that was provided on create.
func (u *UserLoginHistoryUpsertBulk) UpdateOsType() *UserLoginHistoryUpsertBulk {
return u.Update(func(s *UserLoginHistoryUpsert) {
s.UpdateOsType()
})
}
// ClearOsType clears the value of the "os_type" field.
func (u *UserLoginHistoryUpsertBulk) ClearOsType() *UserLoginHistoryUpsertBulk {
return u.Update(func(s *UserLoginHistoryUpsert) {
s.ClearOsType()
})
}
// SetOsRelease sets the "os_release" field.
func (u *UserLoginHistoryUpsertBulk) SetOsRelease(v consts.OSRelease) *UserLoginHistoryUpsertBulk {
return u.Update(func(s *UserLoginHistoryUpsert) {
s.SetOsRelease(v)
})
}
// UpdateOsRelease sets the "os_release" field to the value that was provided on create.
func (u *UserLoginHistoryUpsertBulk) UpdateOsRelease() *UserLoginHistoryUpsertBulk {
return u.Update(func(s *UserLoginHistoryUpsert) {
s.UpdateOsRelease()
})
}
// ClearOsRelease clears the value of the "os_release" field.
func (u *UserLoginHistoryUpsertBulk) ClearOsRelease() *UserLoginHistoryUpsertBulk {
return u.Update(func(s *UserLoginHistoryUpsert) {
s.ClearOsRelease()
})
}
// SetHostname sets the "hostname" field.
func (u *UserLoginHistoryUpsertBulk) SetHostname(v string) *UserLoginHistoryUpsertBulk {
return u.Update(func(s *UserLoginHistoryUpsert) {
s.SetHostname(v)
})
}
// UpdateHostname sets the "hostname" field to the value that was provided on create.
func (u *UserLoginHistoryUpsertBulk) UpdateHostname() *UserLoginHistoryUpsertBulk {
return u.Update(func(s *UserLoginHistoryUpsert) {
s.UpdateHostname()
})
}
// ClearHostname clears the value of the "hostname" field.
func (u *UserLoginHistoryUpsertBulk) ClearHostname() *UserLoginHistoryUpsertBulk {
return u.Update(func(s *UserLoginHistoryUpsert) {
s.ClearHostname()
})
}

View File

@@ -26,7 +26,6 @@ type UserLoginHistoryQuery struct {
inters []Interceptor
predicates []predicate.UserLoginHistory
withOwner *UserQuery
withFKs bool
modifiers []func(*sql.Selector)
// intermediate query (i.e. traversal path).
sql *sql.Selector
@@ -374,18 +373,11 @@ func (ulhq *UserLoginHistoryQuery) prepareQuery(ctx context.Context) error {
func (ulhq *UserLoginHistoryQuery) sqlAll(ctx context.Context, hooks ...queryHook) ([]*UserLoginHistory, error) {
var (
nodes = []*UserLoginHistory{}
withFKs = ulhq.withFKs
_spec = ulhq.querySpec()
loadedTypes = [1]bool{
ulhq.withOwner != nil,
}
)
if ulhq.withOwner != nil {
withFKs = true
}
if withFKs {
_spec.Node.Columns = append(_spec.Node.Columns, userloginhistory.ForeignKeys...)
}
_spec.ScanValues = func(columns []string) ([]any, error) {
return (*UserLoginHistory).scanValues(nil, columns)
}
@@ -420,10 +412,7 @@ func (ulhq *UserLoginHistoryQuery) loadOwner(ctx context.Context, query *UserQue
ids := make([]uuid.UUID, 0, len(nodes))
nodeids := make(map[uuid.UUID][]*UserLoginHistory)
for i := range nodes {
if nodes[i].user_login_histories == nil {
continue
}
fk := *nodes[i].user_login_histories
fk := nodes[i].UserID
if _, ok := nodeids[fk]; !ok {
ids = append(ids, fk)
}
@@ -440,7 +429,7 @@ func (ulhq *UserLoginHistoryQuery) loadOwner(ctx context.Context, query *UserQue
for _, n := range neighbors {
nodes, ok := nodeids[n.ID]
if !ok {
return fmt.Errorf(`unexpected foreign-key "user_login_histories" returned %v`, n.ID)
return fmt.Errorf(`unexpected foreign-key "user_id" returned %v`, n.ID)
}
for i := range nodes {
assign(nodes[i], n)
@@ -477,6 +466,9 @@ func (ulhq *UserLoginHistoryQuery) querySpec() *sqlgraph.QuerySpec {
_spec.Node.Columns = append(_spec.Node.Columns, fields[i])
}
}
if ulhq.withOwner != nil {
_spec.Node.AddColumnOnce(userloginhistory.FieldUserID)
}
}
if ps := ulhq.predicates; len(ps) > 0 {
_spec.Predicate = func(selector *sql.Selector) {

View File

@@ -11,6 +11,7 @@ import (
"entgo.io/ent/dialect/sql"
"entgo.io/ent/dialect/sql/sqlgraph"
"entgo.io/ent/schema/field"
"github.com/chaitin/MonkeyCode/backend/consts"
"github.com/chaitin/MonkeyCode/backend/db/predicate"
"github.com/chaitin/MonkeyCode/backend/db/user"
"github.com/chaitin/MonkeyCode/backend/db/userloginhistory"
@@ -45,6 +46,12 @@ func (ulhu *UserLoginHistoryUpdate) SetNillableUserID(u *uuid.UUID) *UserLoginHi
return ulhu
}
// ClearUserID clears the value of the "user_id" field.
func (ulhu *UserLoginHistoryUpdate) ClearUserID() *UserLoginHistoryUpdate {
ulhu.mutation.ClearUserID()
return ulhu
}
// SetIP sets the "ip" field.
func (ulhu *UserLoginHistoryUpdate) SetIP(s string) *UserLoginHistoryUpdate {
ulhu.mutation.SetIP(s)
@@ -115,6 +122,12 @@ func (ulhu *UserLoginHistoryUpdate) SetNillableIsp(s *string) *UserLoginHistoryU
return ulhu
}
// ClearIsp clears the value of the "isp" field.
func (ulhu *UserLoginHistoryUpdate) ClearIsp() *UserLoginHistoryUpdate {
ulhu.mutation.ClearIsp()
return ulhu
}
// SetAsn sets the "asn" field.
func (ulhu *UserLoginHistoryUpdate) SetAsn(s string) *UserLoginHistoryUpdate {
ulhu.mutation.SetAsn(s)
@@ -129,6 +142,12 @@ func (ulhu *UserLoginHistoryUpdate) SetNillableAsn(s *string) *UserLoginHistoryU
return ulhu
}
// ClearAsn clears the value of the "asn" field.
func (ulhu *UserLoginHistoryUpdate) ClearAsn() *UserLoginHistoryUpdate {
ulhu.mutation.ClearAsn()
return ulhu
}
// SetClientVersion sets the "client_version" field.
func (ulhu *UserLoginHistoryUpdate) SetClientVersion(s string) *UserLoginHistoryUpdate {
ulhu.mutation.SetClientVersion(s)
@@ -143,20 +162,72 @@ func (ulhu *UserLoginHistoryUpdate) SetNillableClientVersion(s *string) *UserLog
return ulhu
}
// SetDevice sets the "device" field.
func (ulhu *UserLoginHistoryUpdate) SetDevice(s string) *UserLoginHistoryUpdate {
ulhu.mutation.SetDevice(s)
// ClearClientVersion clears the value of the "client_version" field.
func (ulhu *UserLoginHistoryUpdate) ClearClientVersion() *UserLoginHistoryUpdate {
ulhu.mutation.ClearClientVersion()
return ulhu
}
// SetNillableDevice sets the "device" field if the given value is not nil.
func (ulhu *UserLoginHistoryUpdate) SetNillableDevice(s *string) *UserLoginHistoryUpdate {
if s != nil {
ulhu.SetDevice(*s)
// SetOsType sets the "os_type" field.
func (ulhu *UserLoginHistoryUpdate) SetOsType(ct consts.OSType) *UserLoginHistoryUpdate {
ulhu.mutation.SetOsType(ct)
return ulhu
}
// SetNillableOsType sets the "os_type" field if the given value is not nil.
func (ulhu *UserLoginHistoryUpdate) SetNillableOsType(ct *consts.OSType) *UserLoginHistoryUpdate {
if ct != nil {
ulhu.SetOsType(*ct)
}
return ulhu
}
// ClearOsType clears the value of the "os_type" field.
func (ulhu *UserLoginHistoryUpdate) ClearOsType() *UserLoginHistoryUpdate {
ulhu.mutation.ClearOsType()
return ulhu
}
// SetOsRelease sets the "os_release" field.
func (ulhu *UserLoginHistoryUpdate) SetOsRelease(cr consts.OSRelease) *UserLoginHistoryUpdate {
ulhu.mutation.SetOsRelease(cr)
return ulhu
}
// SetNillableOsRelease sets the "os_release" field if the given value is not nil.
func (ulhu *UserLoginHistoryUpdate) SetNillableOsRelease(cr *consts.OSRelease) *UserLoginHistoryUpdate {
if cr != nil {
ulhu.SetOsRelease(*cr)
}
return ulhu
}
// ClearOsRelease clears the value of the "os_release" field.
func (ulhu *UserLoginHistoryUpdate) ClearOsRelease() *UserLoginHistoryUpdate {
ulhu.mutation.ClearOsRelease()
return ulhu
}
// SetHostname sets the "hostname" field.
func (ulhu *UserLoginHistoryUpdate) SetHostname(s string) *UserLoginHistoryUpdate {
ulhu.mutation.SetHostname(s)
return ulhu
}
// SetNillableHostname sets the "hostname" field if the given value is not nil.
func (ulhu *UserLoginHistoryUpdate) SetNillableHostname(s *string) *UserLoginHistoryUpdate {
if s != nil {
ulhu.SetHostname(*s)
}
return ulhu
}
// ClearHostname clears the value of the "hostname" field.
func (ulhu *UserLoginHistoryUpdate) ClearHostname() *UserLoginHistoryUpdate {
ulhu.mutation.ClearHostname()
return ulhu
}
// SetCreatedAt sets the "created_at" field.
func (ulhu *UserLoginHistoryUpdate) SetCreatedAt(t time.Time) *UserLoginHistoryUpdate {
ulhu.mutation.SetCreatedAt(t)
@@ -243,9 +314,6 @@ func (ulhu *UserLoginHistoryUpdate) sqlSave(ctx context.Context) (n int, err err
}
}
}
if value, ok := ulhu.mutation.UserID(); ok {
_spec.SetField(userloginhistory.FieldUserID, field.TypeUUID, value)
}
if value, ok := ulhu.mutation.IP(); ok {
_spec.SetField(userloginhistory.FieldIP, field.TypeString, value)
}
@@ -261,14 +329,38 @@ func (ulhu *UserLoginHistoryUpdate) sqlSave(ctx context.Context) (n int, err err
if value, ok := ulhu.mutation.Isp(); ok {
_spec.SetField(userloginhistory.FieldIsp, field.TypeString, value)
}
if ulhu.mutation.IspCleared() {
_spec.ClearField(userloginhistory.FieldIsp, field.TypeString)
}
if value, ok := ulhu.mutation.Asn(); ok {
_spec.SetField(userloginhistory.FieldAsn, field.TypeString, value)
}
if ulhu.mutation.AsnCleared() {
_spec.ClearField(userloginhistory.FieldAsn, field.TypeString)
}
if value, ok := ulhu.mutation.ClientVersion(); ok {
_spec.SetField(userloginhistory.FieldClientVersion, field.TypeString, value)
}
if value, ok := ulhu.mutation.Device(); ok {
_spec.SetField(userloginhistory.FieldDevice, field.TypeString, value)
if ulhu.mutation.ClientVersionCleared() {
_spec.ClearField(userloginhistory.FieldClientVersion, field.TypeString)
}
if value, ok := ulhu.mutation.OsType(); ok {
_spec.SetField(userloginhistory.FieldOsType, field.TypeString, value)
}
if ulhu.mutation.OsTypeCleared() {
_spec.ClearField(userloginhistory.FieldOsType, field.TypeString)
}
if value, ok := ulhu.mutation.OsRelease(); ok {
_spec.SetField(userloginhistory.FieldOsRelease, field.TypeString, value)
}
if ulhu.mutation.OsReleaseCleared() {
_spec.ClearField(userloginhistory.FieldOsRelease, field.TypeString)
}
if value, ok := ulhu.mutation.Hostname(); ok {
_spec.SetField(userloginhistory.FieldHostname, field.TypeString, value)
}
if ulhu.mutation.HostnameCleared() {
_spec.ClearField(userloginhistory.FieldHostname, field.TypeString)
}
if value, ok := ulhu.mutation.CreatedAt(); ok {
_spec.SetField(userloginhistory.FieldCreatedAt, field.TypeTime, value)
@@ -338,6 +430,12 @@ func (ulhuo *UserLoginHistoryUpdateOne) SetNillableUserID(u *uuid.UUID) *UserLog
return ulhuo
}
// ClearUserID clears the value of the "user_id" field.
func (ulhuo *UserLoginHistoryUpdateOne) ClearUserID() *UserLoginHistoryUpdateOne {
ulhuo.mutation.ClearUserID()
return ulhuo
}
// SetIP sets the "ip" field.
func (ulhuo *UserLoginHistoryUpdateOne) SetIP(s string) *UserLoginHistoryUpdateOne {
ulhuo.mutation.SetIP(s)
@@ -408,6 +506,12 @@ func (ulhuo *UserLoginHistoryUpdateOne) SetNillableIsp(s *string) *UserLoginHist
return ulhuo
}
// ClearIsp clears the value of the "isp" field.
func (ulhuo *UserLoginHistoryUpdateOne) ClearIsp() *UserLoginHistoryUpdateOne {
ulhuo.mutation.ClearIsp()
return ulhuo
}
// SetAsn sets the "asn" field.
func (ulhuo *UserLoginHistoryUpdateOne) SetAsn(s string) *UserLoginHistoryUpdateOne {
ulhuo.mutation.SetAsn(s)
@@ -422,6 +526,12 @@ func (ulhuo *UserLoginHistoryUpdateOne) SetNillableAsn(s *string) *UserLoginHist
return ulhuo
}
// ClearAsn clears the value of the "asn" field.
func (ulhuo *UserLoginHistoryUpdateOne) ClearAsn() *UserLoginHistoryUpdateOne {
ulhuo.mutation.ClearAsn()
return ulhuo
}
// SetClientVersion sets the "client_version" field.
func (ulhuo *UserLoginHistoryUpdateOne) SetClientVersion(s string) *UserLoginHistoryUpdateOne {
ulhuo.mutation.SetClientVersion(s)
@@ -436,20 +546,72 @@ func (ulhuo *UserLoginHistoryUpdateOne) SetNillableClientVersion(s *string) *Use
return ulhuo
}
// SetDevice sets the "device" field.
func (ulhuo *UserLoginHistoryUpdateOne) SetDevice(s string) *UserLoginHistoryUpdateOne {
ulhuo.mutation.SetDevice(s)
// ClearClientVersion clears the value of the "client_version" field.
func (ulhuo *UserLoginHistoryUpdateOne) ClearClientVersion() *UserLoginHistoryUpdateOne {
ulhuo.mutation.ClearClientVersion()
return ulhuo
}
// SetNillableDevice sets the "device" field if the given value is not nil.
func (ulhuo *UserLoginHistoryUpdateOne) SetNillableDevice(s *string) *UserLoginHistoryUpdateOne {
if s != nil {
ulhuo.SetDevice(*s)
// SetOsType sets the "os_type" field.
func (ulhuo *UserLoginHistoryUpdateOne) SetOsType(ct consts.OSType) *UserLoginHistoryUpdateOne {
ulhuo.mutation.SetOsType(ct)
return ulhuo
}
// SetNillableOsType sets the "os_type" field if the given value is not nil.
func (ulhuo *UserLoginHistoryUpdateOne) SetNillableOsType(ct *consts.OSType) *UserLoginHistoryUpdateOne {
if ct != nil {
ulhuo.SetOsType(*ct)
}
return ulhuo
}
// ClearOsType clears the value of the "os_type" field.
func (ulhuo *UserLoginHistoryUpdateOne) ClearOsType() *UserLoginHistoryUpdateOne {
ulhuo.mutation.ClearOsType()
return ulhuo
}
// SetOsRelease sets the "os_release" field.
func (ulhuo *UserLoginHistoryUpdateOne) SetOsRelease(cr consts.OSRelease) *UserLoginHistoryUpdateOne {
ulhuo.mutation.SetOsRelease(cr)
return ulhuo
}
// SetNillableOsRelease sets the "os_release" field if the given value is not nil.
func (ulhuo *UserLoginHistoryUpdateOne) SetNillableOsRelease(cr *consts.OSRelease) *UserLoginHistoryUpdateOne {
if cr != nil {
ulhuo.SetOsRelease(*cr)
}
return ulhuo
}
// ClearOsRelease clears the value of the "os_release" field.
func (ulhuo *UserLoginHistoryUpdateOne) ClearOsRelease() *UserLoginHistoryUpdateOne {
ulhuo.mutation.ClearOsRelease()
return ulhuo
}
// SetHostname sets the "hostname" field.
func (ulhuo *UserLoginHistoryUpdateOne) SetHostname(s string) *UserLoginHistoryUpdateOne {
ulhuo.mutation.SetHostname(s)
return ulhuo
}
// SetNillableHostname sets the "hostname" field if the given value is not nil.
func (ulhuo *UserLoginHistoryUpdateOne) SetNillableHostname(s *string) *UserLoginHistoryUpdateOne {
if s != nil {
ulhuo.SetHostname(*s)
}
return ulhuo
}
// ClearHostname clears the value of the "hostname" field.
func (ulhuo *UserLoginHistoryUpdateOne) ClearHostname() *UserLoginHistoryUpdateOne {
ulhuo.mutation.ClearHostname()
return ulhuo
}
// SetCreatedAt sets the "created_at" field.
func (ulhuo *UserLoginHistoryUpdateOne) SetCreatedAt(t time.Time) *UserLoginHistoryUpdateOne {
ulhuo.mutation.SetCreatedAt(t)
@@ -566,9 +728,6 @@ func (ulhuo *UserLoginHistoryUpdateOne) sqlSave(ctx context.Context) (_node *Use
}
}
}
if value, ok := ulhuo.mutation.UserID(); ok {
_spec.SetField(userloginhistory.FieldUserID, field.TypeUUID, value)
}
if value, ok := ulhuo.mutation.IP(); ok {
_spec.SetField(userloginhistory.FieldIP, field.TypeString, value)
}
@@ -584,14 +743,38 @@ func (ulhuo *UserLoginHistoryUpdateOne) sqlSave(ctx context.Context) (_node *Use
if value, ok := ulhuo.mutation.Isp(); ok {
_spec.SetField(userloginhistory.FieldIsp, field.TypeString, value)
}
if ulhuo.mutation.IspCleared() {
_spec.ClearField(userloginhistory.FieldIsp, field.TypeString)
}
if value, ok := ulhuo.mutation.Asn(); ok {
_spec.SetField(userloginhistory.FieldAsn, field.TypeString, value)
}
if ulhuo.mutation.AsnCleared() {
_spec.ClearField(userloginhistory.FieldAsn, field.TypeString)
}
if value, ok := ulhuo.mutation.ClientVersion(); ok {
_spec.SetField(userloginhistory.FieldClientVersion, field.TypeString, value)
}
if value, ok := ulhuo.mutation.Device(); ok {
_spec.SetField(userloginhistory.FieldDevice, field.TypeString, value)
if ulhuo.mutation.ClientVersionCleared() {
_spec.ClearField(userloginhistory.FieldClientVersion, field.TypeString)
}
if value, ok := ulhuo.mutation.OsType(); ok {
_spec.SetField(userloginhistory.FieldOsType, field.TypeString, value)
}
if ulhuo.mutation.OsTypeCleared() {
_spec.ClearField(userloginhistory.FieldOsType, field.TypeString)
}
if value, ok := ulhuo.mutation.OsRelease(); ok {
_spec.SetField(userloginhistory.FieldOsRelease, field.TypeString, value)
}
if ulhuo.mutation.OsReleaseCleared() {
_spec.ClearField(userloginhistory.FieldOsRelease, field.TypeString)
}
if value, ok := ulhuo.mutation.Hostname(); ok {
_spec.SetField(userloginhistory.FieldHostname, field.TypeString, value)
}
if ulhuo.mutation.HostnameCleared() {
_spec.ClearField(userloginhistory.FieldHostname, field.TypeString)
}
if value, ok := ulhuo.mutation.CreatedAt(); ok {
_spec.SetField(userloginhistory.FieldCreatedAt, field.TypeTime, value)

8
backend/domain/ip.go Normal file
View File

@@ -0,0 +1,8 @@
package domain
type IPAddress struct {
IP string `json:"ip"`
Country string `json:"country"`
Province string `json:"province"`
City string `json:"city"`
}

View File

@@ -48,6 +48,7 @@ func (o OAuthSignUpOrInReq) OAuthKind() consts.OAuthKind {
type OAuthCallbackReq struct {
State string `json:"state" query:"state" validate:"required"`
Code string `json:"code" query:"code" validate:"required"`
IP string `json:"-"`
}
type OAuthURLResp struct {

View File

@@ -2,6 +2,7 @@ package domain
import (
"context"
"fmt"
"github.com/GoYoko/web"
@@ -53,6 +54,8 @@ type UserRepo interface {
OAuthRegister(ctx context.Context, platform consts.UserPlatform, inviteCode string, req *OAuthUserInfo) (*db.User, error)
OAuthLogin(ctx context.Context, platform consts.UserPlatform, req *OAuthUserInfo) (*db.User, error)
SignUpOrIn(ctx context.Context, platform consts.UserPlatform, req *OAuthUserInfo) (*db.User, error)
SaveAdminLoginHistory(ctx context.Context, adminID, ip string) error
SaveUserLoginHistory(ctx context.Context, userID, ip string, session *VSCodeSession) error
}
type UpdateUserReq struct {
@@ -67,9 +70,13 @@ type CreateAdminReq struct {
}
type VSCodeAuthInitReq struct {
ClientID string `json:"client_id" validate:"required"` // 客户端ID
RedirectURI string `json:"redirect_uri" validate:"required"` // 重定向URI
State string `json:"state" validate:"required"` // 状态
ClientID string `json:"client_id" validate:"required"` // 客户端ID
RedirectURI string `json:"redirect_uri" validate:"required"` // 重定向URI
State string `json:"state" validate:"required"` // 状态
Version string `json:"version"` // 版本
OSType consts.OSType `json:"os_type"` // 操作系统类型
OSRelease consts.OSRelease `json:"os_release"` // 操作系统版本
Hostname string `json:"hostname"` // 主机名
}
type VSCodeAuthInitResp struct {
@@ -80,6 +87,7 @@ type LoginReq struct {
SessionID string `json:"session_id"` // 会话Id
Username string `json:"username"` // 用户名
Password string `json:"password"` // 密码
IP string `json:"-"` // IP地址
}
type AdminLoginReq struct {
@@ -152,7 +160,10 @@ func (l *UserLoginHistory) From(e *db.UserLoginHistory) *UserLoginHistory {
ASN: e.Asn,
}
l.ClientVersion = e.ClientVersion
l.Device = e.Device
l.Device = e.OsType.Name()
if e.Hostname != "" {
l.Device += fmt.Sprintf(" (%s)", e.Hostname)
}
l.CreatedAt = e.CreatedAt.Unix()
return l
@@ -248,9 +259,13 @@ func (a *AdminUser) From(e *db.Admin) *AdminUser {
}
type VSCodeSession struct {
ID string `json:"id"` // 会话ID
State string `json:"state"` // 状态
RedirectURI string `json:"redirect_uri"` // 重定向URI
ID string `json:"id"` // 会话ID
State string `json:"state"` // 状态
RedirectURI string `json:"redirect_uri"` // 重定向URI
Version string `json:"version"` // 版本
OSType consts.OSType `json:"os_type"` // 操作系统类型
OSRelease consts.OSRelease `json:"os_release"` // 操作系统版本
Hostname string `json:"hostname"` // 主机名
}
type UpdateSettingReq struct {

View File

@@ -28,15 +28,15 @@ func (AdminLoginHistory) Annotations() []schema.Annotation {
func (AdminLoginHistory) Fields() []ent.Field {
return []ent.Field{
field.UUID("id", uuid.UUID{}),
field.UUID("admin_id", uuid.UUID{}),
field.UUID("admin_id", uuid.UUID{}).Optional(),
field.String("ip"),
field.String("country"),
field.String("province"),
field.String("city"),
field.String("isp"),
field.String("asn"),
field.String("client_version"),
field.String("device"),
field.String("isp").Optional(),
field.String("asn").Optional(),
field.String("client_version").Optional(),
field.String("device").Optional(),
field.Time("created_at").Default(time.Now),
}
}
@@ -44,6 +44,6 @@ func (AdminLoginHistory) Fields() []ent.Field {
// Edges of the AdminLoginHistory.
func (AdminLoginHistory) Edges() []ent.Edge {
return []ent.Edge{
edge.From("owner", Admin.Type).Ref("login_histories").Unique(),
edge.From("owner", Admin.Type).Field("admin_id").Ref("login_histories").Unique(),
}
}

View File

@@ -9,6 +9,8 @@ import (
"entgo.io/ent/schema/edge"
"entgo.io/ent/schema/field"
"github.com/google/uuid"
"github.com/chaitin/MonkeyCode/backend/consts"
)
// UserLoginHistory holds the schema definition for the UserLoginHistory entity.
@@ -28,15 +30,17 @@ func (UserLoginHistory) Annotations() []schema.Annotation {
func (UserLoginHistory) Fields() []ent.Field {
return []ent.Field{
field.UUID("id", uuid.UUID{}),
field.UUID("user_id", uuid.UUID{}),
field.UUID("user_id", uuid.UUID{}).Optional(),
field.String("ip"),
field.String("country"),
field.String("province"),
field.String("city"),
field.String("isp"),
field.String("asn"),
field.String("client_version"),
field.String("device"),
field.String("isp").Optional(),
field.String("asn").Optional(),
field.String("client_version").Optional(),
field.String("os_type").GoType(consts.OSType("")).Optional(),
field.String("os_release").GoType(consts.OSRelease("")).Optional(),
field.String("hostname").Optional(),
field.Time("created_at").Default(time.Now),
}
}
@@ -44,6 +48,6 @@ func (UserLoginHistory) Fields() []ent.Field {
// Edges of the UserLoginHistory.
func (UserLoginHistory) Edges() []ent.Edge {
return []ent.Edge{
edge.From("owner", User.Type).Ref("login_histories").Unique(),
edge.From("owner", User.Type).Field("user_id").Ref("login_histories").Unique(),
}
}

View File

@@ -12,6 +12,7 @@ require (
github.com/google/wire v0.6.0
github.com/labstack/echo/v4 v4.13.4
github.com/lib/pq v1.10.9
github.com/lionsoul2014/ip2region/binding/golang v0.0.0-20250630080345-f9402614f6ba
github.com/patrickmn/go-cache v2.1.0+incompatible
github.com/redis/go-redis/v9 v9.7.3
github.com/rokku-c/go-openai v1.35.7-fix2

View File

@@ -163,6 +163,8 @@ github.com/leodido/go-urn v1.4.0 h1:WT9HwE9SGECu3lg4d/dIA+jxlljEa1/ffXKmRjqdmIQ=
github.com/leodido/go-urn v1.4.0/go.mod h1:bvxc+MVxLKB4z00jd1z+Dvzr47oO32F/QSNjSBOlFxI=
github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw=
github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o=
github.com/lionsoul2014/ip2region/binding/golang v0.0.0-20250630080345-f9402614f6ba h1:t6xeYtXFnvu+GsvgEYyAK5zFnJARSG1fyGzBRZzuOhA=
github.com/lionsoul2014/ip2region/binding/golang v0.0.0-20250630080345-f9402614f6ba/go.mod h1:C5LA5UO2ZXJrLaPLYtE1wUJMiyd/nwWaCO5cw/2pSHs=
github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0=

View File

@@ -203,6 +203,7 @@ func (h *UserHandler) VSIXDownload(c *web.Context) error {
// @Success 200 {object} web.Resp{data=domain.LoginResp}
// @Router /api/v1/user/login [post]
func (h *UserHandler) Login(c *web.Context, req domain.LoginReq) error {
req.IP = c.RealIP()
resp, err := h.usecase.Login(c.Request().Context(), &req)
if err != nil {
return err
@@ -279,6 +280,7 @@ func (h *UserHandler) DeleteAdmin(c *web.Context) error {
// @Success 200 {object} web.Resp{data=domain.AdminUser}
// @Router /api/v1/admin/login [post]
func (h *UserHandler) AdminLogin(c *web.Context, req domain.LoginReq) error {
req.IP = c.RealIP()
resp, err := h.usecase.AdminLogin(c.Request().Context(), &req)
if err != nil {
return err
@@ -497,6 +499,7 @@ func (h *UserHandler) OAuthSignUpOrIn(ctx *web.Context, req domain.OAuthSignUpOr
// @Success 200 {object} web.Resp{data=string}
// @Router /api/v1/user/oauth/callback [get]
func (h *UserHandler) OAuthCallback(ctx *web.Context, req domain.OAuthCallbackReq) error {
req.IP = ctx.RealIP()
resp, err := h.usecase.OAuthCallback(ctx.Request().Context(), &req)
if err != nil {
return err

View File

@@ -6,6 +6,7 @@ import (
"fmt"
"time"
"entgo.io/ent/dialect/sql"
"github.com/google/uuid"
"github.com/GoYoko/web"
@@ -13,21 +14,25 @@ import (
"github.com/chaitin/MonkeyCode/backend/consts"
"github.com/chaitin/MonkeyCode/backend/db"
"github.com/chaitin/MonkeyCode/backend/db/admin"
"github.com/chaitin/MonkeyCode/backend/db/adminloginhistory"
"github.com/chaitin/MonkeyCode/backend/db/apikey"
"github.com/chaitin/MonkeyCode/backend/db/invitecode"
"github.com/chaitin/MonkeyCode/backend/db/user"
"github.com/chaitin/MonkeyCode/backend/db/useridentity"
"github.com/chaitin/MonkeyCode/backend/db/userloginhistory"
"github.com/chaitin/MonkeyCode/backend/domain"
"github.com/chaitin/MonkeyCode/backend/errcode"
"github.com/chaitin/MonkeyCode/backend/pkg/entx"
"github.com/chaitin/MonkeyCode/backend/pkg/ipdb"
)
type UserRepo struct {
db *db.Client
db *db.Client
ipdb *ipdb.IPDB
}
func NewUserRepo(db *db.Client) domain.UserRepo {
return &UserRepo{db: db}
func NewUserRepo(db *db.Client, ipdb *ipdb.IPDB) domain.UserRepo {
return &UserRepo{db: db, ipdb: ipdb}
}
func (r *UserRepo) InitAdmin(ctx context.Context, username, password string) error {
@@ -115,12 +120,12 @@ func (r *UserRepo) CreateUser(ctx context.Context, user *db.User) (*db.User, err
}
func (r *UserRepo) UserLoginHistory(ctx context.Context, page *web.Pagination) ([]*db.UserLoginHistory, *db.PageInfo, error) {
q := r.db.UserLoginHistory.Query()
q := r.db.UserLoginHistory.Query().WithOwner().Order(userloginhistory.ByCreatedAt(sql.OrderDesc()))
return q.Page(ctx, page.Page, page.Size)
}
func (r *UserRepo) AdminLoginHistory(ctx context.Context, page *web.Pagination) ([]*db.AdminLoginHistory, *db.PageInfo, error) {
q := r.db.AdminLoginHistory.Query()
q := r.db.AdminLoginHistory.Query().WithOwner().Order(adminloginhistory.ByCreatedAt(sql.OrderDesc()))
return q.Page(ctx, page.Page, page.Size)
}
@@ -369,3 +374,45 @@ func (r *UserRepo) SignUpOrIn(ctx context.Context, platform consts.UserPlatform,
})
return u, err
}
func (r *UserRepo) SaveAdminLoginHistory(ctx context.Context, adminID string, ip string) error {
uid, err := uuid.Parse(adminID)
if err != nil {
return err
}
addr, err := r.ipdb.Lookup(ip)
if err != nil {
return err
}
_, err = r.db.AdminLoginHistory.Create().
SetAdminID(uid).
SetIP(ip).
SetCity(addr.City).
SetCountry(addr.Country).
SetProvince(addr.Province).
Save(ctx)
return err
}
func (r *UserRepo) SaveUserLoginHistory(ctx context.Context, userID string, ip string, session *domain.VSCodeSession) error {
uid, err := uuid.Parse(userID)
if err != nil {
return err
}
addr, err := r.ipdb.Lookup(ip)
if err != nil {
return err
}
_, err = r.db.UserLoginHistory.Create().
SetUserID(uid).
SetIP(ip).
SetCity(addr.City).
SetCountry(addr.Country).
SetProvince(addr.Province).
SetClientVersion(session.Version).
SetOsType(session.OSType).
SetOsRelease(session.OSRelease).
SetHostname(session.Hostname).
Save(ctx)
return err
}

View File

@@ -116,7 +116,7 @@ func (u *UserUsecase) AdminLoginHistory(ctx context.Context, page *web.Paginatio
return &domain.ListAdminLoginHistoryResp{
PageInfo: p,
LoginHistories: cvt.Iter(histories, func(_ int, e *db.AdminLoginHistory) *domain.AdminLoginHistory {
return cvt.From(e, &domain.AdminLoginHistory{}).From(e)
return cvt.From(e, &domain.AdminLoginHistory{})
}),
}, nil
}
@@ -187,26 +187,30 @@ func (u *UserUsecase) Login(ctx context.Context, req *domain.LoginReq) (*domain.
return nil, err
}
r, err := u.getVSCodeURL(ctx, req.SessionID, apiKey.Key, user.Username)
r, session, err := u.getVSCodeURL(ctx, req.SessionID, apiKey.Key, user.Username)
if err != nil {
return nil, err
}
if err := u.repo.SaveUserLoginHistory(ctx, user.ID.String(), req.IP, session); err != nil {
u.logger.With("error", err).Error("save user login history")
}
return &domain.LoginResp{
RedirectURL: r,
}, nil
}
func (u *UserUsecase) getVSCodeURL(ctx context.Context, sessionID, apiKey, username string) (string, error) {
func (u *UserUsecase) getVSCodeURL(ctx context.Context, sessionID, apiKey, username string) (string, *domain.VSCodeSession, error) {
s, err := u.redis.Get(ctx, fmt.Sprintf("vscode:session:%s", sessionID)).Result()
if err != nil {
return "", err
return "", nil, err
}
session := &domain.VSCodeSession{}
if err := json.Unmarshal([]byte(s), session); err != nil {
return "", err
return "", nil, err
}
r := fmt.Sprintf("%s?state=%s&api_key=%s&expires_in=3600&username=%s", session.RedirectURI, session.State, apiKey, username)
return r, nil
return r, session, nil
}
func (u *UserUsecase) AdminLogin(ctx context.Context, req *domain.LoginReq) (*domain.AdminUser, error) {
@@ -217,6 +221,10 @@ func (u *UserUsecase) AdminLogin(ctx context.Context, req *domain.LoginReq) (*do
if err := bcrypt.CompareHashAndPassword([]byte(admin.Password), []byte(req.Password)); err != nil {
return nil, errcode.ErrPassword.Wrap(err)
}
if err := u.repo.SaveAdminLoginHistory(ctx, admin.ID.String(), req.IP); err != nil {
return nil, err
}
return cvt.From(admin, &domain.AdminUser{}), nil
}
@@ -226,6 +234,10 @@ func (u *UserUsecase) VSCodeAuthInit(ctx context.Context, req *domain.VSCodeAuth
ID: i,
State: req.State,
RedirectURI: req.RedirectURI,
Version: req.Version,
OSType: req.OSType,
OSRelease: req.OSRelease,
Hostname: req.Hostname,
}
b, err := json.Marshal(session)
@@ -513,11 +525,14 @@ func (u *UserUsecase) WithOAuthCallback(ctx context.Context, req *domain.OAuthCa
redirect := session.RedirectURL
if session.SessionID != "" {
r, err := u.getVSCodeURL(ctx, session.SessionID, apiKey.Key, user.Username)
r, vsess, err := u.getVSCodeURL(ctx, session.SessionID, apiKey.Key, user.Username)
if err != nil {
return "", err
}
redirect = fmt.Sprintf("%s?redirect_url=%s", redirect, url.QueryEscape(r))
if err := u.repo.SaveUserLoginHistory(ctx, user.ID.String(), req.IP, vsess); err != nil {
u.logger.With("error", err).Error("save user login history")
}
}
u.logger.Debug("oauth callback", "redirect", redirect)

View File

@@ -0,0 +1,5 @@
ALTER TABLE user_login_histories DROP COLUMN IF EXISTS device;
ALTER TABLE user_login_histories ADD COLUMN IF NOT EXISTS hostname VARCHAR(255);
ALTER TABLE user_login_histories ADD COLUMN IF NOT EXISTS os_type VARCHAR(255);
ALTER TABLE user_login_histories ADD COLUMN IF NOT EXISTS os_release VARCHAR(255);

View File

@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:867b619b567f51bb9dd3c384a4cbf7c33e71a178aa58f13201499aadaf2cf78e
size 11070083

61
backend/pkg/ipdb/ipdb.go Normal file
View File

@@ -0,0 +1,61 @@
package ipdb
import (
"embed"
"fmt"
"log/slog"
"strings"
"github.com/lionsoul2014/ip2region/binding/golang/xdb"
"github.com/chaitin/MonkeyCode/backend/domain"
)
//go:embed ip2region.xdb
var ipdbFiles embed.FS
type IPDB struct {
searcher *xdb.Searcher
logger *slog.Logger
}
func NewIPDB(logger *slog.Logger) (*IPDB, error) {
cBuff, err := xdb.LoadContentFromFS(ipdbFiles, "ip2region.xdb")
if err != nil {
return nil, fmt.Errorf("load xdb index failed: %w", err)
}
searcher, err := xdb.NewWithBuffer(cBuff)
if err != nil {
return nil, fmt.Errorf("new xdb reader failed: %w", err)
}
return &IPDB{searcher: searcher, logger: logger.With("module", "ipdb")}, nil
}
func (a *IPDB) Lookup(ip string) (*domain.IPAddress, error) {
region, err := a.searcher.SearchByStr(ip)
if err != nil {
return nil, fmt.Errorf("search ip failed: %w", err)
}
ipInfo := strings.Split(region, "|")
if len(ipInfo) != 5 {
return nil, fmt.Errorf("invalid ip info: %s", region)
}
country := ipInfo[0]
province := ipInfo[2]
city := ipInfo[3]
if country == "0" {
country = "未知"
}
if province == "0" {
province = "未知"
}
if city == "0" {
city = "未知"
}
return &domain.IPAddress{
IP: ip,
Country: country,
Province: province,
City: city,
}, nil
}

View File

@@ -11,6 +11,7 @@ import (
"github.com/chaitin/MonkeyCode/backend/config"
"github.com/chaitin/MonkeyCode/backend/errcode"
mid "github.com/chaitin/MonkeyCode/backend/internal/middleware"
"github.com/chaitin/MonkeyCode/backend/pkg/ipdb"
"github.com/chaitin/MonkeyCode/backend/pkg/logger"
"github.com/chaitin/MonkeyCode/backend/pkg/session"
"github.com/chaitin/MonkeyCode/backend/pkg/store"
@@ -22,6 +23,7 @@ var Provider = wire.NewSet(
store.NewEntDB,
store.NewRedisCli,
session.NewSession,
ipdb.NewIPDB,
)
func NewWeb(cfg *config.Config) *web.Web {