privacy/server/service/result.go
2020-11-28 18:50:30 +08:00

275 lines
6.6 KiB
Go

package service
import (
"context"
"github.com/kallydev/privacy/database"
)
type Result interface {
queryPhoneNumber(databases []database.Database, phoneNumber int64) error
queryIDNumber(databases []database.Database, idNumber string) error
queryQQNumber(databases []database.Database, qqNumber int64) error
queryEmail(databases []database.Database, email string) error
addName(name string)
addNickname(nickname string)
addPhoneNumber(phoneNumber int64)
addIDNumber(idNumber string)
addQQNumber(qqNumber int64)
addPassword(password string)
addEmail(email string)
addAddress(address string)
}
var (
_ Result = &QueryResult{}
)
type QueryResult struct {
Names map[Name]bool `json:"names"`
Nicknames map[Nickname]bool `json:"nicknames"`
PhoneNumbers map[PhoneNumber]bool `json:"phone_numbers"`
IDNumbers map[IDNumber]bool `json:"id_numbers"`
QQNumbers map[QQNumber]bool `json:"qq_numbers"`
Passwords map[Password]bool `json:"passwords"`
Emails map[Email]bool `json:"emails"`
Addresses map[Address]bool `json:"addresses"`
}
func NewQueryResult() *QueryResult {
return &QueryResult{
Names: make(map[Name]bool),
Nicknames: make(map[Nickname]bool),
PhoneNumbers: make(map[PhoneNumber]bool),
IDNumbers: make(map[IDNumber]bool),
QQNumbers: make(map[QQNumber]bool),
Passwords: make(map[Password]bool),
Emails: make(map[Email]bool),
Addresses: make(map[Address]bool),
}
}
func (result *QueryResult) addModel(model database.Model) {
if name, valid := model.GetName(); valid {
result.addName(name)
}
if nickname, valid := model.GetNickname(); valid {
result.addNickname(nickname)
}
if phoneNumber, valid := model.GetPhoneNumber(); valid {
result.addPhoneNumber(phoneNumber)
}
if idNumber, valid := model.GetIDNumber(); valid {
result.addIDNumber(idNumber)
}
if qqNumber, valid := model.GetQQNumber(); valid {
result.addQQNumber(qqNumber)
}
if password, valid := model.GetPassword(); valid {
result.addPassword(password)
}
if email, valid := model.GetEmail(); valid {
result.addEmail(email)
}
if address, valid := model.GetAddress(); valid {
result.addAddress(address)
}
}
func (result *QueryResult) queryPhoneNumber(databases []database.Database, phoneNumber int64) error {
for _, db := range databases {
models, err := db.QueryByPhoneNumber(context.Background(), phoneNumber)
if err != nil {
return err
}
for _, model := range models {
result.addModel(model)
}
}
result.PhoneNumbers[PhoneNumber(phoneNumber)] = true
return nil
}
func (result *QueryResult) queryIDNumber(databases []database.Database, idNumber string) error {
for _, db := range databases {
models, err := db.QueryByIDNumber(context.Background(), idNumber)
if err != nil {
return err
}
for _, model := range models {
result.addModel(model)
}
}
result.IDNumbers[IDNumber(idNumber)] = true
return nil
}
func (result *QueryResult) queryQQNumber(databases []database.Database, qqNumber int64) error {
for _, db := range databases {
models, err := db.QueryByQQNumber(context.Background(), qqNumber)
if err != nil {
return err
}
for _, model := range models {
result.addModel(model)
}
}
result.QQNumbers[QQNumber(qqNumber)] = true
return nil
}
func (result *QueryResult) queryEmail(databases []database.Database, email string) error {
for _, db := range databases {
models, err := db.QueryByEmail(context.Background(), email)
if err != nil {
return err
}
for _, model := range models {
result.addModel(model)
}
}
result.Emails[Email(email)] = true
return nil
}
func (result *QueryResult) addName(value string) {
if value == "" {
return
}
name := Name(value)
if _, ok := result.Names[name]; !ok {
result.Names[name] = false
}
}
func (result *QueryResult) addNickname(value string) {
if value == "" {
return
}
nickname := Nickname(value)
if _, ok := result.Nicknames[nickname]; !ok {
result.Nicknames[nickname] = false
}
}
func (result *QueryResult) addPhoneNumber(value int64) {
if value == 0 {
return
}
phoneNumber := PhoneNumber(value)
if _, ok := result.PhoneNumbers[phoneNumber]; !ok {
result.PhoneNumbers[phoneNumber] = false
}
}
func (result *QueryResult) addIDNumber(value string) {
if value == "" {
return
}
idNumber := IDNumber(value)
if _, ok := result.IDNumbers[idNumber]; !ok {
result.IDNumbers[idNumber] = false
}
}
func (result *QueryResult) addQQNumber(value int64) {
if value == 0 {
return
}
qqNumber := QQNumber(value)
if _, ok := result.QQNumbers[qqNumber]; !ok {
result.QQNumbers[qqNumber] = false
}
}
func (result *QueryResult) addPassword(value string) {
if value == "" {
return
}
password := Password(value)
if _, ok := result.Passwords[password]; !ok {
result.Passwords[password] = false
}
}
func (result *QueryResult) addEmail(value string) {
if value == "" {
return
}
email := Email(value)
if _, ok := result.Emails[email]; !ok {
result.Emails[email] = false
}
}
func (result *QueryResult) addAddress(value string) {
if value == "" {
return
}
address := Address(value)
if _, ok := result.Addresses[address]; !ok {
result.Addresses[address] = false
}
}
func (result *QueryResult) Build(mask bool) *QueryResponse {
response := NewQueryResponse()
for name := range result.Names {
result := name.String()
if mask {
result = name.Masking()
}
response.Names = append(response.Names, result)
}
for nickname := range result.Nicknames {
result := nickname.String()
if mask {
result = nickname.Masking()
}
response.Nicknames = append(response.Nicknames, result)
}
for phoneNumber := range result.PhoneNumbers {
result := phoneNumber.String()
if mask {
result = phoneNumber.Masking()
}
response.PhoneNumbers = append(response.PhoneNumbers, result)
}
for idNumber := range result.IDNumbers {
result := idNumber.String()
if mask {
result = idNumber.Masking()
}
response.IDNumbers = append(response.IDNumbers, result)
}
for qqNumber := range result.QQNumbers {
result := qqNumber.String()
if mask {
result = qqNumber.Masking()
}
response.QQNumbers = append(response.QQNumbers, result)
}
for password := range result.Passwords {
result := password.String()
if mask {
result = password.Masking()
}
response.Passwords = append(response.Passwords, result)
}
for email := range result.Emails {
result := email.String()
if mask {
result = email.Masking()
}
response.Emails = append(response.Emails, result)
}
for address := range result.Addresses {
result := address.String()
if mask {
result = address.Masking()
}
response.Addresses = append(response.Addresses, result)
}
return response
}