You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
115 lines
2.3 KiB
Go
115 lines
2.3 KiB
Go
3 years ago
|
package namespace
|
||
|
|
||
|
import (
|
||
|
"caj-larsson/bog/util"
|
||
|
"time"
|
||
|
"fmt"
|
||
|
)
|
||
|
|
||
|
type Clock interface {
|
||
|
Now() time.Time
|
||
|
}
|
||
|
|
||
|
type NamespaceService struct {
|
||
|
repo Repository
|
||
|
outboxes []func(util.Event)
|
||
|
logger util.Logger
|
||
|
clock Clock
|
||
|
default_ttl time.Duration
|
||
|
default_quota_bytes int64
|
||
|
}
|
||
|
|
||
|
|
||
|
func NewNamespaceService(repo Repository, logger util.Logger, clock Clock, default_ttl time.Duration, default_quota_bytes int64) *NamespaceService {
|
||
|
return &NamespaceService {
|
||
|
repo,
|
||
|
nil,
|
||
|
logger,
|
||
|
clock,
|
||
|
default_ttl,
|
||
|
default_quota_bytes,
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
func (s *NamespaceService) GetOrCreateNs(name string) *Namespace {
|
||
|
ns, err := s.repo.GetByName(name)
|
||
|
|
||
|
if err == ErrNotExists {
|
||
|
new_ns := Namespace{
|
||
|
0,
|
||
|
name,
|
||
|
s.clock.Now(),
|
||
|
s.default_ttl,
|
||
|
FileSizeQuota{s.default_quota_bytes, 0},
|
||
|
FileStat{0, 0},
|
||
|
FileStat{0, 0},
|
||
|
}
|
||
|
created_ns, err := s.repo.Create(new_ns)
|
||
|
|
||
|
if err != nil {
|
||
|
panic(err)
|
||
|
}
|
||
|
|
||
|
return created_ns
|
||
|
}
|
||
|
|
||
|
if err != nil {
|
||
|
panic(err)
|
||
|
}
|
||
|
return ns
|
||
|
}
|
||
|
|
||
|
|
||
|
func (s *NamespaceService) Wire(reg func(string, util.EventHandler), outbox func(ev util.Event)) { reg("FileUsed", s.handleFileUsed)
|
||
|
s.outboxes = append(s.outboxes, outbox)
|
||
|
|
||
|
reg("FileUsed", s.handleFileUsed)
|
||
|
reg("FileDeleted", s.handleFileDeleted)
|
||
|
reg("FileRecieved", s.handleFileRecieved)
|
||
|
}
|
||
|
|
||
|
|
||
|
func (s *NamespaceService) All() ([]Namespace) {
|
||
|
nss, err := s.repo.All()
|
||
|
if err != nil {
|
||
|
panic(err)
|
||
|
}
|
||
|
return nss
|
||
|
}
|
||
|
|
||
|
func (s *NamespaceService) handleFileUsed(payload interface{}) {
|
||
|
var payload_s = payload.(struct{
|
||
|
Name string
|
||
|
Size int64
|
||
|
})
|
||
|
fmt.Printf("file used %v\n", payload_s )
|
||
|
ns := s.GetOrCreateNs(payload_s.Name)
|
||
|
ns.FileQuota = ns.FileQuota.Add(payload_s.Size)
|
||
|
s.repo.Update(ns.ID, *ns)
|
||
|
}
|
||
|
|
||
|
func (s *NamespaceService) handleFileDeleted(payload interface{}) {
|
||
|
var payload_s = payload.(struct{
|
||
|
Name string
|
||
|
Size int64
|
||
|
})
|
||
|
fmt.Printf("file deleted %v\n", payload_s )
|
||
|
ns := s.GetOrCreateNs(payload_s.Name)
|
||
|
ns.FileQuota = ns.FileQuota.Add(-payload_s.Size)
|
||
|
fmt.Printf("file usage %v\n", ns.FileQuota)
|
||
|
s.repo.Update(ns.ID, *ns)
|
||
|
}
|
||
|
|
||
|
func (s *NamespaceService) handleFileRecieved(payload interface{}) {
|
||
|
var payload_s = payload.(struct{
|
||
|
Name string
|
||
|
Size int64
|
||
|
})
|
||
|
fmt.Printf("file recieved %v\n", payload_s )
|
||
|
ns := s.GetOrCreateNs(payload_s.Name)
|
||
|
ns.FileQuota = ns.FileQuota.Add(payload_s.Size)
|
||
|
fmt.Printf("file usage %v\n", ns.FileQuota)
|
||
|
s.repo.Update(ns.ID, *ns)
|
||
|
}
|