-
-
Notifications
You must be signed in to change notification settings - Fork 27
/
project.go
76 lines (60 loc) · 1.65 KB
/
project.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
package services
import (
"errors"
"net/url"
"github.com/stjudewashere/seonaut/internal/models"
)
type (
ProjectServiceStorage interface {
SaveProject(*models.Project, int)
DeleteProject(*models.Project)
DisableProject(*models.Project)
UpdateProject(p *models.Project) error
FindProjectById(id int, uid int) (models.Project, error)
DeleteProjectCrawls(*models.Project)
}
ProjectService struct {
storage ProjectServiceStorage
}
)
func NewProjectService(s ProjectServiceStorage) *ProjectService {
return &ProjectService{storage: s}
}
// SaveProject stores a new project.
func (s *ProjectService) SaveProject(project *models.Project, userId int) error {
parsedURL, err := url.Parse(project.URL)
if err != nil {
return err
}
if parsedURL.Scheme != "http" && parsedURL.Scheme != "https" {
return errors.New("protocol not supported")
}
s.storage.SaveProject(project, userId)
return nil
}
// Return a project specified by id and user.
// It populates the Host field from the project's URL.
func (s *ProjectService) FindProject(id, uid int) (models.Project, error) {
project, err := s.storage.FindProjectById(id, uid)
if err != nil {
return project, err
}
parsedURL, err := url.Parse(project.URL)
if err != nil {
return project, err
}
project.Host = parsedURL.Host
return project, nil
}
// Delete a project and its related data.
func (s *ProjectService) DeleteProject(p *models.Project) {
s.storage.DisableProject(p)
go func() {
s.storage.DeleteProjectCrawls(p)
s.storage.DeleteProject(p)
}()
}
// Update project details.
func (s *ProjectService) UpdateProject(p *models.Project) error {
return s.storage.UpdateProject(p)
}