Skip to content

Commit

Permalink
feature: Alternative Packages
Browse files Browse the repository at this point in the history
  • Loading branch information
zekiahmetbayar committed Jan 8, 2024
1 parent 55eb7ee commit 17ff800
Show file tree
Hide file tree
Showing 10 changed files with 100 additions and 11 deletions.
2 changes: 2 additions & 0 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,9 @@ jobs:
mkdir -p $SERVER_BIN_PATH
mkdir -p $SERVER_BIN_PATH/reports
mkdir -p $SERVER_BIN_PATH/wmi
mkdir -p $SERVER_BIN_PATH/storage
mv wmi.so $SERVER_BIN_PATH/wmi/
mv storage/alternatives.csv $SERVER_BIN_PATH/storage/
cp ./scripts/debian/control $DEBIAN_PATH/control
sed -i s/%VERSION%/${{ github.run_number }}/g $DEBIAN_PATH/control
Expand Down
9 changes: 5 additions & 4 deletions app/controllers/packages/packages.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,27 +8,28 @@ import (
"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"
)

// 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").
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").Order("count desc")
Group("packages.name").Group("alternative_package_id").Order("count desc")

db := database.Connection().Table("(?) as t1", sub_query)
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 []map[string]interface{}
var packages []entities.Package
page, err := paginator.New(db, c).Paginate(&packages)
if err != nil {
return err
Expand Down
9 changes: 9 additions & 0 deletions app/entities/AlternativePackage.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package entities

type AlternativePackage struct {
Base
Name string `json:"name"`
URL string `json:"url"`
PackageName string `json:"package_name"`
Packages []*Package `json:"packages"`
}
12 changes: 8 additions & 4 deletions app/entities/Package.go
Original file line number Diff line number Diff line change
@@ -1,9 +1,13 @@
package entities

import "github.com/google/uuid"

type Package struct {
Base
Name string `json:"name"`
Version string `json:"version"`
Vendor string `json:"vendor"`
Assets []*Asset `json:"assets" gorm:"many2many:asset_packages"`
Name string `json:"name"`
Version string `json:"version"`
Vendor string `json:"vendor"`
Assets []*Asset `json:"assets" gorm:"many2many:asset_packages"`
AlternativePackageID *uuid.UUID `json:"alternative_package_id"`
AlternativePackage *AlternativePackage `json:"alternative_package"`
}
9 changes: 8 additions & 1 deletion cmd/server/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,13 +12,20 @@ import (
"github.com/gofiber/fiber/v2/middleware/recover"
"github.com/limanmys/inventory-server/app/routes"
"github.com/limanmys/inventory-server/internal/migrations"
"github.com/limanmys/inventory-server/internal/seeds"
"github.com/limanmys/inventory-server/internal/server"
)

func main() {
// Migrate tables
if !fiber.IsChild() {
migrations.Migrate()
//Migrate tables
if err := migrations.Migrate(); err != nil {
log.Println("error when migrating tables, ", err.Error())
}

// Seed alternative packages
seeds.Init()
}

// Create Fiber App
Expand Down
5 changes: 3 additions & 2 deletions internal/constants/constants.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package constants

const (
REPORT_SAVE_PATH = "./reports/"
WMI_SO_PATH = "./wmi/wmi.so"
REPORT_SAVE_PATH = "./reports/"
WMI_SO_PATH = "./wmi/wmi.so"
ALTERNATIVES_CSV_PATH = "./storage/alternatives.csv"
)
3 changes: 3 additions & 0 deletions internal/migrations/migrate.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,9 @@ import (
)

func Migrate() error {
if err := database.Connection().AutoMigrate(&entities.AlternativePackage{}); err != nil {
return err
}
if err := database.Connection().AutoMigrate(&entities.Discovery{}); err != nil {
return err
}
Expand Down
47 changes: 47 additions & 0 deletions internal/seeds/seeds.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
package seeds

import (
"encoding/csv"
"log"
"os"

"github.com/limanmys/inventory-server/app/entities"
"github.com/limanmys/inventory-server/internal/constants"
"github.com/limanmys/inventory-server/internal/database"
)

// Init, seeds alternative packages
func Init() {
// Open alternatives.csv
file, err := os.Open(constants.ALTERNATIVES_CSV_PATH)
if err != nil {
log.Println("error when reading package alternatives, " + err.Error())
return
}

// Close file after function end
defer file.Close()

// Read all rows from csv
records, err := csv.NewReader(file).ReadAll()
if err != nil {
log.Println("error when reading records, " + err.Error())
return
}

// Create records
for idx, record := range records {
// If row is wrong or title row
if len(record) != 3 || idx == 0 {
continue
}
// Create record on database
if err := database.Connection().Where("name = ?", record[0]).FirstOrCreate(&entities.AlternativePackage{
Name: record[0],
URL: record[1],
PackageName: record[2],
}).Error; err != nil {
log.Println("error when creating alternative package, " + err.Error())
}
}
}
13 changes: 13 additions & 0 deletions pkg/discovery/discovery.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import "C"
import (
"encoding/base64"
"encoding/json"
"fmt"

"github.com/limanmys/inventory-server/app/entities"
"github.com/limanmys/inventory-server/internal/constants"
Expand Down Expand Up @@ -125,12 +126,24 @@ func Start(discovery entities.Discovery) {

// If package does not exists
if count == 0 {

// Check package has alternative
var alternative entities.AlternativePackage
database.Connection().Model(&entities.AlternativePackage{}).
Where("LOWER(package_name) LIKE LOWER(?)", fmt.Sprintf("%%%s%%", pkg.Name)).
First(&alternative)

if alternative.ID != nil {
pkg.AlternativePackageID = alternative.ID
}

database.Connection().Clauses(clause.Returning{}).Create(&pkg)
} else {
// Find package
database.Connection().Model(&entities.Package{}).
Where("name = ? and version = ?", pkg.Name, pkg.Version).First(&pkg)
}

// Append package to asset packages
assetPackages = append(assetPackages, pkg)
}
Expand Down
2 changes: 2 additions & 0 deletions storage/alternatives.csv
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
Name,URL,Package Name
Okular,https://okular.kde.org/tr/,Adobe Acrobat (64-bit)

0 comments on commit 17ff800

Please sign in to comment.