/
packages.go
69 lines (58 loc) · 2.11 KB
/
packages.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
package packages
import (
"github.com/gofiber/fiber/v2"
"github.com/limanmys/inventory-server/app/entities"
"github.com/limanmys/inventory-server/internal/database"
"github.com/limanmys/inventory-server/internal/paginator"
"github.com/limanmys/inventory-server/internal/search"
"github.com/limanmys/inventory-server/pkg/jobs"
"github.com/limanmys/inventory-server/pkg/reporter"
"gorm.io/gorm/clause"
)
type PackageWithAssetCount struct {
entities.Package
Count int `json:"count"`
}
// Index, returns asset's packages
func Index(c *fiber.Ctx) error {
// Build sql query
sub_query := database.Connection().
Model(&entities.Package{}).
Select("packages.name", "count(*)", "null as updated_at", "null as deleted_at", "alternative_package_id").
Joins("inner join asset_packages ap on ap.package_id = packages.id").
Joins("inner join assets on assets.id = ap.asset_id").
Group("packages.name").Group("alternative_package_id").Order("count desc")
db := database.Connection().Preload(clause.Associations).Table("(?) as t1", sub_query)
// Apply search, if exists
if c.Query("search") != "" {
search.Search(c.Query("search"), db)
}
// Get data
var packages []PackageWithAssetCount
page, err := paginator.New(db, c).Paginate(&packages)
if err != nil {
return err
}
return c.JSON(page)
}
func Report(c *fiber.Ctx) error {
// Create new report job
job, err := jobs.NewJob(entities.FileType(c.Params("file_type")))
if err != nil {
return err
}
// Build query
db := database.Connection().
Model(&entities.Package{}).
Select(
"packages.name",
"count(*)",
"coalesce(alternative_packages.name, '-') as alternative_package").
Joins("inner join asset_packages ap on ap.package_id = packages.id").
Joins("inner join assets on assets.id = ap.asset_id").
Joins("left join alternative_packages on alternative_packages.id = packages.alternative_package_id ").
Group("packages.name, alternative_packages.name").Order("count desc")
// Create report as go routine
go reporter.CreatePackageReport(job, db, []string{"name", "count", "alternative_package"})
return c.JSON(fiber.Map{"id": job.ID.String()})
}