feat: add database #7
3 changed files with 120 additions and 76 deletions
|
@ -1,6 +1,8 @@
|
||||||
package models
|
package models
|
||||||
|
|
||||||
import "gorm.io/gorm"
|
import (
|
||||||
|
"gorm.io/gorm"
|
||||||
|
)
|
||||||
|
|
||||||
type ALTRepo struct {
|
type ALTRepo struct {
|
||||||
gorm.Model
|
gorm.Model
|
||||||
|
@ -14,9 +16,10 @@ type GitRepo struct {
|
||||||
Name string `gorm:"uniqueIndex"`
|
Name string `gorm:"uniqueIndex"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type RPMFiles struct {
|
type RPMFile struct {
|
||||||
TaskID int
|
TaskID int
|
||||||
Name string
|
Name string
|
||||||
|
Arch string
|
||||||
}
|
}
|
||||||
|
|
||||||
type TaskStatus int
|
type TaskStatus int
|
||||||
|
@ -51,7 +54,7 @@ type Task struct {
|
||||||
ALTRepoID int
|
ALTRepoID int
|
||||||
ALTRepo ALTRepo
|
ALTRepo ALTRepo
|
||||||
|
|
||||||
RPMFiles []RPMFiles
|
Files []RPMFile
|
||||||
}
|
}
|
||||||
|
|
||||||
type GitRepoAltRepoTask struct {
|
type GitRepoAltRepoTask struct {
|
||||||
|
|
|
@ -1,13 +1,7 @@
|
||||||
package taskservice
|
package taskservice
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
|
||||||
"io"
|
|
||||||
"mime/multipart"
|
"mime/multipart"
|
||||||
"os"
|
|
||||||
"os/exec"
|
|
||||||
"path"
|
|
||||||
"strings"
|
|
||||||
|
|
||||||
"code.alt-gnome.ru/aides-infra/aides-repo-api/internal/app"
|
"code.alt-gnome.ru/aides-infra/aides-repo-api/internal/app"
|
||||||
)
|
)
|
||||||
|
@ -28,70 +22,3 @@ func New(app *app.App) *Service {
|
||||||
app: app,
|
app: app,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func getRPMArchitecture(filePath string) (string, error) {
|
|
||||||
cmd := exec.Command("rpm", "-qp", "--queryformat", "%{ARCH}", filePath)
|
|
||||||
|
|
||||||
output, err := cmd.Output()
|
|
||||||
if err != nil {
|
|
||||||
return "", fmt.Errorf("ошибка при выполнении команды rpm: %v", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
arch := strings.TrimSpace(string(output))
|
|
||||||
return arch, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *Service) Upload(input *TaskUploadInput) error {
|
|
||||||
taskID := input.TaskID
|
|
||||||
files := input.Files
|
|
||||||
|
|
||||||
localPath := path.Join(taskID)
|
|
||||||
taskFolderPath := path.Join(s.app.Config.UploadDir, "tasks", localPath)
|
|
||||||
os.MkdirAll(taskFolderPath, os.ModePerm)
|
|
||||||
|
|
||||||
for _, fileHeader := range files {
|
|
||||||
file, err := fileHeader.Open()
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
defer file.Close()
|
|
||||||
|
|
||||||
// Полный путь для файла
|
|
||||||
filePath := path.Join(taskFolderPath, fileHeader.Filename)
|
|
||||||
|
|
||||||
//Удаляем файл если такой уже существует
|
|
||||||
if _, err := os.Stat(filePath); err == nil {
|
|
||||||
err = os.Remove(filePath)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// Сохранение файла на сервере
|
|
||||||
outFile, err := os.Create(filePath)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
defer outFile.Close()
|
|
||||||
|
|
||||||
_, err = io.Copy(outFile, file)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
arch, err := getRPMArchitecture(filePath)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
// Символическая ссылка
|
|
||||||
targetPath := path.Join("../../../../tasks/", localPath, fileHeader.Filename)
|
|
||||||
symLink := path.Join(s.app.Config.UploadDir, "repo/Sisyphus", arch, "RPMS.aides", fileHeader.Filename)
|
|
||||||
err = createSymlink(targetPath, symLink)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
114
internal/services/taskservice/upload.go
Normal file
114
internal/services/taskservice/upload.go
Normal file
|
@ -0,0 +1,114 @@
|
||||||
|
package taskservice
|
||||||
|
|
||||||
|
import (
|
||||||
|
"errors"
|
||||||
|
"fmt"
|
||||||
|
"io"
|
||||||
|
"os"
|
||||||
|
"os/exec"
|
||||||
|
"path"
|
||||||
|
"strconv"
|
||||||
|
"strings"
|
||||||
|
|
||||||
|
"code.alt-gnome.ru/aides-infra/aides-repo-api/internal/models"
|
||||||
|
"gorm.io/gorm"
|
||||||
|
)
|
||||||
|
|
||||||
|
func getRPMArchitecture(filePath string) (string, error) {
|
||||||
|
cmd := exec.Command("rpm", "-qp", "--queryformat", "%{ARCH}", filePath)
|
||||||
|
|
||||||
|
output, err := cmd.Output()
|
||||||
|
if err != nil {
|
||||||
|
return "", fmt.Errorf("ошибка при выполнении команды rpm: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
arch := strings.TrimSpace(string(output))
|
||||||
|
return arch, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *Service) Upload(input *TaskUploadInput) error {
|
||||||
|
taskID, err := strconv.Atoi(input.TaskID)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
files := input.Files
|
||||||
|
|
||||||
|
task := models.Task{}
|
||||||
|
result := s.app.Db.Where(
|
||||||
|
"id = ?", taskID,
|
||||||
|
).Where(
|
||||||
|
"status = ?", models.StatusPending,
|
||||||
|
).First(&task)
|
||||||
|
|
||||||
|
if errors.Is(result.Error, gorm.ErrRecordNotFound) {
|
||||||
|
return result.Error
|
||||||
|
}
|
||||||
|
if result.Error != nil {
|
||||||
|
return result.Error
|
||||||
|
}
|
||||||
|
|
||||||
|
fmt.Printf("%v", task.Status)
|
||||||
|
|
||||||
|
localPath := path.Join(input.TaskID)
|
||||||
|
taskFolderPath := path.Join(s.app.Config.UploadDir, "tasks", localPath)
|
||||||
|
os.MkdirAll(taskFolderPath, os.ModePerm)
|
||||||
|
|
||||||
|
for _, fileHeader := range files {
|
||||||
|
file, err := fileHeader.Open()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
defer file.Close()
|
||||||
|
|
||||||
|
if !strings.HasSuffix(fileHeader.Filename, ".rpm") {
|
||||||
|
return fmt.Errorf("invalid file type: only .rpm files are allowed")
|
||||||
|
}
|
||||||
|
|
||||||
|
// Полный путь для файла
|
||||||
|
filePath := path.Join(taskFolderPath, fileHeader.Filename)
|
||||||
|
|
||||||
|
//Удаляем файл если такой уже существует
|
||||||
|
if _, err := os.Stat(filePath); err == nil {
|
||||||
|
err = os.Remove(filePath)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Сохранение файла на сервере
|
||||||
|
outFile, err := os.Create(filePath)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
defer outFile.Close()
|
||||||
|
|
||||||
|
_, err = io.Copy(outFile, file)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
arch, err := getRPMArchitecture(filePath)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
fmt.Println(arch)
|
||||||
|
|
||||||
|
// Символическая ссылка
|
||||||
|
/*
|
||||||
|
targetPath := path.Join("../../../../tasks/", localPath, fileHeader.Filename)
|
||||||
|
symLink := path.Join(s.app.Config.UploadDir, "repo/Sisyphus", arch, "RPMS.aides", fileHeader.Filename)
|
||||||
|
err = createSymlink(targetPath, symLink)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
task.Status = models.StatusCompleted
|
||||||
|
if err := s.app.Db.Save(&task).Error; err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
Loading…
Reference in a new issue