Skip to content

Commit

Permalink
upload files to S3
Browse files Browse the repository at this point in the history
absolutely 0 checks but probably the upload works
  • Loading branch information
odrling committed Apr 2, 2024
1 parent 89f57dc commit 26354f6
Show file tree
Hide file tree
Showing 6 changed files with 78 additions and 61 deletions.
2 changes: 2 additions & 0 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -9,10 +9,12 @@ require (
)

require (
github.com/aws/aws-sdk-go v1.51.11 // indirect
github.com/dustin/go-humanize v1.0.1 // indirect
github.com/glebarez/go-sqlite v1.22.0 // indirect
github.com/jinzhu/inflection v1.0.0 // indirect
github.com/jinzhu/now v1.1.5 // indirect
github.com/jmespath/go-jmespath v0.4.0 // indirect
github.com/ncruces/go-strftime v0.1.9 // indirect
github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec // indirect
modernc.org/libc v1.41.0 // indirect
Expand Down
6 changes: 6 additions & 0 deletions go.sum
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
github.com/andybalholm/brotli v1.1.0 h1:eLKJA0d02Lf0mVpIDgYnqXcUn0GqVmEFny3VuID1U3M=
github.com/andybalholm/brotli v1.1.0/go.mod h1:sms7XGricyQI9K10gOSf56VKKWS4oLer58Q+mhRPtnY=
github.com/aws/aws-sdk-go v1.51.11 h1:El5VypsMIz7sFwAAj/j06JX9UGs4KAbAIEaZ57bNY4s=
github.com/aws/aws-sdk-go v1.51.11/go.mod h1:LF8svs817+Nz+DmiMQKTO3ubZ/6IaTpq3TjupRn3Eqk=
github.com/cpuguy83/go-md2man/v2 v2.0.3/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o=
github.com/danielgtaylor/casing v1.0.0 h1:uX+PewTv0zbXeTluwRwlyPMRQEduVP9svLHpbDsQYkw=
github.com/danielgtaylor/casing v1.0.0/go.mod h1:eFdYmNxcuLDrRNW0efVoxSaApmvGXfHZ9k2CT/RSUF0=
Expand Down Expand Up @@ -32,6 +34,9 @@ github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD
github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc=
github.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ=
github.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=
github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg=
github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo=
github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U=
github.com/klauspost/compress v1.17.7 h1:ehO88t2UGzQK66LMdE8tibEd1ErmzZjNEqWkjLAKQQg=
github.com/klauspost/compress v1.17.7/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw=
github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA=
Expand Down Expand Up @@ -72,6 +77,7 @@ golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.17.0 h1:25cE3gD+tdBA7lp7QfhuV+rJiE9YXTcS3VG1SqssI/Y=
golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
Expand Down
6 changes: 5 additions & 1 deletion server/karaberus.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,10 @@ import (

var FILES_DIR = getEnvDefault("FILES_DIR", "files")
var LISTEN_ADDR = getEnvDefault("LISTEN_ADDR", "127.0.0.1:8888")
var BUCKET_NAME = getEnvDefault("BUCKET_NAME", "karaberus")
var S3_ENDPOINT = getEnvDefault("S3_ENDPOINT", "")
var S3_KEYID = getEnvDefault("S3_KEYID", "")
var S3_SECRET = getEnvDefault("S3_SECRET", "")

func getEnvDefault(name string, defaultValue string) string {
envVar := os.Getenv("KARABERUS_" + name)
Expand All @@ -40,7 +44,7 @@ func routes(api huma.API) {
OperationID: "upload",
Summary: "Upload karaoke file",
Method: http.MethodPost,
Path: "/upload",
Path: "/upload/{kid}",
RequestBody: &huma.RequestBody{
Content: map[string]*huma.MediaType{
"multipart/form-data": {
Expand Down
9 changes: 8 additions & 1 deletion server/model.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,14 +16,21 @@ type MediaType KaraberusType
type VideoTag KaraberusType
type AudioTag KaraberusType

// Tags
// Users
type User struct {
gorm.Model
Admin bool
TimingProfile TimingAuthor
}

type TimingAuthor struct {
gorm.Model
Name string
AdditionalNames []AdditionalName `gorm:"many2many:tags_additional_name"`
}

// Tags

var (
KaraTagArtist TagType = TagType{Type: "Artist", Value: 1}
)
Expand Down
51 changes: 51 additions & 0 deletions server/s3.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
// Copyright (C) 2024 odrling

package server

import (
"fmt"
"io"

"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/aws/credentials"
"github.com/aws/aws-sdk-go/aws/session"
"github.com/aws/aws-sdk-go/service/s3/s3manager"
)

func getS3Session() (*session.Session, error) {
cred := credentials.NewStaticCredentials(S3_KEYID, S3_SECRET, "")

awsConfig := aws.NewConfig()
awsConfig.WithMaxRetries(3)
awsConfig.WithEndpoint(S3_ENDPOINT)
awsConfig.WithCredentials(cred)

return session.NewSession(awsConfig)
}

func getS3Uploader() (*s3manager.Uploader, error) {
sess, err := getS3Session()

if err != nil {
fmt.Printf("Failed to initialize new session: %v", err)
return nil, err
}

return s3manager.NewUploader(sess), nil
}

func UploadToS3(file io.Reader, bucketName string, filename string) error {
uploader, err := getS3Uploader();
if (err != nil) {
return err
}

_, err = uploader.Upload(&s3manager.UploadInput{
Bucket: aws.String(bucketName),
Key: aws.String(filename),
Body: file,
})

return err
}
65 changes: 6 additions & 59 deletions server/upload.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,6 @@ package server
// #cgo pkg-config: dakara_check
// #include <stdlib.h>
// #include <dakara_check.h>
//
// void karaberus_dakara_check_results_free(struct dakara_check_results *res) {
// dakara_check_results_free(res);
// }
//
import "C"

import (
Expand All @@ -27,7 +22,7 @@ import (
)

type UploadInput struct {
FileID uuid.UUID
FileID uuid.UUID `path:"kid"`
}

func getFilePathStr(fileIDStr string) string {
Expand All @@ -38,55 +33,9 @@ func getFilePath(fileID uuid.UUID) string {
return getFilePathStr(fileID.String())
}

func saveFile(fd multipart.File) (*uuid.UUID, error) {
buf := make([]byte, 4*1024*1024) // 4MiB
filesdir := FILES_DIR

err := os.MkdirAll(filesdir, os.ModePerm)
if err != nil {
return nil, err
}

fileUUID, err := uuid.NewRandom()
if err != nil {
return nil, err
}

filepath := filepath.Join(filesdir, fileUUID.String())

wfd, err := os.Create(filepath)
if err != nil {
return nil, err
}
defer wfd.Close()

for {
n, err := fd.Read(buf)
if err == io.EOF {
break
}
if err != nil {
goto cleanup
}

if n < len(buf) {
buf = buf[:n]
}
_, err = wfd.Write(buf)
if err != nil {
goto cleanup
}
}

return &fileUUID, nil

cleanup:
log.Println("cleaning up " + filepath)
err = os.Remove(filepath)
if err != nil {
log.Println(err)
}
return nil, err
func saveFile(fd multipart.File, kid uuid.UUID, type_directory string) (error) {
filename := filepath.Join(type_directory, "/", kid.String())
return UploadToS3(fd, BUCKET_NAME, filename)
}

func (m *UploadInput) Resolve(ctx huma.Context) []error {
Expand All @@ -105,13 +54,11 @@ func (m *UploadInput) Resolve(ctx huma.Context) []error {
}
defer fd.Close()

fileid, err := saveFile(fd)
err = saveFile(fd, m.FileID, "video")
if err != nil {
return []error{err}
}

m.FileID = *fileid

return nil
}

Expand All @@ -135,7 +82,7 @@ func UploadKaraFile(ctx context.Context, input *UploadInput) (*UploadOutput, err
cfilepath := C.CString(getFilePath(input.FileID))
defer C.free(unsafe.Pointer(cfilepath))
dakara_check_results := C.dakara_check(cfilepath, 0)
defer C.karaberus_dakara_check_results_free(dakara_check_results)
defer C.dakara_check_results_free(dakara_check_results)

resp.Body.Passed = bool(dakara_check_results.passed)
resp.Body.FileID = input.FileID.String()
Expand Down

0 comments on commit 26354f6

Please sign in to comment.