Showing
5 changed files
with
124 additions
and
15 deletions
... | @@ -968,6 +968,11 @@ | ... | @@ -968,6 +968,11 @@ |
968 | "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", | 968 | "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", |
969 | "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=" | 969 | "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=" |
970 | }, | 970 | }, |
971 | + "local-iso-dt": { | ||
972 | + "version": "1.2.2", | ||
973 | + "resolved": "https://registry.npmjs.org/local-iso-dt/-/local-iso-dt-1.2.2.tgz", | ||
974 | + "integrity": "sha512-/wNNXYs7uro+u0fo3/HUOriWa7rrVgZaKjjfyJ1azAWMXBCk1v/fgsVfC5CtlENQMFrPvkg02ldQFFQLETiS3w==" | ||
975 | + }, | ||
971 | "longest": { | 976 | "longest": { |
972 | "version": "1.0.1", | 977 | "version": "1.0.1", |
973 | "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", | 978 | "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", |
... | @@ -1027,6 +1032,11 @@ | ... | @@ -1027,6 +1032,11 @@ |
1027 | "minimist": "0.0.8" | 1032 | "minimist": "0.0.8" |
1028 | } | 1033 | } |
1029 | }, | 1034 | }, |
1035 | + "moment": { | ||
1036 | + "version": "2.24.0", | ||
1037 | + "resolved": "https://registry.npmjs.org/moment/-/moment-2.24.0.tgz", | ||
1038 | + "integrity": "sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg==" | ||
1039 | + }, | ||
1030 | "morgan": { | 1040 | "morgan": { |
1031 | "version": "1.9.1", | 1041 | "version": "1.9.1", |
1032 | "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.9.1.tgz", | 1042 | "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.9.1.tgz", | ... | ... |
... | @@ -18,6 +18,8 @@ | ... | @@ -18,6 +18,8 @@ |
18 | "googleapis": "^45.0.0", | 18 | "googleapis": "^45.0.0", |
19 | "http-errors": "~1.6.3", | 19 | "http-errors": "~1.6.3", |
20 | "jade": "~1.11.0", | 20 | "jade": "~1.11.0", |
21 | + "local-iso-dt": "^1.2.2", | ||
22 | + "moment": "^2.24.0", | ||
21 | "morgan": "~1.9.1", | 23 | "morgan": "~1.9.1", |
22 | "mysql": "^2.17.1", | 24 | "mysql": "^2.17.1", |
23 | "needle": "^2.4.0", | 25 | "needle": "^2.4.0", | ... | ... |
1 | var express = require('express'); | 1 | var express = require('express'); |
2 | var router = express.Router(); | 2 | var router = express.Router(); |
3 | var gcal = require('google-calendar'); | 3 | var gcal = require('google-calendar'); |
4 | +const { localISOdt } = require('local-iso-dt'); | ||
5 | +var accessToken; | ||
4 | 6 | ||
7 | +var id; | ||
8 | +var accessToken; | ||
9 | + | ||
10 | +router.get('/', function(req, res, next) { | ||
11 | + console.log(accessToken); | ||
12 | + console.log(id); | ||
13 | + gcal(accessToken).events.list(id,{maxResult:1},function(err,data){ | ||
14 | + if(err) return console.log(err); | ||
15 | + else { | ||
16 | + console.log(data.items); | ||
17 | + res.render("events",{id:id,calendars:data.items}); | ||
18 | + } | ||
19 | + }); | ||
20 | +}); | ||
5 | router.post('/', function(req, res, next) { | 21 | router.post('/', function(req, res, next) { |
6 | - var accessToken = req.body.token; | 22 | + accessToken = req.body.token; |
7 | - var id = req.body.id; | 23 | + id = req.body.id; |
8 | gcal(accessToken).events.list(id,{maxResult:1},function(err,data){ | 24 | gcal(accessToken).events.list(id,{maxResult:1},function(err,data){ |
9 | if(err) return console.log(err); | 25 | if(err) return console.log(err); |
10 | else { | 26 | else { |
11 | - console.log(data.items[0].start); | 27 | + console.log(data.items); |
12 | res.render("events",{id:id,calendars:data.items}); | 28 | res.render("events",{id:id,calendars:data.items}); |
13 | } | 29 | } |
14 | }); | 30 | }); |
15 | }); | 31 | }); |
32 | +router.post('/add', function(req, res, next) { | ||
33 | + var sday = req.body.startDay.split('-'); | ||
34 | + var stime = req.body.startTime.split(':'); | ||
35 | + var start= timestamp(new Date(sday[0],sday[1],sday[2],stime[0],stime[1],0)); | ||
36 | + var eday = req.body.endDay.split('-'); | ||
37 | + var etime = req.body.endTime.split(':'); | ||
38 | + var end = timestamp(new Date(eday[0],eday[1],eday[2],etime[0],etime[1],0)); | ||
39 | + var event={ | ||
40 | + 'summary':req.body.summary, | ||
41 | + 'location':req.body.location, | ||
42 | + 'description':req.body.description, | ||
43 | + 'start':{ | ||
44 | + 'dateTime':start | ||
45 | + }, | ||
46 | + 'end':{ | ||
47 | + 'dateTime':end, | ||
48 | + } | ||
49 | + } | ||
50 | + gcal(accessToken).events.insert(id,event,function(err,data){ | ||
51 | + if(err) return console.log(err); | ||
52 | + else res.redirect('/events'); | ||
53 | + }); | ||
54 | + | ||
55 | +}); | ||
56 | + | ||
57 | +router.post('/remove', function(req, res, next) { | ||
58 | + var eId = req.body.eId; | ||
59 | + console.log(id); | ||
60 | + console.log(eId); | ||
61 | + gcal(accessToken).events.delete(id, eId, function(err, data) { | ||
62 | + if(err) return res.send(err); | ||
63 | + return res.redirect('/events'); | ||
64 | + }); | ||
65 | + | ||
66 | +}); | ||
16 | 67 | ||
68 | +var timestamp = function (date) { | ||
69 | + var pad = function (amount, width) { | ||
70 | + var padding = ""; | ||
71 | + while (padding.length < width - 1 && amount < Math.pow(10, width - padding.length - 1)) | ||
72 | + padding += "0"; | ||
73 | + return padding + amount.toString(); | ||
74 | + } | ||
75 | + date = date ? date : new Date(); | ||
76 | + var offset = date.getTimezoneOffset(); | ||
77 | + return pad(date.getFullYear(), 4) | ||
78 | + + "-" + pad(date.getMonth() + 1, 2) | ||
79 | + + "-" + pad(date.getDate(), 2) | ||
80 | + + "T" + pad(date.getHours(), 2) | ||
81 | + + ":" + pad(date.getMinutes(), 2) | ||
82 | + + ":" + pad(date.getSeconds(), 2) | ||
83 | + + (offset > 0 ? "-" : "+") | ||
84 | + + pad(Math.floor(Math.abs(offset) / 60), 2) | ||
85 | + + ":" + pad(Math.abs(offset) % 60, 2); | ||
86 | + } | ||
17 | 87 | ||
18 | module.exports = router; | 88 | module.exports = router; |
19 | 89 | ||
20 | -//db에서 calendar id에 해당하는 이벤트 출력 | ||
... | \ No newline at end of file | ... | \ No newline at end of file |
90 | +//timestamp(new Date(1983, 4, 9, 11, 5, 17)); | ||
... | \ No newline at end of file | ... | \ No newline at end of file | ... | ... |
... | @@ -14,7 +14,8 @@ passport.use(new GoogleStrategy({ | ... | @@ -14,7 +14,8 @@ passport.use(new GoogleStrategy({ |
14 | clientSecret:'N7Uh_oVQZt-almzA4DkM4bm_', | 14 | clientSecret:'N7Uh_oVQZt-almzA4DkM4bm_', |
15 | callbackURL:'http://localhost:3000/auth/google/callback', | 15 | callbackURL:'http://localhost:3000/auth/google/callback', |
16 | scope:['openid','email','https://www.googleapis.com/auth/calendar.readonly', | 16 | scope:['openid','email','https://www.googleapis.com/auth/calendar.readonly', |
17 | - 'https://www.googleapis.com/auth/calendar'] | 17 | + 'https://www.googleapis.com/auth/calendar', |
18 | + 'https://www.googleapis.com/auth/calendar.events'] | ||
18 | }, | 19 | }, |
19 | function(accessToken,refreshToken,params,profile,done){ | 20 | function(accessToken,refreshToken,params,profile,done){ |
20 | profile.accessToken = accessToken; | 21 | profile.accessToken = accessToken; | ... | ... |
... | @@ -2,17 +2,43 @@ | ... | @@ -2,17 +2,43 @@ |
2 | <html> | 2 | <html> |
3 | <head> | 3 | <head> |
4 | <link rel='stylesheet' href='/stylesheets/style.css' /> | 4 | <link rel='stylesheet' href='/stylesheets/style.css' /> |
5 | - | ||
6 | </head> | 5 | </head> |
7 | <body> | 6 | <body> |
8 | - <h1><%= id %></h1> | 7 | + <h1><%= id %></h1> |
9 | - <p> | 8 | + <div id="events" style="width:200px;float:left"> |
10 | - <% calendars.forEach(function(val){ %> | 9 | + <% calendars.forEach(function(val){ %> |
11 | - <li>summary : <%= val.summary %></li> | 10 | + <form action="/events/remove" method="POST"> |
12 | - <li>created : <%= val.created %></li> | 11 | + <p>summary : <%= val.summary %></p> |
13 | - <li>start : <%= val.start.dateTime %></li> | 12 | + <p>created : <%= val.created %></p> |
14 | - <li>end : <%= val.end.dateTime %></li> | 13 | + <p>start : <%= val.start.dateTime %></p> |
15 | - <% }) %> | 14 | + <p>end : <%= val.end.dateTime %></p> |
16 | - </p> | 15 | + <input type="hidden" name="eId" value=<%= val.id %>> |
16 | + <input type="submit" value="Delete"> | ||
17 | + </form> | ||
18 | + <% }) %> | ||
19 | + </div> | ||
20 | + <div id="menu" style="width:100px;float:right"> | ||
21 | + <div id="add" style="width:100px;height:50px"> | ||
22 | + <h2>Add Event!</h2> | ||
23 | + <form name="add" action="/events/add" method="POST"> | ||
24 | + <input type="hidden" name="id" value=<%= id %> > | ||
25 | + Summary:<br> | ||
26 | + <input type="text" name="summary" placeholder="Summary of event"> | ||
27 | + Location:<br> | ||
28 | + <input type="text" name="location" placeholder="Location ot event"> | ||
29 | + Desciption:<br> | ||
30 | + <input type="text" name="description" placeholder="Description"> | ||
31 | + Start Day:<br> | ||
32 | + <input type="date" name="startDay"> | ||
33 | + Start Time:<br> | ||
34 | + <input type="time" name="startTime"> | ||
35 | + End Day:<br> | ||
36 | + <input type="date" name="endDay"> | ||
37 | + End Time:<br> | ||
38 | + <input type="time" name="endTime"> | ||
39 | + <input type="submit" name="submit" value="Add"> | ||
40 | + </form> | ||
41 | + </div> | ||
42 | + </div> | ||
17 | </body> | 43 | </body> |
18 | </html> | 44 | </html> |
... | \ No newline at end of file | ... | \ No newline at end of file | ... | ... |
-
Please register or login to post a comment