Showing
7 changed files
with
81 additions
and
45 deletions
... | @@ -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"` | ... | ... |
... | @@ -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 | } | ... | ... |
-
Please register or login to post a comment