freckie

Update: sheets control

...@@ -6,10 +6,15 @@ import ( ...@@ -6,10 +6,15 @@ import (
6 ) 6 )
7 7
8 type Config struct { 8 type Config struct {
9 + Google ConfigGoogle `json:"google"`
9 Server ConfigServer `json:"server"` 10 Server ConfigServer `json:"server"`
10 Database ConfigDatabase `json:"database"` 11 Database ConfigDatabase `json:"database"`
11 } 12 }
12 13
14 +type ConfigGoogle struct {
15 + CredentialsPath string `json:"credentials_path"`
16 +}
17 +
13 type ConfigServer struct { 18 type ConfigServer struct {
14 LocalMode bool `json:"local_mode"` 19 LocalMode bool `json:"local_mode"`
15 Host string `json:"host"` 20 Host string `json:"host"`
......
1 package endpoints 1 package endpoints
2 2
3 import ( 3 import (
4 + "classroom/utils"
4 "database/sql" 5 "database/sql"
5 ) 6 )
6 7
7 type Endpoints struct { 8 type Endpoints struct {
8 - DB *sql.DB 9 + DB *sql.DB
10 + Sheets *utils.SheetsService
9 } 11 }
......
...@@ -5,10 +5,12 @@ go 1.14 ...@@ -5,10 +5,12 @@ go 1.14
5 require ( 5 require (
6 classroom/functions v0.0.0 6 classroom/functions v0.0.0
7 classroom/models v0.0.0 7 classroom/models v0.0.0
8 + classroom/utils v0.0.0
8 github.com/julienschmidt/httprouter v1.3.0 9 github.com/julienschmidt/httprouter v1.3.0
9 ) 10 )
10 11
11 replace ( 12 replace (
12 classroom/functions v0.0.0 => ../functions 13 classroom/functions v0.0.0 => ../functions
13 classroom/models v0.0.0 => ../models 14 classroom/models v0.0.0 => ../models
15 + classroom/utils v0.0.0 => ../utils
14 ) 16 )
......
This diff is collapsed. Click to expand it.
...@@ -3,11 +3,13 @@ package endpoints ...@@ -3,11 +3,13 @@ package endpoints
3 import ( 3 import (
4 "classroom/functions" 4 "classroom/functions"
5 "classroom/models" 5 "classroom/models"
6 + "classroom/utils"
6 "database/sql" 7 "database/sql"
7 "encoding/json" 8 "encoding/json"
8 "fmt" 9 "fmt"
9 "io/ioutil" 10 "io/ioutil"
10 "net/http" 11 "net/http"
12 + "strconv"
11 "strings" 13 "strings"
12 14
13 "github.com/julienschmidt/httprouter" 15 "github.com/julienschmidt/httprouter"
...@@ -29,46 +31,20 @@ func (e *Endpoints) ReservationPost(w http.ResponseWriter, r *http.Request, ps h ...@@ -29,46 +31,20 @@ func (e *Endpoints) ReservationPost(w http.ResponseWriter, r *http.Request, ps h
29 sheetID := ps.ByName("sheet_id") 31 sheetID := ps.ByName("sheet_id")
30 32
31 // Check Permission 33 // Check Permission
32 - var _count int64 34 + var _timetableName string
33 timetable := fmt.Sprintf("%s,%s", fileID, sheetID) 35 timetable := fmt.Sprintf("%s,%s", fileID, sheetID)
34 row := e.DB.QueryRow(` 36 row := e.DB.QueryRow(`
35 - SELECT count(timetable_id) 37 + SELECT name
36 - FROM allowlist 38 + FROM timetables
37 WHERE timetable_id=?; 39 WHERE timetable_id=?;
38 `, timetable) 40 `, timetable)
39 - if err := row.Scan(&_count); err == nil { 41 + if err := row.Scan(&_timetableName); err != nil {
40 - if _count <= 0 { 42 + if err == sql.ErrNoRows {
41 functions.ResponseError(w, 404, "존재하지 않는 timetable.") 43 functions.ResponseError(w, 404, "존재하지 않는 timetable.")
42 return 44 return
43 } 45 }
44 } 46 }
45 47
46 - // row = e.DB.QueryRow(`
47 - // SELECT (
48 - // SELECT count(a.timetable_id)
49 - // FROM allowlist AS a, users AS u
50 - // WHERE a.user_id=u.id
51 - // AND a.timetable_id=?
52 - // AND u.email=?
53 - // ) AS count,
54 - // (
55 - // SELECT is_super FROM users WHERE email=?
56 - // ) AS is_super;
57 - // `, timetable, email, email)
58 - // if err := row.Scan(&_count, &_isSuper); err == nil {
59 - // if _isSuper != 1 {
60 - // functions.ResponseError(w, 403, "관리자만 접근할 수 있는 기능입니다.")
61 - // return
62 - // }
63 - // if _count <= 0 {
64 - // functions.ResponseError(w, 403, "timetable에 접근할 권한이 부족합니다.")
65 - // return
66 - // }
67 - // } else {
68 - // functions.ResponseError(w, 500, "예기치 못한 에러 : "+err.Error())
69 - // return
70 - // }
71 -
72 // Parse Request Data 48 // Parse Request Data
73 type reqDataStruct struct { 49 type reqDataStruct struct {
74 Column *string `json:"column"` 50 Column *string `json:"column"`
...@@ -153,6 +129,26 @@ loopCheckingValidation: ...@@ -153,6 +129,26 @@ loopCheckingValidation:
153 return 129 return
154 } 130 }
155 131
132 + // Merge and write value on cells
133 + cellValue := fmt.Sprintf("%s\n%s", *(reqData.Lecture), *(reqData.Professor))
134 + sheetIDint, _ := strconv.Atoi(sheetID)
135 + sr := utils.NewSheetsRequest(
136 + fileID,
137 + _timetableName,
138 + int64(sheetIDint),
139 + *(reqData.Column),
140 + int64(*(reqData.Start)),
141 + int64(*(reqData.End)),
142 + cellValue,
143 + )
144 + fmt.Println(sr)
145 + err = e.Sheets.WriteAndMerge(sr)
146 + if err != nil {
147 + functions.ResponseError(w, 500, "예기치 못한 에러 : "+err.Error())
148 + return
149 + }
150 +
151 + // Transaction Commit
156 err = tx.Commit() 152 err = tx.Commit()
157 if err != nil { 153 if err != nil {
158 functions.ResponseError(w, 500, "예기치 못한 에러 : "+err.Error()) 154 functions.ResponseError(w, 500, "예기치 못한 에러 : "+err.Error())
...@@ -161,7 +157,7 @@ loopCheckingValidation: ...@@ -161,7 +157,7 @@ loopCheckingValidation:
161 157
162 resp.TransactionID, err = res.LastInsertId() 158 resp.TransactionID, err = res.LastInsertId()
163 if err != nil { 159 if err != nil {
164 - functions.ResponseError(w, 500, err.Error()) 160 + functions.ResponseError(w, 500, "예기치 못한 에러 : "+err.Error())
165 return 161 return
166 } 162 }
167 163
...@@ -192,15 +188,16 @@ func (e *Endpoints) ReservationDelete(w http.ResponseWriter, r *http.Request, ps ...@@ -192,15 +188,16 @@ func (e *Endpoints) ReservationDelete(w http.ResponseWriter, r *http.Request, ps
192 reservationID := ps.ByName("reservation_id") 188 reservationID := ps.ByName("reservation_id")
193 189
194 // Check Permission 190 // Check Permission
195 - var _count, isSuper int64 191 + var isSuper int64
192 + var _timetableName string
196 timetable := fmt.Sprintf("%s,%s", fileID, sheetID) 193 timetable := fmt.Sprintf("%s,%s", fileID, sheetID)
197 row := e.DB.QueryRow(` 194 row := e.DB.QueryRow(`
198 - SELECT count(timetable_id) 195 + SELECT name
199 - FROM allowlist 196 + FROM timetables
200 WHERE timetable_id=?; 197 WHERE timetable_id=?;
201 `, timetable) 198 `, timetable)
202 - if err := row.Scan(&_count); err == nil { 199 + if err := row.Scan(&_timetableName); err != nil {
203 - if _count <= 0 { 200 + if err == sql.ErrNoRows {
204 functions.ResponseError(w, 404, "존재하지 않는 timetable.") 201 functions.ResponseError(w, 404, "존재하지 않는 timetable.")
205 return 202 return
206 } 203 }
...@@ -227,15 +224,15 @@ func (e *Endpoints) ReservationDelete(w http.ResponseWriter, r *http.Request, ps ...@@ -227,15 +224,15 @@ func (e *Endpoints) ReservationDelete(w http.ResponseWriter, r *http.Request, ps
227 defer tx.Rollback() 224 defer tx.Rollback()
228 225
229 // Check Transaction Permission 226 // Check Transaction Permission
230 - var _transactionType int64 227 + var _transactionType, _cellStart, _cellEnd int64
231 - var _email string 228 + var _email, _cellColumn string
232 row = tx.QueryRow(` 229 row = tx.QueryRow(`
233 - SELECT u.email, t.transaction_type 230 + SELECT u.email, t.transaction_type, t.cell_column, t.cell_start, t.cell_end
234 FROM transactions AS t, users AS u 231 FROM transactions AS t, users AS u
235 WHERE t.user_id=u.id 232 WHERE t.user_id=u.id
236 AND t.transaction_id=?; 233 AND t.transaction_id=?;
237 `, reservationID) 234 `, reservationID)
238 - err = row.Scan(&_email, &_transactionType) 235 + err = row.Scan(&_email, &_transactionType, &_cellColumn, &_cellStart, &_cellEnd)
239 if err != nil { 236 if err != nil {
240 if err == sql.ErrNoRows { 237 if err == sql.ErrNoRows {
241 functions.ResponseError(w, 404, "존재하지 않는 예약") 238 functions.ResponseError(w, 404, "존재하지 않는 예약")
...@@ -268,6 +265,24 @@ func (e *Endpoints) ReservationDelete(w http.ResponseWriter, r *http.Request, ps ...@@ -268,6 +265,24 @@ func (e *Endpoints) ReservationDelete(w http.ResponseWriter, r *http.Request, ps
268 return 265 return
269 } 266 }
270 267
268 + // Unmerge and clear value on cells
269 + sheetIDint, _ := strconv.Atoi(sheetID)
270 + sr := utils.NewSheetsRequest(
271 + fileID,
272 + _timetableName,
273 + int64(sheetIDint),
274 + _cellColumn,
275 + _cellStart,
276 + _cellEnd,
277 + "",
278 + )
279 + err = e.Sheets.RemoveValue(sr)
280 + if err != nil {
281 + functions.ResponseError(w, 500, "예기치 못한 에러 : "+err.Error())
282 + return
283 + }
284 +
285 + // Transaction Commit
271 err = tx.Commit() 286 err = tx.Commit()
272 if err != nil { 287 if err != nil {
273 functions.ResponseError(w, 500, "예기치 못한 에러 : "+err.Error()) 288 functions.ResponseError(w, 500, "예기치 못한 에러 : "+err.Error())
......
...@@ -11,6 +11,7 @@ import ( ...@@ -11,6 +11,7 @@ import (
11 11
12 "classroom/endpoints" 12 "classroom/endpoints"
13 "classroom/functions" 13 "classroom/functions"
14 + "classroom/utils"
14 15
15 _ "github.com/go-sql-driver/mysql" 16 _ "github.com/go-sql-driver/mysql"
16 "github.com/julienschmidt/httprouter" 17 "github.com/julienschmidt/httprouter"
...@@ -56,7 +57,17 @@ func main() { ...@@ -56,7 +57,17 @@ func main() {
56 log.Fatal(err) 57 log.Fatal(err)
57 } 58 }
58 defer db.Close() 59 defer db.Close()
59 - ep := endpoints.Endpoints{DB: db} 60 +
61 + // Google API Setting
62 + sheets, err := utils.NewSheetsService(cfg.Google.CredentialsPath)
63 + if err != nil {
64 + log.Fatal(err)
65 + }
66 +
67 + ep := endpoints.Endpoints{
68 + DB: db,
69 + Sheets: sheets,
70 + }
60 71
61 // Router Setting 72 // Router Setting
62 router := httprouter.New() 73 router := httprouter.New()
......
...@@ -111,6 +111,7 @@ func (s *SheetsService) RemoveValue(sr SheetsRequest) error { ...@@ -111,6 +111,7 @@ func (s *SheetsService) RemoveValue(sr SheetsRequest) error {
111 111
112 type SheetsRequest struct { 112 type SheetsRequest struct {
113 SpreadSheetID string 113 SpreadSheetID string
114 + SheetName string
114 SheetID int64 115 SheetID int64
115 Range *sheets.GridRange 116 Range *sheets.GridRange
116 RangeStr string 117 RangeStr string
...@@ -118,7 +119,7 @@ type SheetsRequest struct { ...@@ -118,7 +119,7 @@ type SheetsRequest struct {
118 } 119 }
119 120
120 func NewSheetsRequest( 121 func NewSheetsRequest(
121 - spreadSheetID string, sheetID int64, column string, start, end int64, value string) SheetsRequest { 122 + spreadSheetID, sheetName string, sheetID int64, column string, start, end int64, value string) SheetsRequest {
122 colIndex := A1ToInt(column) 123 colIndex := A1ToInt(column)
123 124
124 req := SheetsRequest{} 125 req := SheetsRequest{}
...@@ -131,7 +132,7 @@ func NewSheetsRequest( ...@@ -131,7 +132,7 @@ func NewSheetsRequest(
131 StartRowIndex: start - 1, 132 StartRowIndex: start - 1,
132 EndRowIndex: end, 133 EndRowIndex: end,
133 } 134 }
134 - req.RangeStr = fmt.Sprintf("%s%d:%s%d", column, start, column, end) 135 + req.RangeStr = fmt.Sprintf("%s!%s%d:%s%d", sheetName, column, start, column, end)
135 req.Value = value 136 req.Value = value
136 return req 137 return req
137 } 138 }
......