Skip to content
Snippets Groups Projects
Commit e05d0649 authored by Martin Schmollinger's avatar Martin Schmollinger
Browse files

Added DB (GORM) for services CreateCampaign and GetCampaigns. Added Scripts to...

Added DB (GORM) for services CreateCampaign and GetCampaigns. Added Scripts to start maria db docker image
parent d17a9b95
No related branches found
No related tags found
No related merge requests found
golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
golang.org/x/sync v0.13.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=
golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk=
#!/usr/bin/env bash
docker run -d -p 3306:3306 --name database -e MYSQL_ROOT_PASSWORD=root -e MYSQL_DATABASE=myaktion mariadb:10.5
#!/usr/bin/env bash
docker kill database && docker rm database
package db
import (
"fmt"
"os"
log "github.com/sirupsen/logrus"
"gitlab.reutlingen-university.de/go-exercises/myaktion-go-ss25/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("Using DSN for DB:", dsn)
var err error
DB, err = gorm.Open(mysql.Open(dsn), &gorm.Config{})
if err != nil {
panic("failed to connect to database")
}
log.Info("Starting automatic 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("Automatic migrations finished")
}
...@@ -3,7 +3,14 @@ module gitlab.reutlingen-university.de/go-exercises/myaktion-go-ss25/src/myaktio ...@@ -3,7 +3,14 @@ module gitlab.reutlingen-university.de/go-exercises/myaktion-go-ss25/src/myaktio
go 1.24.1 go 1.24.1
require ( require (
filippo.io/edwards25519 v1.1.0 // indirect
github.com/go-sql-driver/mysql v1.9.2 // indirect
github.com/gorilla/mux v1.8.1 // indirect github.com/gorilla/mux v1.8.1 // indirect
github.com/jinzhu/inflection v1.0.0 // indirect
github.com/jinzhu/now v1.1.5 // indirect
github.com/sirupsen/logrus v1.9.3 // indirect github.com/sirupsen/logrus v1.9.3 // indirect
golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8 // indirect golang.org/x/sys v0.5.0 // indirect
golang.org/x/text v0.24.0 // indirect
gorm.io/driver/mysql v1.5.7 // indirect
gorm.io/gorm v1.25.12 // indirect
) )
filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA=
filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= 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.9.2 h1:4cNKDYQ1I84SXslGddlsrMhc8k4LeDVj6Ad6WRjiHuU=
github.com/go-sql-driver/mysql v1.9.2/go.mod h1:qn46aNg1333BRMNU69Lq93t8du/dwxI64Gl8i5p1WMU=
github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY= github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY=
github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ= github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ=
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/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ=
github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=
...@@ -9,5 +18,14 @@ github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+ ...@@ -9,5 +18,14 @@ github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= 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= golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8 h1:0A+M6Uqn+Eje4kHMK80dtF3JCXC4ykBgQG4Fe06QRhQ=
golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.5.0 h1:MUK/U/4lj1t1oPg0HfuXDN/Z1wv31ZJ/YcPiGccS4DU=
golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/text v0.24.0 h1:dd5Bzh4yt5KYA8f9CJHCP4FB4D51c2c6JvN37xJJkJ0=
golang.org/x/text v0.24.0/go.mod h1:L8rBsPeo2pSS+xqN0d5u2ikmjtmoJbDBT1b7nHvFCdU=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gorm.io/driver/mysql v1.5.7 h1:MndhOPYOfEp2rHKgkZIhJ16eVUIRf2HmzgoPmh7FCWo=
gorm.io/driver/mysql v1.5.7/go.mod h1:sEtPWMiqiN1N1cMXoXmBbd8C6/l+TESwriotuRRpkDM=
gorm.io/gorm v1.25.7/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8=
gorm.io/gorm v1.25.12 h1:I0u8i2hWQItBq1WfE0o2+WuL9+8L21K9e2HHSTE/0f8=
gorm.io/gorm v1.25.12/go.mod h1:xh7N7RHfYlNc5EmcI/El95gXusucDrQnHXe0+CgWcLQ=
...@@ -14,6 +14,7 @@ func CreateCampaign(w http.ResponseWriter, r *http.Request) { ...@@ -14,6 +14,7 @@ func CreateCampaign(w http.ResponseWriter, r *http.Request) {
var campaign *model.Campaign var campaign *model.Campaign
campaign, err := getCampaign(r) campaign, err := getCampaign(r)
if err != nil { if err != nil {
log.Printf("Error calling service CreateCampaign: %v", err)
http.Error(w, err.Error(), http.StatusBadRequest) http.Error(w, err.Error(), http.StatusBadRequest)
return return
} }
......
...@@ -9,10 +9,12 @@ import ( ...@@ -9,10 +9,12 @@ import (
log "github.com/sirupsen/logrus" log "github.com/sirupsen/logrus"
) )
// Result type for handler that do not return a resource like e.g. deleting a resource.
type result struct { type result struct {
Success string `json:"success"` Success string `json:"success"`
} }
// Helper function that sends an arbitrary object back encoded as JSON.
func sendJson(w http.ResponseWriter, value interface{}) { func sendJson(w http.ResponseWriter, value interface{}) {
w.Header().Set("Content-Type", "application/json") w.Header().Set("Content-Type", "application/json")
if err := json.NewEncoder(w).Encode(value); err != nil { if err := json.NewEncoder(w).Encode(value); err != nil {
...@@ -21,6 +23,7 @@ func sendJson(w http.ResponseWriter, value interface{}) { ...@@ -21,6 +23,7 @@ func sendJson(w http.ResponseWriter, value interface{}) {
} }
} }
// Helper function for handler working on IDs passed as URI path variable.
func getId(r *http.Request) (uint, error) { func getId(r *http.Request) (uint, error) {
vars := mux.Vars(r) vars := mux.Vars(r)
id, err := strconv.ParseUint(vars["id"], 10, 0) id, err := strconv.ParseUint(vars["id"], 10, 0)
......
package model package model
type Account struct { type Account struct {
Name string Name string `gorm:"notNull;size:60"`
BankName string BankName string `gorm:"notNull;size:40"`
Number string Number string `gorm:"notNull;size:20"`
} }
package model package model
import "gorm.io/gorm"
type Campaign struct { type Campaign struct {
ID uint gorm.Model
Name string Name string `gorm:"notNull;size:30"`
OrganizerName string OrganizerName string `gorm:"notNull"`
TargetAmount float64 TargetAmount float64 `gorm:"notNull;check:target_amount >= 10.0"`
DonationMinimum float64 DonationMinimum float64 `gorm:"notNull;check:donation_minimum >= 1.0"`
AmountDonatedSoFar float64 AmountDonatedSoFar float64 `gorm:"-"`
Donations []Donation Donations []Donation `gorm:"foreignKey:CampaignID;constraint:OnUpdate:CASCADE,OnDelete:CASCADE"`
Account Account Account Account `gorm:"embedded;embeddedPrefix:account_"`
} }
package model package model
import "gorm.io/gorm"
type Status string type Status string
const ( const (
...@@ -8,9 +10,11 @@ const ( ...@@ -8,9 +10,11 @@ const (
) )
type Donation struct { type Donation struct {
Amount float64 gorm.Model
DonorName string CampaignID uint
ReceiptRequested bool Amount float64 `gorm:"notNull;check:amount >= 1.0"`
Status Status DonorName string `gorm:"notNull;size:40"`
Account Account ReceiptRequested bool `gorm:"notNull"`
Status Status `gorm:"notNull;type:ENUM('TRANSFERRED','IN_PROCESS')"`
Account Account `gorm:"embedded;embeddedPrefix:account_"`
} }
package service package service
import ( import (
"log" log "github.com/sirupsen/logrus"
"gitlab.reutlingen-university.de/go-exercises/myaktion-go-ss25/src/myaktion/db"
"gitlab.reutlingen-university.de/go-exercises/myaktion-go-ss25/src/myaktion/model" "gitlab.reutlingen-university.de/go-exercises/myaktion-go-ss25/src/myaktion/model"
) )
var (
campaignStore map[uint]*model.Campaign
actCampaignId uint = 1
)
func init() {
campaignStore = make(map[uint]*model.Campaign)
}
func CreateCampaign(campaign *model.Campaign) error { func CreateCampaign(campaign *model.Campaign) error {
campaign.ID = actCampaignId result := db.DB.Create(campaign)
campaignStore[actCampaignId] = campaign if result.Error != nil {
actCampaignId += 1 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 return nil
} }
func GetCampaigns() ([]model.Campaign, error) { func GetCampaigns() ([]model.Campaign, error) {
var campaigns []model.Campaign var campaigns []model.Campaign
for _, campaign := range campaignStore { result := db.DB.Preload("Donations").Find(&campaigns)
campaigns = append(campaigns, *campaign) if result.Error != nil {
return nil, result.Error
} }
log.Printf("Retrieved: %v", campaigns) log.Tracef("Retrieved: %v", campaigns)
return campaigns, nil return campaigns, nil
} }
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please to comment