/
app.go
124 lines (111 loc) · 2.94 KB
/
app.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
package main
import (
"fmt"
"net/http"
"io/ioutil"
"log"
"database/sql"
_ "github.com/lib/pq"
"github.com/drone/routes"
"time"
"encoding/json"
)
type Page struct {
title string
body []byte
}
type Rental struct {
City string
Owner string
Bedrooms int
CreatedAt time.Time
UpdatedAt time.Time
}
var db *sql.DB
func init() {
var err error
db, err = sql.Open("postgres", "postgres://username:password0@localhost/rentals?sslmode=disable")
if err != nil {
log.Fatal(err)
}
if err = db.Ping(); err != nil {
log.Fatal(err)
}
}
func (p *Page) save() error {
filename := p.title + ".txt"
return ioutil.WriteFile(filename, p.body, 0600)
}
func loadPage(title string) (*Page, error) {
filename := title + ".txt"
body, err := ioutil.ReadFile(filename)
if err != nil {
return nil, err
}
return &Page{title: title, body: body}, nil
}
func checkErr(err error) {
if err != nil {
log.Fatal(err)
}
}
func handler(w http.ResponseWriter, r *http.Request) {
// params := r.URL.Query()
//uid := params.Get(":uid")
//var owner string
rows, err := db.Query("SELECT * FROM rentals;")
if err == sql.ErrNoRows {
log.Fatal("No Results Found")
}
if err != nil {
log.Fatal(err)
}
rentals := []Rental{}
for rows.Next() {
var owner string
var id int
var city string
var bedrooms int
var createdAt time.Time
var updatedAt time.Time
err = rows.Scan(&id, &city, &owner, &bedrooms, &createdAt, &updatedAt)
checkErr(err)
rentals = append(rentals, Rental{City: city, Owner: owner, Bedrooms: bedrooms, CreatedAt: createdAt, UpdatedAt: updatedAt})
//fmt.Fprintf(w, "<h1>%s</h1><p>Onwer: %s</p>", city, owner)
}
js, err := json.Marshal(rentals)
//fmt.Fprintf(w, "<p>%s</p>", js)
w.Header().Set("Content-Type", "application/json")
w.Write(js)
//json.NewEncoder(w).Encode(rentals)
}
func getRentalHandler(w http.ResponseWriter, r *http.Request) {
params := r.URL.Query()
id := params.Get(":id")
var owner string
var city string
var bedrooms int
var createdAt time.Time
var updatedAt time.Time
db.QueryRow("SELECT * FROM rentals WHERE id=$1;", id).Scan(&id, &city, &owner, &bedrooms, &createdAt, &updatedAt)
rentals := []Rental{}
rentals = append(rentals, Rental{City: city, Owner: owner, Bedrooms: bedrooms, CreatedAt: createdAt, UpdatedAt: updatedAt})
js, err := json.Marshal(rentals)
checkErr(err)
w.Header().Set("Content-Type", "application/json")
w.Write(js)
}
func viewHandler(w http.ResponseWriter, r *http.Request) {
title := r.URL.Path[len("/view/"):]
p, _ := loadPage(title)
fmt.Fprintf(w, "<h1>%s</h1><div>%s</div>", p.title, p.body)
}
func main() {
mux := routes.New()
mux.Get("/", handler)
mux.Get("/rentals/:id", getRentalHandler)
//http.HandleFunc("/view/", viewHandler)
//http.HandleFunc("/", handler)
http.Handle("/", mux)
http.ListenAndServe(":3000", nil)
}