diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml new file mode 100644 index 0000000..62a7e5e --- /dev/null +++ b/.github/workflows/build.yml @@ -0,0 +1,98 @@ +name: Go + +permissions: + contents: write + +on: + push: + branches: [ "main" ] + +jobs: + build: + runs-on: ubuntu-latest + + strategy: + matrix: + goosarch: + - 'darwin/amd64' + - 'darwin/arm64' + - 'linux/amd64' + - 'linux/arm64' + - 'windows/amd64' + + steps: + - uses: actions/checkout@v4 + - uses: ariga/setup-atlas@v0 + - uses: sqlc-dev/setup-sqlc@v4 + with: + sqlc-version: '1.26.0' + + - name: Set up Go 1.22 + uses: actions/setup-go@v5 + with: + go-version: '1.22.x' + + - name: Install dependencies + run: | + go get . + + - name: Get OS and arch info + run: | + GOOSARCH=${{matrix.goosarch}} + GOOS=${GOOSARCH%/*} + GOARCH=${GOOSARCH#*/} + GOEXT=$(if [ "$GOOS" = "windows" ]; then echo ".exe"; else echo ""; fi) + REPOSITORY_NAME=${GITHUB_REPOSITORY#*/} + BINARY_NAME=$REPOSITORY_NAME-$GOOS-$GOARCH$GOEXT + ARTIFACT_NAME=$REPOSITORY_NAME-$GOOS-$GOARCH-$GITHUB_SHA + ARCHIVE_NAME=$ARTIFACT_NAME.zip + echo "BINARY_NAME=$BINARY_NAME" >> $GITHUB_ENV + echo "GOOS=$GOOS" >> $GITHUB_ENV + echo "GOARCH=$GOARCH" >> $GITHUB_ENV + echo "ARTIFACT_NAME=$ARTIFACT_NAME" >> $GITHUB_ENV + echo "ARCHIVE_NAME=$ARCHIVE_NAME" >> $GITHUB_ENV + + - name: Build SQL + run: | + sqlc generate + + - name: Build + run: | + go build -o "dist/$BINARY_NAME" -v + + - name: Prepare SQLite database + run: ./update_db.sh dist/server.db + + - name: Prepare dist folder + run: | + cp config.yml dist + cp LICENSE dist + cp -r updates dist + + - name: Create dist archive + run: zip -r /tmp/${{ env.ARCHIVE_NAME }} . + working-directory: dist + + - name: Archive release artifacts + uses: actions/upload-artifact@v4 + with: + name: ${{ env.ARTIFACT_NAME }} + path: /tmp/${{ env.ARCHIVE_NAME }} + + release: + needs: [build] + runs-on: ubuntu-latest + + steps: + - name: Download run artifacts + uses: actions/download-artifact@v4 + with: + path: /tmp/artifacts + + - name: Create Release + uses: softprops/action-gh-release@v2 + with: + tag_name: release-${{ github.sha }} + generate_release_notes: true + fail_on_unmatched_files: true + files: /tmp/artifacts/**/* diff --git a/.gitignore b/.gitignore index 1fe1ffa..a63ec9e 100644 --- a/.gitignore +++ b/.gitignore @@ -65,3 +65,4 @@ output temp_schema_main.sql temp.db +distextra \ No newline at end of file diff --git a/README.md b/README.md index da04f91..2690f9c 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,9 @@ Performance and security was not a focus during development so it is not recomme ## Running Modify `config.yml` as required for your setup. -Run `go run cmd/main.go` from the repository folder. +Run `go run main.go` from the repository folder to run from source code. + +Alternatively, if you are using a pre-built executable from the Releases tab, then run the eamold-(platform)-(arch) executable directly. ## Database management @@ -40,7 +42,7 @@ NOTE: Skill point-based song unlocks are saved on the player's magnetic game car ## Design -Main entry point of the server is `cmd/main.go`. All services must be registered using `manager.RegisterService()` here to be exposed through the HTTP server. +Main entry point of the server is `main.go`. All services must be registered using `manager.RegisterService()` here to be exposed through the HTTP server. The `services` folder is where the main logic for the server lives. Each service has a `service.go` file which implements the `Service` interface that allows it to be registered as a service in the service manager. Within that is the list of modules that each service actually exposes through `services.get`. There's a way to resolve common shared modules from the core service for the common things like `pcbtracker`, `posevent`, etc. Each service thne implements any additional modules within its own service folder, including any database-related schemas and queries. diff --git a/config.yml b/config.yml index 39c68d2..db112c5 100644 --- a/config.yml +++ b/config.yml @@ -1,10 +1,11 @@ server: - host: "10.1.1.24" + host: "127.0.0.1" + services_host: "10.1.1.24" # Used to make URLs for services.get endpoint port: 80 logging: True database: - driver: "sqlite3" + driver: "sqlite" datasource: "server.db" # datasource: ":memory:" # In-memory database (resets on server restart) @@ -13,8 +14,8 @@ eemall_shopserver: static: expose_folders: false # If true then the a datapath without a filelist can be exposed (not recommended but useful for testing) - folder: - - - path: "/" - filelist: "static.json" - datapath: "updates" + # folder: + # - + # path: "/" + # filelist: "static.json" + # datapath: "updates" diff --git a/go.mod b/go.mod index 68aad50..af22aca 100644 --- a/go.mod +++ b/go.mod @@ -6,19 +6,30 @@ require ( github.com/beevik/etree v1.4.0 github.com/labstack/echo/v4 v4.12.0 github.com/labstack/gommon v0.4.2 - github.com/mattn/go-sqlite3 v1.14.22 golang.org/x/text v0.14.0 gopkg.in/yaml.v3 v3.0.1 + modernc.org/sqlite v1.30.0 ) require ( + github.com/dustin/go-humanize v1.0.1 // indirect github.com/golang-jwt/jwt v3.2.2+incompatible // indirect + github.com/google/uuid v1.6.0 // indirect + github.com/hashicorp/golang-lru/v2 v2.0.7 // indirect github.com/mattn/go-colorable v0.1.13 // indirect github.com/mattn/go-isatty v0.0.20 // indirect + github.com/ncruces/go-strftime v0.1.9 // indirect + github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec // indirect github.com/valyala/bytebufferpool v1.0.0 // indirect github.com/valyala/fasttemplate v1.2.2 // indirect golang.org/x/crypto v0.22.0 // indirect golang.org/x/net v0.24.0 // indirect golang.org/x/sys v0.19.0 // indirect golang.org/x/time v0.5.0 // indirect + modernc.org/gc/v3 v3.0.0-20240107210532-573471604cb6 // indirect + modernc.org/libc v1.50.9 // indirect + modernc.org/mathutil v1.6.0 // indirect + modernc.org/memory v1.8.0 // indirect + modernc.org/strutil v1.2.0 // indirect + modernc.org/token v1.1.0 // indirect ) diff --git a/go.sum b/go.sum index d40cd09..67b5b50 100644 --- a/go.sum +++ b/go.sum @@ -2,8 +2,16 @@ github.com/beevik/etree v1.4.0 h1:oz1UedHRepuY3p4N5OjE0nK1WLCqtzHf25bxplKOHLs= github.com/beevik/etree v1.4.0/go.mod h1:cyWiXwGoasx60gHvtnEh5x8+uIjUVnjWqBvEnhnqKDA= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= +github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= github.com/golang-jwt/jwt v3.2.2+incompatible h1:IfV12K8xAKAnZqdXVzCZ+TOjboZ2keLg81eXfW3O+oY= github.com/golang-jwt/jwt v3.2.2+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I= +github.com/google/pprof v0.0.0-20240409012703-83162a5b38cd h1:gbpYu9NMq8jhDVbvlGkMFWCjLFlqqEZjEmObmhUy6Vo= +github.com/google/pprof v0.0.0-20240409012703-83162a5b38cd/go.mod h1:kf6iHlnVGwgKolg33glAes7Yg/8iWP8ukqeldJSO7jw= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/hashicorp/golang-lru/v2 v2.0.7 h1:a+bsQ5rvGLjzHuww6tVxozPZFVghXaHOwFs4luLUK2k= +github.com/hashicorp/golang-lru/v2 v2.0.7/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM= github.com/labstack/echo/v4 v4.12.0 h1:IKpw49IMryVB2p1a4dzwlhP1O2Tf2E0Ir/450lH+kI0= github.com/labstack/echo/v4 v4.12.0/go.mod h1:UP9Cr2DJXbOK3Kr9ONYzNowSh7HP0aG0ShAyycHSJvM= github.com/labstack/gommon v0.4.2 h1:F8qTUNXgG1+6WQmqoUWnz8WiEU60mXVVw0P4ht1WRA0= @@ -13,10 +21,12 @@ github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovk github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= -github.com/mattn/go-sqlite3 v1.14.22 h1:2gZY6PC6kBnID23Tichd1K+Z0oS6nE/XwU+Vz/5o4kU= -github.com/mattn/go-sqlite3 v1.14.22/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= +github.com/ncruces/go-strftime v0.1.9 h1:bY0MQC28UADQmHmaF5dgpLmImcShSi2kHU9XLdhx/f4= +github.com/ncruces/go-strftime v0.1.9/go.mod h1:Fwc5htZGVVkseilnfgOVb9mKy6w1naJmn9CehxcKcls= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec h1:W09IVJc94icq4NjY3clb7Lk8O1qJ8BdBEF8z0ibU0rE= +github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= @@ -25,6 +35,8 @@ github.com/valyala/fasttemplate v1.2.2 h1:lxLXG0uE3Qnshl9QyaK6XJxMXlQZELvChBOCmQ github.com/valyala/fasttemplate v1.2.2/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= golang.org/x/crypto v0.22.0 h1:g1v0xeRhjcugydODzvb3mEM9SQ0HGp9s/nh3COQ/C30= golang.org/x/crypto v0.22.0/go.mod h1:vr6Su+7cTlO45qkww3VDJlzDn0ctJvRgYbC2NvXHt+M= +golang.org/x/mod v0.16.0 h1:QX4fJ0Rr5cPQCF7O9lh9Se4pmwfwskqZfq5moyldzic= +golang.org/x/mod v0.16.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= golang.org/x/net v0.24.0 h1:1PcaxkF854Fu3+lvBIx5SYn9wRlBzzcnHZSiaFFAb0w= golang.org/x/net v0.24.0/go.mod h1:2Q7sJY5mzlzWjKtYUEXSlBWCdyaioyXzRB2RtU8KVE8= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -35,7 +47,35 @@ golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk= golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= +golang.org/x/tools v0.19.0 h1:tfGCXNR1OsFG+sVdLAitlpjAvD/I6dHDKnYrpEZUHkw= +golang.org/x/tools v0.19.0/go.mod h1:qoJWxmGSIBmAeriMx19ogtrEPrGtDbPK634QFIcLAhc= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +modernc.org/cc/v4 v4.21.2 h1:dycHFB/jDc3IyacKipCNSDrjIC0Lm1hyoWOZTRR20Lk= +modernc.org/cc/v4 v4.21.2/go.mod h1:HM7VJTZbUCR3rV8EYBi9wxnJ0ZBRiGE5OeGXNA0IsLQ= +modernc.org/ccgo/v4 v4.17.8 h1:yyWBf2ipA0Y9GGz/MmCmi3EFpKgeS7ICrAFes+suEbs= +modernc.org/ccgo/v4 v4.17.8/go.mod h1:buJnJ6Fn0tyAdP/dqePbrrvLyr6qslFfTbFrCuaYvtA= +modernc.org/fileutil v1.3.0 h1:gQ5SIzK3H9kdfai/5x41oQiKValumqNTDXMvKo62HvE= +modernc.org/fileutil v1.3.0/go.mod h1:XatxS8fZi3pS8/hKG2GH/ArUogfxjpEKs3Ku3aK4JyQ= +modernc.org/gc/v2 v2.4.1 h1:9cNzOqPyMJBvrUipmynX0ZohMhcxPtMccYgGOJdOiBw= +modernc.org/gc/v2 v2.4.1/go.mod h1:wzN5dK1AzVGoH6XOzc3YZ+ey/jPgYHLuVckd62P0GYU= +modernc.org/gc/v3 v3.0.0-20240107210532-573471604cb6 h1:5D53IMaUuA5InSeMu9eJtlQXS2NxAhyWQvkKEgXZhHI= +modernc.org/gc/v3 v3.0.0-20240107210532-573471604cb6/go.mod h1:Qz0X07sNOR1jWYCrJMEnbW/X55x206Q7Vt4mz6/wHp4= +modernc.org/libc v1.50.9 h1:hIWf1uz55lorXQhfoEoezdUHjxzuO6ceshET/yWjSjk= +modernc.org/libc v1.50.9/go.mod h1:15P6ublJ9FJR8YQCGy8DeQ2Uwur7iW9Hserr/T3OFZE= +modernc.org/mathutil v1.6.0 h1:fRe9+AmYlaej+64JsEEhoWuAYBkOtQiMEU7n/XgfYi4= +modernc.org/mathutil v1.6.0/go.mod h1:Ui5Q9q1TR2gFm0AQRqQUaBWFLAhQpCwNcuhBOSedWPo= +modernc.org/memory v1.8.0 h1:IqGTL6eFMaDZZhEWwcREgeMXYwmW83LYW8cROZYkg+E= +modernc.org/memory v1.8.0/go.mod h1:XPZ936zp5OMKGWPqbD3JShgd/ZoQ7899TUuQqxY+peU= +modernc.org/opt v0.1.3 h1:3XOZf2yznlhC+ibLltsDGzABUGVx8J6pnFMS3E4dcq4= +modernc.org/opt v0.1.3/go.mod h1:WdSiB5evDcignE70guQKxYUl14mgWtbClRi5wmkkTX0= +modernc.org/sortutil v1.2.0 h1:jQiD3PfS2REGJNzNCMMaLSp/wdMNieTbKX920Cqdgqc= +modernc.org/sortutil v1.2.0/go.mod h1:TKU2s7kJMf1AE84OoiGppNHJwvB753OYfNl2WRb++Ss= +modernc.org/sqlite v1.30.0 h1:8YhPUs/HTnlEgErn/jSYQTwHN/ex8CjHHjg+K9iG7LM= +modernc.org/sqlite v1.30.0/go.mod h1:cgkTARJ9ugeXSNaLBPK3CqbOe7Ec7ZhWPoMFGldEYEw= +modernc.org/strutil v1.2.0 h1:agBi9dp1I+eOnxXeiZawM8F4LawKv4NzGWSaLfyeNZA= +modernc.org/strutil v1.2.0/go.mod h1:/mdcBmfOibveCTBxUl5B5l6W+TTH1FXPLHZE6bTosX0= +modernc.org/token v1.1.0 h1:Xl7Ap9dKaEs5kLoOQeQmPWevfnk/DM5qcLcYlA8ys6Y= +modernc.org/token v1.1.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM= diff --git a/internal/config/config.go b/internal/config/config.go index 40d6513..12b8c53 100644 --- a/internal/config/config.go +++ b/internal/config/config.go @@ -10,9 +10,12 @@ import ( type Config struct { Server struct { - Host string `yaml:"host"` - Port int `yaml:"port"` - Logging bool `yaml:"logging"` + Host string `yaml:"host"` + Port int `yaml:"port"` + + ServicesUrl string `yaml:"services_url"` + + Logging bool `yaml:"logging"` } `yaml:"server"` Database struct { @@ -36,7 +39,7 @@ type Config struct { } func (c *Config) MakeUrl(path string) string { - u, err := url.JoinPath(fmt.Sprintf("http://%s", c.Server.Host), path) + u, err := url.JoinPath(fmt.Sprintf("http://%s", c.Server.ServicesUrl), path) if err != nil { return path diff --git a/cmd/main.go b/main.go similarity index 92% rename from cmd/main.go rename to main.go index d63b6cf..cd99b4e 100644 --- a/cmd/main.go +++ b/main.go @@ -14,7 +14,7 @@ import ( "path" "time" - _ "github.com/mattn/go-sqlite3" + _ "modernc.org/sqlite" "github.com/labstack/echo/v4" "github.com/labstack/echo/v4/middleware" @@ -81,7 +81,8 @@ func main() { if folder.FileList != nil { jsonFile, err := os.Open(*folder.FileList) if err != nil { - panic(err) + log.Printf("Could not open file list: %v", err) + continue } jsonBytes, err := io.ReadAll(jsonFile) @@ -127,8 +128,8 @@ func main() { defer stop() // Start server go func() { - if err := e.Start(fmt.Sprintf(":%d", config.Server.Port)); err != nil && err != http.ErrServerClosed { - e.Logger.Fatal("shutting down the server") + if err := e.Start(fmt.Sprintf("%s:%d", config.Server.Host, config.Server.Port)); err != nil && err != http.ErrServerClosed { + e.Logger.Fatal(fmt.Errorf("shutting down the server: %v", err)) } }() diff --git a/services/gfdm_common/constants/card_status.go b/services/gfdm_common/constants/card_status.go new file mode 100644 index 0000000..c863451 --- /dev/null +++ b/services/gfdm_common/constants/card_status.go @@ -0,0 +1,12 @@ +package constants + +type CardStatus int + +const ( + CardStatusError CardStatus = iota + CardStatusNew + CardStatusSuccess + CardStatusExpired + CardStatusMaintenance + CardStatusEndOfLife +)