# Alex M. PDF DB. Upload and search PDF files
# Inspired by A Minimal PicoLisp DB/GUI Application
# https://picolisp.com/wiki/?mindbgui
# And The Search funciton
# https://software-lab.de/doc/search.html
# pil pdfdb-web.l -main -go + 
# firefox http://localhost:9911
# pil pdfdb-web.l -main -'load-pdf "./book.pdf"' -bye
# pil pdfdb-web.l -pdfdb~main -'pdfdb~load-pdf "/home/alex/Downloads/editor.pdf"' -bye
# pil pdfdb-web.l -pdfdb~main -'pdfdb~load-pdf "/home/alex/Downloads/01-knuth-lp.pdf"' -bye
# pil pdfdb-web.l -main -'find-pdf "pdf"' -bye
# pil pdfdb-web.l -main -'find-pdf "knu"' -bye
# pil pdfdb-web.l -main -'find-pdf "Boo"' -bye
# firefox http://localhost:9911/db/pdfdb/blob/A/3.pdf
# http://localhost:9911/?*Query=pdf
# http://localhost:9911/?*Query=Boo
# http://localhost:9911/?*Query=knu

(setq
   *Pool "db/pdfdb/"
   *Blob "db/pdfdb/blob/"
   *Port 9911)

#(allowed ("pdfdb/" "img/" )
#   "!work" "@lib.css" "!psh" )

#(allow (pack *Blob "A/") T)
#(allow "*Query")
#(allow "*Get")
#(allow "*Form")
#(allow "*Evt")

(scl 2)
# allow/allowed must be called before (load ...) otherwise it glitches
(load "@lib/http.l" "@lib/xhtml.l" "@lib/form.l")

(symbols T 'pdfdb 'pico)

(class +Pdf +Entity)
(rel nm (+IdxFold +String)) # pdf file name
(rel pdf (+Blob))           # actual file

(dbs
   (0)            # @:64
   (2 +Pdf)       # A:256
   (3 (+Pdf nm))) # B:512

(de main ()
   (locale "US")
   (symbols '(pdfdb pico))
   (call "mkdir" "-p" *Blob)
   (pool *Pool *Dbs) )

(de go ()
   (rollback)
   (println "Port: " *Port)
   (server *Port "!work") )

(de load-pdf (Path)
   (let (N (new! '(+Pdf) 'nm (basename Path)))
      (blob! N 'pdf (path Path)) )
   (commit) )

(de shortStr (Str) (pack (less (chop Str) 40)) )

(de find-pdf (Query)
   (for (Q  (search Query '((nm +Pdf))) (search Q)) (with @ (println (: nm) (blob @ 'pdf)))) )

(de work ()
   (app)
   (action
      (html 0 "PDF DB" "@lib.css" NIL
         (<ping> 2)
         (<h1> NIL "PDF DB")
         (<hr>)
         (<h5> NIL "Upload PDF")
         (form NIL
            (gui '(+UpField) 60)  #; Creates the file upload field
            (gui '(+Drop +Button) '(field -1) "Upload" '(when (: drop) (load-pdf @))))
         (<hr>)
         (<h5> NIL "Search PDF")
         (form NIL
            (gui '*Query '(+TextField) 60 "Query")
            (searchButton '(redirect "http://localhost:9911/?*Query=" (val> (field -1)))) )
         (<br>)
         (for (Q (search (or *Query "pdf") '((nm +Pdf))) (search Q))
            (with @ (<href> (: nm) (blob @ 'pdf) "_blank") (<br>))) ) ) )

