go: implement import of local breach data
All checks were successful
continuous-integration/drone/push Build is passing

This commit is contained in:
surtur 2023-08-20 05:20:33 +02:00
parent 74546f996b
commit 7a877b01bb
Signed by: wanderer
SSH Key Fingerprint: SHA256:MdCZyJ2sHLltrLBp0xQO0O1qTW9BT/xl5nXkDvhlMCI
11 changed files with 331 additions and 220 deletions

@ -3,6 +3,7 @@
package ent
import (
"encoding/json"
"fmt"
"strings"
"time"
@ -10,6 +11,7 @@ import (
"entgo.io/ent"
"entgo.io/ent/dialect/sql"
"git.dotya.ml/mirre-mt/pcmt/ent/localbreach"
"git.dotya.ml/mirre-mt/pcmt/ent/schema"
"github.com/google/uuid"
)
@ -26,12 +28,14 @@ type LocalBreach struct {
Description *string `json:"description,omitempty"`
// IsVerified holds the value of the "is_verified" field.
IsVerified bool `json:"is_verified,omitempty"`
// ContainsPasswds holds the value of the "contains_passwds" field.
ContainsPasswds bool `json:"contains_passwds,omitempty"`
// ContainsPasswords holds the value of the "contains_passwords" field.
ContainsPasswords bool `json:"contains_passwords,omitempty"`
// ContainsHashes holds the value of the "contains_hashes" field.
ContainsHashes bool `json:"contains_hashes,omitempty"`
// ContainsEmails holds the value of the "contains_emails" field.
ContainsEmails bool `json:"contains_emails,omitempty"`
// ContainsUsernames holds the value of the "contains_usernames" field.
ContainsUsernames bool `json:"contains_usernames,omitempty"`
// MD5, SHA1, Argon2id...
HashType *string `json:"hash_type,omitempty"`
// HashSalted holds the value of the "hash_salted" field.
@ -39,7 +43,7 @@ type LocalBreach struct {
// HashPeppered holds the value of the "hash_peppered" field.
HashPeppered *bool `json:"hash_peppered,omitempty"`
// Data holds the value of the "data" field.
Data *string `json:"data,omitempty"`
Data *schema.Data `json:"data,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.
@ -71,9 +75,11 @@ func (*LocalBreach) scanValues(columns []string) ([]any, error) {
values := make([]any, len(columns))
for i := range columns {
switch columns[i] {
case localbreach.FieldIsVerified, localbreach.FieldContainsPasswds, localbreach.FieldContainsHashes, localbreach.FieldContainsEmails, localbreach.FieldHashSalted, localbreach.FieldHashPeppered:
case localbreach.FieldData:
values[i] = new([]byte)
case localbreach.FieldIsVerified, localbreach.FieldContainsPasswords, localbreach.FieldContainsHashes, localbreach.FieldContainsEmails, localbreach.FieldContainsUsernames, localbreach.FieldHashSalted, localbreach.FieldHashPeppered:
values[i] = new(sql.NullBool)
case localbreach.FieldName, localbreach.FieldDescription, localbreach.FieldHashType, localbreach.FieldData:
case localbreach.FieldName, localbreach.FieldDescription, localbreach.FieldHashType:
values[i] = new(sql.NullString)
case localbreach.FieldDate, localbreach.FieldCreatedAt:
values[i] = new(sql.NullTime)
@ -125,11 +131,11 @@ func (lb *LocalBreach) assignValues(columns []string, values []any) error {
} else if value.Valid {
lb.IsVerified = value.Bool
}
case localbreach.FieldContainsPasswds:
case localbreach.FieldContainsPasswords:
if value, ok := values[i].(*sql.NullBool); !ok {
return fmt.Errorf("unexpected type %T for field contains_passwds", values[i])
return fmt.Errorf("unexpected type %T for field contains_passwords", values[i])
} else if value.Valid {
lb.ContainsPasswds = value.Bool
lb.ContainsPasswords = value.Bool
}
case localbreach.FieldContainsHashes:
if value, ok := values[i].(*sql.NullBool); !ok {
@ -143,6 +149,12 @@ func (lb *LocalBreach) assignValues(columns []string, values []any) error {
} else if value.Valid {
lb.ContainsEmails = value.Bool
}
case localbreach.FieldContainsUsernames:
if value, ok := values[i].(*sql.NullBool); !ok {
return fmt.Errorf("unexpected type %T for field contains_usernames", values[i])
} else if value.Valid {
lb.ContainsUsernames = value.Bool
}
case localbreach.FieldHashType:
if value, ok := values[i].(*sql.NullString); !ok {
return fmt.Errorf("unexpected type %T for field hash_type", values[i])
@ -165,11 +177,12 @@ func (lb *LocalBreach) assignValues(columns []string, values []any) error {
*lb.HashPeppered = value.Bool
}
case localbreach.FieldData:
if value, ok := values[i].(*sql.NullString); !ok {
if value, ok := values[i].(*[]byte); !ok {
return fmt.Errorf("unexpected type %T for field data", values[i])
} else if value.Valid {
lb.Data = new(string)
*lb.Data = value.String
} else if value != nil && len(*value) > 0 {
if err := json.Unmarshal(*value, &lb.Data); err != nil {
return fmt.Errorf("unmarshal field data: %w", err)
}
}
case localbreach.FieldCreatedAt:
if value, ok := values[i].(*sql.NullTime); !ok {
@ -232,8 +245,8 @@ func (lb *LocalBreach) String() string {
builder.WriteString("is_verified=")
builder.WriteString(fmt.Sprintf("%v", lb.IsVerified))
builder.WriteString(", ")
builder.WriteString("contains_passwds=")
builder.WriteString(fmt.Sprintf("%v", lb.ContainsPasswds))
builder.WriteString("contains_passwords=")
builder.WriteString(fmt.Sprintf("%v", lb.ContainsPasswords))
builder.WriteString(", ")
builder.WriteString("contains_hashes=")
builder.WriteString(fmt.Sprintf("%v", lb.ContainsHashes))
@ -241,6 +254,9 @@ func (lb *LocalBreach) String() string {
builder.WriteString("contains_emails=")
builder.WriteString(fmt.Sprintf("%v", lb.ContainsEmails))
builder.WriteString(", ")
builder.WriteString("contains_usernames=")
builder.WriteString(fmt.Sprintf("%v", lb.ContainsUsernames))
builder.WriteString(", ")
if v := lb.HashType; v != nil {
builder.WriteString("hash_type=")
builder.WriteString(*v)
@ -256,10 +272,8 @@ func (lb *LocalBreach) String() string {
builder.WriteString(fmt.Sprintf("%v", *v))
}
builder.WriteString(", ")
if v := lb.Data; v != nil {
builder.WriteString("data=")
builder.WriteString(*v)
}
builder.WriteString("data=")
builder.WriteString(fmt.Sprintf("%v", lb.Data))
builder.WriteString(", ")
builder.WriteString("created_at=")
builder.WriteString(lb.CreatedAt.Format(time.ANSIC))

@ -23,12 +23,14 @@ const (
FieldDescription = "description"
// FieldIsVerified holds the string denoting the is_verified field in the database.
FieldIsVerified = "is_verified"
// FieldContainsPasswds holds the string denoting the contains_passwds field in the database.
FieldContainsPasswds = "contains_passwds"
// FieldContainsPasswords holds the string denoting the contains_passwords field in the database.
FieldContainsPasswords = "contains_passwords"
// FieldContainsHashes holds the string denoting the contains_hashes field in the database.
FieldContainsHashes = "contains_hashes"
// FieldContainsEmails holds the string denoting the contains_emails field in the database.
FieldContainsEmails = "contains_emails"
// FieldContainsUsernames holds the string denoting the contains_usernames field in the database.
FieldContainsUsernames = "contains_usernames"
// FieldHashType holds the string denoting the hash_type field in the database.
FieldHashType = "hash_type"
// FieldHashSalted holds the string denoting the hash_salted field in the database.
@ -57,9 +59,10 @@ var Columns = []string{
FieldDate,
FieldDescription,
FieldIsVerified,
FieldContainsPasswds,
FieldContainsPasswords,
FieldContainsHashes,
FieldContainsEmails,
FieldContainsUsernames,
FieldHashType,
FieldHashSalted,
FieldHashPeppered,
@ -122,9 +125,9 @@ func ByIsVerified(opts ...sql.OrderTermOption) OrderOption {
return sql.OrderByField(FieldIsVerified, opts...).ToFunc()
}
// ByContainsPasswds orders the results by the contains_passwds field.
func ByContainsPasswds(opts ...sql.OrderTermOption) OrderOption {
return sql.OrderByField(FieldContainsPasswds, opts...).ToFunc()
// ByContainsPasswords orders the results by the contains_passwords field.
func ByContainsPasswords(opts ...sql.OrderTermOption) OrderOption {
return sql.OrderByField(FieldContainsPasswords, opts...).ToFunc()
}
// ByContainsHashes orders the results by the contains_hashes field.
@ -137,6 +140,11 @@ func ByContainsEmails(opts ...sql.OrderTermOption) OrderOption {
return sql.OrderByField(FieldContainsEmails, opts...).ToFunc()
}
// ByContainsUsernames orders the results by the contains_usernames field.
func ByContainsUsernames(opts ...sql.OrderTermOption) OrderOption {
return sql.OrderByField(FieldContainsUsernames, opts...).ToFunc()
}
// ByHashType orders the results by the hash_type field.
func ByHashType(opts ...sql.OrderTermOption) OrderOption {
return sql.OrderByField(FieldHashType, opts...).ToFunc()
@ -152,11 +160,6 @@ func ByHashPeppered(opts ...sql.OrderTermOption) OrderOption {
return sql.OrderByField(FieldHashPeppered, opts...).ToFunc()
}
// ByData orders the results by the data field.
func ByData(opts ...sql.OrderTermOption) OrderOption {
return sql.OrderByField(FieldData, opts...).ToFunc()
}
// ByCreatedAt orders the results by the created_at field.
func ByCreatedAt(opts ...sql.OrderTermOption) OrderOption {
return sql.OrderByField(FieldCreatedAt, opts...).ToFunc()

@ -76,9 +76,9 @@ func IsVerified(v bool) predicate.LocalBreach {
return predicate.LocalBreach(sql.FieldEQ(FieldIsVerified, v))
}
// ContainsPasswds applies equality check predicate on the "contains_passwds" field. It's identical to ContainsPasswdsEQ.
func ContainsPasswds(v bool) predicate.LocalBreach {
return predicate.LocalBreach(sql.FieldEQ(FieldContainsPasswds, v))
// ContainsPasswords applies equality check predicate on the "contains_passwords" field. It's identical to ContainsPasswordsEQ.
func ContainsPasswords(v bool) predicate.LocalBreach {
return predicate.LocalBreach(sql.FieldEQ(FieldContainsPasswords, v))
}
// ContainsHashes applies equality check predicate on the "contains_hashes" field. It's identical to ContainsHashesEQ.
@ -91,6 +91,11 @@ func ContainsEmails(v bool) predicate.LocalBreach {
return predicate.LocalBreach(sql.FieldEQ(FieldContainsEmails, v))
}
// ContainsUsernames applies equality check predicate on the "contains_usernames" field. It's identical to ContainsUsernamesEQ.
func ContainsUsernames(v bool) predicate.LocalBreach {
return predicate.LocalBreach(sql.FieldEQ(FieldContainsUsernames, v))
}
// HashType applies equality check predicate on the "hash_type" field. It's identical to HashTypeEQ.
func HashType(v string) predicate.LocalBreach {
return predicate.LocalBreach(sql.FieldEQ(FieldHashType, v))
@ -106,11 +111,6 @@ func HashPeppered(v bool) predicate.LocalBreach {
return predicate.LocalBreach(sql.FieldEQ(FieldHashPeppered, v))
}
// Data applies equality check predicate on the "data" field. It's identical to DataEQ.
func Data(v string) predicate.LocalBreach {
return predicate.LocalBreach(sql.FieldEQ(FieldData, v))
}
// CreatedAt applies equality check predicate on the "created_at" field. It's identical to CreatedAtEQ.
func CreatedAt(v time.Time) predicate.LocalBreach {
return predicate.LocalBreach(sql.FieldEQ(FieldCreatedAt, v))
@ -306,14 +306,14 @@ func IsVerifiedNEQ(v bool) predicate.LocalBreach {
return predicate.LocalBreach(sql.FieldNEQ(FieldIsVerified, v))
}
// ContainsPasswdsEQ applies the EQ predicate on the "contains_passwds" field.
func ContainsPasswdsEQ(v bool) predicate.LocalBreach {
return predicate.LocalBreach(sql.FieldEQ(FieldContainsPasswds, v))
// ContainsPasswordsEQ applies the EQ predicate on the "contains_passwords" field.
func ContainsPasswordsEQ(v bool) predicate.LocalBreach {
return predicate.LocalBreach(sql.FieldEQ(FieldContainsPasswords, v))
}
// ContainsPasswdsNEQ applies the NEQ predicate on the "contains_passwds" field.
func ContainsPasswdsNEQ(v bool) predicate.LocalBreach {
return predicate.LocalBreach(sql.FieldNEQ(FieldContainsPasswds, v))
// ContainsPasswordsNEQ applies the NEQ predicate on the "contains_passwords" field.
func ContainsPasswordsNEQ(v bool) predicate.LocalBreach {
return predicate.LocalBreach(sql.FieldNEQ(FieldContainsPasswords, v))
}
// ContainsHashesEQ applies the EQ predicate on the "contains_hashes" field.
@ -336,6 +336,16 @@ func ContainsEmailsNEQ(v bool) predicate.LocalBreach {
return predicate.LocalBreach(sql.FieldNEQ(FieldContainsEmails, v))
}
// ContainsUsernamesEQ applies the EQ predicate on the "contains_usernames" field.
func ContainsUsernamesEQ(v bool) predicate.LocalBreach {
return predicate.LocalBreach(sql.FieldEQ(FieldContainsUsernames, v))
}
// ContainsUsernamesNEQ applies the NEQ predicate on the "contains_usernames" field.
func ContainsUsernamesNEQ(v bool) predicate.LocalBreach {
return predicate.LocalBreach(sql.FieldNEQ(FieldContainsUsernames, v))
}
// HashTypeEQ applies the EQ predicate on the "hash_type" field.
func HashTypeEQ(v string) predicate.LocalBreach {
return predicate.LocalBreach(sql.FieldEQ(FieldHashType, v))
@ -451,61 +461,6 @@ func HashPepperedNotNil() predicate.LocalBreach {
return predicate.LocalBreach(sql.FieldNotNull(FieldHashPeppered))
}
// DataEQ applies the EQ predicate on the "data" field.
func DataEQ(v string) predicate.LocalBreach {
return predicate.LocalBreach(sql.FieldEQ(FieldData, v))
}
// DataNEQ applies the NEQ predicate on the "data" field.
func DataNEQ(v string) predicate.LocalBreach {
return predicate.LocalBreach(sql.FieldNEQ(FieldData, v))
}
// DataIn applies the In predicate on the "data" field.
func DataIn(vs ...string) predicate.LocalBreach {
return predicate.LocalBreach(sql.FieldIn(FieldData, vs...))
}
// DataNotIn applies the NotIn predicate on the "data" field.
func DataNotIn(vs ...string) predicate.LocalBreach {
return predicate.LocalBreach(sql.FieldNotIn(FieldData, vs...))
}
// DataGT applies the GT predicate on the "data" field.
func DataGT(v string) predicate.LocalBreach {
return predicate.LocalBreach(sql.FieldGT(FieldData, v))
}
// DataGTE applies the GTE predicate on the "data" field.
func DataGTE(v string) predicate.LocalBreach {
return predicate.LocalBreach(sql.FieldGTE(FieldData, v))
}
// DataLT applies the LT predicate on the "data" field.
func DataLT(v string) predicate.LocalBreach {
return predicate.LocalBreach(sql.FieldLT(FieldData, v))
}
// DataLTE applies the LTE predicate on the "data" field.
func DataLTE(v string) predicate.LocalBreach {
return predicate.LocalBreach(sql.FieldLTE(FieldData, v))
}
// DataContains applies the Contains predicate on the "data" field.
func DataContains(v string) predicate.LocalBreach {
return predicate.LocalBreach(sql.FieldContains(FieldData, v))
}
// DataHasPrefix applies the HasPrefix predicate on the "data" field.
func DataHasPrefix(v string) predicate.LocalBreach {
return predicate.LocalBreach(sql.FieldHasPrefix(FieldData, v))
}
// DataHasSuffix applies the HasSuffix predicate on the "data" field.
func DataHasSuffix(v string) predicate.LocalBreach {
return predicate.LocalBreach(sql.FieldHasSuffix(FieldData, v))
}
// DataIsNil applies the IsNil predicate on the "data" field.
func DataIsNil() predicate.LocalBreach {
return predicate.LocalBreach(sql.FieldIsNull(FieldData))
@ -516,16 +471,6 @@ func DataNotNil() predicate.LocalBreach {
return predicate.LocalBreach(sql.FieldNotNull(FieldData))
}
// DataEqualFold applies the EqualFold predicate on the "data" field.
func DataEqualFold(v string) predicate.LocalBreach {
return predicate.LocalBreach(sql.FieldEqualFold(FieldData, v))
}
// DataContainsFold applies the ContainsFold predicate on the "data" field.
func DataContainsFold(v string) predicate.LocalBreach {
return predicate.LocalBreach(sql.FieldContainsFold(FieldData, v))
}
// CreatedAtEQ applies the EQ predicate on the "created_at" field.
func CreatedAtEQ(v time.Time) predicate.LocalBreach {
return predicate.LocalBreach(sql.FieldEQ(FieldCreatedAt, v))

@ -11,6 +11,7 @@ import (
"entgo.io/ent/dialect/sql/sqlgraph"
"entgo.io/ent/schema/field"
"git.dotya.ml/mirre-mt/pcmt/ent/localbreach"
"git.dotya.ml/mirre-mt/pcmt/ent/schema"
"git.dotya.ml/mirre-mt/pcmt/ent/trackedbreaches"
"github.com/google/uuid"
)
@ -62,9 +63,9 @@ func (lbc *LocalBreachCreate) SetIsVerified(b bool) *LocalBreachCreate {
return lbc
}
// SetContainsPasswds sets the "contains_passwds" field.
func (lbc *LocalBreachCreate) SetContainsPasswds(b bool) *LocalBreachCreate {
lbc.mutation.SetContainsPasswds(b)
// SetContainsPasswords sets the "contains_passwords" field.
func (lbc *LocalBreachCreate) SetContainsPasswords(b bool) *LocalBreachCreate {
lbc.mutation.SetContainsPasswords(b)
return lbc
}
@ -80,6 +81,12 @@ func (lbc *LocalBreachCreate) SetContainsEmails(b bool) *LocalBreachCreate {
return lbc
}
// SetContainsUsernames sets the "contains_usernames" field.
func (lbc *LocalBreachCreate) SetContainsUsernames(b bool) *LocalBreachCreate {
lbc.mutation.SetContainsUsernames(b)
return lbc
}
// SetHashType sets the "hash_type" field.
func (lbc *LocalBreachCreate) SetHashType(s string) *LocalBreachCreate {
lbc.mutation.SetHashType(s)
@ -123,19 +130,11 @@ func (lbc *LocalBreachCreate) SetNillableHashPeppered(b *bool) *LocalBreachCreat
}
// SetData sets the "data" field.
func (lbc *LocalBreachCreate) SetData(s string) *LocalBreachCreate {
func (lbc *LocalBreachCreate) SetData(s *schema.Data) *LocalBreachCreate {
lbc.mutation.SetData(s)
return lbc
}
// SetNillableData sets the "data" field if the given value is not nil.
func (lbc *LocalBreachCreate) SetNillableData(s *string) *LocalBreachCreate {
if s != nil {
lbc.SetData(*s)
}
return lbc
}
// SetCreatedAt sets the "created_at" field.
func (lbc *LocalBreachCreate) SetCreatedAt(t time.Time) *LocalBreachCreate {
lbc.mutation.SetCreatedAt(t)
@ -244,8 +243,8 @@ func (lbc *LocalBreachCreate) check() error {
if _, ok := lbc.mutation.IsVerified(); !ok {
return &ValidationError{Name: "is_verified", err: errors.New(`ent: missing required field "LocalBreach.is_verified"`)}
}
if _, ok := lbc.mutation.ContainsPasswds(); !ok {
return &ValidationError{Name: "contains_passwds", err: errors.New(`ent: missing required field "LocalBreach.contains_passwds"`)}
if _, ok := lbc.mutation.ContainsPasswords(); !ok {
return &ValidationError{Name: "contains_passwords", err: errors.New(`ent: missing required field "LocalBreach.contains_passwords"`)}
}
if _, ok := lbc.mutation.ContainsHashes(); !ok {
return &ValidationError{Name: "contains_hashes", err: errors.New(`ent: missing required field "LocalBreach.contains_hashes"`)}
@ -253,6 +252,9 @@ func (lbc *LocalBreachCreate) check() error {
if _, ok := lbc.mutation.ContainsEmails(); !ok {
return &ValidationError{Name: "contains_emails", err: errors.New(`ent: missing required field "LocalBreach.contains_emails"`)}
}
if _, ok := lbc.mutation.ContainsUsernames(); !ok {
return &ValidationError{Name: "contains_usernames", err: errors.New(`ent: missing required field "LocalBreach.contains_usernames"`)}
}
if _, ok := lbc.mutation.CreatedAt(); !ok {
return &ValidationError{Name: "created_at", err: errors.New(`ent: missing required field "LocalBreach.created_at"`)}
}
@ -307,9 +309,9 @@ func (lbc *LocalBreachCreate) createSpec() (*LocalBreach, *sqlgraph.CreateSpec)
_spec.SetField(localbreach.FieldIsVerified, field.TypeBool, value)
_node.IsVerified = value
}
if value, ok := lbc.mutation.ContainsPasswds(); ok {
_spec.SetField(localbreach.FieldContainsPasswds, field.TypeBool, value)
_node.ContainsPasswds = value
if value, ok := lbc.mutation.ContainsPasswords(); ok {
_spec.SetField(localbreach.FieldContainsPasswords, field.TypeBool, value)
_node.ContainsPasswords = value
}
if value, ok := lbc.mutation.ContainsHashes(); ok {
_spec.SetField(localbreach.FieldContainsHashes, field.TypeBool, value)
@ -319,6 +321,10 @@ func (lbc *LocalBreachCreate) createSpec() (*LocalBreach, *sqlgraph.CreateSpec)
_spec.SetField(localbreach.FieldContainsEmails, field.TypeBool, value)
_node.ContainsEmails = value
}
if value, ok := lbc.mutation.ContainsUsernames(); ok {
_spec.SetField(localbreach.FieldContainsUsernames, field.TypeBool, value)
_node.ContainsUsernames = value
}
if value, ok := lbc.mutation.HashType(); ok {
_spec.SetField(localbreach.FieldHashType, field.TypeString, value)
_node.HashType = &value
@ -332,8 +338,8 @@ func (lbc *LocalBreachCreate) createSpec() (*LocalBreach, *sqlgraph.CreateSpec)
_node.HashPeppered = &value
}
if value, ok := lbc.mutation.Data(); ok {
_spec.SetField(localbreach.FieldData, field.TypeString, value)
_node.Data = &value
_spec.SetField(localbreach.FieldData, field.TypeJSON, value)
_node.Data = value
}
if value, ok := lbc.mutation.CreatedAt(); ok {
_spec.SetField(localbreach.FieldCreatedAt, field.TypeTime, value)

@ -13,6 +13,7 @@ import (
"entgo.io/ent/schema/field"
"git.dotya.ml/mirre-mt/pcmt/ent/localbreach"
"git.dotya.ml/mirre-mt/pcmt/ent/predicate"
"git.dotya.ml/mirre-mt/pcmt/ent/schema"
"git.dotya.ml/mirre-mt/pcmt/ent/trackedbreaches"
"github.com/google/uuid"
)
@ -76,9 +77,9 @@ func (lbu *LocalBreachUpdate) SetIsVerified(b bool) *LocalBreachUpdate {
return lbu
}
// SetContainsPasswds sets the "contains_passwds" field.
func (lbu *LocalBreachUpdate) SetContainsPasswds(b bool) *LocalBreachUpdate {
lbu.mutation.SetContainsPasswds(b)
// SetContainsPasswords sets the "contains_passwords" field.
func (lbu *LocalBreachUpdate) SetContainsPasswords(b bool) *LocalBreachUpdate {
lbu.mutation.SetContainsPasswords(b)
return lbu
}
@ -94,6 +95,12 @@ func (lbu *LocalBreachUpdate) SetContainsEmails(b bool) *LocalBreachUpdate {
return lbu
}
// SetContainsUsernames sets the "contains_usernames" field.
func (lbu *LocalBreachUpdate) SetContainsUsernames(b bool) *LocalBreachUpdate {
lbu.mutation.SetContainsUsernames(b)
return lbu
}
// SetHashType sets the "hash_type" field.
func (lbu *LocalBreachUpdate) SetHashType(s string) *LocalBreachUpdate {
lbu.mutation.SetHashType(s)
@ -155,19 +162,11 @@ func (lbu *LocalBreachUpdate) ClearHashPeppered() *LocalBreachUpdate {
}
// SetData sets the "data" field.
func (lbu *LocalBreachUpdate) SetData(s string) *LocalBreachUpdate {
func (lbu *LocalBreachUpdate) SetData(s *schema.Data) *LocalBreachUpdate {
lbu.mutation.SetData(s)
return lbu
}
// SetNillableData sets the "data" field if the given value is not nil.
func (lbu *LocalBreachUpdate) SetNillableData(s *string) *LocalBreachUpdate {
if s != nil {
lbu.SetData(*s)
}
return lbu
}
// ClearData clears the value of the "data" field.
func (lbu *LocalBreachUpdate) ClearData() *LocalBreachUpdate {
lbu.mutation.ClearData()
@ -279,8 +278,8 @@ func (lbu *LocalBreachUpdate) sqlSave(ctx context.Context) (n int, err error) {
if value, ok := lbu.mutation.IsVerified(); ok {
_spec.SetField(localbreach.FieldIsVerified, field.TypeBool, value)
}
if value, ok := lbu.mutation.ContainsPasswds(); ok {
_spec.SetField(localbreach.FieldContainsPasswds, field.TypeBool, value)
if value, ok := lbu.mutation.ContainsPasswords(); ok {
_spec.SetField(localbreach.FieldContainsPasswords, field.TypeBool, value)
}
if value, ok := lbu.mutation.ContainsHashes(); ok {
_spec.SetField(localbreach.FieldContainsHashes, field.TypeBool, value)
@ -288,6 +287,9 @@ func (lbu *LocalBreachUpdate) sqlSave(ctx context.Context) (n int, err error) {
if value, ok := lbu.mutation.ContainsEmails(); ok {
_spec.SetField(localbreach.FieldContainsEmails, field.TypeBool, value)
}
if value, ok := lbu.mutation.ContainsUsernames(); ok {
_spec.SetField(localbreach.FieldContainsUsernames, field.TypeBool, value)
}
if value, ok := lbu.mutation.HashType(); ok {
_spec.SetField(localbreach.FieldHashType, field.TypeString, value)
}
@ -307,10 +309,10 @@ func (lbu *LocalBreachUpdate) sqlSave(ctx context.Context) (n int, err error) {
_spec.ClearField(localbreach.FieldHashPeppered, field.TypeBool)
}
if value, ok := lbu.mutation.Data(); ok {
_spec.SetField(localbreach.FieldData, field.TypeString, value)
_spec.SetField(localbreach.FieldData, field.TypeJSON, value)
}
if lbu.mutation.DataCleared() {
_spec.ClearField(localbreach.FieldData, field.TypeString)
_spec.ClearField(localbreach.FieldData, field.TypeJSON)
}
if lbu.mutation.TrackedBreachesCleared() {
edge := &sqlgraph.EdgeSpec{
@ -423,9 +425,9 @@ func (lbuo *LocalBreachUpdateOne) SetIsVerified(b bool) *LocalBreachUpdateOne {
return lbuo
}
// SetContainsPasswds sets the "contains_passwds" field.
func (lbuo *LocalBreachUpdateOne) SetContainsPasswds(b bool) *LocalBreachUpdateOne {
lbuo.mutation.SetContainsPasswds(b)
// SetContainsPasswords sets the "contains_passwords" field.
func (lbuo *LocalBreachUpdateOne) SetContainsPasswords(b bool) *LocalBreachUpdateOne {
lbuo.mutation.SetContainsPasswords(b)
return lbuo
}
@ -441,6 +443,12 @@ func (lbuo *LocalBreachUpdateOne) SetContainsEmails(b bool) *LocalBreachUpdateOn
return lbuo
}
// SetContainsUsernames sets the "contains_usernames" field.
func (lbuo *LocalBreachUpdateOne) SetContainsUsernames(b bool) *LocalBreachUpdateOne {
lbuo.mutation.SetContainsUsernames(b)
return lbuo
}
// SetHashType sets the "hash_type" field.
func (lbuo *LocalBreachUpdateOne) SetHashType(s string) *LocalBreachUpdateOne {
lbuo.mutation.SetHashType(s)
@ -502,19 +510,11 @@ func (lbuo *LocalBreachUpdateOne) ClearHashPeppered() *LocalBreachUpdateOne {
}
// SetData sets the "data" field.
func (lbuo *LocalBreachUpdateOne) SetData(s string) *LocalBreachUpdateOne {
func (lbuo *LocalBreachUpdateOne) SetData(s *schema.Data) *LocalBreachUpdateOne {
lbuo.mutation.SetData(s)
return lbuo
}
// SetNillableData sets the "data" field if the given value is not nil.
func (lbuo *LocalBreachUpdateOne) SetNillableData(s *string) *LocalBreachUpdateOne {
if s != nil {
lbuo.SetData(*s)
}
return lbuo
}
// ClearData clears the value of the "data" field.
func (lbuo *LocalBreachUpdateOne) ClearData() *LocalBreachUpdateOne {
lbuo.mutation.ClearData()
@ -656,8 +656,8 @@ func (lbuo *LocalBreachUpdateOne) sqlSave(ctx context.Context) (_node *LocalBrea
if value, ok := lbuo.mutation.IsVerified(); ok {
_spec.SetField(localbreach.FieldIsVerified, field.TypeBool, value)
}
if value, ok := lbuo.mutation.ContainsPasswds(); ok {
_spec.SetField(localbreach.FieldContainsPasswds, field.TypeBool, value)
if value, ok := lbuo.mutation.ContainsPasswords(); ok {
_spec.SetField(localbreach.FieldContainsPasswords, field.TypeBool, value)
}
if value, ok := lbuo.mutation.ContainsHashes(); ok {
_spec.SetField(localbreach.FieldContainsHashes, field.TypeBool, value)
@ -665,6 +665,9 @@ func (lbuo *LocalBreachUpdateOne) sqlSave(ctx context.Context) (_node *LocalBrea
if value, ok := lbuo.mutation.ContainsEmails(); ok {
_spec.SetField(localbreach.FieldContainsEmails, field.TypeBool, value)
}
if value, ok := lbuo.mutation.ContainsUsernames(); ok {
_spec.SetField(localbreach.FieldContainsUsernames, field.TypeBool, value)
}
if value, ok := lbuo.mutation.HashType(); ok {
_spec.SetField(localbreach.FieldHashType, field.TypeString, value)
}
@ -684,10 +687,10 @@ func (lbuo *LocalBreachUpdateOne) sqlSave(ctx context.Context) (_node *LocalBrea
_spec.ClearField(localbreach.FieldHashPeppered, field.TypeBool)
}
if value, ok := lbuo.mutation.Data(); ok {
_spec.SetField(localbreach.FieldData, field.TypeString, value)
_spec.SetField(localbreach.FieldData, field.TypeJSON, value)
}
if lbuo.mutation.DataCleared() {
_spec.ClearField(localbreach.FieldData, field.TypeString)
_spec.ClearField(localbreach.FieldData, field.TypeJSON)
}
if lbuo.mutation.TrackedBreachesCleared() {
edge := &sqlgraph.EdgeSpec{

@ -71,13 +71,14 @@ var (
{Name: "date", Type: field.TypeTime},
{Name: "description", Type: field.TypeString, Nullable: true},
{Name: "is_verified", Type: field.TypeBool},
{Name: "contains_passwds", Type: field.TypeBool},
{Name: "contains_passwords", Type: field.TypeBool},
{Name: "contains_hashes", Type: field.TypeBool},
{Name: "contains_emails", Type: field.TypeBool},
{Name: "contains_usernames", Type: field.TypeBool},
{Name: "hash_type", Type: field.TypeString, Nullable: true},
{Name: "hash_salted", Type: field.TypeBool, Nullable: true},
{Name: "hash_peppered", Type: field.TypeBool, Nullable: true},
{Name: "data", Type: field.TypeString, Nullable: true},
{Name: "data", Type: field.TypeJSON, Nullable: true},
{Name: "created_at", Type: field.TypeTime},
}
// LocalBreachesTable holds the schema information for the "local_breaches" table.

@ -15,6 +15,7 @@ import (
"git.dotya.ml/mirre-mt/pcmt/ent/hibp"
"git.dotya.ml/mirre-mt/pcmt/ent/localbreach"
"git.dotya.ml/mirre-mt/pcmt/ent/predicate"
"git.dotya.ml/mirre-mt/pcmt/ent/schema"
"git.dotya.ml/mirre-mt/pcmt/ent/searchquery"
"git.dotya.ml/mirre-mt/pcmt/ent/settings"
"git.dotya.ml/mirre-mt/pcmt/ent/setup"
@ -1860,13 +1861,14 @@ type LocalBreachMutation struct {
date *time.Time
description *string
is_verified *bool
contains_passwds *bool
contains_passwords *bool
contains_hashes *bool
contains_emails *bool
contains_usernames *bool
hash_type *string
hash_salted *bool
hash_peppered *bool
data *string
data **schema.Data
created_at *time.Time
clearedFields map[string]struct{}
tracked_breaches map[uuid.UUID]struct{}
@ -2138,40 +2140,40 @@ func (m *LocalBreachMutation) ResetIsVerified() {
m.is_verified = nil
}
// SetContainsPasswds sets the "contains_passwds" field.
func (m *LocalBreachMutation) SetContainsPasswds(b bool) {
m.contains_passwds = &b
// SetContainsPasswords sets the "contains_passwords" field.
func (m *LocalBreachMutation) SetContainsPasswords(b bool) {
m.contains_passwords = &b
}
// ContainsPasswds returns the value of the "contains_passwds" field in the mutation.
func (m *LocalBreachMutation) ContainsPasswds() (r bool, exists bool) {
v := m.contains_passwds
// ContainsPasswords returns the value of the "contains_passwords" field in the mutation.
func (m *LocalBreachMutation) ContainsPasswords() (r bool, exists bool) {
v := m.contains_passwords
if v == nil {
return
}
return *v, true
}
// OldContainsPasswds returns the old "contains_passwds" field's value of the LocalBreach entity.
// OldContainsPasswords returns the old "contains_passwords" field's value of the LocalBreach entity.
// If the LocalBreach 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 *LocalBreachMutation) OldContainsPasswds(ctx context.Context) (v bool, err error) {
func (m *LocalBreachMutation) OldContainsPasswords(ctx context.Context) (v bool, err error) {
if !m.op.Is(OpUpdateOne) {
return v, errors.New("OldContainsPasswds is only allowed on UpdateOne operations")
return v, errors.New("OldContainsPasswords is only allowed on UpdateOne operations")
}
if m.id == nil || m.oldValue == nil {
return v, errors.New("OldContainsPasswds requires an ID field in the mutation")
return v, errors.New("OldContainsPasswords requires an ID field in the mutation")
}
oldValue, err := m.oldValue(ctx)
if err != nil {
return v, fmt.Errorf("querying old value for OldContainsPasswds: %w", err)
return v, fmt.Errorf("querying old value for OldContainsPasswords: %w", err)
}
return oldValue.ContainsPasswds, nil
return oldValue.ContainsPasswords, nil
}
// ResetContainsPasswds resets all changes to the "contains_passwds" field.
func (m *LocalBreachMutation) ResetContainsPasswds() {
m.contains_passwds = nil
// ResetContainsPasswords resets all changes to the "contains_passwords" field.
func (m *LocalBreachMutation) ResetContainsPasswords() {
m.contains_passwords = nil
}
// SetContainsHashes sets the "contains_hashes" field.
@ -2246,6 +2248,42 @@ func (m *LocalBreachMutation) ResetContainsEmails() {
m.contains_emails = nil
}
// SetContainsUsernames sets the "contains_usernames" field.
func (m *LocalBreachMutation) SetContainsUsernames(b bool) {
m.contains_usernames = &b
}
// ContainsUsernames returns the value of the "contains_usernames" field in the mutation.
func (m *LocalBreachMutation) ContainsUsernames() (r bool, exists bool) {
v := m.contains_usernames
if v == nil {
return
}
return *v, true
}
// OldContainsUsernames returns the old "contains_usernames" field's value of the LocalBreach entity.
// If the LocalBreach 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 *LocalBreachMutation) OldContainsUsernames(ctx context.Context) (v bool, err error) {
if !m.op.Is(OpUpdateOne) {
return v, errors.New("OldContainsUsernames is only allowed on UpdateOne operations")
}
if m.id == nil || m.oldValue == nil {
return v, errors.New("OldContainsUsernames requires an ID field in the mutation")
}
oldValue, err := m.oldValue(ctx)
if err != nil {
return v, fmt.Errorf("querying old value for OldContainsUsernames: %w", err)
}
return oldValue.ContainsUsernames, nil
}
// ResetContainsUsernames resets all changes to the "contains_usernames" field.
func (m *LocalBreachMutation) ResetContainsUsernames() {
m.contains_usernames = nil
}
// SetHashType sets the "hash_type" field.
func (m *LocalBreachMutation) SetHashType(s string) {
m.hash_type = &s
@ -2394,12 +2432,12 @@ func (m *LocalBreachMutation) ResetHashPeppered() {
}
// SetData sets the "data" field.
func (m *LocalBreachMutation) SetData(s string) {
func (m *LocalBreachMutation) SetData(s *schema.Data) {
m.data = &s
}
// Data returns the value of the "data" field in the mutation.
func (m *LocalBreachMutation) Data() (r string, exists bool) {
func (m *LocalBreachMutation) Data() (r *schema.Data, exists bool) {
v := m.data
if v == nil {
return
@ -2410,7 +2448,7 @@ func (m *LocalBreachMutation) Data() (r string, exists bool) {
// OldData returns the old "data" field's value of the LocalBreach entity.
// If the LocalBreach 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 *LocalBreachMutation) OldData(ctx context.Context) (v *string, err error) {
func (m *LocalBreachMutation) OldData(ctx context.Context) (v *schema.Data, err error) {
if !m.op.Is(OpUpdateOne) {
return v, errors.New("OldData is only allowed on UpdateOne operations")
}
@ -2566,7 +2604,7 @@ func (m *LocalBreachMutation) Type() string {
// order to get all numeric fields that were incremented/decremented, call
// AddedFields().
func (m *LocalBreachMutation) Fields() []string {
fields := make([]string, 0, 12)
fields := make([]string, 0, 13)
if m.name != nil {
fields = append(fields, localbreach.FieldName)
}
@ -2579,8 +2617,8 @@ func (m *LocalBreachMutation) Fields() []string {
if m.is_verified != nil {
fields = append(fields, localbreach.FieldIsVerified)
}
if m.contains_passwds != nil {
fields = append(fields, localbreach.FieldContainsPasswds)
if m.contains_passwords != nil {
fields = append(fields, localbreach.FieldContainsPasswords)
}
if m.contains_hashes != nil {
fields = append(fields, localbreach.FieldContainsHashes)
@ -2588,6 +2626,9 @@ func (m *LocalBreachMutation) Fields() []string {
if m.contains_emails != nil {
fields = append(fields, localbreach.FieldContainsEmails)
}
if m.contains_usernames != nil {
fields = append(fields, localbreach.FieldContainsUsernames)
}
if m.hash_type != nil {
fields = append(fields, localbreach.FieldHashType)
}
@ -2619,12 +2660,14 @@ func (m *LocalBreachMutation) Field(name string) (ent.Value, bool) {
return m.Description()
case localbreach.FieldIsVerified:
return m.IsVerified()
case localbreach.FieldContainsPasswds:
return m.ContainsPasswds()
case localbreach.FieldContainsPasswords:
return m.ContainsPasswords()
case localbreach.FieldContainsHashes:
return m.ContainsHashes()
case localbreach.FieldContainsEmails:
return m.ContainsEmails()
case localbreach.FieldContainsUsernames:
return m.ContainsUsernames()
case localbreach.FieldHashType:
return m.HashType()
case localbreach.FieldHashSalted:
@ -2652,12 +2695,14 @@ func (m *LocalBreachMutation) OldField(ctx context.Context, name string) (ent.Va
return m.OldDescription(ctx)
case localbreach.FieldIsVerified:
return m.OldIsVerified(ctx)
case localbreach.FieldContainsPasswds:
return m.OldContainsPasswds(ctx)
case localbreach.FieldContainsPasswords:
return m.OldContainsPasswords(ctx)
case localbreach.FieldContainsHashes:
return m.OldContainsHashes(ctx)
case localbreach.FieldContainsEmails:
return m.OldContainsEmails(ctx)
case localbreach.FieldContainsUsernames:
return m.OldContainsUsernames(ctx)
case localbreach.FieldHashType:
return m.OldHashType(ctx)
case localbreach.FieldHashSalted:
@ -2705,12 +2750,12 @@ func (m *LocalBreachMutation) SetField(name string, value ent.Value) error {
}
m.SetIsVerified(v)
return nil
case localbreach.FieldContainsPasswds:
case localbreach.FieldContainsPasswords:
v, ok := value.(bool)
if !ok {
return fmt.Errorf("unexpected type %T for field %s", value, name)
}
m.SetContainsPasswds(v)
m.SetContainsPasswords(v)
return nil
case localbreach.FieldContainsHashes:
v, ok := value.(bool)
@ -2726,6 +2771,13 @@ func (m *LocalBreachMutation) SetField(name string, value ent.Value) error {
}
m.SetContainsEmails(v)
return nil
case localbreach.FieldContainsUsernames:
v, ok := value.(bool)
if !ok {
return fmt.Errorf("unexpected type %T for field %s", value, name)
}
m.SetContainsUsernames(v)
return nil
case localbreach.FieldHashType:
v, ok := value.(string)
if !ok {
@ -2748,7 +2800,7 @@ func (m *LocalBreachMutation) SetField(name string, value ent.Value) error {
m.SetHashPeppered(v)
return nil
case localbreach.FieldData:
v, ok := value.(string)
v, ok := value.(*schema.Data)
if !ok {
return fmt.Errorf("unexpected type %T for field %s", value, name)
}
@ -2855,8 +2907,8 @@ func (m *LocalBreachMutation) ResetField(name string) error {
case localbreach.FieldIsVerified:
m.ResetIsVerified()
return nil
case localbreach.FieldContainsPasswds:
m.ResetContainsPasswds()
case localbreach.FieldContainsPasswords:
m.ResetContainsPasswords()
return nil
case localbreach.FieldContainsHashes:
m.ResetContainsHashes()
@ -2864,6 +2916,9 @@ func (m *LocalBreachMutation) ResetField(name string) error {
case localbreach.FieldContainsEmails:
m.ResetContainsEmails()
return nil
case localbreach.FieldContainsUsernames:
m.ResetContainsUsernames()
return nil
case localbreach.FieldHashType:
m.ResetHashType()
return nil

@ -76,7 +76,7 @@ func init() {
// localbreach.DefaultDate holds the default value on creation for the date field.
localbreach.DefaultDate = localbreachDescDate.Default.(time.Time)
// localbreachDescCreatedAt is the schema descriptor for created_at field.
localbreachDescCreatedAt := localbreachFields[12].Descriptor()
localbreachDescCreatedAt := localbreachFields[13].Descriptor()
// localbreach.DefaultCreatedAt holds the default value on creation for the created_at field.
localbreach.DefaultCreatedAt = localbreachDescCreatedAt.Default.(time.Time)
// localbreachDescID is the schema descriptor for id field.

@ -17,6 +17,36 @@ type LocalBreach struct {
ent.Schema
}
// ImportSchema is the LocalBreach model.
type ImportSchema struct {
Name string `yaml:"name" validate:"required,name"`
Description string `yaml:"description"`
CreatedAt time.Time `yaml:"createdAt"`
Date time.Time `yaml:"time"`
IsVerified bool `yaml:"isVerified"`
ContainsUsernames bool `yaml:"containsUsernames"`
ContainsEmails bool `yaml:"containsEmails"`
ContainsPasswords bool `yaml:"containsPasswds"`
ContainsHashes bool `yaml:"containsHashes"`
HashType string `yaml:"hashType"`
HashSalted bool `yaml:"hashSalted"`
HashPeppered bool `yaml:"hashPeppered"`
Data Data `yaml:"data"`
}
type (
DataUsernames []string
DataEmails []string
DataHashes []string
DataPasswords []string
Data struct {
Usernames *DataUsernames
Emails *DataEmails
Hashes *DataHashes
Passwords *DataPasswords
}
)
// Fields of the LocalBreach.
func (LocalBreach) Fields() []ent.Field {
return []ent.Field{
@ -34,9 +64,10 @@ func (LocalBreach) Fields() []ent.Field {
Optional().
Nillable(),
field.Bool("is_verified"),
field.Bool("contains_passwds"),
field.Bool("contains_passwords"),
field.Bool("contains_hashes"),
field.Bool("contains_emails"),
field.Bool("contains_usernames"),
field.String("hash_type").
Comment("MD5, SHA1, Argon2id...").
Optional().
@ -47,9 +78,8 @@ func (LocalBreach) Fields() []ent.Field {
field.Bool("hash_peppered").
Optional().
Nillable(),
field.String("data").
Optional().
Nillable(),
field.JSON("data", &Data{}).
Optional(),
field.Time("created_at").
Default(time.Now()).
Immutable(),

@ -5,29 +5,23 @@ package localbreach
import (
"bytes"
"context"
"io"
"os"
"time"
"git.dotya.ml/mirre-mt/pcmt/ent"
"git.dotya.ml/mirre-mt/pcmt/ent/schema"
"git.dotya.ml/mirre-mt/pcmt/slogging"
"golang.org/x/exp/slog"
"gopkg.in/yaml.v3"
)
type BreachDataSchema struct {
Name string `yaml:"name" validate:"required,name"`
Time time.Time `yaml:"time"`
IsVerified bool `yaml:"isVerified"`
ContainsPasswords bool `yaml:"containsPasswds"`
ContainsHashes bool `yaml:"containsHashes"`
HashType string `yaml:"hashType"`
HashSalted bool `yaml:"hashSalted"`
HashPeppered bool `yaml:"hashPeppered"`
ContainsUsernames bool `yaml:"containsUsernames"`
ContainsEmails bool `yaml:"containsEmails"`
Data any `yaml:"data"`
}
type CtxKey struct{}
// Load loads local breach data.
func Load(path string) (*[]BreachDataSchema, error) {
// Load loads local breach data and returns a pointer to the slice of the
// structs, of which each holds one YAML document on successful import, error
// otherwise.
func Load(path string) (*[]schema.ImportSchema, error) {
b, err := os.ReadFile(path)
if err != nil {
return nil, err
@ -41,15 +35,15 @@ func Load(path string) (*[]BreachDataSchema, error) {
return lb, nil
}
func loadLocalBreach(b []byte) (*[]BreachDataSchema, error) {
func loadLocalBreach(b []byte) (*[]schema.ImportSchema, error) {
r := bytes.NewReader(b)
decoder := yaml.NewDecoder(r)
lb := make([]BreachDataSchema, 0)
lb := make([]schema.ImportSchema, 0)
var bds BreachDataSchema
var is schema.ImportSchema
for {
if err := decoder.Decode(&bds); err != nil {
if err := decoder.Decode(&is); err != nil {
if err != io.EOF {
return nil, err
}
@ -57,8 +51,60 @@ func loadLocalBreach(b []byte) (*[]BreachDataSchema, error) {
break // get out when there are no more documents to read.
}
lb = append(lb, bds)
lb = append(lb, is)
}
return &lb, nil
}
// ImportLocalBreach imports data that from YAML files into the database. The
// data must adhere to the ImportSchema.
func ImportLocalBreach(ctx context.Context, db *ent.Client, b *[]schema.ImportSchema) ([]*ent.LocalBreach, error) {
slogger := ctx.Value(CtxKey{}).(*slogging.Slogger)
log := *slogger
log.Logger = log.With(
slog.Group("pcmt extra", slog.String("module", "modules/localbreach")),
)
var err error
var lbs []*ent.LocalBreach
// go through the documents, abort saving to DB on err of one.
for _, breach := range *b {
lb, err := db.LocalBreach.
Create().
SetName(breach.Name).
SetNillableDescription(&breach.Description).
SetIsVerified(breach.IsVerified).
SetContainsEmails(breach.ContainsEmails).
SetContainsUsernames(breach.ContainsUsernames).
SetContainsPasswords(breach.ContainsPasswords).
SetContainsHashes(breach.ContainsHashes).
SetNillableHashSalted(&breach.HashSalted).
SetNillableHashPeppered(&breach.HashPeppered).
SetNillableHashType(&breach.HashType).
SetNillableDate(&breach.Date).
SetData(&breach.Data).
Save(ctx)
if err != nil {
break
}
lbs = append(lbs, lb)
}
switch {
case lbs == nil && err != nil:
return nil, err
case ent.IsConstraintError(err):
return nil, err
case err == nil && lbs != nil:
return lbs, nil
}
return nil, err
}

10
run.go

@ -208,8 +208,16 @@ func run() error { //nolint:gocognit
return err
}
if _, err = localbreach.ImportLocalBreach(
context.WithValue(
context.Background(), localbreach.CtxKey{}, slogger),
db, lb,
); err != nil {
return err
}
log.Infof("Import succeeded: %+v", lb)
fmt.Fprint(os.Stdout, "\033[32m🗸\033[0m Import succeeded \n")
fmt.Fprint(os.Stdout, "\033[32m\033[0m Import succeeded \n")
return nil
}