-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathrepository.go
143 lines (107 loc) · 3 KB
/
repository.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
package main
import (
"context"
"errors"
"fmt"
"gorm.io/gorm"
)
var (
errOwnerNotFound = errors.New("owner not found")
errBreedNotFound = errors.New("breed not found")
)
func addBreed(ctx context.Context, b *breed) error {
return getInstanceWithCtx(ctx).Create(b).Error
}
func getBreed(ctx context.Context, b breed) ([]breed, error) {
var result []breed
tx := whereBreed(getInstanceWithCtx(ctx), b).Find(&result)
return result, tx.Error
}
func delBreed(ctx context.Context, b breed) (rows int64, err error) {
tx := whereBreed(getInstanceWithCtx(ctx), b).Delete(&b)
return tx.RowsAffected, tx.Error
}
func whereBreed(db *gorm.DB, b breed) *gorm.DB {
if b.ID != 0 {
db = db.Where("breeds.id = ?", b.ID)
}
if b.Name != "" {
db = db.Where("breeds.name = ?", b.Name)
}
if b.Description != "" {
db = db.Where("breeds.description like ?", b.Description)
}
return db
}
func addOwner(ctx context.Context, o *owner) error {
return getInstanceWithCtx(ctx).Create(o).Error
}
func getOwner(ctx context.Context, o owner) ([]owner, error) {
var result []owner
tx := whereOwner(getInstanceWithCtx(ctx), o).Find(&result)
return result, tx.Error
}
func delOwner(ctx context.Context, o owner) (rows int64, err error) {
tx := whereOwner(getInstanceWithCtx(ctx), o).Delete(&o)
return tx.RowsAffected, tx.Error
}
func whereOwner(db *gorm.DB, o owner) *gorm.DB {
if o.ID != "" {
db = db.Where("owners.owner_id = ?", o.ID)
}
if o.Name != "" {
db = db.Where("owners.name like ?", o.Name)
}
if o.Surname != "" {
db = db.Where("owners.surname like ?", o.Surname)
}
return db
}
func addDog(ctx context.Context, p *dog) error {
t := whereOwner(getInstanceWithCtx(ctx), p.Owner).Find(&p.Owner)
if err := t.Error; err != nil {
return err
} else if p.Owner.Name == "" {
return errOwnerNotFound
}
t = whereBreed(getInstanceWithCtx(ctx), p.Breed).Find(&p.Breed)
if err := t.Error; err != nil {
return err
} else if p.Breed.ID == 0 {
return errBreedNotFound
}
return getInstanceWithCtx(ctx).
Exec("INSERT INTO dogs (name, breed_id, owner_id) VALUES (?, ?, ?)", p.Name, p.Breed.ID, p.Owner.ID).Error
}
func delDog(ctx context.Context, p dog) (rows int64, err error) {
tx := getInstanceWithCtx(ctx).
Exec("DELETE FROM dogs WHERE name = ? AND owner_id = ? AND breed_id IN (SELECT breed_id FROM breeds WHERE name = ?)",
p.Name, p.Owner.ID, p.Breed.Name)
return tx.RowsAffected, tx.Error
}
func getDog(ctx context.Context, p dog) ([]dog, error) {
var result []dog
tx := whereDog(getInstanceWithCtx(ctx), p).
Joins("Owner").
Joins("Breed")
if p.Owner.ID != "" {
tx = tx.Where("\"Owner\".owner_id = ?", p.Owner.ID)
}
if p.Breed.Name != "" {
tx = tx.Where("\"Breed\".name = ?", p.Breed.Name)
}
tx = tx.Find(&result)
if tx.DryRun {
fmt.Println("sql: ", tx.Statement.SQL.String())
}
return result, tx.Error
}
func whereDog(db *gorm.DB, p dog) *gorm.DB {
if p.ID != 0 {
db = db.Where("dogs.id = ?", p.ID)
}
if p.Name != "" {
db = db.Where("dogs.Name = ?", p.Name)
}
return db
}