mirror of
https://github.com/lus/pasty.git
synced 2023-08-10 21:13:09 +03:00
Implement file storage driver
This commit is contained in:
parent
ba0aebdb62
commit
6011123ab1
@ -1,8 +1,29 @@
|
|||||||
package main
|
package main
|
||||||
|
|
||||||
import "github.com/Lukaesebrot/pasty/internal/env"
|
import (
|
||||||
|
"github.com/Lukaesebrot/pasty/internal/env"
|
||||||
|
"github.com/Lukaesebrot/pasty/internal/storage"
|
||||||
|
"log"
|
||||||
|
"os"
|
||||||
|
"os/signal"
|
||||||
|
"syscall"
|
||||||
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
// Load the optional .env file
|
// Load the optional .env file
|
||||||
|
log.Println("Loading the optional .env file...")
|
||||||
env.Load()
|
env.Load()
|
||||||
|
|
||||||
|
// Load the configured storage driver
|
||||||
|
log.Println("Loading the configured storage driver...")
|
||||||
|
err := storage.Load()
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Wait for the program to exit
|
||||||
|
// TODO: Replace this through blocking API server
|
||||||
|
sc := make(chan os.Signal, 1)
|
||||||
|
signal.Notify(sc, syscall.SIGINT, syscall.SIGTERM, os.Interrupt, os.Kill)
|
||||||
|
<-sc
|
||||||
}
|
}
|
||||||
|
38
internal/storage/driver.go
Normal file
38
internal/storage/driver.go
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
package storage
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/Lukaesebrot/pasty/internal/env"
|
||||||
|
"github.com/Lukaesebrot/pasty/internal/pastes"
|
||||||
|
"github.com/bwmarrin/snowflake"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Current holds the current storage driver
|
||||||
|
var Current Driver
|
||||||
|
|
||||||
|
// Driver represents a storage driver
|
||||||
|
type Driver interface {
|
||||||
|
Initialize() error
|
||||||
|
Terminate() error
|
||||||
|
Get(id snowflake.ID) (*pastes.Paste, error)
|
||||||
|
Save(paste *pastes.Paste) error
|
||||||
|
Delete(id snowflake.ID) error
|
||||||
|
}
|
||||||
|
|
||||||
|
// Load loads the current storage driver
|
||||||
|
func Load() error {
|
||||||
|
storageType := strings.ToLower(env.Get("STORAGE_TYPE", "file"))
|
||||||
|
switch storageType {
|
||||||
|
case "file":
|
||||||
|
driver := new(FileDriver)
|
||||||
|
err := driver.Initialize()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
Current = driver
|
||||||
|
return nil
|
||||||
|
default:
|
||||||
|
return fmt.Errorf("invalid storage type '%s'", storageType)
|
||||||
|
}
|
||||||
|
}
|
69
internal/storage/file_driver.go
Normal file
69
internal/storage/file_driver.go
Normal file
@ -0,0 +1,69 @@
|
|||||||
|
package storage
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/json"
|
||||||
|
"github.com/Lukaesebrot/pasty/internal/env"
|
||||||
|
"github.com/Lukaesebrot/pasty/internal/pastes"
|
||||||
|
"github.com/bwmarrin/snowflake"
|
||||||
|
"io/ioutil"
|
||||||
|
"os"
|
||||||
|
"path/filepath"
|
||||||
|
)
|
||||||
|
|
||||||
|
// FileDriver represents the file storage driver
|
||||||
|
type FileDriver struct {
|
||||||
|
FilePath string
|
||||||
|
}
|
||||||
|
|
||||||
|
// Initialize initializes the file storage driver
|
||||||
|
func (driver *FileDriver) Initialize() error {
|
||||||
|
driver.FilePath = env.Get("STORAGE_FILE_PATH", "./data")
|
||||||
|
return os.MkdirAll(driver.FilePath, os.ModePerm)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Terminate terminates the file storage driver (does nothing, because the file storage driver does not need any termination)
|
||||||
|
func (driver *FileDriver) Terminate() error {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get loads a paste out of a file
|
||||||
|
func (driver *FileDriver) Get(id snowflake.ID) (*pastes.Paste, error) {
|
||||||
|
// Read the file
|
||||||
|
data, err := ioutil.ReadFile(filepath.Join(driver.FilePath, id.String()+".json"))
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
// Unmarshal the file into a paste
|
||||||
|
paste := new(pastes.Paste)
|
||||||
|
err = json.Unmarshal(data, &paste)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return paste, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Save saves a paste into a file
|
||||||
|
func (driver *FileDriver) Save(paste *pastes.Paste) error {
|
||||||
|
// Marshal the paste
|
||||||
|
jsonBytes, err := json.Marshal(paste)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create the file to save the paste to
|
||||||
|
file, err := os.Create(filepath.Join(driver.FilePath, paste.ID.String()+".json"))
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
defer file.Close()
|
||||||
|
|
||||||
|
// Write the JSON data into the file
|
||||||
|
_, err = file.Write(jsonBytes)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// Delete deletes a paste
|
||||||
|
func (driver *FileDriver) Delete(id snowflake.ID) error {
|
||||||
|
return os.Remove(filepath.Join(driver.FilePath, id.String()+".json"))
|
||||||
|
}
|
@ -1,14 +0,0 @@
|
|||||||
package storage
|
|
||||||
|
|
||||||
import (
|
|
||||||
"github.com/Lukaesebrot/pasty/internal/pastes"
|
|
||||||
"github.com/bwmarrin/snowflake"
|
|
||||||
)
|
|
||||||
|
|
||||||
// Storage represents a storage type
|
|
||||||
type Storage interface {
|
|
||||||
initialize() error
|
|
||||||
get(id snowflake.ID) (*pastes.Paste, error)
|
|
||||||
save(paste *pastes.Paste) error
|
|
||||||
delete(id snowflake.ID) error
|
|
||||||
}
|
|
Loading…
Reference in New Issue
Block a user