diff --git a/README.md b/README.md index a5545d9aeb26ec75535a87f84c19b726878ca836..de9d6d9d9b0dab5ce4b9499458b09d2e6b430aa7 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ # Add Campaign -curl -H "Content-Type: application/json" -d '{"name":"Covid","organizerName":"Martin","donationMinimum":2,"targetAmount":100,"account":{"name":"Martin","bankName":"DKB","number":"123456"}}' localhost:8000/campaign +curl -H "Content-Type: application/json" -d '{"name":"Covid","organizerName":"Martin","donationMinimum":2,"targetAmount":100,"account":{"name":"Martin","bankName":"DKB","number":"123456"}}' localhost:8000/campaigns # Get (all) campaigns @@ -15,4 +15,4 @@ curl -X DELETE localhost:8000/campaigns/1 curl -X PUT -H "Content-Type: application/json" -d '{"name":"new Name","organizerName":"Thomas","donationMinimum":2,"targetAmount":100,"account":{"name":"Martin","bankName":"DKB","number":"123456"}}' localhost:8000/campaigns/1 # AddDonation -curl -H "Content-Type: application/json" -d '{"CampaignID":1,"amount":12.23,"DonorName":"Stefan","ReceiptRequested":false,"Status":"TRANSFERRED"}' \ No newline at end of file +curl -H "Content-Type: application/json" -d '{"CampaignID":1,"amount":12.23,"DonorName":"Stefan","ReceiptRequested":false,"Status":"TRANSFERRED"}' localhost:8000/campaigns/1/donation \ No newline at end of file diff --git a/go.work b/go.work new file mode 100644 index 0000000000000000000000000000000000000000..b8c8690d95eb733e44c62cb0ee1c9adc2346cf24 --- /dev/null +++ b/go.work @@ -0,0 +1,3 @@ +go 1.20 + +use ./src/myaktion \ No newline at end of file diff --git a/scripts/start-mariadb.sh b/scripts/start-mariadb.sh new file mode 100644 index 0000000000000000000000000000000000000000..04ad7c12bc65846ebed508eadaedf817ae9226ab --- /dev/null +++ b/scripts/start-mariadb.sh @@ -0,0 +1,2 @@ +#!/usr/bin/env bash +docker run -d -p 3306:3306 --name database -e MYSQL_ROOT_PASSWORD=root -e MYSQL_DATABASE=myaktion mariadb:10.5 \ No newline at end of file diff --git a/scripts/stop-mariadb.sh b/scripts/stop-mariadb.sh new file mode 100644 index 0000000000000000000000000000000000000000..da085ee5c924515aa600dec763a0b0e1b2d3341c --- /dev/null +++ b/scripts/stop-mariadb.sh @@ -0,0 +1,2 @@ +#!/usr/bin/env bash +docker kill database && docker rm database \ No newline at end of file diff --git a/src/myaktion/Dockerfile b/src/myaktion/Dockerfile index 4a881c7c8177a90b4a5ea67482c9928e502407fa..d8022da86249db01e38769a8580b650fc25de8f5 100644 --- a/src/myaktion/Dockerfile +++ b/src/myaktion/Dockerfile @@ -6,4 +6,4 @@ RUN go install RUN chmod +x ./wait-for-it.sh ./docker-entrypoint.sh ENTRYPOINT ["./docker-entrypoint.sh"] CMD ["myaktion"] -EXPOSE 8000 \ No newline at end of file +EXPOSE 8000 diff --git a/src/myaktion/db/db.go b/src/myaktion/db/db.go index df53923affbf82a9f6fd2338a160a9ad9c1bf8a2..53f7729356f125f2e0452052f43196a307314820 100644 --- a/src/myaktion/db/db.go +++ b/src/myaktion/db/db.go @@ -1,34 +1,42 @@ package db import ( + "errors" "fmt" "os" log "github.com/sirupsen/logrus" - "gitlab.reutlingen-university.de/albrecht/myaktion-go/src/myaktion/model" + "gitlab.reutlingen-university.de/albrecht/myaktion2/src/myaktion/model" "gorm.io/driver/mysql" "gorm.io/gorm" ) var DB *gorm.DB -func init() { - dsn := fmt.Sprintf("root:root@tcp(%s)/myaktion?charset=utf8&parseTime=True&loc=Local", os.Getenv("DB_CONNECT")) - log.Info("UsingDSN forDB:", dsn) +func Init() { + err := Connect(os.Getenv("DB_CONNECT")) + if err != nil { + panic(err) + } +} + +func Connect(connect string) error { + // init DB var err error + dsn := fmt.Sprintf("root:root@tcp(%s)/myaktion?charset=utf8&parseTime=True&loc=Local", connect) + log.Info("Using DSN for DB:", dsn) DB, err = gorm.Open(mysql.Open(dsn), &gorm.Config{}) - if err != nil { - panic("Connection to Database failed") + return errors.New("failed to connect to database") } - - log.Info("Starting migrations") + log.Info("Starting automatic migrations") if err := DB.Debug().AutoMigrate(&model.Campaign{}); err != nil { - panic(err) + return err } if err := DB.Debug().AutoMigrate(&model.Donation{}); err != nil { - panic(err) + return err } - log.Info("Migration finished") + log.Info("Automatic migrations finished") + return nil } diff --git a/src/myaktion/db/setuptest.go b/src/myaktion/db/setuptest.go new file mode 100644 index 0000000000000000000000000000000000000000..df4ee06aa39bca011001b2924948ca6a8488682c --- /dev/null +++ b/src/myaktion/db/setuptest.go @@ -0,0 +1,46 @@ +package db + +import ( + "testing" + + "github.com/ory/dockertest/v3" + "github.com/ory/dockertest/v3/docker" +) + +func SetupTestDB(t *testing.T) func() { + pool, err := dockertest.NewPool("") + if err != nil { + t.Fatalf("Could not connect to docker: %s", err) + } + + runDockerOpt := &dockertest.RunOptions{ + Repository: "mariadb", + Tag: "10.5", + Env: []string{"MYSQL_ROOT_PASSWORD=root", "MYSQL_DATABASE=myaktion"}, + PortBindings: map[docker.Port][]docker.PortBinding{ + "3306/tcp": {{HostIP: "localhost", HostPort: "3306/tcp"}}, + }, + } + + fnConfig := func(config *docker.HostConfig) { + config.AutoRemove = true // set AutoRemove to true so that stopped container goes away by itself + config.RestartPolicy = docker.NeverRestart() // don't restart container + } + + resource, err := pool.RunWithOptions(runDockerOpt, fnConfig) + if err != nil { + t.Fatalf("Could not start test DB: %s", err) + } + + // retry until db server is ready + err = pool.Retry(func() error { + return Connect("localhost:3306") + }) + if err != nil { + t.Fatalf("Could not connect to test DB: %s", err) + } + + return func() { + resource.Close() + } +} diff --git a/src/myaktion/docker-entrypoint.sh b/src/myaktion/docker-entrypoint.sh index ddca64b3c408a7b62612b505797dcdcefe397995..4fcb749ffa0bddfcb9c1ef607320164660dc1f26 100644 --- a/src/myaktion/docker-entrypoint.sh +++ b/src/myaktion/docker-entrypoint.sh @@ -5,8 +5,8 @@ set -e # Wait for DB if [ -n "$DB_CONNECT" ]; then - /go/src/app/wait-for-it.sh "$DB_CONNECT" -t 40 + /go/src/app/wait-for-it.sh "$DB_CONNECT" -t 40 fi # Run the main container command. -exec "$@" +exec "$@" \ No newline at end of file diff --git a/src/myaktion/go.mod b/src/myaktion/go.mod index f4e5cb0df0da3b6a2ce5fe306eb7ecd9f9d19044..8bbd03b05efd64a98d82d2b8cac59c321fe239db 100644 --- a/src/myaktion/go.mod +++ b/src/myaktion/go.mod @@ -1,17 +1,42 @@ -module gitlab.reutlingen-university.de/albrecht/myaktion-go/src/myaktion +module gitlab.reutlingen-university.de/albrecht/myaktion2/src/myaktion go 1.20 require ( github.com/gorilla/mux v1.8.0 - github.com/sirupsen/logrus v1.9.0 - gorm.io/driver/mysql v1.5.0 + github.com/ory/dockertest/v3 v3.10.0 + github.com/sirupsen/logrus v1.9.2 + gorm.io/driver/mysql v1.5.1 gorm.io/gorm v1.25.1 ) require ( + github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78 // indirect + github.com/Microsoft/go-winio v0.6.0 // indirect + github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5 // indirect + github.com/cenkalti/backoff/v4 v4.1.3 // indirect + github.com/containerd/continuity v0.3.0 // indirect + github.com/docker/cli v20.10.17+incompatible // indirect + github.com/docker/docker v20.10.7+incompatible // indirect + github.com/docker/go-connections v0.4.0 // indirect + github.com/docker/go-units v0.4.0 // indirect github.com/go-sql-driver/mysql v1.7.1 // indirect + github.com/gogo/protobuf v1.3.2 // indirect + github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 // indirect + github.com/imdario/mergo v0.3.12 // indirect github.com/jinzhu/inflection v1.0.0 // indirect github.com/jinzhu/now v1.1.5 // indirect - golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8 // indirect + github.com/mitchellh/mapstructure v1.4.1 // indirect + github.com/moby/term v0.0.0-20201216013528-df9cb8a40635 // indirect + github.com/opencontainers/go-digest v1.0.0 // indirect + github.com/opencontainers/image-spec v1.0.2 // indirect + github.com/opencontainers/runc v1.1.5 // indirect + github.com/pkg/errors v0.9.1 // indirect + github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f // indirect + github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 // indirect + github.com/xeipuuv/gojsonschema v1.2.0 // indirect + golang.org/x/mod v0.9.0 // indirect + golang.org/x/sys v0.7.0 // indirect + golang.org/x/tools v0.7.0 // indirect + gopkg.in/yaml.v2 v2.3.0 // indirect ) diff --git a/src/myaktion/go.sum b/src/myaktion/go.sum index 0a1684a5e2d71694c2e2900e196a03e64b69a5cb..c0123193f8b6f749f856777a3ad3dfc244771bee 100644 --- a/src/myaktion/go.sum +++ b/src/myaktion/go.sum @@ -1,29 +1,167 @@ +github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78 h1:w+iIsaOQNcT7OZ575w+acHgRric5iCyQh+xv+KJ4HB8= +github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8= +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/Microsoft/go-winio v0.6.0 h1:slsWYD/zyx7lCXoZVlvQrj0hPTM1HI4+v1sIda2yDvg= +github.com/Microsoft/go-winio v0.6.0/go.mod h1:cTAf44im0RAYeL23bpB+fzCyDH2MJiz2BO69KH/soAE= +github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5 h1:TngWCqHvy9oXAN6lEVMRuU21PR1EtLVZJmdB18Gu3Rw= +github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5/go.mod h1:lmUJ/7eu/Q8D7ML55dXQrVaamCz2vxCfdQBasLZfHKk= +github.com/cenkalti/backoff/v4 v4.1.3 h1:cFAlzYUlVYDysBEH2T5hyJZMh3+5+WCBvSnK6Q8UtC4= +github.com/cenkalti/backoff/v4 v4.1.3/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= +github.com/checkpoint-restore/go-criu/v5 v5.3.0/go.mod h1:E/eQpaFtUKGOOSEBZgmKAcn+zUUwWxqcaKZlF54wK8E= +github.com/cilium/ebpf v0.7.0/go.mod h1:/oI2+1shJiTGAMgl6/RgJr36Eo1jzrRcAWbcXO2usCA= +github.com/containerd/console v1.0.3/go.mod h1:7LqA/THxQ86k76b8c/EMSiaJ3h1eZkMkXar0TQ1gf3U= +github.com/containerd/continuity v0.3.0 h1:nisirsYROK15TAMVukJOUyGJjz4BNQJBVsNvAXZJ/eg= +github.com/containerd/continuity v0.3.0/go.mod h1:wJEAIwKOm/pBZuBd0JmeTvnLquTB1Ag8espWhkykbPM= +github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= +github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= +github.com/creack/pty v1.1.11 h1:07n33Z8lZxZ2qwegKbObQohDhXDQxiMMz1NOUGYlesw= +github.com/creack/pty v1.1.11/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= +github.com/cyphar/filepath-securejoin v0.2.3/go.mod h1:aPGpWjXOXUn2NCNjFvBE6aRxGGx79pTxQpKOJNYHHl4= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= 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/docker/cli v20.10.17+incompatible h1:eO2KS7ZFeov5UJeaDmIs1NFEDRf32PaqRpvoEkKBy5M= +github.com/docker/cli v20.10.17+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= +github.com/docker/docker v20.10.7+incompatible h1:Z6O9Nhsjv+ayUEeI1IojKbYcsGdgYSNqxe1s2MYzUhQ= +github.com/docker/docker v20.10.7+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKohAFqRJQ= +github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= +github.com/docker/go-units v0.4.0 h1:3uh0PgVws3nIA0Q+MwDC8yjEPf9zjRfZZWXZYDct3Tw= +github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= +github.com/frankban/quicktest v1.11.3/go.mod h1:wRf/ReqHper53s+kmmSZizM8NamnL3IM0I9ntUbOk+k= github.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI= github.com/go-sql-driver/mysql v1.7.1 h1:lUIinVbN1DY0xBg0eMOzmmtGoHwWBbvnWubQUrtU8EI= github.com/go-sql-driver/mysql v1.7.1/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI= +github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= +github.com/godbus/dbus/v5 v5.0.6/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= +github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= +github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= +github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.5 h1:Khx7svrCpmxxtHBq5j2mp/xVjsi8hQMfNLvJFAlrGgU= +github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 h1:El6M4kTTCOh6aBiKaUGG7oYTSPP8MxqL4YI3kZKwcP4= +github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ= github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI= github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= +github.com/imdario/mergo v0.3.12 h1:b6R2BslTbIEToALKP7LxUvijTsNI9TAe80pLWN2g/HU= +github.com/imdario/mergo v0.3.12/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E= github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc= github.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ= github.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= +github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/lib/pq v0.0.0-20180327071824-d34b9ff171c2 h1:hRGSmZu7j271trc9sneMrpOW7GN5ngLm8YUZIPzf394= +github.com/mitchellh/mapstructure v1.4.1 h1:CpVNEelQCZBooIPDn+AR3NpivK/TIKU8bDxdASFVQag= +github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/moby/sys/mountinfo v0.5.0/go.mod h1:3bMD3Rg+zkqx8MRYPi7Pyb0Ie97QEBmdxbhnCLlSvSU= +github.com/moby/term v0.0.0-20201216013528-df9cb8a40635 h1:rzf0wL0CHVc8CEsgyygG0Mn9CNCCPZqOPaz8RiiHYQk= +github.com/moby/term v0.0.0-20201216013528-df9cb8a40635/go.mod h1:FBS0z0QWA44HXygs7VXDUOGoN/1TV3RuWkLO04am3wc= +github.com/mrunalp/fileutils v0.5.0/go.mod h1:M1WthSahJixYnrXQl/DFQuteStB1weuxD2QJNHXfbSQ= +github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= +github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= +github.com/opencontainers/image-spec v1.0.2 h1:9yCKha/T5XdGtO0q9Q9a6T5NUCsTn/DrBg0D7ufOcFM= +github.com/opencontainers/image-spec v1.0.2/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= +github.com/opencontainers/runc v1.1.5 h1:L44KXEpKmfWDcS02aeGm8QNTFXTo2D+8MYGDIJ/GDEs= +github.com/opencontainers/runc v1.1.5/go.mod h1:1J5XiS+vdZ3wCyZybsuxXZWGrgSr8fFJHLXuG2PsnNg= +github.com/opencontainers/runtime-spec v1.0.3-0.20210326190908-1c3f411f0417/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= +github.com/opencontainers/selinux v1.10.0/go.mod h1:2i0OySw99QjzBBQByd1Gr9gSjvuho1lHsJxIJ3gGbJI= +github.com/ory/dockertest/v3 v3.10.0 h1:4K3z2VMe8Woe++invjaTB7VRyQXQy5UY+loujO4aNE4= +github.com/ory/dockertest/v3 v3.10.0/go.mod h1:nr57ZbRWMqfsdGdFNLHz5jjNdDb7VVFnzAeW1n5N1Lg= +github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= 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/sirupsen/logrus v1.9.0 h1:trlNQbNUG3OdDrDil03MCb1H2o9nJ1x4/5LYw7byDE0= -github.com/sirupsen/logrus v1.9.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= +github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/seccomp/libseccomp-golang v0.9.2-0.20220502022130-f33da4d89646/go.mod h1:JA8cRccbGaA1s33RQf7Y1+q9gHmZX1yB/z9WDN1C6fg= +github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= +github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +github.com/sirupsen/logrus v1.9.2 h1:oxx1eChJGI6Uks2ZC4W1zpLlVgqB8ner4EuQwV4Ik1Y= +github.com/sirupsen/logrus v1.9.2/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= +github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8 h1:0A+M6Uqn+Eje4kHMK80dtF3JCXC4ykBgQG4Fe06QRhQ= +github.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk= +github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= +github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= +github.com/vishvananda/netlink v1.1.0/go.mod h1:cTgwzPIzzgDAYoQrMm0EdrjRUBkTqKYppBueQtXaqoE= +github.com/vishvananda/netns v0.0.0-20191106174202-0a2b9b5464df/go.mod h1:JP3t17pCcGlemwknint6hfoeCVQrEMVwxRLRjXpq+BU= +github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f h1:J9EGpcZtP0E/raorCMxlFGSTBrsSlaDGf3jU/qvAE2c= +github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= +github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 h1:EzJWgHovont7NscjpAxXsDA8S8BMYve8Y5+7cuRE7R0= +github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= +github.com/xeipuuv/gojsonschema v1.2.0 h1:LhYJRs+L4fBtjZUfuSZIKGeVu0QRy8e5Xi7D17UxZ74= +github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.9.0 h1:KENHtAZL2y3NLMYZeHY9DW8HW8V+kQyJsY/V9JlKvCs= +golang.org/x/mod v0.9.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.1.0 h1:wsuoTGHzEhffawBOhz5CYhcrV4IdKZbEyZjBMuTp12o= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190606203320-7fc4e5ec1444/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191115151921-52ab43148777/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200831180312-196b9ba8737a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210906170528-6f6e22806c34/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211025201205-69cdffdb9359/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211116061358-0a5406a5449c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.7.0 h1:3jlCCIQZPdOYu1h8BkNvLz8Kgwtae2cagcG/VamtZRU= +golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190624222133-a101b041ded4/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.7.0 h1:W4OVu8VVOaIO0yzWMNdepAulS7YfoS3Zabrm8DOXXU4= +golang.org/x/tools v0.7.0/go.mod h1:4pg6aUX35JBAogB10C9AtvVL+qowtN4pT3CGSQex14s= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= +google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +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.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.3.0 h1:clyUAQHOM3G0M3f5vQj7LuJrETvjVot3Z5el9nffUtU= +gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gorm.io/driver/mysql v1.5.0 h1:6hSAT5QcyIaty0jfnff0z0CLDjyRgZ8mlMHLqSt7uXM= -gorm.io/driver/mysql v1.5.0/go.mod h1:FFla/fJuCvyTi7rJQd27qlNX2v3L6deTR1GgTjSOLPo= -gorm.io/gorm v1.24.7-0.20230306060331-85eaf9eeda11/go.mod h1:L4uxeKpfBml98NYqVqwAdmV1a2nBtAec/cf3fpucW/k= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gorm.io/driver/mysql v1.5.1 h1:WUEH5VF9obL/lTtzjmML/5e6VfFR/788coz2uaVCAZw= +gorm.io/driver/mysql v1.5.1/go.mod h1:Jo3Xu7mMhCyj8dlrb3WoCaRd1FhsVh+yMXb1jUInf5o= gorm.io/gorm v1.25.1 h1:nsSALe5Pr+cM3V1qwwQ7rOkw+6UeLrX5O4v3llhHa64= gorm.io/gorm v1.25.1/go.mod h1:L4uxeKpfBml98NYqVqwAdmV1a2nBtAec/cf3fpucW/k= +gotest.tools/v3 v3.0.2/go.mod h1:3SzNCllyD9/Y+b5r9JIKQ474KzkZyqLqEfYqMsX94Bk= +gotest.tools/v3 v3.3.0 h1:MfDY1b1/0xN1CyMlQDac0ziEy9zJQd9CXBRRDHw2jJo= diff --git a/src/myaktion/handler/campaign.go b/src/myaktion/handler/campaign.go index 936d94963f2ae0d4ac998a858d3948fe11c39f8e..ceae604ecbc24d85d8ae0db1cb2b710a9472f665 100644 --- a/src/myaktion/handler/campaign.go +++ b/src/myaktion/handler/campaign.go @@ -6,8 +6,8 @@ import ( log "github.com/sirupsen/logrus" - "gitlab.reutlingen-university.de/albrecht/myaktion-go/src/myaktion/model" - "gitlab.reutlingen-university.de/albrecht/myaktion-go/src/myaktion/service" + "gitlab.reutlingen-university.de/albrecht/myaktion2/src/myaktion/model" + "gitlab.reutlingen-university.de/albrecht/myaktion2/src/myaktion/service" ) func CreateCampaign(w http.ResponseWriter, r *http.Request) { diff --git a/src/myaktion/handler/campaign_test.go b/src/myaktion/handler/campaign_test.go new file mode 100644 index 0000000000000000000000000000000000000000..cedd7ee44c20fa81fbe8b7262e6bf1cb44e879c2 --- /dev/null +++ b/src/myaktion/handler/campaign_test.go @@ -0,0 +1,52 @@ +package handler_test + +import ( + "bytes" + "encoding/json" + "net/http" + "net/http/httptest" + "testing" + + "gitlab.reutlingen-university.de/albrecht/myaktion2/src/myaktion/db" + "gitlab.reutlingen-university.de/albrecht/myaktion2/src/myaktion/handler" + "gitlab.reutlingen-university.de/albrecht/myaktion2/src/myaktion/model" +) + +func TestCreateCampaignBadRequest(t *testing.T) { + rr := httptest.NewRecorder() + //No campaign in the body of the request -> nil + req := httptest.NewRequest(http.MethodPost, "/campaigns", nil) + handler := http.HandlerFunc(handler.CreateCampaign) + handler.ServeHTTP(rr, req) + + if status := rr.Code; status != http.StatusBadRequest { + t.Errorf("handler did not recognize bad request") + } +} + +func TestCreateCampaign(t *testing.T) { + cleanUpDB := db.SetupTestDB(t) + defer cleanUpDB() + rr := httptest.NewRecorder() + jsonData := `{"name":"Covid","organizerName":"Martin","donationMinimum":2,"targetAmount":100,"account":{"name":"Martin","bankName":"DKB","number":"123456"}}` + req := httptest.NewRequest(http.MethodPost, "/dummy-url", bytes.NewBufferString(jsonData)) + req.Header.Set("Content-Type", "application/json") + + handler := http.HandlerFunc(handler.CreateCampaign) + handler.ServeHTTP(rr, req) + + if status := rr.Code; status != http.StatusOK { + t.Errorf("handler returned wrong status code: got %v want %v", status, http.StatusOK) + return + } + + var campaign model.Campaign + err := json.NewDecoder(rr.Body).Decode(&campaign) + if err != nil { + t.Errorf("handler returned unexpected response: %v", err) + return + } + if campaign.ID != 1 { + t.Errorf("handler returned unexpected ID: got %v want %v", campaign.ID, 1) + } +} diff --git a/src/myaktion/handler/donation.go b/src/myaktion/handler/donation.go index b7c4a6faa60f007690f52b627335b99a7a9acc57..4a2604d97e7caf3d53ad6d8ebf703dc0d9441ba5 100644 --- a/src/myaktion/handler/donation.go +++ b/src/myaktion/handler/donation.go @@ -6,8 +6,8 @@ import ( log "github.com/sirupsen/logrus" - "gitlab.reutlingen-university.de/albrecht/myaktion-go/src/myaktion/model" - "gitlab.reutlingen-university.de/albrecht/myaktion-go/src/myaktion/service" + "gitlab.reutlingen-university.de/albrecht/myaktion2/src/myaktion/model" + "gitlab.reutlingen-university.de/albrecht/myaktion2/src/myaktion/service" ) func AddDonation(w http.ResponseWriter, r *http.Request) { diff --git a/src/myaktion/handler/health_test.go b/src/myaktion/handler/health_test.go new file mode 100644 index 0000000000000000000000000000000000000000..11c3d31ab97ef677353e14a2f3c310e365ca6b4f --- /dev/null +++ b/src/myaktion/handler/health_test.go @@ -0,0 +1,23 @@ +package handler + +import ( + "net/http" + "net/http/httptest" + "testing" +) + +func TestHealth(t *testing.T) { + rr := httptest.NewRecorder() + req := httptest.NewRequest("GET", "/health", nil) + handler := http.HandlerFunc(Health) + handler.ServeHTTP(rr, req) + + if status := rr.Code; status != http.StatusOK { + t.Errorf("handler returned wrong status code: got %v wand %v", status, http.StatusOK) + } + + expected := `{"alive": true}` + if rr.Body.String() != expected { + t.Errorf("handler returned unexpected body: got %v want %v", rr.Body.String(), expected) + } +} diff --git a/src/myaktion/main.go b/src/myaktion/main.go index d134b2b81a47e18a46fd18048b839053afddd00b..fae02b76984c789801290fb9b17bc300e375f315 100644 --- a/src/myaktion/main.go +++ b/src/myaktion/main.go @@ -4,16 +4,14 @@ import ( "net/http" "os" - log "github.com/sirupsen/logrus" - "github.com/gorilla/mux" - "gitlab.reutlingen-university.de/albrecht/myaktion-go/src/myaktion/handler" + log "github.com/sirupsen/logrus" + "gitlab.reutlingen-university.de/albrecht/myaktion2/src/myaktion/db" + "gitlab.reutlingen-university.de/albrecht/myaktion2/src/myaktion/handler" ) -//"gitlab.reutlingen-university.de/albrecht/myaktion-go/src/myaktion/model" - func init() { - // init logger + defer db.Init() log.SetFormatter(&log.TextFormatter{}) log.SetReportCaller(true) level, err := log.ParseLevel(os.Getenv("LOG_LEVEL")) @@ -28,13 +26,15 @@ func init() { func main() { log.Println("Starting My-Aktion API server") router := mux.NewRouter() + router.HandleFunc("/health", handler.Health).Methods("GET") - router.HandleFunc("/campaign", handler.CreateCampaign).Methods("POST") + router.HandleFunc("/campaigns", handler.CreateCampaign).Methods("POST") router.HandleFunc("/campaigns", handler.GetCampaigns).Methods("GET") router.HandleFunc("/campaigns/{id}", handler.GetCampaign).Methods("GET") - router.HandleFunc("/campaigns/{id}", handler.DeleteCampaign).Methods("DELETE") router.HandleFunc("/campaigns/{id}", handler.UpdateCampaign).Methods("PUT") + router.HandleFunc("/campaigns/{id}", handler.DeleteCampaign).Methods("DELETE") router.HandleFunc("/campaigns/{id}/donation", handler.AddDonation).Methods("POST") + if err := http.ListenAndServe(":8000", router); err != nil { log.Fatal(err) } diff --git a/src/myaktion/model/account.go b/src/myaktion/model/account.go index 07aa05eabb042731b63e56a86ac6b3725dd88a57..9d02bf4bf7c1b2d55394ea88d7545571e8435ace 100644 --- a/src/myaktion/model/account.go +++ b/src/myaktion/model/account.go @@ -1,7 +1,7 @@ package model type Account struct { - Name string `gorm:"notNull:seize:40"` - BankName string `gorm:"notNull:seize:20"` - Number string `gorm:"notNull:seize:10"` + Name string `gorm:"notNull;size:60"` + BankName string `gorm:"notNull;size:60"` + Number string `gorm:"notNull;size:60"` } diff --git a/src/myaktion/model/campaign.go b/src/myaktion/model/campaign.go index 7ddacc0528e872df7b635ad0663a804756bb51a4..d6a4cb707173197d60741497dc7d53da1fadc4f7 100644 --- a/src/myaktion/model/campaign.go +++ b/src/myaktion/model/campaign.go @@ -6,11 +6,19 @@ type Campaign struct { gorm.Model Name string `gorm:"notNull;size:30"` OrganizerName string `gorm:"notNull"` - TargetAmount float64 `gorm:"notNull;check:target_amount>= 10.0"` - DonationMinimum float64 `gorm:"notNull;check:donation_minimum>= 1.0"` - Donations []Donation `gorm:"foreignKey:CampaignID;constraint:OnUpdate:CASCADE,OnDelete:CASCADE"` + TargetAmount float64 `gorm:"notNull;check:target_amount >= 10.0"` + DonationMinimum float64 `gorm:"notNull;check:target_amount >= 1.0"` AmountDonatedSoFar float64 `gorm:"-"` + Donations []Donation `gorm:"foreignKey:CampaignID;constraint:OnUpdate:CASCADE,OnDelete:CASCADE"` Account Account `gorm:"embedded;embeddedPrefix:account_"` } -//func (c *Campaign) AfterFind(tx *gorm.DB) +func (c *Campaign) AfterFind(tx *gorm.DB) (err error) { + var sum float64 + result := tx.Model(&Donation{}).Select("ifnull(sum(amount),0)").Where("campaign_id = ?", c.ID).Scan(&sum) + if result.Error != nil { + return result.Error + } + c.AmountDonatedSoFar = sum + return nil +} diff --git a/src/myaktion/model/donation.go b/src/myaktion/model/donation.go index 52d4922e0c965788297da2aa884e5c866b6709b5..fca92ae133d203f0ffaeefb850cab7a33ea3325f 100644 --- a/src/myaktion/model/donation.go +++ b/src/myaktion/model/donation.go @@ -15,6 +15,6 @@ type Donation struct { type Status string const ( - Transferred Status = "TRANSFERRED" - In_Process Status = "IN_PROCESS" + TRANSFERRED Status = "TRANSFERRED" + IN_PROCESS Status = "IN_PROCESS" ) diff --git a/src/myaktion/service/campaign.go b/src/myaktion/service/campaign.go index 58234e3117333060ac34bdc1d5a3b94c23789316..9c6ee0ddcdd2ca80567a3451e6b22efff598c7b7 100644 --- a/src/myaktion/service/campaign.go +++ b/src/myaktion/service/campaign.go @@ -1,10 +1,13 @@ package service import ( + "errors" + log "github.com/sirupsen/logrus" + "gorm.io/gorm" - "gitlab.reutlingen-university.de/albrecht/myaktion-go/src/myaktion/db" - "gitlab.reutlingen-university.de/albrecht/myaktion-go/src/myaktion/model" + "gitlab.reutlingen-university.de/albrecht/myaktion2/src/myaktion/db" + "gitlab.reutlingen-university.de/albrecht/myaktion2/src/myaktion/model" ) func CreateCampaign(campaign *model.Campaign) error { @@ -12,8 +15,8 @@ func CreateCampaign(campaign *model.Campaign) error { if result.Error != nil { return result.Error } - log.Printf("Successfully stored new campaign with ID %v in database.", campaign.ID) - log.Printf("Stored: %v", campaign) + log.Infof("Successfully stored new campaign with ID %v in database.", campaign.ID) + log.Tracef("Stored: %v", campaign) return nil } @@ -23,44 +26,52 @@ func GetCampaigns() ([]model.Campaign, error) { if result.Error != nil { return nil, result.Error } - - log.Tracef("Retrieved: %v Campaigns", campaigns) + log.Tracef("Retrieved: %v", campaigns) return campaigns, nil } func GetCampaign(id uint) (*model.Campaign, error) { - var campaign model.Campaign - result := db.DB.Preload("Donations").First(&campaign, id) + campaign := new(model.Campaign) + result := db.DB.Preload("Donations").First(campaign, id) + if errors.Is(result.Error, gorm.ErrRecordNotFound) { + return nil, nil + } if result.Error != nil { return nil, result.Error } log.Tracef("Retrieved: %v", campaign) - return &campaign, nil + return campaign, nil } func UpdateCampaign(id uint, campaign *model.Campaign) (*model.Campaign, error) { existingCampaign, err := GetCampaign(id) - if err != nil { + if existingCampaign == nil || err != nil { return existingCampaign, err } existingCampaign.Name = campaign.Name existingCampaign.OrganizerName = campaign.OrganizerName existingCampaign.TargetAmount = campaign.TargetAmount existingCampaign.DonationMinimum = campaign.DonationMinimum - db.DB.Save(&existingCampaign) + existingCampaign.Account = campaign.Account + result := db.DB.Save(existingCampaign) + if result.Error != nil { + return nil, result.Error + } entry := log.WithField("ID", id) entry.Info("Successfully updated campaign.") - entry.Tracef("Updated: %v", campaign) + entry.Tracef("Updated: %v", existingCampaign) return existingCampaign, nil } func DeleteCampaign(id uint) (*model.Campaign, error) { campaign, err := GetCampaign(id) - if err != nil { + if campaign == nil || err != nil { return campaign, err } - db.DB.Delete(&campaign, id) - + result := db.DB.Delete(campaign) + if result.Error != nil { + return nil, result.Error + } entry := log.WithField("ID", id) entry.Info("Successfully deleted campaign.") entry.Tracef("Deleted: %v", campaign) diff --git a/src/myaktion/service/donation.go b/src/myaktion/service/donation.go index 1bcbfee486ad145d264cb794188220fb56c7ceca..7cac10f3853dfcac375727178398e5429f99869c 100644 --- a/src/myaktion/service/donation.go +++ b/src/myaktion/service/donation.go @@ -3,19 +3,18 @@ package service import ( log "github.com/sirupsen/logrus" - "gitlab.reutlingen-university.de/albrecht/myaktion-go/src/myaktion/db" - "gitlab.reutlingen-university.de/albrecht/myaktion-go/src/myaktion/model" + "gitlab.reutlingen-university.de/albrecht/myaktion2/src/myaktion/db" + "gitlab.reutlingen-university.de/albrecht/myaktion2/src/myaktion/model" ) func AddDonation(campaignId uint, donation *model.Donation) error { - campaign, err := GetCampaign(campaignId) - if err != nil { - return err + donation.CampaignID = campaignId + result := db.DB.Create(donation) + if result.Error != nil { + return result.Error } - campaign.Donations = append(campaign.Donations, *donation) - db.DB.Save(&campaign) entry := log.WithField("ID", campaignId) - entry.Info("Successfully added new donation to campaign.") + entry.Info("Successfully added new donation to campaign in database.") entry.Tracef("Stored: %v", donation) return nil }