{"id":32183924,"url":"https://github.com/saidone75/cral","last_synced_at":"2026-02-18T22:02:27.127Z","repository":{"id":162961676,"uuid":"638122669","full_name":"saidone75/CRAL","owner":"saidone75","description":"CRAL is a pure Clojure library for consuming Alfresco Content Services public REST API in an idiomatic way","archived":false,"fork":false,"pushed_at":"2026-01-03T10:23:59.000Z","size":1309,"stargazers_count":4,"open_issues_count":0,"forks_count":1,"subscribers_count":2,"default_branch":"main","last_synced_at":"2026-01-09T02:10:41.044Z","etag":null,"topics":["alfresco","clojure","clojure-library"],"latest_commit_sha":null,"homepage":"https://saidone.org","language":"Clojure","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/saidone75.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2023-05-09T06:11:14.000Z","updated_at":"2026-01-03T10:24:03.000Z","dependencies_parsed_at":"2024-04-15T07:29:13.110Z","dependency_job_id":"1b04f6b1-9fb3-4721-95a8-53bfe02e17c6","html_url":"https://github.com/saidone75/CRAL","commit_stats":null,"previous_names":[],"tags_count":11,"template":false,"template_full_name":null,"purl":"pkg:github/saidone75/CRAL","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/saidone75%2FCRAL","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/saidone75%2FCRAL/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/saidone75%2FCRAL/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/saidone75%2FCRAL/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/saidone75","download_url":"https://codeload.github.com/saidone75/CRAL/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/saidone75%2FCRAL/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29596331,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-18T20:59:56.587Z","status":"ssl_error","status_checked_at":"2026-02-18T20:58:41.434Z","response_time":162,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["alfresco","clojure","clojure-library"],"created_at":"2025-10-21T23:14:13.440Z","updated_at":"2026-02-18T22:02:27.121Z","avatar_url":"https://github.com/saidone75.png","language":"Clojure","funding_links":[],"categories":[],"sub_categories":[],"readme":"# CRAL\n*♫ faccio il tifo per la S.P.A.L. / a tressette gioco al C.R.A.L. ♫*\n\n[![Clojars Version](https://img.shields.io/clojars/v/org.saidone/cral)](https://clojars.org/org.saidone/cral)\n[![cljdoc badge](https://cljdoc.org/badge/org.saidone/cral)](https://cljdoc.org/d/org.saidone/cral)\n\nCRAL is a Clojure library for consuming Alfresco Content Services public REST API in an idiomatic way.\n## Outline\n- Lean and readable code\n- pure Clojure\n- 100% test coverage\n- Tuned for GraalVM, can be compiled to native binary (e.g. [graalf](https://github.com/saidone75/graalf))\n## Usage\nRequire the relevant namespaces, e.g.:\n```clojure\n(:require\n  [cral.api.auth :as auth]\n  [cral.api.search :as search]\n  [cral.api.core.nodes :as nodes]\n  [cral.model.core :as model])\n```\nDefault configuration is stored in `config` atom defined in `cral.config`:\n```clojure\n@config/config\n=\u003e\n{:scheme \"http\",\n :host \"localhost\",\n :port 8080,\n :core-path \"alfresco/api/-default-/public/alfresco/versions/1\",\n :search-path \"alfresco/api/-default-/public/search/versions/1\",\n :auth-path \"alfresco/api/-default-/public/authentication/versions/1\"}\n```\nand can be overwritten by passing a map with the new values to `config/configure` fn:\n```clojure\n(config/configure {:scheme \"https\" :port 8983})\n=\u003e\n{:scheme \"https\",\n :host \"localhost\",\n :port 8983,\n :core-path \"alfresco/api/-default-/public/alfresco/versions/1\",\n :search-path \"alfresco/api/-default-/public/search/versions/1\",\n :auth-path \"alfresco/api/-default-/public/authentication/versions/1\"}\n```\nResults are returned as maps that can be easily handled in Clojure, please note that all map keys are converted to proper kebab-case keywords and query parameters as well as POST bodies JSON keys are automatically converted to camel case before they are sent: \n```clojure\n(auth/create-ticket \"admin\" \"admin\")\n=\u003e\n{:status 201, :body {:entry {:id \"TICKET_5905a2c41cf63c003a2044ebdae69aa48691fdc8\", :user-id \"admin\"}}}\n\n(let [ticket (model/map-\u003eTicket (get-in (auth/create-ticket user pass) [:body :entry]))\n      search-request (search/map-\u003eSearchRequest {:query (search/map-\u003eRequestQuery {:query \"PATH:'app:company_home/app:guest_home'\"})})]\n  (search/search ticket search-request))\n=\u003e\n{:status 200,\n :body {:list {:pagination {:count 1, :has-more-items false, :total-items 1, :skip-count 0, :max-items 100},\n               :context {:consistency {:last-tx-id 277}},\n               :entries [{:entry {:is-file false,\n                                  :is-folder true,\n                                  :created-by-user {:id \"System\", :display-name \"System\"},\n                                  :name \"Guest Home\",\n                                  :modified-at \"2023-05-27T12:33:33.089+0000\",\n                                  :node-type \"cm:folder\",\n                                  :search {:score 0.0},\n                                  :id \"443fd8b1-c135-48a2-8c1d-1567777aaa19\",\n                                  :parent-id \"6b4fa714-3a58-411a-8839-179f8e01f728\",\n                                  :modified-by-user {:id \"admin\", :display-name \"Administrator\"},\n                                  :created-at \"2023-05-21T16:46:55.651+0000\",\n                                  :location \"nodes\"}}]}}}\n```\nPOST/PUT bodies and request parameters with well known keys are modeled as records:\n```clojure\n(model/map-\u003eGetNodeQueryParams {:include [\"path\" \"permissions\"]})\n=\u003e\n#cral.model.core.GetNodeQueryParams{:include [\"path\" \"permissions\"], :relative-path nil, :fields nil}\n\n(model/map-\u003eCreateNodeBody {:name (.toString (UUID/randomUUID)) :node-type \"cm:content\"})\n=\u003e\n#cral.model.core.CreateNodeBody{:name \"cfa7c592-e357-4efc-9d91-f5dd98ab910c\", :node-type \"cm:content\", :properties nil}\n```\nbut plain maps can be used as well if desired:\n```clojure\n(let [ticket (get-in (auth/create-ticket user pass) [:body :entry])\n      parent-id (:id (get-guest-home))]\n  (select-keys\n    (get-in (nodes/create-node ticket parent-id {:name \"test\" :node-type \"cm:content\"}) [:body :entry])\n    [:name :node-type :id :parent-id]))\n=\u003e\n{:name \"test\",\n :node-type \"cm:content\",\n :id \"68d9d0e3-8830-427e-b04e-c0109b02a539\",\n :parent-id \"a29adc70-0639-416a-9660-4ed7f247b5a9\"}\n```\n## License\nCopyright (c) 2023-2024 Saidone\n\nDistributed under the GNU General Public License v3.0\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsaidone75%2Fcral","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsaidone75%2Fcral","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsaidone75%2Fcral/lists"}