diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 6fd353a..2848df4 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -46,4 +46,4 @@ jobs: args: --timeout=5m - name: Build - run: go build -v ./cmd/prism + run: go build -v . diff --git a/Dockerfile b/Dockerfile index b0843bb..c172f20 100644 --- a/Dockerfile +++ b/Dockerfile @@ -11,7 +11,7 @@ COPY . . RUN CGO_ENABLED=1 GOOS=linux go build -a -installsuffix cgo \ -ldflags="-w -s -X main.version=$(git describe --tags --always) -X main.commit=$(git rev-parse --short HEAD)" \ - -o prism ./cmd/prism + -o prism . FROM alpine:latest @@ -33,4 +33,4 @@ ENV SIGNAL_CLI_SOCKET=/var/run/signal-cli/socket EXPOSE 8080 -CMD ["./prism", "serve"] +CMD ["./prism"] diff --git a/Makefile b/Makefile index 578e980..a110fcb 100644 --- a/Makefile +++ b/Makefile @@ -9,16 +9,16 @@ export PATH := $(GOBIN):$(PATH) all: fmt lint build build: - go build -ldflags="-X main.version=$(VERSION) -X main.commit=$(COMMIT)" -o $(BINARY_NAME) ./cmd/prism + go build -ldflags="-X main.version=$(VERSION) -X main.commit=$(COMMIT)" -o $(BINARY_NAME) . build-linux: - GOOS=linux GOARCH=arm64 go build -ldflags="-X main.version=$(VERSION) -X main.commit=$(COMMIT)" -o $(BINARY_NAME)-linux-arm64 ./cmd/prism + GOOS=linux GOARCH=arm64 go build -ldflags="-X main.version=$(VERSION) -X main.commit=$(COMMIT)" -o $(BINARY_NAME)-linux-arm64 . run: build - ./$(BINARY_NAME) serve + ./$(BINARY_NAME) dev: - go run ./cmd/prism serve + go run . fmt: gofmt -s -w . diff --git a/go.mod b/go.mod index 851c26a..a26b89e 100644 --- a/go.mod +++ b/go.mod @@ -1,4 +1,4 @@ -module github.com/lone-cloud/prism +module prism go 1.25.6 @@ -7,13 +7,10 @@ require ( github.com/go-chi/chi/v5 v5.2.4 github.com/joho/godotenv v1.5.1 github.com/mattn/go-sqlite3 v1.14.33 - github.com/spf13/cobra v1.10.2 golang.org/x/time v0.14.0 ) require ( github.com/emersion/go-sasl v0.0.0-20200509203442-7bfe0ed36a21 // indirect - github.com/inconshreveable/mousetrap v1.1.0 // indirect - github.com/spf13/pflag v1.0.10 // indirect golang.org/x/text v0.28.0 // indirect ) diff --git a/go.sum b/go.sum index c59f31a..f7d04bc 100644 --- a/go.sum +++ b/go.sum @@ -1,4 +1,3 @@ -github.com/cpuguy83/go-md2man/v2 v2.0.6/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g= github.com/emersion/go-imap v1.2.1 h1:+s9ZjMEjOB8NzZMVTM3cCenz2JrQIGGo5j1df19WjTA= github.com/emersion/go-imap v1.2.1/go.mod h1:Qlx1FSx2FTxjnjWpIlVNEuX+ylerZQNFE5NsmKFSejY= github.com/emersion/go-message v0.15.0/go.mod h1:wQUEfE+38+7EW8p8aZ96ptg6bAb1iwdgej19uXASlE4= @@ -7,19 +6,10 @@ github.com/emersion/go-sasl v0.0.0-20200509203442-7bfe0ed36a21/go.mod h1:iL2twTe github.com/emersion/go-textwrapper v0.0.0-20200911093747-65d896831594/go.mod h1:aqO8z8wPrjkscevZJFVE1wXJrLpC5LtJG7fqLOsPb2U= github.com/go-chi/chi/v5 v5.2.4 h1:WtFKPHwlywe8Srng8j2BhOD9312j9cGUxG1SP4V2cR4= github.com/go-chi/chi/v5 v5.2.4/go.mod h1:X7Gx4mteadT3eDOMTsXzmI4/rwUpOwBHLpAfupzFJP0= -github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= -github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= github.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0= github.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4= github.com/mattn/go-sqlite3 v1.14.33 h1:A5blZ5ulQo2AtayQ9/limgHEkFreKj1Dv226a1K73s0= github.com/mattn/go-sqlite3 v1.14.33/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= -github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/spf13/cobra v1.10.2 h1:DMTTonx5m65Ic0GOoRY2c16WCbHxOOw6xxezuLaBpcU= -github.com/spf13/cobra v1.10.2/go.mod h1:7C1pvHqHw5A4vrJfjNwvOdzYu0Gml16OCs2GRiTUUS4= -github.com/spf13/pflag v1.0.9/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= -github.com/spf13/pflag v1.0.10 h1:4EBh2KAYBwaONj6b2Ye1GiHfwjqyROoF4RwYO+vPwFk= -github.com/spf13/pflag v1.0.10/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= -go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.28.0 h1:rhazDwis8INMIwQ4tpjLDzUhx6RlXqZNPEM0huQojng= @@ -27,4 +17,3 @@ golang.org/x/text v0.28.0/go.mod h1:U8nCwOR8jO/marOQ0QbDiOngZVEBB7MAiitBuMjXiNU= golang.org/x/time v0.14.0 h1:MRx4UaLrDotUKUdCIqzPC48t1Y9hANFKIRpNx+Te8PI= golang.org/x/time v0.14.0/go.mod h1:eL/Oa2bBBK0TkX57Fyni+NgnyQQN4LitPmob2Hjnqw4= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= diff --git a/internal/notification/dispatcher.go b/internal/notification/dispatcher.go index 1076669..1ed4e33 100644 --- a/internal/notification/dispatcher.go +++ b/internal/notification/dispatcher.go @@ -8,7 +8,7 @@ import ( "net/http" "strings" - "github.com/lone-cloud/prism/internal/signal" + "prism/internal/signal" ) type Dispatcher struct { @@ -26,7 +26,7 @@ func NewDispatcher(store *Store, signalClient *signal.Client, logger *slog.Logge } func (d *Dispatcher) Send(endpoint string, notif Notification) error { - mapping, err := d.store.GetMapping(endpoint) + mapping, err := d.store.GetEndpointMapping(endpoint) if err != nil { return fmt.Errorf("failed to get mapping: %w", err) } @@ -39,7 +39,7 @@ func (d *Dispatcher) Send(endpoint string, notif Notification) error { return fmt.Errorf("failed to register endpoint: %w", err) } - mapping, err = d.store.GetMapping(endpoint) + mapping, err = d.store.GetEndpointMapping(endpoint) if err != nil { return fmt.Errorf("failed to get mapping after registration: %w", err) } diff --git a/internal/notification/store.go b/internal/notification/store.go index a613050..b56d3e2 100644 --- a/internal/notification/store.go +++ b/internal/notification/store.go @@ -66,7 +66,7 @@ func (s *Store) Register(endpoint, appName string, channel Channel, groupID, upE return err } -func (s *Store) GetMapping(endpoint string) (*Mapping, error) { +func (s *Store) GetEndpointMapping(endpoint string) (*Mapping, error) { query := ` SELECT endpoint, groupId, appName, channel, upEndpoint FROM mappings diff --git a/internal/proton/actions.go b/internal/proton/actions.go index 82d5d77..61058e9 100644 --- a/internal/proton/actions.go +++ b/internal/proton/actions.go @@ -4,7 +4,7 @@ import ( "fmt" "log/slog" - "github.com/lone-cloud/prism/internal/config" + "prism/internal/config" ) type ActionHandler struct { diff --git a/internal/proton/monitor.go b/internal/proton/monitor.go index babc1c1..1094b7b 100644 --- a/internal/proton/monitor.go +++ b/internal/proton/monitor.go @@ -7,10 +7,11 @@ import ( "strings" "time" + "prism/internal/config" + "prism/internal/notification" + "github.com/emersion/go-imap" "github.com/emersion/go-imap/client" - "github.com/lone-cloud/prism/internal/config" - "github.com/lone-cloud/prism/internal/notification" ) type Monitor struct { diff --git a/internal/server/handlers_action.go b/internal/server/handlers_action.go index 4a52caf..6398749 100644 --- a/internal/server/handlers_action.go +++ b/internal/server/handlers_action.go @@ -3,7 +3,7 @@ package server import ( "net/http" - "github.com/lone-cloud/prism/internal/notification" + "prism/internal/notification" ) func (s *Server) handleDeleteEndpointAction(w http.ResponseWriter, r *http.Request) { diff --git a/internal/server/handlers_admin.go b/internal/server/handlers_admin.go index f074cf7..995c616 100644 --- a/internal/server/handlers_admin.go +++ b/internal/server/handlers_admin.go @@ -6,9 +6,10 @@ import ( "net/http" "time" + "prism/internal/notification" + "prism/internal/util" + "github.com/go-chi/chi/v5" - "github.com/lone-cloud/prism/internal/notification" - "github.com/lone-cloud/prism/internal/util" ) func (s *Server) handleGetMappings(w http.ResponseWriter, r *http.Request) { diff --git a/internal/server/handlers_fragment.go b/internal/server/handlers_fragment.go index f8f71b1..89a37da 100644 --- a/internal/server/handlers_fragment.go +++ b/internal/server/handlers_fragment.go @@ -5,9 +5,9 @@ import ( "net/http" "net/url" - "github.com/lone-cloud/prism/internal/notification" - "github.com/lone-cloud/prism/internal/signal" - "github.com/lone-cloud/prism/internal/util" + "prism/internal/notification" + "prism/internal/signal" + "prism/internal/util" ) func (s *Server) handleFragmentHealth(w http.ResponseWriter, r *http.Request) { diff --git a/internal/server/handlers_ntfy.go b/internal/server/handlers_ntfy.go index a65b5b8..2f88654 100644 --- a/internal/server/handlers_ntfy.go +++ b/internal/server/handlers_ntfy.go @@ -8,8 +8,9 @@ import ( "strings" "time" + "prism/internal/notification" + "github.com/go-chi/chi/v5" - "github.com/lone-cloud/prism/internal/notification" ) func (s *Server) handleNtfyPublish(w http.ResponseWriter, r *http.Request) { diff --git a/internal/server/handlers_webhook.go b/internal/server/handlers_webhook.go index d7c9c81..46779e1 100644 --- a/internal/server/handlers_webhook.go +++ b/internal/server/handlers_webhook.go @@ -5,7 +5,7 @@ import ( "net/http" "net/url" - "github.com/lone-cloud/prism/internal/notification" + "prism/internal/notification" ) type registerWebhookRequest struct { diff --git a/internal/server/middleware.go b/internal/server/middleware.go index b14acb8..1e217b6 100644 --- a/internal/server/middleware.go +++ b/internal/server/middleware.go @@ -6,7 +6,8 @@ import ( "sync" "time" - "github.com/lone-cloud/prism/internal/util" + "prism/internal/util" + "golang.org/x/time/rate" ) diff --git a/internal/server/server.go b/internal/server/server.go index ec657fa..ccd27b2 100644 --- a/internal/server/server.go +++ b/internal/server/server.go @@ -7,13 +7,14 @@ import ( "net/http" "time" + "prism/internal/config" + "prism/internal/notification" + "prism/internal/proton" + "prism/internal/signal" + "prism/internal/util" + "github.com/go-chi/chi/v5" "github.com/go-chi/chi/v5/middleware" - "github.com/lone-cloud/prism/internal/config" - "github.com/lone-cloud/prism/internal/notification" - "github.com/lone-cloud/prism/internal/proton" - "github.com/lone-cloud/prism/internal/signal" - "github.com/lone-cloud/prism/internal/util" ) type Server struct { diff --git a/cmd/prism/main.go b/main.go similarity index 59% rename from cmd/prism/main.go rename to main.go index c7dc060..6c5e29c 100644 --- a/cmd/prism/main.go +++ b/main.go @@ -7,11 +7,11 @@ import ( "os/signal" "syscall" + "prism/internal/config" + "prism/internal/server" + "prism/internal/util" + "github.com/joho/godotenv" - "github.com/lone-cloud/prism/internal/config" - "github.com/lone-cloud/prism/internal/server" - "github.com/lone-cloud/prism/internal/util" - "github.com/spf13/cobra" ) var ( @@ -23,34 +23,13 @@ func init() { _ = godotenv.Load() //nolint:errcheck // .env is optional } -var rootCmd = &cobra.Command{ - Use: "prism", - Short: "Privacy-preserving push notifications via Signal", -} - -var serveCmd = &cobra.Command{ - Use: "serve", - Short: "Start the Prism server", - RunE: func(cmd *cobra.Command, args []string) error { - return runServer() - }, -} - -var versionCmd = &cobra.Command{ - Use: "version", - Short: "Show version information", - Run: func(cmd *cobra.Command, args []string) { - fmt.Printf("Prism %s (%s)\n", version, commit) - }, -} - -func init() { - rootCmd.AddCommand(serveCmd) - rootCmd.AddCommand(versionCmd) -} - func main() { - if err := rootCmd.Execute(); err != nil { + if len(os.Args) > 1 && os.Args[1] == "version" { + fmt.Printf("Prism %s (%s)\n", version, commit) + return + } + + if err := runServer(); err != nil { logger := util.NewLogger(false) logger.Error("Fatal error", "error", err) os.Exit(1)