feat: implement achievements

This commit is contained in:
Albert
2025-12-19 23:12:22 +04:00
parent d2d5bfbe34
commit ecff776c3b
11 changed files with 566 additions and 0 deletions
+33
View File
@@ -0,0 +1,33 @@
package main
import (
"log"
"os"
"os/signal"
"syscall"
"datarush/internal/achievements/config"
"datarush/internal/achievements/server"
)
func main() {
cfg, err := config.Load()
if err != nil {
log.Fatalf("failed to load config: %v", err)
}
srv := server.New(cfg)
if err := srv.Start(); err != nil {
log.Fatalf("failed to start server: %v", err)
}
quit := make(chan os.Signal, 1)
signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM)
<-quit
log.Println("shutting down achievements server...")
srv.Stop()
log.Println("achievements server stopped")
}
@@ -0,0 +1,3 @@
DROP TABLE IF EXISTS user_achievements;
DROP TABLE IF EXISTS achievements;
@@ -0,0 +1,20 @@
CREATE TABLE IF NOT EXISTS achievements (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
name VARCHAR(255) NOT NULL,
description TEXT NOT NULL,
icon_url VARCHAR(512),
created_at TIMESTAMP NOT NULL DEFAULT NOW(),
updated_at TIMESTAMP NOT NULL DEFAULT NOW()
);
CREATE TABLE IF NOT EXISTS user_achievements (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
user_id UUID NOT NULL REFERENCES users(id) ON DELETE CASCADE,
achievement_id UUID NOT NULL REFERENCES achievements(id) ON DELETE CASCADE,
received_at TIMESTAMP NOT NULL DEFAULT NOW(),
UNIQUE(user_id, achievement_id)
);
CREATE INDEX IF NOT EXISTS idx_user_achievements_user_id ON user_achievements(user_id);
CREATE INDEX IF NOT EXISTS idx_user_achievements_achievement_id ON user_achievements(achievement_id);