diff --git a/go.mod b/go.mod index 0003a829ea2b9b6f4f4fc4c8b85f54b34f73a15a..599112837d6333e1c49ae70b91f66b385ffeec7a 100644 --- a/go.mod +++ b/go.mod @@ -5,6 +5,13 @@ 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 + gorm.io/gorm v1.25.1 ) -require golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8 // indirect +require ( + github.com/go-sql-driver/mysql v1.7.1 // 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 +) diff --git a/go.sum b/go.sum index 656e662af702e4a5983da10a62dbb3adda6130ce..0a1684a5e2d71694c2e2900e196a03e64b69a5cb 100644 --- a/go.sum +++ b/go.sum @@ -1,8 +1,15 @@ 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/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/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI= github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= +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/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= @@ -15,3 +22,8 @@ golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBc 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.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= +gorm.io/gorm v1.25.1 h1:nsSALe5Pr+cM3V1qwwQ7rOkw+6UeLrX5O4v3llhHa64= +gorm.io/gorm v1.25.1/go.mod h1:L4uxeKpfBml98NYqVqwAdmV1a2nBtAec/cf3fpucW/k= 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/db/db.go b/src/myaktion/db/db.go new file mode 100644 index 0000000000000000000000000000000000000000..df53923affbf82a9f6fd2338a160a9ad9c1bf8a2 --- /dev/null +++ b/src/myaktion/db/db.go @@ -0,0 +1,34 @@ +package db + +import ( + "fmt" + "os" + + log "github.com/sirupsen/logrus" + "gitlab.reutlingen-university.de/albrecht/myaktion-go/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) + var err error + DB, err = gorm.Open(mysql.Open(dsn), &gorm.Config{}) + + if err != nil { + panic("Connection to Database failed") + } + + log.Info("Starting migrations") + if err := DB.Debug().AutoMigrate(&model.Campaign{}); err != nil { + panic(err) + } + if err := DB.Debug().AutoMigrate(&model.Donation{}); err != nil { + panic(err) + } + log.Info("Migration finished") +} diff --git a/src/myaktion/model/account.go b/src/myaktion/model/account.go index d2e74b4cdd30b686069fcdf3bb5de02e6c677189..07aa05eabb042731b63e56a86ac6b3725dd88a57 100644 --- a/src/myaktion/model/account.go +++ b/src/myaktion/model/account.go @@ -1,7 +1,7 @@ package model type Account struct { - Name string - BankName string - Number string + Name string `gorm:"notNull:seize:40"` + BankName string `gorm:"notNull:seize:20"` + Number string `gorm:"notNull:seize:10"` } diff --git a/src/myaktion/model/campaign.go b/src/myaktion/model/campaign.go index 9fb581918dccfb6439fe2b276700060d13d6c517..e90118da47b8c3dd5a8d32a4b2a54365e2a0f525 100644 --- a/src/myaktion/model/campaign.go +++ b/src/myaktion/model/campaign.go @@ -1,12 +1,14 @@ package model +import "gorm.io/gorm" + type Campaign struct { - ID uint - Name string - OrganizerName string - TargetAmount float64 - DonationMinimum float64 - AmountDonatedSoFar float64 - Donations []Donation - Account Account + 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"` + AmountDonatedSoFar float64 `gorm:"-"` + Account Account `gorm:"embedded;embeddedPrefix:account_"` } diff --git a/src/myaktion/model/donation.go b/src/myaktion/model/donation.go index e452f9660ca77d5a1107136ee53cdd2c320c173b..52d4922e0c965788297da2aa884e5c866b6709b5 100644 --- a/src/myaktion/model/donation.go +++ b/src/myaktion/model/donation.go @@ -1,16 +1,20 @@ package model +import "gorm.io/gorm" + type Donation struct { - Amount float64 - DonorName string - ReceiptRequested bool - Account Account - Status Status + gorm.Model + CampaignID uint + Amount float64 `gorm:"notNull;check:amount >= 1.0"` + DonorName string `gorm:"notNull;size:40"` + ReceiptRequested bool `gorm:"notNull"` + Account Account `gorm:"embedded;embeddedPrefix:account_"` + Status Status `gorm:"notNull;type:ENUM('TRANSFERRED','IN_PROCESS')"` } 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 04115b69197748b1ebf29a6326b23b308e8269a5..901d8588d3dcaa4f4bb8bb25ec74d9585e968ace 100644 --- a/src/myaktion/service/campaign.go +++ b/src/myaktion/service/campaign.go @@ -5,6 +5,7 @@ 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" ) @@ -18,9 +19,10 @@ func init() { } func CreateCampaign(campaign *model.Campaign) error { - campaign.ID = actCampaignId - campaignStore[actCampaignId] = campaign - actCampaignId += 1 + result := db.DB.Create(campaign) + 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) return nil @@ -28,9 +30,12 @@ func CreateCampaign(campaign *model.Campaign) error { func GetCampaigns() ([]model.Campaign, error) { var campaigns []model.Campaign - for _, campaign := range campaignStore { - campaigns = append(campaigns, *campaign) + result := db.DB.Preload("Donations").Find(&campaigns) + if result.Error != nil { + return nil, result.Error } + + log.Tracef("Retrieved: %v Campaigns", campaigns) return campaigns, nil } diff --git a/tests.txt b/tests.txt new file mode 100644 index 0000000000000000000000000000000000000000..a2985c2068df9f178f6049560f3fbf1840fa77a8 --- /dev/null +++ b/tests.txt @@ -0,0 +1,18 @@ +# 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 + + +# Get (all) campaigns +curl localhost:8000/campaigns + +# Get (specified) campaign +curl localhost:8000/campaigns/2 + +# DeleteCampaign +curl -X DELETE localhost:8000/campaigns/1 + +# UpdateCampaign +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 +curs -H "Content-Type: application/json" -d '{"amount": 12.23,"DonorName":"Stefan","ReceiptRequested":false}' \ No newline at end of file