;;; translation of https://developers.google.com/drive/v3/web/quickstart/java
;;; from Java into Clojure
(set-env! :dependencies '[
;; https://mvnrepository.com/artifact/com.google.api-client/google-api-client
[com.google.api-client/google-api-client "1.22.0"]
;; https://mvnrepository.com/artifact/com.google.oauth-client/google-oauth-client
[com.google.oauth-client/google-oauth-client "1.22.0"]
[com.google.apis/google-api-services-drive "v3-rev65-1.22.0"]
;; https://mvnrepository.com/artifact/com.google.oauth-client/google-oauth-client-java6
[com.google.oauth-client/google-oauth-client-java6 "1.22.0"]
;; https://mvnrepository.com/artifact/com.google.oauth-client/google-oauth-client-jetty
[com.google.oauth-client/google-oauth-client-jetty "1.22.0"]
;; ブラウザで認証した権限を、ブラウザを使ってアプリケーションに委譲するのに使う。
;; ブラウザ操作を促す為に jetty でサーバを立てるという使い方
])
(require '[clojure.java.io :as io])
(def APPLICATION-NAME "Drive API Java Quickstart")
(def DATA-STORE-DIR
"Directory to store user credentials for this application."
(io/file (System/getProperty "user.home")
".credentials/drive-java-quickstart"))
(def client-id-file
"Id and secret.
You can get this file from https://console.developers.google.com/start/api?id=drive"
(io/file (System/getProperty "user.home") "Workspace" "client_id.json"))
(let [^com.google.api.client.json.jackson2.JacksonFactory json-factory
(com.google.api.client.json.jackson2.JacksonFactory/getDefaultInstance)
^java.util.List scopes
(java.util.Arrays/asList (into-array [com.google.api.services.drive.DriveScopes/DRIVE_METADATA_READONLY]))
^com.google.api.client.http.HttpTransport http-transport
(com.google.api.client.googleapis.javanet.GoogleNetHttpTransport/newTrustedTransport)
^com.google.api.client.util.store.FileDataStoreFactory data-store-factory
(com.google.api.client.util.store.FileDataStoreFactory. DATA-STORE-DIR)
^com.google.api.client.googleapis.auth.oauth2.GoogleClientSecrets secret
(com.google.api.client.googleapis.auth.oauth2.GoogleClientSecrets/load
json-factory (io/reader client-id-file))
^com.google.api.client.googleapis.auth.oauth2.GoogleAuthorizationCodeFlow flow
(-> (com.google.api.client.googleapis.auth.oauth2.GoogleAuthorizationCodeFlow$Builder.
http-transport json-factory secret scopes)
(.setDataStoreFactory data-store-factory)
(.setAccessType "offline")
.build)
^com.google.api.client.auth.oauth2.Credential credential
(-> (com.google.api.client.extensions.java6.auth.oauth2.AuthorizationCodeInstalledApp.
flow (com.google.api.client.extensions.jetty.auth.oauth2.LocalServerReceiver.))
(.authorize "user"))
^com.google.api.services.drive.Drive drive
(-> (com.google.api.services.drive.Drive$Builder. http-transport json-factory credential)
(.setApplicationName APPLICATION-NAME)
.build)]
(let [files (-> drive
.files
.list
(.setPageSize (int 10))
(.setFields "nextPageToken, files(id, name)")
.execute
.getFiles)]
(if (and files (pos? (.size files)))
(map (juxt #(.getName %) #(.getId %)) files)
:no-files)))