diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index f050fb2f..efe5d270 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -19,8 +19,14 @@ jobs: uses: actions/setup-node@v4 with: node-version: 18 + - name: Set up buf + uses: bufbuild/buf-setup-action@v1.28.1 + with: + github_token: ${{ secrets.GITHUB_TOKEN }} - name: Build Backend - run: go build -v ./... + run: | + go generate ./... + go build -v ./... - name: Test Backend run: go test -v -coverprofile=coverage.cov -coverpkg ./... -covermode=atomic ./... - name: Upload coverage reports to Codecov diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 00000000..e304d934 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,21 @@ +FROM golang as builder + +WORKDIR /build + +RUN apt update && apt install -y nodejs npm + +ADD go.mod . +ADD go.sum . + +RUN go install github.com/bufbuild/buf/cmd/buf@latest + +ADD . . + +RUN go generate ./... +RUN go build ./cmd/moneyd + +FROM debian:stable-slim + +COPY --from=builder /build/moneyd / + +ENTRYPOINT [ "./moneyd"] diff --git a/cmd/moneyd/moneyd.go b/cmd/moneyd/moneyd.go index cd44bd13..a92316d8 100644 --- a/cmd/moneyd/moneyd.go +++ b/cmd/moneyd/moneyd.go @@ -34,6 +34,7 @@ import ( "github.com/oxisto/money-gopher/persistence" "github.com/oxisto/money-gopher/service/portfolio" "github.com/oxisto/money-gopher/service/securities" + "github.com/oxisto/money-gopher/ui" ) var cmd moneydCmd @@ -85,6 +86,7 @@ func (cmd *moneydCmd) Run() error { }, ))) mux.Handle(portfoliov1connect.NewSecuritiesServiceHandler(securities.NewService(db))) + mux.Handle("/", ui.SvelteKitHandler("/")) err = http.ListenAndServe( "localhost:8080", diff --git a/ui/embed.go b/ui/embed.go new file mode 100644 index 00000000..fe71bc76 --- /dev/null +++ b/ui/embed.go @@ -0,0 +1,34 @@ +package ui + +import ( + "embed" + "errors" + "io/fs" + "log" + "net/http" + "os" + "strings" +) + +//go:generate npm i +//go:generate npm run build +//go:embed all:build +var files embed.FS + +func SvelteKitHandler(path string) http.Handler { + fsys, err := fs.Sub(files, "build") + if err != nil { + log.Fatal(err) + } + filesystem := http.FS(fsys) + + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + path := strings.TrimPrefix(r.URL.Path, path) + _, err := filesystem.Open(path) + if errors.Is(err, os.ErrNotExist) { + path = "index.html" + } + r.URL.Path = path + http.FileServer(filesystem).ServeHTTP(w, r) + }) +} diff --git a/ui/package-lock.json b/ui/package-lock.json index d943ee7a..f3250962 100644 --- a/ui/package-lock.json +++ b/ui/package-lock.json @@ -12,7 +12,6 @@ "@connectrpc/connect-web": "^1.1.3", "@steeze-ui/heroicons": "^2.2.3", "@steeze-ui/svelte-icon": "^1.5.0", - "@sveltejs/adapter-auto": "^2.0.0", "@sveltejs/adapter-static": "^2.0.3", "@sveltejs/kit": "^1.20.4", "@tailwindcss/forms": "^0.5.4", @@ -808,18 +807,6 @@ "svelte": "^4.0.0" } }, - "node_modules/@sveltejs/adapter-auto": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@sveltejs/adapter-auto/-/adapter-auto-2.1.1.tgz", - "integrity": "sha512-nzi6x/7/3Axh5VKQ8Eed3pYxastxoa06Y/bFhWb7h3Nu+nGRVxKAy3+hBJgmPCwWScy8n0TsstZjSVKfyrIHkg==", - "dev": true, - "dependencies": { - "import-meta-resolve": "^4.0.0" - }, - "peerDependencies": { - "@sveltejs/kit": "^1.0.0" - } - }, "node_modules/@sveltejs/adapter-static": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/@sveltejs/adapter-static/-/adapter-static-2.0.3.tgz", @@ -2232,16 +2219,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/import-meta-resolve": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-4.0.0.tgz", - "integrity": "sha512-okYUR7ZQPH+efeuMJGlq4f8ubUgO50kByRPyt/Cy1Io4PSRsPjxME+YlVaCOx+NIToW7hCsZNFJyTPFFKepRSA==", - "dev": true, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, "node_modules/imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", diff --git a/ui/package.json b/ui/package.json index 57671c39..7a65a66c 100644 --- a/ui/package.json +++ b/ui/package.json @@ -16,7 +16,6 @@ "@connectrpc/connect-web": "^1.1.3", "@steeze-ui/heroicons": "^2.2.3", "@steeze-ui/svelte-icon": "^1.5.0", - "@sveltejs/adapter-auto": "^2.0.0", "@sveltejs/adapter-static": "^2.0.3", "@sveltejs/kit": "^1.20.4", "@tailwindcss/forms": "^0.5.4", diff --git a/ui/svelte.config.js b/ui/svelte.config.js index 1cf26a00..7dab1cac 100644 --- a/ui/svelte.config.js +++ b/ui/svelte.config.js @@ -1,4 +1,4 @@ -import adapter from '@sveltejs/adapter-auto'; +import adapter from '@sveltejs/adapter-static'; import { vitePreprocess } from '@sveltejs/kit/vite'; /** @type {import('@sveltejs/kit').Config} */ @@ -8,10 +8,9 @@ const config = { preprocess: vitePreprocess(), kit: { - // adapter-auto only supports some environments, see https://kit.svelte.dev/docs/adapter-auto for a list. - // If your environment is not supported or you settled on a specific environment, switch out the adapter. - // See https://kit.svelte.dev/docs/adapters for more information about adapters. - adapter: adapter() + adapter: adapter({ + fallback: 'index.html' + }) } };