diff options
Diffstat (limited to 'desk/web/router.hoon')
-rw-r--r-- | desk/web/router.hoon | 270 |
1 files changed, 270 insertions, 0 deletions
diff --git a/desk/web/router.hoon b/desk/web/router.hoon new file mode 100644 index 0000000..547a2f9 --- /dev/null +++ b/desk/web/router.hoon @@ -0,0 +1,270 @@ +/- *boke, tp=trill-post, cnt=contact, tlonc=tlon-channels +/+ kaji, plib=trill-utils, lib=boke, sr=sortug, const=constants +/= index /web/index +/= nav /web/layout/nav +:: +/= blog /web/blog/router +/= title /web/blog/title +:: +/= board /web/board/router +:: +/= feed /web/feed/router +:: +/= search /web/search/router +:: +/= chat-page /web/chat/chat +:: +/= tv /web/tv/router +/= tvp /web/tv/tv + +/= about /web/about +/= merch /web/merch +:: +:: common +/= modals /web/components/modals +/= cm /web/components/common +:: +/= root /web/root +/= login /web/login +/= subscribe /web/subscribe +/= user /web/user +/= editor /web/editor +:: + +/* spinner %noun /web/assets/spinner/svg +/* favicon %noun /web/assets/favicon/ico +|% +++ eyre-bail (error-response:kaji 404) +++ manx-bail (error-page:kaji 404) ++$ request +$% [%eyre p=eyre-order:kaji] + [%kaji tab=@t req=kaji-req] +== +++ route +|= [r=request =bowl:gall s=state] ^- kaji-res:kaji +|^ + ?- -.r + %eyre :- %res ^- eyre-res:kaji + =/ rl=req-line:kaji (parse-req:kaji req.p.r) + =/ met method.request.req.p.r + =/ fpath=(pole knot) [met pat.rl] + ?: ?=([%apps %canvas rest=*] pat.rl) (serve-canvas rest.pat.rl rl) + ?: ?=([~ @] ext.rl) (serve-assets rl) + :: ?: ?=([[%session ~] [~ %js]] [pat ext]:rl) :- %full (serve-other:kaji %js (crip "window.ship = {(trip (rsh 3 (scot %p our.bowl)))};")) + ?+ fpath eyre-bail + [%'GET' rest=*] (serve-get rl(pat rest.fpath)) + == + %kaji :- %sse ^- sse-res:kaji + ?- -.req.r + %blog-redi (redirect-post post.req.r .y .y) + %board-redi (redirect-post post.req.r .n .n) + %redi (ui-effect [%redi url.req.r]) + %tv-chat (give-tv-chat +.req.r) + %radio-chat (give-radio-chat +.req.r) + %chat-msg (give-chat-msg +.req.r) + == + == +++ kaji-bail :- [%tab ~] :~([%redi '/404']) +++ ui-effect |= e=effect:kaji ^- sse-res:kaji + :- [%tab ~] :~(e) +:: +:: Eyre handling +:: + ++ serve-assets + |= rl=req-line:kaji + ~& serving-assets=rl + ?+ [pat ext]:rl eyre-bail + [[%spinner ~] [~ %svg]] [%mime ['image' 'svg+xml' ~] spinner] + [[%favicon ~] [~ %ico]] [%mime ['image' 'x-icon' ~] favicon] + :: [[%fonts @t ~] [~ %ttf]] ~& pat.rl + :: ~& ~(key by fonts) + :: =/ font (~(got by fonts) 'name') + :: [%mime /application/octet-stream font] + == + + ++ serve-get + |= rl=req-line:kaji ^- eyre-res:kaji + =/ pat pat.rl + ?+ pat ~(show blog [rl s bowl]) + [~ ~] serve-root + [%blog rest=*] (blog [rl(pat rest.pat) s bowl]) + :: + [%board rest=*] (board rl(pat rest.pat) s bowl) + :: + [%feed rest=*] (feed rl(pat rest.pat) s bowl) + :: + [%search rest=*] (search rl(pat rest.pat) s bowl) + :: + [%tv rest=*] (tv rl(pat rest.pat) s bowl) + :: + :: users + [%login rest=*] serve-login + [%subscribe ~] serve-subscribe + [%logout ~] logout + [%user ~] serve-profile + [%user u=@t ~] (serve-user u.pat) + [%chat ~] serve-chat + [%about ~] serve-about + [%book ~] serve-merch + :: admin + [%bianji rest=*] (serve-editor rest.pat) + :: + [%f rest=*] (serve-fragment rest.pat) + == + + + ++ serve-root + :- %page + =/ page (root [s bowl]) + (index ~[title page] bowl) + ++ serve-login + :- %page + (index ~[(login src.bowl)] bowl) + ++ serve-profile :- %page + =/ page (user src.bowl s bowl) + (index ~[page] bowl) + + ++ serve-subscribe + :- %page + (index ~[(subscribe src.bowl)] bowl) + + ++ serve-user + |= suser=@t :- %page + =/ who (slaw %p suser) + ?~ who manx-bail + =/ page (user u.who s bowl) + (index ~[page] bowl) + :: + ++ serve-editor + |= p=path + :- %page + ?. (is-admin:lib src.bowl) manx-bail + =/ bunt [*thread:tp *full-node:tp] + =/ pid (~(get by paths.s) p) + =/ pp ?~ pid bunt + =/ poast (get:gorm:tp feed.s u.pid) + =/ ted (get:torm:tp threads.s u.pid) + ?~ ted bunt ?~ poast bunt + :- u.ted (node-to-full:plib u.poast feed.s) + =/ page=manx (editor pp s bowl) + (index ~[page] bowl) + + ++ serve-chat + :- %page + =/ contacts (get-contacts:cnt bowl) + =/ pat /chat/(scot %p our.bowl)/chat/posts/newest/200/post + =/ scry ~(scry io:sr bowl) + =/ chat-posts (scry %channels pat paged-posts:tlonc) + =/ chat-core ~(. chat-page [contacts bowl]) + =/ page (main:chat-core chat-posts) + (index ~[page] bowl) + + ++ serve-about + :- %page + (index ~[title about] bowl) + ++ serve-merch + :- %page + (index ~[merch] bowl) + + ++ serve-fragment + |= pat=(pole knot) :- %html + ?+ pat manx-bail + [%mobile-nav ~] ~(smol nav bowl) + == + + + ++ logout + :- %full + ^- simple-payload:http + [[303 ['location' '/~/logout'] ['redirect' '/']~] ~] + + :: + :: Kaji handling + :: + ++ redirect-post + |= [=post:tp blog-view=? is-blog=?] ^- sse-res:kaji + =/ ted (get:torm:tp threads.s thread.post) + ?~ ted kaji-bail + =/ pat-string=@t %- spat (get-path:lib path.u.ted blog-view is-blog) + =/ url ?~ parent.post pat-string + =/ hash (enc:kaji [author.post id.post]) + =/ id "comment-{hash}" + (crip "{(trip pat-string)}?goto={id}") + (ui-effect [%redi url]) + + + ++ give-tv-chat + |= [name=@t p=post:tp] + =/ m :: TODO FIX THIS CRAP. inner vs outer html is annoying af + ;div + ;+ (chat-msg:tvp p) + == + =/ effects :~ [%add m '#chat-container' %bottom ~] + [%custom *manx %s 'scroll'] == + :_ effects [%custom ~[/tv/our/[name]]] + ++ give-radio-chat + |= [s=@p p=*] + :: =/ m :: TODO FIX THIS CRAP. inner vs outer html is annoying af + :: ;div + :: ;+ (chat-msg:tvp p) + :: == + :: =/ effects :~ [%add m '#chat-container' %bottom ~] + :: [%custom *manx %s 'scroll'] == + :: :_ effects [%custom ~[/tv/our/(scot %p s)]] + :- [%tab ~] + ~ + + ++ give-chat-msg + |= [=flag:tlonc q=memo:tlonc] + =/ subpath /chat/(scot %p p.flag)/[q.flag] + =/ contacts (get-contacts:cnt bowl) + =/ tlonchat ~(. chat-page [contacts bowl]) + =/ m ;div ;+ (post-div:tlonchat q) == + :- [%custom ~[subpath]] + :~ [%add m '#chat-container' %bottom ~] + [%custom *manx %s 'scroll'] + == + + :: lets play with globs + +$ glob-reference + [hash=@uvH location=glob-location] + :: + +$ glob-location + $% [%http =cord] + [%ames =ship] + == + +$ version + [major=@ud minor=@ud patch=@ud] + +$ glob (map path mime) + +$ href + $% [%glob base=term =glob-reference] + [%site =path] + == + :: glob handling, TODO put in kaji.hoon + ++ serve-canvas + |= [p=(pole knot) rl=req-line:kaji] + =/ pat /charges/canvas + =/ scry ~(scry io:sr bowl) + =/ scry-res (scry %docket pat *) + =/ glob ((soft glob) scry-res) + ?~ glob eyre-bail + =/ glob u.glob + :: ~& glob=~(key by glob) + =/ suffix (weld p (drop ext.rl)) + ?: =(suffix /desk/js) + :+ %mime /text/js + 'window.desk = "canvas";' + =/ requested=path + ?: (~(has by glob) suffix) suffix + /index/html + =/ data=(unit mime) + (~(get by glob) requested) + ?~ data ~& >>> glob-not-found=suffix eyre-bail + :: =/ lmao ?: (cfind:sr 'start' (spat suffix) .n) ~& > `@t`q.q.u.data .n .n + :: =/ clean (replace:string:sr "/apps/canvas" "/canvas" (trip q.q.u.data)) + :: =. q.q.u.data (crip clean) + :: =/ lmao ?: (cfind:sr 'start' (spat suffix) .n) ~& >> `@t`q.q.u.data .n .n + + [%glob u.data] +-- +-- |