-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmain.go
120 lines (92 loc) · 2.91 KB
/
main.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
package main
import (
_ "linkz/migrations"
"fmt"
"log"
"net/http"
"os"
"path/filepath"
"github.com/yeqown/go-qrcode/v2"
"github.com/yeqown/go-qrcode/writer/standard"
"github.com/pocketbase/pocketbase"
"github.com/pocketbase/pocketbase/core"
"github.com/pocketbase/pocketbase/tools/filesystem"
)
const (
collectionName = "Linkz"
assetPath = "./qr-codes"
)
func generateQRCode(baseURL, srcPath, savePath string) error {
qrc, err := qrcode.New(fmt.Sprintf("%s/%s", baseURL, srcPath))
if err != nil {
return fmt.Errorf("failed to generate QRCode: %w", err)
}
w, err := standard.New(savePath)
if err != nil {
return fmt.Errorf("failed to create QR writer: %w", err)
}
if err = qrc.Save(w); err != nil {
return fmt.Errorf("failed to save QR code: %w", err)
}
return nil
}
func main() {
app := pocketbase.New()
// Ensure assets directory exists
if err := os.MkdirAll(assetPath, os.ModePerm); err != nil {
log.Fatalf("Failed to create assets directory: %v", err)
}
// URL redirect handler
app.OnServe().BindFunc(func(se *core.ServeEvent) error {
se.Router.GET("/{src_path}", func(e *core.RequestEvent) error {
srcURL := e.Request.PathValue("src_path")
record, err := app.FindFirstRecordByData(collectionName, "src", srcURL)
if err != nil {
return e.BadRequestError("Invalid path", err)
}
// Increment hits counter
hits := record.GetInt("hits")
record.Set("hits", hits+1)
if err := app.Save(record); err != nil {
log.Printf("Failed to save record: %v", err)
}
return e.Redirect(http.StatusPermanentRedirect, record.GetString("dst"))
})
return se.Next()
})
// Handle record creation
app.OnRecordCreate(collectionName).BindFunc(func(e *core.RecordEvent) error {
srcPath := e.Record.GetString("src")
filePath := filepath.Join(assetPath, srcPath+".png")
if err := generateQRCode(e.App.Settings().Meta.AppURL, srcPath, filePath); err != nil {
log.Printf("Failed to generate QR code: %v", err)
return e.Next()
}
file, err := filesystem.NewFileFromPath(filePath)
if err != nil {
log.Printf("Failed to load QR code file: %v", err)
return e.Next()
}
e.Record.Set("QR_Code", file)
return e.Next()
})
// Handle record updates
app.OnRecordUpdate(collectionName).BindFunc(func(e *core.RecordEvent) error {
srcPath := e.Record.GetString("src")
filePath := filepath.Join(assetPath, srcPath+".png")
if err := generateQRCode(e.App.Settings().Meta.AppURL, srcPath, filePath); err != nil {
log.Printf("Failed to update QR code: %v", err)
return e.Next()
}
file, err := filesystem.NewFileFromPath(filePath)
if err != nil {
log.Printf("Failed to load updated QR code file: %v", err)
return e.Next()
}
e.Record.Set("QR_Code", file)
return e.Next()
})
if err := app.Start(); err != nil {
log.Fatal(err)
}
}