feat: Major refactor, implement web, caching, better tests and build files

* Update golang version to 1.24
* Update multiarch Dockerfile to be more ISA agnostic
* Refactor existing code and properly structure project into modules
* Get rid of global variables except where necessary (go:embed)
* Add default values to Config
* Add webserver with templates to finally correctly serve videos and gifs
* Add tiny caching library to decrease api load and improve latency
* Improve Webhook data preparation by filtering out redundant links
  from the tweet text and properly attaching videos and gifs in separate
  webhook request by utilising new webserver
* Improve tests for filter function
* Improve bake definition for easier CI integration
This commit is contained in:
Manuel 2025-03-18 19:22:00 +01:00
parent 7562b86894
commit 21d580d1a6
Signed by: Manuel
GPG key ID: 4085037435E1F07A
24 changed files with 752 additions and 209 deletions

52
pkg/cache/cache.go vendored Normal file
View file

@ -0,0 +1,52 @@
package cache
import (
"sync"
"time"
)
type Cache[K comparable, V any] struct {
data map[K]entry[K, V]
lock sync.RWMutex
}
type entry[K comparable, V any] struct {
value V
expiration time.Time
}
func New[K comparable, V any]() *Cache[K, V] {
return &Cache[K, V]{
data: make(map[K]entry[K, V]),
}
}
func (c *Cache[K, V]) Set(key K, value V, ttl time.Duration) {
c.lock.Lock()
defer c.lock.Unlock()
c.data[key] = entry[K, V]{
value: value,
expiration: time.Now().Add(ttl),
}
}
func (c *Cache[K, V]) Get(key K) (V, bool) {
c.lock.RLock()
defer c.lock.RUnlock()
entry, ok := c.data[key]
if !ok || time.Now().After(entry.expiration) {
delete(c.data, key)
var zero V
return zero, false
}
return entry.value, true
}
func (c *Cache[K, V]) Delete(key K) {
c.lock.Lock()
defer c.lock.Unlock()
delete(c.data, key)
}