mirror of
https://github.com/crawlab-team/crawlab.git
synced 2026-01-22 17:31:03 +01:00
104 lines
2.1 KiB
Go
104 lines
2.1 KiB
Go
package controllers
|
|
|
|
import (
|
|
"github.com/crawlab-team/crawlab/core/errors"
|
|
"github.com/crawlab-team/crawlab/core/interfaces"
|
|
"github.com/crawlab-team/crawlab/core/models/models"
|
|
"github.com/crawlab-team/crawlab/core/models/service"
|
|
"github.com/gin-gonic/gin"
|
|
"go.mongodb.org/mongo-driver/bson"
|
|
"go.mongodb.org/mongo-driver/bson/primitive"
|
|
)
|
|
|
|
var ProjectController *projectController
|
|
|
|
type projectController struct {
|
|
ListControllerDelegate
|
|
}
|
|
|
|
func (ctr *projectController) GetList(c *gin.Context) {
|
|
// get all if query field "all" is set true
|
|
all := MustGetFilterAll(c)
|
|
if all {
|
|
ctr.getAll(c)
|
|
return
|
|
}
|
|
|
|
// get list
|
|
list, total, err := ctr.getList(c)
|
|
if err != nil {
|
|
return
|
|
}
|
|
data := list.GetModels()
|
|
|
|
// check empty list
|
|
if len(list.GetModels()) == 0 {
|
|
HandleSuccessWithListData(c, nil, 0)
|
|
return
|
|
}
|
|
|
|
// project ids
|
|
var ids []primitive.ObjectID
|
|
|
|
// count cache
|
|
cache := map[primitive.ObjectID]int{}
|
|
|
|
// iterate
|
|
for _, d := range data {
|
|
p, ok := d.(*models.Project)
|
|
if !ok {
|
|
HandleErrorInternalServerError(c, errors.ErrorControllerInvalidType)
|
|
return
|
|
}
|
|
ids = append(ids, p.Id)
|
|
cache[p.Id] = 0
|
|
}
|
|
|
|
// spiders
|
|
modelSvc, err := service.NewService()
|
|
if err != nil {
|
|
HandleErrorInternalServerError(c, err)
|
|
return
|
|
}
|
|
spiders, err := modelSvc.GetSpiderList(bson.M{
|
|
"project_id": bson.M{
|
|
"$in": ids,
|
|
},
|
|
}, nil)
|
|
if err != nil {
|
|
HandleErrorInternalServerError(c, err)
|
|
return
|
|
}
|
|
for _, s := range spiders {
|
|
_, ok := cache[s.ProjectId]
|
|
if !ok {
|
|
HandleErrorInternalServerError(c, errors.ErrorControllerMissingInCache)
|
|
return
|
|
}
|
|
cache[s.ProjectId]++
|
|
}
|
|
|
|
// assign
|
|
var projects []models.Project
|
|
for _, d := range data {
|
|
p := d.(*models.Project)
|
|
p.Spiders = cache[p.Id]
|
|
projects = append(projects, *p)
|
|
}
|
|
|
|
HandleSuccessWithListData(c, projects, total)
|
|
}
|
|
|
|
func newProjectController() *projectController {
|
|
modelSvc, err := service.GetService()
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
|
|
ctr := NewListControllerDelegate(ControllerIdProject, modelSvc.GetBaseService(interfaces.ModelIdProject))
|
|
|
|
return &projectController{
|
|
ListControllerDelegate: *ctr,
|
|
}
|
|
}
|