package data

import (
	"time"

	"github.com/jinzhu/gorm"

	// DB adapters
	_ "github.com/lib/pq"
	_ "github.com/mattn/go-sqlite3"
)

var db gorm.DB

type Check struct {
	Id        int64
	URL       string `gorm:"column:url"`
	Status    int    // status code of last result
	Success   bool   // success status of last result
	CreatedAt time.Time
	UpdatedAt time.Time
}

type Result struct {
	Id        int64
	CreatedAt time.Time
	Status    int
	Success   bool
	IP        string `gorm:"column:ip"`
	CheckId   int64
}

func InitDatabase() (err error) {
	db, err = gorm.Open("sqlite3", "/tmp/goffee.db")
	if err != nil {
		return err
	}

	db.AutoMigrate(&Check{}, &Result{})

	return nil
}

func Checks() ([]Check, error) {
	var checks []Check
	res := db.Find(&checks)
	return checks, res.Error
}

func (c *Check) Create() error {
	res := db.Create(c)
	return res.Error
}

func (c *Check) AddResult(r *Result) error {
	tx := db.Begin()

	r.CheckId = c.Id
	res := tx.Create(r)
	if res.Error != nil {
		tx.Rollback()
		return res.Error
	}

	c.Status = r.Status
	c.Success = r.Success
	res = tx.Save(c)
	if res.Error != nil {
		tx.Rollback()
		return res.Error
	}

	tx.Commit()
	return nil
}

func (c *Check) Results() ([]Result, error) {
	var results []Result
	res := db.Model(c).Related(&results)
	return results, res.Error
}

package data

import (
	"time"

	"github.com/jinzhu/gorm"

	// DB adapters
	_ "github.com/lib/pq"
	_ "github.com/mattn/go-sqlite3"
)

var db gorm.DB

type Check struct {
	Id  int64
	URL string
}

type Result struct {
	Timestamp time.Time
	Status    int
	Success   bool
	IP        string
}

func InitDatabase() (err error) {
	db, err = gorm.Open("sqlite3", "/tmp/goffee.db")
	if err != nil {
		return err
	}

	db.AutoMigrate(&Check{}, &Result{})

	return nil
}

func (c Check) Create() error {
	r := db.Create(c)
	return r.Error
}

func Checks() ([]Check, error) {
	checks := []Check{}
	r := db.Find(&checks)
	return checks, r.Error
}

--- 
+++ 
@@ -13,15 +13,21 @@
 var db gorm.DB
 
 type Check struct {
-	Id  int64
-	URL string
+	Id        int64
+	URL       string `gorm:"column:url"`
+	Status    int    // status code of last result
+	Success   bool   // success status of last result
+	CreatedAt time.Time
+	UpdatedAt time.Time
 }
 
 type Result struct {
-	Timestamp time.Time
+	Id        int64
+	CreatedAt time.Time
 	Status    int
 	Success   bool
-	IP        string
+	IP        string `gorm:"column:ip"`
+	CheckId   int64
 }
 
 func InitDatabase() (err error) {
@@ -35,13 +41,41 @@
 	return nil
 }
 
-func (c Check) Create() error {
-	r := db.Create(c)
-	return r.Error
+func Checks() ([]Check, error) {
+	var checks []Check
+	res := db.Find(&checks)
+	return checks, res.Error
 }
 
-func Checks() ([]Check, error) {
-	checks := []Check{}
-	r := db.Find(&checks)
-	return checks, r.Error
+func (c *Check) Create() error {
+	res := db.Create(c)
+	return res.Error
 }
+
+func (c *Check) AddResult(r *Result) error {
+	tx := db.Begin()
+
+	r.CheckId = c.Id
+	res := tx.Create(r)
+	if res.Error != nil {
+		tx.Rollback()
+		return res.Error
+	}
+
+	c.Status = r.Status
+	c.Success = r.Success
+	res = tx.Save(c)
+	if res.Error != nil {
+		tx.Rollback()
+		return res.Error
+	}
+
+	tx.Commit()
+	return nil
+}
+
+func (c *Check) Results() ([]Result, error) {
+	var results []Result
+	res := db.Model(c).Related(&results)
+	return results, res.Error
+}
Make it possible to create and fetch results and checks
