From 7611308b0ef9d525bbce84426ae04e5d1a93476b Mon Sep 17 00:00:00 2001 From: Joe Nelson Date: Sun, 9 Oct 2016 16:53:41 -0700 Subject: [PATCH 001/711] Sphinx quickstart --- .gitignore | 1 + Makefile | 230 ++++++++++++++++++++++++++++++++++++++++++ conf.py | 286 +++++++++++++++++++++++++++++++++++++++++++++++++++++ index.rst | 22 +++++ 4 files changed, 539 insertions(+) create mode 100644 .gitignore create mode 100644 Makefile create mode 100644 conf.py create mode 100644 index.rst diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000000..e35d8850c9 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +_build diff --git a/Makefile b/Makefile new file mode 100644 index 0000000000..b739a52fff --- /dev/null +++ b/Makefile @@ -0,0 +1,230 @@ +# Makefile for Sphinx documentation +# + +# You can set these variables from the command line. +SPHINXOPTS = +SPHINXBUILD = sphinx-build +PAPER = +BUILDDIR = _build + +# User-friendly check for sphinx-build +ifeq ($(shell which $(SPHINXBUILD) >/dev/null 2>&1; echo $$?), 1) + $(error The '$(SPHINXBUILD)' command was not found. Make sure you have Sphinx installed, then set the SPHINXBUILD environment variable to point to the full path of the '$(SPHINXBUILD)' executable. Alternatively you can add the directory with the executable to your PATH. If you don\'t have Sphinx installed, grab it from http://sphinx-doc.org/) +endif + +# Internal variables. +PAPEROPT_a4 = -D latex_paper_size=a4 +PAPEROPT_letter = -D latex_paper_size=letter +ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . +# the i18n builder cannot share the environment and doctrees with the others +I18NSPHINXOPTS = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . + +.PHONY: help +help: + @echo "Please use \`make ' where is one of" + @echo " html to make standalone HTML files" + @echo " dirhtml to make HTML files named index.html in directories" + @echo " singlehtml to make a single large HTML file" + @echo " pickle to make pickle files" + @echo " json to make JSON files" + @echo " htmlhelp to make HTML files and a HTML help project" + @echo " qthelp to make HTML files and a qthelp project" + @echo " applehelp to make an Apple Help Book" + @echo " devhelp to make HTML files and a Devhelp project" + @echo " epub to make an epub" + @echo " epub3 to make an epub3" + @echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter" + @echo " latexpdf to make LaTeX files and run them through pdflatex" + @echo " latexpdfja to make LaTeX files and run them through platex/dvipdfmx" + @echo " text to make text files" + @echo " man to make manual pages" + @echo " texinfo to make Texinfo files" + @echo " info to make Texinfo files and run them through makeinfo" + @echo " gettext to make PO message catalogs" + @echo " changes to make an overview of all changed/added/deprecated items" + @echo " xml to make Docutils-native XML files" + @echo " pseudoxml to make pseudoxml-XML files for display purposes" + @echo " linkcheck to check all external links for integrity" + @echo " doctest to run all doctests embedded in the documentation (if enabled)" + @echo " coverage to run coverage check of the documentation (if enabled)" + @echo " dummy to check syntax errors of document sources" + +.PHONY: clean +clean: + rm -rf $(BUILDDIR)/* + +.PHONY: html +html: + $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html + @echo + @echo "Build finished. The HTML pages are in $(BUILDDIR)/html." + +.PHONY: dirhtml +dirhtml: + $(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml + @echo + @echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml." + +.PHONY: singlehtml +singlehtml: + $(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml + @echo + @echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml." + +.PHONY: pickle +pickle: + $(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle + @echo + @echo "Build finished; now you can process the pickle files." + +.PHONY: json +json: + $(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json + @echo + @echo "Build finished; now you can process the JSON files." + +.PHONY: htmlhelp +htmlhelp: + $(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp + @echo + @echo "Build finished; now you can run HTML Help Workshop with the" \ + ".hhp project file in $(BUILDDIR)/htmlhelp." + +.PHONY: qthelp +qthelp: + $(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp + @echo + @echo "Build finished; now you can run "qcollectiongenerator" with the" \ + ".qhcp project file in $(BUILDDIR)/qthelp, like this:" + @echo "# qcollectiongenerator $(BUILDDIR)/qthelp/PostgREST.qhcp" + @echo "To view the help file:" + @echo "# assistant -collectionFile $(BUILDDIR)/qthelp/PostgREST.qhc" + +.PHONY: applehelp +applehelp: + $(SPHINXBUILD) -b applehelp $(ALLSPHINXOPTS) $(BUILDDIR)/applehelp + @echo + @echo "Build finished. The help book is in $(BUILDDIR)/applehelp." + @echo "N.B. You won't be able to view it unless you put it in" \ + "~/Library/Documentation/Help or install it in your application" \ + "bundle." + +.PHONY: devhelp +devhelp: + $(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp + @echo + @echo "Build finished." + @echo "To view the help file:" + @echo "# mkdir -p $$HOME/.local/share/devhelp/PostgREST" + @echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/PostgREST" + @echo "# devhelp" + +.PHONY: epub +epub: + $(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub + @echo + @echo "Build finished. The epub file is in $(BUILDDIR)/epub." + +.PHONY: epub3 +epub3: + $(SPHINXBUILD) -b epub3 $(ALLSPHINXOPTS) $(BUILDDIR)/epub3 + @echo + @echo "Build finished. The epub3 file is in $(BUILDDIR)/epub3." + +.PHONY: latex +latex: + $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex + @echo + @echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex." + @echo "Run \`make' in that directory to run these through (pdf)latex" \ + "(use \`make latexpdf' here to do that automatically)." + +.PHONY: latexpdf +latexpdf: + $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex + @echo "Running LaTeX files through pdflatex..." + $(MAKE) -C $(BUILDDIR)/latex all-pdf + @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex." + +.PHONY: latexpdfja +latexpdfja: + $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex + @echo "Running LaTeX files through platex and dvipdfmx..." + $(MAKE) -C $(BUILDDIR)/latex all-pdf-ja + @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex." + +.PHONY: text +text: + $(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text + @echo + @echo "Build finished. The text files are in $(BUILDDIR)/text." + +.PHONY: man +man: + $(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man + @echo + @echo "Build finished. The manual pages are in $(BUILDDIR)/man." + +.PHONY: texinfo +texinfo: + $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo + @echo + @echo "Build finished. The Texinfo files are in $(BUILDDIR)/texinfo." + @echo "Run \`make' in that directory to run these through makeinfo" \ + "(use \`make info' here to do that automatically)." + +.PHONY: info +info: + $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo + @echo "Running Texinfo files through makeinfo..." + make -C $(BUILDDIR)/texinfo info + @echo "makeinfo finished; the Info files are in $(BUILDDIR)/texinfo." + +.PHONY: gettext +gettext: + $(SPHINXBUILD) -b gettext $(I18NSPHINXOPTS) $(BUILDDIR)/locale + @echo + @echo "Build finished. The message catalogs are in $(BUILDDIR)/locale." + +.PHONY: changes +changes: + $(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes + @echo + @echo "The overview file is in $(BUILDDIR)/changes." + +.PHONY: linkcheck +linkcheck: + $(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck + @echo + @echo "Link check complete; look for any errors in the above output " \ + "or in $(BUILDDIR)/linkcheck/output.txt." + +.PHONY: doctest +doctest: + $(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest + @echo "Testing of doctests in the sources finished, look at the " \ + "results in $(BUILDDIR)/doctest/output.txt." + +.PHONY: coverage +coverage: + $(SPHINXBUILD) -b coverage $(ALLSPHINXOPTS) $(BUILDDIR)/coverage + @echo "Testing of coverage in the sources finished, look at the " \ + "results in $(BUILDDIR)/coverage/python.txt." + +.PHONY: xml +xml: + $(SPHINXBUILD) -b xml $(ALLSPHINXOPTS) $(BUILDDIR)/xml + @echo + @echo "Build finished. The XML files are in $(BUILDDIR)/xml." + +.PHONY: pseudoxml +pseudoxml: + $(SPHINXBUILD) -b pseudoxml $(ALLSPHINXOPTS) $(BUILDDIR)/pseudoxml + @echo + @echo "Build finished. The pseudo-XML files are in $(BUILDDIR)/pseudoxml." + +.PHONY: dummy +dummy: + $(SPHINXBUILD) -b dummy $(ALLSPHINXOPTS) $(BUILDDIR)/dummy + @echo + @echo "Build finished. Dummy builder generates no files." diff --git a/conf.py b/conf.py new file mode 100644 index 0000000000..8c6802b3fe --- /dev/null +++ b/conf.py @@ -0,0 +1,286 @@ +# -*- coding: utf-8 -*- +# +# PostgREST documentation build configuration file, created by +# sphinx-quickstart on Sun Oct 9 16:53:00 2016. +# +# This file is execfile()d with the current directory set to its +# containing dir. +# +# Note that not all possible configuration values are present in this +# autogenerated file. +# +# All configuration values have a default; values that are commented out +# serve to show the default. + +import sys +import os + +# If extensions (or modules to document with autodoc) are in another directory, +# add these directories to sys.path here. If the directory is relative to the +# documentation root, use os.path.abspath to make it absolute, like shown here. +#sys.path.insert(0, os.path.abspath('.')) + +# -- General configuration ------------------------------------------------ + +# If your documentation needs a minimal Sphinx version, state it here. +#needs_sphinx = '1.0' + +# Add any Sphinx extension module names here, as strings. They can be +# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom +# ones. +extensions = [] + +# Add any paths that contain templates here, relative to this directory. +templates_path = ['_templates'] + +# The suffix(es) of source filenames. +# You can specify multiple suffix as a list of string: +# source_suffix = ['.rst', '.md'] +source_suffix = '.rst' + +# The encoding of source files. +#source_encoding = 'utf-8-sig' + +# The master toctree document. +master_doc = 'index' + +# General information about the project. +project = u'PostgREST' +copyright = u'2016, Joe Nelson' +author = u'Joe Nelson' + +# The version info for the project you're documenting, acts as replacement for +# |version| and |release|, also used in various other places throughout the +# built documents. +# +# The short X.Y version. +version = u'0.4' +# The full version, including alpha/beta/rc tags. +release = u'0.4.0.0' + +# The language for content autogenerated by Sphinx. Refer to documentation +# for a list of supported languages. +# +# This is also used if you do content translation via gettext catalogs. +# Usually you set "language" from the command line for these cases. +language = None + +# There are two options for replacing |today|: either, you set today to some +# non-false value, then it is used: +#today = '' +# Else, today_fmt is used as the format for a strftime call. +#today_fmt = '%B %d, %Y' + +# List of patterns, relative to source directory, that match files and +# directories to ignore when looking for source files. +# This patterns also effect to html_static_path and html_extra_path +exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store'] + +# The reST default role (used for this markup: `text`) to use for all +# documents. +#default_role = None + +# If true, '()' will be appended to :func: etc. cross-reference text. +#add_function_parentheses = True + +# If true, the current module name will be prepended to all description +# unit titles (such as .. function::). +#add_module_names = True + +# If true, sectionauthor and moduleauthor directives will be shown in the +# output. They are ignored by default. +#show_authors = False + +# The name of the Pygments (syntax highlighting) style to use. +pygments_style = 'sphinx' + +# A list of ignored prefixes for module index sorting. +#modindex_common_prefix = [] + +# If true, keep warnings as "system message" paragraphs in the built documents. +#keep_warnings = False + +# If true, `todo` and `todoList` produce output, else they produce nothing. +todo_include_todos = False + + +# -- Options for HTML output ---------------------------------------------- + +# The theme to use for HTML and HTML Help pages. See the documentation for +# a list of builtin themes. +html_theme = 'alabaster' + +# Theme options are theme-specific and customize the look and feel of a theme +# further. For a list of options available for each theme, see the +# documentation. +#html_theme_options = {} + +# Add any paths that contain custom themes here, relative to this directory. +#html_theme_path = [] + +# The name for this set of Sphinx documents. +# " v documentation" by default. +#html_title = u'PostgREST v0.4.0.0' + +# A shorter title for the navigation bar. Default is the same as html_title. +#html_short_title = None + +# The name of an image file (relative to this directory) to place at the top +# of the sidebar. +#html_logo = None + +# The name of an image file (relative to this directory) to use as a favicon of +# the docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32 +# pixels large. +#html_favicon = None + +# Add any paths that contain custom static files (such as style sheets) here, +# relative to this directory. They are copied after the builtin static files, +# so a file named "default.css" will overwrite the builtin "default.css". +html_static_path = ['_static'] + +# Add any extra paths that contain custom files (such as robots.txt or +# .htaccess) here, relative to this directory. These files are copied +# directly to the root of the documentation. +#html_extra_path = [] + +# If not None, a 'Last updated on:' timestamp is inserted at every page +# bottom, using the given strftime format. +# The empty string is equivalent to '%b %d, %Y'. +#html_last_updated_fmt = None + +# If true, SmartyPants will be used to convert quotes and dashes to +# typographically correct entities. +#html_use_smartypants = True + +# Custom sidebar templates, maps document names to template names. +#html_sidebars = {} + +# Additional templates that should be rendered to pages, maps page names to +# template names. +#html_additional_pages = {} + +# If false, no module index is generated. +#html_domain_indices = True + +# If false, no index is generated. +#html_use_index = True + +# If true, the index is split into individual pages for each letter. +#html_split_index = False + +# If true, links to the reST sources are added to the pages. +#html_show_sourcelink = True + +# If true, "Created using Sphinx" is shown in the HTML footer. Default is True. +#html_show_sphinx = True + +# If true, "(C) Copyright ..." is shown in the HTML footer. Default is True. +#html_show_copyright = True + +# If true, an OpenSearch description file will be output, and all pages will +# contain a tag referring to it. The value of this option must be the +# base URL from which the finished HTML is served. +#html_use_opensearch = '' + +# This is the file name suffix for HTML files (e.g. ".xhtml"). +#html_file_suffix = None + +# Language to be used for generating the HTML full-text search index. +# Sphinx supports the following languages: +# 'da', 'de', 'en', 'es', 'fi', 'fr', 'hu', 'it', 'ja' +# 'nl', 'no', 'pt', 'ro', 'ru', 'sv', 'tr', 'zh' +#html_search_language = 'en' + +# A dictionary with options for the search language support, empty by default. +# 'ja' uses this config value. +# 'zh' user can custom change `jieba` dictionary path. +#html_search_options = {'type': 'default'} + +# The name of a javascript file (relative to the configuration directory) that +# implements a search results scorer. If empty, the default will be used. +#html_search_scorer = 'scorer.js' + +# Output file base name for HTML help builder. +htmlhelp_basename = 'PostgRESTdoc' + +# -- Options for LaTeX output --------------------------------------------- + +latex_elements = { +# The paper size ('letterpaper' or 'a4paper'). +#'papersize': 'letterpaper', + +# The font size ('10pt', '11pt' or '12pt'). +#'pointsize': '10pt', + +# Additional stuff for the LaTeX preamble. +#'preamble': '', + +# Latex figure (float) alignment +#'figure_align': 'htbp', +} + +# Grouping the document tree into LaTeX files. List of tuples +# (source start file, target name, title, +# author, documentclass [howto, manual, or own class]). +latex_documents = [ + (master_doc, 'PostgREST.tex', u'PostgREST Documentation', + u'Joe Nelson', 'manual'), +] + +# The name of an image file (relative to this directory) to place at the top of +# the title page. +#latex_logo = None + +# For "manual" documents, if this is true, then toplevel headings are parts, +# not chapters. +#latex_use_parts = False + +# If true, show page references after internal links. +#latex_show_pagerefs = False + +# If true, show URL addresses after external links. +#latex_show_urls = False + +# Documents to append as an appendix to all manuals. +#latex_appendices = [] + +# If false, no module index is generated. +#latex_domain_indices = True + + +# -- Options for manual page output --------------------------------------- + +# One entry per manual page. List of tuples +# (source start file, name, description, authors, manual section). +man_pages = [ + (master_doc, 'postgrest', u'PostgREST Documentation', + [author], 1) +] + +# If true, show URL addresses after external links. +#man_show_urls = False + + +# -- Options for Texinfo output ------------------------------------------- + +# Grouping the document tree into Texinfo files. List of tuples +# (source start file, target name, title, author, +# dir menu entry, description, category) +texinfo_documents = [ + (master_doc, 'PostgREST', u'PostgREST Documentation', + author, 'PostgREST', 'One line description of project.', + 'Miscellaneous'), +] + +# Documents to append as an appendix to all manuals. +#texinfo_appendices = [] + +# If false, no module index is generated. +#texinfo_domain_indices = True + +# How to display URL addresses: 'footnote', 'no', or 'inline'. +#texinfo_show_urls = 'footnote' + +# If true, do not generate a @detailmenu in the "Top" node's menu. +#texinfo_no_detailmenu = False diff --git a/index.rst b/index.rst new file mode 100644 index 0000000000..8c055322db --- /dev/null +++ b/index.rst @@ -0,0 +1,22 @@ +.. PostgREST documentation master file, created by + sphinx-quickstart on Sun Oct 9 16:53:00 2016. + You can adapt this file completely to your liking, but it should at least + contain the root `toctree` directive. + +Welcome to PostgREST's documentation! +===================================== + +Contents: + +.. toctree:: + :maxdepth: 2 + + + +Indices and tables +================== + +* :ref:`genindex` +* :ref:`modindex` +* :ref:`search` + From debf4dc7153f302911e70b0c8e5affbcc8ed7e46 Mon Sep 17 00:00:00 2001 From: Joe Nelson Date: Sun, 9 Oct 2016 22:16:13 -0700 Subject: [PATCH 002/711] Adjustment --- index.rst | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/index.rst b/index.rst index 8c055322db..23b0de3218 100644 --- a/index.rst +++ b/index.rst @@ -10,13 +10,3 @@ Contents: .. toctree:: :maxdepth: 2 - - - -Indices and tables -================== - -* :ref:`genindex` -* :ref:`modindex` -* :ref:`search` - From 577cf29f64aa68c5a1c89e1b8d84528ed6a1cd37 Mon Sep 17 00:00:00 2001 From: Joe Nelson Date: Mon, 10 Oct 2016 01:15:33 -0700 Subject: [PATCH 003/711] Intro section --- _static/logo.png | Bin 0 -> 8149 bytes index.rst | 55 +++++++++++++++++++++++----- intro.rst | 92 +++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 138 insertions(+), 9 deletions(-) create mode 100644 _static/logo.png create mode 100644 intro.rst diff --git a/_static/logo.png b/_static/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..030673cfbaa40c2bc994436ff1aa67cab3a01d0e GIT binary patch literal 8149 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 UW`QN$zZL`JrIn<9Ng4$HAD&l41^@s6 literal 0 HcmV?d00001 diff --git a/index.rst b/index.rst index 23b0de3218..c3fbe2bcba 100644 --- a/index.rst +++ b/index.rst @@ -1,12 +1,49 @@ -.. PostgREST documentation master file, created by - sphinx-quickstart on Sun Oct 9 16:53:00 2016. - You can adapt this file completely to your liking, but it should at least - contain the root `toctree` directive. - -Welcome to PostgREST's documentation! -===================================== - -Contents: +.. image:: _static/logo.png .. toctree:: :maxdepth: 2 + +.. toctree:: + :caption: What is PostgREST? + + intro.rst + +.. Installation +.. Binary Release +.. Build from Source +.. Docker +.. API +.. Tables and Views +.. Filtering +.. Ordering +.. Limits and Pagination +.. Counting +.. Response Format +.. Singular or Plural +.. OpenAPI Support +.. Resource Embedding +.. Query Limitations +.. Stored Procedures +.. Insertions / Updates +.. Getting Results +.. Bulk Insert +.. Deletions +.. Authentication +.. Overview of Role System +.. JSON Web Tokens +.. Internal Generation +.. External Generation +.. SSL +.. Custom Validation +.. Schema Isolation +.. User Management +.. Logins +.. Password Reset +.. Administration +.. Block full-table operations +.. Alternate URL structure +.. API Versioning +.. HTTP Caching +.. Database Caching +.. Debugging +.. (viewing db logs) diff --git a/intro.rst b/intro.rst new file mode 100644 index 0000000000..4d070f6fc2 --- /dev/null +++ b/intro.rst @@ -0,0 +1,92 @@ +Motivation +########## + +PostgREST is a standalone web server that turns your PostgreSQL database directly into a RESTful API. The structural constraints and permissions in the database determine the API endpoints and operations. + +Using PostgREST is an alternative to manual CRUD programming. Custom API servers suffer problems. Writing business logic often duplicates, ignores or hobbles database structure. Object-relational mapping is a leaky abstraction leading to slow imperative code. The PostgREST philosophy establishes a single declarative source of truth: the data itself. + +Declarative Programming +----------------------- + +It's easier to ask PostgreSQL to join data for you and let its query planner figure out the details than to loop through rows yourself. It's easier to assign permissions to db objects than to add guards in controllers. (This is especially true for cascading permissions in data dependencies.) It's easier set constraints than to litter code with sanity checks. + +Leakproof Abstraction +--------------------- + +There is no ORM involved. Creating new views happens in SQL with known performance implications. A database administrator can now create an API from scratch with no custom programming. + +Embracing the Relational Model +------------------------------ + +In 1970 E. F. Codd criticized the then-dominant hierarchical model of databases in his article A Relational Model of Data for Large Shared Data Banks. Reading the article reveals a striking similarity between hierarchical databases and nested http routes. With PostgREST we attempt to use flexible filtering and embedding rather than nested routes. + +One Thing Well +-------------- + +PostgREST has a focused scope. It works well with other tools like Nginx. This forces you to cleanly separate the data-centric CRUD operations from other concerns. Use a collection of sharp tools rather than building a big ball of mud. + +Shared Improvements +------------------- + +As with any open source project, we all gain from features and fixes in the tool. It's more beneficial than improvements locked inextricably within custom codebases. + +Ecosystem +######### + +PostgREST has a growing ecosystem of examples, and libraries, experiments, and users. Here is a selection. + +Client-Side Libraries +--------------------- + +* `hugomrdias/postgrest-url `_ - JS, just for generating query URLs +* `john-kelly/elm-postgrest `_ - Elm +* `mithril.postgrest `_ - JS, Mithril +* `thejettdurham/postgrest-sharp-client `_ - C#, RestSharp +* `lewisjared/postgrest-request `_ - JS, SuperAgent +* `JarvusInnovations/jarvus-postgrest-apikit `_ - JS, Sencha framework +* `davidthewatson/postgrest_python_requests_client `_ - Python +* `calebmer/postgrest-client `_ - JS + +Extensions +---------- + +* `diogob/postgrest-ws `_ - expose web sockets for PostgreSQL's LISTEN/NOTIFY +* `srid/spas `_ - allow file uploads and basic auth +* `svmnotn/postgrest-auth `_ - OAuth2-inspired external auth server +* `nblumoe/postgrest-oauth `_ - OAuth2 WAI middleware + +Example Apps +------------ + +* `CodeforAustralia/heritage-near-me `_ - Elm and PostgREST with PostGIS +* `timwis/handsontable-postgrest `_ - An excel-like database table editor +* `Recmo/PostgrestSkeleton `_ - Docker Compose, PostgREST, Nginx and Auth0 +* `benoror/ember-postgrest-dynamic-ui `_ - generating Ember forms to edit data +* `ruslantalpa/blogdemo `_ - blog api demo in a vagrant image +* `timwis/ext-postgrest-crud `_ - browser-based spreadsheet +* `srid/chronicle `_ - tracking a tree of personal memories +* `diogob/elm-workshop `_ - building a simple database query UI +* `marmelab/ng-admin-postgrest `_ - automatic database admin panel +* `myfreeweb/moneylog `_ - accounting web app in Polymer + PostgREST +* `tyrchen/goodfilm `_ - example film api +* `begriffs/postgrest-example `_ - sqitch versioning for API + +In Production +------------- + +* `Catarse `_ +* `iAdvize `_ +* `Redsmin `_ +* `Image-charts `_ +* `Drip Depot `_ + +Commercial PaaS +--------------- + +* `Sub0 `_ - Automated GraphQL & REST API with built-in caching (powered by PostgREST) + + +Getting Support +################ + +The project has a friendly and growing community. Join our `chat room `_ for discussion and help. You can also report or search for bugs/features on the Github `issues `_ page. From 0060e8906db0e1608767a447485c86883410a6c2 Mon Sep 17 00:00:00 2001 From: Joe Nelson Date: Mon, 10 Oct 2016 01:22:52 -0700 Subject: [PATCH 004/711] Allow RTD to use its nicer theme --- conf.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf.py b/conf.py index 8c6802b3fe..bcc453897d 100644 --- a/conf.py +++ b/conf.py @@ -108,7 +108,7 @@ # The theme to use for HTML and HTML Help pages. See the documentation for # a list of builtin themes. -html_theme = 'alabaster' +html_theme = 'default' # Theme options are theme-specific and customize the look and feel of a theme # further. For a list of options available for each theme, see the From 6e82a55d68bf2657ff44aca34801ded8f695a1c5 Mon Sep 17 00:00:00 2001 From: Joe Nelson Date: Mon, 10 Oct 2016 09:53:43 -0700 Subject: [PATCH 005/711] Installation page --- index.rst | 5 ++++ install.rst | 78 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 83 insertions(+) create mode 100644 install.rst diff --git a/index.rst b/index.rst index c3fbe2bcba..7614a96d48 100644 --- a/index.rst +++ b/index.rst @@ -8,6 +8,11 @@ intro.rst +.. toctree:: + :caption: Installation + + install.rst + .. Installation .. Binary Release .. Build from Source diff --git a/install.rst b/install.rst new file mode 100644 index 0000000000..11fcfe2ac7 --- /dev/null +++ b/install.rst @@ -0,0 +1,78 @@ +Binary Release +============== + +The `release page `_ has precompiled binaries for Mac OS X, Windows, and several Linux distros. Extract the tarball and run the binary inside with the :code:`--help` flag to see usage instructions: + +.. code-block:: bash + + # Untar the release (available at https://github.com/begriffs/postgrest/releases/latest) + + $ tar zxf postgrest-[version]-[platform].tar.xz + + # Try running it + $ ./postgrest --help + + # You should see a usage help message + +Build from Source +================= + +When a prebuilt binary does not exist for your system you can build the project from source. You'll also need to do this if you want to help with development. `Stack `_ makes it easy. It will install any necessary Haskell dependencies on your system. + +* `Install Stack `_ for your platform +* Install Library Dependencies + + ===================== ============================ + Operating System Dependencies + ===================== ============================ + Ubuntu/Debian libpq-dev + CentOS/Fedora/Red Hat postgresql-devel, zlib-devel + BSD postgresql95-server + ===================== ============================ + +* Build and install binary + + .. code-block:: bash + + git clone https://github.com/begriffs/postgrest.git + cd postgrest + stack build --install-ghc + sudo stack install --allow-different-user --local-bin-path /usr/local/bin + +* Check that the server is installed: :code:`postgrest --help`. + +If you want to run the test suite, stack can do that too: :code:`stack test`. + +PostgreSQL dependency +===================== + +To use PostgREST you will need an underlying database (PostgreSQL version 9.3 or greater is required). You can use something like Amazon `RDS `_ but installing your own locally is cheaper and more convenient for development. + +* `Instructions for OS X `_ +* `Instructions for Ubuntu 14.04 `_ +* `Installer for Windows `_ + +Homebrew +======== + +You can use the Homebrew package manager to install PostgREST on Mac + +.. code-block:: bash + + # Ensure brew is up to date + brew update + + # Check for any problems with brew's setup + brew doctor + + # Install the postgrest package + brew install postgrest + +This will automatically install PostgreSQL as a dependency. The process tends to take up to 15 minutes to install the package and its dependencies. + +After installation completes, the tool is added to your $PATH and can be used from anywhere with: + +.. code-block:: bash + + postgrest --help + From c0791a5f212b764622cacb0bf3681f0fd796b0ce Mon Sep 17 00:00:00 2001 From: Joe Nelson Date: Mon, 10 Oct 2016 10:30:31 -0700 Subject: [PATCH 006/711] WIP: api page --- api.rst | 149 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ index.rst | 25 ++------- 2 files changed, 154 insertions(+), 20 deletions(-) create mode 100644 api.rst diff --git a/api.rst b/api.rst new file mode 100644 index 0000000000..1e3afb42b6 --- /dev/null +++ b/api.rst @@ -0,0 +1,149 @@ +Tables and Views +================ + +All views and tables in the active schema and accessible by the active database role for a request are available for querying. They are exposed in one-level deep routes. For instance the full contents of a table `people` is returned at + +.. code-block:: HTTP + + GET /people + +There are no deeply/nested/routes. Each route provides OPTIONS, GET, POST, PATCH, and DELETE verbs depending entirely on database permissions. + +.. note:: + + Why not provide nested routes? Many APIs allow nesting to retrieve related information, such as :code:`/films/1/director`. We offer a more flexible mechanism (inspired by GraphQL) to embed related information. It can handle one-to-many and many-to-many relationships. This is covered in the section about Embedding. + +Filtering +--------- + +You can filter result rows by adding conditions on columns, each condition a query string parameter. For instance, to return people aged under 13 years old: + +.. code-block:: http + + GET /people?age=lt.13 + +Adding multiple parameters conjoins the conditions: + +.. code-block:: http + + GET /people?age=gte.18&student=is.true + +These operators are available: + +============ ============================================= +abbreviation meaning +============ ============================================= +eq equals +gte greater than or equal +gt greater than +lte less than or equal +lt less than +neq not equal +like LIKE operator (use * in place of %) +ilike ILIKE operator (use * in place of %) +in one of a list of values e.g. :code:`?a=in.1,2,3` +is checking for exact equality (null,true,false) +@@ full-text search using to_tsquery +@> contains e.g. :code:`?tags=@>.{example, new}` +<@ contained in e.g. :code:`?values=<@{1,2,3}` +not negates another operator, see below +============ ============================================= + + +To negate any operator, prefix it with :code:`not` like :code:`?a=not.eq.2`. + +For more complicated filters (such as those involving condition 1 OR condition 2) you will have to create a new view in the database. + +.. _computed_cols: + +Computed Columns +~~~~~~~~~~~~~~~~ + +Filters may be applied to computed columns as well as actual table/view columns, even though the computed columns will not appear in the output. For example, to search first and last names at once we can create a computed column that will not appear in the output but can be used in a filter: + +.. code-block:: sql + + CREATE TABLE people ( + fname text, + lname text + ); + + CREATE FUNCTION full_name(people) RETURNS text AS $$ + SELECT $1.fname || ' ' || $1.lname; + $$ LANGUAGE SQL; + + # (optional) add an index to speed up anticipated query + CREATE INDEX people_full_name_idx ON people + USING GIN (to_tsvector('english', fname || ' ' || lname)); + +A full-text search on the computed column: + +.. code-block:: http + + GET /people?full_name=@@.Beckett + +Ordering +-------- + +The reserved word :code:`order` reorders the response rows. It uses a comma-separated list of columns and directions: + +.. code-block:: http + + GET /people?order=age.desc,height.asc + +If no direction is specified it defaults to ascending order: + +.. code-block:: http + + GET /people?order=age + +If you care where nulls are sorted, add nullsfirst or nullslast: + +.. code-block:: http + + GET /people?order=age.nullsfirst + GET /people?order=age.desc.nullslast + +To order the embedded items, you need to specify the tree path for the order param like so. + +.. code-block:: http + + GET /projects?select=id,name,tasks{id,name}&order=id.asc&tasks.order=name.asc + +You can also use :ref:`computed_cols` to order the results, even though the computed columns will not appear in the output. + +Limits and Pagination +--------------------- + +Counting +-------- + +Response Format +--------------- + +Singular or Plural +------------------ + +OpenAPI Support +=============== + +Resource Embedding +================== + +Query Limitations +================= + +Stored Procedures +================= + +Insertions / Updates +==================== + +Getting Results +--------------- + +Bulk Insert +----------- + +Deletions +========= diff --git a/index.rst b/index.rst index 7614a96d48..4e6582abf9 100644 --- a/index.rst +++ b/index.rst @@ -13,26 +13,11 @@ install.rst -.. Installation -.. Binary Release -.. Build from Source -.. Docker -.. API -.. Tables and Views -.. Filtering -.. Ordering -.. Limits and Pagination -.. Counting -.. Response Format -.. Singular or Plural -.. OpenAPI Support -.. Resource Embedding -.. Query Limitations -.. Stored Procedures -.. Insertions / Updates -.. Getting Results -.. Bulk Insert -.. Deletions +.. toctree:: + :caption: API + + api.rst + .. Authentication .. Overview of Role System .. JSON Web Tokens From 5cd719bdfffa4e792036701c9207407b9a5d1fc7 Mon Sep 17 00:00:00 2001 From: Joe Nelson Date: Mon, 10 Oct 2016 11:14:11 -0700 Subject: [PATCH 007/711] Limits and offsets --- api.rst | 52 ++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 50 insertions(+), 2 deletions(-) diff --git a/api.rst b/api.rst index 1e3afb42b6..7063703223 100644 --- a/api.rst +++ b/api.rst @@ -115,8 +115,56 @@ You can also use :ref:`computed_cols` to order the results, even though the comp Limits and Pagination --------------------- -Counting --------- +PostgREST uses HTTP range headers to describe the size of results. Every response contains the current range and, if requested, the total number of results: + +.. code-block:: http + + Range-Unit: items + Content-Range: 0-14/* + +Here items zero through fourteen are returned. This information is available in every response and can help you render pagination controls on the client. This is an RFC7233-compliant solution that keeps the response JSON cleaner. + +There are two ways to apply a limit and offset rows: through request headers or query params. When using headers you specify the range of rows desired. This request gets the first twenty people. + +.. code-block:: http + + GET /people + Range-Unit: items + Range: 0-19 + +Note that the server may respond with fewer if unable to meet your request: + +.. code-block:: http + + Range-Unit: items + Content-Range: 0-17/* + +You may also request open-ended ranges for an offset with no limit, e.g. :code:`Range: 10-`. + +The other way to request a limit or offset is with query pamameters. For example + +.. code-block:: http + + GET /people?limit=15&offset=30 + +This method is also useful for embedded resources, which we will cover in another section. The server always responds with range headers even if you use query parameters to limit the query. + +In order to obtain the total size of the table or view (such as when rendering the last page link in a pagination control), specify your preference in a request header: + + +.. code-block:: http + + GET /bigtable + Range-Unit: items + Range: 0-24 + Prefer: count=exact + +Note that the larger the table the slower this query runs in the database. The server will respond with the selected range and total + +.. code-block:: http + + Range-Unit: items + Content-Range: 0-24/3573458 Response Format --------------- From 3025e18b3a278fadd456284a2a106e259702ba09 Mon Sep 17 00:00:00 2001 From: Joe Nelson Date: Fri, 14 Oct 2016 13:37:51 -0700 Subject: [PATCH 008/711] Alpine linux warning --- install.rst | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/install.rst b/install.rst index 11fcfe2ac7..5edde5e553 100644 --- a/install.rst +++ b/install.rst @@ -17,6 +17,10 @@ The `release page `_ has Build from Source ================= +.. note:: + + We discourage building and using PostgREST on **Alpine Linux** because of a reported GHC memory leak on that platform. + When a prebuilt binary does not exist for your system you can build the project from source. You'll also need to do this if you want to help with development. `Stack `_ makes it easy. It will install any necessary Haskell dependencies on your system. * `Install Stack `_ for your platform From 98a776f2dc6760dfcc2356805147cfc4e68d9faf Mon Sep 17 00:00:00 2001 From: Joe Nelson Date: Sat, 15 Oct 2016 16:54:36 -0700 Subject: [PATCH 009/711] Overview of role system --- _static/security-anon-choice.png | Bin 0 -> 31513 bytes _static/security-roles.png | Bin 0 -> 46364 bytes auth.rst | 61 +++++++++++++++++++++++++++++++ index.rst | 5 +++ 4 files changed, 66 insertions(+) create mode 100644 _static/security-anon-choice.png create mode 100644 _static/security-roles.png create mode 100644 auth.rst diff --git a/_static/security-anon-choice.png b/_static/security-anon-choice.png new file mode 100644 index 0000000000000000000000000000000000000000..ea02a237e6f61dc9430e96e2dff6567322059266 GIT binary patch literal 31513 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�t;Y~_Hb$OFhK3_nUNnF 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 literal 0 HcmV?d00001 diff --git a/auth.rst b/auth.rst new file mode 100644 index 0000000000..9ddbc23a64 --- /dev/null +++ b/auth.rst @@ -0,0 +1,61 @@ +Overview of Role System +======================= + +PostgREST is designed to keep the database at the center of API security. All authorization happens through database roles and permissions. It is PostgREST's job to authenticate requests -- i.e. verify that a client is who they say they are -- and then let the database authorize client actions. + +There are three *types* of roles used by PostgREST, the **authenticator**, **anonymous** and **user** roles. The database administrator creates these roles and configures PostgREST to use them. + +.. image:: _static/security-roles.png + +The authenticator should be configured in the db to have very limited access. It is a chameleon whose job is to "become" other users to service authenticated HTTP requests. The picture below shows how the server handles authentication. If auth succeeds, it switches into the user role specified by the request, otherwise it switches into the anonymous role. + +.. image:: _static/security-anon-choice.png + +Here are the technical details. We use `JSON Web Tokens `_ to authenticate API requests. As you'll recall a JWT contains a list of cryptographically signed claims. All claims are allowed but PostgREST cares specifically about a claim called role. + +.. code:: json + + { + "role": "user123" + } + +When a request contains a valid JWT with a role claim PostgREST will switch to the database role with that name for the duration of the HTTP request. + +.. code:: sql + + SET LOCAL ROLE user123; + +Note that the database administrator must allow the authenticator role to switch into this user by previously executing + +.. code:: sql + + GRANT user123 TO authenticator; + +If the client included no JWT (or one without a role claim) then PostgREST switches into the anonymous role whos actual database-specific name, like that of with the authenticator role, is specified in the PostgREST server configuration file. + +JSON Web Tokens +=============== + +Internal Generation +------------------- + +External Generation +------------------- + +SSL +=== + +Custom Validation +================= + +Schema Isolation +================ + +User Management +=============== + +Logins +------ + +Password Reset +-------------- diff --git a/index.rst b/index.rst index 4e6582abf9..39bf27b4cb 100644 --- a/index.rst +++ b/index.rst @@ -18,6 +18,11 @@ api.rst +.. toctree:: + :caption: Authentication + + auth.rst + .. Authentication .. Overview of Role System .. JSON Web Tokens From d00bb026b6e3bcf13cdb4746d4877f19cace0f01 Mon Sep 17 00:00:00 2001 From: Joe Nelson Date: Sat, 15 Oct 2016 18:14:50 -0700 Subject: [PATCH 010/711] pre-request function docs --- auth.rst | 52 +++++++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 45 insertions(+), 7 deletions(-) diff --git a/auth.rst b/auth.rst index 9ddbc23a64..cce3492385 100644 --- a/auth.rst +++ b/auth.rst @@ -3,11 +3,11 @@ Overview of Role System PostgREST is designed to keep the database at the center of API security. All authorization happens through database roles and permissions. It is PostgREST's job to authenticate requests -- i.e. verify that a client is who they say they are -- and then let the database authorize client actions. -There are three *types* of roles used by PostgREST, the **authenticator**, **anonymous** and **user** roles. The database administrator creates these roles and configures PostgREST to use them. +There are three types of roles used by PostgREST, the **authenticator**, **anonymous** and **user** roles. The database administrator creates these roles and configures PostgREST to use them. .. image:: _static/security-roles.png -The authenticator should be configured in the db to have very limited access. It is a chameleon whose job is to "become" other users to service authenticated HTTP requests. The picture below shows how the server handles authentication. If auth succeeds, it switches into the user role specified by the request, otherwise it switches into the anonymous role. +The authenticator should be configured in the database to have very limited access. It is a chameleon whose job is to "become" other users to service authenticated HTTP requests. The picture below shows how the server handles authentication. If auth succeeds, it switches into the user role specified by the request, otherwise it switches into the anonymous role. .. image:: _static/security-anon-choice.png @@ -31,17 +31,55 @@ Note that the database administrator must allow the authenticator role to switch GRANT user123 TO authenticator; -If the client included no JWT (or one without a role claim) then PostgREST switches into the anonymous role whos actual database-specific name, like that of with the authenticator role, is specified in the PostgREST server configuration file. +If the client included no JWT (or one without a role claim) then PostgREST switches into the anonymous role whos actual database-specific name, like that of with the authenticator role, is specified in the PostgREST server configuration file. The database administrator must set anonymous role permissions correctly to prevent anonymous users from seeing or changing things they shouldn't. + +Custom Authentication +--------------------- + +PostgREST honors the `exp` claim for token expiration, rejecting expired tokens. However it does not enforce any extra constraints. An example of an extra constraint would be to immediately revoke access for a certain user. The configuration file paramter `pre-request` specifies a stored procedure to call immediately after the authenticator switches into a new role and before the main query itself runs. + +Here's an example. In the config file specify a stored procedure: + +.. code:: + + pre-request = "public.check_user" + +In the function you can run arbitrary code to check the request and raise an exception to block it if desired. + +.. code:: sql + + CREATE OR REPLACE FUNCTION check_user() RETURNS void + LANGUAGE plpgsql + AS $$ + BEGIN + IF current_role = 'evil_user' THEN + RAISE EXCEPTION 'No, you are evil' + USING HINT = 'Stop being so evil and maybe you can log in'; + END IF; + END + $$; + +Client Auth +=========== + +To make an authenticated request the client must include an `Authorization` HTTP header with the value `Bearer `. For instance: + +.. code:: http + + GET /foo + Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJyb2xlIjoiamRvZSIsImV4cCI6MTQ3NTUxNjI1MH0.GYDZV3yM0gqvuEtJmfpplLBXSGYnke_Pvnl0tbKAjB4 + +JWT Generation +============== -JSON Web Tokens -=============== -Internal Generation -------------------- External Generation ------------------- +Internal Generation +------------------- + SSL === From be869d3f54faa7c94073edfb00d1fb489b1a4a40 Mon Sep 17 00:00:00 2001 From: Joe Nelson Date: Sun, 16 Oct 2016 13:13:44 -0700 Subject: [PATCH 011/711] JWT generation --- auth.rst | 39 +++++++++++++++++++++++++++++++++++---- 1 file changed, 35 insertions(+), 4 deletions(-) diff --git a/auth.rst b/auth.rst index cce3492385..e77dad5ae8 100644 --- a/auth.rst +++ b/auth.rst @@ -72,13 +72,44 @@ To make an authenticated request the client must include an `Authorization` HTTP JWT Generation ============== +You can create a valid JWT either from inside your database or via an external service. Each token is cryptographically signed with a secret passphrase -- the signer and verifier share the secret. Hence any service that shares a passphrase with a PostgREST server can create valid JWT. (PostgREST currently supports only the HMAC-SHA256 signing algorithm.) +From SQL +-------- -External Generation -------------------- +You can create JWT tokens in SQL using the `pgjwt extension `_. It's simple and requires only pgcrypto. If you're on an environment like Amazon RDS which doesn't support installing new extensions, you can still manually run the SQL inside pgjwt which creates the functions you will need. -Internal Generation -------------------- +Next write a stored procedure that returns the token. The one below returns a token with a hard-coded role, which expires five minutes after it was issued. Note this function has a hard-coded secret as well. + +.. code:: sql + + CREATE TYPE jwt_token AS ( + token text + ); + + CREATE FUNCTION jwt_test() RETURNS public.jwt_token + LANGUAGE sql + AS $$ + SELECT jwt.sign( + row_to_json(r), 'mysecret' + ) AS token + FROM ( + SELECT + 'my_role'::text as role, + extract(epoch from now())::integer + 300 AS exp + ) r; + $$; + +PostgREST exposes this function to clients via a POST request to `/rpc/jwt_token`. + +Using Auth0 +----------- + +An external service like `Auth0 `_ can do the hard work transforming Github, Twitter, Google etc OAuth into a JWT suitable for PostgREST. Auth0 can also handle email signup and password reset flows. + +To adapt Auth0 to our uses we need to save the database role in `user metadata `_ and include the metadata in `private claims `_ of the generated JWT. + +**TODO: add details** SSL === From 6e7349d76c666e9ab26dc4974ea5892e6fea0a14 Mon Sep 17 00:00:00 2001 From: Joe Nelson Date: Sun, 16 Oct 2016 13:54:05 -0700 Subject: [PATCH 012/711] SSL --- auth.rst | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/auth.rst b/auth.rst index e77dad5ae8..d02f6affbd 100644 --- a/auth.rst +++ b/auth.rst @@ -114,8 +114,7 @@ To adapt Auth0 to our uses we need to save the database role in `user metadata < SSL === -Custom Validation -================= +PostgREST aims to do one thing well: add an HTTP interface to a PostgreSQL database. To keep the code small and focused we do not implement SSL. Use a reverse proxy such as NGINX to add this, `here's how `_. Note that some Platforms as a Service like Heroku also add SSL automatically in their load balancer. Schema Isolation ================ From f8829540190c2e5a53b14e810a653c52c2b3f026 Mon Sep 17 00:00:00 2001 From: Joe Nelson Date: Mon, 24 Oct 2016 14:23:44 -0700 Subject: [PATCH 013/711] SQL user management section --- auth.rst | 406 +++++++++++++++++++++++++++++++++++++++++++++++++++--- intro.rst | 2 +- 2 files changed, 390 insertions(+), 18 deletions(-) diff --git a/auth.rst b/auth.rst index d02f6affbd..9622b5e750 100644 --- a/auth.rst +++ b/auth.rst @@ -7,7 +7,7 @@ There are three types of roles used by PostgREST, the **authenticator**, **anony .. image:: _static/security-roles.png -The authenticator should be configured in the database to have very limited access. It is a chameleon whose job is to "become" other users to service authenticated HTTP requests. The picture below shows how the server handles authentication. If auth succeeds, it switches into the user role specified by the request, otherwise it switches into the anonymous role. +The authenticator should be created `NOINHERIT` and configured in the database to have very limited access. It is a chameleon whose job is to "become" other users to service authenticated HTTP requests. The picture below shows how the server handles authentication. If auth succeeds, it switches into the user role specified by the request, otherwise it switches into the anonymous role. .. image:: _static/security-anon-choice.png @@ -31,10 +31,10 @@ Note that the database administrator must allow the authenticator role to switch GRANT user123 TO authenticator; -If the client included no JWT (or one without a role claim) then PostgREST switches into the anonymous role whos actual database-specific name, like that of with the authenticator role, is specified in the PostgREST server configuration file. The database administrator must set anonymous role permissions correctly to prevent anonymous users from seeing or changing things they shouldn't. +If the client included no JWT (or one without a role claim) then PostgREST switches into the anonymous role whose actual database-specific name, like that of with the authenticator role, is specified in the PostgREST server configuration file. The database administrator must set anonymous role permissions correctly to prevent anonymous users from seeing or changing things they shouldn't. -Custom Authentication ---------------------- +Custom Validation +----------------- PostgREST honors the `exp` claim for token expiration, rejecting expired tokens. However it does not enforce any extra constraints. An example of an extra constraint would be to immediately revoke access for a certain user. The configuration file paramter `pre-request` specifies a stored procedure to call immediately after the authenticator switches into a new role and before the main query itself runs. @@ -70,12 +70,12 @@ To make an authenticated request the client must include an `Authorization` HTTP Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJyb2xlIjoiamRvZSIsImV4cCI6MTQ3NTUxNjI1MH0.GYDZV3yM0gqvuEtJmfpplLBXSGYnke_Pvnl0tbKAjB4 JWT Generation -============== +-------------- You can create a valid JWT either from inside your database or via an external service. Each token is cryptographically signed with a secret passphrase -- the signer and verifier share the secret. Hence any service that shares a passphrase with a PostgREST server can create valid JWT. (PostgREST currently supports only the HMAC-SHA256 signing algorithm.) -From SQL --------- +JWT from SQL +~~~~~~~~~~~~ You can create JWT tokens in SQL using the `pgjwt extension `_. It's simple and requires only pgcrypto. If you're on an environment like Amazon RDS which doesn't support installing new extensions, you can still manually run the SQL inside pgjwt which creates the functions you will need. @@ -102,28 +102,400 @@ Next write a stored procedure that returns the token. The one below returns a to PostgREST exposes this function to clients via a POST request to `/rpc/jwt_token`. -Using Auth0 ------------ +JWT from Auth0 +~~~~~~~~~~~~~~ -An external service like `Auth0 `_ can do the hard work transforming Github, Twitter, Google etc OAuth into a JWT suitable for PostgREST. Auth0 can also handle email signup and password reset flows. +An external service like `Auth0 `_ can do the hard work transforming OAuth from Github, Twitter, Google etc into a JWT suitable for PostgREST. Auth0 can also handle email signup and password reset flows. To adapt Auth0 to our uses we need to save the database role in `user metadata `_ and include the metadata in `private claims `_ of the generated JWT. **TODO: add details** SSL -=== +--- PostgREST aims to do one thing well: add an HTTP interface to a PostgreSQL database. To keep the code small and focused we do not implement SSL. Use a reverse proxy such as NGINX to add this, `here's how `_. Note that some Platforms as a Service like Heroku also add SSL automatically in their load balancer. Schema Isolation ================ -User Management -=============== +A PostgREST instance is configured to expose all the tables, views, and stored procedures of a single schema specified in a server configuration file. Objects -Logins ------- -Password Reset --------------- +SQL User Management +=================== + +Storing Users and Passwords +--------------------------- + +As mentioned, an external service can provide user management and coordinate with the PostgREST server using JWT. It's also possible to support logins entirely through SQL. It's a fair bit of work, so get ready. + +The following table, functions, and triggers will live in a `basic_auth` schema that you shouldn't expose publicly in the API. The public views and functions will live in a different schema which internally references this internal information. + +First we'll need a table to keep track of our users: + +.. code:: sql + + -- We put things inside the basic_auth schema to hide + -- them from public view. Certain public procs/views will + -- refer to helpers and tables inside. + create schema if not exists basic_auth; + + create table if not exists + basic_auth.users ( + email text primary key check ( email ~* '^.+@.+\..+$' ), + pass text not null check (length(pass) < 512), + role name not null check (length(role) < 512), + verified boolean not null default false + -- If you like add more columns, or a json column + ); + +We would like the role to be a foreign key to actual database roles, however PostgreSQL does not support these constraints against the `pg_roles` table. We'll use a trigger to manually enforce it. + +.. code:: sql + + create or replace function + basic_auth.check_role_exists() returns trigger + language plpgsql + as $$ + begin + if not exists (select 1 from pg_roles as r where r.rolname = new.role) then + raise foreign_key_violation using message = + 'unknown database role: ' || new.role; + return null; + end if; + return new; + end + $$; + + drop trigger if exists ensure_user_role_exists on basic_auth.users; + create constraint trigger ensure_user_role_exists + after insert or update on basic_auth.users + for each row + execute procedure basic_auth.check_role_exists(); + +Next we'll use the pgcrypto extension and a trigger to keep passwords safe in the `users` table. + +.. code:: sql + + create extension if not exists pgcrypto; + + create or replace function + basic_auth.encrypt_pass() returns trigger + language plpgsql + as $$ + begin + if tg_op = 'INSERT' or new.pass <> old.pass then + new.pass = crypt(new.pass, gen_salt('bf')); + end if; + return new; + end + $$; + + drop trigger if exists encrypt_pass on basic_auth.users; + create trigger encrypt_pass + before insert or update on basic_auth.users + for each row + execute procedure basic_auth.encrypt_pass(); + +With the table in place we can make a helper to check a password against the encrypted column. It returns the database role for a user if the email and password are correct. + +.. code:: sql + + create or replace function + basic_auth.user_role(email text, pass text) returns name + language plpgsql + as $$ + begin + return ( + select role from basic_auth.users + where users.email = user_role.email + and users.pass = crypt(user_role.pass, users.pass) + ); + end; + $$; + +Finally we want a helper function to check whether the database user for the current API request has access to see or change a given role. This will become useful in the next section. + +.. code:: sql + + create or replace function + basic_auth.clearance_for_role(u name) returns void as + $$ + declare + ok boolean; + begin + select exists ( + select rolname + from pg_authid + where pg_has_role(current_user, oid, 'member') + and rolname = u + ) into ok; + if not ok then + raise invalid_password using message = + 'current user not member of role ' || u; + end if; + end + $$ LANGUAGE plpgsql; + +Public User Interface +--------------------- + +In the previous section we created an internal place to store user information. Here we create views and functions in a public schema that clients will access through the HTTP API. These public relations allow users view or edit their own information, log in, sign up, etc. + +Logins and Signup +~~~~~~~~~~~~~~~~~ + +As described in `JWT from SQL`_, we'll create a JWT inside our login function. Note that you'll need to adjust the secret key which is hardcoded in this example to a secure secret of your choosing. + +.. code:: sql + + create or replace function + login(email text, pass text) returns basic_auth.jwt_token + language plpgsql + as $$ + declare + _role name; + _verified boolean; + _email text; + result basic_auth.jwt_claims; + begin + -- check email and password + select basic_auth.user_role(email, pass) into _role; + if _role is null then + raise invalid_password using message = 'invalid user or password'; + end if; + -- check verified flag whether users + -- have validated their emails + _email := email; + select verified from basic_auth.users as u where u.email=_email limit 1 into _verified; + if not _verified then + raise invalid_authorization_specification using message = 'user is not verified'; + end if; + + select jwt.sign( + row_to_json(r), 'mysecret' + ) as token + from ( + select _role as role, login.email as email, + extract(epoch from now())::integer + 60*60 as exp + ) r + into result; + return result; + end; + $$; + +An API request to call this function would look like: + +.. code:: http + + POST /rpc/login + + { "email": "foo@bar.com", "pass": "foobar" } + +The response would look like the snippet below. Try decoding the token at `jwt.io `_. (It was encoded with a secret of `mysecret` as specified in the SQL code above. You'll want to change this secret in your app!) + +.. code:: json + + { + "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJlbWFpbCI6ImZvb0BiYXIuY29tIiwicm9sZSI6ImF1dGhvciJ9.fpf3_ERi5qbWOE5NPzvauJgvulm0zkIG9xSm2w5zmdw" + } + +Editing User Info +~~~~~~~~~~~~~~~~~ + +Here is a redacted view for users. It hides passwords and shows only those users whose roles the currently logged in user has database permission to access. + +.. code:: sql + + create or replace view users as + select actual.role as role, + '***'::text as pass, + actual.email as email, + actual.verified as verified + from basic_auth.users as actual, + (select rolname + from pg_authid + where pg_has_role(current_user, oid, 'member') + ) as member_of + where actual.role = member_of.rolname; + -- can also add restriction that current_setting('request.jwt.claim.email') + -- is equal to email so that user can only see themselves + +Using this view a client can see their role and any other users to whose roles the client belongs. This view does not yet support inserts or updates because not all the columns refer directly to underlying columns. Nor do we want it to be auto-updatable because it would allow an escalation of privileges. Someone could update their own row and change their role to become more powerful. We'll handle updates with a trigger: + +.. code:: sql + + create or replace function + update_users() returns trigger + language plpgsql + AS $$ + begin + if tg_op = 'INSERT' then + perform basic_auth.clearance_for_role(new.role); + + insert into basic_auth.users + (role, pass, email, verified) + values ( + new.role, new.pass, new.email, + coalesce(new.verified, false)); + return new; + elsif tg_op = 'UPDATE' then + -- no need to check clearance for old.role because + -- an ineligible row would not have been available to update (http 404) + perform basic_auth.clearance_for_role(new.role); + + update basic_auth.users set + email = new.email, + role = new.role, + pass = new.pass, + verified = coalesce(new.verified, old.verified, false) + where email = old.email; + return new; + elsif tg_op = 'DELETE' then + -- no need to check clearance for old.role (see previous case) + + delete from basic_auth.users + where basic_auth.email = old.email; + return null; + end if; + end + $$; + + drop trigger if exists update_users on users; + create trigger update_users + instead of insert or update or delete on + users for each row execute procedure update_users(); + +Permissions +~~~~~~~~~~~ + +Your database roles need access to the schema, tables, views and functions in order to service HTTP requests. Recall from the `Overview of Role System`_ that PostgREST uses special roles to process requests, namely the authenticator and anonymous roles. Below is an example of permissions that allow anonymous users to create accounts and attempt to log in. + +.. code:: sql + + -- the names "anon" and "authenticator" are configurable and not + -- sacred, we simply choose them for clarity + create role anon; + create role authenticator noinherit; + grant anon to authenticator; + + grant usage on schema public, basic_auth to anon; + + -- anon can create new logins + grant insert on table basic_auth.users, basic_auth.tokens to anon; + grant select on table pg_authid, basic_auth.users to anon; + grant execute on function + login(text,text), + signup(text, text) + to anon; + +You may be worried from the above that anonymous users can read everything from the `basic_auth.users` table. However this table is not available for direct queries because it lives in a separate schema. The anonymous role needs access because the public `users` view reads the underlying table with the permissions of the calling user. But we have made sure the view properly restricts access to sensitive information. + +Interacting with Email +---------------------- + +External actions like sending an email or calling 3rd-party services are possible in PostgREST but must be handled with care. Even if there are PostgreSQL extensions to make network requests it is bad practice to do this in SQL. Blocking on the outside world is unhealthy in a database and holds open long-running transactions. The proper approach is for the database to signal an external program to perform the required action and then not block on the result. + +One way to do this is using a table to implement a job queue for external programs. However this approach is `dangerous `_ because of its potential interactions with unrelated long-running queries. However things are improving with PostgreSQL 9.5 which introduces SKIP LOCKED to build reliable work queues, see `this article `_. + +Another way to queue and tasks for external processing is by bridging PostgreSQL's `LISTEN `_/`NOTIFY `_ pubsub with a dedicated external queue system. Two programs to listen for database events and queue them are + +* `aweber/pgsql-listen-exchange `_ for RabbitMQ +* `SpiderOak/skeeter `_ for ZeroMQ + +For experimentation purposes you can also have external programs LISTEN directly for PostgreSQL events. It's less robust than a queuing system but an example Node program might look like this: + +.. code:: js + + var PS = require('pg-pubsub'); + + if(process.argv.length !== 3) { + console.log("USAGE: DB_URL"); + process.exit(2); + } + var url = process.argv[2], + ps = new PS(url); + + // password reset request events + ps.addChannel('reset', console.log); + // email validation required event + ps.addChannel('validate', console.log); + + // modify me to send emails + +To use this LISTEN/NOTIFY approach (with or without a real queue hooked up) we can make our SQL functions issue a NOTIFY to perform external actions. Two such such functions are those to confirm an email address or send a password reset token. Both will use nonces and need a place to store them, so we'll start there. + +.. code:: sql + + create type token_type_enum as enum ('validation', 'reset'); + + create table if not exists + basic_auth.tokens ( + token uuid primary key, + token_type token_type_enum not null, + email text not null references basic_auth.users (email) + on delete cascade on update cascade, + created_at timestamptz not null default current_date + ); + +Here is a password reset function to make public for API requests. The function takes a user email address. + +.. code:: sql + + create or replace function + request_password_reset(email text) returns void + language plpgsql + as $$ + declare + tok uuid; + begin + delete from basic_auth.tokens + where token_type = 'reset' + and tokens.email = request_password_reset.email; + + select gen_random_uuid() into tok; + insert into basic_auth.tokens (token, token_type, email) + values (tok, 'reset', request_password_reset.email); + perform pg_notify('reset', + json_build_object( + 'email', request_password_reset.email, + 'token', tok, + 'token_type', 'reset' + )::text + ); + end; + $$; + +Notice the use of `pg_notify` above. It notifies a channel called `reset` with a JSON object containing details of the email address and token. A worker process would directly LISTEN for this event or would pull it off a queue and do the work to send an email with a friendly human readable message. + +Similar to the password reset request, an email validation function creates a token and then defers to external processing. This one won't be publicly accessible, but rather can be triggered on user account creation. + +.. code:: sql + + create or replace function + basic_auth.send_validation() returns trigger + language plpgsql + as $$ + declare + tok uuid; + begin + select gen_random_uuid() into tok; + insert into basic_auth.tokens (token, token_type, email) + values (tok, 'validation', new.email); + perform pg_notify('validate', + json_build_object( + 'email', new.email, + 'token', tok, + 'token_type', 'validation' + )::text + ); + return new; + end + $$; + + drop trigger if exists send_validation on basic_auth.users; + create trigger send_validation + after insert on basic_auth.users + for each row + execute procedure basic_auth.send_validation(); diff --git a/intro.rst b/intro.rst index 4d070f6fc2..0baee66198 100644 --- a/intro.rst +++ b/intro.rst @@ -83,7 +83,7 @@ In Production Commercial PaaS --------------- -* `Sub0 `_ - Automated GraphQL & REST API with built-in caching (powered by PostgREST) +* `Sub0 `_ - Automated GraphQL & REST API with built-in caching (powered by PostgREST, not affiliated) Getting Support From d1526890380cd7d27c912a3252f85da469edbabb Mon Sep 17 00:00:00 2001 From: Joe Nelson Date: Mon, 24 Oct 2016 14:50:22 -0700 Subject: [PATCH 014/711] More about schema isolation --- auth.rst | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/auth.rst b/auth.rst index 9622b5e750..89324bdd77 100644 --- a/auth.rst +++ b/auth.rst @@ -119,8 +119,7 @@ PostgREST aims to do one thing well: add an HTTP interface to a PostgreSQL datab Schema Isolation ================ -A PostgREST instance is configured to expose all the tables, views, and stored procedures of a single schema specified in a server configuration file. Objects - +A PostgREST instance is configured to expose all the tables, views, and stored procedures of a single schema specified in a server configuration file. This means private data or implementation details can go inside a private schema and be invisible to HTTP clients. You can then expose views and stored procedures which insulate the internal details from the outside world. It keeps you code easier to refactor, and provides a natural way to do API `versioning`_. For an example of wrapping a private table with a public view see the `Editing User Info`_ section below. SQL User Management =================== @@ -304,7 +303,7 @@ The response would look like the snippet below. Try decoding the token at `jwt.i Editing User Info ~~~~~~~~~~~~~~~~~ -Here is a redacted view for users. It hides passwords and shows only those users whose roles the currently logged in user has database permission to access. +By creating a public wrapper around the internal users table we can allow people to safely edit it through the same auto-generated API that apply to other tables and views. The following view redacts sensitive information. It hides passwords and shows only those users whose roles the currently logged in user has database permission to access. .. code:: sql @@ -399,7 +398,7 @@ External actions like sending an email or calling 3rd-party services are possibl One way to do this is using a table to implement a job queue for external programs. However this approach is `dangerous `_ because of its potential interactions with unrelated long-running queries. However things are improving with PostgreSQL 9.5 which introduces SKIP LOCKED to build reliable work queues, see `this article `_. -Another way to queue and tasks for external processing is by bridging PostgreSQL's `LISTEN `_/`NOTIFY `_ pubsub with a dedicated external queue system. Two programs to listen for database events and queue them are +Another way to queue tasks for external processing is by bridging PostgreSQL's `LISTEN `_/`NOTIFY `_ pubsub with a dedicated external queue system. Two programs to listen for database events and queue them are * `aweber/pgsql-listen-exchange `_ for RabbitMQ * `SpiderOak/skeeter `_ for ZeroMQ From fda3e586199205e548cefd5590533ccb5be91179 Mon Sep 17 00:00:00 2001 From: Joe Nelson Date: Mon, 24 Oct 2016 15:23:44 -0700 Subject: [PATCH 015/711] Fix code block lexing --- api.rst | 36 +++++++++++++++++++++--------------- auth.rst | 34 +++++++++++++++++----------------- 2 files changed, 38 insertions(+), 32 deletions(-) diff --git a/api.rst b/api.rst index 7063703223..0e9aa142e1 100644 --- a/api.rst +++ b/api.rst @@ -3,9 +3,9 @@ Tables and Views All views and tables in the active schema and accessible by the active database role for a request are available for querying. They are exposed in one-level deep routes. For instance the full contents of a table `people` is returned at -.. code-block:: HTTP +.. code-block:: http - GET /people + GET /people HTTP/1.1 There are no deeply/nested/routes. Each route provides OPTIONS, GET, POST, PATCH, and DELETE verbs depending entirely on database permissions. @@ -20,13 +20,13 @@ You can filter result rows by adding conditions on columns, each condition a que .. code-block:: http - GET /people?age=lt.13 + GET /people?age=lt.13 HTTP/1.1 Adding multiple parameters conjoins the conditions: .. code-block:: http - GET /people?age=gte.18&student=is.true + GET /people?age=gte.18&student=is.true HTTP/1.1 These operators are available: @@ -61,7 +61,7 @@ Computed Columns Filters may be applied to computed columns as well as actual table/view columns, even though the computed columns will not appear in the output. For example, to search first and last names at once we can create a computed column that will not appear in the output but can be used in a filter: -.. code-block:: sql +.. code-block:: postgres CREATE TABLE people ( fname text, @@ -72,7 +72,7 @@ Filters may be applied to computed columns as well as actual table/view columns, SELECT $1.fname || ' ' || $1.lname; $$ LANGUAGE SQL; - # (optional) add an index to speed up anticipated query + -- (optional) add an index to speed up anticipated query CREATE INDEX people_full_name_idx ON people USING GIN (to_tsvector('english', fname || ' ' || lname)); @@ -80,7 +80,7 @@ A full-text search on the computed column: .. code-block:: http - GET /people?full_name=@@.Beckett + GET /people?full_name=@@.Beckett HTTP/1.1 Ordering -------- @@ -89,26 +89,29 @@ The reserved word :code:`order` reorders the response rows. It uses a comma-sepa .. code-block:: http - GET /people?order=age.desc,height.asc + GET /people?order=age.desc,height.asc HTTP/1.1 If no direction is specified it defaults to ascending order: .. code-block:: http - GET /people?order=age + GET /people?order=age HTTP/1.1 If you care where nulls are sorted, add nullsfirst or nullslast: .. code-block:: http - GET /people?order=age.nullsfirst - GET /people?order=age.desc.nullslast + GET /people?order=age.nullsfirst HTTP/1.1 + +.. code-block:: http + + GET /people?order=age.desc.nullslast HTTP/1.1 To order the embedded items, you need to specify the tree path for the order param like so. .. code-block:: http - GET /projects?select=id,name,tasks{id,name}&order=id.asc&tasks.order=name.asc + GET /projects?select=id,name,tasks{id,name}&order=id.asc&tasks.order=name.asc HTTP/1.1 You can also use :ref:`computed_cols` to order the results, even though the computed columns will not appear in the output. @@ -119,6 +122,7 @@ PostgREST uses HTTP range headers to describe the size of results. Every respons .. code-block:: http + HTTP/1.1 200 OK Range-Unit: items Content-Range: 0-14/* @@ -128,7 +132,7 @@ There are two ways to apply a limit and offset rows: through request headers or .. code-block:: http - GET /people + GET /people HTTP/1.1 Range-Unit: items Range: 0-19 @@ -136,6 +140,7 @@ Note that the server may respond with fewer if unable to meet your request: .. code-block:: http + HTTP/1.1 200 OK Range-Unit: items Content-Range: 0-17/* @@ -145,7 +150,7 @@ The other way to request a limit or offset is with query pamameters. For example .. code-block:: http - GET /people?limit=15&offset=30 + GET /people?limit=15&offset=30 HTTP/1.1 This method is also useful for embedded resources, which we will cover in another section. The server always responds with range headers even if you use query parameters to limit the query. @@ -154,7 +159,7 @@ In order to obtain the total size of the table or view (such as when rendering t .. code-block:: http - GET /bigtable + GET /bigtable HTTP/1.1 Range-Unit: items Range: 0-24 Prefer: count=exact @@ -163,6 +168,7 @@ Note that the larger the table the slower this query runs in the database. The s .. code-block:: http + HTTP/1.1 206 Partial Content Range-Unit: items Content-Range: 0-24/3573458 diff --git a/auth.rst b/auth.rst index 89324bdd77..c5a44e7a76 100644 --- a/auth.rst +++ b/auth.rst @@ -21,13 +21,13 @@ Here are the technical details. We use `JSON Web Tokens `_ to au When a request contains a valid JWT with a role claim PostgREST will switch to the database role with that name for the duration of the HTTP request. -.. code:: sql +.. code:: postgres SET LOCAL ROLE user123; Note that the database administrator must allow the authenticator role to switch into this user by previously executing -.. code:: sql +.. code:: postgres GRANT user123 TO authenticator; @@ -40,13 +40,13 @@ PostgREST honors the `exp` claim for token expiration, rejecting expired tokens. Here's an example. In the config file specify a stored procedure: -.. code:: +.. code:: ini pre-request = "public.check_user" In the function you can run arbitrary code to check the request and raise an exception to block it if desired. -.. code:: sql +.. code:: postgres CREATE OR REPLACE FUNCTION check_user() RETURNS void LANGUAGE plpgsql @@ -81,7 +81,7 @@ You can create JWT tokens in SQL using the `pgjwt extension Date: Mon, 24 Oct 2016 15:26:40 -0700 Subject: [PATCH 016/711] Use plpgsql language type when applicable --- auth.rst | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/auth.rst b/auth.rst index c5a44e7a76..0051127553 100644 --- a/auth.rst +++ b/auth.rst @@ -46,7 +46,7 @@ Here's an example. In the config file specify a stored procedure: In the function you can run arbitrary code to check the request and raise an exception to block it if desired. -.. code:: postgres +.. code:: plpgsql CREATE OR REPLACE FUNCTION check_user() RETURNS void LANGUAGE plpgsql @@ -151,7 +151,7 @@ First we'll need a table to keep track of our users: We would like the role to be a foreign key to actual database roles, however PostgreSQL does not support these constraints against the `pg_roles` table. We'll use a trigger to manually enforce it. -.. code:: postgres +.. code:: plpgsql create or replace function basic_auth.check_role_exists() returns trigger @@ -175,7 +175,7 @@ We would like the role to be a foreign key to actual database roles, however Pos Next we'll use the pgcrypto extension and a trigger to keep passwords safe in the `users` table. -.. code:: postgres +.. code:: plpgsql create extension if not exists pgcrypto; @@ -199,7 +199,7 @@ Next we'll use the pgcrypto extension and a trigger to keep passwords safe in th With the table in place we can make a helper to check a password against the encrypted column. It returns the database role for a user if the email and password are correct. -.. code:: postgres +.. code:: plpgsql create or replace function basic_auth.user_role(email text, pass text) returns name @@ -247,7 +247,7 @@ Logins and Signup As described in `JWT from SQL`_, we'll create a JWT inside our login function. Note that you'll need to adjust the secret key which is hardcoded in this example to a secure secret of your choosing. -.. code:: postgres +.. code:: plpgsql create or replace function login(email text, pass text) returns basic_auth.jwt_token @@ -323,7 +323,7 @@ By creating a public wrapper around the internal users table we can allow people Using this view a client can see their role and any other users to whose roles the client belongs. This view does not yet support inserts or updates because not all the columns refer directly to underlying columns. Nor do we want it to be auto-updatable because it would allow an escalation of privileges. Someone could update their own row and change their role to become more powerful. We'll handle updates with a trigger: -.. code:: postgres +.. code:: plpgsql create or replace function update_users() returns trigger @@ -440,7 +440,7 @@ To use this LISTEN/NOTIFY approach (with or without a real queue hooked up) we c Here is a password reset function to make public for API requests. The function takes a user email address. -.. code:: postgres +.. code:: plpgsql create or replace function request_password_reset(email text) returns void @@ -470,7 +470,7 @@ Notice the use of `pg_notify` above. It notifies a channel called `reset` with a Similar to the password reset request, an email validation function creates a token and then defers to external processing. This one won't be publicly accessible, but rather can be triggered on user account creation. -.. code:: postgres +.. code:: plpgsql create or replace function basic_auth.send_validation() returns trigger From 8a606f72237f49536d69b2700df60a8edda505c5 Mon Sep 17 00:00:00 2001 From: Joe Nelson Date: Fri, 28 Oct 2016 17:18:41 -0700 Subject: [PATCH 017/711] Discuss group/user roles --- auth.rst | 88 +++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 87 insertions(+), 1 deletion(-) diff --git a/auth.rst b/auth.rst index 0051127553..2c00ae42df 100644 --- a/auth.rst +++ b/auth.rst @@ -1,7 +1,10 @@ Overview of Role System ======================= -PostgREST is designed to keep the database at the center of API security. All authorization happens through database roles and permissions. It is PostgREST's job to authenticate requests -- i.e. verify that a client is who they say they are -- and then let the database authorize client actions. +PostgREST is designed to keep the database at the center of API security. All authorization happens through database roles and permissions. It is PostgREST's job to **authenticate** requests -- i.e. verify that a client is who they say they are -- and then let the database **authorize** client actions. + +Authentication Sequence +----------------------- There are three types of roles used by PostgREST, the **authenticator**, **anonymous** and **user** roles. The database administrator creates these roles and configures PostgREST to use them. @@ -33,6 +36,89 @@ Note that the database administrator must allow the authenticator role to switch If the client included no JWT (or one without a role claim) then PostgREST switches into the anonymous role whose actual database-specific name, like that of with the authenticator role, is specified in the PostgREST server configuration file. The database administrator must set anonymous role permissions correctly to prevent anonymous users from seeing or changing things they shouldn't. +Users and Groups +---------------- + +PostgreSQL manages database access permissions using the concept of roles. A role can be thought of as either a database user, or a group of database users, depending on how the role is set up. + +Roles for Each Web User +~~~~~~~~~~~~~~~~~~~~~~~ + +PostgREST can accommodate either viewpoint. If you treat a role as a single user then the the JWT-based role switching described above does most of what you need. When an authenticated user makes a request PostgREST will switch into the role for that user, which in addition to restricting queries, is available to SQL through the `current_user` variable. + +You can use row-level security to flexibly restrict visibility and access for the current user. Here is an `example `_ from Tomas Vondra, a chat table storing messages sent between users. Users can insert rows into it to send messages to other users, and query it to see messages sent to them by other users. + +.. code:: postgres + + CREATE TABLE chat ( + message_uuid UUID PRIMARY KEY DEFAULT uuid_generate_v4(), + message_time TIMESTAMP NOT NULL DEFAULT now(), + message_from NAME NOT NULL DEFAULT current_user, + message_to NAME NOT NULL, + message_subject VARCHAR(64) NOT NULL, + message_body TEXT + ); + +We want to enforce a policy that ensures a user can see only those messages sent by him or intended for him. Also we want to prevent a user from forging the message_from column with anyone else's name. + +PostgreSQL (9.5 and later) allows us to set this policy with row-level security: + +.. code:: postgres + + CREATE POLICY chat_policy ON chat + USING ((message_to = current_user) OR (message_from = current_user)) + WITH CHECK (message_from = current_user) + +Anyone accessing the generated API endpoint for the chat table will see exactly the rows they should, without our needing custom imperative server-side coding. + +Web Users Sharing Role +~~~~~~~~~~~~~~~~~~~~~~ + +Alternately database roles can represent groups instead of (or in addition to) individual users. You may choose that all signed-in users for a web app share the role webuser. You can distinguish individual users by including extra claims in the JWT such as email. + +.. code:: json + + { + "role": "webuser", + "email": "john@doe.com" + } + +SQL code can access claims through GUC variables set by PostgREST per request. For instance to get the email claim, call this function: + +.. code:: postgres + + current_setting('request.jwt.claim.email') + +This allows JWT generation services to include extra information and your database code to react to it. For instance the RLS example could be modified to use this current_setting rather than current_user. + +.. note:: + + The current_setting function raises an exception if the setting in question is not present, as when a claim is missing from the JWT. Your SQL functions can either catch the exception, or you can set a default value for the database like this. + + .. code:: postgres + + -- Prevent current_setting('postgrest.claims.email') from raising + -- an exception if the setting is not present. Default it to ''. + ALTER DATABASE your_db_name SET request.claim.email TO ''; + +Hybrid User-Group Roles +~~~~~~~~~~~~~~~~~~~~~~~ + +There is no performance penalty for having many database roles, although roles are namespaced per-cluster rather than per-database so may be prone to collision within the database. You are free to assign a new role for every user in a web application if desired. You can mix the group and individual role policies. For instance we could still have a webuser role and individual users which inherit from it: + +.. code:: postgres + + CREATE ROLE webuser NOLOGIN; + -- grant this role access to certain tables etc + + CREATE ROLE user000 NOLOGIN; + GRANT webuser TO user000; + -- now user000 can do whatever webuser can + + GRANT user000 TO authenticator; + -- allow authenticator to switch into user000 role + -- (the role itself has nologin) + Custom Validation ----------------- From 2c53cb4fae0bc7ae3c35e2d24ed7e7f2174f5f9a Mon Sep 17 00:00:00 2001 From: Joe Nelson Date: Fri, 28 Oct 2016 17:54:32 -0700 Subject: [PATCH 018/711] Fix highlighting, typo in current_user --- auth.rst | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/auth.rst b/auth.rst index 2c00ae42df..cc1aecbbe1 100644 --- a/auth.rst +++ b/auth.rst @@ -132,13 +132,13 @@ Here's an example. In the config file specify a stored procedure: In the function you can run arbitrary code to check the request and raise an exception to block it if desired. -.. code:: plpgsql +.. code:: postgres CREATE OR REPLACE FUNCTION check_user() RETURNS void LANGUAGE plpgsql AS $$ BEGIN - IF current_role = 'evil_user' THEN + IF current_user = 'evil_user' THEN RAISE EXCEPTION 'No, you are evil' USING HINT = 'Stop being so evil and maybe you can log in'; END IF; @@ -152,7 +152,7 @@ To make an authenticated request the client must include an `Authorization` HTTP .. code:: http - GET /foo + GET /foo HTTP/1.1 Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJyb2xlIjoiamRvZSIsImV4cCI6MTQ3NTUxNjI1MH0.GYDZV3yM0gqvuEtJmfpplLBXSGYnke_Pvnl0tbKAjB4 JWT Generation @@ -374,7 +374,7 @@ An API request to call this function would look like: .. code:: http - POST /rpc/login + POST /rpc/login HTTP/1.1 { "email": "foo@bar.com", "pass": "foobar" } From 5919a371972c2f2aadabadc5946c384257536987 Mon Sep 17 00:00:00 2001 From: Joe Nelson Date: Mon, 31 Oct 2016 22:43:41 -0700 Subject: [PATCH 019/711] Remove signups and user editing Too complicated for this section --- auth.rst | 222 +------------------------------------------------------ 1 file changed, 4 insertions(+), 218 deletions(-) diff --git a/auth.rst b/auth.rst index cc1aecbbe1..17ef0d913c 100644 --- a/auth.rst +++ b/auth.rst @@ -231,8 +231,6 @@ First we'll need a table to keep track of our users: email text primary key check ( email ~* '^.+@.+\..+$' ), pass text not null check (length(pass) < 512), role name not null check (length(role) < 512), - verified boolean not null default false - -- If you like add more columns, or a json column ); We would like the role to be a foreign key to actual database roles, however PostgreSQL does not support these constraints against the `pg_roles` table. We'll use a trigger to manually enforce it. @@ -300,36 +298,13 @@ With the table in place we can make a helper to check a password against the enc end; $$; -Finally we want a helper function to check whether the database user for the current API request has access to see or change a given role. This will become useful in the next section. - -.. code:: postgres - - create or replace function - basic_auth.clearance_for_role(u name) returns void as - $$ - declare - ok boolean; - begin - select exists ( - select rolname - from pg_authid - where pg_has_role(current_user, oid, 'member') - and rolname = u - ) into ok; - if not ok then - raise invalid_password using message = - 'current user not member of role ' || u; - end if; - end - $$ LANGUAGE plpgsql; - Public User Interface --------------------- -In the previous section we created an internal place to store user information. Here we create views and functions in a public schema that clients will access through the HTTP API. These public relations allow users view or edit their own information, log in, sign up, etc. +In the previous section we created an internal table to store user information. Here we create a login function which takes an email address and password and returns JWT if the credentials match a user in the internal table. -Logins and Signup -~~~~~~~~~~~~~~~~~ +Logins +~~~~~~ As described in `JWT from SQL`_, we'll create a JWT inside our login function. Note that you'll need to adjust the secret key which is hardcoded in this example to a secure secret of your choosing. @@ -341,8 +316,6 @@ As described in `JWT from SQL`_, we'll create a JWT inside our login function. N as $$ declare _role name; - _verified boolean; - _email text; result basic_auth.jwt_claims; begin -- check email and password @@ -350,13 +323,6 @@ As described in `JWT from SQL`_, we'll create a JWT inside our login function. N if _role is null then raise invalid_password using message = 'invalid user or password'; end if; - -- check verified flag whether users - -- have validated their emails - _email := email; - select verified from basic_auth.users as u where u.email=_email limit 1 into _verified; - if not _verified then - raise invalid_authorization_specification using message = 'user is not verified'; - end if; select jwt.sign( row_to_json(r), 'mysecret' @@ -386,72 +352,6 @@ The response would look like the snippet below. Try decoding the token at `jwt.i "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJlbWFpbCI6ImZvb0BiYXIuY29tIiwicm9sZSI6ImF1dGhvciJ9.fpf3_ERi5qbWOE5NPzvauJgvulm0zkIG9xSm2w5zmdw" } -Editing User Info -~~~~~~~~~~~~~~~~~ - -By creating a public wrapper around the internal users table we can allow people to safely edit it through the same auto-generated API that apply to other tables and views. The following view redacts sensitive information. It hides passwords and shows only those users whose roles the currently logged in user has database permission to access. - -.. code:: postgres - - create or replace view users as - select actual.role as role, - '***'::text as pass, - actual.email as email, - actual.verified as verified - from basic_auth.users as actual, - (select rolname - from pg_authid - where pg_has_role(current_user, oid, 'member') - ) as member_of - where actual.role = member_of.rolname; - -- can also add restriction that current_setting('request.jwt.claim.email') - -- is equal to email so that user can only see themselves - -Using this view a client can see their role and any other users to whose roles the client belongs. This view does not yet support inserts or updates because not all the columns refer directly to underlying columns. Nor do we want it to be auto-updatable because it would allow an escalation of privileges. Someone could update their own row and change their role to become more powerful. We'll handle updates with a trigger: - -.. code:: plpgsql - - create or replace function - update_users() returns trigger - language plpgsql - AS $$ - begin - if tg_op = 'INSERT' then - perform basic_auth.clearance_for_role(new.role); - - insert into basic_auth.users - (role, pass, email, verified) - values ( - new.role, new.pass, new.email, - coalesce(new.verified, false)); - return new; - elsif tg_op = 'UPDATE' then - -- no need to check clearance for old.role because - -- an ineligible row would not have been available to update (http 404) - perform basic_auth.clearance_for_role(new.role); - - update basic_auth.users set - email = new.email, - role = new.role, - pass = new.pass, - verified = coalesce(new.verified, old.verified, false) - where email = old.email; - return new; - elsif tg_op = 'DELETE' then - -- no need to check clearance for old.role (see previous case) - - delete from basic_auth.users - where basic_auth.email = old.email; - return null; - end if; - end - $$; - - drop trigger if exists update_users on users; - create trigger update_users - instead of insert or update or delete on - users for each row execute procedure update_users(); - Permissions ~~~~~~~~~~~ @@ -466,121 +366,7 @@ Your database roles need access to the schema, tables, views and functions in or grant anon to authenticator; grant usage on schema public, basic_auth to anon; - - -- anon can create new logins - grant insert on table basic_auth.users, basic_auth.tokens to anon; grant select on table pg_authid, basic_auth.users to anon; - grant execute on function - login(text,text), - signup(text, text) - to anon; + grant execute on function login(text,text) to anon; You may be worried from the above that anonymous users can read everything from the `basic_auth.users` table. However this table is not available for direct queries because it lives in a separate schema. The anonymous role needs access because the public `users` view reads the underlying table with the permissions of the calling user. But we have made sure the view properly restricts access to sensitive information. - -Interacting with Email ----------------------- - -External actions like sending an email or calling 3rd-party services are possible in PostgREST but must be handled with care. Even if there are PostgreSQL extensions to make network requests it is bad practice to do this in SQL. Blocking on the outside world is unhealthy in a database and holds open long-running transactions. The proper approach is for the database to signal an external program to perform the required action and then not block on the result. - -One way to do this is using a table to implement a job queue for external programs. However this approach is `dangerous `_ because of its potential interactions with unrelated long-running queries. However things are improving with PostgreSQL 9.5 which introduces SKIP LOCKED to build reliable work queues, see `this article `_. - -Another way to queue tasks for external processing is by bridging PostgreSQL's `LISTEN `_/`NOTIFY `_ pubsub with a dedicated external queue system. Two programs to listen for database events and queue them are - -* `aweber/pgsql-listen-exchange `_ for RabbitMQ -* `SpiderOak/skeeter `_ for ZeroMQ - -For experimentation purposes you can also have external programs LISTEN directly for PostgreSQL events. It's less robust than a queuing system but an example Node program might look like this: - -.. code:: js - - var PS = require('pg-pubsub'); - - if(process.argv.length !== 3) { - console.log("USAGE: DB_URL"); - process.exit(2); - } - var url = process.argv[2], - ps = new PS(url); - - // password reset request events - ps.addChannel('reset', console.log); - // email validation required event - ps.addChannel('validate', console.log); - - // modify me to send emails - -To use this LISTEN/NOTIFY approach (with or without a real queue hooked up) we can make our SQL functions issue a NOTIFY to perform external actions. Two such such functions are those to confirm an email address or send a password reset token. Both will use nonces and need a place to store them, so we'll start there. - -.. code:: postgres - - create type token_type_enum as enum ('validation', 'reset'); - - create table if not exists - basic_auth.tokens ( - token uuid primary key, - token_type token_type_enum not null, - email text not null references basic_auth.users (email) - on delete cascade on update cascade, - created_at timestamptz not null default current_date - ); - -Here is a password reset function to make public for API requests. The function takes a user email address. - -.. code:: plpgsql - - create or replace function - request_password_reset(email text) returns void - language plpgsql - as $$ - declare - tok uuid; - begin - delete from basic_auth.tokens - where token_type = 'reset' - and tokens.email = request_password_reset.email; - - select gen_random_uuid() into tok; - insert into basic_auth.tokens (token, token_type, email) - values (tok, 'reset', request_password_reset.email); - perform pg_notify('reset', - json_build_object( - 'email', request_password_reset.email, - 'token', tok, - 'token_type', 'reset' - )::text - ); - end; - $$; - -Notice the use of `pg_notify` above. It notifies a channel called `reset` with a JSON object containing details of the email address and token. A worker process would directly LISTEN for this event or would pull it off a queue and do the work to send an email with a friendly human readable message. - -Similar to the password reset request, an email validation function creates a token and then defers to external processing. This one won't be publicly accessible, but rather can be triggered on user account creation. - -.. code:: plpgsql - - create or replace function - basic_auth.send_validation() returns trigger - language plpgsql - as $$ - declare - tok uuid; - begin - select gen_random_uuid() into tok; - insert into basic_auth.tokens (token, token_type, email) - values (tok, 'validation', new.email); - perform pg_notify('validate', - json_build_object( - 'email', new.email, - 'token', tok, - 'token_type', 'validation' - )::text - ); - return new; - end - $$; - - drop trigger if exists send_validation on basic_auth.users; - create trigger send_validation - after insert on basic_auth.users - for each row - execute procedure basic_auth.send_validation(); From d38bfc8cf35020c72836b90e33e748a7caa93312 Mon Sep 17 00:00:00 2001 From: Joe Nelson Date: Mon, 31 Oct 2016 22:50:38 -0700 Subject: [PATCH 020/711] Notes for future admin section --- index.rst | 20 +++++++------------- 1 file changed, 7 insertions(+), 13 deletions(-) diff --git a/index.rst b/index.rst index 39bf27b4cb..840f8e27a6 100644 --- a/index.rst +++ b/index.rst @@ -23,22 +23,16 @@ auth.rst -.. Authentication -.. Overview of Role System -.. JSON Web Tokens -.. Internal Generation -.. External Generation -.. SSL -.. Custom Validation -.. Schema Isolation -.. User Management -.. Logins -.. Password Reset .. Administration -.. Block full-table operations +.. Hardening PostgREST +.. Block full-table operation +.. Count header DoS +.. HTTPS +.. Rate limiting .. Alternate URL structure .. API Versioning +.. Schema Reloading .. HTTP Caching -.. Database Caching +.. Upgrading .. Debugging .. (viewing db logs) From e5d46975073640344e9d6c4da33fec166294193d Mon Sep 17 00:00:00 2001 From: Joe Nelson Date: Wed, 2 Nov 2016 20:46:10 -0700 Subject: [PATCH 021/711] Config section in admin page --- admin.rst | 148 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ auth.rst | 4 ++ index.rst | 17 ++----- 3 files changed, 156 insertions(+), 13 deletions(-) create mode 100644 admin.rst diff --git a/admin.rst b/admin.rst new file mode 100644 index 0000000000..68f1aafec7 --- /dev/null +++ b/admin.rst @@ -0,0 +1,148 @@ +Configuration +============= + +The PostgREST server reads a configuration file to determine information about the database and how to serve client requests. There is no predefined location for this file, you must specify it with the `-c` option when starting the server: + +.. code:: bash + + postgrest -c /path/to/postgrest.conf + +The file must contain a set of key value pairs. At minimum you must include these keys: + +.. code:: + + # postgrest.conf + + # The standard connection URI format, documented at + # https://www.postgresql.org/docs/current/static/libpq-connect.html#AEN45347 + db-uri = "postgres://user:pass@host:5432/dbname" + + # The name of which database schema to expose to REST clients + db-schema = "api" + + # The database role to use when no client authentication is provided. + # Can (and probably should) differ from user in db-uri + db-anon-role = "anon" + +The user specified in the db-uri is also known as the authenticator role. For more information about the anonymous vs authenticator roles see the :ref:`roles`. + +Here is the full list of configuration parameters. + +================ ====== ======= ======== +Name Type Default Required +================ ====== ======= ======== +db-uri String Y +db-schema String Y +db-anon-role String Y +db-pool Int 10 +server-host String \*4 +server-port Int 3000 +server-proxy-url String +jwt-secret String +max-rows Int ∞ +pre-request String +================ ====== ======= ======== + +db-uri + The standard connection PostgreSQL `URI format `_. Also allows connections over Unix sockets for higher performance. +db-schema + The database schema to expose to REST clients. Tables, views and stored procedures in this schema will get API endpoints. +db-anon-role + The database role to use when executing commands on behalf of unauthenticated clients. +db-pool + Number of connections to keep open in PostgREST's database pool. Having enough here for the maximum expected simultaneous client connections can improve performance. Note it's pointless to set this higher than the `max_connections` GUC in your database. +server-host + Where to bind the PostgREST web server. +server-port + The port to bind the web server. +server-proxy-url + Overrides the base URL used within the OpenAPI self-documentation hosted at the API root path. +jwt-secret + The secret used to decode JWT tokens clients provide for authentication. If this parameter is not specified then PostgREST refuses authentication requests. Choosing a value for this parameter beginning with the at sign such as `@filename` loads the secret out of an external file which is useful for non-UTF-8 binary secrets. +max-rows + A hard limit to the number of rows PostgREST will fetch from a view, table, or stored procedure. Limits payload size for accidental or malicious requests. +pre-request + A schema-qualified stored procedure name to call right after switching roles for a client request. This provides an opportunity to modify SQL variables or raise an exception to prevent the request from completing. + +Hardening PostgREST +=================== + +PostgREST is a fast way to construct a RESTful API. Its default behavior is great for scaffolding in development. When it's time to go to production it works great too, as long as you take precautions. PostgREST is a small sharp tool that focuses on performing the API-to-database mapping. We rely on a reverse proxy like Nginx for additional safeguards. + +The first step is to create an Nginx configuration file that proxies requests to an underlying PostgREST server. + +.. code:: + + Nginx code goes here. + +Block Full-Table Operations +--------------------------- + +Each table in the admin-selected schema gets exposed as a top level route. Client requests are executed by certain database roles depending on their authentication. All HTTP verbs are supported that correspond to actions permitted to the role. For instance if the active role can drop rows of the table then the DELETE verb is allowed for clients. Here's an API request to delete old rows from a hypothetical logs table: + +.. code:: http + + DELETE /logs?time=lt.1991-08-06 HTTP/1.1 + +However it's very easy to delete the **entire table** by omitting the query parameter! + +.. code:: http + + DELETE /logs HTTP/1.1 + +This can happen accidentally even just by switching a request from a GET to a DELETE. To protect against accidental operations we can add an Nginx rule to prevent DELETE or PATCH requests which lack a query parameter. + +.. code:: + + Nginx stuff goes here + +This does not protect against malicious actions, since someone can add a url parameter that does not affect the resultset. To prevent this you must turn to database permissions, forbidding the wrong people from deleting rows, and using `row-level security `_ if finer access control is required. + +Count-Header DoS +---------------- + +For convenience to client-side pagination controls PostgREST supports counting and reporting total table size in its response. As described in :ref:`Limits and Pagination`_, responses ordinarily include a range and unspecified total like + +.. code-block:: http + + HTTP/1.1 200 OK + Range-Unit: items + Content-Range: 0-14/* + +However including the request header `Prefer: count=exact` calculates and includes the full count: + +.. code-block:: http + + HTTP/1.1 206 Partial Content + Range-Unit: items + Content-Range: 0-14/3573458 + +This is fine in small tables, but count performance degrades in big tables due to the MVCC architecture of PostgreSQL. For very large tables it can take a very long time to retrieve the results which allows a denial of service attack. The solution is to strip this header from all requests: + +.. code:: + + Nginx stuff. Remove any prefer header which contains the word count + +.. note:: + + In future versions we will support `Prefer: count=estimated` to leverage the PostgreSQL statistics tables for a fast (and fairly accurate) result. + +.. _hardening_https: + +HTTPS +----- + +See the :ref:`ssl` section of the authentication guide. + +Rate Limiting +------------- + + +.. Administration +.. Alternate URL structure +.. API Versioning +.. Schema Reloading +.. HTTP Caching +.. Upgrading +.. Debugging +.. (viewing db logs) diff --git a/auth.rst b/auth.rst index 17ef0d913c..5ea384e7ba 100644 --- a/auth.rst +++ b/auth.rst @@ -1,3 +1,5 @@ +.. _roles: + Overview of Role System ======================= @@ -197,6 +199,8 @@ To adapt Auth0 to our uses we need to save the database role in `user metadata < **TODO: add details** +.. _ssl: + SSL --- diff --git a/index.rst b/index.rst index 840f8e27a6..d42418d559 100644 --- a/index.rst +++ b/index.rst @@ -23,16 +23,7 @@ auth.rst -.. Administration -.. Hardening PostgREST -.. Block full-table operation -.. Count header DoS -.. HTTPS -.. Rate limiting -.. Alternate URL structure -.. API Versioning -.. Schema Reloading -.. HTTP Caching -.. Upgrading -.. Debugging -.. (viewing db logs) +.. toctree:: + :caption: Administration + + admin.rst From 0ae281f15f278fe3562a5ac77eca4ba234846e70 Mon Sep 17 00:00:00 2001 From: Joe Nelson Date: Sun, 13 Nov 2016 17:19:13 -0800 Subject: [PATCH 022/711] Debugging steps (sql logging, ngrep) --- admin.rst | 38 ++++++++++++++++++++++++++++++++++++-- 1 file changed, 36 insertions(+), 2 deletions(-) diff --git a/admin.rst b/admin.rst index 68f1aafec7..5b1ae7319d 100644 --- a/admin.rst +++ b/admin.rst @@ -137,6 +137,42 @@ See the :ref:`ssl` section of the authentication guide. Rate Limiting ------------- +Foo + +Debugging +========= + +The PostgREST server logs basic request information to stdout, including the requester's IP address and user agent, the URL requested, and HTTP response status. However this provides limited information for debugging server errors. It's helpful to get full information about both client requests and the corresponding SQL commands executed against the underlying database. + +A great way to inspect incoming HTTP requests including headers and query params is to sniff the network traffic on the port where PostgREST is running. For instance on a development server bound to port 3000 on localhost, run this: + +.. code:: bash + + # sudo access is necessary for watching the network + sudo ngrep -d lo0 port 3000 + +The options to ngrep vary depending on the address and host on which you've bound the server. The binding is described in the `Configuration`_ section. The ngrep output isn't particularly pretty, but it's legible. Note the `Server` response header as well which identifies the version of server. This is important when submitting bug reports. + +Once you've verified that requests are as you expect, you can get more information about the server operations by watching the database logs. By default PostgreSQL does not keep these logs, so you'll need to make the configuration changes below. Find `postgresql.conf` inside your PostgreSQL data directory (to find that, issue the command `show data_directory;`). Either find the settings scattered throughout the file and change them to the following values, or append this block of code to the end of the configuration file. + +.. code:: sql + + # send logs where the collector can access them + log_destination = 'stderr' + + # collect stderr output to log files + logging_collector = on + + # save logs in pg_log/ under the pg data directory + log_directory = 'pg_log' + + # (optional) new log file per day + log_filename = 'postgresql-%Y-%m-%d.log' + + # log every kind of SQL statement + log_statement = 'all' + +Restart the database and watch the log file in real-time to understand how HTTP requests are being translated into SQL commands. .. Administration .. Alternate URL structure @@ -144,5 +180,3 @@ Rate Limiting .. Schema Reloading .. HTTP Caching .. Upgrading -.. Debugging -.. (viewing db logs) From 8258631b03e32f2651ae1e74a16a37cabc8d5ab7 Mon Sep 17 00:00:00 2001 From: Joe Nelson Date: Sun, 13 Nov 2016 18:11:50 -0800 Subject: [PATCH 023/711] Schema reloading --- admin.rst | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/admin.rst b/admin.rst index 5b1ae7319d..b586e99da8 100644 --- a/admin.rst +++ b/admin.rst @@ -174,9 +174,21 @@ Once you've verified that requests are as you expect, you can get more informati Restart the database and watch the log file in real-time to understand how HTTP requests are being translated into SQL commands. +Schema Reloading +---------------- + +PostgREST's database schema cache is a common source of confusion. Detecting the foreign key relationships between tables (including how those relationships pass through views) is an involved query. To speed up regular API requests the server caches the database schema on startup. However if the schema changes while the server is running it results in a stale cache and failures for :ref:`Resource Embedding`_ in API requests. + +To refresh the cache without restarting the PostgREST server, send its process a SIGHUP signal: + +.. code:: bash + + killall -HUP postgrest + +For the future we're investigating ways to keep the cache updated without an intrusive setup procedure or system resource usage. + .. Administration .. Alternate URL structure .. API Versioning -.. Schema Reloading .. HTTP Caching .. Upgrading From aed5618d285ea2efc0c1789f77f1667746e8dc15 Mon Sep 17 00:00:00 2001 From: Joe Nelson Date: Sun, 13 Nov 2016 22:44:18 -0800 Subject: [PATCH 024/711] Suggest pg-safeupdate rather than nginx --- admin.rst | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/admin.rst b/admin.rst index b586e99da8..6835aa9c14 100644 --- a/admin.rst +++ b/admin.rst @@ -90,11 +90,7 @@ However it's very easy to delete the **entire table** by omitting the query para DELETE /logs HTTP/1.1 -This can happen accidentally even just by switching a request from a GET to a DELETE. To protect against accidental operations we can add an Nginx rule to prevent DELETE or PATCH requests which lack a query parameter. - -.. code:: - - Nginx stuff goes here +This can happen accidentally such as by switching a request from a GET to a DELETE. To protect against accidental operations use the `pg-safeupdate `_ PostgreSQL extension. It raises an error if UPDATE or DELETE are executed without specifying conditions. This does not protect against malicious actions, since someone can add a url parameter that does not affect the resultset. To prevent this you must turn to database permissions, forbidding the wrong people from deleting rows, and using `row-level security `_ if finer access control is required. From 954252ed164efc2a2de4839691d7a58b02dc2e5a Mon Sep 17 00:00:00 2001 From: Raphael Schmitt Date: Fri, 18 Nov 2016 18:22:51 +0100 Subject: [PATCH 025/711] corrected url (#24) --- auth.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/auth.rst b/auth.rst index 5ea384e7ba..d98fbc8bba 100644 --- a/auth.rst +++ b/auth.rst @@ -188,7 +188,7 @@ Next write a stored procedure that returns the token. The one below returns a to ) r; $$; -PostgREST exposes this function to clients via a POST request to `/rpc/jwt_token`. +PostgREST exposes this function to clients via a POST request to `/rpc/jwt_test`. JWT from Auth0 ~~~~~~~~~~~~~~ From d1d6001a6db3f357f75c30020444459e4ad02297 Mon Sep 17 00:00:00 2001 From: Joe Nelson Date: Sun, 13 Nov 2016 23:04:54 -0800 Subject: [PATCH 026/711] Alternate url structure --- admin.rst | 16 ++++++++++++++++ api.rst | 2 +- 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/admin.rst b/admin.rst index 6835aa9c14..0151c09af2 100644 --- a/admin.rst +++ b/admin.rst @@ -183,6 +183,22 @@ To refresh the cache without restarting the PostgREST server, send its process a For the future we're investigating ways to keep the cache updated without an intrusive setup procedure or system resource usage. +Alternate URL Structure +======================= + +As discussed in `Singular or Plural`_, there are no special URL forms for singular resources in PostgREST, only operators for filtering. Thus there are no URLs like `/people/1`. It would be specified instead as + +.. code:: http + + GET /people?id=eq.1 + Prefer: plurality=singular + +This allows compound primary keys and makes the intent for singular response independent of a URL convention. However for any table which uses a simple primary key you can use Nginx to simulate the familiar URL convention. + +.. code:: nginx + + nginx code here + .. Administration .. Alternate URL structure .. API Versioning diff --git a/api.rst b/api.rst index 0e9aa142e1..e45952bf8e 100644 --- a/api.rst +++ b/api.rst @@ -11,7 +11,7 @@ There are no deeply/nested/routes. Each route provides OPTIONS, GET, POST, PATCH .. note:: - Why not provide nested routes? Many APIs allow nesting to retrieve related information, such as :code:`/films/1/director`. We offer a more flexible mechanism (inspired by GraphQL) to embed related information. It can handle one-to-many and many-to-many relationships. This is covered in the section about Embedding. + Why not provide nested routes? Many APIs allow nesting to retrieve related information, such as :code:`/films/1/director`. We offer a more flexible mechanism (inspired by GraphQL) to embed related information. It can handle one-to-many and many-to-many relationships. This is covered in the section about `Resource Embedding`_. Filtering --------- From 79de60db581f2656f933f7143b5e4b5db1f66296 Mon Sep 17 00:00:00 2001 From: Joe Nelson Date: Sun, 20 Nov 2016 11:18:29 -0800 Subject: [PATCH 027/711] The -c param is no more --- admin.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/admin.rst b/admin.rst index 0151c09af2..bb81338edd 100644 --- a/admin.rst +++ b/admin.rst @@ -1,11 +1,11 @@ Configuration ============= -The PostgREST server reads a configuration file to determine information about the database and how to serve client requests. There is no predefined location for this file, you must specify it with the `-c` option when starting the server: +The PostgREST server reads a configuration file to determine information about the database and how to serve client requests. There is no predefined location for this file, you must specify the file path as the one and only argument to the server: .. code:: bash - postgrest -c /path/to/postgrest.conf + postgrest /path/to/postgrest.conf The file must contain a set of key value pairs. At minimum you must include these keys: From 684a9f95666541cdc7e33c874f56d8ecc50568d0 Mon Sep 17 00:00:00 2001 From: Joe Nelson Date: Sun, 20 Nov 2016 14:22:46 -0800 Subject: [PATCH 028/711] Spell check, WIP Circle CI for sphinx --- admin.rst | 4 +-- api.rst | 2 +- auth.rst | 4 +-- circle.yml | 8 +++++ install.rst | 2 +- intro.rst | 6 ++-- postgrest.dict | 85 ++++++++++++++++++++++++++++++++++++++++++++++++++ 7 files changed, 102 insertions(+), 9 deletions(-) create mode 100644 circle.yml create mode 100644 postgrest.dict diff --git a/admin.rst b/admin.rst index bb81338edd..5ba5d40976 100644 --- a/admin.rst +++ b/admin.rst @@ -92,7 +92,7 @@ However it's very easy to delete the **entire table** by omitting the query para This can happen accidentally such as by switching a request from a GET to a DELETE. To protect against accidental operations use the `pg-safeupdate `_ PostgreSQL extension. It raises an error if UPDATE or DELETE are executed without specifying conditions. -This does not protect against malicious actions, since someone can add a url parameter that does not affect the resultset. To prevent this you must turn to database permissions, forbidding the wrong people from deleting rows, and using `row-level security `_ if finer access control is required. +This does not protect against malicious actions, since someone can add a url parameter that does not affect the result set. To prevent this you must turn to database permissions, forbidding the wrong people from deleting rows, and using `row-level security `_ if finer access control is required. Count-Header DoS ---------------- @@ -138,7 +138,7 @@ Foo Debugging ========= -The PostgREST server logs basic request information to stdout, including the requester's IP address and user agent, the URL requested, and HTTP response status. However this provides limited information for debugging server errors. It's helpful to get full information about both client requests and the corresponding SQL commands executed against the underlying database. +The PostgREST server logs basic request information to stdout, including the requesting IP address and user agent, the URL requested, and HTTP response status. However this provides limited information for debugging server errors. It's helpful to get full information about both client requests and the corresponding SQL commands executed against the underlying database. A great way to inspect incoming HTTP requests including headers and query params is to sniff the network traffic on the port where PostgREST is running. For instance on a development server bound to port 3000 on localhost, run this: diff --git a/api.rst b/api.rst index e45952bf8e..73fa46ceaa 100644 --- a/api.rst +++ b/api.rst @@ -146,7 +146,7 @@ Note that the server may respond with fewer if unable to meet your request: You may also request open-ended ranges for an offset with no limit, e.g. :code:`Range: 10-`. -The other way to request a limit or offset is with query pamameters. For example +The other way to request a limit or offset is with query parameters. For example .. code-block:: http diff --git a/auth.rst b/auth.rst index d98fbc8bba..f945336468 100644 --- a/auth.rst +++ b/auth.rst @@ -61,7 +61,7 @@ You can use row-level security to flexibly restrict visibility and access for th message_body TEXT ); -We want to enforce a policy that ensures a user can see only those messages sent by him or intended for him. Also we want to prevent a user from forging the message_from column with anyone else's name. +We want to enforce a policy that ensures a user can see only those messages sent by him or intended for him. Also we want to prevent a user from forging the message_from column with another person's name. PostgreSQL (9.5 and later) allows us to set this policy with row-level security: @@ -310,7 +310,7 @@ In the previous section we created an internal table to store user information. Logins ~~~~~~ -As described in `JWT from SQL`_, we'll create a JWT inside our login function. Note that you'll need to adjust the secret key which is hardcoded in this example to a secure secret of your choosing. +As described in `JWT from SQL`_, we'll create a JWT inside our login function. Note that you'll need to adjust the secret key which is hard-coded in this example to a secure secret of your choosing. .. code:: plpgsql diff --git a/circle.yml b/circle.yml new file mode 100644 index 0000000000..ae7ac312b9 --- /dev/null +++ b/circle.yml @@ -0,0 +1,8 @@ +dependencies: + pre: + - sudo apt-get install aspell + +test: + override: + - cat *.rst | grep -v '^\(\.\.\| \)' | sed 's/`.*`//g' |aspell -d en_US -p ./postgrest.dict list | tee misspellings + - test ! -s misspellings diff --git a/install.rst b/install.rst index 5edde5e553..430161bcfa 100644 --- a/install.rst +++ b/install.rst @@ -21,7 +21,7 @@ Build from Source We discourage building and using PostgREST on **Alpine Linux** because of a reported GHC memory leak on that platform. -When a prebuilt binary does not exist for your system you can build the project from source. You'll also need to do this if you want to help with development. `Stack `_ makes it easy. It will install any necessary Haskell dependencies on your system. +When a pre-built binary does not exist for your system you can build the project from source. You'll also need to do this if you want to help with development. `Stack `_ makes it easy. It will install any necessary Haskell dependencies on your system. * `Install Stack `_ for your platform * Install Library Dependencies diff --git a/intro.rst b/intro.rst index 0baee66198..e90839bfab 100644 --- a/intro.rst +++ b/intro.rst @@ -10,8 +10,8 @@ Declarative Programming It's easier to ask PostgreSQL to join data for you and let its query planner figure out the details than to loop through rows yourself. It's easier to assign permissions to db objects than to add guards in controllers. (This is especially true for cascading permissions in data dependencies.) It's easier set constraints than to litter code with sanity checks. -Leakproof Abstraction ---------------------- +Leak-proof Abstraction +---------------------- There is no ORM involved. Creating new views happens in SQL with known performance implications. A database administrator can now create an API from scratch with no custom programming. @@ -28,7 +28,7 @@ PostgREST has a focused scope. It works well with other tools like Nginx. This f Shared Improvements ------------------- -As with any open source project, we all gain from features and fixes in the tool. It's more beneficial than improvements locked inextricably within custom codebases. +As with any open source project, we all gain from features and fixes in the tool. It's more beneficial than improvements locked inextricably within custom code-bases. Ecosystem ######### diff --git a/postgrest.dict b/postgrest.dict new file mode 100644 index 0000000000..5966273cbc --- /dev/null +++ b/postgrest.dict @@ -0,0 +1,85 @@ +personal_ws-1.1 en 0 utf-8 +Auth +Codd +DoS +GUC +Github +Google +GraphQL +HMAC +HTTPS +Haskell +Heroku +Homebrew +ILIKE +IP +JS +JSON +JWT +Logins +MVCC +Mithril +NGINX +Nginx +OAuth +ORM +OpenAPI +PaaS +PostGIS +PostgREST +PostgREST's +PostgreSQL +PostgreSQL's +RDS +RESTful +RLS +RestSharp +SHA +SIGHUP +SQL +SSL +Sencha +SuperAgent +UI +Vondra +WAI +api +auth +authenticator +balancer +centric +config +cryptographically +eq +gte +http +ilike +jwt +localhost +login +logins +lt +lte +middleware +namespaced +neq +ngrep +nullsfirst +nullslast +param +params +passphrase +pgcrypto +pgjwt +pre +refactor +signup +sqitch +startup +stdout +tsquery +uri +url +verifier +versioning +webuser From 2a77ff5714aa19a07fe0e6bccd0aa8e8ecd8af8b Mon Sep 17 00:00:00 2001 From: Joe Nelson Date: Sun, 20 Nov 2016 16:37:18 -0800 Subject: [PATCH 029/711] Schema cache rewrite --- admin.rst | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/admin.rst b/admin.rst index 5ba5d40976..a7d145d7f2 100644 --- a/admin.rst +++ b/admin.rst @@ -173,15 +173,15 @@ Restart the database and watch the log file in real-time to understand how HTTP Schema Reloading ---------------- -PostgREST's database schema cache is a common source of confusion. Detecting the foreign key relationships between tables (including how those relationships pass through views) is an involved query. To speed up regular API requests the server caches the database schema on startup. However if the schema changes while the server is running it results in a stale cache and failures for :ref:`Resource Embedding`_ in API requests. +Users are often confused by PostgREST's database schema cache. It is present because detecting foreign key relationships between tables (including how those relationships pass through views) is necessary, but costly. API requests consult the schema cache as part of :ref:`Resource Embedding`_. However if the schema changes while the server is running it results in a stale cache and leads to errors claiming that no relations are detected between tables. -To refresh the cache without restarting the PostgREST server, send its process a SIGHUP signal: +To refresh the cache without restarting the PostgREST server, send the server process a SIGHUP signal: .. code:: bash killall -HUP postgrest -For the future we're investigating ways to keep the cache updated without an intrusive setup procedure or system resource usage. +In the future we're investigating ways to keep the cache updated without manual intervention. Alternate URL Structure ======================= From 216550e9590e8c55d94b49e3018f0728dfcaaa26 Mon Sep 17 00:00:00 2001 From: Joe Nelson Date: Sun, 20 Nov 2016 21:39:35 -0800 Subject: [PATCH 030/711] Content negotiation --- api.rst | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/api.rst b/api.rst index 73fa46ceaa..1cceabdf1b 100644 --- a/api.rst +++ b/api.rst @@ -175,6 +175,24 @@ Note that the larger the table the slower this query runs in the database. The s Response Format --------------- +PostgREST uses proper HTTP content negotiation (`RFC7231 `_) to deliver the desired representation of a resource. That is to say the same API endpoint can respond respond in different formats like JSON or CSV depending on the client request. + +Use the Accept request header to specify the acceptable format (or formats) for the response: + +.. code-block:: http + + GET /people HTTP/1.1 + Accept: application/json + +The current possibilities are + +* \*/\* +* text/csv +* application/json +* application/openapi+json + +The server will default to JSON for API endpoints and OpenAPI on the root. + Singular or Plural ------------------ From dacf39404e598049e3e1050486d76700b52f17e0 Mon Sep 17 00:00:00 2001 From: Joe Nelson Date: Sun, 20 Nov 2016 22:03:04 -0800 Subject: [PATCH 031/711] Singular or plural --- api.rst | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/api.rst b/api.rst index 1cceabdf1b..d9e6e7398d 100644 --- a/api.rst +++ b/api.rst @@ -196,6 +196,33 @@ The server will default to JSON for API endpoints and OpenAPI on the root. Singular or Plural ------------------ +By default PostgREST returns all JSON results in an array, even when there is only one item. For example, requesting `/items?id=eq.1` returns + +.. code:: json + + [ + { "id": 1 } + ] + +This can be inconvenient for client code. To return the first result as an object unenclosed by an array, Include a Prefer request header + +.. code:: http + + GET /items?id=eq.1 HTTP/1.1 + Prefer: plurality=singular + +This returns + +.. code:: json + + { "id": 1 } + +.. note:: + + Many APIs distinguish plural and singular resources using a special nested URL convention e.g. `/stories` vs `/stories/1`. Why do we use `/stories?id=eq.1`? It is because a singlular resource is (for us) a row determined by a primary key, and primary keys can be compound (meaning defined across more than one column). The more familiar nested urls consider only a degenerate case of simple and overwhelmingly numeric primary keys. These so-called artificial keys are often introduced automatically by Object Relational Mapping libraries. + + Admittedly PostgREST could detect when there is an equality condition holding on all columns constituting the primary key and automatically convert to singular. However this could lead to a surprising change of format that breaks unwary client code just by filtering on an extra column. Instead we allow manually specifying singular vs plural to decouple that choice from the URL format. + OpenAPI Support =============== From 455dc5c8bc631a874d89e490239aa30fba975b56 Mon Sep 17 00:00:00 2001 From: Joe Nelson Date: Sun, 20 Nov 2016 22:41:05 -0800 Subject: [PATCH 032/711] OpenAPI overview --- api.rst | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/api.rst b/api.rst index d9e6e7398d..e7bc523983 100644 --- a/api.rst +++ b/api.rst @@ -226,6 +226,10 @@ This returns OpenAPI Support =============== +Every API hosted by PostgREST automatically serves a full `OpenAPI `_ description on the root path. This provides a list of all endpoints, along with supported HTTP verbs and example payloads. + +You can use a tool like `Swagger UI `_ to create beautiful documentation from the description and host an interactive web-based dahsboard. The dashboard allows developers to make requests against a live PostgREST server, provides guidance with request headers and example request bodies. + Resource Embedding ================== From b35ffd4931212b7dc19082c38642657fd4b56993 Mon Sep 17 00:00:00 2001 From: Joe Nelson Date: Mon, 21 Nov 2016 23:04:06 -0800 Subject: [PATCH 033/711] First draft of resource embedding --- _static/film.png | Bin 0 -> 51752 bytes api.rst | 85 ++++++++++++++++++++++++++++++++++++++++++----- erd/film.er | 40 ++++++++++++++++++++++ 3 files changed, 116 insertions(+), 9 deletions(-) create mode 100644 _static/film.png create mode 100644 erd/film.er diff --git a/_static/film.png b/_static/film.png new file mode 100644 index 0000000000000000000000000000000000000000..99843b8709145b1f89bf14ea93b2134a9f2b4a2f GIT binary patch literal 51752 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 HDWM4f7(Sx2 literal 0 HcmV?d00001 diff --git a/api.rst b/api.rst index e7bc523983..02817aeb44 100644 --- a/api.rst +++ b/api.rst @@ -13,8 +13,8 @@ There are no deeply/nested/routes. Each route provides OPTIONS, GET, POST, PATCH Why not provide nested routes? Many APIs allow nesting to retrieve related information, such as :code:`/films/1/director`. We offer a more flexible mechanism (inspired by GraphQL) to embed related information. It can handle one-to-many and many-to-many relationships. This is covered in the section about `Resource Embedding`_. -Filtering ---------- +Horizontal Filtering (Rows) +--------------------------- You can filter result rows by adding conditions on columns, each condition a query string parameter. For instance, to return people aged under 13 years old: @@ -54,6 +54,17 @@ To negate any operator, prefix it with :code:`not` like :code:`?a=not.eq.2`. For more complicated filters (such as those involving condition 1 OR condition 2) you will have to create a new view in the database. +Vertical Filtering (Columns) +---------------------------- + +When certain columns are wide (such as those holding binary data), it is more efficient for the server to withold them in a response. The client can specify which columns are required using the `select` parameter. + +.. code-block:: http + + GET /people?select=fname,age + +The default is `*`, meaning all columns. This value will become more important below in :ref:`Resource Embedding`_. + .. _computed_cols: Computed Columns @@ -107,12 +118,6 @@ If you care where nulls are sorted, add nullsfirst or nullslast: GET /people?order=age.desc.nullslast HTTP/1.1 -To order the embedded items, you need to specify the tree path for the order param like so. - -.. code-block:: http - - GET /projects?select=id,name,tasks{id,name}&order=id.asc&tasks.order=name.asc HTTP/1.1 - You can also use :ref:`computed_cols` to order the results, even though the computed columns will not appear in the output. Limits and Pagination @@ -219,7 +224,7 @@ This returns .. note:: - Many APIs distinguish plural and singular resources using a special nested URL convention e.g. `/stories` vs `/stories/1`. Why do we use `/stories?id=eq.1`? It is because a singlular resource is (for us) a row determined by a primary key, and primary keys can be compound (meaning defined across more than one column). The more familiar nested urls consider only a degenerate case of simple and overwhelmingly numeric primary keys. These so-called artificial keys are often introduced automatically by Object Relational Mapping libraries. + Many APIs distinguish plural and singular resources using a special nested URL convention e.g. `/stories` vs `/stories/1`. Why do we use `/stories?id=eq.1`? The answer is because a singlular resource is (for us) a row determined by a primary key, and primary keys can be compound (meaning defined across more than one column). The more familiar nested urls consider only a degenerate case of simple and overwhelmingly numeric primary keys. These so-called artificial keys are often introduced automatically by Object Relational Mapping libraries. Admittedly PostgREST could detect when there is an equality condition holding on all columns constituting the primary key and automatically convert to singular. However this could lead to a surprising change of format that breaks unwary client code just by filtering on an extra column. Instead we allow manually specifying singular vs plural to decouple that choice from the URL format. @@ -233,6 +238,68 @@ You can use a tool like `Swagger UI `_ to create Resource Embedding ================== +In addition to providing RESTful routes for each table and view, PostgREST allows related resources to be included together in a single API call. This reduces the need for multiple API requests. The server uses foreign keys to determine which tables and views can be returned together. For example, consider a database of films and their awards: + +.. image:: _static/film.png + +As seen above in `vertical_filtering`_ we can request the titles of all films like this: + +.. code-block:: http + + GET /films?select=title HTTP/1.1 + +This might return something like + +.. code-block:: json + + [ + { "title": "Workers Leaving The Lumière Factory In Lyon" }, + { "title": "The Dickson Experimental Sound Film" }, + { "title": "The Haunted Castle" } + ] + +However because a foreign key constraint exists between Films and Directors, we can request this information be included: + +.. code-block:: http + + GET /films?select=title,directors{last_name} HTTP/1.1 + +Which would return + +.. code-block:: json + + [ + { "title": "Workers Leaving The Lumière Factory In Lyon", + "directors": { + "last_name": "Lumière" + } + }, + { "title": "The Dickson Experimental Sound Film", + "directors": { + "last_name": "Dickson" + } + }, + { "title": "The Haunted Castle", + "directors": { + "last_name": "Méliès" + } + } + ] + +PostgREST can also detect relations going through join tables. Thus you can request the Actors for Films (which in this case finds the information through Roles). You can also reverse the direction of inclusion, asking for all Directories with each including the list of their Films. + +To order the embedded items, you need to specify the tree path in the order parameter. For instance + +.. code-block:: http + + GET /films?select=*,actors{*}&actors.order=last_name,first_name HTTP/1.1 + +Note this does not change the order of the Films, but of the list of Actors in each Film. + +.. note:: + + Whenever foreign key relations change in the database schema you must refresh PostgREST's schema cache to allow resource embedding to work properly. See the section :ref:`Schema Reloading`_. + Query Limitations ================= diff --git a/erd/film.er b/erd/film.er new file mode 100644 index 0000000000..d19fdf61b5 --- /dev/null +++ b/erd/film.er @@ -0,0 +1,40 @@ +[Films] +*id ++director_id +title +year +rating +language + +[Directors] +*id +first_name +last_name + +[Actors] +*id +first_name +last_name + +[Roles] +*+film_id +*+actor_id +character + +[Competitions] +*id +name +year + +[Nominations] +*+competition_id +*+film_id +rank + +Roles *--1 Actors +Roles *--1 Films + +Nominations *--1 Competitions +Nominations *--1 Films + +Films *--1 Directors From 6a2ba25414a975e90f070418008f16ce33cd132d Mon Sep 17 00:00:00 2001 From: Joe Nelson Date: Fri, 25 Nov 2016 15:01:52 -0800 Subject: [PATCH 034/711] Custom CSS --- _static/css/custom.css | 3 +++ conf.py | 5 +++++ 2 files changed, 8 insertions(+) create mode 100644 _static/css/custom.css diff --git a/_static/css/custom.css b/_static/css/custom.css new file mode 100644 index 0000000000..ee869c6da7 --- /dev/null +++ b/_static/css/custom.css @@ -0,0 +1,3 @@ +div.wy-menu.rst-pro { + display: none !important; +} diff --git a/conf.py b/conf.py index bcc453897d..8479fd3019 100644 --- a/conf.py +++ b/conf.py @@ -284,3 +284,8 @@ # If true, do not generate a @detailmenu in the "Top" node's menu. #texinfo_no_detailmenu = False + +# -- Custom setup --------------------------------------------------------- + +def setup(app): + app.add_stylesheet('css/custom.css') From 5a31320a8b7906ebfbcbf75d1adcb2519b0903c5 Mon Sep 17 00:00:00 2001 From: Joe Nelson Date: Fri, 25 Nov 2016 15:02:00 -0800 Subject: [PATCH 035/711] TeX description --- conf.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/conf.py b/conf.py index 8479fd3019..489726976e 100644 --- a/conf.py +++ b/conf.py @@ -269,8 +269,8 @@ # dir menu entry, description, category) texinfo_documents = [ (master_doc, 'PostgREST', u'PostgREST Documentation', - author, 'PostgREST', 'One line description of project.', - 'Miscellaneous'), + author, 'PostgREST', 'REST API for any PostgreSQL database', + 'Web'), ] # Documents to append as an appendix to all manuals. From 5b95d22e2ad44343cf9b6eb5cd47b8137ea3cdc1 Mon Sep 17 00:00:00 2001 From: Joe Nelson Date: Sun, 27 Nov 2016 12:28:10 -0800 Subject: [PATCH 036/711] Base nginx conf from Ruslan --- admin.rst | 25 +++++++++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/admin.rst b/admin.rst index a7d145d7f2..b5bcb35216 100644 --- a/admin.rst +++ b/admin.rst @@ -71,9 +71,30 @@ PostgREST is a fast way to construct a RESTful API. Its default behavior is grea The first step is to create an Nginx configuration file that proxies requests to an underlying PostgREST server. -.. code:: +.. code:: nginx - Nginx code goes here. + http { + ... + # upstream configuration + upstream postgrest { + server localhost:3000; + keepalive 64; + } + ... + server { + ... + # expose to the outside world + location /api { + default_type application/json; + proxy_hide_header Content-Location; + add_header Content-Location /api$upstream_http_content_location; + proxy_set_header Connection ""; + proxy_http_version 1.1; + proxy_pass http://postgrest/; + } + ... + } + } Block Full-Table Operations --------------------------- From 8c2a95b98e3d3bf7202ae0b39b12898bb4dbd577 Mon Sep 17 00:00:00 2001 From: Joe Nelson Date: Wed, 30 Nov 2016 21:21:57 -0800 Subject: [PATCH 037/711] Test suite instructions from @dsimunic --- install.rst | 143 ++++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 122 insertions(+), 21 deletions(-) diff --git a/install.rst b/install.rst index 430161bcfa..4bf888f48e 100644 --- a/install.rst +++ b/install.rst @@ -14,6 +14,39 @@ The `release page `_ has # You should see a usage help message +Homebrew +======== + +You can use the Homebrew package manager to install PostgREST on Mac + +.. code-block:: bash + + # Ensure brew is up to date + brew update + + # Check for any problems with brew's setup + brew doctor + + # Install the postgrest package + brew install postgrest + +This will automatically install PostgreSQL as a dependency. The process tends to take up to 15 minutes to install the package and its dependencies. + +After installation completes, the tool is added to your $PATH and can be used from anywhere with: + +.. code-block:: bash + + postgrest --help + +PostgreSQL dependency +===================== + +To use PostgREST you will need an underlying database (PostgreSQL version 9.3 or greater is required). You can use something like Amazon `RDS `_ but installing your own locally is cheaper and more convenient for development. + +* `Instructions for OS X `_ +* `Instructions for Ubuntu 14.04 `_ +* `Installer for Windows `_ + Build from Source ================= @@ -45,38 +78,106 @@ When a pre-built binary does not exist for your system you can build the project * Check that the server is installed: :code:`postgrest --help`. -If you want to run the test suite, stack can do that too: :code:`stack test`. +PostgREST Test Suite +-------------------- -PostgreSQL dependency -===================== +Creating the Test Database +~~~~~~~~~~~~~~~~~~~~~~~~~~ -To use PostgREST you will need an underlying database (PostgreSQL version 9.3 or greater is required). You can use something like Amazon `RDS `_ but installing your own locally is cheaper and more convenient for development. +To properly run postgrest tests one needs to create a database. To do so, use the test creation script `create_test_database` in the `test/` folder. -* `Instructions for OS X `_ -* `Instructions for Ubuntu 14.04 `_ -* `Installer for Windows `_ +The script expects the following parameters: -Homebrew -======== +.. code:: bash -You can use the Homebrew package manager to install PostgREST on Mac + test/create_test_db connection_uri database_name [test_db_user] [test_db_user_password] -.. code-block:: bash +Use the `connection URI `_ to specify the user, password, host, and port. Do not provide the database in the connection URI. The Postgres role you are using to connect must be capable of creating new databases. - # Ensure brew is up to date - brew update +The `database_name` is the name of the database that `stack test` will connect to. If the database of the same name already exists on the server, the script will first drop it and then re-create it. - # Check for any problems with brew's setup - brew doctor +Optionally, specify the database user `stack test` will use. The user will be given necessary permissions to reset the database after every test run. - # Install the postgrest package - brew install postgrest +If the user is not specified, the script will generate the role name `postgrest_test_` suffixed by the chosen database name, and will generate a random password for it. -This will automatically install PostgreSQL as a dependency. The process tends to take up to 15 minutes to install the package and its dependencies. +Optionally, if specifying an existing user to be used for the test connection, one can specify the password the user has. -After installation completes, the tool is added to your $PATH and can be used from anywhere with: +The script will return the db uri to use in the tests--this uri corresponds to the `db-uri` parameter in the configuration file that one would use in production. -.. code-block:: bash +Generating the user and the password allows one to create the database and run the tests against any postgres server without any modifications to the server. (Such as allowing accounts without a passoword or setting up trust authentication, or requiring the server to be on the same localhost the tests are run from). - postgrest --help +Running the Tests +~~~~~~~~~~~~~~~~~ + +To run the tests, one must supply the database uri in the environment variable `POSTGREST_TEST_CONNECTION`. + +Typically, one would create the database and run the test in the same command line, using the `postgres` superuser: + +.. code:: bash + + POSTGREST_TEST_CONNECTION=$(test/create_test_db "postgres://postgres:pwd@database-host" test_db) stack test + +For repeated runs on the same database, one should export the connection variable: + +.. code:: bash + + export POSTGREST_TEST_CONNECTION=$(test/create_test_db "postgres://postgres:pwd@database-host" test_db) + stack test + stack test + ... + +If the environment variable is empty or not specified, then the test runner will default to connection uri + +.. code:: bash + + postgres://postgrest_test@localhost/postgrest_test + +This connection assumes the test server on the `localhost` with the user `postgrest_test` without the password and the database of the same name. + +Destroying the Database +~~~~~~~~~~~~~~~~~~~~~~~ + +The test database will remain after the test, together with four new roles created on the postgres server. To permanently erase the created database and the roles, run the script `test/delete_test_database`, using the same superuser role used for creating the database: + +.. code:: bash + + test/destroy_test_db connection_uri database_name + +Testing with Docker +~~~~~~~~~~~~~~~~~~~ + +The ability to connect to non-local PostgreSQL simplifies the test setup. One elegant way of testing is to use a disposable PostgreSQL in docker. + +For example, if local development is on a mac with Docker for Mac installed: + +.. code:: bash + + $ docker run --name db-scripting-test -e POSTGRES_PASSWORD=pwd -p 5434:5432 -d postgres + $ POSTGREST_TEST_CONNECTION=$(test/create_test_db "postgres://postgres:pwd@localhost:5434" test_db) stack test + +Additionally, if one creates a docker container to run stack test (this is necessary on MacOS Sierra with GHC below 8.0.1, where `stack test` fails), one can run PostgreSQL in a separate linked container, or use the locally installed Postgres.app. + +Build the test container with `test/Dockerfile.test`: + +.. code:: bash + + $ docker build -t pgst-test - < text/Dockerfile.test + $ mkdir .stack-work-docker ~/.stack-linux + +The first run of the test container will take a long time while the dependencies get cached. Creating the `~/.stack-linux` folder and mapping it as a volume into the container ensures that we can run the container in disposable mode and not worry about subsequent runs being slow. `.stack-work-docker` is also mapped into the container and must be specified when using stack from Linux, not to interfere with the `.stack-work` for local development. (On Sierra, `stack build` works, while `stack test` fails with GHC 8.0.1). + +Linked containers: + +.. code:: bash + + $ docker run --name pg -e POSTGRES_PASSWORD=pwd -d postgres + $ docker run --rm -it -v `pwd`:`pwd` -v ~/.stack-linux:/root/.stack --link pg:pg -w="`pwd`" -v `pwd`/.stack-work-docker:`pwd`/.stack-work pgst-test bash -c "POSTGREST_TEST_CONNECTION=$(test/create_test_db "postgres://postgres:pwd@pg" test_db) stack test" + +Stack test in Docker for Mac, Postgres.app on mac: + +.. code:: bash + $ host_ip=$(ifconfig en0 | grep 'inet ' | cut -f 2 -d' ') + $ export POSTGREST_TEST_CONNECTION=$(test/create_test_db "postgres://postgres@$HOST" test_db) + $ docker run --rm -it -v `pwd`:`pwd` -v ~/.stack-linux:/root/.stack -v `pwd`/.stack-work-docker:`pwd`/.stack-work -e "HOST=$host_ip" -e "POSTGREST_TEST_CONNECTION=$POSTGREST_TEST_CONNECTION" -w="`pwd`" pgst-test bash -c "stack test" + $ test/destroy_test_db "postgres://postgres@localhost" test_db From 1f12dedce6b0d3fe10e95c5ba91351d87d22f382 Mon Sep 17 00:00:00 2001 From: Joe Nelson Date: Fri, 2 Dec 2016 10:15:12 -0800 Subject: [PATCH 038/711] Include Ruslan's env_var helper function in note --- auth.rst | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/auth.rst b/auth.rst index f945336468..2430a50092 100644 --- a/auth.rst +++ b/auth.rst @@ -103,6 +103,28 @@ This allows JWT generation services to include extra information and your databa -- an exception if the setting is not present. Default it to ''. ALTER DATABASE your_db_name SET request.claim.email TO ''; + If you are unable to issue an ALTER DATABASE statement (for instance on Amazon RDS), you can create a helper function to read environment variables and swallow exceptions. + + .. code:: plpgsql + + create function env_var(v text) returns text as $$ + declare + result text; + begin + begin + select current_setting(v) into result; + exception + when undefined_object then + return null; + end; + + return result; + end; + $$ stable language plpgsql; + + -- now you can call call for instance + -- SELECT env_var('request.claim.email') + Hybrid User-Group Roles ~~~~~~~~~~~~~~~~~~~~~~~ From 2c1eb9ab13324ebdea285cbad71387de5ebc720e Mon Sep 17 00:00:00 2001 From: Joe Nelson Date: Fri, 2 Dec 2016 15:50:02 -0800 Subject: [PATCH 039/711] Add queueing bridges to docs --- intro.rst | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/intro.rst b/intro.rst index e90839bfab..575b99fe70 100644 --- a/intro.rst +++ b/intro.rst @@ -47,13 +47,14 @@ Client-Side Libraries * `davidthewatson/postgrest_python_requests_client `_ - Python * `calebmer/postgrest-client `_ - JS -Extensions ----------- +External Notification +--------------------- -* `diogob/postgrest-ws `_ - expose web sockets for PostgreSQL's LISTEN/NOTIFY -* `srid/spas `_ - allow file uploads and basic auth -* `svmnotn/postgrest-auth `_ - OAuth2-inspired external auth server -* `nblumoe/postgrest-oauth `_ - OAuth2 WAI middleware +These are PostgreSQL bridges that propagate LISTEN/NOTIFY to external queues for further processing. This allows stored procedures to initiate actions outside the database such as sending emails. + +* `matthewmueller/pg-sns-bridge `_ - Amazon SNS +* `aweber/pgsql-listen-exchange `_ - RabbitMQ +* `SpiderOak/skeeter `_ - ZeroMQ Example Apps ------------ @@ -80,6 +81,14 @@ In Production * `Image-charts `_ * `Drip Depot `_ +Extensions +---------- + +* `diogob/postgrest-ws `_ - expose web sockets for PostgreSQL's LISTEN/NOTIFY +* `srid/spas `_ - allow file uploads and basic auth +* `svmnotn/postgrest-auth `_ - OAuth2-inspired external auth server +* `nblumoe/postgrest-oauth `_ - OAuth2 WAI middleware + Commercial PaaS --------------- From 564c51fe7999eaf89145c2b54ec2c7c547c68c6b Mon Sep 17 00:00:00 2001 From: Joe Nelson Date: Sun, 4 Dec 2016 13:34:33 -0800 Subject: [PATCH 040/711] Stored procs --- api.rst | 50 +++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 47 insertions(+), 3 deletions(-) diff --git a/api.rst b/api.rst index 02817aeb44..7480539973 100644 --- a/api.rst +++ b/api.rst @@ -233,7 +233,11 @@ OpenAPI Support Every API hosted by PostgREST automatically serves a full `OpenAPI `_ description on the root path. This provides a list of all endpoints, along with supported HTTP verbs and example payloads. -You can use a tool like `Swagger UI `_ to create beautiful documentation from the description and host an interactive web-based dahsboard. The dashboard allows developers to make requests against a live PostgREST server, provides guidance with request headers and example request bodies. +You can use a tool like `Swagger UI `_ to create beautiful documentation from the description and to host an interactive web-based dahsboard. The dashboard allows developers to make requests against a live PostgREST server, provides guidance with request headers and example request bodies. + +.. note:: + + The OpenAPI information can go out of date as the schema changes under a running server. To learn how to refresh the cache see :ref:`Schema Reloading`_. Resource Embedding ================== @@ -300,12 +304,52 @@ Note this does not change the order of the Films, but of the list of Actors in e Whenever foreign key relations change in the database schema you must refresh PostgREST's schema cache to allow resource embedding to work properly. See the section :ref:`Schema Reloading`_. -Query Limitations -================= +Custom Queries +============== + +The PostgREST url grammar limits the kinds of queries clients can perform. It prevents arbitrary, potentially poorly constructed and slow client queries. It's good for quality of service, but means database administrators must create custom views and stored procedures to provide richer endpoints. The most common causes for custom endpoints are + +* Table unions and OR-conditions in the where clause +* More complicated joins than those provided by `Resource Embedding`_ +* Geospatial queries that require an argument, like "points near (lat,lon)" +* More sophisticated full-text search than a simple use of the `@@` filter Stored Procedures ================= +Every stored procedure in the API-exposed database schema is accessible under the `/rpc` prefix. The API endpoint supports only POST which executes the function. + +.. code:: http + + POST /rpc/function_name HTTP/1.1 + +Procedures must used `named arguments `_. To supply arguments in an API call, include a JSON object in the request payload and each key/value of the object will become an argument. + +For instance, assume we have created this function in the database. + +.. code:: plpgsql + + CREATE FUNCTION add_them(a integer, b integer) + RETURNS integer AS $$ + SELECT $1 + $2; + $$ LANGUAGE SQL IMMUTABLE STRICT; + +The client can call it by posting an object like + +.. code:: http + + POST /rpc/add_them HTTP/1.1 + { "a": 1, "b": 2} + +The keys of the object match the parameter names. Note that PostgreSQL converts parameter names to lowercase unless you quote them like `CREATE FUNCTION foo("mixedCase" text) ...`. + +.. note:: + + Why the `/rpc` prefix? One reason is to avoid name collisions between views and procedures. It also helps emphasize to API consumers that these functions are not normal restful things. The functions can have arbitrary and surprising behavior, not the standard "post creates a resource" thing that users expect from the other routes. + + We are considering allowing GET requests for functions that are marked non-volatile. Allowing GET is important for HTTP caching. However we still must decide how to pass function parameters since request bodies are not allowed. Also some query string arguments are already reserved for shaping/filtering the output. + + Insertions / Updates ==================== From 6b255e98065d01b5c47e0e8627fc50e5f4610379 Mon Sep 17 00:00:00 2001 From: Joe Nelson Date: Sun, 4 Dec 2016 13:59:24 -0800 Subject: [PATCH 041/711] Mark inline code as code, not italics --- admin.rst | 16 ++++++++-------- api.rst | 20 ++++++++++++-------- auth.rst | 18 +++++++++--------- install.rst | 22 +++++++++++----------- 4 files changed, 40 insertions(+), 36 deletions(-) diff --git a/admin.rst b/admin.rst index b5bcb35216..7946471503 100644 --- a/admin.rst +++ b/admin.rst @@ -50,7 +50,7 @@ db-schema db-anon-role The database role to use when executing commands on behalf of unauthenticated clients. db-pool - Number of connections to keep open in PostgREST's database pool. Having enough here for the maximum expected simultaneous client connections can improve performance. Note it's pointless to set this higher than the `max_connections` GUC in your database. + Number of connections to keep open in PostgREST's database pool. Having enough here for the maximum expected simultaneous client connections can improve performance. Note it's pointless to set this higher than the :code:`max_connections` GUC in your database. server-host Where to bind the PostgREST web server. server-port @@ -58,7 +58,7 @@ server-port server-proxy-url Overrides the base URL used within the OpenAPI self-documentation hosted at the API root path. jwt-secret - The secret used to decode JWT tokens clients provide for authentication. If this parameter is not specified then PostgREST refuses authentication requests. Choosing a value for this parameter beginning with the at sign such as `@filename` loads the secret out of an external file which is useful for non-UTF-8 binary secrets. + The secret used to decode JWT tokens clients provide for authentication. If this parameter is not specified then PostgREST refuses authentication requests. Choosing a value for this parameter beginning with the at sign such as :code:`@filename` loads the secret out of an external file which is useful for non-UTF-8 binary secrets. max-rows A hard limit to the number of rows PostgREST will fetch from a view, table, or stored procedure. Limits payload size for accidental or malicious requests. pre-request @@ -118,7 +118,7 @@ This does not protect against malicious actions, since someone can add a url par Count-Header DoS ---------------- -For convenience to client-side pagination controls PostgREST supports counting and reporting total table size in its response. As described in :ref:`Limits and Pagination`_, responses ordinarily include a range and unspecified total like +For convenience to client-side pagination controls PostgREST supports counting and reporting total table size in its response. As described in :ref:`Limits and Pagination`_, responses ordinarily include a range but leave the total unspecified like .. code-block:: http @@ -126,7 +126,7 @@ For convenience to client-side pagination controls PostgREST supports counting a Range-Unit: items Content-Range: 0-14/* -However including the request header `Prefer: count=exact` calculates and includes the full count: +However including the request header :code:`Prefer: count=exact` calculates and includes the full count: .. code-block:: http @@ -142,7 +142,7 @@ This is fine in small tables, but count performance degrades in big tables due t .. note:: - In future versions we will support `Prefer: count=estimated` to leverage the PostgreSQL statistics tables for a fast (and fairly accurate) result. + In future versions we will support :code:`Prefer: count=estimated` to leverage the PostgreSQL statistics tables for a fast (and fairly accurate) result. .. _hardening_https: @@ -168,9 +168,9 @@ A great way to inspect incoming HTTP requests including headers and query params # sudo access is necessary for watching the network sudo ngrep -d lo0 port 3000 -The options to ngrep vary depending on the address and host on which you've bound the server. The binding is described in the `Configuration`_ section. The ngrep output isn't particularly pretty, but it's legible. Note the `Server` response header as well which identifies the version of server. This is important when submitting bug reports. +The options to ngrep vary depending on the address and host on which you've bound the server. The binding is described in the `Configuration`_ section. The ngrep output isn't particularly pretty, but it's legible. Note the :code:`Server` response header as well which identifies the version of server. This is important when submitting bug reports. -Once you've verified that requests are as you expect, you can get more information about the server operations by watching the database logs. By default PostgreSQL does not keep these logs, so you'll need to make the configuration changes below. Find `postgresql.conf` inside your PostgreSQL data directory (to find that, issue the command `show data_directory;`). Either find the settings scattered throughout the file and change them to the following values, or append this block of code to the end of the configuration file. +Once you've verified that requests are as you expect, you can get more information about the server operations by watching the database logs. By default PostgreSQL does not keep these logs, so you'll need to make the configuration changes below. Find :code:`postgresql.conf` inside your PostgreSQL data directory (to find that, issue the command :code:`show data_directory;`). Either find the settings scattered throughout the file and change them to the following values, or append this block of code to the end of the configuration file. .. code:: sql @@ -207,7 +207,7 @@ In the future we're investigating ways to keep the cache updated without manual Alternate URL Structure ======================= -As discussed in `Singular or Plural`_, there are no special URL forms for singular resources in PostgREST, only operators for filtering. Thus there are no URLs like `/people/1`. It would be specified instead as +As discussed in `Singular or Plural`_, there are no special URL forms for singular resources in PostgREST, only operators for filtering. Thus there are no URLs like :code:`/people/1`. It would be specified instead as .. code:: http diff --git a/api.rst b/api.rst index 7480539973..bb5aa845fd 100644 --- a/api.rst +++ b/api.rst @@ -1,3 +1,6 @@ +.. role:: sql(code) + :language: sql + Tables and Views ================ @@ -57,13 +60,13 @@ For more complicated filters (such as those involving condition 1 OR condition 2 Vertical Filtering (Columns) ---------------------------- -When certain columns are wide (such as those holding binary data), it is more efficient for the server to withold them in a response. The client can specify which columns are required using the `select` parameter. +When certain columns are wide (such as those holding binary data), it is more efficient for the server to withold them in a response. The client can specify which columns are required using the :sql:`select` parameter. .. code-block:: http - GET /people?select=fname,age + GET /people?select=fname,age HTTP/1.1 -The default is `*`, meaning all columns. This value will become more important below in :ref:`Resource Embedding`_. +The default is :sql:`*`, meaning all columns. This value will become more important below in :ref:`Resource Embedding`_. .. _computed_cols: @@ -96,7 +99,7 @@ A full-text search on the computed column: Ordering -------- -The reserved word :code:`order` reorders the response rows. It uses a comma-separated list of columns and directions: +The reserved word :sql:`order` reorders the response rows. It uses a comma-separated list of columns and directions: .. code-block:: http @@ -201,7 +204,7 @@ The server will default to JSON for API endpoints and OpenAPI on the root. Singular or Plural ------------------ -By default PostgREST returns all JSON results in an array, even when there is only one item. For example, requesting `/items?id=eq.1` returns +By default PostgREST returns all JSON results in an array, even when there is only one item. For example, requesting :code:`/items?id=eq.1` returns .. code:: json @@ -312,12 +315,12 @@ The PostgREST url grammar limits the kinds of queries clients can perform. It pr * Table unions and OR-conditions in the where clause * More complicated joins than those provided by `Resource Embedding`_ * Geospatial queries that require an argument, like "points near (lat,lon)" -* More sophisticated full-text search than a simple use of the `@@` filter +* More sophisticated full-text search than a simple use of the :sql:`@@` filter Stored Procedures ================= -Every stored procedure in the API-exposed database schema is accessible under the `/rpc` prefix. The API endpoint supports only POST which executes the function. +Every stored procedure in the API-exposed database schema is accessible under the :code:`/rpc` prefix. The API endpoint supports only POST which executes the function. .. code:: http @@ -339,9 +342,10 @@ The client can call it by posting an object like .. code:: http POST /rpc/add_them HTTP/1.1 + { "a": 1, "b": 2} -The keys of the object match the parameter names. Note that PostgreSQL converts parameter names to lowercase unless you quote them like `CREATE FUNCTION foo("mixedCase" text) ...`. +The keys of the object match the parameter names. Note that PostgreSQL converts parameter names to lowercase unless you quote them like :sql:`CREATE FUNCTION foo("mixedCase" text) ...`. .. note:: diff --git a/auth.rst b/auth.rst index 2430a50092..7a8ce23168 100644 --- a/auth.rst +++ b/auth.rst @@ -12,7 +12,7 @@ There are three types of roles used by PostgREST, the **authenticator**, **anony .. image:: _static/security-roles.png -The authenticator should be created `NOINHERIT` and configured in the database to have very limited access. It is a chameleon whose job is to "become" other users to service authenticated HTTP requests. The picture below shows how the server handles authentication. If auth succeeds, it switches into the user role specified by the request, otherwise it switches into the anonymous role. +The authenticator should be created :code:`NOINHERIT` and configured in the database to have very limited access. It is a chameleon whose job is to "become" other users to service authenticated HTTP requests. The picture below shows how the server handles authentication. If auth succeeds, it switches into the user role specified by the request, otherwise it switches into the anonymous role. .. image:: _static/security-anon-choice.png @@ -46,7 +46,7 @@ PostgreSQL manages database access permissions using the concept of roles. A rol Roles for Each Web User ~~~~~~~~~~~~~~~~~~~~~~~ -PostgREST can accommodate either viewpoint. If you treat a role as a single user then the the JWT-based role switching described above does most of what you need. When an authenticated user makes a request PostgREST will switch into the role for that user, which in addition to restricting queries, is available to SQL through the `current_user` variable. +PostgREST can accommodate either viewpoint. If you treat a role as a single user then the the JWT-based role switching described above does most of what you need. When an authenticated user makes a request PostgREST will switch into the role for that user, which in addition to restricting queries, is available to SQL through the :code:`current_user` variable. You can use row-level security to flexibly restrict visibility and access for the current user. Here is an `example `_ from Tomas Vondra, a chat table storing messages sent between users. Users can insert rows into it to send messages to other users, and query it to see messages sent to them by other users. @@ -146,7 +146,7 @@ There is no performance penalty for having many database roles, although roles a Custom Validation ----------------- -PostgREST honors the `exp` claim for token expiration, rejecting expired tokens. However it does not enforce any extra constraints. An example of an extra constraint would be to immediately revoke access for a certain user. The configuration file paramter `pre-request` specifies a stored procedure to call immediately after the authenticator switches into a new role and before the main query itself runs. +PostgREST honors the :code:`exp` claim for token expiration, rejecting expired tokens. However it does not enforce any extra constraints. An example of an extra constraint would be to immediately revoke access for a certain user. The configuration file paramter :code:`pre-request` specifies a stored procedure to call immediately after the authenticator switches into a new role and before the main query itself runs. Here's an example. In the config file specify a stored procedure: @@ -172,7 +172,7 @@ In the function you can run arbitrary code to check the request and raise an exc Client Auth =========== -To make an authenticated request the client must include an `Authorization` HTTP header with the value `Bearer `. For instance: +To make an authenticated request the client must include an :code:`Authorization` HTTP header with the value :code:`Bearer `. For instance: .. code:: http @@ -241,7 +241,7 @@ Storing Users and Passwords As mentioned, an external service can provide user management and coordinate with the PostgREST server using JWT. It's also possible to support logins entirely through SQL. It's a fair bit of work, so get ready. -The following table, functions, and triggers will live in a `basic_auth` schema that you shouldn't expose publicly in the API. The public views and functions will live in a different schema which internally references this internal information. +The following table, functions, and triggers will live in a :code:`basic_auth` schema that you shouldn't expose publicly in the API. The public views and functions will live in a different schema which internally references this internal information. First we'll need a table to keep track of our users: @@ -259,7 +259,7 @@ First we'll need a table to keep track of our users: role name not null check (length(role) < 512), ); -We would like the role to be a foreign key to actual database roles, however PostgreSQL does not support these constraints against the `pg_roles` table. We'll use a trigger to manually enforce it. +We would like the role to be a foreign key to actual database roles, however PostgreSQL does not support these constraints against the :code:`pg_roles` table. We'll use a trigger to manually enforce it. .. code:: plpgsql @@ -283,7 +283,7 @@ We would like the role to be a foreign key to actual database roles, however Pos for each row execute procedure basic_auth.check_role_exists(); -Next we'll use the pgcrypto extension and a trigger to keep passwords safe in the `users` table. +Next we'll use the pgcrypto extension and a trigger to keep passwords safe in the :code:`users` table. .. code:: plpgsql @@ -370,7 +370,7 @@ An API request to call this function would look like: { "email": "foo@bar.com", "pass": "foobar" } -The response would look like the snippet below. Try decoding the token at `jwt.io `_. (It was encoded with a secret of `mysecret` as specified in the SQL code above. You'll want to change this secret in your app!) +The response would look like the snippet below. Try decoding the token at `jwt.io `_. (It was encoded with a secret of :code:`mysecret` as specified in the SQL code above. You'll want to change this secret in your app!) .. code:: json @@ -395,4 +395,4 @@ Your database roles need access to the schema, tables, views and functions in or grant select on table pg_authid, basic_auth.users to anon; grant execute on function login(text,text) to anon; -You may be worried from the above that anonymous users can read everything from the `basic_auth.users` table. However this table is not available for direct queries because it lives in a separate schema. The anonymous role needs access because the public `users` view reads the underlying table with the permissions of the calling user. But we have made sure the view properly restricts access to sensitive information. +You may be worried from the above that anonymous users can read everything from the :code:`basic_auth.users` table. However this table is not available for direct queries because it lives in a separate schema. The anonymous role needs access because the public :code:`users` view reads the underlying table with the permissions of the calling user. But we have made sure the view properly restricts access to sensitive information. diff --git a/install.rst b/install.rst index 4bf888f48e..b300cfd5c0 100644 --- a/install.rst +++ b/install.rst @@ -84,7 +84,7 @@ PostgREST Test Suite Creating the Test Database ~~~~~~~~~~~~~~~~~~~~~~~~~~ -To properly run postgrest tests one needs to create a database. To do so, use the test creation script `create_test_database` in the `test/` folder. +To properly run postgrest tests one needs to create a database. To do so, use the test creation script :code:`create_test_database` in the :code:`test/` folder. The script expects the following parameters: @@ -94,22 +94,22 @@ The script expects the following parameters: Use the `connection URI `_ to specify the user, password, host, and port. Do not provide the database in the connection URI. The Postgres role you are using to connect must be capable of creating new databases. -The `database_name` is the name of the database that `stack test` will connect to. If the database of the same name already exists on the server, the script will first drop it and then re-create it. +The :code:`database_name` is the name of the database that :code:`stack test` will connect to. If the database of the same name already exists on the server, the script will first drop it and then re-create it. -Optionally, specify the database user `stack test` will use. The user will be given necessary permissions to reset the database after every test run. +Optionally, specify the database user :code:`stack test` will use. The user will be given necessary permissions to reset the database after every test run. -If the user is not specified, the script will generate the role name `postgrest_test_` suffixed by the chosen database name, and will generate a random password for it. +If the user is not specified, the script will generate the role name :code:`postgrest_test_` suffixed by the chosen database name, and will generate a random password for it. Optionally, if specifying an existing user to be used for the test connection, one can specify the password the user has. -The script will return the db uri to use in the tests--this uri corresponds to the `db-uri` parameter in the configuration file that one would use in production. +The script will return the db uri to use in the tests--this uri corresponds to the :code:`db-uri` parameter in the configuration file that one would use in production. Generating the user and the password allows one to create the database and run the tests against any postgres server without any modifications to the server. (Such as allowing accounts without a passoword or setting up trust authentication, or requiring the server to be on the same localhost the tests are run from). Running the Tests ~~~~~~~~~~~~~~~~~ -To run the tests, one must supply the database uri in the environment variable `POSTGREST_TEST_CONNECTION`. +To run the tests, one must supply the database uri in the environment variable :code:`POSTGREST_TEST_CONNECTION`. Typically, one would create the database and run the test in the same command line, using the `postgres` superuser: @@ -132,12 +132,12 @@ If the environment variable is empty or not specified, then the test runner will postgres://postgrest_test@localhost/postgrest_test -This connection assumes the test server on the `localhost` with the user `postgrest_test` without the password and the database of the same name. +This connection assumes the test server on the :code:`localhost:code:` with the user `postgrest_test` without the password and the database of the same name. Destroying the Database ~~~~~~~~~~~~~~~~~~~~~~~ -The test database will remain after the test, together with four new roles created on the postgres server. To permanently erase the created database and the roles, run the script `test/delete_test_database`, using the same superuser role used for creating the database: +The test database will remain after the test, together with four new roles created on the postgres server. To permanently erase the created database and the roles, run the script :code:`test/delete_test_database`, using the same superuser role used for creating the database: .. code:: bash @@ -155,16 +155,16 @@ For example, if local development is on a mac with Docker for Mac installed: $ docker run --name db-scripting-test -e POSTGRES_PASSWORD=pwd -p 5434:5432 -d postgres $ POSTGREST_TEST_CONNECTION=$(test/create_test_db "postgres://postgres:pwd@localhost:5434" test_db) stack test -Additionally, if one creates a docker container to run stack test (this is necessary on MacOS Sierra with GHC below 8.0.1, where `stack test` fails), one can run PostgreSQL in a separate linked container, or use the locally installed Postgres.app. +Additionally, if one creates a docker container to run stack test (this is necessary on MacOS Sierra with GHC below 8.0.1, where :code:`stack test` fails), one can run PostgreSQL in a separate linked container, or use the locally installed Postgres.app. -Build the test container with `test/Dockerfile.test`: +Build the test container with :code:`test/Dockerfile.test`: .. code:: bash $ docker build -t pgst-test - < text/Dockerfile.test $ mkdir .stack-work-docker ~/.stack-linux -The first run of the test container will take a long time while the dependencies get cached. Creating the `~/.stack-linux` folder and mapping it as a volume into the container ensures that we can run the container in disposable mode and not worry about subsequent runs being slow. `.stack-work-docker` is also mapped into the container and must be specified when using stack from Linux, not to interfere with the `.stack-work` for local development. (On Sierra, `stack build` works, while `stack test` fails with GHC 8.0.1). +The first run of the test container will take a long time while the dependencies get cached. Creating the :code:`~/.stack-linux` folder and mapping it as a volume into the container ensures that we can run the container in disposable mode and not worry about subsequent runs being slow. :code:`.stack-work-docker` is also mapped into the container and must be specified when using stack from Linux, not to interfere with the :code:`.stack-work` for local development. (On Sierra, :code:`stack build` works, while :code:`stack test` fails with GHC 8.0.1). Linked containers: From e84b4cbcfe530dccd849b750c3aaabdc51a7ac10 Mon Sep 17 00:00:00 2001 From: Joe Nelson Date: Sun, 4 Dec 2016 18:34:35 -0800 Subject: [PATCH 042/711] Fill out the API ops --- api.rst | 88 +++++++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 85 insertions(+), 3 deletions(-) diff --git a/api.rst b/api.rst index bb5aa845fd..380a09f1cd 100644 --- a/api.rst +++ b/api.rst @@ -96,6 +96,12 @@ A full-text search on the computed column: GET /people?full_name=@@.Beckett HTTP/1.1 +As mentioned, computed columns do not appear in the output by default. However you can include them by listing them in the vertical filtering :code:`select` param: + +.. code-block:: HTTP + + GET /people?select=*,full_name HTTP/1.1 + Ordering -------- @@ -310,7 +316,7 @@ Note this does not change the order of the Films, but of the list of Actors in e Custom Queries ============== -The PostgREST url grammar limits the kinds of queries clients can perform. It prevents arbitrary, potentially poorly constructed and slow client queries. It's good for quality of service, but means database administrators must create custom views and stored procedures to provide richer endpoints. The most common causes for custom endpoints are +The PostgREST URL grammar limits the kinds of queries clients can perform. It prevents arbitrary, potentially poorly constructed and slow client queries. It's good for quality of service, but means database administrators must create custom views and stored procedures to provide richer endpoints. The most common causes for custom endpoints are * Table unions and OR-conditions in the where clause * More complicated joins than those provided by `Resource Embedding`_ @@ -357,11 +363,87 @@ The keys of the object match the parameter names. Note that PostgreSQL converts Insertions / Updates ==================== -Getting Results ---------------- +All tables and `auto-updatable views `_ can be modified through the API, subject to permissions of the requester's database role. + +To create a row in a database table post a JSON object whose keys are the names of the columns you would like to create. Missing properties will be set to default values when applicable. + +.. code:: HTTP + + POST /table_name HTTP/1.1 + + { "col1": "value1", "col2": "value2" } + +The response will include a :code:`Location` header describing where to find the new object. If the table is write-only then constructing the Location header will cause a permissions error. To successfully insert an item to a write-only table you will need to suppress the Location response header by including the request header :code:`Prefer: return=minimal`. + +On the other end of the spectrum you can get the full created object back in the response to your request by including the header :code:`Prefer: return=representation`. That way you won't have to make another HTTP call to discover properties that may have been filled in on the server side. You can also apply the standard `Vertical Filtering (Columns)`_ to these results. + +.. note:: + + When inserting a row you must post a JSON object, not quoted JSON. + + .. code:: + + Yes + { "a": 1, "b": 2 } + + No + "{ \"a\": 1, \"b\": 2 }" + + Some javascript libraries will post the data incorrectly if you're not careful. For best results try one of the :ref:`Client-Side Libraries`_ built for PostgREST. + +To update a row or rows in a table, use the PATCH verb. Use :ref:`Horizontal Filtering (Rows)`_ to specify which record(s) to update. Here is an exmaple query setting the :code:`category` column to child for all people below a certain age. + +.. code:: HTTP + + PATCH /people?age=lt.13 HTTP/1.1 + + { "category": "child" } + +Updates also support :code:`Prefer: return=representation` plus `Vertical Filtering (Columns)`_. + +.. note:: + + Beware of accidentally updating every row in a table. To learn to prevent that see :ref:`Block Full-Table Operations`_. Bulk Insert ----------- +Bulk insert works exactly like single row insert except that you provide either a JSON array of objects having uniform keys, or lines in CSV format. This not only minimizes the HTTP requests required but uses a single INSERT statement on the backend for efficiency. Note that using CSV requires less parsing on the server and is much faster. + +To bulk insert CSV simply post to a table route with :code:`Content-Type: text/csv` and include the names of the columns as the first row. For instance + +.. code:: HTTP + + POST /people HTTP/1.1 + Content-Type: text/csv + + name,age,height + J Doe,62,70 + Jonas,10,55 + +An empty field (:code:`,,`) is coerced to an empty string and the reserved word :code:`NULL` is mapped to the SQL null value. Note that there should be no spaces between the column names and commas. + +To bulk insert JSON post an array of objects having all-matching keys + +.. code:: HTTP + + POST /people HTTP/1.1 + Content-Type: application/json + + [ + { "name": "J Doe", "age": 62, "height": 70 }, + { "name": "Janus", "age": 10, "height": 55 } + ] + Deletions ========= + +To delete rows in a table, use the DELETE verb plus :ref:`Horizontal Filtering (Rows)`_. For instance deleting inactive users: + +.. code-block:: HTTP + + DELETE /user?active=is.false HTTP/1.1 + +.. note:: + + Beware of accidentally delting all rows in a table. To learn to prevent that see :ref:`Block Full-Table Operations`_. From adb852227662a83274b61cd59124fec16ded94a0 Mon Sep 17 00:00:00 2001 From: Joe Nelson Date: Mon, 5 Dec 2016 16:14:28 -0800 Subject: [PATCH 043/711] Sorting embedded resources --- admin.rst | 2 +- api.rst | 18 ++++++++++++++---- 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/admin.rst b/admin.rst index 7946471503..4de4615fb5 100644 --- a/admin.rst +++ b/admin.rst @@ -220,8 +220,8 @@ This allows compound primary keys and makes the intent for singular response ind nginx code here +.. TODO .. Administration -.. Alternate URL structure .. API Versioning .. HTTP Caching .. Upgrading diff --git a/api.rst b/api.rst index 380a09f1cd..5f5f12378b 100644 --- a/api.rst +++ b/api.rst @@ -301,17 +301,27 @@ Which would return PostgREST can also detect relations going through join tables. Thus you can request the Actors for Films (which in this case finds the information through Roles). You can also reverse the direction of inclusion, asking for all Directories with each including the list of their Films. -To order the embedded items, you need to specify the tree path in the order parameter. For instance +.. note:: + + Whenever foreign key relations change in the database schema you must refresh PostgREST's schema cache to allow resource embedding to work properly. See the section :ref:`Schema Reloading`_. + +Embedded Filters and Order +-------------------------- + +Embedded tables can be filtered and ordered similarly to their top-level counterparts. To to do so prefix the query parameters with the name of the embedded table. For instance to order the actors in each film: .. code-block:: http GET /films?select=*,actors{*}&actors.order=last_name,first_name HTTP/1.1 -Note this does not change the order of the Films, but of the list of Actors in each Film. +This sorts the list of actors in each film but does *not* change the order of the films themselves. To filter the roles returned with each film: -.. note:: +.. code-block:: http + + GET /films?select=*,roles{*}&roles.character=in.Chico,Harpo,Groucho HTTP/1.1 + +Once again, this restricts the roles included to certain characters but does not filter the films in any way. Films without any of those characters would be included along with empty character lists. - Whenever foreign key relations change in the database schema you must refresh PostgREST's schema cache to allow resource embedding to work properly. See the section :ref:`Schema Reloading`_. Custom Queries ============== From 349726cdc0e0720d56cbfefbb105724df2bfd438 Mon Sep 17 00:00:00 2001 From: Trevor Basinger Date: Sun, 11 Dec 2016 10:56:39 -0600 Subject: [PATCH 044/711] Documentation b64 option #772 (#25) --- admin.rst | 5 ++++- auth.rst | 28 ++++++++++++++++++++++++++-- 2 files changed, 30 insertions(+), 3 deletions(-) diff --git a/admin.rst b/admin.rst index 4de4615fb5..51b91acdaa 100644 --- a/admin.rst +++ b/admin.rst @@ -39,6 +39,7 @@ server-host String \*4 server-port Int 3000 server-proxy-url String jwt-secret String +secret-is-base64 Bool False max-rows Int ∞ pre-request String ================ ====== ======= ======== @@ -58,7 +59,9 @@ server-port server-proxy-url Overrides the base URL used within the OpenAPI self-documentation hosted at the API root path. jwt-secret - The secret used to decode JWT tokens clients provide for authentication. If this parameter is not specified then PostgREST refuses authentication requests. Choosing a value for this parameter beginning with the at sign such as :code:`@filename` loads the secret out of an external file which is useful for non-UTF-8 binary secrets. + The secret used to decode JWT tokens clients provide for authentication. If this parameter is not specified then PostgREST refuses authentication requests. Choosing a value for this parameter beginning with the at sign such as :code:`@filename` loads the secret out of an external file. This is useful for automating deployments. Note that any binary secrets must be base64 encoded. +secret-is-base64 + When this is set to :code:`true`, the value derived from :code:`jwt-secret` will be treated as a base64 encoded secret. max-rows A hard limit to the number of rows PostgREST will fetch from a view, table, or stored procedure. Limits payload size for accidental or malicious requests. pre-request diff --git a/auth.rst b/auth.rst index 7a8ce23168..db8259b664 100644 --- a/auth.rst +++ b/auth.rst @@ -217,9 +217,33 @@ JWT from Auth0 An external service like `Auth0 `_ can do the hard work transforming OAuth from Github, Twitter, Google etc into a JWT suitable for PostgREST. Auth0 can also handle email signup and password reset flows. -To adapt Auth0 to our uses we need to save the database role in `user metadata `_ and include the metadata in `private claims `_ of the generated JWT. +By default, Auth0 generates binary base64URL encoded secrets. You can find the secret in the client settings of the Auth0 management console. Copy the client secret into your PostgREST configuration file as the :code:`jwt-secret`. Then set :code:`secret-is-base64` to :code:`true`. + +To adapt Auth0 to our uses we need to save the database role in `user metadata `_. Then, you will need to write a rule that will extract the role from the user metadata and include a :code:`role` claim in the payload of our user object. Afterwards, in your Auth0Lock code, include the :code:`role` claim in your `scope param `_. + + +.. code:: javascript + + // Example Auth0 rule + function (user, context, callback) { + var role = user.user_metadata.role; + user.role = role; + callback(null, user, context); + } + + +.. code:: javascript + + // Example using Auth0Lock with role claim in scope + new Auth0Lock ( AUTH0_CLIENTID, AUTH0_DOMAIN, { + container: 'lock-container', + auth: { + params: { scope: 'openid role' }, + redirectUrl: FQDN + '/login', // Replace with your redirect url + responseType: 'token' + } + }) -**TODO: add details** .. _ssl: From 4d8272fa0d79519b0182637c2c690b173a7293c3 Mon Sep 17 00:00:00 2001 From: J Phani Mahesh Date: Sat, 17 Dec 2016 22:46:03 +0530 Subject: [PATCH 045/711] fix typo in install.rst: s/text/text/ (#27) --- install.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install.rst b/install.rst index b300cfd5c0..20d41f90db 100644 --- a/install.rst +++ b/install.rst @@ -161,7 +161,7 @@ Build the test container with :code:`test/Dockerfile.test`: .. code:: bash - $ docker build -t pgst-test - < text/Dockerfile.test + $ docker build -t pgst-test - < test/Dockerfile.test $ mkdir .stack-work-docker ~/.stack-linux The first run of the test container will take a long time while the dependencies get cached. Creating the :code:`~/.stack-linux` folder and mapping it as a volume into the container ensures that we can run the container in disposable mode and not worry about subsequent runs being slow. :code:`.stack-work-docker` is also mapped into the container and must be specified when using stack from Linux, not to interfere with the :code:`.stack-work` for local development. (On Sierra, :code:`stack build` works, while :code:`stack test` fails with GHC 8.0.1). From b3fb9ff21578f7a391167a0dd15919dcc1568762 Mon Sep 17 00:00:00 2001 From: Nikolay Date: Tue, 20 Dec 2016 21:14:05 -0800 Subject: [PATCH 046/711] more about stored procedures (#26) --- api.rst | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/api.rst b/api.rst index 5f5f12378b..4e7b439238 100644 --- a/api.rst +++ b/api.rst @@ -336,7 +336,7 @@ The PostgREST URL grammar limits the kinds of queries clients can perform. It pr Stored Procedures ================= -Every stored procedure in the API-exposed database schema is accessible under the :code:`/rpc` prefix. The API endpoint supports only POST which executes the function. +Every stored procedure in the API-exposed database schema is accessible under the :code:`/rpc` prefix. The API endpoint supports only POST which executes the function. Such function can perform any operations allowed by PostgreSQL (read data, modify data, and even DDL operations). .. code:: http @@ -363,6 +363,10 @@ The client can call it by posting an object like The keys of the object match the parameter names. Note that PostgreSQL converts parameter names to lowercase unless you quote them like :sql:`CREATE FUNCTION foo("mixedCase" text) ...`. +PostgreSQL has four procedural languages that are part of the core distribution: PL/pgSQL, PL/Tcl, PL/Perl, and PL/Python. There are many other procedural languages distributed as additional extensions. Also, plain SQL can be used to write functions (as shown in the example above). + +By default, a function is to be executed with the privileges of the user that calls it. This means, that the user has to have all permissions to do all operations the procedure performs. But if the function was defined with :code:`SECURITY DEFINER` options, only one permission check will take place – the permission to call the function. See `PostgreSQL documentation `_ for more details. + .. note:: Why the `/rpc` prefix? One reason is to avoid name collisions between views and procedures. It also helps emphasize to API consumers that these functions are not normal restful things. The functions can have arbitrary and surprising behavior, not the standard "post creates a resource" thing that users expect from the other routes. From f52fb70e3d10d540d5aa4601ef1d7950f5c55290 Mon Sep 17 00:00:00 2001 From: Jeffrey Date: Mon, 26 Dec 2016 12:40:23 -0500 Subject: [PATCH 047/711] Suggest swap file on systems with under 1GB of ram (#30) --- install.rst | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/install.rst b/install.rst index 20d41f90db..22b9fbdded 100644 --- a/install.rst +++ b/install.rst @@ -75,6 +75,10 @@ When a pre-built binary does not exist for your system you can build the project cd postgrest stack build --install-ghc sudo stack install --allow-different-user --local-bin-path /usr/local/bin + +.. note:: + + If building fails and your system has less than 1GB of memory, try adding a swap file. * Check that the server is installed: :code:`postgrest --help`. From 8706779b42cc704009f6741f5682083b456c3543 Mon Sep 17 00:00:00 2001 From: Joe Nelson Date: Mon, 16 Jan 2017 20:34:39 -0800 Subject: [PATCH 048/711] Document SSH session termination precautions --- admin.rst | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/admin.rst b/admin.rst index 51b91acdaa..239c4d1a67 100644 --- a/admin.rst +++ b/admin.rst @@ -67,6 +67,20 @@ max-rows pre-request A schema-qualified stored procedure name to call right after switching roles for a client request. This provides an opportunity to modify SQL variables or raise an exception to prevent the request from completing. +Running the Server +------------------ + +PostgREST outputs basic request logging to stdout. When running it in an SSH session you must detach it from stdout or it will be terminated when the session closes. The easiest technique is redirecting the output to a logfile or to the syslog: + +.. code-block:: bash + + ssh foo@example.com \ + 'postgrest foo.conf /var/log/postgrest.log 2>&1 &' + + # another option is to pipe the output into "logger -t postgrest" + +(Avoid :code:`nohup postgrest` because the HUP signal is used for manual `Schema Reloading`_.) + Hardening PostgREST =================== From 360c90afe312be4e781a30869e34ced8f81a685f Mon Sep 17 00:00:00 2001 From: Joe Nelson Date: Mon, 16 Jan 2017 20:35:01 -0800 Subject: [PATCH 049/711] Auth0 no longer base64 encodes secrets --- auth.rst | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/auth.rst b/auth.rst index db8259b664..f9c4f02671 100644 --- a/auth.rst +++ b/auth.rst @@ -212,15 +212,29 @@ Next write a stored procedure that returns the token. The one below returns a to PostgREST exposes this function to clients via a POST request to `/rpc/jwt_test`. +.. note:: + + To avoid hard-coding the secret in stored procedures, save it as a property of the database. + + .. code-block:: postgres + + -- run this once + ALTER DATABASE mydb SET "app.jwt_secret" TO '!!secret!!'; + + -- then all functions can refer to app.jwt_secret + SELECT jwt.sign( + row_to_json(r), current_setting('app.jwt_secret') + ) AS token + FROM ... + JWT from Auth0 ~~~~~~~~~~~~~~ An external service like `Auth0 `_ can do the hard work transforming OAuth from Github, Twitter, Google etc into a JWT suitable for PostgREST. Auth0 can also handle email signup and password reset flows. -By default, Auth0 generates binary base64URL encoded secrets. You can find the secret in the client settings of the Auth0 management console. Copy the client secret into your PostgREST configuration file as the :code:`jwt-secret`. Then set :code:`secret-is-base64` to :code:`true`. - -To adapt Auth0 to our uses we need to save the database role in `user metadata `_. Then, you will need to write a rule that will extract the role from the user metadata and include a :code:`role` claim in the payload of our user object. Afterwards, in your Auth0Lock code, include the :code:`role` claim in your `scope param `_. +To use Auth0, copy its client secret into your PostgREST configuration file as the :code:`jwt-secret`. (Old-style Auth0 secrets are Base64 encoded. For these secrets set :code:`secret-is-base64` to :code:`true`, or just refresh the Auth0 secret.) You can find the secret in the client settings of the Auth0 management console. +Our code requires a database role in the JWT. To add it you need to save the database role in Auth0 `user metadata `_. Then, you will need to write a rule that will extract the role from the user metadata and include a :code:`role` claim in the payload of our user object. Afterwards, in your Auth0Lock code, include the :code:`role` claim in your `scope param `_. .. code:: javascript @@ -244,7 +258,6 @@ To adapt Auth0 to our uses we need to save the database role in `user metadata < } }) - .. _ssl: SSL From b3dfde5ecfa4f7e2cf0c36d40a57dbe554a893c3 Mon Sep 17 00:00:00 2001 From: Joe Nelson Date: Mon, 16 Jan 2017 20:35:17 -0800 Subject: [PATCH 050/711] Move admin section higher in TOC --- index.rst | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/index.rst b/index.rst index d42418d559..f8bb6e4146 100644 --- a/index.rst +++ b/index.rst @@ -13,6 +13,11 @@ install.rst +.. toctree:: + :caption: Administration + + admin.rst + .. toctree:: :caption: API @@ -22,8 +27,3 @@ :caption: Authentication auth.rst - -.. toctree:: - :caption: Administration - - admin.rst From e0e604aa9f7e90f9b30ecb042707705c88ec4c36 Mon Sep 17 00:00:00 2001 From: Joe Nelson Date: Mon, 16 Jan 2017 20:35:42 -0800 Subject: [PATCH 051/711] Fix install problems reported by @tnhu --- install.rst | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/install.rst b/install.rst index 22b9fbdded..34d0ae7ecd 100644 --- a/install.rst +++ b/install.rst @@ -59,13 +59,14 @@ When a pre-built binary does not exist for your system you can build the project * `Install Stack `_ for your platform * Install Library Dependencies - ===================== ============================ + ===================== ======================================= Operating System Dependencies - ===================== ============================ - Ubuntu/Debian libpq-dev - CentOS/Fedora/Red Hat postgresql-devel, zlib-devel + ===================== ======================================= + Ubuntu/Debian libpq-dev, libgmp-dev + CentOS/Fedora/Red Hat postgresql-devel, zlib-devel, gmp-devel BSD postgresql95-server - ===================== ============================ + OS X postgresql, gmp + ===================== ======================================= * Build and install binary @@ -73,9 +74,10 @@ When a pre-built binary does not exist for your system you can build the project git clone https://github.com/begriffs/postgrest.git cd postgrest - stack build --install-ghc - sudo stack install --allow-different-user --local-bin-path /usr/local/bin - + + # adjust local-bin-path to taste + stack build --install-ghc --copy-bins --local-bin-path /usr/local/bin + .. note:: If building fails and your system has less than 1GB of memory, try adding a swap file. From 58503af43277d1be92ee11ec891e114f3acca164 Mon Sep 17 00:00:00 2001 From: Joe Nelson Date: Mon, 16 Jan 2017 20:47:01 -0800 Subject: [PATCH 052/711] English and RST adjustments --- admin.rst | 2 +- api.rst | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/admin.rst b/admin.rst index 239c4d1a67..9f36dc4b9d 100644 --- a/admin.rst +++ b/admin.rst @@ -135,7 +135,7 @@ This does not protect against malicious actions, since someone can add a url par Count-Header DoS ---------------- -For convenience to client-side pagination controls PostgREST supports counting and reporting total table size in its response. As described in :ref:`Limits and Pagination`_, responses ordinarily include a range but leave the total unspecified like +For convenience to client-side pagination controls PostgREST supports counting and reporting total table size in its response. As described in `Limits and Pagination`_, responses ordinarily include a range but leave the total unspecified like .. code-block:: http diff --git a/api.rst b/api.rst index 4e7b439238..779e85bcfe 100644 --- a/api.rst +++ b/api.rst @@ -365,7 +365,7 @@ The keys of the object match the parameter names. Note that PostgreSQL converts PostgreSQL has four procedural languages that are part of the core distribution: PL/pgSQL, PL/Tcl, PL/Perl, and PL/Python. There are many other procedural languages distributed as additional extensions. Also, plain SQL can be used to write functions (as shown in the example above). -By default, a function is to be executed with the privileges of the user that calls it. This means, that the user has to have all permissions to do all operations the procedure performs. But if the function was defined with :code:`SECURITY DEFINER` options, only one permission check will take place – the permission to call the function. See `PostgreSQL documentation `_ for more details. +By default, a function is executed with the privileges of the user who calls it. This means that the user has to have all permissions to do the operations the procedure performs. Another option is to define the function with with the :code:`SECURITY DEFINER` option. Then only one permission check will take place, the permission to call the function, and the operations in the function will have the authority of the user who owns the function itself. See `PostgreSQL documentation `_ for more details. .. note:: From e37a2a569c79dd4b5d17bb3d4dcb17e87dd17c52 Mon Sep 17 00:00:00 2001 From: Joe Nelson Date: Sat, 21 Jan 2017 20:16:21 -0800 Subject: [PATCH 053/711] Document rate limiting via nginx --- admin.rst | 21 ++++++++++++++++++++- auth.rst | 2 ++ 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/admin.rst b/admin.rst index 9f36dc4b9d..e2fadd380c 100644 --- a/admin.rst +++ b/admin.rst @@ -171,7 +171,26 @@ See the :ref:`ssl` section of the authentication guide. Rate Limiting ------------- -Foo +Nginx supports "leaky bucket" rate limiting (see `official docs `_). Using standard Nginx configuration, routes can be grouped into *request zones* for rate limiting. For instance we can define a zone for login attempts: + +.. code-block:: nginx + + limit_req_zone $binary_remote_addr zone=login:10m rate=1r/s; + +This creates a shared memory zone called "login" to store a log of IP addresses that access the rate limited urls. The space reserved, 10 MB (:code:`10m`) will give us enough space to store a history of 160k requests. We have chosen to allow only allow one request per second (:code:`1r/s`). + +Next we apply the zone to certain routes, like a hypothetical stored procedure called :code:`login`. + +.. code-block:: nginx + + location /rpc/login/ { + # apply rate limiting + limit_req zone=login burst=5; + } + +The burst argument tells Nginx to start dropping requests if more than five queue up from a specific IP. + +Nginx rate limiting is general and indescriminate. To rate limit each authenticated request individually you will need to add logic in a :ref:`Custom Validation ` function. Debugging ========= diff --git a/auth.rst b/auth.rst index f9c4f02671..3c42c9113a 100644 --- a/auth.rst +++ b/auth.rst @@ -143,6 +143,8 @@ There is no performance penalty for having many database roles, although roles a -- allow authenticator to switch into user000 role -- (the role itself has nologin) +.. _custom_validation: + Custom Validation ----------------- From e1e1ee2d31efaefd7869eb9d31d4eb489d4a82ba Mon Sep 17 00:00:00 2001 From: Joe Nelson Date: Sat, 21 Jan 2017 23:00:13 -0800 Subject: [PATCH 054/711] pg-sns-bridge rename --- intro.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/intro.rst b/intro.rst index 575b99fe70..ffec7d75cd 100644 --- a/intro.rst +++ b/intro.rst @@ -52,7 +52,7 @@ External Notification These are PostgreSQL bridges that propagate LISTEN/NOTIFY to external queues for further processing. This allows stored procedures to initiate actions outside the database such as sending emails. -* `matthewmueller/pg-sns-bridge `_ - Amazon SNS +* `matthewmueller/pg-bridge `_ - Amazon SNS * `aweber/pgsql-listen-exchange `_ - RabbitMQ * `SpiderOak/skeeter `_ - ZeroMQ From 71816e64f835c5b02a4fcbae167d1a989155ff65 Mon Sep 17 00:00:00 2001 From: Joe Nelson Date: Sun, 22 Jan 2017 17:32:38 -0800 Subject: [PATCH 055/711] Fix typos in auth section Fixes #29 --- auth.rst | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/auth.rst b/auth.rst index 3c42c9113a..6ae84a0aae 100644 --- a/auth.rst +++ b/auth.rst @@ -99,9 +99,9 @@ This allows JWT generation services to include extra information and your databa .. code:: postgres - -- Prevent current_setting('postgrest.claims.email') from raising + -- Prevent current_setting('request.jwt.claim.email') from raising -- an exception if the setting is not present. Default it to ''. - ALTER DATABASE your_db_name SET request.claim.email TO ''; + ALTER DATABASE your_db_name SET request.jwt.claim.email TO ''; If you are unable to issue an ALTER DATABASE statement (for instance on Amazon RDS), you can create a helper function to read environment variables and swallow exceptions. @@ -123,7 +123,7 @@ This allows JWT generation services to include extra information and your databa $$ stable language plpgsql; -- now you can call call for instance - -- SELECT env_var('request.claim.email') + -- SELECT env_var('request.jwt.claim.email') Hybrid User-Group Roles ~~~~~~~~~~~~~~~~~~~~~~~ @@ -381,7 +381,7 @@ As described in `JWT from SQL`_, we'll create a JWT inside our login function. N as $$ declare _role name; - result basic_auth.jwt_claims; + result basic_auth.jwt_token; begin -- check email and password select basic_auth.user_role(email, pass) into _role; From 19768064dde76c92bbeff43b5cf99533f182c04d Mon Sep 17 00:00:00 2001 From: Joe Nelson Date: Sun, 22 Jan 2017 20:16:57 -0800 Subject: [PATCH 056/711] More prominent link to downloads --- install.rst | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/install.rst b/install.rst index 34d0ae7ecd..50c6ba8158 100644 --- a/install.rst +++ b/install.rst @@ -1,7 +1,9 @@ Binary Release ============== -The `release page `_ has precompiled binaries for Mac OS X, Windows, and several Linux distros. Extract the tarball and run the binary inside with the :code:`--help` flag to see usage instructions: +[ `Download from release page `_ ] + +The release page has precompiled binaries for Mac OS X, Windows, and several Linux distros. Extract the tarball and run the binary inside with the :code:`--help` flag to see usage instructions: .. code-block:: bash From e56ffe7b5e88532e70c711ff20a5f761faf59c1c Mon Sep 17 00:00:00 2001 From: Joe Nelson Date: Sun, 22 Jan 2017 20:36:27 -0800 Subject: [PATCH 057/711] Note json array vs native array args --- api.rst | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/api.rst b/api.rst index 779e85bcfe..f0f3af22a6 100644 --- a/api.rst +++ b/api.rst @@ -359,10 +359,26 @@ The client can call it by posting an object like POST /rpc/add_them HTTP/1.1 - { "a": 1, "b": 2} + { "a": 1, "b": 2 } The keys of the object match the parameter names. Note that PostgreSQL converts parameter names to lowercase unless you quote them like :sql:`CREATE FUNCTION foo("mixedCase" text) ...`. +.. note:: + + We recommend using function arguments of type json to accept arrays from the client. To pass a PostgreSQL native array you'll need to quote it as a string: + + .. code:: http + + POST /rpc/native_array_func HTTP/1.1 + + { "arg": "{1,2,3}" } + + .. code:: http + + POST /rpc/json_array_func HTTP/1.1 + + { "arg": [1,2,3] } + PostgreSQL has four procedural languages that are part of the core distribution: PL/pgSQL, PL/Tcl, PL/Perl, and PL/Python. There are many other procedural languages distributed as additional extensions. Also, plain SQL can be used to write functions (as shown in the example above). By default, a function is executed with the privileges of the user who calls it. This means that the user has to have all permissions to do the operations the procedure performs. Another option is to define the function with with the :code:`SECURITY DEFINER` option. Then only one permission check will take place, the permission to call the function, and the operations in the function will have the authority of the user who owns the function itself. See `PostgreSQL documentation `_ for more details. From 3262607b5b9fddb5c3ce4681a6895cfb8b3b0b5b Mon Sep 17 00:00:00 2001 From: Leon du Toit Date: Mon, 23 Jan 2017 17:34:39 +0100 Subject: [PATCH 058/711] Document connect strings for older versions of libpq (#11) (#31) --- admin.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/admin.rst b/admin.rst index e2fadd380c..7518300180 100644 --- a/admin.rst +++ b/admin.rst @@ -45,7 +45,7 @@ pre-request String ================ ====== ======= ======== db-uri - The standard connection PostgreSQL `URI format `_. Also allows connections over Unix sockets for higher performance. + The standard connection PostgreSQL `URI format `_. On older systems like Centos 6, with older versions of libpq, a different db-uri syntax has to be used. In this case the URI is a string of space separated key-value pairs (key=value), so the example above would be :code:`"host=host user=user port=5432 dbname=dbname password=pass"`. Also allows connections over Unix sockets for higher performance. db-schema The database schema to expose to REST clients. Tables, views and stored procedures in this schema will get API endpoints. db-anon-role From 404fcb6b2795d76c00eb69b500417c3b765e2c05 Mon Sep 17 00:00:00 2001 From: phil Date: Thu, 26 Jan 2017 10:32:27 -0500 Subject: [PATCH 059/711] Fix the plurality header docs for v0.4 (#32) --- admin.rst | 2 +- api.rst | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/admin.rst b/admin.rst index 7518300180..aec3d6c39f 100644 --- a/admin.rst +++ b/admin.rst @@ -248,7 +248,7 @@ As discussed in `Singular or Plural`_, there are no special URL forms for singul .. code:: http GET /people?id=eq.1 - Prefer: plurality=singular + Accept: application/vnd.pgrst.object+json This allows compound primary keys and makes the intent for singular response independent of a URL convention. However for any table which uses a simple primary key you can use Nginx to simulate the familiar URL convention. diff --git a/api.rst b/api.rst index f0f3af22a6..6ec65039f8 100644 --- a/api.rst +++ b/api.rst @@ -218,12 +218,12 @@ By default PostgREST returns all JSON results in an array, even when there is on { "id": 1 } ] -This can be inconvenient for client code. To return the first result as an object unenclosed by an array, Include a Prefer request header +This can be inconvenient for client code. To return the first result as an object unenclosed by an array, specify :code:`vnd.pgrst.object` as part of the :code:`Accept` header .. code:: http GET /items?id=eq.1 HTTP/1.1 - Prefer: plurality=singular + Accept: application/vnd.pgrst.object+json This returns From 892f4a8491224616f778beae49a427d15cbbd5e7 Mon Sep 17 00:00:00 2001 From: Lucas Desgouilles Date: Thu, 2 Feb 2017 17:02:43 +0100 Subject: [PATCH 060/711] Override document title for index.rst (#34) The index page has ` -- PostgREST 0.4.0.0 Documentation` for HTML title, using the `title` directive, we can force it to something nicer. I'm not sure if this fixes it at the top of the page. http://docutils.sourceforge.net/docs/ref/rst/directives.html#metadata-document-title http://www.sphinx-doc.org/en/stable/rest.html#directives --- index.rst | 2 ++ 1 file changed, 2 insertions(+) diff --git a/index.rst b/index.rst index f8bb6e4146..85935f0686 100644 --- a/index.rst +++ b/index.rst @@ -1,3 +1,5 @@ +.. title:: PostgREST Documentation + .. image:: _static/logo.png .. toctree:: From e508f071b4c3ba58e4b19b2dca430324619f156f Mon Sep 17 00:00:00 2001 From: Joe Nelson Date: Fri, 3 Feb 2017 16:11:19 -0800 Subject: [PATCH 061/711] Bump copyright year --- conf.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf.py b/conf.py index 489726976e..4792328945 100644 --- a/conf.py +++ b/conf.py @@ -46,7 +46,7 @@ # General information about the project. project = u'PostgREST' -copyright = u'2016, Joe Nelson' +copyright = u'2017, Joe Nelson' author = u'Joe Nelson' # The version info for the project you're documenting, acts as replacement for From 588b0bc7e1c1a7c7cb38b916f65ec80d190c3197 Mon Sep 17 00:00:00 2001 From: Joe Nelson Date: Fri, 3 Feb 2017 16:37:24 -0800 Subject: [PATCH 062/711] Fix internal links --- admin.rst | 10 +++++++--- api.rst | 30 +++++++++++++++++++----------- intro.rst | 2 ++ 3 files changed, 28 insertions(+), 14 deletions(-) diff --git a/admin.rst b/admin.rst index aec3d6c39f..24ce3df234 100644 --- a/admin.rst +++ b/admin.rst @@ -79,7 +79,7 @@ PostgREST outputs basic request logging to stdout. When running it in an SSH ses # another option is to pipe the output into "logger -t postgrest" -(Avoid :code:`nohup postgrest` because the HUP signal is used for manual `Schema Reloading`_.) +(Avoid :code:`nohup postgrest` because the HUP signal is used for manual :ref:`schema_reloading`.) Hardening PostgREST =================== @@ -113,6 +113,8 @@ The first step is to create an Nginx configuration file that proxies requests to } } +.. _block_fulltable: + Block Full-Table Operations --------------------------- @@ -135,7 +137,7 @@ This does not protect against malicious actions, since someone can add a url par Count-Header DoS ---------------- -For convenience to client-side pagination controls PostgREST supports counting and reporting total table size in its response. As described in `Limits and Pagination`_, responses ordinarily include a range but leave the total unspecified like +For convenience to client-side pagination controls PostgREST supports counting and reporting total table size in its response. As described in :ref:`limits`, responses ordinarily include a range but leave the total unspecified like .. code-block:: http @@ -227,10 +229,12 @@ Once you've verified that requests are as you expect, you can get more informati Restart the database and watch the log file in real-time to understand how HTTP requests are being translated into SQL commands. +.. _schema_reloading: + Schema Reloading ---------------- -Users are often confused by PostgREST's database schema cache. It is present because detecting foreign key relationships between tables (including how those relationships pass through views) is necessary, but costly. API requests consult the schema cache as part of :ref:`Resource Embedding`_. However if the schema changes while the server is running it results in a stale cache and leads to errors claiming that no relations are detected between tables. +Users are often confused by PostgREST's database schema cache. It is present because detecting foreign key relationships between tables (including how those relationships pass through views) is necessary, but costly. API requests consult the schema cache as part of :ref:`resource_embedding`. However if the schema changes while the server is running it results in a stale cache and leads to errors claiming that no relations are detected between tables. To refresh the cache without restarting the PostgREST server, send the server process a SIGHUP signal: diff --git a/api.rst b/api.rst index 6ec65039f8..edf2b8f4f5 100644 --- a/api.rst +++ b/api.rst @@ -14,7 +14,9 @@ There are no deeply/nested/routes. Each route provides OPTIONS, GET, POST, PATCH .. note:: - Why not provide nested routes? Many APIs allow nesting to retrieve related information, such as :code:`/films/1/director`. We offer a more flexible mechanism (inspired by GraphQL) to embed related information. It can handle one-to-many and many-to-many relationships. This is covered in the section about `Resource Embedding`_. + Why not provide nested routes? Many APIs allow nesting to retrieve related information, such as :code:`/films/1/director`. We offer a more flexible mechanism (inspired by GraphQL) to embed related information. It can handle one-to-many and many-to-many relationships. This is covered in the section about :ref:`resource_embedding`. + +.. _h_filter: Horizontal Filtering (Rows) --------------------------- @@ -57,6 +59,8 @@ To negate any operator, prefix it with :code:`not` like :code:`?a=not.eq.2`. For more complicated filters (such as those involving condition 1 OR condition 2) you will have to create a new view in the database. +.. _v_filter: + Vertical Filtering (Columns) ---------------------------- @@ -66,7 +70,7 @@ When certain columns are wide (such as those holding binary data), it is more ef GET /people?select=fname,age HTTP/1.1 -The default is :sql:`*`, meaning all columns. This value will become more important below in :ref:`Resource Embedding`_. +The default is :sql:`*`, meaning all columns. This value will become more important below in :ref:`resource_embedding`. .. _computed_cols: @@ -129,6 +133,8 @@ If you care where nulls are sorted, add nullsfirst or nullslast: You can also use :ref:`computed_cols` to order the results, even though the computed columns will not appear in the output. +.. _limits: + Limits and Pagination --------------------- @@ -246,7 +252,9 @@ You can use a tool like `Swagger UI `_ to create .. note:: - The OpenAPI information can go out of date as the schema changes under a running server. To learn how to refresh the cache see :ref:`Schema Reloading`_. + The OpenAPI information can go out of date as the schema changes under a running server. To learn how to refresh the cache see :ref:`schema_reloading`. + +.. _resource_embedding: Resource Embedding ================== @@ -303,7 +311,7 @@ PostgREST can also detect relations going through join tables. Thus you can requ .. note:: - Whenever foreign key relations change in the database schema you must refresh PostgREST's schema cache to allow resource embedding to work properly. See the section :ref:`Schema Reloading`_. + Whenever foreign key relations change in the database schema you must refresh PostgREST's schema cache to allow resource embedding to work properly. See the section :ref:`schema_reloading`. Embedded Filters and Order -------------------------- @@ -405,7 +413,7 @@ To create a row in a database table post a JSON object whose keys are the names The response will include a :code:`Location` header describing where to find the new object. If the table is write-only then constructing the Location header will cause a permissions error. To successfully insert an item to a write-only table you will need to suppress the Location response header by including the request header :code:`Prefer: return=minimal`. -On the other end of the spectrum you can get the full created object back in the response to your request by including the header :code:`Prefer: return=representation`. That way you won't have to make another HTTP call to discover properties that may have been filled in on the server side. You can also apply the standard `Vertical Filtering (Columns)`_ to these results. +On the other end of the spectrum you can get the full created object back in the response to your request by including the header :code:`Prefer: return=representation`. That way you won't have to make another HTTP call to discover properties that may have been filled in on the server side. You can also apply the standard :ref:`v_filter` to these results. .. note:: @@ -419,9 +427,9 @@ On the other end of the spectrum you can get the full created object back in the No "{ \"a\": 1, \"b\": 2 }" - Some javascript libraries will post the data incorrectly if you're not careful. For best results try one of the :ref:`Client-Side Libraries`_ built for PostgREST. + Some javascript libraries will post the data incorrectly if you're not careful. For best results try one of the :ref:`clientside_libraries` built for PostgREST. -To update a row or rows in a table, use the PATCH verb. Use :ref:`Horizontal Filtering (Rows)`_ to specify which record(s) to update. Here is an exmaple query setting the :code:`category` column to child for all people below a certain age. +To update a row or rows in a table, use the PATCH verb. Use :ref:`h_filter` to specify which record(s) to update. Here is an exmaple query setting the :code:`category` column to child for all people below a certain age. .. code:: HTTP @@ -429,11 +437,11 @@ To update a row or rows in a table, use the PATCH verb. Use :ref:`Horizontal Fil { "category": "child" } -Updates also support :code:`Prefer: return=representation` plus `Vertical Filtering (Columns)`_. +Updates also support :code:`Prefer: return=representation` plus :ref:`v_filter`. .. note:: - Beware of accidentally updating every row in a table. To learn to prevent that see :ref:`Block Full-Table Operations`_. + Beware of accidentally updating every row in a table. To learn to prevent that see :ref:`block_fulltable`. Bulk Insert ----------- @@ -468,7 +476,7 @@ To bulk insert JSON post an array of objects having all-matching keys Deletions ========= -To delete rows in a table, use the DELETE verb plus :ref:`Horizontal Filtering (Rows)`_. For instance deleting inactive users: +To delete rows in a table, use the DELETE verb plus :ref:`h_filter`. For instance deleting inactive users: .. code-block:: HTTP @@ -476,4 +484,4 @@ To delete rows in a table, use the DELETE verb plus :ref:`Horizontal Filtering ( .. note:: - Beware of accidentally delting all rows in a table. To learn to prevent that see :ref:`Block Full-Table Operations`_. + Beware of accidentally delting all rows in a table. To learn to prevent that see :ref:`block_fulltable`. diff --git a/intro.rst b/intro.rst index ffec7d75cd..9ed102b53c 100644 --- a/intro.rst +++ b/intro.rst @@ -35,6 +35,8 @@ Ecosystem PostgREST has a growing ecosystem of examples, and libraries, experiments, and users. Here is a selection. +.. _clientside_libraries: + Client-Side Libraries --------------------- From 07777ea76b8e68d61022b42db335af8b49b3bbb1 Mon Sep 17 00:00:00 2001 From: Joe Nelson Date: Fri, 3 Feb 2017 16:56:25 -0800 Subject: [PATCH 063/711] Note websockets postgres integration From https://github.com/begriffs/postgrest/issues/278 --- intro.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/intro.rst b/intro.rst index 9ed102b53c..3c7c9d7b72 100644 --- a/intro.rst +++ b/intro.rst @@ -54,6 +54,7 @@ External Notification These are PostgreSQL bridges that propagate LISTEN/NOTIFY to external queues for further processing. This allows stored procedures to initiate actions outside the database such as sending emails. +* `frafra/postgresql2websocket `_ - Websockets * `matthewmueller/pg-bridge `_ - Amazon SNS * `aweber/pgsql-listen-exchange `_ - RabbitMQ * `SpiderOak/skeeter `_ - ZeroMQ From b237a4943c3d319d452f89d60d54b5e40903f3d0 Mon Sep 17 00:00:00 2001 From: Joe Nelson Date: Mon, 6 Feb 2017 10:29:45 -0800 Subject: [PATCH 064/711] More client side libs --- intro.rst | 2 ++ 1 file changed, 2 insertions(+) diff --git a/intro.rst b/intro.rst index 3c7c9d7b72..6d94d44da3 100644 --- a/intro.rst +++ b/intro.rst @@ -40,6 +40,8 @@ PostgREST has a growing ecosystem of examples, and libraries, experiments, and u Client-Side Libraries --------------------- +* `PierreRochard/angular2-postgrest `_ - JS, Angular 2 +* `tomberek/aor-postgrest-client `_ - JS, admin-on-rest * `hugomrdias/postgrest-url `_ - JS, just for generating query URLs * `john-kelly/elm-postgrest `_ - Elm * `mithril.postgrest `_ - JS, Mithril From 7742891c26f14919b51a1c041b652bd75ab3008e Mon Sep 17 00:00:00 2001 From: Joe Nelson Date: Mon, 6 Feb 2017 10:56:41 -0800 Subject: [PATCH 065/711] safeupdate via PGXN --- admin.rst | 9 ++++++++- intro.rst | 1 + 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/admin.rst b/admin.rst index 24ce3df234..d157fc4d9e 100644 --- a/admin.rst +++ b/admin.rst @@ -130,7 +130,14 @@ However it's very easy to delete the **entire table** by omitting the query para DELETE /logs HTTP/1.1 -This can happen accidentally such as by switching a request from a GET to a DELETE. To protect against accidental operations use the `pg-safeupdate `_ PostgreSQL extension. It raises an error if UPDATE or DELETE are executed without specifying conditions. +This can happen accidentally such as by switching a request from a GET to a DELETE. To protect against accidental operations use the `pg-safeupdate `_ PostgreSQL extension. It raises an error if UPDATE or DELETE are executed without specifying conditions. To install it you can use the `PGXN `_ network: + +.. code-block:: bash + + sudo -E pgxn install safeupdate + + # then add this to postgresql.conf: + # shared_preload_libraries='safeupdate'; This does not protect against malicious actions, since someone can add a url parameter that does not affect the result set. To prevent this you must turn to database permissions, forbidding the wrong people from deleting rows, and using `row-level security `_ if finer access control is required. diff --git a/intro.rst b/intro.rst index 6d94d44da3..b87681d723 100644 --- a/intro.rst +++ b/intro.rst @@ -93,6 +93,7 @@ Extensions * `srid/spas `_ - allow file uploads and basic auth * `svmnotn/postgrest-auth `_ - OAuth2-inspired external auth server * `nblumoe/postgrest-oauth `_ - OAuth2 WAI middleware +* `pg-safeupdate `_ - Prevent full-table updates or deletes Commercial PaaS --------------- From 01def809373bd4a87894050600f8742e7b1669d0 Mon Sep 17 00:00:00 2001 From: Joe Nelson Date: Mon, 6 Feb 2017 11:05:45 -0800 Subject: [PATCH 066/711] Google translate example --- intro.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/intro.rst b/intro.rst index b87681d723..813b994466 100644 --- a/intro.rst +++ b/intro.rst @@ -64,6 +64,7 @@ These are PostgreSQL bridges that propagate LISTEN/NOTIFY to external queues for Example Apps ------------ +* `NikolayS/postgrest-google-translate `_ - Calling to external translation service * `CodeforAustralia/heritage-near-me `_ - Elm and PostgREST with PostGIS * `timwis/handsontable-postgrest `_ - An excel-like database table editor * `Recmo/PostgrestSkeleton `_ - Docker Compose, PostgREST, Nginx and Auth0 From 6e1e8f02de9532ae0f443b4a086b844df169b19a Mon Sep 17 00:00:00 2001 From: Hugo Dias Date: Fri, 10 Feb 2017 17:49:56 +0000 Subject: [PATCH 067/711] fix: fix server-proxy-uri config (#35) --- admin.rst | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/admin.rst b/admin.rst index d157fc4d9e..95fd11b680 100644 --- a/admin.rst +++ b/admin.rst @@ -37,7 +37,7 @@ db-anon-role String Y db-pool Int 10 server-host String \*4 server-port Int 3000 -server-proxy-url String +server-proxy-uri String jwt-secret String secret-is-base64 Bool False max-rows Int ∞ @@ -56,8 +56,25 @@ server-host Where to bind the PostgREST web server. server-port The port to bind the web server. -server-proxy-url - Overrides the base URL used within the OpenAPI self-documentation hosted at the API root path. +server-proxy-uri + Overrides the base URL used within the OpenAPI self-documentation hosted at the API root path. Use a complete URI syntax :code:`scheme:[//[user:password@]host[:port]][/]path[?query][#fragment]`. Ex. :code:`https://postgrest.com` + +.. code:: json + + { + "swagger": "2.0", + "info": { + "version": "0.4.0.0", + "title": "PostgREST API", + "description": "This is a dynamic API generated by PostgREST" + }, + "host": "postgrest.com:443", + "basePath": "/", + "schemes": [ + "https" + ] + } + jwt-secret The secret used to decode JWT tokens clients provide for authentication. If this parameter is not specified then PostgREST refuses authentication requests. Choosing a value for this parameter beginning with the at sign such as :code:`@filename` loads the secret out of an external file. This is useful for automating deployments. Note that any binary secrets must be base64 encoded. secret-is-base64 From 022e1101e78abde563ef8cfb36feb7e8e8c8fe38 Mon Sep 17 00:00:00 2001 From: Tony Adams Date: Tue, 14 Feb 2017 23:35:05 -0600 Subject: [PATCH 068/711] fix a missing infinitive (typo) in intro.rst (#36) --- intro.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/intro.rst b/intro.rst index 813b994466..352838f3a8 100644 --- a/intro.rst +++ b/intro.rst @@ -8,7 +8,7 @@ Using PostgREST is an alternative to manual CRUD programming. Custom API servers Declarative Programming ----------------------- -It's easier to ask PostgreSQL to join data for you and let its query planner figure out the details than to loop through rows yourself. It's easier to assign permissions to db objects than to add guards in controllers. (This is especially true for cascading permissions in data dependencies.) It's easier set constraints than to litter code with sanity checks. +It's easier to ask PostgreSQL to join data for you and let its query planner figure out the details than to loop through rows yourself. It's easier to assign permissions to db objects than to add guards in controllers. (This is especially true for cascading permissions in data dependencies.) It's easier to set constraints than to litter code with sanity checks. Leak-proof Abstraction ---------------------- From d461e3387f7366f57fca50c2f207ac754c18235b Mon Sep 17 00:00:00 2001 From: Joe Nelson Date: Sun, 19 Feb 2017 18:11:40 -0800 Subject: [PATCH 069/711] Note the need for percent encoding in passwords --- admin.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/admin.rst b/admin.rst index 95fd11b680..f70cf4d66c 100644 --- a/admin.rst +++ b/admin.rst @@ -45,7 +45,7 @@ pre-request String ================ ====== ======= ======== db-uri - The standard connection PostgreSQL `URI format `_. On older systems like Centos 6, with older versions of libpq, a different db-uri syntax has to be used. In this case the URI is a string of space separated key-value pairs (key=value), so the example above would be :code:`"host=host user=user port=5432 dbname=dbname password=pass"`. Also allows connections over Unix sockets for higher performance. + The standard connection PostgreSQL `URI format `_. Symbols and unusual characters in the password or other fields should be percent encoded to avoid a parse error. On older systems like Centos 6, with older versions of libpq, a different db-uri syntax has to be used. In this case the URI is a string of space separated key-value pairs (key=value), so the example above would be :code:`"host=host user=user port=5432 dbname=dbname password=pass"`. Also allows connections over Unix sockets for higher performance. db-schema The database schema to expose to REST clients. Tables, views and stored procedures in this schema will get API endpoints. db-anon-role From ecbf49ad7f3d8634d6ff3ffb93564183acf7a27a Mon Sep 17 00:00:00 2001 From: Peter Date: Mon, 20 Feb 2017 19:33:37 -0300 Subject: [PATCH 070/711] replace code:postgres by code:sql (#43) Code blocks with code:postgres are not highlighted (see site navigation), not works. Replaced by code:sql that works "fine" --- auth.rst | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/auth.rst b/auth.rst index 6ae84a0aae..0d1f842142 100644 --- a/auth.rst +++ b/auth.rst @@ -26,13 +26,13 @@ Here are the technical details. We use `JSON Web Tokens `_ to au When a request contains a valid JWT with a role claim PostgREST will switch to the database role with that name for the duration of the HTTP request. -.. code:: postgres +.. code:: sql SET LOCAL ROLE user123; Note that the database administrator must allow the authenticator role to switch into this user by previously executing -.. code:: postgres +.. code:: sql GRANT user123 TO authenticator; @@ -50,7 +50,7 @@ PostgREST can accommodate either viewpoint. If you treat a role as a single user You can use row-level security to flexibly restrict visibility and access for the current user. Here is an `example `_ from Tomas Vondra, a chat table storing messages sent between users. Users can insert rows into it to send messages to other users, and query it to see messages sent to them by other users. -.. code:: postgres +.. code:: sql CREATE TABLE chat ( message_uuid UUID PRIMARY KEY DEFAULT uuid_generate_v4(), @@ -65,7 +65,7 @@ We want to enforce a policy that ensures a user can see only those messages sent PostgreSQL (9.5 and later) allows us to set this policy with row-level security: -.. code:: postgres +.. code:: sql CREATE POLICY chat_policy ON chat USING ((message_to = current_user) OR (message_from = current_user)) @@ -87,7 +87,7 @@ Alternately database roles can represent groups instead of (or in addition to) i SQL code can access claims through GUC variables set by PostgREST per request. For instance to get the email claim, call this function: -.. code:: postgres +.. code:: sql current_setting('request.jwt.claim.email') @@ -97,7 +97,7 @@ This allows JWT generation services to include extra information and your databa The current_setting function raises an exception if the setting in question is not present, as when a claim is missing from the JWT. Your SQL functions can either catch the exception, or you can set a default value for the database like this. - .. code:: postgres + .. code:: sql -- Prevent current_setting('request.jwt.claim.email') from raising -- an exception if the setting is not present. Default it to ''. @@ -105,7 +105,7 @@ This allows JWT generation services to include extra information and your databa If you are unable to issue an ALTER DATABASE statement (for instance on Amazon RDS), you can create a helper function to read environment variables and swallow exceptions. - .. code:: plpgsql + .. code:: sql create function env_var(v text) returns text as $$ declare @@ -130,7 +130,7 @@ Hybrid User-Group Roles There is no performance penalty for having many database roles, although roles are namespaced per-cluster rather than per-database so may be prone to collision within the database. You are free to assign a new role for every user in a web application if desired. You can mix the group and individual role policies. For instance we could still have a webuser role and individual users which inherit from it: -.. code:: postgres +.. code:: sql CREATE ROLE webuser NOLOGIN; -- grant this role access to certain tables etc @@ -158,7 +158,7 @@ Here's an example. In the config file specify a stored procedure: In the function you can run arbitrary code to check the request and raise an exception to block it if desired. -.. code:: postgres +.. code:: sql CREATE OR REPLACE FUNCTION check_user() RETURNS void LANGUAGE plpgsql @@ -193,7 +193,7 @@ You can create JWT tokens in SQL using the `pgjwt extension Date: Sun, 26 Feb 2017 22:23:26 +0545 Subject: [PATCH 071/711] Added a / after location /api (#44) --- admin.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/admin.rst b/admin.rst index f70cf4d66c..6b290105eb 100644 --- a/admin.rst +++ b/admin.rst @@ -118,10 +118,10 @@ The first step is to create an Nginx configuration file that proxies requests to server { ... # expose to the outside world - location /api { + location /api/ { default_type application/json; proxy_hide_header Content-Location; - add_header Content-Location /api$upstream_http_content_location; + add_header Content-Location /api/$upstream_http_content_location; proxy_set_header Connection ""; proxy_http_version 1.1; proxy_pass http://postgrest/; From b8f2ffc0a306be9ec283566f817d2aa03ccb952a Mon Sep 17 00:00:00 2001 From: Joe Nelson Date: Mon, 27 Feb 2017 09:38:21 -0800 Subject: [PATCH 072/711] Instructions for building docs locally --- README.md | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 README.md diff --git a/README.md b/README.md new file mode 100644 index 0000000000..bb9afe28e1 --- /dev/null +++ b/README.md @@ -0,0 +1,20 @@ +#### Sphinx source files for PostgREST documentation + +To generate HTML version: + +1. Install Sphinx from the [sphinx website](http://sphinx-doc.org/latest/install.html) +2. Clone this repository +4. Generate HTML + ```bash + cd postgrest-docs + sphinx-build -b html -a -n . _build + + # open _build/index.html in your browser + ``` + +--- + +**Sphinx Installation Notes:** + +* If you're on OSX you might want to install the Python from homebrew - then a simple `pip install sphinx` does the trick. +* For an easier time refreshing your local preview of docs as you change it, try [sphinx-autobuild](https://github.com/GaretJax/sphinx-autobuild). From 8b170afe4948e74b725547ce11e01384ad506c6f Mon Sep 17 00:00:00 2001 From: Joe Nelson Date: Mon, 13 Mar 2017 09:51:12 -0700 Subject: [PATCH 073/711] More extensions, example apps, client side libs (#45) --- intro.rst | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/intro.rst b/intro.rst index 352838f3a8..644bd20a35 100644 --- a/intro.rst +++ b/intro.rst @@ -50,6 +50,7 @@ Client-Side Libraries * `JarvusInnovations/jarvus-postgrest-apikit `_ - JS, Sencha framework * `davidthewatson/postgrest_python_requests_client `_ - Python * `calebmer/postgrest-client `_ - JS +* `clesiemo3/postgrestR `_ - R External Notification --------------------- @@ -77,6 +78,7 @@ Example Apps * `myfreeweb/moneylog `_ - accounting web app in Polymer + PostgREST * `tyrchen/goodfilm `_ - example film api * `begriffs/postgrest-example `_ - sqitch versioning for API +* `SMRxT/postgrest-demo `_ - multi-tenant logging system In Production ------------- @@ -90,11 +92,12 @@ In Production Extensions ---------- +* `ppKrauss/PostgREST-writeAPI `_ - generate Nginx rewrite rules to fit an OpenAPI spec * `diogob/postgrest-ws `_ - expose web sockets for PostgreSQL's LISTEN/NOTIFY +* `pg-safeupdate `_ - Prevent full-table updates or deletes * `srid/spas `_ - allow file uploads and basic auth * `svmnotn/postgrest-auth `_ - OAuth2-inspired external auth server * `nblumoe/postgrest-oauth `_ - OAuth2 WAI middleware -* `pg-safeupdate `_ - Prevent full-table updates or deletes Commercial PaaS --------------- From 708e0cd0b6eee10dbcfceea18af5a6dfa89b019a Mon Sep 17 00:00:00 2001 From: Joe Nelson Date: Thu, 16 Mar 2017 00:33:32 -0700 Subject: [PATCH 074/711] Another site in production --- intro.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/intro.rst b/intro.rst index 644bd20a35..50bbaacb80 100644 --- a/intro.rst +++ b/intro.rst @@ -88,6 +88,7 @@ In Production * `Redsmin `_ * `Image-charts `_ * `Drip Depot `_ +* `OpenBooking `_ Extensions ---------- From 8e6410e55d95aa905b35dfb3ed9c17bf42ec19d1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Steve=20Ch=C3=A1vez?= Date: Fri, 24 Mar 2017 16:14:03 -0500 Subject: [PATCH 075/711] Add section for binary output (#46) --- api.rst | 28 ++++++++++++++++++++++------ 1 file changed, 22 insertions(+), 6 deletions(-) diff --git a/api.rst b/api.rst index edf2b8f4f5..46b9411ee9 100644 --- a/api.rst +++ b/api.rst @@ -210,6 +210,7 @@ The current possibilities are * text/csv * application/json * application/openapi+json +* application/octet-stream The server will default to JSON for API endpoints and OpenAPI on the root. @@ -243,16 +244,20 @@ This returns Admittedly PostgREST could detect when there is an equality condition holding on all columns constituting the primary key and automatically convert to singular. However this could lead to a surprising change of format that breaks unwary client code just by filtering on an extra column. Instead we allow manually specifying singular vs plural to decouple that choice from the URL format. -OpenAPI Support -=============== +Binary output +------------- -Every API hosted by PostgREST automatically serves a full `OpenAPI `_ description on the root path. This provides a list of all endpoints, along with supported HTTP verbs and example payloads. +If you want to return raw binary data from a :code:`bytea` column, you must specify :code:`application/octet-stream` as part of the :code:`Accept` header +and select a single column :code:`?select=bin_data`. -You can use a tool like `Swagger UI `_ to create beautiful documentation from the description and to host an interactive web-based dahsboard. The dashboard allows developers to make requests against a live PostgREST server, provides guidance with request headers and example request bodies. +.. code:: http + + GET /items?select=bin_data&id=eq.1 HTTP/1.1 + Accept: application/octet-stream .. note:: - The OpenAPI information can go out of date as the schema changes under a running server. To learn how to refresh the cache see :ref:`schema_reloading`. + If more than one row would be returned the binary results will be concatenated with no delimiter. .. _resource_embedding: @@ -350,7 +355,7 @@ Every stored procedure in the API-exposed database schema is accessible under th POST /rpc/function_name HTTP/1.1 -Procedures must used `named arguments `_. To supply arguments in an API call, include a JSON object in the request payload and each key/value of the object will become an argument. +Procedures must be used with `named arguments `_. To supply arguments in an API call, include a JSON object in the request payload and each key/value of the object will become an argument. For instance, assume we have created this function in the database. @@ -485,3 +490,14 @@ To delete rows in a table, use the DELETE verb plus :ref:`h_filter`. For instanc .. note:: Beware of accidentally delting all rows in a table. To learn to prevent that see :ref:`block_fulltable`. + +OpenAPI Support +=============== + +Every API hosted by PostgREST automatically serves a full `OpenAPI `_ description on the root path. This provides a list of all endpoints, along with supported HTTP verbs and example payloads. + +You can use a tool like `Swagger UI `_ to create beautiful documentation from the description and to host an interactive web-based dahsboard. The dashboard allows developers to make requests against a live PostgREST server, provides guidance with request headers and example request bodies. + +.. note:: + + The OpenAPI information can go out of date as the schema changes under a running server. To learn how to refresh the cache see :ref:`schema_reloading`. From e54fb2a2643621cf572c8453f4890f6a287baa9e Mon Sep 17 00:00:00 2001 From: Joe Nelson Date: Sat, 25 Mar 2017 10:58:30 -0700 Subject: [PATCH 076/711] Misc improvements How to pass a single json object to stored proc List HTTP codes for db errors Point out 404 semantics of singular responses OR query workaround Include nginx example for singular rewrite --- admin.rst | 15 ++++++++-- api.rst | 88 +++++++++++++++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 99 insertions(+), 4 deletions(-) diff --git a/admin.rst b/admin.rst index 6b290105eb..e3cd251689 100644 --- a/admin.rst +++ b/admin.rst @@ -278,11 +278,22 @@ As discussed in `Singular or Plural`_, there are no special URL forms for singul GET /people?id=eq.1 Accept: application/vnd.pgrst.object+json -This allows compound primary keys and makes the intent for singular response independent of a URL convention. However for any table which uses a simple primary key you can use Nginx to simulate the familiar URL convention. +This allows compound primary keys and makes the intent for singular response independent of a URL convention. + +Nginx rewrite rules allow you to simulate the familiar URL convention. The following example adds a rewrite rule for all table endpoints, but you'll want to restrict it to those tables that have a numeric simple primary key named "id." .. code:: nginx - nginx code here + # support /endpoint/:id url style + location ~ ^/([a-z_]+)/([0-9]+) { + + # make the response singular + proxy_set_header Accept 'application/vnd.pgrst.object+json'; + + # assuming an upstream named "postgrest" + proxy_pass http://postgrest/$1?id=eq.$2; + + } .. TODO .. Administration diff --git a/api.rst b/api.rst index 46b9411ee9..7595c33fa1 100644 --- a/api.rst +++ b/api.rst @@ -57,7 +57,26 @@ not negates another operator, see below To negate any operator, prefix it with :code:`not` like :code:`?a=not.eq.2`. -For more complicated filters (such as those involving condition 1 OR condition 2) you will have to create a new view in the database. +For more complicated filters (such as those involving disjunctions) you will have to create a new view in the database, or use a stored procedure. For instance, here's a view to show "today's stories" including possibly older pinned stories: + +.. code-block:: postgresql + + CREATE VIEW fresh_stories AS + SELECT * + FROM stories + WHERE pinned = true + OR published > now() - interval '1 day' + ORDER BY pinned DESC, published DESC; + +The view will provide a new endpoint: + +.. code-block:: http + + GET /fresh_stories HTTP/1.1 + +.. note:: + + We're working to extend the PostgREST query grammar to allow more complicated boolean logic, while continuing to prevent performance problems from arbitrary client queries. .. _v_filter: @@ -238,6 +257,8 @@ This returns { "id": 1 } +When a singular response is requested but no entries are found, the server responds with an empty body and 404 status code rather than the usual empty array and 200 status. + .. note:: Many APIs distinguish plural and singular resources using a special nested URL convention e.g. `/stories` vs `/stories/1`. Why do we use `/stories?id=eq.1`? The answer is because a singlular resource is (for us) a row determined by a primary key, and primary keys can be compound (meaning defined across more than one column). The more familiar nested urls consider only a degenerate case of simple and overwhelmingly numeric primary keys. These so-called artificial keys are often introduced automatically by Object Relational Mapping libraries. @@ -374,7 +395,7 @@ The client can call it by posting an object like { "a": 1, "b": 2 } -The keys of the object match the parameter names. Note that PostgreSQL converts parameter names to lowercase unless you quote them like :sql:`CREATE FUNCTION foo("mixedCase" text) ...`. +The keys of the object match the parameter names. Note that PostgreSQL converts parameter names to lowercase unless you quote them like :sql:`CREATE FUNCTION foo("mixedCase" text) ...`. You can also call a function that takes a single parameter of type json by sending the header :code:`Prefer: params=single-object` with your request. That way the JSON request body will be used as the single argument. .. note:: @@ -501,3 +522,66 @@ You can use a tool like `Swagger UI `_ to create .. note:: The OpenAPI information can go out of date as the schema changes under a running server. To learn how to refresh the cache see :ref:`schema_reloading`. + +HTTP Status Codes +================= + +PostgREST translates `PostgreSQL error codes `_ into HTTP status as follows: + ++--------------------------+-------------------------+---------------------------------+ +| PostgreSQL error code(s) | HTTP status | Error description | ++==========================+=========================+=================================+ +| 08* | 503 | pg connection err | ++--------------------------+-------------------------+---------------------------------+ +| 09* | 500 | triggered action exception | ++--------------------------+-------------------------+---------------------------------+ +| 0L* | 403 | invalid grantor | ++--------------------------+-------------------------+---------------------------------+ +| 0P* | 403 | invalid role specification | ++--------------------------+-------------------------+---------------------------------+ +| 23503 | 409 | foreign key violation | ++--------------------------+-------------------------+---------------------------------+ +| 23505 | 409 | uniqueness violation | ++--------------------------+-------------------------+---------------------------------+ +| 25* | 500 | invalid transaction state | ++--------------------------+-------------------------+---------------------------------+ +| 28* | 403 | invalid auth specification | ++--------------------------+-------------------------+---------------------------------+ +| 2D* | 500 | invalid transaction termination | ++--------------------------+-------------------------+---------------------------------+ +| 38* | 500 | external routine exception | ++--------------------------+-------------------------+---------------------------------+ +| 39* | 500 | external routine invocation | ++--------------------------+-------------------------+---------------------------------+ +| 3B* | 500 | savepoint exception | ++--------------------------+-------------------------+---------------------------------+ +| 40* | 500 | transaction rollback | ++--------------------------+-------------------------+---------------------------------+ +| 53* | 503 | insufficient resources | ++--------------------------+-------------------------+---------------------------------+ +| 54* | 413 | too complex | ++--------------------------+-------------------------+---------------------------------+ +| 55* | 500 | obj not in prereq state | ++--------------------------+-------------------------+---------------------------------+ +| 57* | 500 | operator intervention | ++--------------------------+-------------------------+---------------------------------+ +| 58* | 500 | system error | ++--------------------------+-------------------------+---------------------------------+ +| F0* | 500 | conf file error | ++--------------------------+-------------------------+---------------------------------+ +| HV* | 500 | foreign data wrapper error | ++--------------------------+-------------------------+---------------------------------+ +| P0001 | 400 | default code for "raise" | ++--------------------------+-------------------------+---------------------------------+ +| P0* | 500 | PL/pgSQL error | ++--------------------------+-------------------------+---------------------------------+ +| XX* | 500 | internal error | ++--------------------------+-------------------------+---------------------------------+ +| 42883 | 404 | undefined function | ++--------------------------+-------------------------+---------------------------------+ +| 42P01 | 404 | undefined table | ++--------------------------+-------------------------+---------------------------------+ +| 42501 | if authed 403, else 401 | insufficient privileges | ++--------------------------+-------------------------+---------------------------------+ +| other | 500 | | ++--------------------------+-------------------------+---------------------------------+ From 0f871373878751f3cf10e323a6298671726bafa1 Mon Sep 17 00:00:00 2001 From: Joe Nelson Date: Sun, 26 Mar 2017 00:16:25 -0700 Subject: [PATCH 077/711] More improvements When to use RAISE in procs Fix broken links --- admin.rst | 2 +- api.rst | 35 ++++++++++++++++++++++++++++++++++- auth.rst | 4 +++- 3 files changed, 38 insertions(+), 3 deletions(-) diff --git a/admin.rst b/admin.rst index e3cd251689..a1abf9cc90 100644 --- a/admin.rst +++ b/admin.rst @@ -271,7 +271,7 @@ In the future we're investigating ways to keep the cache updated without manual Alternate URL Structure ======================= -As discussed in `Singular or Plural`_, there are no special URL forms for singular resources in PostgREST, only operators for filtering. Thus there are no URLs like :code:`/people/1`. It would be specified instead as +As discussed in :ref:`singular_plural`, there are no special URL forms for singular resources in PostgREST, only operators for filtering. Thus there are no URLs like :code:`/people/1`. It would be specified instead as .. code:: http diff --git a/api.rst b/api.rst index 7595c33fa1..29fc3e1115 100644 --- a/api.rst +++ b/api.rst @@ -233,6 +233,8 @@ The current possibilities are The server will default to JSON for API endpoints and OpenAPI on the root. +.. _singular_plural: + Singular or Plural ------------------ @@ -289,7 +291,7 @@ In addition to providing RESTful routes for each table and view, PostgREST allow .. image:: _static/film.png -As seen above in `vertical_filtering`_ we can request the titles of all films like this: +As seen above in :ref:`v_filter` we can request the titles of all films like this: .. code-block:: http @@ -423,6 +425,35 @@ By default, a function is executed with the privileges of the user who calls it. We are considering allowing GET requests for functions that are marked non-volatile. Allowing GET is important for HTTP caching. However we still must decide how to pass function parameters since request bodies are not allowed. Also some query string arguments are already reserved for shaping/filtering the output. +Raising Errors +-------------- + +Stored procedures can return non-200 HTTP status codes by raising SQL exceptions. For instance, here's a saucy function that always errors: + +.. code-block:: postgresql + + CREATE OR REPLACE FUNCTION just_fail() RETURNS void + LANGUAGE plpgsql + AS $$ + BEGIN + RAISE EXCEPTION 'I refuse!' + USING DETAIL = 'Pretty simple', + HINT = 'There is nothing you can do.'; + END + $$; + +Calling the function returns HTTP 400 with the body + +.. code-block:: json + + { + "message":"I refuse!", + "details":"Pretty simple", + "hint":"There is nothing you can do.", + "code":"P0001" + } + +You can customize the HTTP status code by raising particular exceptions according to the PostgREST :ref:`error to status code mapping `. For example, :code:`RAISE insufficient_privilege` will respond with HTTP 401/403 as appropriate. Insertions / Updates ==================== @@ -523,6 +554,8 @@ You can use a tool like `Swagger UI `_ to create The OpenAPI information can go out of date as the schema changes under a running server. To learn how to refresh the cache see :ref:`schema_reloading`. +.. _status_codes: + HTTP Status Codes ================= diff --git a/auth.rst b/auth.rst index 0d1f842142..f9abc431d6 100644 --- a/auth.rst +++ b/auth.rst @@ -270,7 +270,7 @@ PostgREST aims to do one thing well: add an HTTP interface to a PostgreSQL datab Schema Isolation ================ -A PostgREST instance is configured to expose all the tables, views, and stored procedures of a single schema specified in a server configuration file. This means private data or implementation details can go inside a private schema and be invisible to HTTP clients. You can then expose views and stored procedures which insulate the internal details from the outside world. It keeps you code easier to refactor, and provides a natural way to do API `versioning`_. For an example of wrapping a private table with a public view see the `Editing User Info`_ section below. +A PostgREST instance is configured to expose all the tables, views, and stored procedures of a single schema specified in a server configuration file. This means private data or implementation details can go inside a private schema and be invisible to HTTP clients. You can then expose views and stored procedures which insulate the internal details from the outside world. It keeps you code easier to refactor, and provides a natural way to do API versioning. For an example of wrapping a private table with a public view see the :ref:`public_ui` section below. SQL User Management =================== @@ -363,6 +363,8 @@ With the table in place we can make a helper to check a password against the enc end; $$; +.. _public_ui: + Public User Interface --------------------- From 27bcd8074ff4a5cd1e273d54f28e4e1afa16f9ca Mon Sep 17 00:00:00 2001 From: Dan Kamenov Date: Sun, 26 Mar 2017 21:26:14 -0600 Subject: [PATCH 078/711] Fix duplicate wording (#48) --- api.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/api.rst b/api.rst index 29fc3e1115..56c97991b9 100644 --- a/api.rst +++ b/api.rst @@ -214,7 +214,7 @@ Note that the larger the table the slower this query runs in the database. The s Response Format --------------- -PostgREST uses proper HTTP content negotiation (`RFC7231 `_) to deliver the desired representation of a resource. That is to say the same API endpoint can respond respond in different formats like JSON or CSV depending on the client request. +PostgREST uses proper HTTP content negotiation (`RFC7231 `_) to deliver the desired representation of a resource. That is to say the same API endpoint can respond in different formats like JSON or CSV depending on the client request. Use the Accept request header to specify the acceptable format (or formats) for the response: From 1cab8cf82d292663d4468b83778782e38b42c648 Mon Sep 17 00:00:00 2001 From: Dan Kamenov Date: Wed, 29 Mar 2017 20:48:36 -0600 Subject: [PATCH 079/711] Fix Bad SQL coding practices in "Computed Columns" example (#51) --- api.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/api.rst b/api.rst index 56c97991b9..c66ac80604 100644 --- a/api.rst +++ b/api.rst @@ -111,7 +111,7 @@ Filters may be applied to computed columns as well as actual table/view columns, -- (optional) add an index to speed up anticipated query CREATE INDEX people_full_name_idx ON people - USING GIN (to_tsvector('english', fname || ' ' || lname)); + USING GIN (to_tsvector('english', full_name(people))); A full-text search on the computed column: From 8a6b429c167b4819ff38ded1e11f7a66535c79be Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Steve=20Ch=C3=A1vez?= Date: Tue, 4 Apr 2017 23:24:57 -0500 Subject: [PATCH 080/711] Add example for complex boolean logic (#52) --- api.rst | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/api.rst b/api.rst index c66ac80604..e24963da10 100644 --- a/api.rst +++ b/api.rst @@ -425,6 +425,25 @@ By default, a function is executed with the privileges of the user who calls it. We are considering allowing GET requests for functions that are marked non-volatile. Allowing GET is important for HTTP caching. However we still must decide how to pass function parameters since request bodies are not allowed. Also some query string arguments are already reserved for shaping/filtering the output. +Complex boolean logic +--------------------- + +For complex boolean logic you can use stored procedures, an example: + +.. code-block:: postgresql + + CREATE FUNCTION key_customers(country TEXT, company TEXT, salary FLOAT) RETURNS SETOF customers AS $$ + SELECT * FROM customers WHERE (country = $1 AND company = $2) OR salary = $3; + $$ LANGUAGE SQL; + +Then you can query by doing: + +.. code-block:: http + + POST /rpc/key_customers HTTP/1.1 + + { "country": "Germany", "company": "Volkswagen", salary": 120000.00 } + Raising Errors -------------- From 42dd4ab607daf31ff62c6045a67aa18bacfa6f54 Mon Sep 17 00:00:00 2001 From: Ruslan Talpa Date: Thu, 6 Apr 2017 06:57:48 +0300 Subject: [PATCH 081/711] subzero domain change (#47) --- intro.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/intro.rst b/intro.rst index 50bbaacb80..dfa30970e2 100644 --- a/intro.rst +++ b/intro.rst @@ -100,10 +100,10 @@ Extensions * `svmnotn/postgrest-auth `_ - OAuth2-inspired external auth server * `nblumoe/postgrest-oauth `_ - OAuth2 WAI middleware -Commercial PaaS +Commercial --------------- -* `Sub0 `_ - Automated GraphQL & REST API with built-in caching (powered by PostgREST, not affiliated) +* `subZero `_ - Automated GraphQL & REST API with built-in caching (powered by PostgREST, not affiliated) Getting Support From 625f2ce8d77d85c9f8e6dbbff628c3d3a6e4fc49 Mon Sep 17 00:00:00 2001 From: Joe Nelson Date: Wed, 5 Apr 2017 23:07:30 -0500 Subject: [PATCH 082/711] Update subzero message --- intro.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/intro.rst b/intro.rst index dfa30970e2..b741071566 100644 --- a/intro.rst +++ b/intro.rst @@ -103,7 +103,7 @@ Extensions Commercial --------------- -* `subZero `_ - Automated GraphQL & REST API with built-in caching (powered by PostgREST, not affiliated) +* `subZero `_ - Automated GraphQL & REST API with built-in caching (powered in part by PostgREST) Getting Support From f52829d16536ce6212b70dc2a14c592e0195abaa Mon Sep 17 00:00:00 2001 From: Will O'Brien Date: Fri, 21 Apr 2017 17:46:15 -0400 Subject: [PATCH 083/711] App metadata instead of user metadata (#55) From the [docs](https://auth0.com/docs/metadata): > An authenticated user can modify data in their profile's user_metadata, but not in their app_metadata. Seems role-type information should be stored in `app_metadata`. --- auth.rst | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/auth.rst b/auth.rst index f9abc431d6..ab271a11c9 100644 --- a/auth.rst +++ b/auth.rst @@ -236,14 +236,14 @@ An external service like `Auth0 `_ can do the hard work tran To use Auth0, copy its client secret into your PostgREST configuration file as the :code:`jwt-secret`. (Old-style Auth0 secrets are Base64 encoded. For these secrets set :code:`secret-is-base64` to :code:`true`, or just refresh the Auth0 secret.) You can find the secret in the client settings of the Auth0 management console. -Our code requires a database role in the JWT. To add it you need to save the database role in Auth0 `user metadata `_. Then, you will need to write a rule that will extract the role from the user metadata and include a :code:`role` claim in the payload of our user object. Afterwards, in your Auth0Lock code, include the :code:`role` claim in your `scope param `_. +Our code requires a database role in the JWT. To add it you need to save the database role in Auth0 `app metadata `_. Then, you will need to write a rule that will extract the role from the user metadata and include a :code:`role` claim in the payload of our user object. Afterwards, in your Auth0Lock code, include the :code:`role` claim in your `scope param `_. .. code:: javascript // Example Auth0 rule function (user, context, callback) { - var role = user.user_metadata.role; - user.role = role; + user.app_metadata = user.app_metadata || {}; + user.role = user.app_metadata.role; callback(null, user, context); } From bfe6bd1165dc8506e8fee39949bb575a563b0820 Mon Sep 17 00:00:00 2001 From: Joe Nelson Date: Sun, 23 Apr 2017 20:10:42 -0500 Subject: [PATCH 084/711] Confirmed more production users --- intro.rst | 2 ++ 1 file changed, 2 insertions(+) diff --git a/intro.rst b/intro.rst index b741071566..a1dfc3f4f3 100644 --- a/intro.rst +++ b/intro.rst @@ -89,6 +89,8 @@ In Production * `Image-charts `_ * `Drip Depot `_ * `OpenBooking `_ +* `Convene `_ by Thomson-Reuters +* `eGull `_ Extensions ---------- From 2ce053b69eaae38fb07fd649218c9909e467e119 Mon Sep 17 00:00:00 2001 From: Joe Nelson Date: Sun, 23 Apr 2017 20:25:44 -0500 Subject: [PATCH 085/711] Add some things people have said --- intro.rst | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/intro.rst b/intro.rst index a1dfc3f4f3..74e8d622fd 100644 --- a/intro.rst +++ b/intro.rst @@ -107,6 +107,28 @@ Commercial * `subZero `_ - Automated GraphQL & REST API with built-in caching (powered in part by PostgREST) +Testimonials +############ + + "It's so fast to develop, it feels like cheating!" + + -- François-G. Ribreau + + "I just have to say that, the CPU/Memory usage compared to our + Node.js/Waterline ORM based API is ridiculous. It's hard to even push + it over 60/70 MB while our current API constantly hits 1GB running on 6 + instances (dynos)." + + -- Louis Brauer + + "I really enjoyed the fact that all of a sudden I was writing + microservices in SQL DDL (and v8 javascript functions). I dodged so + much boilerplate. The next thing I knew, we pulled out a full rewrite + of a Spring+MySQL legacy app in 6 months. Literally 10x faster, and + code was super concise. The old one took 3 years and a team of 4 + people to develop." + + -- Simone Scarduzio Getting Support ################ From 8f5a3f50c25ab826e380f9a56669a2ada686cb2d Mon Sep 17 00:00:00 2001 From: Joe Nelson Date: Sun, 23 Apr 2017 21:45:47 -0500 Subject: [PATCH 086/711] Another queue bridge --- intro.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/intro.rst b/intro.rst index 74e8d622fd..860b59197e 100644 --- a/intro.rst +++ b/intro.rst @@ -61,6 +61,7 @@ These are PostgreSQL bridges that propagate LISTEN/NOTIFY to external queues for * `matthewmueller/pg-bridge `_ - Amazon SNS * `aweber/pgsql-listen-exchange `_ - RabbitMQ * `SpiderOak/skeeter `_ - ZeroMQ +* `FGRibreau/postgresql-to-amqp `_ - AMQP Example Apps ------------ From f2f392b0f42b8b2cf07f0bcd83997ccaae5c9c7c Mon Sep 17 00:00:00 2001 From: Steve Phillips Date: Mon, 10 Apr 2017 08:47:18 -0500 Subject: [PATCH 087/711] api.rst typo: dahsboard -> dashboard (#53) --- api.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/api.rst b/api.rst index e24963da10..6c01c9358f 100644 --- a/api.rst +++ b/api.rst @@ -567,7 +567,7 @@ OpenAPI Support Every API hosted by PostgREST automatically serves a full `OpenAPI `_ description on the root path. This provides a list of all endpoints, along with supported HTTP verbs and example payloads. -You can use a tool like `Swagger UI `_ to create beautiful documentation from the description and to host an interactive web-based dahsboard. The dashboard allows developers to make requests against a live PostgREST server, provides guidance with request headers and example request bodies. +You can use a tool like `Swagger UI `_ to create beautiful documentation from the description and to host an interactive web-based dashboard. The dashboard allows developers to make requests against a live PostgREST server, provides guidance with request headers and example request bodies. .. note:: From fc65694c0a4c1386bcdeeec5f5469f5160fb0213 Mon Sep 17 00:00:00 2001 From: Steve Phillips Date: Mon, 10 Apr 2017 08:47:59 -0500 Subject: [PATCH 088/711] api.rst typo: delting -> deleting (#54) --- api.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/api.rst b/api.rst index 6c01c9358f..bed4863625 100644 --- a/api.rst +++ b/api.rst @@ -560,7 +560,7 @@ To delete rows in a table, use the DELETE verb plus :ref:`h_filter`. For instanc .. note:: - Beware of accidentally delting all rows in a table. To learn to prevent that see :ref:`block_fulltable`. + Beware of accidentally deleting all rows in a table. To learn to prevent that see :ref:`block_fulltable`. OpenAPI Support =============== From 1a5cadb8550992f928f0623b23c5677f4c79d095 Mon Sep 17 00:00:00 2001 From: Matt Bretl Date: Wed, 17 May 2017 04:01:28 +0100 Subject: [PATCH 089/711] auth.rst: minor fixes to example scripts (#68) --- auth.rst | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/auth.rst b/auth.rst index ab271a11c9..6b490b2db2 100644 --- a/auth.rst +++ b/auth.rst @@ -202,7 +202,7 @@ Next write a stored procedure that returns the token. The one below returns a to CREATE FUNCTION jwt_test() RETURNS public.jwt_token LANGUAGE sql AS $$ - SELECT jwt.sign( + SELECT sign( row_to_json(r), 'mysecret' ) AS token FROM ( @@ -224,7 +224,7 @@ PostgREST exposes this function to clients via a POST request to `/rpc/jwt_test` ALTER DATABASE mydb SET "app.jwt_secret" TO '!!secret!!'; -- then all functions can refer to app.jwt_secret - SELECT jwt.sign( + SELECT sign( row_to_json(r), current_setting('app.jwt_secret') ) AS token FROM ... @@ -295,7 +295,7 @@ First we'll need a table to keep track of our users: basic_auth.users ( email text primary key check ( email ~* '^.+@.+\..+$' ), pass text not null check (length(pass) < 512), - role name not null check (length(role) < 512), + role name not null check (length(role) < 512) ); We would like the role to be a foreign key to actual database roles, however PostgreSQL does not support these constraints against the :code:`pg_roles` table. We'll use a trigger to manually enforce it. @@ -391,7 +391,7 @@ As described in `JWT from SQL`_, we'll create a JWT inside our login function. N raise invalid_password using message = 'invalid user or password'; end if; - select jwt.sign( + select sign( row_to_json(r), 'mysecret' ) as token from ( From 3cb2c0f297ac02373fe3ef7ea0e84007ed278963 Mon Sep 17 00:00:00 2001 From: James Dalton Date: Wed, 24 May 2017 20:51:27 -0700 Subject: [PATCH 090/711] switch tar command for xz instead of gzip (#73) --- install.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install.rst b/install.rst index 50c6ba8158..f1bb74f776 100644 --- a/install.rst +++ b/install.rst @@ -9,7 +9,7 @@ The release page has precompiled binaries for Mac OS X, Windows, and several Lin # Untar the release (available at https://github.com/begriffs/postgrest/releases/latest) - $ tar zxf postgrest-[version]-[platform].tar.xz + $ tar Jxf postgrest-[version]-[platform].tar.xz # Try running it $ ./postgrest --help From 6bb81b5d4b1a4e4a431baebea59d1f2870c3f0a4 Mon Sep 17 00:00:00 2001 From: Steve Phillips Date: Sat, 27 May 2017 08:22:35 -0700 Subject: [PATCH 091/711] api.rst typo: Directories -> Directors (#74) --- api.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/api.rst b/api.rst index bed4863625..ed30a7239a 100644 --- a/api.rst +++ b/api.rst @@ -335,7 +335,7 @@ Which would return } ] -PostgREST can also detect relations going through join tables. Thus you can request the Actors for Films (which in this case finds the information through Roles). You can also reverse the direction of inclusion, asking for all Directories with each including the list of their Films. +PostgREST can also detect relations going through join tables. Thus you can request the Actors for Films (which in this case finds the information through Roles). You can also reverse the direction of inclusion, asking for all Directors with each including the list of their Films. .. note:: From e35f2d28c771e53f1a88617099cdff114f92dc6c Mon Sep 17 00:00:00 2001 From: Michel Pelletier Date: Wed, 24 May 2017 20:55:31 -0700 Subject: [PATCH 092/711] Use current_setting optional param to suppress raise (#70) --- auth.rst | 36 ++---------------------------------- 1 file changed, 2 insertions(+), 34 deletions(-) diff --git a/auth.rst b/auth.rst index 6b490b2db2..f953d5aa66 100644 --- a/auth.rst +++ b/auth.rst @@ -89,41 +89,9 @@ SQL code can access claims through GUC variables set by PostgREST per request. F .. code:: sql - current_setting('request.jwt.claim.email') + current_setting('request.jwt.claim.email', true) -This allows JWT generation services to include extra information and your database code to react to it. For instance the RLS example could be modified to use this current_setting rather than current_user. - -.. note:: - - The current_setting function raises an exception if the setting in question is not present, as when a claim is missing from the JWT. Your SQL functions can either catch the exception, or you can set a default value for the database like this. - - .. code:: sql - - -- Prevent current_setting('request.jwt.claim.email') from raising - -- an exception if the setting is not present. Default it to ''. - ALTER DATABASE your_db_name SET request.jwt.claim.email TO ''; - - If you are unable to issue an ALTER DATABASE statement (for instance on Amazon RDS), you can create a helper function to read environment variables and swallow exceptions. - - .. code:: sql - - create function env_var(v text) returns text as $$ - declare - result text; - begin - begin - select current_setting(v) into result; - exception - when undefined_object then - return null; - end; - - return result; - end; - $$ stable language plpgsql; - - -- now you can call call for instance - -- SELECT env_var('request.jwt.claim.email') +This allows JWT generation services to include extra information and your database code to react to it. For instance the RLS example could be modified to use this current_setting rather than current_user. The second 'true' argument tells current_setting to return NULL if the setting is missing from the current configuration. Hybrid User-Group Roles ~~~~~~~~~~~~~~~~~~~~~~~ From 49af7dcbc2d47037ca1d69519dd5bc160812d321 Mon Sep 17 00:00:00 2001 From: Steve Phillips Date: Mon, 29 May 2017 08:17:21 -0700 Subject: [PATCH 093/711] api.rst: Added example alluded to in docs (#77) --- api.rst | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/api.rst b/api.rst index ed30a7239a..461afae7ac 100644 --- a/api.rst +++ b/api.rst @@ -335,7 +335,11 @@ Which would return } ] -PostgREST can also detect relations going through join tables. Thus you can request the Actors for Films (which in this case finds the information through Roles). You can also reverse the direction of inclusion, asking for all Directors with each including the list of their Films. +PostgREST can also detect relations going through join tables. Thus you can request the Actors for Films (which in this case finds the information through Roles). You can also reverse the direction of inclusion, asking for all Directors with each including the list of their Films: + +.. code-block:: http + + GET /directors?select=films{title,year} HTTP/1.1 .. note:: From cb90e3e5577140b27af14afe5bd1f0436a2450ae Mon Sep 17 00:00:00 2001 From: Steve Phillips Date: Mon, 29 May 2017 09:46:12 -0700 Subject: [PATCH 094/711] api.rst: de-duped a word, added commas (#78) --- api.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/api.rst b/api.rst index 461afae7ac..2df2c91edd 100644 --- a/api.rst +++ b/api.rst @@ -348,7 +348,7 @@ PostgREST can also detect relations going through join tables. Thus you can requ Embedded Filters and Order -------------------------- -Embedded tables can be filtered and ordered similarly to their top-level counterparts. To to do so prefix the query parameters with the name of the embedded table. For instance to order the actors in each film: +Embedded tables can be filtered and ordered similarly to their top-level counterparts. To do so, prefix the query parameters with the name of the embedded table. For instance, to order the actors in each film: .. code-block:: http From 174ccadb15590f5c4163ff1c851c44d362eb9f71 Mon Sep 17 00:00:00 2001 From: Joe Nelson Date: Mon, 29 May 2017 18:08:38 -0500 Subject: [PATCH 095/711] Update ecosystem --- intro.rst | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/intro.rst b/intro.rst index 860b59197e..2f3b0e0df7 100644 --- a/intro.rst +++ b/intro.rst @@ -40,17 +40,17 @@ PostgREST has a growing ecosystem of examples, and libraries, experiments, and u Client-Side Libraries --------------------- -* `PierreRochard/angular2-postgrest `_ - JS, Angular 2 * `tomberek/aor-postgrest-client `_ - JS, admin-on-rest * `hugomrdias/postgrest-url `_ - JS, just for generating query URLs * `john-kelly/elm-postgrest `_ - Elm * `mithril.postgrest `_ - JS, Mithril -* `thejettdurham/postgrest-sharp-client `_ - C#, RestSharp * `lewisjared/postgrest-request `_ - JS, SuperAgent * `JarvusInnovations/jarvus-postgrest-apikit `_ - JS, Sencha framework * `davidthewatson/postgrest_python_requests_client `_ - Python * `calebmer/postgrest-client `_ - JS * `clesiemo3/postgrestR `_ - R +* `PierreRochard/postgrest-angular `_ - TypeScript, generate UI from API description +* `thejettdurham/postgrest-sharp-client `_ (needs maintainer) - C#, RestSharp External Notification --------------------- @@ -66,6 +66,7 @@ These are PostgreSQL bridges that propagate LISTEN/NOTIFY to external queues for Example Apps ------------ +* `https://github.com/subzerocloud/postgrest-starter-kit `_ - Boilerplate for new project * `NikolayS/postgrest-google-translate `_ - Calling to external translation service * `CodeforAustralia/heritage-near-me `_ - Elm and PostgREST with PostGIS * `timwis/handsontable-postgrest `_ - An excel-like database table editor @@ -80,6 +81,7 @@ Example Apps * `tyrchen/goodfilm `_ - example film api * `begriffs/postgrest-example `_ - sqitch versioning for API * `SMRxT/postgrest-demo `_ - multi-tenant logging system +* `PierreRochard/postgrest-boilerplate `_ - example auth backend In Production ------------- From f4c6a99adbe3457adb3a3dc84a58462599a80284 Mon Sep 17 00:00:00 2001 From: Leon du Toit Date: Thu, 8 Jun 2017 08:55:42 +0200 Subject: [PATCH 096/711] Address JWT security in docs, related to postgrest issue #842 (#79) --- auth.rst | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/auth.rst b/auth.rst index f953d5aa66..d76ddcfe87 100644 --- a/auth.rst +++ b/auth.rst @@ -228,6 +228,19 @@ Our code requires a database role in the JWT. To add it you need to save the dat } }) +JWT security +~~~~~~~~~~~~ + +There are at least three types of common critiques against using JWT: 1) against the standard itself, 2) against using libraries with known security vulnerabilities, and 3) against using JWT for web sessions. We'll briefly explain each critique, how PostgREST deals with it, and give recommendations for appropriate user action. + +The critique against the `JWT standard `_ is voiced in detail `elsewhere on the web `_. The most relevant part for PostgREST is the so-called :code:`alg=none` issue. Some servers implementing JWT allow clients to choose the algorithm used to sign the JWT. In this case, an attacker could set the algorithm to :code:`none`, remove the need for any signature at all and gain unauthorized access. The current implementation of PostgREST, however, does not allow clients to set the signature algorithm in the HTTP request, making this attack irrelevant. The critique against the standard is that it requires the implementation of the :code:`alg=none` at all. + +Critiques against JWT libraries are only relevant to PostgREST via the library it uses. As mentioned above, not allowing clients to choose the signature algorithm in HTTP requests removes the greatest risk. Another more subtle attack is possible where servers use asymmetric algorithms like RSA for signatures. Once again this is not relevant to PostgREST since it is not supported. Curious readers can find more information in `this article `_. Recommendations about high quality libraries for usage in API clients can be found on `jwt.io `_. + +The last type of critique focuses on the misuse of JWT for maintaining web sessions. The basic recommendation is to `stop using JWT for sessions `_ because most, if not all, solutions to the problems that arise when you do, `do not work `_. The linked articles discuss the problems in depth but the essence of the problem is that JWT is not designed to be secure and stateful units for client-side storage and therefore not suited to session management. + +PostgREST uses JWT mainly for authentication and authorization purposes and encourages users to do the same. For web sessions, using cookies over HTTPS is good enough and well catered for by standard web frameworks. + .. _ssl: SSL From 83e4ad41fe02c0630e4f28e46c4bc351947de5db Mon Sep 17 00:00:00 2001 From: Joe Nelson Date: Sun, 18 Jun 2017 11:49:08 -0500 Subject: [PATCH 097/711] Deprecate {} for resource embedding --- api.rst | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/api.rst b/api.rst index 2df2c91edd..0128e0b229 100644 --- a/api.rst +++ b/api.rst @@ -311,7 +311,7 @@ However because a foreign key constraint exists between Films and Directors, we .. code-block:: http - GET /films?select=title,directors{last_name} HTTP/1.1 + GET /films?select=title,directors(last_name) HTTP/1.1 Which would return @@ -335,11 +335,15 @@ Which would return } ] +.. note:: + + As of PostgREST v4.1, parens :code:`()` are used rather than brackets :code:`{}` for the list of embedded columns. Brackets are still supported, but are deprecated and will be removed in v5. + PostgREST can also detect relations going through join tables. Thus you can request the Actors for Films (which in this case finds the information through Roles). You can also reverse the direction of inclusion, asking for all Directors with each including the list of their Films: .. code-block:: http - GET /directors?select=films{title,year} HTTP/1.1 + GET /directors?select=films(title,year) HTTP/1.1 .. note:: @@ -352,13 +356,13 @@ Embedded tables can be filtered and ordered similarly to their top-level counter .. code-block:: http - GET /films?select=*,actors{*}&actors.order=last_name,first_name HTTP/1.1 + GET /films?select=*,actors(*)&actors.order=last_name,first_name HTTP/1.1 This sorts the list of actors in each film but does *not* change the order of the films themselves. To filter the roles returned with each film: .. code-block:: http - GET /films?select=*,roles{*}&roles.character=in.Chico,Harpo,Groucho HTTP/1.1 + GET /films?select=*,roles(*)&roles.character=in.Chico,Harpo,Groucho HTTP/1.1 Once again, this restricts the roles included to certain characters but does not filter the films in any way. Films without any of those characters would be included along with empty character lists. From 127fbb41d5d31a2eef87fdfb0e37c5edafe9c790 Mon Sep 17 00:00:00 2001 From: Joe Nelson Date: Sun, 18 Jun 2017 12:06:21 -0500 Subject: [PATCH 098/711] Note function volatility in RPC Fixes #64 --- api.rst | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/api.rst b/api.rst index 0128e0b229..52b0e714b9 100644 --- a/api.rst +++ b/api.rst @@ -380,12 +380,14 @@ The PostgREST URL grammar limits the kinds of queries clients can perform. It pr Stored Procedures ================= -Every stored procedure in the API-exposed database schema is accessible under the :code:`/rpc` prefix. The API endpoint supports only POST which executes the function. Such function can perform any operations allowed by PostgreSQL (read data, modify data, and even DDL operations). +Every stored procedure in the API-exposed database schema is accessible under the :code:`/rpc` prefix. The API endpoint supports only POST which executes the function. .. code:: http POST /rpc/function_name HTTP/1.1 +Such functions can perform any operations allowed by PostgreSQL (read data, modify data, and even DDL operations). However procedures in PostgreSQL marked with :code:`stable` or :code:`immutable` `volatility `_ can only read, not modify, the database and PostgREST executes them in a read-only transaction compatible for read-replicas. + Procedures must be used with `named arguments `_. To supply arguments in an API call, include a JSON object in the request payload and each key/value of the object will become an argument. For instance, assume we have created this function in the database. From e8cdd4463b8fc74811d25cd3aa3472eb5b777a02 Mon Sep 17 00:00:00 2001 From: Joe Nelson Date: Sun, 18 Jun 2017 21:52:53 -0500 Subject: [PATCH 099/711] Example of quoted comma in IN operator --- api.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/api.rst b/api.rst index 52b0e714b9..51716b41ff 100644 --- a/api.rst +++ b/api.rst @@ -46,7 +46,7 @@ lt less than neq not equal like LIKE operator (use * in place of %) ilike ILIKE operator (use * in place of %) -in one of a list of values e.g. :code:`?a=in.1,2,3` +in one of a list of values e.g. :code:`?a=in.1,2,3` – also supports commas in quoted strings like :code:`?a=in."hi,there","yes,you"` is checking for exact equality (null,true,false) @@ full-text search using to_tsquery @> contains e.g. :code:`?tags=@>.{example, new}` From cee92cac05fa5f70b627b4c0c292448a53f868d5 Mon Sep 17 00:00:00 2001 From: Joe Nelson Date: Sun, 18 Jun 2017 22:19:46 -0500 Subject: [PATCH 100/711] How to read headers/cookies from a proc --- api.rst | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/api.rst b/api.rst index 51716b41ff..cd10a588e1 100644 --- a/api.rst +++ b/api.rst @@ -435,6 +435,15 @@ By default, a function is executed with the privileges of the user who calls it. We are considering allowing GET requests for functions that are marked non-volatile. Allowing GET is important for HTTP caching. However we still must decide how to pass function parameters since request bodies are not allowed. Also some query string arguments are already reserved for shaping/filtering the output. +Accessing Request Headers/Cookies +--------------------------------- + +Stored procedures can access request headers and cookies by reading GUC variables set by PostgREST per request. They are named :code:`request.header.XYZ` and :code:`request.cookie.XYZ`. For example, to read the value of the Origin request header: + +.. code-block:: postgresql + + SELECT current_setting('request.header.origin', true); + Complex boolean logic --------------------- From 6382b597fad39f4bff404260e0659accefffb92a Mon Sep 17 00:00:00 2001 From: Joe Nelson Date: Sun, 2 Jul 2017 21:17:49 -0500 Subject: [PATCH 101/711] Zeroeth tutorial --- _static/tuts/tut0-request-flow.png | Bin 0 -> 16696 bytes admin.rst | 2 + conf.py | 4 +- index.rst | 5 + install.rst | 2 + tutorials/tut0.rst | 214 +++++++++++++++++++++++++++++ 6 files changed, 225 insertions(+), 2 deletions(-) create mode 100644 _static/tuts/tut0-request-flow.png create mode 100644 tutorials/tut0.rst diff --git a/_static/tuts/tut0-request-flow.png b/_static/tuts/tut0-request-flow.png new file mode 100644 index 0000000000000000000000000000000000000000..24f2986e81ae431f8e0ab1366ca65d6266ffcad9 GIT binary patch literal 16696 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 * `Installer for Windows `_ +.. _build_source: + Build from Source ================= diff --git a/tutorials/tut0.rst b/tutorials/tut0.rst new file mode 100644 index 0000000000..3050953558 --- /dev/null +++ b/tutorials/tut0.rst @@ -0,0 +1,214 @@ +Tutorial 0 - Get it Running +=========================== + +Welcome to PostgREST! In this pre-tutorial we're going to get things running so you can create your first simple API. + +PostgREST is a standalone web server which turns a PostgreSQL database into a RESTful API. It serves an API that is customized based on the structure of the underlying database. + +.. image:: ../_static/tuts/tut0-request-flow.png + +To make an API we'll simply be building a database. All the endpoints and permissions come from database objects like tables, views, roles, and stored procedures. These tutorials will cover a number of common scenarios and how to model them in the database. + +By the end of this tutorial you'll have a working database, PostgREST server, and a simple single-user todo list API. + +Step 1. Relax, we'll help +------------------------- + +As you begin the tutorial, pop open the project `chat room `_ in another tab. There are a nice group of people active in the project and we'll help you out if you get stuck. + +Step 2. Install PostgreSQL +-------------------------- + +You'll need a modern copy of the database running on your system, either natively or in a Docker instance. We require PostgreSQL 9.3 or greater, but recommend at least 9.5 for row-level security features that we'll use in future tutorials. + +If you're already familiar with using PostgreSQL and have it installed on your system you can use the existing installation. For this tutorial we'll describe how to use the database in Docker because database configuration is otherwise too complicated for a simple tutorial. + +If Docker is not installed, you can get it `here `_. Next, let's pull and start the database image: + +.. code-block:: bash + + sudo docker run --name tutorial -p 5432:5432 \ + -e POSTGRES_PASSWORD=mysecretpassword \ + -d postgres + +This will run the Docker instance as a daemon and expose port 5432 to the host system so that it looks like an ordinary PostgreSQL server to the rest of the system. + +Step 3. Install PostgREST +------------------------- + +PostgREST is distributed as a single binary, with versions compiled for major distributions of Linux/BSD/Windows. Visit the `latest release `_ for a list of downloads. In the event that your platform is not among those already pre-built, see :ref:`build_source` for instructions how to build it yourself. Also let us know to add your platform in the next release. + +The pre-built binaries for download are :code:`.tar.xz` compressed files (except Windows which is a zip file). To extract the binary, go into the terminal and run + +.. code-block:: bash + + # download from https://github.com/begriffs/postgrest/releases/latest + + tar xfJ postgrest--.tar.xz + +The result will be a file named simply :code:`postgrest` (or :code:`postgrest.exe` on Windows). At this point try running it with + +.. code-block:: bash + + ./postgrest + +If everything is working correctly it will print out its version and information about configuration. You can continue to run this binary from where you downloaded it, or copy it to a system directory like :code:`/usr/local/bin` on Linux so that you will be able to run it from any directory. + +.. note:: + + PostgREST requires libpq, the PostgreSQL C library, to be installed on your system. Without the library you'll get an error like "error while loading shared libraries: libpq.so.5." Here's how to fix it: + + .. raw:: html + +

+

+ Ubuntu or Debian +
+
sudo apt-get install libpq-dev
+
+
+
+ Fedora, CentOS, or Red Hat +
+
sudo yum install postgresql-libs
+
+
+
+ OS X +
+
brew install postgresql
+
+
+
+ Windows +

It isn't fun. Learn more here.

+

It might be easier to execute PostgREST in its own Docker image as well.

+
+

+ +Step 4. Create Database for API +------------------------------- + +Connect to to SQL console (psql) inside the container. To do so, run this from your command line: + +.. code-block:: bash + + sudo docker exec -it tutorial psql -U postgres + +You should see the psql command prompt: + +:: + + psql (9.6.3) + Type "help" for help. + + postgres=# + +The first thing we'll do is create a `named schema `_ for the database objects which will be exposed in the API. We can choose any name we like, so how about "api." Execute this and the other SQL statements inside the psql prompt you started. + +.. code-block:: postgres + + create schema api; + +Our API will have one endpoint, :code:`/todos`, which will come from a table. + +.. code-block:: postgres + + create table api.todos ( + id serial primary key, + done boolean not null default false, + task text not null, + due timestamptz + ); + + insert into api.todos (task) values + ('finish tutorial 0'), ('pat self on back'); + +Next make a role to use for anonymous web requests. When a request comes in, PostgREST will switch into this role in the database to run queries. + +.. code-block:: postgres + + create role web_anon nologin; + grant web_anon to postgres; + + grant usage on schema api to web_anon; + grant select on api.todos to web_anon; + +The :code:`web_anon` role has permission to access things in the :code:`api` schema, and to read rows in the :code:`todos` table. + +Now quit out of psql; it's time to start the API! + +.. code-block:: psql + + \q + +Step 5. Run PostgREST +--------------------- + +PostgREST uses a configuration file to tell it how to connect to the database. Create a file :code:`tutorial.conf` with this inside: + +.. code-block:: ini + + db-uri = "postgres://postgres:mysecretpassword@localhost/postgres" + db-schema = "api" + db-anon-role = "web_anon" + +The configuration file has other :ref:`options `, but this is all we need. Now run the server: + +.. code-block:: bash + + ./postgrest tutorial.conf + +You should see + +.. code-block:: text + + Listening on port 3000 + Attempting to connect to the database... + Connection successful + +It's now ready to serve web requests. There are many nice graphical API exploration tools you can use, but for this tutorial we'll use :code:`curl` because it's likely to be installed on your system already. Open a new terminal (leaving the one open that PostgREST is running inside). Try doing an HTTP request for the todos. + +.. code-block:: bash + + curl http://localhost:3000/todos + +The API replies: + +.. code-block:: json + + [ + { + "id": 1, + "done": false, + "task": "finish tutorial 0", + "due": null + }, + { + "id": 2, + "done": false, + "task": "pat self on back", + "due": null + } + ] + +With the current role permissions, anonymous requests have read-only access to the :code:`todos` table. If we try to add a new todo we are not able. + +.. code-block:: bash + + curl http://localhost:3000/todos -X POST \ + -H "Content-Type: application/json" \ + -d '{"task": "do bad thing"}' + +Response is 401 Unauthorized: + +.. code-block:: json + + { + "hint": null, + "details": null, + "code": "42501", + "message": "permission denied for relation todos" + } + +There we have it, a basic API on top of the database! In the next tutorials we will see how to extend the example with more sophisticated user access controls, and more tables and queries. From 71da89fdcc057fe6a62591419c3b27b789e2df49 Mon Sep 17 00:00:00 2001 From: Richard Fox Date: Wed, 5 Jul 2017 00:48:54 +0200 Subject: [PATCH 102/711] intro.rst: Correct first example app link (#87) --- intro.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/intro.rst b/intro.rst index 2f3b0e0df7..dbafcfab77 100644 --- a/intro.rst +++ b/intro.rst @@ -66,7 +66,7 @@ These are PostgreSQL bridges that propagate LISTEN/NOTIFY to external queues for Example Apps ------------ -* `https://github.com/subzerocloud/postgrest-starter-kit `_ - Boilerplate for new project +* `subzerocloud/postgrest-starter-kit `_ - Boilerplate for new project * `NikolayS/postgrest-google-translate `_ - Calling to external translation service * `CodeforAustralia/heritage-near-me `_ - Elm and PostgREST with PostGIS * `timwis/handsontable-postgrest `_ - An excel-like database table editor From cb4c54074a6915e33207c4fa6daca1554949912b Mon Sep 17 00:00:00 2001 From: Joe Nelson Date: Tue, 4 Jul 2017 22:25:16 -0500 Subject: [PATCH 103/711] Tutorial 1 --- _static/tuts/tut1-jwt-io.png | Bin 0 -> 60572 bytes index.rst | 1 + tutorials/tut0.rst | 2 + tutorials/tut1.rst | 245 +++++++++++++++++++++++++++++++++++ 4 files changed, 248 insertions(+) create mode 100644 _static/tuts/tut1-jwt-io.png create mode 100644 tutorials/tut1.rst diff --git a/_static/tuts/tut1-jwt-io.png b/_static/tuts/tut1-jwt-io.png new file mode 100644 index 0000000000000000000000000000000000000000..488b87f1034660f5325c69c1d657427416c50b49 GIT binary patch literal 60572 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 provides an easy way to generate a secure password. If you have it installed, run + + .. code-block:: bash + + openssl rand -base64 32 + +Open the :code:`postgrest.conf` (created in the previous tutorial) and add a line with the password: + +.. code-block:: ini + + # add this line to postgrest.conf + + jwt-secret = "" + +If the PostgREST server is still running from the previous tutorial, restart it to load the updated configuration file. + +Step 3. Sign a Token +-------------------- + +Ordinarily your own code in the database or in another server will create and sign authentication tokens, but for this tutorial we will make one "by hand." Go to `jwt.io `_ and fill in the fields like this: + +.. figure:: ../_static/tuts/tut1-jwt-io.png + :alt: jwt.io interface + + How to create a token at https://jwt.io + +Remember to fill in the password you generated rather than the word :code:`secret`. After you have filled in the password and payload, the encoded data on the left will update. Copy the encoded token. + +.. note:: + + While the token may look well obscured, it's easy to reverse engineer the payload. The token is merely signed, not encrypted, so don't put things inside that you don't want a determined client to see. + +Step 4. Make a Request +---------------------- + +Back in the terminal, let's use :code:`curl` to add a todo. The request will include an HTTP header containing the authentication token. + +.. code-block:: bash + + export TOKEN="" + + curl http://localhost:3000/todos -X POST \ + -H "Authorization: Bearer $TOKEN" \ + -H "Content-Type: application/json" \ + -d '{"task": "learn how to auth"}' + +And now we have completed all three items in our todo list, so let's set :code:`done` to true for them all with a :code:`PATCH` request. + +.. code-block:: bash + + curl http://localhost:3000/todos -X PATCH \ + -H "Authorization: Bearer $TOKEN" \ + -H "Content-Type: application/json" \ + -d '{"done": true}' + +A request for the todos shows three of them, and all completed. + +.. code-block:: bash + + curl http://localhost:3000/todos + +.. code-block:: json + + [ + { + "id": 1, + "done": true, + "task": "finish tutorial 0", + "due": null + }, + { + "id": 2, + "done": true, + "task": "pat self on back", + "due": null + }, + { + "id": 3, + "done": true, + "task": "learn how to auth", + "due": null + } + ] + +Step 4. Add Expiration +---------------------- + +Currently our authentication token is valid for all eternity. As long as the server continues using the same password to verify the JWT signature it will honor this token and use the :code:`todo_user` role to perform requests including it. + +It's better policy to include an expiration timestamp for tokens using the :code:`exp` claim. This is one of two JWT claims that PostgREST treats specially. + ++--------------+----------------------------------------------------------------+ +| Claim | Interpretation | ++==============+================================================================+ +| :code:`role` | The database role under which to execute SQL for API request | ++--------------+----------------------------------------------------------------+ +| :code:`exp` | Expiration timestamp for token, expressed in "Unix epoch time" | ++--------------+----------------------------------------------------------------+ + +.. note:: + + Epoch time is defined as the number of seconds that have elapsed since 00:00:00 Coordinated Universal Time (UTC), January 1st 1970, minus the number of leap seconds that have taken place since then. + +To observe expiration in action, we'll add an :code:`exp` claim of five minutes in the future to our previous token. First find the epoch value of five minutes from now. In psql run this: + +.. code-block:: postgres + + select extract(epoch from now() + '5 minutes'::interval) :: integer; + +Go back to jwt.io and change the payload to + +.. code-block:: json + + { + "role": "todo_user", + "exp": "" + } + +Copy the updated token as before, and save it as a new environment variable. + +.. code-block:: bash + + export NEW_TOKEN="" + +Try issuing this request in curl before and after the expiration time: + +.. code-block:: bash + + curl http://localhost:3000/todos \ + -H "Authorization: Bearer $NEW_TOKEN" + +After expiration, the API returns HTTP 401 Unauthorized: + +.. code-block:: json + + {"message":"JWT expired"} + +Bonus Topic: Immediate Revocation +--------------------------------- + +Even with token expiration there are times when you may want to immediately revoke access for a specific token. For instance, suppose you learn that a disgruntled employee is up to no good and his token is still valid. + +To revoke a specific token we need a way to tell it apart from others. Let's add a custom :code:`email` claim that matches the email of the client issued the token. + +Go ahead and make a new token with the payload + +.. code-block:: json + + { + "role": "todo_user", + "email": "disgruntled@mycompany.com" + } + +Save it to an environment variable: + +.. code-block:: bash + + export WAYWARD_TOKEN="" + +PostgREST allows us to specify a stored procedure to run during attempted authentication. The function can do whatever it likes, including raising an exception to terminate the request. + +First make a new schema and add the function: + +.. code-block:: plpgsql + + create schema auth; + grant usage on schema auth to web_anon, todo_user; + + create or replace function auth.check_token() returns void + language plpgsql + as $$ + begin + if current_setting('request.jwt.claim.email', true) = + 'disgruntled@mycompany.com' then + raise insufficient_privilege + using hint = 'Nope, we are on to you'; + end if; + end + $$; + +Next update :code:`tutorial.conf` and specify the new function: + +.. code-block:: ini + + # add this line to postgrest.conf + + pre-request = "auth.check_token" + +Restart PostgREST for the change to take effect. Next try making a request with our original token and then with the revoked one. + +.. code-block:: bash + + # this request still works + + curl http://localhost:3000/todos \ + -H "Authorization: Bearer $TOKEN" + + # this one is rejected + + curl http://localhost:3000/todos \ + -H "Authorization: Bearer $WAYWARD_TOKEN" + +The server responds with 403 Forbidden: + +.. code-block:: json + + { + "hint": "Nope, we are on to you", + "details": null, + "code": "42501", + "message": "insufficient_privilege" + } From aa6e3afc0e49dcf87aa538a23dcbca8aaf6aa4ef Mon Sep 17 00:00:00 2001 From: Joe Nelson Date: Tue, 4 Jul 2017 22:46:03 -0500 Subject: [PATCH 104/711] Small edit and correct config file name --- tutorials/tut1.rst | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tutorials/tut1.rst b/tutorials/tut1.rst index 91c8976e16..6ea26786cf 100644 --- a/tutorials/tut1.rst +++ b/tutorials/tut1.rst @@ -37,11 +37,11 @@ Let's create a password and provide it to PostgREST. Think of a nice long one, o openssl rand -base64 32 -Open the :code:`postgrest.conf` (created in the previous tutorial) and add a line with the password: +Open the :code:`tutorial.conf` (created in the previous tutorial) and add a line with the password: .. code-block:: ini - # add this line to postgrest.conf + # add this line to tutorial.conf jwt-secret = "" @@ -118,7 +118,7 @@ A request for the todos shows three of them, and all completed. Step 4. Add Expiration ---------------------- -Currently our authentication token is valid for all eternity. As long as the server continues using the same password to verify the JWT signature it will honor this token and use the :code:`todo_user` role to perform requests including it. +Currently our authentication token is valid for all eternity. The server, as long as it continues using the same JWT password, will honor the token. It's better policy to include an expiration timestamp for tokens using the :code:`exp` claim. This is one of two JWT claims that PostgREST treats specially. @@ -215,7 +215,7 @@ Next update :code:`tutorial.conf` and specify the new function: .. code-block:: ini - # add this line to postgrest.conf + # add this line to tutorial.conf pre-request = "auth.check_token" From 49a62772c077b61aa8f804cc4c24cde67ac70319 Mon Sep 17 00:00:00 2001 From: Chris Stryczynski Date: Sat, 8 Jul 2017 06:14:30 +0100 Subject: [PATCH 105/711] Single quotes give an error (#88) of postgrest: ParseError "postgrest.config" "endOfInput" --- admin.rst | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/admin.rst b/admin.rst index ae7b1ab209..2e3e7ba23a 100644 --- a/admin.rst +++ b/admin.rst @@ -239,19 +239,19 @@ Once you've verified that requests are as you expect, you can get more informati .. code:: sql # send logs where the collector can access them - log_destination = 'stderr' + log_destination = "stderr" # collect stderr output to log files logging_collector = on # save logs in pg_log/ under the pg data directory - log_directory = 'pg_log' + log_directory = "pg_log" # (optional) new log file per day - log_filename = 'postgresql-%Y-%m-%d.log' + log_filename = "postgresql-%Y-%m-%d.log" # log every kind of SQL statement - log_statement = 'all' + log_statement = "all" Restart the database and watch the log file in real-time to understand how HTTP requests are being translated into SQL commands. From cdf5dece651a057f91134a2584b7020db2cb9c12 Mon Sep 17 00:00:00 2001 From: Joe Nelson Date: Tue, 18 Jul 2017 22:32:13 -0500 Subject: [PATCH 106/711] Include link to next tutorial --- tutorials/tut0.rst | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tutorials/tut0.rst b/tutorials/tut0.rst index a762bc7d1c..6348f8e187 100644 --- a/tutorials/tut0.rst +++ b/tutorials/tut0.rst @@ -214,3 +214,5 @@ Response is 401 Unauthorized: } There we have it, a basic API on top of the database! In the next tutorials we will see how to extend the example with more sophisticated user access controls, and more tables and queries. + +Now that you have PostgREST running, try the next tutorial, :ref:`tut1` From 4be05649f4ca45954ca28f04d8c96b8d4be5455c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Steve=20Ch=C3=A1vez?= Date: Thu, 20 Jul 2017 00:06:57 -0500 Subject: [PATCH 107/711] Add documentation for binary output in rpc, Fix #84 (#92) --- api.rst | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/api.rst b/api.rst index cd10a588e1..b785dc59f4 100644 --- a/api.rst +++ b/api.rst @@ -278,6 +278,29 @@ and select a single column :code:`?select=bin_data`. GET /items?select=bin_data&id=eq.1 HTTP/1.1 Accept: application/octet-stream +You can also request binary output when calling stored procedures and since they can return a scalar value you are not forced to use :code:`select` +for this case. + +.. code:: sql + + CREATE FUNCTION closest_point(..) RETURNS bytea .. + +.. code:: http + + POST /rpc/closest_point HTTP/1.1 + Accept: application/octet-stream + +If the stored procedure returns non-scalar values, you need to do a :code:`select` in the same way as for GET binary output. + +.. code:: sql + + CREATE FUNCTION overlapping_regions(..) RETURNS SETOF TABLE(geom_twkb bytea, ..) .. + +.. code:: http + + POST /rpc/overlapping_regions?select=geom_twkb HTTP/1.1 + Accept: application/octet-stream + .. note:: If more than one row would be returned the binary results will be concatenated with no delimiter. From 84bfa2d9ca04b29b3019aa47b09348928f8881ba Mon Sep 17 00:00:00 2001 From: Priyank Purohit Date: Sat, 5 Aug 2017 21:42:31 -0400 Subject: [PATCH 108/711] Updated docs for complex logic API capability (#94) --- api.rst | 43 ++++++++++++++++--------------------------- 1 file changed, 16 insertions(+), 27 deletions(-) diff --git a/api.rst b/api.rst index b785dc59f4..6033ba46c3 100644 --- a/api.rst +++ b/api.rst @@ -27,12 +27,24 @@ You can filter result rows by adding conditions on columns, each condition a que GET /people?age=lt.13 HTTP/1.1 -Adding multiple parameters conjoins the conditions: +Multiple parameters can be logically conjoined by: .. code-block:: http GET /people?age=gte.18&student=is.true HTTP/1.1 +Multiple parameters can be logically disjoined by: + +.. code-block:: http + + GET /people?or=(age.gte.14,age.lte.18) HTTP/1.1 + +Complex logic can also be applied: + +.. code-block:: http + + GET /people?and=(grade.gte.90,student.is.true,or(age.gte.14,age.is.null)) HTTP/1.1 + These operators are available: ============ ============================================= @@ -55,9 +67,9 @@ not negates another operator, see below ============ ============================================= -To negate any operator, prefix it with :code:`not` like :code:`?a=not.eq.2`. +To negate any operator, prefix it with :code:`not` like :code:`?a=not.eq.2` or :code:`?not.and=(a.gte.0,a.lte.100)` . -For more complicated filters (such as those involving disjunctions) you will have to create a new view in the database, or use a stored procedure. For instance, here's a view to show "today's stories" including possibly older pinned stories: +For more complicated filters you will have to create a new view in the database, or use a stored procedure. For instance, here's a view to show "today's stories" including possibly older pinned stories: .. code-block:: postgresql @@ -74,10 +86,6 @@ The view will provide a new endpoint: GET /fresh_stories HTTP/1.1 -.. note:: - - We're working to extend the PostgREST query grammar to allow more complicated boolean logic, while continuing to prevent performance problems from arbitrary client queries. - .. _v_filter: Vertical Filtering (Columns) @@ -395,7 +403,7 @@ Custom Queries The PostgREST URL grammar limits the kinds of queries clients can perform. It prevents arbitrary, potentially poorly constructed and slow client queries. It's good for quality of service, but means database administrators must create custom views and stored procedures to provide richer endpoints. The most common causes for custom endpoints are -* Table unions and OR-conditions in the where clause +* Table unions * More complicated joins than those provided by `Resource Embedding`_ * Geospatial queries that require an argument, like "points near (lat,lon)" * More sophisticated full-text search than a simple use of the :sql:`@@` filter @@ -467,25 +475,6 @@ Stored procedures can access request headers and cookies by reading GUC variable SELECT current_setting('request.header.origin', true); -Complex boolean logic ---------------------- - -For complex boolean logic you can use stored procedures, an example: - -.. code-block:: postgresql - - CREATE FUNCTION key_customers(country TEXT, company TEXT, salary FLOAT) RETURNS SETOF customers AS $$ - SELECT * FROM customers WHERE (country = $1 AND company = $2) OR salary = $3; - $$ LANGUAGE SQL; - -Then you can query by doing: - -.. code-block:: http - - POST /rpc/key_customers HTTP/1.1 - - { "country": "Germany", "company": "Volkswagen", salary": 120000.00 } - Raising Errors -------------- From aedaca129045015e0519544fa3e2d9204018eb1c Mon Sep 17 00:00:00 2001 From: Russell Davies Date: Sun, 13 Aug 2017 17:39:18 +0100 Subject: [PATCH 109/711] Clarify resource embedding constraints (#97) --- api.rst | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/api.rst b/api.rst index 6033ba46c3..6c59acab27 100644 --- a/api.rst +++ b/api.rst @@ -342,7 +342,7 @@ However because a foreign key constraint exists between Films and Directors, we .. code-block:: http - GET /films?select=title,directors(last_name) HTTP/1.1 + GET /films?select=title,directors(id,last_name) HTTP/1.1 Which would return @@ -351,21 +351,36 @@ Which would return [ { "title": "Workers Leaving The Lumière Factory In Lyon", "directors": { + "id": 2, "last_name": "Lumière" } }, { "title": "The Dickson Experimental Sound Film", "directors": { + "id": 1, "last_name": "Dickson" } }, { "title": "The Haunted Castle", "directors": { + "id": 3, "last_name": "Méliès" } } ] +The primary key of the table of the resource being embedded must be specified, +either explicitly, like in the example above, or implicitly through a wildcard. + +In this example, since the relationship is a forward relationship, there is +only one director associated with a film. As the table name is plural it might +be preferable for it to be singular instead. An table name alias can accomplish +this: + +.. code-block:: http + + GET /films?select=title,director:directors(id,last_name) HTTP/1.1 + .. note:: As of PostgREST v4.1, parens :code:`()` are used rather than brackets :code:`{}` for the list of embedded columns. Brackets are still supported, but are deprecated and will be removed in v5. @@ -376,6 +391,9 @@ PostgREST can also detect relations going through join tables. Thus you can requ GET /directors?select=films(title,year) HTTP/1.1 +Here it is not necessary to specify the table's primary key of the embedded +resource. + .. note:: Whenever foreign key relations change in the database schema you must refresh PostgREST's schema cache to allow resource embedding to work properly. See the section :ref:`schema_reloading`. From 66ce8e8b183292b4ea344da943da9beb34b77836 Mon Sep 17 00:00:00 2001 From: Joe Nelson Date: Sun, 20 Aug 2017 14:15:59 -0500 Subject: [PATCH 110/711] Exp claim must be an int, not a string Pointed out by @nileshtrivedi --- tutorials/tut1.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tutorials/tut1.rst b/tutorials/tut1.rst index 6ea26786cf..983ac150f9 100644 --- a/tutorials/tut1.rst +++ b/tutorials/tut1.rst @@ -146,7 +146,7 @@ Go back to jwt.io and change the payload to { "role": "todo_user", - "exp": "" + "exp": } Copy the updated token as before, and save it as a new environment variable. From 3fdf6acc45ed9eb3c44eebc3dba3a1d46aa5d43c Mon Sep 17 00:00:00 2001 From: Russell Davies Date: Sun, 20 Aug 2017 20:49:27 +0100 Subject: [PATCH 111/711] Range operators and deprecation of symbol operators (#98) --- api.rst | 58 ++++++++++++++++++++++++++++++++++++--------------------- 1 file changed, 37 insertions(+), 21 deletions(-) diff --git a/api.rst b/api.rst index 6c59acab27..5b45ab3c80 100644 --- a/api.rst +++ b/api.rst @@ -47,25 +47,41 @@ Complex logic can also be applied: These operators are available: -============ ============================================= -abbreviation meaning -============ ============================================= -eq equals -gte greater than or equal -gt greater than -lte less than or equal -lt less than -neq not equal -like LIKE operator (use * in place of %) -ilike ILIKE operator (use * in place of %) -in one of a list of values e.g. :code:`?a=in.1,2,3` – also supports commas in quoted strings like :code:`?a=in."hi,there","yes,you"` -is checking for exact equality (null,true,false) -@@ full-text search using to_tsquery -@> contains e.g. :code:`?tags=@>.{example, new}` -<@ contained in e.g. :code:`?values=<@{1,2,3}` -not negates another operator, see below -============ ============================================= +============ =============================================== =================== +Abbreviation Meaning Postgres Equivalent +============ =============================================== =================== +eq equals :code:`=` +gt greater than :code:`>` +gte greater than or equal :code:`>=` +lt less than :code:`<` +lte less than or equal :code:`<=` +neq not equal :code:`<>` or :code:`!=` +like LIKE operator (use * in place of %) :code:`LIKE` +ilike ILIKE operator (use * in place of %) :code:`ILIKE` +in one of a list of values e.g. :code:`IN` + :code:`?a=in.1,2,3` – also supports commas + in quoted strings like + :code:`?a=in."hi,there","yes,you"` +is checking for exact equality (null,true,false) :code:`IS` +fts full-text search using to_tsquery :code:`@@` +cs contains e.g. :code:`?tags=cs.{example, new}` :code:`@>` +cd contained in e.g. :code:`?values=cd.{1,2,3}` :code:`<@` +ov overlap (have points in common), :code:`&&` + e.g. :code:`?period=ov.[2017-01-01,2017-06-30]` +sl strictly left of, e.g. :code:`?range=sl.(1,10)` :code:`<<` +sr strictly right of :code:`>>` +nxr does not extend to the right of, :code:`&<` + e.g. :code:`?range=nxr.(1,10)` +nxl does not extend to the left of :code:`&>` +adj is adjacent to, e.g. :code:`?range=adj.(1,10)` :code:`-|-` +not negates another operator, see below :code:`NOT` +============ =============================================== =================== +.. note:: + + As of PostgREST v0.4.3.0, the symbol operators :code:`@@, @>, <@` have been + deprecated in lieu of their mnemonic equivalents. They are still supported + but will be removed in v0.5.0.0. To negate any operator, prefix it with :code:`not` like :code:`?a=not.eq.2` or :code:`?not.and=(a.gte.0,a.lte.100)` . @@ -125,7 +141,7 @@ A full-text search on the computed column: .. code-block:: http - GET /people?full_name=@@.Beckett HTTP/1.1 + GET /people?full_name=fts.Beckett HTTP/1.1 As mentioned, computed columns do not appear in the output by default. However you can include them by listing them in the vertical filtering :code:`select` param: @@ -383,7 +399,7 @@ this: .. note:: - As of PostgREST v4.1, parens :code:`()` are used rather than brackets :code:`{}` for the list of embedded columns. Brackets are still supported, but are deprecated and will be removed in v5. + As of PostgREST v0.4.1.0, parens :code:`()` are used rather than brackets :code:`{}` for the list of embedded columns. Brackets are still supported, but are deprecated and will be removed in v0.5.0.0. PostgREST can also detect relations going through join tables. Thus you can request the Actors for Films (which in this case finds the information through Roles). You can also reverse the direction of inclusion, asking for all Directors with each including the list of their Films: @@ -424,7 +440,7 @@ The PostgREST URL grammar limits the kinds of queries clients can perform. It pr * Table unions * More complicated joins than those provided by `Resource Embedding`_ * Geospatial queries that require an argument, like "points near (lat,lon)" -* More sophisticated full-text search than a simple use of the :sql:`@@` filter +* More sophisticated full-text search than a simple use of the :sql:`fts` filter Stored Procedures ================= From 4b1e594270670bb2ebc292b05a33a7b0c0592fe8 Mon Sep 17 00:00:00 2001 From: Will O'Brien Date: Tue, 5 Sep 2017 23:25:43 -0400 Subject: [PATCH 112/711] Add notice about reverting OIDC default (#99) --- auth.rst | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/auth.rst b/auth.rst index d76ddcfe87..52e490db31 100644 --- a/auth.rst +++ b/auth.rst @@ -204,6 +204,16 @@ An external service like `Auth0 `_ can do the hard work tran To use Auth0, copy its client secret into your PostgREST configuration file as the :code:`jwt-secret`. (Old-style Auth0 secrets are Base64 encoded. For these secrets set :code:`secret-is-base64` to :code:`true`, or just refresh the Auth0 secret.) You can find the secret in the client settings of the Auth0 management console. +.. note:: + + Make sure OIDC-conformant is toggled off. + + A recent Auth0 change sets it on by default. Turn it `off` here: + + Clients > `Your App` > Settings > Show Advanced Settings > OAuth > OIDC Conformant + + Ensure also that your client application does not pass in any `audience` configuration. + Our code requires a database role in the JWT. To add it you need to save the database role in Auth0 `app metadata `_. Then, you will need to write a rule that will extract the role from the user metadata and include a :code:`role` claim in the payload of our user object. Afterwards, in your Auth0Lock code, include the :code:`role` claim in your `scope param `_. .. code:: javascript From 973e7cb90ee4014778a15396b5b210d8804a7b55 Mon Sep 17 00:00:00 2001 From: Joe Nelson Date: Sat, 9 Sep 2017 15:40:49 -0500 Subject: [PATCH 113/711] How to use docker --- install.rst | 90 ++++++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 71 insertions(+), 19 deletions(-) diff --git a/install.rst b/install.rst index 1004963141..ebd7beb028 100644 --- a/install.rst +++ b/install.rst @@ -16,38 +16,90 @@ The release page has precompiled binaries for Mac OS X, Windows, and several Lin # You should see a usage help message -Homebrew -======== +PostgreSQL dependency +===================== -You can use the Homebrew package manager to install PostgREST on Mac +To use PostgREST you will need an underlying database (PostgreSQL version 9.3 or greater is required). You can use something like Amazon `RDS `_ but installing your own locally is cheaper and more convenient for development. -.. code-block:: bash +* `Instructions for OS X `_ +* `Instructions for Ubuntu 14.04 `_ +* `Installer for Windows `_ - # Ensure brew is up to date - brew update +Docker +====== - # Check for any problems with brew's setup - brew doctor +The official PostgREST Docker image consults an internal :code:`/etc/postgrest.conf` file. To customize this file you can either mount a replacement configuration file into the container, or use environment variables. The environment variables will be interpolated into the default config file. - # Install the postgrest package - brew install postgrest +These variables match the options shown in our :ref:`configuration` section, except they are capitalized, have a prefix, and use underscores. To get a list of the available environment variables, run this: + +.. code-block:: bash -This will automatically install PostgreSQL as a dependency. The process tends to take up to 15 minutes to install the package and its dependencies. + docker inspect -f "{{.Config.Env}}" postgrest/postgrest -After installation completes, the tool is added to your $PATH and can be used from anywhere with: +There are two ways to run the PostgREST container: with an existing external database, or through docker-compose. + +Containerized PostgREST with native PostgreSQL +---------------------------------------------- + +The first way to run PostgREST in Docker is to connect it to an existing native database on the host. .. code-block:: bash - postgrest --help + # Pull the official image + docker pull postgrest/postgrest -PostgreSQL dependency -===================== + # Run the server + docker run --rm --net=host -p 3000:3000 \ + -e PGRST_DB_URI="postgres://postgres@localhost/postgres" \ + -e PGRST_DB_ANON_ROLE="postgres" \ + postgrest/postgrest -To use PostgREST you will need an underlying database (PostgreSQL version 9.3 or greater is required). You can use something like Amazon `RDS `_ but installing your own locally is cheaper and more convenient for development. +The database connection string above is just an example. Adjust the role and password as necessary. You may need to edit PostgreSQL's :code:`pg_hba.conf` to grant the user local login access. -* `Instructions for OS X `_ -* `Instructions for Ubuntu 14.04 `_ -* `Installer for Windows `_ +.. note:: + + Docker on Mac does not support the :code:`--net=host` flag. Instead you'll need to create an IP address alias to the host. Requests for the IP address from inside the container are unable to resolve and fall back to resolution by the host. + + .. code-block:: bash + + sudo ifconfig lo0 10.0.0.10 alias + + You should then use 10.0.0.10 as the host in your database connection string. Also remember to include the IP address in the :code:`listen_address` within postgresql.conf. For instance: + + .. code-block:: bash + + listen_addresses = 'localhost,10.0.0.10' + +Containerized PostgREST *and* db with docker-compose +---------------------------------------------------- + +To avoid having to install the database at all, you can run both it and the server in containers and link them together with docker-compose. Use this configuration: + +.. code-block:: yaml + + # docker-compose.yml + + server: + image: postgrest/postgrest + ports: + - "3000:3000" + links: + - db:db + environment: + PGRST_DB_URI: postgres://app_user:password@db:5432/app_db + PGRST_DB_SCHEMA: public + PGRST_DB_ANON_ROLE: app_user + + db: + image: postgres + ports: + - "5432:5432" + environment: + POSTGRES_DB: app_db + POSTGRES_USER: app_user + POSTGRES_PASSWORD: password + +Go into the directory where you saved this file and run :code:`docker-compose up`. You will see the logs of both the database and PostgREST, and be able to access the latter on port 3000. .. _build_source: From 5fc48057f8c4d01f520bb4009051f8aa267cda15 Mon Sep 17 00:00:00 2001 From: Joe Nelson Date: Sat, 9 Sep 2017 15:41:05 -0500 Subject: [PATCH 114/711] Actually pg 9.5 is needed, not 9.3 --- install.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install.rst b/install.rst index ebd7beb028..b3a4ca428a 100644 --- a/install.rst +++ b/install.rst @@ -19,7 +19,7 @@ The release page has precompiled binaries for Mac OS X, Windows, and several Lin PostgreSQL dependency ===================== -To use PostgREST you will need an underlying database (PostgreSQL version 9.3 or greater is required). You can use something like Amazon `RDS `_ but installing your own locally is cheaper and more convenient for development. +To use PostgREST you will need an underlying database (PostgreSQL version 9.5 or greater is required). You can use something like Amazon `RDS `_ but installing your own locally is cheaper and more convenient for development. * `Instructions for OS X `_ * `Instructions for Ubuntu 14.04 `_ From e4741d43e488e5c8d96750671f7c55d8f6b4dc59 Mon Sep 17 00:00:00 2001 From: Joe Nelson Date: Sat, 9 Sep 2017 19:27:51 -0500 Subject: [PATCH 115/711] Note for windows users --- _static/win-err-dialog.png | Bin 0 -> 27093 bytes install.rst | 9 +++++++++ 2 files changed, 9 insertions(+) create mode 100644 _static/win-err-dialog.png diff --git a/_static/win-err-dialog.png b/_static/win-err-dialog.png new file mode 100644 index 0000000000000000000000000000000000000000..e60a71c4507e157076b36b550c7e83f0242249f2 GIT binary patch literal 27093 zcmV)^K!CrAP)004R>004l5008;`004mK004C`008P>0026e000+ooVrmw00006 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 a=;{>o|2A;5en5jW0BES_q8gQKBmM_-;3@h5 literal 0 HcmV?d00001 diff --git a/install.rst b/install.rst index b3a4ca428a..7594ebc301 100644 --- a/install.rst +++ b/install.rst @@ -16,6 +16,15 @@ The release page has precompiled binaries for Mac OS X, Windows, and several Lin # You should see a usage help message +.. note:: + + If you see a dialog box like this on Windows, it may be that the :code:`pg_config` program is not in your system path. + + .. image:: _static/win-err-dialog.png + + It usually lives in :code:`C:\Program Files\PostgreSQL\\bin`. See this `article `_ about how to modify the system path. + + PostgreSQL dependency ===================== From 0da8cb230fd5b62dcc26334ace3251c7e7decb62 Mon Sep 17 00:00:00 2001 From: Joe Nelson Date: Sat, 9 Sep 2017 19:49:42 -0500 Subject: [PATCH 116/711] Proper error code for failed content negotiation Fixes #95 --- api.rst | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/api.rst b/api.rst index 5b45ab3c80..9b800d016d 100644 --- a/api.rst +++ b/api.rst @@ -283,11 +283,18 @@ This returns { "id": 1 } -When a singular response is requested but no entries are found, the server responds with an empty body and 404 status code rather than the usual empty array and 200 status. +When a singular response is requested but no entries are found, the server responds with an error message and 406 Not Acceptable status code rather than the usual empty array and 200 status: + +.. code-block:: json + + { + "message": "JSON object requested, multiple (or no) rows returned", + "details": "Results contain 0 rows, application/vnd.pgrst.object+json requires 1 row" + } .. note:: - Many APIs distinguish plural and singular resources using a special nested URL convention e.g. `/stories` vs `/stories/1`. Why do we use `/stories?id=eq.1`? The answer is because a singlular resource is (for us) a row determined by a primary key, and primary keys can be compound (meaning defined across more than one column). The more familiar nested urls consider only a degenerate case of simple and overwhelmingly numeric primary keys. These so-called artificial keys are often introduced automatically by Object Relational Mapping libraries. + Many APIs distinguish plural and singular resources using a special nested URL convention e.g. `/stories` vs `/stories/1`. Why do we use `/stories?id=eq.1`? The answer is because a singular resource is (for us) a row determined by a primary key, and primary keys can be compound (meaning defined across more than one column). The more familiar nested urls consider only a degenerate case of simple and overwhelmingly numeric primary keys. These so-called artificial keys are often introduced automatically by Object Relational Mapping libraries. Admittedly PostgREST could detect when there is an equality condition holding on all columns constituting the primary key and automatically convert to singular. However this could lead to a surprising change of format that breaks unwary client code just by filtering on an extra column. Instead we allow manually specifying singular vs plural to decouple that choice from the URL format. From 5185a9279824122883d21775bb157ae81a668043 Mon Sep 17 00:00:00 2001 From: Joe Nelson Date: Sat, 9 Sep 2017 20:21:46 -0500 Subject: [PATCH 117/711] Move config section to install page Document special host binding addresses Fixes #83 --- admin.rst | 102 ------------------------------------------------ conf.py | 4 +- install.rst | 110 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 112 insertions(+), 104 deletions(-) diff --git a/admin.rst b/admin.rst index 2e3e7ba23a..f4b291bd1b 100644 --- a/admin.rst +++ b/admin.rst @@ -1,105 +1,3 @@ -.. _configuration: - -Configuration -============= - -The PostgREST server reads a configuration file to determine information about the database and how to serve client requests. There is no predefined location for this file, you must specify the file path as the one and only argument to the server: - -.. code:: bash - - postgrest /path/to/postgrest.conf - -The file must contain a set of key value pairs. At minimum you must include these keys: - -.. code:: - - # postgrest.conf - - # The standard connection URI format, documented at - # https://www.postgresql.org/docs/current/static/libpq-connect.html#AEN45347 - db-uri = "postgres://user:pass@host:5432/dbname" - - # The name of which database schema to expose to REST clients - db-schema = "api" - - # The database role to use when no client authentication is provided. - # Can (and probably should) differ from user in db-uri - db-anon-role = "anon" - -The user specified in the db-uri is also known as the authenticator role. For more information about the anonymous vs authenticator roles see the :ref:`roles`. - -Here is the full list of configuration parameters. - -================ ====== ======= ======== -Name Type Default Required -================ ====== ======= ======== -db-uri String Y -db-schema String Y -db-anon-role String Y -db-pool Int 10 -server-host String \*4 -server-port Int 3000 -server-proxy-uri String -jwt-secret String -secret-is-base64 Bool False -max-rows Int ∞ -pre-request String -================ ====== ======= ======== - -db-uri - The standard connection PostgreSQL `URI format `_. Symbols and unusual characters in the password or other fields should be percent encoded to avoid a parse error. On older systems like Centos 6, with older versions of libpq, a different db-uri syntax has to be used. In this case the URI is a string of space separated key-value pairs (key=value), so the example above would be :code:`"host=host user=user port=5432 dbname=dbname password=pass"`. Also allows connections over Unix sockets for higher performance. -db-schema - The database schema to expose to REST clients. Tables, views and stored procedures in this schema will get API endpoints. -db-anon-role - The database role to use when executing commands on behalf of unauthenticated clients. -db-pool - Number of connections to keep open in PostgREST's database pool. Having enough here for the maximum expected simultaneous client connections can improve performance. Note it's pointless to set this higher than the :code:`max_connections` GUC in your database. -server-host - Where to bind the PostgREST web server. -server-port - The port to bind the web server. -server-proxy-uri - Overrides the base URL used within the OpenAPI self-documentation hosted at the API root path. Use a complete URI syntax :code:`scheme:[//[user:password@]host[:port]][/]path[?query][#fragment]`. Ex. :code:`https://postgrest.com` - -.. code:: json - - { - "swagger": "2.0", - "info": { - "version": "0.4.0.0", - "title": "PostgREST API", - "description": "This is a dynamic API generated by PostgREST" - }, - "host": "postgrest.com:443", - "basePath": "/", - "schemes": [ - "https" - ] - } - -jwt-secret - The secret used to decode JWT tokens clients provide for authentication. If this parameter is not specified then PostgREST refuses authentication requests. Choosing a value for this parameter beginning with the at sign such as :code:`@filename` loads the secret out of an external file. This is useful for automating deployments. Note that any binary secrets must be base64 encoded. -secret-is-base64 - When this is set to :code:`true`, the value derived from :code:`jwt-secret` will be treated as a base64 encoded secret. -max-rows - A hard limit to the number of rows PostgREST will fetch from a view, table, or stored procedure. Limits payload size for accidental or malicious requests. -pre-request - A schema-qualified stored procedure name to call right after switching roles for a client request. This provides an opportunity to modify SQL variables or raise an exception to prevent the request from completing. - -Running the Server ------------------- - -PostgREST outputs basic request logging to stdout. When running it in an SSH session you must detach it from stdout or it will be terminated when the session closes. The easiest technique is redirecting the output to a logfile or to the syslog: - -.. code-block:: bash - - ssh foo@example.com \ - 'postgrest foo.conf /var/log/postgrest.log 2>&1 &' - - # another option is to pipe the output into "logger -t postgrest" - -(Avoid :code:`nohup postgrest` because the HUP signal is used for manual :ref:`schema_reloading`.) - Hardening PostgREST =================== diff --git a/conf.py b/conf.py index 415ce36c25..394a145849 100644 --- a/conf.py +++ b/conf.py @@ -54,9 +54,9 @@ # built documents. # # The short X.Y version. -version = u'4.1' +version = u'4.3' # The full version, including alpha/beta/rc tags. -release = u'4.1.0' +release = u'4.3.0' # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. diff --git a/install.rst b/install.rst index 7594ebc301..979dc3c1ee 100644 --- a/install.rst +++ b/install.rst @@ -34,6 +34,116 @@ To use PostgREST you will need an underlying database (PostgreSQL version 9.5 or * `Instructions for Ubuntu 14.04 `_ * `Installer for Windows `_ +.. _configuration: + +Configuration +============= + +The PostgREST server reads a configuration file to determine information about the database and how to serve client requests. There is no predefined location for this file, you must specify the file path as the one and only argument to the server: + +.. code:: bash + + postgrest /path/to/postgrest.conf + +The file must contain a set of key value pairs. At minimum you must include these keys: + +.. code:: + + # postgrest.conf + + # The standard connection URI format, documented at + # https://www.postgresql.org/docs/current/static/libpq-connect.html#AEN45347 + db-uri = "postgres://user:pass@host:5432/dbname" + + # The name of which database schema to expose to REST clients + db-schema = "api" + + # The database role to use when no client authentication is provided. + # Can (and probably should) differ from user in db-uri + db-anon-role = "anon" + +The user specified in the db-uri is also known as the authenticator role. For more information about the anonymous vs authenticator roles see the :ref:`roles`. + +Here is the full list of configuration parameters. + +================ ====== ======= ======== +Name Type Default Required +================ ====== ======= ======== +db-uri String Y +db-schema String Y +db-anon-role String Y +db-pool Int 10 +server-host String \*4 +server-port Int 3000 +server-proxy-uri String +jwt-secret String +secret-is-base64 Bool False +max-rows Int ∞ +pre-request String +================ ====== ======= ======== + +db-uri + The standard connection PostgreSQL `URI format `_. Symbols and unusual characters in the password or other fields should be percent encoded to avoid a parse error. On older systems like Centos 6, with older versions of libpq, a different db-uri syntax has to be used. In this case the URI is a string of space separated key-value pairs (key=value), so the example above would be :code:`"host=host user=user port=5432 dbname=dbname password=pass"`. Also allows connections over Unix sockets for higher performance. +db-schema + The database schema to expose to REST clients. Tables, views and stored procedures in this schema will get API endpoints. +db-anon-role + The database role to use when executing commands on behalf of unauthenticated clients. +db-pool + Number of connections to keep open in PostgREST's database pool. Having enough here for the maximum expected simultaneous client connections can improve performance. Note it's pointless to set this higher than the :code:`max_connections` GUC in your database. +server-host + Where to bind the PostgREST web server. In addition to the usual address options, PostgREST interprets these reserved addresses with special meanings: + + * :code:`*` - any IPv4 or IPv6 hostname + * :code:`*4` - any IPv4 or IPv6 hostname, IPv4 preferred + * :code:`!4` - any IPv4 hostname + * :code:`*6` - any IPv4 or IPv6 hostname, IPv6 preferred + * :code:`!6` - any IPv6 hostname + +server-port + The port to bind the web server. +server-proxy-uri + Overrides the base URL used within the OpenAPI self-documentation hosted at the API root path. Use a complete URI syntax :code:`scheme:[//[user:password@]host[:port]][/]path[?query][#fragment]`. Ex. :code:`https://postgrest.com` + +.. code:: json + + { + "swagger": "2.0", + "info": { + "version": "0.4.3.0", + "title": "PostgREST API", + "description": "This is a dynamic API generated by PostgREST" + }, + "host": "postgrest.com:443", + "basePath": "/", + "schemes": [ + "https" + ] + } + +jwt-secret + The secret used to decode JWT tokens clients provide for authentication. If this parameter is not specified then PostgREST refuses authentication requests. Choosing a value for this parameter beginning with the at sign such as :code:`@filename` loads the secret out of an external file. This is useful for automating deployments. Note that any binary secrets must be base64 encoded. +secret-is-base64 + When this is set to :code:`true`, the value derived from :code:`jwt-secret` will be treated as a base64 encoded secret. +max-rows + A hard limit to the number of rows PostgREST will fetch from a view, table, or stored procedure. Limits payload size for accidental or malicious requests. +pre-request + A schema-qualified stored procedure name to call right after switching roles for a client request. This provides an opportunity to modify SQL variables or raise an exception to prevent the request from completing. + +Running the Server +------------------ + +PostgREST outputs basic request logging to stdout. When running it in an SSH session you must detach it from stdout or it will be terminated when the session closes. The easiest technique is redirecting the output to a logfile or to the syslog: + +.. code-block:: bash + + ssh foo@example.com \ + 'postgrest foo.conf /var/log/postgrest.log 2>&1 &' + + # another option is to pipe the output into "logger -t postgrest" + +(Avoid :code:`nohup postgrest` because the HUP signal is used for manual :ref:`schema_reloading`.) + + Docker ====== From 45ddafc2a8372ceaf90962242854b34ded33be94 Mon Sep 17 00:00:00 2001 From: Joe Nelson Date: Sat, 9 Sep 2017 20:32:59 -0500 Subject: [PATCH 118/711] How to determine server version Fixes #63 --- admin.rst | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/admin.rst b/admin.rst index f4b291bd1b..fdb075f2cb 100644 --- a/admin.rst +++ b/admin.rst @@ -121,6 +121,14 @@ Nginx rate limiting is general and indescriminate. To rate limit each authentica Debugging ========= +Server Version +-------------- + +When debugging a problem it's important to verify the PostgREST version. At any time you can make a request to the running server and determine exactly which version is deployed. Look for the :code:`Server` HTTP response header, which contains the version number. + +HTTP Requests +------------- + The PostgREST server logs basic request information to stdout, including the requesting IP address and user agent, the URL requested, and HTTP response status. However this provides limited information for debugging server errors. It's helpful to get full information about both client requests and the corresponding SQL commands executed against the underlying database. A great way to inspect incoming HTTP requests including headers and query params is to sniff the network traffic on the port where PostgREST is running. For instance on a development server bound to port 3000 on localhost, run this: @@ -130,7 +138,10 @@ A great way to inspect incoming HTTP requests including headers and query params # sudo access is necessary for watching the network sudo ngrep -d lo0 port 3000 -The options to ngrep vary depending on the address and host on which you've bound the server. The binding is described in the `Configuration`_ section. The ngrep output isn't particularly pretty, but it's legible. Note the :code:`Server` response header as well which identifies the version of server. This is important when submitting bug reports. +The options to ngrep vary depending on the address and host on which you've bound the server. The binding is described in the :ref:`configuration` section. The ngrep output isn't particularly pretty, but it's legible. + +Database Logs +------------- Once you've verified that requests are as you expect, you can get more information about the server operations by watching the database logs. By default PostgreSQL does not keep these logs, so you'll need to make the configuration changes below. Find :code:`postgresql.conf` inside your PostgreSQL data directory (to find that, issue the command :code:`show data_directory;`). Either find the settings scattered throughout the file and change them to the following values, or append this block of code to the end of the configuration file. From a93ddbee5af8f016b4bcd7337176632aebcab1aa Mon Sep 17 00:00:00 2001 From: Joe Nelson Date: Sat, 9 Sep 2017 20:52:12 -0500 Subject: [PATCH 119/711] Unicode Fixes #62 --- api.rst | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/api.rst b/api.rst index 9b800d016d..7ba158dbb4 100644 --- a/api.rst +++ b/api.rst @@ -336,6 +336,23 @@ If the stored procedure returns non-scalar values, you need to do a :code:`selec If more than one row would be returned the binary results will be concatenated with no delimiter. +Unicode Support +=============== + +PostgREST supports unicode in schemas, tables, columns and values. To access a table with unicode name, use percent encoding. + +To request this: + +.. code-block:: html + + http://localhost:3000/موارد + +Do this: + +.. code-block:: html + + http://localhost:3000/%D9%85%D9%88%D8%A7%D8%B1%D8%AF + .. _resource_embedding: Resource Embedding From edefd3040c95accdbebcb273216785179e770bcb Mon Sep 17 00:00:00 2001 From: Joe Nelson Date: Sat, 9 Sep 2017 21:27:36 -0500 Subject: [PATCH 120/711] Section about new FTS features Fixes #61 --- api.rst | 26 +++++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/api.rst b/api.rst index 7ba158dbb4..74e55f5851 100644 --- a/api.rst +++ b/api.rst @@ -63,7 +63,7 @@ in one of a list of values e.g. :code:`IN` in quoted strings like :code:`?a=in."hi,there","yes,you"` is checking for exact equality (null,true,false) :code:`IS` -fts full-text search using to_tsquery :code:`@@` +fts :ref:`fts` using to_tsquery :code:`@@` cs contains e.g. :code:`?tags=cs.{example, new}` :code:`@>` cd contained in e.g. :code:`?values=cd.{1,2,3}` :code:`<@` ov overlap (have points in common), :code:`&&` @@ -102,6 +102,30 @@ The view will provide a new endpoint: GET /fresh_stories HTTP/1.1 +.. _fts: + +Full-Text Search +~~~~~~~~~~~~~~~~ + +The :code:`fts` filter mentioned above has a number of options to support flexible textual queries, namely the choice of plain vs phrase search and the language used for stemming. Suppose that :code:`tsearch` is a table with column :code:`ts_vector`, unsurprisingly of type `tsvector `_. The follow examples illustrate the possibilities. + +.. code-block:: http + + # Use language in fts query + GET /tsearch?ts_vector=french.fts.amusant + + # Use plainto_tsquery and phraseto_tsquery + GET /tsearch?ts_vector=plain.fts.The%20Fat%20Cats + GET /tsearch?ts_vector=phrase.fts.The%20Fat%20Rats + + # Combine both + GET /tsearch?ts_vector=phrase.english.fts.The%20Fat%20Cats + + # "not" also working + GET /tsearch?ts_vector=not.phrase.english.fts.The%20Fat%20Cats + +Using phrase search mode requires PostgreSQL of version at least 9.6 and will raise an error in earlier versions of the database. + .. _v_filter: Vertical Filtering (Columns) From 922ae0e0c984113be05cceb2bd58e24d3e0945bf Mon Sep 17 00:00:00 2001 From: Russell Davies Date: Fri, 29 Sep 2017 06:53:03 +0100 Subject: [PATCH 121/711] Update JWT configuration section for JWK and aud (#106) --- install.rst | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/install.rst b/install.rst index 979dc3c1ee..7b7e45edff 100644 --- a/install.rst +++ b/install.rst @@ -77,6 +77,7 @@ server-host String \*4 server-port Int 3000 server-proxy-uri String jwt-secret String +jwt-aud String secret-is-base64 Bool False max-rows Int ∞ pre-request String @@ -121,7 +122,9 @@ server-proxy-uri } jwt-secret - The secret used to decode JWT tokens clients provide for authentication. If this parameter is not specified then PostgREST refuses authentication requests. Choosing a value for this parameter beginning with the at sign such as :code:`@filename` loads the secret out of an external file. This is useful for automating deployments. Note that any binary secrets must be base64 encoded. + The secret or `JSON Web Key (JWK) `_ used to decode JWT tokens clients provide for authentication. If this parameter is not specified then PostgREST refuses authentication requests. Choosing a value for this parameter beginning with the at sign such as :code:`@filename` loads the secret out of an external file. This is useful for automating deployments. Note that any binary secrets must be base64 encoded. +jwt-aud + Specifies the `JWT audience claim `_. If this claim is present in the client provided JWT then you must set this to the same value as in the JWT, otherwise verifying the JWT will fail. secret-is-base64 When this is set to :code:`true`, the value derived from :code:`jwt-secret` will be treated as a base64 encoded secret. max-rows From e7ddea0acfe29f05071353f41edfa3ae1f4692df Mon Sep 17 00:00:00 2001 From: Joe Nelson Date: Sat, 7 Oct 2017 13:03:30 -0500 Subject: [PATCH 122/711] Document long jwt secrets as required (#109) * Use long jwt secrets as required * Fix spelling and adjust custom dictionary --- admin.rst | 2 +- api.rst | 21 +++++++++++---------- auth.rst | 12 ++++++------ install.rst | 16 ++++++++-------- intro.rst | 2 +- postgrest.dict | 40 ++++++++++++++++++++++++++++++++++++++++ 6 files changed, 67 insertions(+), 26 deletions(-) diff --git a/admin.rst b/admin.rst index fdb075f2cb..d6408aa9f5 100644 --- a/admin.rst +++ b/admin.rst @@ -116,7 +116,7 @@ Next we apply the zone to certain routes, like a hypothetical stored procedure c The burst argument tells Nginx to start dropping requests if more than five queue up from a specific IP. -Nginx rate limiting is general and indescriminate. To rate limit each authenticated request individually you will need to add logic in a :ref:`Custom Validation ` function. +Nginx rate limiting is general and indiscriminate. To rate limit each authenticated request individually you will need to add logic in a :ref:`Custom Validation ` function. Debugging ========= diff --git a/api.rst b/api.rst index 74e55f5851..c05547b07f 100644 --- a/api.rst +++ b/api.rst @@ -47,9 +47,9 @@ Complex logic can also be applied: These operators are available: -============ =============================================== =================== -Abbreviation Meaning Postgres Equivalent -============ =============================================== =================== +============ =============================================== ===================== +Abbreviation Meaning PostgreSQL Equivalent +============ =============================================== ===================== eq equals :code:`=` gt greater than :code:`>` gte greater than or equal :code:`>=` @@ -75,7 +75,7 @@ nxr does not extend to the right of, :code:`&<` nxl does not extend to the left of :code:`&>` adj is adjacent to, e.g. :code:`?range=adj.(1,10)` :code:`-|-` not negates another operator, see below :code:`NOT` -============ =============================================== =================== +============ =============================================== ===================== .. note:: @@ -131,7 +131,7 @@ Using phrase search mode requires PostgreSQL of version at least 9.6 and will ra Vertical Filtering (Columns) ---------------------------- -When certain columns are wide (such as those holding binary data), it is more efficient for the server to withold them in a response. The client can specify which columns are required using the :sql:`select` parameter. +When certain columns are wide (such as those holding binary data), it is more efficient for the server to withhold them in a response. The client can specify which columns are required using the :sql:`select` parameter. .. code-block:: http @@ -434,7 +434,7 @@ Which would return ] The primary key of the table of the resource being embedded must be specified, -either explicitly, like in the example above, or implicitly through a wildcard. +either explicitly, like in the example above, or implicitly through a wild card. In this example, since the relationship is a forward relationship, there is only one director associated with a film. As the table name is plural it might @@ -487,7 +487,7 @@ The PostgREST URL grammar limits the kinds of queries clients can perform. It pr * Table unions * More complicated joins than those provided by `Resource Embedding`_ -* Geospatial queries that require an argument, like "points near (lat,lon)" +* Geo-spatial queries that require an argument, like "points near (lat,lon)" * More sophisticated full-text search than a simple use of the :sql:`fts` filter Stored Procedures @@ -635,7 +635,7 @@ Updates also support :code:`Prefer: return=representation` plus :ref:`v_filter`. Bulk Insert ----------- -Bulk insert works exactly like single row insert except that you provide either a JSON array of objects having uniform keys, or lines in CSV format. This not only minimizes the HTTP requests required but uses a single INSERT statement on the backend for efficiency. Note that using CSV requires less parsing on the server and is much faster. +Bulk insert works exactly like single row insert except that you provide either a JSON array of objects having uniform keys, or lines in CSV format. This not only minimizes the HTTP requests required but uses a single INSERT statement on the back-end for efficiency. Note that using CSV requires less parsing on the server and is much faster. To bulk insert CSV simply post to a table route with :code:`Content-Type: text/csv` and include the names of the columns as the first row. For instance @@ -726,7 +726,7 @@ PostgREST translates `PostgreSQL error codes `_. (It was encoded with a secret of :code:`mysecret` as specified in the SQL code above. You'll want to change this secret in your app!) +The response would look like the snippet below. Try decoding the token at `jwt.io `_. (It was encoded with a secret of :code:`reallyreallyreallyreallyverysafe` as specified in the SQL code above. You'll want to change this secret in your app!) .. code:: json { - "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJlbWFpbCI6ImZvb0BiYXIuY29tIiwicm9sZSI6ImF1dGhvciJ9.fpf3_ERi5qbWOE5NPzvauJgvulm0zkIG9xSm2w5zmdw" + "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJlbWFpbCI6ImZvb0BiYXIuY29tIiwicGFzcyI6ImZvb2JhciJ9.37066TTRlh-1hXhnA9oO9Pj6lgL6zFuJU0iCHhuCFno" } Permissions diff --git a/install.rst b/install.rst index 7b7e45edff..7030616cb5 100644 --- a/install.rst +++ b/install.rst @@ -3,7 +3,7 @@ Binary Release [ `Download from release page `_ ] -The release page has precompiled binaries for Mac OS X, Windows, and several Linux distros. Extract the tarball and run the binary inside with the :code:`--help` flag to see usage instructions: +The release page has pre-compiled binaries for Mac OS X, Windows, and several Linux distributions. Extract the tarball and run the binary inside with the :code:`--help` flag to see usage instructions: .. code-block:: bash @@ -122,7 +122,7 @@ server-proxy-uri } jwt-secret - The secret or `JSON Web Key (JWK) `_ used to decode JWT tokens clients provide for authentication. If this parameter is not specified then PostgREST refuses authentication requests. Choosing a value for this parameter beginning with the at sign such as :code:`@filename` loads the secret out of an external file. This is useful for automating deployments. Note that any binary secrets must be base64 encoded. + The secret or `JSON Web Key (JWK) `_ used to decode JWT tokens clients provide for authentication. For security the key must be at least thirty-two characters long. If this parameter is not specified then PostgREST refuses authentication requests. Choosing a value for this parameter beginning with the at sign such as :code:`@filename` loads the secret out of an external file. This is useful for automating deployments. Note that any binary secrets must be base64 encoded. jwt-aud Specifies the `JWT audience claim `_. If this claim is present in the client provided JWT then you must set this to the same value as in the JWT, otherwise verifying the JWT will fail. secret-is-base64 @@ -135,7 +135,7 @@ pre-request Running the Server ------------------ -PostgREST outputs basic request logging to stdout. When running it in an SSH session you must detach it from stdout or it will be terminated when the session closes. The easiest technique is redirecting the output to a logfile or to the syslog: +PostgREST outputs basic request logging to stdout. When running it in an SSH session you must detach it from stdout or it will be terminated when the session closes. The easiest technique is redirecting the output to a log file or to the syslog: .. code-block:: bash @@ -276,7 +276,7 @@ The script expects the following parameters: test/create_test_db connection_uri database_name [test_db_user] [test_db_user_password] -Use the `connection URI `_ to specify the user, password, host, and port. Do not provide the database in the connection URI. The Postgres role you are using to connect must be capable of creating new databases. +Use the `connection URI `_ to specify the user, password, host, and port. Do not provide the database in the connection URI. The PostgreSQL role you are using to connect must be capable of creating new databases. The :code:`database_name` is the name of the database that :code:`stack test` will connect to. If the database of the same name already exists on the server, the script will first drop it and then re-create it. @@ -288,7 +288,7 @@ Optionally, if specifying an existing user to be used for the test connection, o The script will return the db uri to use in the tests--this uri corresponds to the :code:`db-uri` parameter in the configuration file that one would use in production. -Generating the user and the password allows one to create the database and run the tests against any postgres server without any modifications to the server. (Such as allowing accounts without a passoword or setting up trust authentication, or requiring the server to be on the same localhost the tests are run from). +Generating the user and the password allows one to create the database and run the tests against any PostgreSQL server without any modifications to the server. (Such as allowing accounts without a password or setting up trust authentication, or requiring the server to be on the same localhost the tests are run from). Running the Tests ~~~~~~~~~~~~~~~~~ @@ -321,7 +321,7 @@ This connection assumes the test server on the :code:`localhost:code:` with the Destroying the Database ~~~~~~~~~~~~~~~~~~~~~~~ -The test database will remain after the test, together with four new roles created on the postgres server. To permanently erase the created database and the roles, run the script :code:`test/delete_test_database`, using the same superuser role used for creating the database: +The test database will remain after the test, together with four new roles created on the PostgreSQL server. To permanently erase the created database and the roles, run the script :code:`test/delete_test_database`, using the same superuser role used for creating the database: .. code:: bash @@ -339,7 +339,7 @@ For example, if local development is on a mac with Docker for Mac installed: $ docker run --name db-scripting-test -e POSTGRES_PASSWORD=pwd -p 5434:5432 -d postgres $ POSTGREST_TEST_CONNECTION=$(test/create_test_db "postgres://postgres:pwd@localhost:5434" test_db) stack test -Additionally, if one creates a docker container to run stack test (this is necessary on MacOS Sierra with GHC below 8.0.1, where :code:`stack test` fails), one can run PostgreSQL in a separate linked container, or use the locally installed Postgres.app. +Additionally, if one creates a docker container to run stack test (this is necessary on Mac OS Sierra with GHC below 8.0.1, where :code:`stack test` fails), one can run PostgreSQL in a separate linked container, or use the locally installed PostgreSQL app. Build the test container with :code:`test/Dockerfile.test`: @@ -357,7 +357,7 @@ Linked containers: $ docker run --name pg -e POSTGRES_PASSWORD=pwd -d postgres $ docker run --rm -it -v `pwd`:`pwd` -v ~/.stack-linux:/root/.stack --link pg:pg -w="`pwd`" -v `pwd`/.stack-work-docker:`pwd`/.stack-work pgst-test bash -c "POSTGREST_TEST_CONNECTION=$(test/create_test_db "postgres://postgres:pwd@pg" test_db) stack test" -Stack test in Docker for Mac, Postgres.app on mac: +Stack test in Docker for Mac, PostgreSQL app on mac: .. code:: bash diff --git a/intro.rst b/intro.rst index dbafcfab77..272c8d9ef6 100644 --- a/intro.rst +++ b/intro.rst @@ -81,7 +81,7 @@ Example Apps * `tyrchen/goodfilm `_ - example film api * `begriffs/postgrest-example `_ - sqitch versioning for API * `SMRxT/postgrest-demo `_ - multi-tenant logging system -* `PierreRochard/postgrest-boilerplate `_ - example auth backend +* `PierreRochard/postgrest-boilerplate `_ - example auth back-end In Production ------------- diff --git a/postgrest.dict b/postgrest.dict index 5966273cbc..1143d7ca74 100644 --- a/postgrest.dict +++ b/postgrest.dict @@ -1,13 +1,19 @@ personal_ws-1.1 en 0 utf-8 +AMQP Auth +Bool +CSV Codd +DDL DoS +GHC GUC Github Google GraphQL HMAC HTTPS +HV Haskell Heroku Homebrew @@ -33,53 +39,87 @@ PostgreSQL's RDS RESTful RLS +RSA +RabbitMQ RestSharp SHA SIGHUP +SNS SQL SSL Sencha SuperAgent +Tcl +TypeScript UI Vondra WAI +Websockets +ZeroMQ api +aud auth authenticator balancer +cd centric +conf config cryptographically +csv +disjoined eq +fts +grantor gte http ilike +json jwt localhost login logins +lon lt lte middleware +multi namespaced neq ngrep nullsfirst nullslast +nxl +nxr +openapi +ov param params passphrase +postgrest +pgSQL pgcrypto pgjwt pre refactor +requester's +savepoint +schemas signup +sl sqitch +sql +sr startup +stateful stdout +syslog tsquery +unicode uri url +urls verifier versioning webuser +wildcard From 9598e3948d8eaf08903ebef96e933cea13d4895e Mon Sep 17 00:00:00 2001 From: Joe Nelson Date: Sat, 7 Oct 2017 19:59:30 -0500 Subject: [PATCH 123/711] Show how to use a JWK literal in the config file (#110) --- auth.rst | 40 +++++++++++++++++++++++++++++++++++++++- install.rst | 2 +- postgrest.dict | 3 +++ 3 files changed, 43 insertions(+), 2 deletions(-) diff --git a/auth.rst b/auth.rst index 9468a4efd5..7957cb9b8b 100644 --- a/auth.rst +++ b/auth.rst @@ -152,7 +152,7 @@ To make an authenticated request the client must include an :code:`Authorization JWT Generation -------------- -You can create a valid JWT either from inside your database or via an external service. Each token is cryptographically signed with a secret passphrase -- the signer and verifier share the secret. Hence any service that shares a passphrase with a PostgREST server can create valid JWT. (PostgREST currently supports only the HMAC-SHA256 signing algorithm.) +You can create a valid JWT either from inside your database or via an external service. Each token is cryptographically signed with a secret key. In the case of symmetric cryptography the signer and verifier share the same secret passphrase. In asymmetric cryptography the signer uses the private key and the verifier the public key. PostgREST supports both symmetric and asymmetric cryptography. JWT from SQL ~~~~~~~~~~~~ @@ -238,6 +238,44 @@ Our code requires a database role in the JWT. To add it you need to save the dat } }) +.. _asym_keys: + +Asymmetric Keys +~~~~~~~~~~~~~~~ + +As described in the :ref:`configuration` section, PostgREST accepts a ``jwt-secret`` config file parameter. If it is set to a simple string value like "reallyreallyreallyreallyverysafe" then PostgREST interprets it as an HMAC-SHA256 passphrase. However you can also specify a literal JWT key JSON value. For example, you can use an RSA-256 public key such as: + +.. code-block:: json + + { + "alg":"RS256", + "e":"AQAB", + "key_ops":["verify"], + "kty":"RSA", + "n":"9zKNYTaYGfGm1tBMpRT6FxOYrM720GhXdettc02uyakYSEHU2IJz90G_MLlEl4-WWWYoS_QKFupw3s7aPYlaAjamG22rAnvWu-rRkP5sSSkKvud_IgKL4iE6Y2WJx2Bkl1XUFkdZ8wlEUR6O1ft3TS4uA-qKifSZ43CahzAJyUezOH9shI--tirC028lNg767ldEki3WnVr3zokSujC9YJ_9XXjw2hFBfmJUrNb0-wldvxQbFU8RPXip-GQ_JPTrCTZhrzGFeWPvhA6Rqmc3b1PhM9jY7Dur1sjYWYVyXlFNCK3c-6feo5WlRfe1aCWmwZQh6O18eTmLeT4nWYkDzQ" + } + +Just pass it in as a single line string, escaping the quotes: + +.. code-block:: ini + + jwt-secret = "{ \"alg\":\"RS256\", … }" + +To generate such a public/private key pair use a utility like `latchset/jose `_. + +.. code-block:: bash + + jose jwk gen -i '{"alg": "RS256"}' -o rsa.jwk + jose jwk pub -i rsa.jwk -o rsa.jwk.pub + + # now rsa.jwk.pub contains the desired JSON object + +You can specify the literal value as we saw earlier, or reference a filename to load the JWK from a file: + +.. code-block:: ini + + jwt-secret = "@rsa.jwk.pub" + JWT security ~~~~~~~~~~~~ diff --git a/install.rst b/install.rst index 7030616cb5..a7ab1bd4e2 100644 --- a/install.rst +++ b/install.rst @@ -122,7 +122,7 @@ server-proxy-uri } jwt-secret - The secret or `JSON Web Key (JWK) `_ used to decode JWT tokens clients provide for authentication. For security the key must be at least thirty-two characters long. If this parameter is not specified then PostgREST refuses authentication requests. Choosing a value for this parameter beginning with the at sign such as :code:`@filename` loads the secret out of an external file. This is useful for automating deployments. Note that any binary secrets must be base64 encoded. + The secret or `JSON Web Key (JWK) `_ used to decode JWT tokens clients provide for authentication. For security the key must be at least thirty-two characters long. If this parameter is not specified then PostgREST refuses authentication requests. Choosing a value for this parameter beginning with the at sign such as :code:`@filename` loads the secret out of an external file. This is useful for automating deployments. Note that any binary secrets must be base64 encoded. Both symmetric and asymmetric cryptography are supported. For more info see :ref:`asym_keys`. jwt-aud Specifies the `JWT audience claim `_. If this claim is present in the client provided JWT then you must set this to the same value as in the JWT, otherwise verifying the JWT will fail. secret-is-base64 diff --git a/postgrest.dict b/postgrest.dict index 1143d7ca74..65b3387f77 100644 --- a/postgrest.dict +++ b/postgrest.dict @@ -21,6 +21,7 @@ ILIKE IP JS JSON +JWK JWT Logins MVCC @@ -69,6 +70,7 @@ cryptographically csv disjoined eq +filename fts grantor gte @@ -101,6 +103,7 @@ pgSQL pgcrypto pgjwt pre +reallyreallyreallyreallyverysafe refactor requester's savepoint From a3d87edda35c585b82c2d1a65ed2d5cf2f51b093 Mon Sep 17 00:00:00 2001 From: Joe Nelson Date: Sun, 8 Oct 2017 12:38:46 -0500 Subject: [PATCH 124/711] Explain how sql comments appear in the openapi output (#111) --- api.rst | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/api.rst b/api.rst index c05547b07f..2a4480f93d 100644 --- a/api.rst +++ b/api.rst @@ -678,9 +678,19 @@ To delete rows in a table, use the DELETE verb plus :ref:`h_filter`. For instanc OpenAPI Support =============== -Every API hosted by PostgREST automatically serves a full `OpenAPI `_ description on the root path. This provides a list of all endpoints, along with supported HTTP verbs and example payloads. +Every API hosted by PostgREST automatically serves a full `OpenAPI `_ description on the root path. This provides a list of all endpoints, along with supported HTTP verbs and example payloads. For extra customization, the OpenAPI output contains a "description" field for every `SQL comment `_ on a table, column, or function. For instance, -You can use a tool like `Swagger UI `_ to create beautiful documentation from the description and to host an interactive web-based dashboard. The dashboard allows developers to make requests against a live PostgREST server, provides guidance with request headers and example request bodies. +.. code-block:: sql + + COMMENT ON TABLE monotremes IS + 'Freakish mammals lay the best eggs for breakfast'; + + COMMENT ON COLUMN monotremes.has_venomous_claw IS + 'Sometimes breakfast is not worth it'; + +These unsavory comments will appear in the generated JSON as the fields ``definitions.monotremes.description`` and ``definitions.monotremes.properties.has_venomous_claw.description``. + +You can use a tool like `Swagger UI `_ to create beautiful documentation from the description and to host an interactive web-based dashboard. The dashboard allows developers to make requests against a live PostgREST server, and provides guidance with request headers and example request bodies. .. note:: From 59ab74b86139a7c00ea16ac5dc4a829059547584 Mon Sep 17 00:00:00 2001 From: Joe Nelson Date: Sun, 8 Oct 2017 13:35:35 -0500 Subject: [PATCH 125/711] Add items to ecosystem --- intro.rst | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/intro.rst b/intro.rst index 272c8d9ef6..c6509574b1 100644 --- a/intro.rst +++ b/intro.rst @@ -62,6 +62,7 @@ These are PostgreSQL bridges that propagate LISTEN/NOTIFY to external queues for * `aweber/pgsql-listen-exchange `_ - RabbitMQ * `SpiderOak/skeeter `_ - ZeroMQ * `FGRibreau/postgresql-to-amqp `_ - AMQP +* `daurnimator/pg-kinesis-bridge `_ - Amazon Kinesis Example Apps ------------ @@ -86,6 +87,7 @@ Example Apps In Production ------------- +* `Moat `_ * `Catarse `_ * `iAdvize `_ * `Redsmin `_ @@ -98,12 +100,13 @@ In Production Extensions ---------- -* `ppKrauss/PostgREST-writeAPI `_ - generate Nginx rewrite rules to fit an OpenAPI spec * `diogob/postgrest-ws `_ - expose web sockets for PostgreSQL's LISTEN/NOTIFY * `pg-safeupdate `_ - Prevent full-table updates or deletes * `srid/spas `_ - allow file uploads and basic auth * `svmnotn/postgrest-auth `_ - OAuth2-inspired external auth server * `nblumoe/postgrest-oauth `_ - OAuth2 WAI middleware +* `criles25/postgrest-auth `_ - email based auth/signup +* `ppKrauss/PostgREST-writeAPI `_ - generate Nginx rewrite rules to fit an OpenAPI spec Commercial --------------- From 82d2d781be33aefce997fa6764cd785e77422f75 Mon Sep 17 00:00:00 2001 From: Brian Thorne Date: Sat, 4 Nov 2017 16:59:04 +1100 Subject: [PATCH 126/711] Fix typo in api.rst (#113) --- api.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/api.rst b/api.rst index 2a4480f93d..11453fe51a 100644 --- a/api.rst +++ b/api.rst @@ -618,7 +618,7 @@ On the other end of the spectrum you can get the full created object back in the Some javascript libraries will post the data incorrectly if you're not careful. For best results try one of the :ref:`clientside_libraries` built for PostgREST. -To update a row or rows in a table, use the PATCH verb. Use :ref:`h_filter` to specify which record(s) to update. Here is an exmaple query setting the :code:`category` column to child for all people below a certain age. +To update a row or rows in a table, use the PATCH verb. Use :ref:`h_filter` to specify which record(s) to update. Here is an example query setting the :code:`category` column to child for all people below a certain age. .. code:: HTTP From e48a206075cb7379732652d80b1fc182e8a852c0 Mon Sep 17 00:00:00 2001 From: Joe Nelson Date: Sat, 4 Nov 2017 23:17:39 -0500 Subject: [PATCH 127/711] Use parens for IN operator Paren-free is deprecated --- api.rst | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/api.rst b/api.rst index 11453fe51a..14775ac4a1 100644 --- a/api.rst +++ b/api.rst @@ -59,9 +59,9 @@ neq not equal :code:`<>` or :co like LIKE operator (use * in place of %) :code:`LIKE` ilike ILIKE operator (use * in place of %) :code:`ILIKE` in one of a list of values e.g. :code:`IN` - :code:`?a=in.1,2,3` – also supports commas + :code:`?a=in.(1,2,3)` – also supports commas in quoted strings like - :code:`?a=in."hi,there","yes,you"` + :code:`?a=in.("hi,there","yes,you")` is checking for exact equality (null,true,false) :code:`IS` fts :ref:`fts` using to_tsquery :code:`@@` cs contains e.g. :code:`?tags=cs.{example, new}` :code:`@>` @@ -475,7 +475,7 @@ This sorts the list of actors in each film but does *not* change the order of th .. code-block:: http - GET /films?select=*,roles(*)&roles.character=in.Chico,Harpo,Groucho HTTP/1.1 + GET /films?select=*,roles(*)&roles.character=in.(Chico,Harpo,Groucho) HTTP/1.1 Once again, this restricts the roles included to certain characters but does not filter the films in any way. Films without any of those characters would be included along with empty character lists. From f93e2723e31dbc8363b88ddefe35ff0dad75ce85 Mon Sep 17 00:00:00 2001 From: Joe Nelson Date: Sat, 25 Nov 2017 22:00:55 -0600 Subject: [PATCH 128/711] Add note that windows people need postgres on path (#117) --- install.rst | 2 ++ 1 file changed, 2 insertions(+) diff --git a/install.rst b/install.rst index a7ab1bd4e2..90e612bbb8 100644 --- a/install.rst +++ b/install.rst @@ -34,6 +34,8 @@ To use PostgREST you will need an underlying database (PostgreSQL version 9.5 or * `Instructions for Ubuntu 14.04 `_ * `Installer for Windows `_ +On Windows, PostgREST will fail to run unless the PostgreSQL binaries are on the system path. To test whether this is the case, run ``pg_config`` from the command line. You should see it output a list of paths. + .. _configuration: Configuration From d9e7620160a69e14e12a6b2ffe4fe1b097124ed3 Mon Sep 17 00:00:00 2001 From: Captain Justin Date: Wed, 29 Nov 2017 07:48:31 +0200 Subject: [PATCH 129/711] Update intro.rst (#118) --- intro.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/intro.rst b/intro.rst index c6509574b1..9754d528bc 100644 --- a/intro.rst +++ b/intro.rst @@ -51,6 +51,7 @@ Client-Side Libraries * `clesiemo3/postgrestR `_ - R * `PierreRochard/postgrest-angular `_ - TypeScript, generate UI from API description * `thejettdurham/postgrest-sharp-client `_ (needs maintainer) - C#, RestSharp +* `team142/ng-postgrest `_ - Angular app for browsing, editing data exposed over Postgrest. External Notification --------------------- From f0bf51efc2b4b5854deecd815b6f6b5d5ba4e913 Mon Sep 17 00:00:00 2001 From: Damien Bry Date: Thu, 28 Dec 2017 04:56:04 +0100 Subject: [PATCH 130/711] Added Elyios as using PostgREST in production (#119) --- intro.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/intro.rst b/intro.rst index 9754d528bc..426c625cf1 100644 --- a/intro.rst +++ b/intro.rst @@ -97,6 +97,7 @@ In Production * `OpenBooking `_ * `Convene `_ by Thomson-Reuters * `eGull `_ +* `Elyios `_ Extensions ---------- From e10599d0659f5b89028de82964600800f7a34b9d Mon Sep 17 00:00:00 2001 From: Joe Nelson Date: Thu, 18 Jan 2018 10:48:34 -0600 Subject: [PATCH 131/711] Changes in 4.4 release (#121) * Updated full-text search * Calling RPC with GET * Customizing HTTP status codes and headers * Move the admin section to bottom of TOC * Revise JWT signing section of tutorial * Selecting pkeys in embedding no longer required --- api.rst | 74 +++++++++++++++++++++++++++++++++------------- index.rst | 10 +++---- postgrest.dict | 5 +++- tutorials/tut1.rst | 17 +++++++---- 4 files changed, 73 insertions(+), 33 deletions(-) diff --git a/api.rst b/api.rst index 14775ac4a1..78d51da1a7 100644 --- a/api.rst +++ b/api.rst @@ -64,6 +64,8 @@ in one of a list of values e.g. :code:`IN` :code:`?a=in.("hi,there","yes,you")` is checking for exact equality (null,true,false) :code:`IS` fts :ref:`fts` using to_tsquery :code:`@@` +plfts :ref:`fts` using plainto_tsquery :code:`@@` +phfts :ref:`fts` using phraseto_tsquery :code:`@@` cs contains e.g. :code:`?tags=cs.{example, new}` :code:`@>` cd contained in e.g. :code:`?values=cd.{1,2,3}` :code:`<@` ov overlap (have points in common), :code:`&&` @@ -107,22 +109,22 @@ The view will provide a new endpoint: Full-Text Search ~~~~~~~~~~~~~~~~ -The :code:`fts` filter mentioned above has a number of options to support flexible textual queries, namely the choice of plain vs phrase search and the language used for stemming. Suppose that :code:`tsearch` is a table with column :code:`ts_vector`, unsurprisingly of type `tsvector `_. The follow examples illustrate the possibilities. +The :code:`fts` filter mentioned above has a number of options to support flexible textual queries, namely the choice of plain vs phrase search and the language used for stemming. Suppose that :code:`tsearch` is a table with column :code:`my_tsv`, of type `tsvector `_. The follow examples illustrate the possibilities. .. code-block:: http # Use language in fts query - GET /tsearch?ts_vector=french.fts.amusant + GET /tsearch?my_tsv=fts(french).amusant # Use plainto_tsquery and phraseto_tsquery - GET /tsearch?ts_vector=plain.fts.The%20Fat%20Cats - GET /tsearch?ts_vector=phrase.fts.The%20Fat%20Rats + GET /tsearch?my_tsv=plfts.The%20Fat%20Cats + GET /tsearch?my_tsv=phfts.The%20Fat%20Rats # Combine both - GET /tsearch?ts_vector=phrase.english.fts.The%20Fat%20Cats + GET /tsearch?my_tsv=phfts(english).The%20Fat%20Cats # "not" also working - GET /tsearch?ts_vector=not.phrase.english.fts.The%20Fat%20Cats + GET /tsearch?my_tsv=not.phfts(english).The%20Fat%20Cats Using phrase search mode requires PostgreSQL of version at least 9.6 and will raise an error in earlier versions of the database. @@ -433,9 +435,6 @@ Which would return } ] -The primary key of the table of the resource being embedded must be specified, -either explicitly, like in the example above, or implicitly through a wild card. - In this example, since the relationship is a forward relationship, there is only one director associated with a film. As the table name is plural it might be preferable for it to be singular instead. An table name alias can accomplish @@ -455,9 +454,6 @@ PostgREST can also detect relations going through join tables. Thus you can requ GET /directors?select=films(title,year) HTTP/1.1 -Here it is not necessary to specify the table's primary key of the embedded -resource. - .. note:: Whenever foreign key relations change in the database schema you must refresh PostgREST's schema cache to allow resource embedding to work properly. See the section :ref:`schema_reloading`. @@ -493,13 +489,13 @@ The PostgREST URL grammar limits the kinds of queries clients can perform. It pr Stored Procedures ================= -Every stored procedure in the API-exposed database schema is accessible under the :code:`/rpc` prefix. The API endpoint supports only POST which executes the function. +Every stored procedure in the API-exposed database schema is accessible under the :code:`/rpc` prefix. The API endpoint supports POST (and in some cases GET) to execute the function. .. code:: http POST /rpc/function_name HTTP/1.1 -Such functions can perform any operations allowed by PostgreSQL (read data, modify data, and even DDL operations). However procedures in PostgreSQL marked with :code:`stable` or :code:`immutable` `volatility `_ can only read, not modify, the database and PostgREST executes them in a read-only transaction compatible for read-replicas. +Such functions can perform any operations allowed by PostgreSQL (read data, modify data, and even DDL operations). However procedures in PostgreSQL marked with :code:`stable` or :code:`immutable` `volatility `_ can only read, not modify, the database and PostgREST executes them in a read-only transaction compatible for read-replicas. Stable and immutable functions can be called with the HTTP GET verb if desired. Procedures must be used with `named arguments `_. To supply arguments in an API call, include a JSON object in the request payload and each key/value of the object will become an argument. @@ -520,7 +516,13 @@ The client can call it by posting an object like { "a": 1, "b": 2 } -The keys of the object match the parameter names. Note that PostgreSQL converts parameter names to lowercase unless you quote them like :sql:`CREATE FUNCTION foo("mixedCase" text) ...`. You can also call a function that takes a single parameter of type json by sending the header :code:`Prefer: params=single-object` with your request. That way the JSON request body will be used as the single argument. +Because ``add_them`` is declared IMMUTABLE, we can alternately call the function with a GET request: + +.. code:: http + + GET /rpc/add_them?a=1&b=2 HTTP/1.1 + +For POST and GET the keys of the object match the parameter names. Note that PostgreSQL converts parameter names to lowercase unless you quote them like :sql:`CREATE FUNCTION foo("mixedCase" text) ...`. You can also call a function that takes a single parameter of type json by sending the header :code:`Prefer: params=single-object` with your request. That way the JSON request body will be used as the single argument. .. note:: @@ -546,8 +548,6 @@ By default, a function is executed with the privileges of the user who calls it. Why the `/rpc` prefix? One reason is to avoid name collisions between views and procedures. It also helps emphasize to API consumers that these functions are not normal restful things. The functions can have arbitrary and surprising behavior, not the standard "post creates a resource" thing that users expect from the other routes. - We are considering allowing GET requests for functions that are marked non-volatile. Allowing GET is important for HTTP caching. However we still must decide how to pass function parameters since request bodies are not allowed. Also some query string arguments are already reserved for shaping/filtering the output. - Accessing Request Headers/Cookies --------------------------------- @@ -557,10 +557,10 @@ Stored procedures can access request headers and cookies by reading GUC variable SELECT current_setting('request.header.origin', true); -Raising Errors --------------- +Errors and HTTP Status Codes +---------------------------- -Stored procedures can return non-200 HTTP status codes by raising SQL exceptions. For instance, here's a saucy function that always errors: +Stored procedures can return non-200 HTTP status codes by raising SQL exceptions. For instance, here's a saucy function that always responds with an error: .. code-block:: postgresql @@ -585,7 +585,39 @@ Calling the function returns HTTP 400 with the body "code":"P0001" } -You can customize the HTTP status code by raising particular exceptions according to the PostgREST :ref:`error to status code mapping `. For example, :code:`RAISE insufficient_privilege` will respond with HTTP 401/403 as appropriate. +One way to customize the HTTP status code is by raising particular exceptions according to the PostgREST :ref:`error to status code mapping `. For example, :code:`RAISE insufficient_privilege` will respond with HTTP 401/403 as appropriate. + +For even greater control of the HTTP status code, raise an exception of the ``PTxyz`` type. For instance to respond with HTTP 402, raise 'PT402': + +.. code-block:: sql + + RAISE sqlstate 'PT402' using + message = 'Payment Required', + detail = 'Quota exceeded', + hint = 'Upgrade your plan'; + +Returns: + +.. code-block:: http + + HTTP/1.1 402 Payment Required + Content-Type: application/json; charset=utf-8 + + {"hint":"Upgrade your plan","details":"Quota exceeded"} + +Setting Response Headers +------------------------ + +PostgREST reads the ``response.headers`` SQL variable to add extra headers to the HTTP response. Stored procedures can modify this variable. For instance, this statement would add caching headers to the response: + +.. code-block:: sql + + -- tell client to cache response for two days + + SET LOCAL "response.headers" = + '[{"Cache-Control": "public"}, {"Cache-Control": "max-age=259200"}]'; + +Notice that the variable should be set to an *array* of single-key objects rather than a single multiple-key object. This is because headers such as ``Cache-Control`` or ``Set-Cookie`` need to be repeated when setting multiple values and an object would not allow the repeated key. Insertions / Updates ==================== diff --git a/index.rst b/index.rst index b3ab8b26fa..c59042d724 100644 --- a/index.rst +++ b/index.rst @@ -21,11 +21,6 @@ install.rst -.. toctree:: - :caption: Administration - - admin.rst - .. toctree:: :caption: API @@ -35,3 +30,8 @@ :caption: Authentication auth.rst + +.. toctree:: + :caption: Administration + + admin.rst diff --git a/postgrest.dict b/postgrest.dict index 65b3387f77..bab9af1efa 100644 --- a/postgrest.dict +++ b/postgrest.dict @@ -23,6 +23,7 @@ JS JSON JWK JWT +Kinesis Logins MVCC Mithril @@ -98,10 +99,12 @@ ov param params passphrase -postgrest pgSQL pgcrypto pgjwt +phfts +plfts +postgrest pre reallyreallyreallyreallyverysafe refactor diff --git a/tutorials/tut1.rst b/tutorials/tut1.rst index 983ac150f9..84e357a381 100644 --- a/tutorials/tut1.rst +++ b/tutorials/tut1.rst @@ -27,23 +27,28 @@ Step 2. Make a Secret Clients authenticate with the API using JSON Web Tokens. These are JSON objects which are cryptographically signed using a password known to only us and the server. Because clients do not know the password, they cannot tamper with the contents of their tokens. PostgREST will detect counterfeit tokens and will reject them. -Let's create a password and provide it to PostgREST. Think of a nice long one, or use a tool to generate it. +Let's create a password and provide it to PostgREST. Think of a nice long one, or use a tool to generate it. **Your password must be at least 32 characters long.** .. note:: - The `OpenSSL toolkit `_ provides an easy way to generate a secure password. If you have it installed, run + Unix tools can generate a nice password for you: .. code-block:: bash - openssl rand -base64 32 + # Allow "tr" to process non-utf8 byte sequences + export LC_CTYPE=C + + # read random bytes and keep only alphanumerics + < /dev/urandom tr -dc A-Za-z0-9 | head -c32 Open the :code:`tutorial.conf` (created in the previous tutorial) and add a line with the password: .. code-block:: ini - # add this line to tutorial.conf + # PASSWORD MUST BE AT LEAST 32 CHARS LONG + # add this line to tutorial.conf: - jwt-secret = "" + jwt-secret = "" If the PostgREST server is still running from the previous tutorial, restart it to load the updated configuration file. @@ -57,7 +62,7 @@ Ordinarily your own code in the database or in another server will create and si How to create a token at https://jwt.io -Remember to fill in the password you generated rather than the word :code:`secret`. After you have filled in the password and payload, the encoded data on the left will update. Copy the encoded token. +**Remember to fill in the password you generated rather than the word "secret".** After you have filled in the password and payload, the encoded data on the left will update. Copy the encoded token. .. note:: From 362ee5a4ed47040dea9ff705463a98b8d607476c Mon Sep 17 00:00:00 2001 From: Joe Nelson Date: Thu, 18 Jan 2018 10:53:51 -0600 Subject: [PATCH 132/711] Bump version --- conf.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/conf.py b/conf.py index 394a145849..2a9c6b8579 100644 --- a/conf.py +++ b/conf.py @@ -54,9 +54,9 @@ # built documents. # # The short X.Y version. -version = u'4.3' +version = u'4.4' # The full version, including alpha/beta/rc tags. -release = u'4.3.0' +release = u'4.4.0' # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. From 7dbd5f799e5897ea717808a1e15c29466a849951 Mon Sep 17 00:00:00 2001 From: Joe Nelson Date: Fri, 2 Feb 2018 19:57:24 -0800 Subject: [PATCH 133/711] Update name of diogob's websocket adapter --- intro.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/intro.rst b/intro.rst index 426c625cf1..78178b6f1d 100644 --- a/intro.rst +++ b/intro.rst @@ -58,6 +58,7 @@ External Notification These are PostgreSQL bridges that propagate LISTEN/NOTIFY to external queues for further processing. This allows stored procedures to initiate actions outside the database such as sending emails. +* `diogob/postgres-websockets `_ - expose web sockets for PostgreSQL's LISTEN/NOTIFY * `frafra/postgresql2websocket `_ - Websockets * `matthewmueller/pg-bridge `_ - Amazon SNS * `aweber/pgsql-listen-exchange `_ - RabbitMQ @@ -102,7 +103,6 @@ In Production Extensions ---------- -* `diogob/postgrest-ws `_ - expose web sockets for PostgreSQL's LISTEN/NOTIFY * `pg-safeupdate `_ - Prevent full-table updates or deletes * `srid/spas `_ - allow file uploads and basic auth * `svmnotn/postgrest-auth `_ - OAuth2-inspired external auth server From 911417471e99b893232fa824241b438f28e8d15a Mon Sep 17 00:00:00 2001 From: Joe Nelson Date: Sat, 3 Feb 2018 13:55:32 -0800 Subject: [PATCH 134/711] Add Eric's testimonial --- intro.rst | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/intro.rst b/intro.rst index 78178b6f1d..317c5faaf8 100644 --- a/intro.rst +++ b/intro.rst @@ -138,6 +138,15 @@ Testimonials -- Simone Scarduzio + "I like the fact that PostgREST does one thing, and one thing well. + While PostgREST takes care of bridging the gap between our HTTP server + and PostgreSQL database, we can focus on the development of our API in + a single language: SQL. This puts the database in the center of our + architecture, and pushed us to improve our skills in SQL programming + and database design." + + -- Eric Bréchemier, Data Engineer, eGull SAS + Getting Support ################ From 7151e624995ce95733d21147c2fa59bcafcce05e Mon Sep 17 00:00:00 2001 From: Camille Roussel Date: Sun, 4 Feb 2018 00:52:51 -0500 Subject: [PATCH 135/711] Update tut0.rst with improved instructions for windows installs (#120) --- tutorials/tut0.rst | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/tutorials/tut0.rst b/tutorials/tut0.rst index 6348f8e187..1979de8122 100644 --- a/tutorials/tut0.rst +++ b/tutorials/tut0.rst @@ -83,8 +83,11 @@ If everything is working correctly it will print out its version and information
Windows -

It isn't fun. Learn more here.

-

It might be easier to execute PostgREST in its own Docker image as well.

+

All of the DLL files that are required to run PostgREST are available in the windows installation of PostgreSQL server. + Once installed they are found in the BIN folder, e.g: C:\Program Files\PostgreSQL\10\bin. Add this directory to your PATH + variable. Run the following from an administrative command prompt (adjusting the actual BIN path as necessary of course) +

setx /m PATH "%PATH%;C:\Program Files\PostgreSQL\10\bin"
+

From 16cf1ef45c32d309691c014085392118a2b29d31 Mon Sep 17 00:00:00 2001 From: Christopher Bowman Date: Fri, 9 Mar 2018 20:42:01 -0500 Subject: [PATCH 136/711] Replace 'to to ' with 'to the ' (#122) --- tutorials/tut0.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tutorials/tut0.rst b/tutorials/tut0.rst index 1979de8122..dc3d6b1017 100644 --- a/tutorials/tut0.rst +++ b/tutorials/tut0.rst @@ -94,7 +94,7 @@ If everything is working correctly it will print out its version and information Step 4. Create Database for API ------------------------------- -Connect to to SQL console (psql) inside the container. To do so, run this from your command line: +Connect to the SQL console (psql) inside the container. To do so, run this from your command line: .. code-block:: bash From 7b2ab948bebc30cb3c6eff4aeb4943340c496a84 Mon Sep 17 00:00:00 2001 From: Joe Nelson Date: Sun, 11 Mar 2018 12:26:16 -0500 Subject: [PATCH 137/711] Schema auto-reload instructions (#124) --- admin.rst | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/admin.rst b/admin.rst index d6408aa9f5..b47e93853e 100644 --- a/admin.rst +++ b/admin.rst @@ -177,7 +177,29 @@ To refresh the cache without restarting the PostgREST server, send the server pr killall -HUP postgrest -In the future we're investigating ways to keep the cache updated without manual intervention. +The above is the manual way to do it. To automate the schema reloads, use a database trigger like this: + +.. code-block:: postgresql + + CREATE OR REPLACE FUNCTION public.notify_ddl_postgrest() + RETURNS event_trigger + LANGUAGE plpgsql + AS $$ + BEGIN + NOTIFY ddl_command_end; + END; + $$; + + CREATE EVENT TRIGGER ddl_postgrest ON ddl_command_end + EXECUTE PROCEDURE public.notify_ddl_postgrest(); + +Then run the `pg_listen `_ utility to monitor for that event and send a SIGHUP when it occurs: + +.. code-block:: bash + + pg_listen ddl_command_end "killall -HUP postgrest" + +Now, whenever the structure of the database schema changes, PostgreSQL will notify the ``ddl_command_end`` channel, which will cause ``pg_listen`` to send PostgREST the signal to reload its cache. Alternate URL Structure ======================= From 0bae76f05ecfa2a1befb7c2728cc75337577112d Mon Sep 17 00:00:00 2001 From: Thomas Date: Wed, 14 Mar 2018 18:12:03 +0100 Subject: [PATCH 138/711] Remove iAdvize from In Production list (#125) --- intro.rst | 1 - 1 file changed, 1 deletion(-) diff --git a/intro.rst b/intro.rst index 317c5faaf8..a8e78ed557 100644 --- a/intro.rst +++ b/intro.rst @@ -91,7 +91,6 @@ In Production * `Moat `_ * `Catarse `_ -* `iAdvize `_ * `Redsmin `_ * `Image-charts `_ * `Drip Depot `_ From 1fb9e34c9cd9091531a922b76bc9237b619f93b3 Mon Sep 17 00:00:00 2001 From: Joe Nelson Date: Thu, 29 Mar 2018 00:40:54 -0500 Subject: [PATCH 139/711] Add new oauth server --- intro.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/intro.rst b/intro.rst index a8e78ed557..0e2307b5b9 100644 --- a/intro.rst +++ b/intro.rst @@ -105,6 +105,7 @@ Extensions * `pg-safeupdate `_ - Prevent full-table updates or deletes * `srid/spas `_ - allow file uploads and basic auth * `svmnotn/postgrest-auth `_ - OAuth2-inspired external auth server +* `wildsurfer/postgrest-oauth-server `_ - OAuth2 server * `nblumoe/postgrest-oauth `_ - OAuth2 WAI middleware * `criles25/postgrest-auth `_ - email based auth/signup * `ppKrauss/PostgREST-writeAPI `_ - generate Nginx rewrite rules to fit an OpenAPI spec From 88e3c8c4b6291fb6f3c9ad522234f7b4d88bb158 Mon Sep 17 00:00:00 2001 From: Hasan Pekdemir Date: Fri, 4 May 2018 16:15:02 +0200 Subject: [PATCH 140/711] add triggerfs to production apps in examples --- intro.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/intro.rst b/intro.rst index 0e2307b5b9..ac0da6e35e 100644 --- a/intro.rst +++ b/intro.rst @@ -89,6 +89,7 @@ Example Apps In Production ------------- +* `triggerFS - A realtime messaging and distributed trigger system `_ * `Moat `_ * `Catarse `_ * `Redsmin `_ From 28c39e976c1d792d6c7d4f8353ba5d557fea1b1f Mon Sep 17 00:00:00 2001 From: Ken Fehling Date: Mon, 21 May 2018 05:04:20 -0400 Subject: [PATCH 141/711] Update docker-compose example to version 3 Adds "depends_on" --- install.rst | 41 ++++++++++++++++++++++------------------- 1 file changed, 22 insertions(+), 19 deletions(-) diff --git a/install.rst b/install.rst index 90e612bbb8..95152e191a 100644 --- a/install.rst +++ b/install.rst @@ -203,25 +203,28 @@ To avoid having to install the database at all, you can run both it and the serv # docker-compose.yml - server: - image: postgrest/postgrest - ports: - - "3000:3000" - links: - - db:db - environment: - PGRST_DB_URI: postgres://app_user:password@db:5432/app_db - PGRST_DB_SCHEMA: public - PGRST_DB_ANON_ROLE: app_user - - db: - image: postgres - ports: - - "5432:5432" - environment: - POSTGRES_DB: app_db - POSTGRES_USER: app_user - POSTGRES_PASSWORD: password + version: '3' + services: + server: + image: postgrest/postgrest + ports: + - "3000:3000" + links: + - db:db + environment: + PGRST_DB_URI: postgres://app_user:password@db:5432/app_db + PGRST_DB_SCHEMA: public + PGRST_DB_ANON_ROLE: app_user + depends_on: + - db + db: + image: postgres + ports: + - "5432:5432" + environment: + POSTGRES_DB: app_db + POSTGRES_USER: app_user + POSTGRES_PASSWORD: password Go into the directory where you saved this file and run :code:`docker-compose up`. You will see the logs of both the database and PostgREST, and be able to access the latter on port 3000. From e0e4d68185dd56880b36c2349570f6874e33f66f Mon Sep 17 00:00:00 2001 From: agent3bood Date: Wed, 23 May 2018 17:43:28 +0400 Subject: [PATCH 142/711] update PGRST_DB_ANON_ROLE in docker-compose anon should not be the default db user --- install.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install.rst b/install.rst index 95152e191a..2cb7186fff 100644 --- a/install.rst +++ b/install.rst @@ -214,7 +214,7 @@ To avoid having to install the database at all, you can run both it and the serv environment: PGRST_DB_URI: postgres://app_user:password@db:5432/app_db PGRST_DB_SCHEMA: public - PGRST_DB_ANON_ROLE: app_user + PGRST_DB_ANON_ROLE: app_user #In production this role should not be the same as the one used for the connection depends_on: - db db: From b32ba7a409a984d1ea3e614dc7ae958b47d7a8c7 Mon Sep 17 00:00:00 2001 From: agent3bood Date: Wed, 23 May 2018 17:46:13 +0400 Subject: [PATCH 143/711] Add volume to docker-compose --- install.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/install.rst b/install.rst index 2cb7186fff..c54ebdd175 100644 --- a/install.rst +++ b/install.rst @@ -225,6 +225,9 @@ To avoid having to install the database at all, you can run both it and the serv POSTGRES_DB: app_db POSTGRES_USER: app_user POSTGRES_PASSWORD: password + # Uncomment this if you want to persist the data. + # volumes: + # - "./pgdata:/var/lib/postgresql/data" Go into the directory where you saved this file and run :code:`docker-compose up`. You will see the logs of both the database and PostgREST, and be able to access the latter on port 3000. From 736a5020b034b29bf2fd30c5423789bcd2fb8302 Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Wed, 23 May 2018 13:00:00 -0500 Subject: [PATCH 144/711] Add app.settings.* config value feature --- install.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/install.rst b/install.rst index c54ebdd175..c5c81e17ac 100644 --- a/install.rst +++ b/install.rst @@ -83,6 +83,7 @@ jwt-aud String secret-is-base64 Bool False max-rows Int ∞ pre-request String +app.settings.* String ================ ====== ======= ======== db-uri @@ -133,6 +134,8 @@ max-rows A hard limit to the number of rows PostgREST will fetch from a view, table, or stored procedure. Limits payload size for accidental or malicious requests. pre-request A schema-qualified stored procedure name to call right after switching roles for a client request. This provides an opportunity to modify SQL variables or raise an exception to prevent the request from completing. +app.settings.* + Arbitrary settings that will become database session settings. This can be used to pass in secret keys directly as strings, or via OS environment variables. For instance: :code:`app.settings.jwt_secret = "$(MYAPP_JWT_SECRET)"` will take :code:`MYAPP_JWT_SECRET` from the environment and make it available to postgresql functions as :code:`current_setting('app.settings.jwt_secret')`. Running the Server ------------------ From e56313196ba147a2fee858489c6ab1709f9a19e0 Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Wed, 23 May 2018 13:49:06 -0500 Subject: [PATCH 145/711] Add role-claim-key feature --- install.rst | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/install.rst b/install.rst index c5c81e17ac..f8cae8bb86 100644 --- a/install.rst +++ b/install.rst @@ -84,6 +84,7 @@ secret-is-base64 Bool False max-rows Int ∞ pre-request String app.settings.* String +role-claim-key String .role ================ ====== ======= ======== db-uri @@ -136,6 +137,18 @@ pre-request A schema-qualified stored procedure name to call right after switching roles for a client request. This provides an opportunity to modify SQL variables or raise an exception to prevent the request from completing. app.settings.* Arbitrary settings that will become database session settings. This can be used to pass in secret keys directly as strings, or via OS environment variables. For instance: :code:`app.settings.jwt_secret = "$(MYAPP_JWT_SECRET)"` will take :code:`MYAPP_JWT_SECRET` from the environment and make it available to postgresql functions as :code:`current_setting('app.settings.jwt_secret')`. +role-claim-key + A JSPath DSL that specifies the location of the :code:`role` key in the JWT claims. This can be used to consume a JWT provided by a third party service like Auth0, Okta or Keycloak. Some examples: + +.. code:: bash + + # {"postgrest":{"roles": ["other", "author"]}} + # the DSL accepts characters that are alphanumerical or one of "_$@" as keys + role-claim-key = ".postgrest.roles[1]" + + # {"https://www.example.com/role": { "key": "author }} + # non-alphanumerical characters can go inside quotes(escaped in config value) + role-claim-key = ".\"https://www.example.com/role\".key" Running the Server ------------------ From 6f0a25520a42296417142b71ccaadf479a8daa2c Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Thu, 24 May 2018 10:12:23 -0500 Subject: [PATCH 146/711] Add UPSERT feature --- api.rst | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/api.rst b/api.rst index 78d51da1a7..778c0d44f9 100644 --- a/api.rst +++ b/api.rst @@ -694,6 +694,38 @@ To bulk insert JSON post an array of objects having all-matching keys { "name": "Janus", "age": 10, "height": 55 } ] +Upsert +------ + +You can make an UPSERT with :code:`POST` and the :code:`Prefer: resolution=merge-duplicates` header: + +.. code:: HTTP + + POST /employees HTTP/1.1 + Prefer: resolution=merge-duplicates + + [ + { "id": 1, "name": "Old employee 1", "salary": 30000 }, + { "id": 2, "name": "Old employee 2" , "salary": 42000 }, + { "id": 3, "name": "New employee 3" , "salary": 50000 } + ] + +UPSERT merging operates based on the primary key columns, you must specify all of them. You can also choose to ignore the duplicates with :code:`Prefer: resolution=ignore-duplicates`. + +A single row UPSERT can be done by using :code:`PUT` and filtering the primary key columns with :code:`eq`: + +.. code:: HTTP + + PUT /employees?id=eq.4 HTTP/1.1 + + { "id": 4, "name": "Sara B.", "salary": 60000 } + +All the columns must be specified in the request body, including the primary key columns. + +.. note:: + + This feature is only available starting from PostgreSQL 9.5 since it uses the `ON CONFLICT clause `_. + Deletions ========= From 2f699fa115abb32d3c911fb28b16661d623bad15 Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Thu, 24 May 2018 11:37:00 -0500 Subject: [PATCH 147/711] Add foreign tables in OpenAPI feature --- api.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/api.rst b/api.rst index 778c0d44f9..7367227344 100644 --- a/api.rst +++ b/api.rst @@ -742,7 +742,7 @@ To delete rows in a table, use the DELETE verb plus :ref:`h_filter`. For instanc OpenAPI Support =============== -Every API hosted by PostgREST automatically serves a full `OpenAPI `_ description on the root path. This provides a list of all endpoints, along with supported HTTP verbs and example payloads. For extra customization, the OpenAPI output contains a "description" field for every `SQL comment `_ on a table, column, or function. For instance, +Every API hosted by PostgREST automatically serves a full `OpenAPI `_ description on the root path. This provides a list of all endpoints(tables, foreign tables, views, functions), along with supported HTTP verbs and example payloads. For extra customization, the OpenAPI output contains a "description" field for every `SQL comment `_ on a table, column, or function. For instance, .. code-block:: sql From dbec5e08aa29c43eafb608f54ec2768defabd9d4 Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Thu, 24 May 2018 12:06:00 -0500 Subject: [PATCH 148/711] Fix #131, SCHEMA comment and summary/description --- api.rst | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/api.rst b/api.rst index 7367227344..952f873407 100644 --- a/api.rst +++ b/api.rst @@ -742,17 +742,31 @@ To delete rows in a table, use the DELETE verb plus :ref:`h_filter`. For instanc OpenAPI Support =============== -Every API hosted by PostgREST automatically serves a full `OpenAPI `_ description on the root path. This provides a list of all endpoints(tables, foreign tables, views, functions), along with supported HTTP verbs and example payloads. For extra customization, the OpenAPI output contains a "description" field for every `SQL comment `_ on a table, column, or function. For instance, +Every API hosted by PostgREST automatically serves a full `OpenAPI `_ description on the root path. This provides a list of all endpoints(tables, foreign tables, views, functions), along with supported HTTP verbs and example payloads. For extra customization, the OpenAPI output contains a "description" field for every `SQL comment `_ on any database object. For instance, .. code-block:: sql + COMMENT ON SCHEMA mammals IS + 'A warm-blooded vertebrate animal of a class that is distinguished by the secretion of milk by females for the nourishment of the young'; + COMMENT ON TABLE monotremes IS 'Freakish mammals lay the best eggs for breakfast'; COMMENT ON COLUMN monotremes.has_venomous_claw IS 'Sometimes breakfast is not worth it'; -These unsavory comments will appear in the generated JSON as the fields ``definitions.monotremes.description`` and ``definitions.monotremes.properties.has_venomous_claw.description``. +These unsavory comments will appear in the generated JSON as the fields, ``info.description``, ``definitions.monotremes.description`` and ``definitions.monotremes.properties.has_venomous_claw.description``. + +Also if you wish to generate a ``summary`` field you can do it by having a multiple line comment, the ``summary`` will be the first line and the ``description`` the lines that follow it: + +.. code-block:: sql + + COMMENT ON TABLE entities IS + $$Entities summary + + Entities description that + spans + multiple lines$$; You can use a tool like `Swagger UI `_ to create beautiful documentation from the description and to host an interactive web-based dashboard. The dashboard allows developers to make requests against a live PostgREST server, and provides guidance with request headers and example request bodies. From c0f8e64bbb404886221385bc63482701ccd2fa28 Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Thu, 24 May 2018 12:47:52 -0500 Subject: [PATCH 149/711] Add limit/offset and and/or to embedded resources --- api.rst | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/api.rst b/api.rst index 952f873407..c42d7a7efa 100644 --- a/api.rst +++ b/api.rst @@ -458,10 +458,10 @@ PostgREST can also detect relations going through join tables. Thus you can requ Whenever foreign key relations change in the database schema you must refresh PostgREST's schema cache to allow resource embedding to work properly. See the section :ref:`schema_reloading`. -Embedded Filters and Order --------------------------- +Operations on Embedded Resources +-------------------------------- -Embedded tables can be filtered and ordered similarly to their top-level counterparts. To do so, prefix the query parameters with the name of the embedded table. For instance, to order the actors in each film: +Embedded resources rows can be shaped similarly to their top-level counterparts. To do so, prefix the query parameters with the name of the embedded resource. For instance, to order the actors in each film: .. code-block:: http @@ -475,6 +475,17 @@ This sorts the list of actors in each film but does *not* change the order of th Once again, this restricts the roles included to certain characters but does not filter the films in any way. Films without any of those characters would be included along with empty character lists. +An ``or`` filter can also be used for a similar operation: + +.. code-block:: http + + GET /films?select=*,roles(*)&roles.or=(character.eq.Gummo,character.eq.Zeppo) HTTP/1.1 + +Limit and offset operations are also possible: + +.. code-block:: http + + GET /films?select=*,actors(*)&actors.limit=10&actors.offset=2 HTTP/1.1 Custom Queries ============== From 1108aede5bd73597562fe4b2b6071401c04fd124 Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Thu, 24 May 2018 12:51:00 -0500 Subject: [PATCH 150/711] Install only necessary deps for BSD and OSX --- install.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/install.rst b/install.rst index f8cae8bb86..1e3a58ebdd 100644 --- a/install.rst +++ b/install.rst @@ -266,8 +266,8 @@ When a pre-built binary does not exist for your system you can build the project ===================== ======================================= Ubuntu/Debian libpq-dev, libgmp-dev CentOS/Fedora/Red Hat postgresql-devel, zlib-devel, gmp-devel - BSD postgresql95-server - OS X postgresql, gmp + BSD postgresql95-client + OS X libpq, gmp ===================== ======================================= * Build and install binary From 79487307708f8559b4fab007f4627567ba096eb9 Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Thu, 24 May 2018 13:10:17 -0500 Subject: [PATCH 151/711] Add embeds alias feature --- api.rst | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/api.rst b/api.rst index c42d7a7efa..861af8dcf5 100644 --- a/api.rst +++ b/api.rst @@ -487,6 +487,12 @@ Limit and offset operations are also possible: GET /films?select=*,actors(*)&actors.limit=10&actors.offset=2 HTTP/1.1 +You can also alias the embedded resources and apply filters on the aliases: + +.. code-block:: http + + GET /films?select=*,90_comps:competitions(name),91_comps:competitions(name)&90_comps.year=eq.1990&91_comps.year=eq.1991 HTTP/1.1 + Custom Queries ============== From 5e856a22a85f3e8b7721a205fdfd0045d0fe5d5a Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Fri, 25 May 2018 11:36:45 -0500 Subject: [PATCH 152/711] Fix #132, remove deprecation notices --- api.rst | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/api.rst b/api.rst index 861af8dcf5..752b7c7de5 100644 --- a/api.rst +++ b/api.rst @@ -79,12 +79,6 @@ adj is adjacent to, e.g. :code:`?range=adj.(1,10)` :code:`-|-` not negates another operator, see below :code:`NOT` ============ =============================================== ===================== -.. note:: - - As of PostgREST v0.4.3.0, the symbol operators :code:`@@, @>, <@` have been - deprecated in lieu of their mnemonic equivalents. They are still supported - but will be removed in v0.5.0.0. - To negate any operator, prefix it with :code:`not` like :code:`?a=not.eq.2` or :code:`?not.and=(a.gte.0,a.lte.100)` . For more complicated filters you will have to create a new view in the database, or use a stored procedure. For instance, here's a view to show "today's stories" including possibly older pinned stories: @@ -444,10 +438,6 @@ this: GET /films?select=title,director:directors(id,last_name) HTTP/1.1 -.. note:: - - As of PostgREST v0.4.1.0, parens :code:`()` are used rather than brackets :code:`{}` for the list of embedded columns. Brackets are still supported, but are deprecated and will be removed in v0.5.0.0. - PostgREST can also detect relations going through join tables. Thus you can request the Actors for Films (which in this case finds the information through Roles). You can also reverse the direction of inclusion, asking for all Directors with each including the list of their Films: .. code-block:: http From 6e7a2ca26ceef686a0897b0f7ec0315833846723 Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Fri, 25 May 2018 12:02:23 -0500 Subject: [PATCH 153/711] Fix #135, clarify usage of GET/POST RPC --- api.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/api.rst b/api.rst index 752b7c7de5..979874e56a 100644 --- a/api.rst +++ b/api.rst @@ -529,7 +529,7 @@ Because ``add_them`` is declared IMMUTABLE, we can alternately call the function GET /rpc/add_them?a=1&b=2 HTTP/1.1 -For POST and GET the keys of the object match the parameter names. Note that PostgreSQL converts parameter names to lowercase unless you quote them like :sql:`CREATE FUNCTION foo("mixedCase" text) ...`. You can also call a function that takes a single parameter of type json by sending the header :code:`Prefer: params=single-object` with your request. That way the JSON request body will be used as the single argument. +The function parameter names match the JSON object keys in the POST case, for the GET case they match the query parameters ``?a=1&b=2``. Note that PostgreSQL converts parameter names to lowercase unless you quote them like :sql:`CREATE FUNCTION foo("mixedCase" text) ...`. You can also call a function that takes a single parameter of type json by sending the header :code:`Prefer: params=single-object` with your request. That way the JSON request body will be used as the single argument. .. note:: From 7255f026108c242e5c8ebe0cbda3d8bbc6295462 Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Fri, 25 May 2018 12:18:32 -0500 Subject: [PATCH 154/711] Fix #126, update note about arrays --- api.rst | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/api.rst b/api.rst index 979874e56a..270ccfd0fc 100644 --- a/api.rst +++ b/api.rst @@ -533,7 +533,7 @@ The function parameter names match the JSON object keys in the POST case, for th .. note:: - We recommend using function arguments of type json to accept arrays from the client. To pass a PostgreSQL native array you'll need to quote it as a string: + For versions prior to PostgreSQL 10, to pass a PostgreSQL native array you'll need to quote it as a string: .. code:: http @@ -541,12 +541,16 @@ The function parameter names match the JSON object keys in the POST case, for th { "arg": "{1,2,3}" } + In these versions we recommend using function arguments of type json to accept arrays from the client: + .. code:: http POST /rpc/json_array_func HTTP/1.1 { "arg": [1,2,3] } + Starting from PostgreSQL 10, a json array from the client gets mapped normally to a PostgreSQL native array. + PostgreSQL has four procedural languages that are part of the core distribution: PL/pgSQL, PL/Tcl, PL/Perl, and PL/Python. There are many other procedural languages distributed as additional extensions. Also, plain SQL can be used to write functions (as shown in the example above). By default, a function is executed with the privileges of the user who calls it. This means that the user has to have all permissions to do the operations the procedure performs. Another option is to define the function with with the :code:`SECURITY DEFINER` option. Then only one permission check will take place, the permission to call the function, and the operations in the function will have the authority of the user who owns the function itself. See `PostgreSQL documentation `_ for more details. From 121f192b9321c37e6865358a7e343fafa53c7449 Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Fri, 25 May 2018 13:27:33 -0500 Subject: [PATCH 155/711] Fix #127, RPC cache dependency --- api.rst | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/api.rst b/api.rst index 270ccfd0fc..0130d4c48c 100644 --- a/api.rst +++ b/api.rst @@ -551,6 +551,28 @@ The function parameter names match the JSON object keys in the POST case, for th Starting from PostgreSQL 10, a json array from the client gets mapped normally to a PostgreSQL native array. +PostgREST will detect if the function is scalar or table-valued and will shape the response format accordingly: + +.. code:: http + + GET /rpc/add_them?a=1&b=2 HTTP/1.1 + + 3 + +.. code:: http + + GET /rpc/best_films_2017 HTTP/1.1 + + [ + { "title": "Okja", "rating": 7.4}, + { "title": "Call me by your name", "rating": 8}, + { "title": "Blade Runner 2049", "rating": 8.1} + ] + +.. note:: + + Whenever the function definition changes you must refresh PostgREST's schema for this to work properly. See the section :ref:`schema_reloading`. + PostgreSQL has four procedural languages that are part of the core distribution: PL/pgSQL, PL/Tcl, PL/Perl, and PL/Python. There are many other procedural languages distributed as additional extensions. Also, plain SQL can be used to write functions (as shown in the example above). By default, a function is executed with the privileges of the user who calls it. This means that the user has to have all permissions to do the operations the procedure performs. Another option is to define the function with with the :code:`SECURITY DEFINER` option. Then only one permission check will take place, the permission to call the function, and the operations in the function will have the authority of the user who owns the function itself. See `PostgreSQL documentation `_ for more details. From ed028234ccff257d1e2b5ffd73a82beaa13eb3dc Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Fri, 25 May 2018 13:39:01 -0500 Subject: [PATCH 156/711] Add example of filtering function response --- api.rst | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/api.rst b/api.rst index 0130d4c48c..0bf4153e5e 100644 --- a/api.rst +++ b/api.rst @@ -573,6 +573,12 @@ PostgREST will detect if the function is scalar or table-valued and will shape t Whenever the function definition changes you must refresh PostgREST's schema for this to work properly. See the section :ref:`schema_reloading`. +A function response can be shaped using the same filters as the ones used for tables and views: + +.. code:: http + + GET /rpc/top_rated_films?select=title,director:directors(*)&year=eq.1990&order=title.desc HTTP/1.1 + PostgreSQL has four procedural languages that are part of the core distribution: PL/pgSQL, PL/Tcl, PL/Perl, and PL/Python. There are many other procedural languages distributed as additional extensions. Also, plain SQL can be used to write functions (as shown in the example above). By default, a function is executed with the privileges of the user who calls it. This means that the user has to have all permissions to do the operations the procedure performs. Another option is to define the function with with the :code:`SECURITY DEFINER` option. Then only one permission check will take place, the permission to call the function, and the operations in the function will have the authority of the user who owns the function itself. See `PostgreSQL documentation `_ for more details. From 036cc1c5d74ba6a6732b2105cc1ef30b7126c089 Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Fri, 25 May 2018 14:10:54 -0500 Subject: [PATCH 157/711] Fix #107, Alias column with `:` --- api.rst | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/api.rst b/api.rst index 0bf4153e5e..9fff46ea50 100644 --- a/api.rst +++ b/api.rst @@ -44,7 +44,7 @@ Complex logic can also be applied: .. code-block:: http GET /people?and=(grade.gte.90,student.is.true,or(age.gte.14,age.is.null)) HTTP/1.1 - + These operators are available: ============ =============================================== ===================== @@ -131,10 +131,25 @@ When certain columns are wide (such as those holding binary data), it is more ef .. code-block:: http - GET /people?select=fname,age HTTP/1.1 + GET /people?select=first_name,age HTTP/1.1 + + [ + {"first_name": "John", "age": 30}, + {"first_name": "Jane", "age": 20} + ] The default is :sql:`*`, meaning all columns. This value will become more important below in :ref:`resource_embedding`. +You can rename the columns by prefixing them with an alias followed by the colon ``:`` operator. + +.. code-block:: http + + GET /people?select=fullName:full_name,birthDate:birth_date HTTP/1.1 + [ + {"fullName": "John Doe", "birthDate": "04/25/1988"}, + {"fullName": "Jane Doe", "birthDate": "01/12/1998"} + ] + .. _computed_cols: Computed Columns From 338e8a1ae39fe8197b9329473b6114c898c8c58f Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Fri, 25 May 2018 14:25:01 -0500 Subject: [PATCH 158/711] Add casting example --- api.rst | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/api.rst b/api.rst index 9fff46ea50..9afb86a873 100644 --- a/api.rst +++ b/api.rst @@ -150,6 +150,16 @@ You can rename the columns by prefixing them with an alias followed by the colon {"fullName": "Jane Doe", "birthDate": "01/12/1998"} ] +Casting the columns is possible by suffixing them with the double colon ``::`` plus the desired type. + +.. code-block:: http + + GET /people?select=full_name,salary::text HTTP/1.1 + [ + {"fullName": "John Doe", "salary": "90000.00"}, + {"fullName": "Jane Doe", "salary": "120000.00"} + ] + .. _computed_cols: Computed Columns From 625a0b2393e22efccbc049e300092699f03b955a Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Fri, 25 May 2018 17:31:28 -0500 Subject: [PATCH 159/711] Fix #136, sslmode on db-uri --- install.rst | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/install.rst b/install.rst index 1e3a58ebdd..5355d3b8c8 100644 --- a/install.rst +++ b/install.rst @@ -88,7 +88,9 @@ role-claim-key String .role ================ ====== ======= ======== db-uri - The standard connection PostgreSQL `URI format `_. Symbols and unusual characters in the password or other fields should be percent encoded to avoid a parse error. On older systems like Centos 6, with older versions of libpq, a different db-uri syntax has to be used. In this case the URI is a string of space separated key-value pairs (key=value), so the example above would be :code:`"host=host user=user port=5432 dbname=dbname password=pass"`. Also allows connections over Unix sockets for higher performance. + The standard connection PostgreSQL `URI format `_. Symbols and unusual characters in the password or other fields should be percent encoded to avoid a parse error. If enforcing an SSL connection to the database is required you can use `sslmode `_ in the URI, for example ``postgres://user:pass@host:5432/dbname?sslmode=require``. + + On older systems like Centos 6, with older versions of libpq, a different db-uri syntax has to be used. In this case the URI is a string of space separated key-value pairs (key=value), so the example above would be :code:`"host=host user=user port=5432 dbname=dbname password=pass"`. db-schema The database schema to expose to REST clients. Tables, views and stored procedures in this schema will get API endpoints. db-anon-role From b11f9ef38666e9d257f75ac92b28883a962d219a Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Fri, 25 May 2018 17:54:45 -0500 Subject: [PATCH 160/711] Fix #137, unix socket connection --- api.rst | 2 ++ install.rst | 2 ++ 2 files changed, 4 insertions(+) diff --git a/api.rst b/api.rst index 9afb86a873..3422e194d7 100644 --- a/api.rst +++ b/api.rst @@ -145,6 +145,7 @@ You can rename the columns by prefixing them with an alias followed by the colon .. code-block:: http GET /people?select=fullName:full_name,birthDate:birth_date HTTP/1.1 + [ {"fullName": "John Doe", "birthDate": "04/25/1988"}, {"fullName": "Jane Doe", "birthDate": "01/12/1998"} @@ -155,6 +156,7 @@ Casting the columns is possible by suffixing them with the double colon ``::`` p .. code-block:: http GET /people?select=full_name,salary::text HTTP/1.1 + [ {"fullName": "John Doe", "salary": "90000.00"}, {"fullName": "Jane Doe", "salary": "120000.00"} diff --git a/install.rst b/install.rst index 5355d3b8c8..d50e7286ab 100644 --- a/install.rst +++ b/install.rst @@ -90,6 +90,8 @@ role-claim-key String .role db-uri The standard connection PostgreSQL `URI format `_. Symbols and unusual characters in the password or other fields should be percent encoded to avoid a parse error. If enforcing an SSL connection to the database is required you can use `sslmode `_ in the URI, for example ``postgres://user:pass@host:5432/dbname?sslmode=require``. + When running PostgREST on the same machine as PostgreSQL, it is also possible to connect to the database using a `Unix socket `_ and the `Peer Authentication method `_ as an alternative to TCP/IP communication and authentication with a password, this also grants higher performance. According to the documentation on the `libpq connection string `_ the empty host resolves to the Unix socket and the password can be omitted in this case, so the ``db-uri`` would be reduced to ``postgres://user@/dbname``. + On older systems like Centos 6, with older versions of libpq, a different db-uri syntax has to be used. In this case the URI is a string of space separated key-value pairs (key=value), so the example above would be :code:`"host=host user=user port=5432 dbname=dbname password=pass"`. db-schema The database schema to expose to REST clients. Tables, views and stored procedures in this schema will get API endpoints. From c71bbba979082240c7ab9cfacb52e43173d3681d Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Mon, 28 May 2018 17:25:21 -0500 Subject: [PATCH 161/711] Some corrections and better wording --- api.rst | 24 ++++++++++++------------ install.rst | 6 +++--- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/api.rst b/api.rst index 3422e194d7..827eddd73f 100644 --- a/api.rst +++ b/api.rst @@ -158,8 +158,8 @@ Casting the columns is possible by suffixing them with the double colon ``::`` p GET /people?select=full_name,salary::text HTTP/1.1 [ - {"fullName": "John Doe", "salary": "90000.00"}, - {"fullName": "Jane Doe", "salary": "120000.00"} + {"full_name": "John Doe", "salary": "90000.00"}, + {"full_name": "Jane Doe", "salary": "120000.00"} ] .. _computed_cols: @@ -475,10 +475,10 @@ PostgREST can also detect relations going through join tables. Thus you can requ Whenever foreign key relations change in the database schema you must refresh PostgREST's schema cache to allow resource embedding to work properly. See the section :ref:`schema_reloading`. -Operations on Embedded Resources --------------------------------- +Embedded Operations +------------------- -Embedded resources rows can be shaped similarly to their top-level counterparts. To do so, prefix the query parameters with the name of the embedded resource. For instance, to order the actors in each film: +Embedded resources can be shaped similarly to their top-level counterparts. To do so, prefix the query parameters with the name of the embedded resource. For instance, to order the actors in each film: .. code-block:: http @@ -492,19 +492,19 @@ This sorts the list of actors in each film but does *not* change the order of th Once again, this restricts the roles included to certain characters but does not filter the films in any way. Films without any of those characters would be included along with empty character lists. -An ``or`` filter can also be used for a similar operation: +An ``or`` filter can be used for a similar operation: .. code-block:: http GET /films?select=*,roles(*)&roles.or=(character.eq.Gummo,character.eq.Zeppo) HTTP/1.1 -Limit and offset operations are also possible: +Limit and offset operations are possible: .. code-block:: http GET /films?select=*,actors(*)&actors.limit=10&actors.offset=2 HTTP/1.1 -You can also alias the embedded resources and apply filters on the aliases: +Embedded resources can be aliased and filters can be applied on these aliases: .. code-block:: http @@ -560,7 +560,7 @@ The function parameter names match the JSON object keys in the POST case, for th .. note:: - For versions prior to PostgreSQL 10, to pass a PostgreSQL native array you'll need to quote it as a string: + For versions prior to PostgreSQL 10, to pass a PostgreSQL native array you need to quote it as a string: .. code:: http @@ -772,11 +772,11 @@ You can make an UPSERT with :code:`POST` and the :code:`Prefer: resolution=merge [ { "id": 1, "name": "Old employee 1", "salary": 30000 }, - { "id": 2, "name": "Old employee 2" , "salary": 42000 }, - { "id": 3, "name": "New employee 3" , "salary": 50000 } + { "id": 2, "name": "Old employee 2", "salary": 42000 }, + { "id": 3, "name": "New employee 3", "salary": 50000 } ] -UPSERT merging operates based on the primary key columns, you must specify all of them. You can also choose to ignore the duplicates with :code:`Prefer: resolution=ignore-duplicates`. +UPSERT operates based on the primary key columns, you must specify all of them. You can also choose to ignore the duplicates with :code:`Prefer: resolution=ignore-duplicates`. A single row UPSERT can be done by using :code:`PUT` and filtering the primary key columns with :code:`eq`: diff --git a/install.rst b/install.rst index d50e7286ab..36ad6fb9f9 100644 --- a/install.rst +++ b/install.rst @@ -90,7 +90,7 @@ role-claim-key String .role db-uri The standard connection PostgreSQL `URI format `_. Symbols and unusual characters in the password or other fields should be percent encoded to avoid a parse error. If enforcing an SSL connection to the database is required you can use `sslmode `_ in the URI, for example ``postgres://user:pass@host:5432/dbname?sslmode=require``. - When running PostgREST on the same machine as PostgreSQL, it is also possible to connect to the database using a `Unix socket `_ and the `Peer Authentication method `_ as an alternative to TCP/IP communication and authentication with a password, this also grants higher performance. According to the documentation on the `libpq connection string `_ the empty host resolves to the Unix socket and the password can be omitted in this case, so the ``db-uri`` would be reduced to ``postgres://user@/dbname``. + When running PostgREST on the same machine as PostgreSQL, it is also possible to connect to the database using a `Unix socket `_ and the `Peer Authentication method `_ as an alternative to TCP/IP communication and authentication with a password, this also grants higher performance. To do this you can omit the host and the password, e.g. ``postgres://user@/dbname``, see the `libpq connection string `_ documentation for more details. On older systems like Centos 6, with older versions of libpq, a different db-uri syntax has to be used. In this case the URI is a string of space separated key-value pairs (key=value), so the example above would be :code:`"host=host user=user port=5432 dbname=dbname password=pass"`. db-schema @@ -142,7 +142,7 @@ pre-request app.settings.* Arbitrary settings that will become database session settings. This can be used to pass in secret keys directly as strings, or via OS environment variables. For instance: :code:`app.settings.jwt_secret = "$(MYAPP_JWT_SECRET)"` will take :code:`MYAPP_JWT_SECRET` from the environment and make it available to postgresql functions as :code:`current_setting('app.settings.jwt_secret')`. role-claim-key - A JSPath DSL that specifies the location of the :code:`role` key in the JWT claims. This can be used to consume a JWT provided by a third party service like Auth0, Okta or Keycloak. Some examples: + A JSPath DSL that specifies the location of the :code:`role` key in the JWT claims. This can be used to consume a JWT provided by a third party service like Auth0, Okta or Keycloak. Usage examples: .. code:: bash @@ -151,7 +151,7 @@ role-claim-key role-claim-key = ".postgrest.roles[1]" # {"https://www.example.com/role": { "key": "author }} - # non-alphanumerical characters can go inside quotes(escaped in config value) + # non-alphanumerical characters can go inside quotes(escaped in the config value) role-claim-key = ".\"https://www.example.com/role\".key" Running the Server From d03770d352a748941cacf3fe84efe7b4c10385d7 Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Mon, 28 May 2018 17:37:11 -0500 Subject: [PATCH 162/711] Bump version to v5.0.0 --- conf.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/conf.py b/conf.py index 2a9c6b8579..05837e17db 100644 --- a/conf.py +++ b/conf.py @@ -54,9 +54,9 @@ # built documents. # # The short X.Y version. -version = u'4.4' +version = u'5.0' # The full version, including alpha/beta/rc tags. -release = u'4.4.0' +release = u'5.0.0' # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. From f84b79ce4132389814f285ff6f1939b29fe7d12b Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Thu, 31 May 2018 09:03:24 -0500 Subject: [PATCH 163/711] Add stored function explicit qualification --- api.rst | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/api.rst b/api.rst index 827eddd73f..d109081408 100644 --- a/api.rst +++ b/api.rst @@ -608,12 +608,26 @@ A function response can be shaped using the same filters as the ones used for ta PostgreSQL has four procedural languages that are part of the core distribution: PL/pgSQL, PL/Tcl, PL/Perl, and PL/Python. There are many other procedural languages distributed as additional extensions. Also, plain SQL can be used to write functions (as shown in the example above). -By default, a function is executed with the privileges of the user who calls it. This means that the user has to have all permissions to do the operations the procedure performs. Another option is to define the function with with the :code:`SECURITY DEFINER` option. Then only one permission check will take place, the permission to call the function, and the operations in the function will have the authority of the user who owns the function itself. See `PostgreSQL documentation `_ for more details. +By default, a function is executed with the privileges of the user who calls it. This means that the user has to have all permissions to do the operations the procedure performs. Another option is to define the function with the :code:`SECURITY DEFINER` option. Then only one permission check will take place, the permission to call the function, and the operations in the function will have the authority of the user who owns the function itself. See `PostgreSQL documentation `_ for more details. .. note:: Why the `/rpc` prefix? One reason is to avoid name collisions between views and procedures. It also helps emphasize to API consumers that these functions are not normal restful things. The functions can have arbitrary and surprising behavior, not the standard "post creates a resource" thing that users expect from the other routes. +Explicit Qualification +---------------------- + +As of ``v5.0``, PostgREST executes a ``SET SCHEMA `` on each request, this overrides the `search_path `_ and it means that for functions to work properly, explicit qualification is needed for any database object that is not in the ````. However, this can be cumbersome when working with extensions such as PostGIS, to avoid it, you can add a search path to the function: + +.. code-block:: plpgsql + + CREATE FUNCTION api.line() RETURNS json AS $$ + SELECT ST_AsGeoJSON('LINESTRING(1 2 3, 4 5 6)')::json; + $$ LANGUAGE sql SET search_path = public; + + -- existing functions can be altered to add a search_path + ALTER FUNCTION api.make_point() SET search_path = public; + Accessing Request Headers/Cookies --------------------------------- @@ -825,7 +839,7 @@ These unsavory comments will appear in the generated JSON as the fields, ``info. Also if you wish to generate a ``summary`` field you can do it by having a multiple line comment, the ``summary`` will be the first line and the ``description`` the lines that follow it: -.. code-block:: sql +.. code-block:: plpgsql COMMENT ON TABLE entities IS $$Entities summary From 92cc815e9de626798348303075162b41cc791610 Mon Sep 17 00:00:00 2001 From: Francois-Guillaume Ribreau Date: Sat, 9 Jun 2018 10:49:29 +0200 Subject: [PATCH 164/711] Add MotionDynamic (PostgREST + SubZero) --- intro.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/intro.rst b/intro.rst index ac0da6e35e..20ac027398 100644 --- a/intro.rst +++ b/intro.rst @@ -94,6 +94,7 @@ In Production * `Catarse `_ * `Redsmin `_ * `Image-charts `_ +* `MotionDynamic - Fast highly dynamic video generation at scale `_ * `Drip Depot `_ * `OpenBooking `_ * `Convene `_ by Thomson-Reuters From 0e16f34eef97c62fad64fcd22c7d1ff9dbf9e585 Mon Sep 17 00:00:00 2001 From: ASVBPREAUBV Date: Thu, 14 Jun 2018 16:09:13 +0200 Subject: [PATCH 165/711] Make swagger-gui an optional step in installation --- install.rst | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/install.rst b/install.rst index 36ad6fb9f9..58341baeee 100644 --- a/install.rst +++ b/install.rst @@ -251,6 +251,21 @@ To avoid having to install the database at all, you can run both it and the serv Go into the directory where you saved this file and run :code:`docker-compose up`. You will see the logs of both the database and PostgREST, and be able to access the latter on port 3000. +If you want to have a visual overview of your API in your browser you can add swagger-ui to your :code:`docker-compose.yml`: + +.. code-block:: yaml + + swagger: + image: swaggerapi/swagger-ui + ports: + - "8080:8080" + expose: + - "8080" + environment: + API_URL: http://localhost:3000/ + +With this you can see the swagger-ui in your browser on port 8080. + .. _build_source: Build from Source From c7c6ee40e4fcada5a1b7376b83a9d3baff9583bb Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Thu, 14 Jun 2018 09:29:12 -0500 Subject: [PATCH 166/711] Add entries to the dict --- postgrest.dict | 3 +++ 1 file changed, 3 insertions(+) diff --git a/postgrest.dict b/postgrest.dict index bab9af1efa..83af75b114 100644 --- a/postgrest.dict +++ b/postgrest.dict @@ -129,3 +129,6 @@ verifier versioning webuser wildcard +Upsert +UPSERT +ui From be039152f2b6a73fe4ffa1e71fafb45d0c111af6 Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Fri, 15 Jun 2018 11:03:59 -0500 Subject: [PATCH 167/711] Improve explicit qualification section --- api.rst | 25 ++++++++++++++++++++----- 1 file changed, 20 insertions(+), 5 deletions(-) diff --git a/api.rst b/api.rst index d109081408..ab0c16ffc6 100644 --- a/api.rst +++ b/api.rst @@ -617,16 +617,31 @@ By default, a function is executed with the privileges of the user who calls it. Explicit Qualification ---------------------- -As of ``v5.0``, PostgREST executes a ``SET SCHEMA `` on each request, this overrides the `search_path `_ and it means that for functions to work properly, explicit qualification is needed for any database object that is not in the ````. However, this can be cumbersome when working with extensions such as PostGIS, to avoid it, you can add a search path to the function: +As of ``v5.0``, PostgREST executes a ``SET SCHEMA `` on each request, since this overrides the `search_path `_, function bodies need qualified schema names for any database object that is not in your exposed schema. .. code-block:: plpgsql - CREATE FUNCTION api.line() RETURNS json AS $$ - SELECT ST_AsGeoJSON('LINESTRING(1 2 3, 4 5 6)')::json; - $$ LANGUAGE sql SET search_path = public; + -- Assuming that: + -- exposed schema is "api" + -- ST_AsGeoJSON is in the "public" schema + -- streets is in the "api" schema + CREATE FUNCTION api.sample() RETURNS json AS $$ + SELECT public.ST_AsGeoJSON(geom)::json FROM streets LIMIT 1; + -- Notice streets doesn't need the schema prefix while ST_AsGeoJSON does + $$ LANGUAGE sql; + +To avoid having to qualify many database objects, you can add a ``search_path`` to the function: + +.. code-block:: plpgsql + + CREATE FUNCTION api.sample_distance() RETURNS float8 AS $$ + SELECT ST_MakePoint(1, 1) <-> ST_MakePoint(10, 10); + -- If the search_path is not specified, this would have to be: + -- SELECT public.ST_MakePoint(1, 1) operator(public.<->) public.ST_MakePoint(10, 10); + $$ LANGUAGE sql SET search_path = public, api; -- existing functions can be altered to add a search_path - ALTER FUNCTION api.make_point() SET search_path = public; + ALTER FUNCTION api.make_point(float8, float8) SET search_path = public, api; Accessing Request Headers/Cookies --------------------------------- From cfaf588bba9a4d3ee6909042a5d5d669567e2cd9 Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Tue, 19 Jun 2018 12:33:49 -0500 Subject: [PATCH 168/711] Add json operators to vertical filtering section --- api.rst | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/api.rst b/api.rst index ab0c16ffc6..11ac6ae51c 100644 --- a/api.rst +++ b/api.rst @@ -162,6 +162,26 @@ Casting the columns is possible by suffixing them with the double colon ``::`` p {"full_name": "Jane Doe", "salary": "120000.00"} ] +You can specify a json path for a ``json`` or ``jsonb`` column using the arrow operators(``->`` or ``->>``) as per the `PostgreSQL docs `_. + +.. code-block:: http + + GET /people?select=id,json_data->>blood_type,json_data->phones HTTP/1.1 + + [ + { "id": 1, "blood_type": "A+", "phones": [{"country_code": "61", "number": "917-929-5745"}] }, + { "id": 2, "blood_type": "O+", "phones": [{"country_code": "43", "number": "512-446-4988"}, {"country_code": "43", "number": "213-891-5979"}] } + ] + +.. code-block:: http + + GET /people?select=id,json_data->phones->0->>number HTTP/1.1 + + [ + { "id": 1, "number": "917-929-5745"}, + { "id": 2, "number": "512-446-4988"} + ] + .. _computed_cols: Computed Columns From a7fd694f19a853021c08303debafae18cb1f3bff Mon Sep 17 00:00:00 2001 From: PJLindsay Date: Fri, 13 Jul 2018 12:06:04 -0600 Subject: [PATCH 169/711] Update tut0.rst (#159) * Update tut0.rst Add hint about port mapping for users with pre-existing PostgreSQL DB --- tutorials/tut0.rst | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/tutorials/tut0.rst b/tutorials/tut0.rst index dc3d6b1017..8ff68e6e57 100644 --- a/tutorials/tut0.rst +++ b/tutorials/tut0.rst @@ -35,6 +35,16 @@ If Docker is not installed, you can get it `here Date: Sun, 5 Aug 2018 08:24:05 -0700 Subject: [PATCH 170/711] auth.rst typo: paramter -> parameter --- auth.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/auth.rst b/auth.rst index 7957cb9b8b..203d046c3c 100644 --- a/auth.rst +++ b/auth.rst @@ -116,7 +116,7 @@ There is no performance penalty for having many database roles, although roles a Custom Validation ----------------- -PostgREST honors the :code:`exp` claim for token expiration, rejecting expired tokens. However it does not enforce any extra constraints. An example of an extra constraint would be to immediately revoke access for a certain user. The configuration file paramter :code:`pre-request` specifies a stored procedure to call immediately after the authenticator switches into a new role and before the main query itself runs. +PostgREST honors the :code:`exp` claim for token expiration, rejecting expired tokens. However it does not enforce any extra constraints. An example of an extra constraint would be to immediately revoke access for a certain user. The configuration file parameter :code:`pre-request` specifies a stored procedure to call immediately after the authenticator switches into a new role and before the main query itself runs. Here's an example. In the config file specify a stored procedure: From 02f7cba3d2586f0e309af0b213634496825d6d1b Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Thu, 6 Sep 2018 13:24:42 -0500 Subject: [PATCH 171/711] Fix install broken link and add rst cheatsheet --- README.md | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index bb9afe28e1..4a2bb4f58d 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,12 @@ -#### Sphinx source files for PostgREST documentation +# PostgREST documentation + +PostgREST docs use the reStructuredText format, check this [cheatsheet](https://github.com/ralsina/rst-cheatsheet/blob/master/rst-cheatsheet.rst) to get acquainted with it. To generate HTML version: -1. Install Sphinx from the [sphinx website](http://sphinx-doc.org/latest/install.html) +1. Install Sphinx from the [sphinx website](http://www.sphinx-doc.org/en/stable/install.html) 2. Clone this repository -4. Generate HTML +3. Generate HTML ```bash cd postgrest-docs sphinx-build -b html -a -n . _build From 512862918f510c751514e9c9c8fa1dbc18739237 Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Mon, 10 Sep 2018 09:55:45 -0500 Subject: [PATCH 172/711] Change default theme to readthedocs --- conf.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf.py b/conf.py index 05837e17db..f1f263a9eb 100644 --- a/conf.py +++ b/conf.py @@ -108,7 +108,7 @@ # The theme to use for HTML and HTML Help pages. See the documentation for # a list of builtin themes. -html_theme = 'default' +html_theme = 'sphinx_rtd_theme' # Theme options are theme-specific and customize the look and feel of a theme # further. For a list of options available for each theme, see the From bba1d35ade3577d318761fce57875e5853eb0380 Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Mon, 10 Sep 2018 10:46:38 -0500 Subject: [PATCH 173/711] Fix #178, Add livereload script --- README.md | 1 - reload_docs.py | 6 ++++++ 2 files changed, 6 insertions(+), 1 deletion(-) create mode 100755 reload_docs.py diff --git a/README.md b/README.md index 4a2bb4f58d..30be737ccb 100644 --- a/README.md +++ b/README.md @@ -19,4 +19,3 @@ To generate HTML version: **Sphinx Installation Notes:** * If you're on OSX you might want to install the Python from homebrew - then a simple `pip install sphinx` does the trick. -* For an easier time refreshing your local preview of docs as you change it, try [sphinx-autobuild](https://github.com/GaretJax/sphinx-autobuild). diff --git a/reload_docs.py b/reload_docs.py new file mode 100755 index 0000000000..4ec06803f3 --- /dev/null +++ b/reload_docs.py @@ -0,0 +1,6 @@ +#!/usr/bin/env python +from livereload import Server, shell +server = Server() +server.watch('*.rst', shell('sphinx-build -b html -a -n . _build')) +server.watch('tutorials/*.rst', shell('sphinx-build -b html -a -n . _build')) +server.serve(root='_build/') From 54436e2dc6cf742182629d6ab201e5d1a02c7c1d Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Mon, 10 Sep 2018 10:47:03 -0500 Subject: [PATCH 174/711] Add default.nix and udpate README --- README.md | 8 ++++++++ default.nix | 14 ++++++++++++++ 2 files changed, 22 insertions(+) create mode 100644 default.nix diff --git a/README.md b/README.md index 30be737ccb..c8c5fb53d8 100644 --- a/README.md +++ b/README.md @@ -14,6 +14,14 @@ To generate HTML version: # open _build/index.html in your browser ``` +If you use [nix](https://nixos.org/nix/), you can just run: + +``` + nix-shell +``` + +This will build the docs and start a livereload server on `http://localhost:5500`. + --- **Sphinx Installation Notes:** diff --git a/default.nix b/default.nix new file mode 100644 index 0000000000..6d32f96097 --- /dev/null +++ b/default.nix @@ -0,0 +1,14 @@ +with import {}; + +stdenv.mkDerivation { + name = "postgrest-docs"; + buildInputs = [ + python36Full + python36Packages.sphinx + python36Packages.sphinx_rtd_theme + python36Packages.livereload ]; + shellHook = '' + sphinx-build -b html -a -n . _build + python reload_docs.py && exit + ''; +} From c4e926af2d065a5744c87dd6f1b14f5b047bb755 Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Mon, 10 Sep 2018 11:05:05 -0500 Subject: [PATCH 175/711] Update postgrest repo links --- install.rst | 6 +++--- tutorials/tut0.rst | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/install.rst b/install.rst index 58341baeee..278d94a14e 100644 --- a/install.rst +++ b/install.rst @@ -1,13 +1,13 @@ Binary Release ============== -[ `Download from release page `_ ] +[ `Download from release page `_ ] The release page has pre-compiled binaries for Mac OS X, Windows, and several Linux distributions. Extract the tarball and run the binary inside with the :code:`--help` flag to see usage instructions: .. code-block:: bash - # Untar the release (available at https://github.com/begriffs/postgrest/releases/latest) + # Untar the release (available at https://github.com/PostgREST/postgrest/releases/latest) $ tar Jxf postgrest-[version]-[platform].tar.xz @@ -293,7 +293,7 @@ When a pre-built binary does not exist for your system you can build the project .. code-block:: bash - git clone https://github.com/begriffs/postgrest.git + git clone https://github.com/PostgREST/postgrest.git cd postgrest # adjust local-bin-path to taste diff --git a/tutorials/tut0.rst b/tutorials/tut0.rst index 8ff68e6e57..dea41538c7 100644 --- a/tutorials/tut0.rst +++ b/tutorials/tut0.rst @@ -48,13 +48,13 @@ This will run the Docker instance as a daemon and expose port 5432 to the host s Step 3. Install PostgREST ------------------------- -PostgREST is distributed as a single binary, with versions compiled for major distributions of Linux/BSD/Windows. Visit the `latest release `_ for a list of downloads. In the event that your platform is not among those already pre-built, see :ref:`build_source` for instructions how to build it yourself. Also let us know to add your platform in the next release. +PostgREST is distributed as a single binary, with versions compiled for major distributions of Linux/BSD/Windows. Visit the `latest release `_ for a list of downloads. In the event that your platform is not among those already pre-built, see :ref:`build_source` for instructions how to build it yourself. Also let us know to add your platform in the next release. The pre-built binaries for download are :code:`.tar.xz` compressed files (except Windows which is a zip file). To extract the binary, go into the terminal and run .. code-block:: bash - # download from https://github.com/begriffs/postgrest/releases/latest + # download from https://github.com/PostgREST/postgrest/releases/latest tar xfJ postgrest--.tar.xz From 24f796a329caf3a2be5dea81a89cf4d7fd0efd4b Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Mon, 10 Sep 2018 11:27:57 -0500 Subject: [PATCH 176/711] Remove app.settings mention of being session scoped --- install.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install.rst b/install.rst index 278d94a14e..c62d85d8bc 100644 --- a/install.rst +++ b/install.rst @@ -140,7 +140,7 @@ max-rows pre-request A schema-qualified stored procedure name to call right after switching roles for a client request. This provides an opportunity to modify SQL variables or raise an exception to prevent the request from completing. app.settings.* - Arbitrary settings that will become database session settings. This can be used to pass in secret keys directly as strings, or via OS environment variables. For instance: :code:`app.settings.jwt_secret = "$(MYAPP_JWT_SECRET)"` will take :code:`MYAPP_JWT_SECRET` from the environment and make it available to postgresql functions as :code:`current_setting('app.settings.jwt_secret')`. + Arbitrary settings that can be used to pass in secret keys directly as strings, or via OS environment variables. For instance: :code:`app.settings.jwt_secret = "$(MYAPP_JWT_SECRET)"` will take :code:`MYAPP_JWT_SECRET` from the environment and make it available to postgresql functions as :code:`current_setting('app.settings.jwt_secret')`. role-claim-key A JSPath DSL that specifies the location of the :code:`role` key in the JWT claims. This can be used to consume a JWT provided by a third party service like Auth0, Okta or Keycloak. Usage examples: From 48ab4e91be292c09ee18bbdbf16fe94ca040a9cc Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Mon, 10 Sep 2018 11:40:55 -0500 Subject: [PATCH 177/711] Add header for JSON select feature --- api.rst | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/api.rst b/api.rst index 11ac6ae51c..ea919b4be2 100644 --- a/api.rst +++ b/api.rst @@ -162,7 +162,10 @@ Casting the columns is possible by suffixing them with the double colon ``::`` p {"full_name": "Jane Doe", "salary": "120000.00"} ] -You can specify a json path for a ``json`` or ``jsonb`` column using the arrow operators(``->`` or ``->>``) as per the `PostgreSQL docs `_. +JSON Columns +~~~~~~~~~~~~ + +You can specify a path for a ``json`` or ``jsonb`` column using the arrow operators(``->`` or ``->>``) as per the `PostgreSQL docs `_. .. code-block:: http From 99d878b13edc58aa6ecfcfe87ec6d0bc9c25cb6f Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Mon, 10 Sep 2018 12:09:06 -0500 Subject: [PATCH 178/711] Fix #175, add important note for computed column --- api.rst | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/api.rst b/api.rst index ea919b4be2..0d438a9339 100644 --- a/api.rst +++ b/api.rst @@ -4,7 +4,7 @@ Tables and Views ================ -All views and tables in the active schema and accessible by the active database role for a request are available for querying. They are exposed in one-level deep routes. For instance the full contents of a table `people` is returned at +All views and tables in the exposed schema and accessible by the active database role for a request are available for querying. They are exposed in one-level deep routes. For instance the full contents of a table `people` is returned at .. code-block:: http @@ -219,6 +219,10 @@ As mentioned, computed columns do not appear in the output by default. However y GET /people?select=*,full_name HTTP/1.1 +.. important:: + + Computed columns must be created under the exposed schema to be used in this way. + Ordering -------- From 38610e0349f6d2ff23b32da5ec9f958ceb7f62f6 Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Mon, 10 Sep 2018 12:11:49 -0500 Subject: [PATCH 179/711] Change type of notes for reloading and deleting/updating --- api.rst | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/api.rst b/api.rst index 0d438a9339..7180ad8b75 100644 --- a/api.rst +++ b/api.rst @@ -498,7 +498,7 @@ PostgREST can also detect relations going through join tables. Thus you can requ GET /directors?select=films(title,year) HTTP/1.1 -.. note:: +.. important:: Whenever foreign key relations change in the database schema you must refresh PostgREST's schema cache to allow resource embedding to work properly. See the section :ref:`schema_reloading`. @@ -623,7 +623,7 @@ PostgREST will detect if the function is scalar or table-valued and will shape t { "title": "Blade Runner 2049", "rating": 8.1} ] -.. note:: +.. important:: Whenever the function definition changes you must refresh PostgREST's schema for this to work properly. See the section :ref:`schema_reloading`. @@ -782,7 +782,7 @@ To update a row or rows in a table, use the PATCH verb. Use :ref:`h_filter` to s Updates also support :code:`Prefer: return=representation` plus :ref:`v_filter`. -.. note:: +.. warning:: Beware of accidentally updating every row in a table. To learn to prevent that see :ref:`block_fulltable`. @@ -857,7 +857,7 @@ To delete rows in a table, use the DELETE verb plus :ref:`h_filter`. For instanc DELETE /user?active=is.false HTTP/1.1 -.. note:: +.. warning:: Beware of accidentally deleting all rows in a table. To learn to prevent that see :ref:`block_fulltable`. @@ -892,7 +892,7 @@ Also if you wish to generate a ``summary`` field you can do it by having a multi You can use a tool like `Swagger UI `_ to create beautiful documentation from the description and to host an interactive web-based dashboard. The dashboard allows developers to make requests against a live PostgREST server, and provides guidance with request headers and example request bodies. -.. note:: +.. important:: The OpenAPI information can go out of date as the schema changes under a running server. To learn how to refresh the cache see :ref:`schema_reloading`. From c9816f166133b1b650f1772bb40aa6ff94138ff1 Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Mon, 10 Sep 2018 13:49:22 -0500 Subject: [PATCH 180/711] Hyperlink config settings --- install.rst | 67 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 67 insertions(+) diff --git a/install.rst b/install.rst index c62d85d8bc..b0df82b49c 100644 --- a/install.rst +++ b/install.rst @@ -87,19 +87,43 @@ app.settings.* String role-claim-key String .role ================ ====== ======= ======== +.. _db-uri: + db-uri +------ + The standard connection PostgreSQL `URI format `_. Symbols and unusual characters in the password or other fields should be percent encoded to avoid a parse error. If enforcing an SSL connection to the database is required you can use `sslmode `_ in the URI, for example ``postgres://user:pass@host:5432/dbname?sslmode=require``. When running PostgREST on the same machine as PostgreSQL, it is also possible to connect to the database using a `Unix socket `_ and the `Peer Authentication method `_ as an alternative to TCP/IP communication and authentication with a password, this also grants higher performance. To do this you can omit the host and the password, e.g. ``postgres://user@/dbname``, see the `libpq connection string `_ documentation for more details. On older systems like Centos 6, with older versions of libpq, a different db-uri syntax has to be used. In this case the URI is a string of space separated key-value pairs (key=value), so the example above would be :code:`"host=host user=user port=5432 dbname=dbname password=pass"`. + +.. _db-schema: + db-schema +--------- + The database schema to expose to REST clients. Tables, views and stored procedures in this schema will get API endpoints. + +.. _db-anon-role: + db-anon-role +------------ + The database role to use when executing commands on behalf of unauthenticated clients. + +.. _db-pool: + db-pool +------- + Number of connections to keep open in PostgREST's database pool. Having enough here for the maximum expected simultaneous client connections can improve performance. Note it's pointless to set this higher than the :code:`max_connections` GUC in your database. + +.. _server-host: + server-host +----------- + Where to bind the PostgREST web server. In addition to the usual address options, PostgREST interprets these reserved addresses with special meanings: * :code:`*` - any IPv4 or IPv6 hostname @@ -108,9 +132,18 @@ server-host * :code:`*6` - any IPv4 or IPv6 hostname, IPv6 preferred * :code:`!6` - any IPv6 hostname +.. _server-port: + server-port +----------- + The port to bind the web server. + +.. _server-proxy-uri: + server-proxy-uri +---------------- + Overrides the base URL used within the OpenAPI self-documentation hosted at the API root path. Use a complete URI syntax :code:`scheme:[//[user:password@]host[:port]][/]path[?query][#fragment]`. Ex. :code:`https://postgrest.com` .. code:: json @@ -129,19 +162,53 @@ server-proxy-uri ] } +.. _jwt-secret: + jwt-secret +---------- + The secret or `JSON Web Key (JWK) `_ used to decode JWT tokens clients provide for authentication. For security the key must be at least thirty-two characters long. If this parameter is not specified then PostgREST refuses authentication requests. Choosing a value for this parameter beginning with the at sign such as :code:`@filename` loads the secret out of an external file. This is useful for automating deployments. Note that any binary secrets must be base64 encoded. Both symmetric and asymmetric cryptography are supported. For more info see :ref:`asym_keys`. + +.. _jwt-aud: + jwt-aud +------- + Specifies the `JWT audience claim `_. If this claim is present in the client provided JWT then you must set this to the same value as in the JWT, otherwise verifying the JWT will fail. + +.. _secret-is-base64: + secret-is-base64 +---------------- + When this is set to :code:`true`, the value derived from :code:`jwt-secret` will be treated as a base64 encoded secret. + +.. _max-rows: + max-rows +-------- + A hard limit to the number of rows PostgREST will fetch from a view, table, or stored procedure. Limits payload size for accidental or malicious requests. + +.. _pre-request: + pre-request +----------- + A schema-qualified stored procedure name to call right after switching roles for a client request. This provides an opportunity to modify SQL variables or raise an exception to prevent the request from completing. + +.. _app.settings.*: + app.settings.* +-------------- + Arbitrary settings that can be used to pass in secret keys directly as strings, or via OS environment variables. For instance: :code:`app.settings.jwt_secret = "$(MYAPP_JWT_SECRET)"` will take :code:`MYAPP_JWT_SECRET` from the environment and make it available to postgresql functions as :code:`current_setting('app.settings.jwt_secret')`. + +.. _role-claim-key: + role-claim-key +-------------- + A JSPath DSL that specifies the location of the :code:`role` key in the JWT claims. This can be used to consume a JWT provided by a third party service like Auth0, Okta or Keycloak. Usage examples: .. code:: bash From a924c4b12f0b676c3aa51df65115f1120d3c670c Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Mon, 10 Sep 2018 13:59:51 -0500 Subject: [PATCH 181/711] Fix #173, add ref for jwt claim access --- api.rst | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/api.rst b/api.rst index 7180ad8b75..d9344c790c 100644 --- a/api.rst +++ b/api.rst @@ -670,14 +670,23 @@ To avoid having to qualify many database objects, you can add a ``search_path`` -- existing functions can be altered to add a search_path ALTER FUNCTION api.make_point(float8, float8) SET search_path = public, api; -Accessing Request Headers/Cookies ---------------------------------- +Accessing Request Headers, Cookies and JWT claims +------------------------------------------------- -Stored procedures can access request headers and cookies by reading GUC variables set by PostgREST per request. They are named :code:`request.header.XYZ` and :code:`request.cookie.XYZ`. For example, to read the value of the Origin request header: +Stored procedures can access request headers, cookies and jwt claims by reading GUC variables set by PostgREST per request. They are named :code:`request.header.XYZ`, :code:`request.cookie.XYZ` and :code:`request.jwt.claim.XYZ`. .. code-block:: postgresql + -- To read the value of the Origin request header: SELECT current_setting('request.header.origin', true); + -- To read the value of sessionId in a cookie: + SELECT current_setting('request.cookie.sessionId', true); + -- To read the value of the email claim in a jwt: + SELECT current_setting('request.jwt.claim.email', true); + +.. note:: + + ``request.jwt.claim.role`` defaults to the value of :ref:`db-anon-role`. Errors and HTTP Status Codes ---------------------------- From bca1ddf0d613fc6bf31fed0ecc0814b4c7928984 Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Tue, 11 Sep 2018 09:51:24 -0500 Subject: [PATCH 182/711] Fix #168, Rename SSL to HTTPS --- auth.rst | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/auth.rst b/auth.rst index 203d046c3c..a8c012dd91 100644 --- a/auth.rst +++ b/auth.rst @@ -289,12 +289,12 @@ The last type of critique focuses on the misuse of JWT for maintaining web sessi PostgREST uses JWT mainly for authentication and authorization purposes and encourages users to do the same. For web sessions, using cookies over HTTPS is good enough and well catered for by standard web frameworks. -.. _ssl: +.. _https: -SSL ---- +HTTPS +----- -PostgREST aims to do one thing well: add an HTTP interface to a PostgreSQL database. To keep the code small and focused we do not implement SSL. Use a reverse proxy such as NGINX to add this, `here's how `_. Note that some Platforms as a Service like Heroku also add SSL automatically in their load balancer. +PostgREST aims to do one thing well: add an HTTP interface to a PostgreSQL database. To keep the code small and focused we do not implement HTTPS. Use a reverse proxy such as NGINX to add this, `here's how `_. Note that some Platforms as a Service like Heroku also add SSL automatically in their load balancer. Schema Isolation ================ From 5e2f3b8d596819a2086fef1f607a5f3efc865997 Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Tue, 11 Sep 2018 10:13:41 -0500 Subject: [PATCH 183/711] Fix #166, reorder docker instructions --- install.rst | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/install.rst b/install.rst index b0df82b49c..ea6ab76f19 100644 --- a/install.rst +++ b/install.rst @@ -239,9 +239,15 @@ PostgREST outputs basic request logging to stdout. When running it in an SSH ses Docker ====== -The official PostgREST Docker image consults an internal :code:`/etc/postgrest.conf` file. To customize this file you can either mount a replacement configuration file into the container, or use environment variables. The environment variables will be interpolated into the default config file. +You can get the `official PostgREST Docker image `_ with: -These variables match the options shown in our :ref:`configuration` section, except they are capitalized, have a prefix, and use underscores. To get a list of the available environment variables, run this: +.. code-block:: bash + + docker pull postgrest/postgrest + +The image consults an internal ``/etc/postgrest.conf`` file. To customize this file you can either mount a replacement configuration file into the container, or use environment variables. The environment variables will be interpolated into the default config file. + +These variables match the options shown in our :ref:`configuration` section, except they are capitalized, have a ``PGRST_`` prefix, and use underscores. To get a list of the available environment variables, run this: .. code-block:: bash @@ -256,9 +262,6 @@ The first way to run PostgREST in Docker is to connect it to an existing native .. code-block:: bash - # Pull the official image - docker pull postgrest/postgrest - # Run the server docker run --rm --net=host -p 3000:3000 \ -e PGRST_DB_URI="postgres://postgres@localhost/postgres" \ From d78862996ff3405d6fd91c4c7c53b3a470dffe90 Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Tue, 11 Sep 2018 11:20:46 -0500 Subject: [PATCH 184/711] Fix #165, add schemas for sign/login --- auth.rst | 47 +++++++++++++++++++---------------------------- 1 file changed, 19 insertions(+), 28 deletions(-) diff --git a/auth.rst b/auth.rst index a8c012dd91..ee254594a4 100644 --- a/auth.rst +++ b/auth.rst @@ -126,18 +126,16 @@ Here's an example. In the config file specify a stored procedure: In the function you can run arbitrary code to check the request and raise an exception to block it if desired. -.. code:: sql +.. code-block:: postgres - CREATE OR REPLACE FUNCTION check_user() RETURNS void - LANGUAGE plpgsql - AS $$ + CREATE OR REPLACE FUNCTION check_user() RETURNS void AS $$ BEGIN IF current_user = 'evil_user' THEN RAISE EXCEPTION 'No, you are evil' USING HINT = 'Stop being so evil and maybe you can log in'; END IF; END - $$; + $$ LANGUAGE plpgsql; Client Auth =========== @@ -157,20 +155,18 @@ You can create a valid JWT either from inside your database or via an external s JWT from SQL ~~~~~~~~~~~~ -You can create JWT tokens in SQL using the `pgjwt extension `_. It's simple and requires only pgcrypto. If you're on an environment like Amazon RDS which doesn't support installing new extensions, you can still manually run the SQL inside pgjwt which creates the functions you will need. +You can create JWT tokens in SQL using the `pgjwt extension `_. It's simple and requires only pgcrypto. If you're on an environment like Amazon RDS which doesn't support installing new extensions, you can still manually run the `SQL inside pgjwt `_ (you'll need to replace ``@extschema@`` with another schema or just delete it) which creates the functions you will need. Next write a stored procedure that returns the token. The one below returns a token with a hard-coded role, which expires five minutes after it was issued. Note this function has a hard-coded secret as well. -.. code:: sql +.. code-block:: postgres CREATE TYPE jwt_token AS ( token text ); - CREATE FUNCTION jwt_test() RETURNS public.jwt_token - LANGUAGE sql - AS $$ - SELECT sign( + CREATE FUNCTION jwt_test() RETURNS public.jwt_token AS $$ + SELECT public.sign( row_to_json(r), 'reallyreallyreallyreallyverysafe' ) AS token FROM ( @@ -178,7 +174,7 @@ Next write a stored procedure that returns the token. The one below returns a to 'my_role'::text as role, extract(epoch from now())::integer + 300 AS exp ) r; - $$; + $$ LANGUAGE sql; PostgREST exposes this function to clients via a POST request to `/rpc/jwt_test`. @@ -329,12 +325,10 @@ First we'll need a table to keep track of our users: We would like the role to be a foreign key to actual database roles, however PostgreSQL does not support these constraints against the :code:`pg_roles` table. We'll use a trigger to manually enforce it. -.. code:: plpgsql +.. code-block:: plpgsql create or replace function - basic_auth.check_role_exists() returns trigger - language plpgsql - as $$ + basic_auth.check_role_exists() returns trigger as $$ begin if not exists (select 1 from pg_roles as r where r.rolname = new.role) then raise foreign_key_violation using message = @@ -343,7 +337,7 @@ We would like the role to be a foreign key to actual database roles, however Pos end if; return new; end - $$; + $$ language plpgsql; drop trigger if exists ensure_user_role_exists on basic_auth.users; create constraint trigger ensure_user_role_exists @@ -353,21 +347,19 @@ We would like the role to be a foreign key to actual database roles, however Pos Next we'll use the pgcrypto extension and a trigger to keep passwords safe in the :code:`users` table. -.. code:: plpgsql +.. code-block:: plpgsql create extension if not exists pgcrypto; create or replace function - basic_auth.encrypt_pass() returns trigger - language plpgsql - as $$ + basic_auth.encrypt_pass() returns trigger as $$ begin if tg_op = 'INSERT' or new.pass <> old.pass then new.pass = crypt(new.pass, gen_salt('bf')); end if; return new; end - $$; + $$ language plpgsql; drop trigger if exists encrypt_pass on basic_auth.users; create trigger encrypt_pass @@ -377,7 +369,7 @@ Next we'll use the pgcrypto extension and a trigger to keep passwords safe in th With the table in place we can make a helper to check a password against the encrypted column. It returns the database role for a user if the email and password are correct. -.. code:: plpgsql +.. code-block:: plpgsql create or replace function basic_auth.user_role(email text, pass text) returns name @@ -404,12 +396,11 @@ Logins As described in `JWT from SQL`_, we'll create a JWT inside our login function. Note that you'll need to adjust the secret key which is hard-coded in this example to a secure (at least thirty-two character) secret of your choosing. -.. code:: plpgsql +.. code-block:: postgres + -- login should be on your exposed schema create or replace function - login(email text, pass text) returns basic_auth.jwt_token - language plpgsql - as $$ + login(email text, pass text) returns basic_auth.jwt_token as $$ declare _role name; result basic_auth.jwt_token; @@ -430,7 +421,7 @@ As described in `JWT from SQL`_, we'll create a JWT inside our login function. N into result; return result; end; - $$; + $$ language plpgsql; An API request to call this function would look like: From 9337f63823d9277cf76d389b4998e4f9bded5f3b Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Tue, 11 Sep 2018 13:11:01 -0500 Subject: [PATCH 185/711] Fix #153, add systemd service file --- admin.rst | 62 +++++++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 53 insertions(+), 9 deletions(-) diff --git a/admin.rst b/admin.rst index b47e93853e..934f2d5d3b 100644 --- a/admin.rst +++ b/admin.rst @@ -5,18 +5,18 @@ PostgREST is a fast way to construct a RESTful API. Its default behavior is grea The first step is to create an Nginx configuration file that proxies requests to an underlying PostgREST server. -.. code:: nginx +.. code-block:: nginx http { - ... + # ... # upstream configuration upstream postgrest { server localhost:3000; keepalive 64; } - ... + # ... server { - ... + # ... # expose to the outside world location /api/ { default_type application/json; @@ -26,7 +26,7 @@ The first step is to create an Nginx configuration file that proxies requests to proxy_http_version 1.1; proxy_pass http://postgrest/; } - ... + # ... } } @@ -37,13 +37,13 @@ Block Full-Table Operations Each table in the admin-selected schema gets exposed as a top level route. Client requests are executed by certain database roles depending on their authentication. All HTTP verbs are supported that correspond to actions permitted to the role. For instance if the active role can drop rows of the table then the DELETE verb is allowed for clients. Here's an API request to delete old rows from a hypothetical logs table: -.. code:: http +.. code-block:: http DELETE /logs?time=lt.1991-08-06 HTTP/1.1 However it's very easy to delete the **entire table** by omitting the query parameter! -.. code:: http +.. code-block:: http DELETE /logs HTTP/1.1 @@ -92,7 +92,7 @@ This is fine in small tables, but count performance degrades in big tables due t HTTPS ----- -See the :ref:`ssl` section of the authentication guide. +See the :ref:`https` section of the authentication guide. Rate Limiting ------------- @@ -201,6 +201,50 @@ Then run the `pg_listen `_ utility to mon Now, whenever the structure of the database schema changes, PostgreSQL will notify the ``ddl_command_end`` channel, which will cause ``pg_listen`` to send PostgREST the signal to reload its cache. +Daemonizing +=========== + +For linux distros that use **systemd** (ubuntu, debian, archlinux) you can create a daemon in the following way. + +First, create postgrest configuration in ``/etc/postgrest/config`` + +.. code-block:: ini + + db-uri = "postgres://:@localhost:5432/" + db-schema = "" + db-anon-role = "" + db-pool = 10 + + server-host = "127.0.0.1" + server-port = 3000 + + jwt-secret = "" + +Then create the systemd service file in ``/etc/systemd/system/postgrest.service`` + +.. code-block:: ini + + [Unit] + Description=REST API for any Postgres database + After=postgresql.service + + [Service] + ExecStart=/bin/postgrest /etc/postgrest/config + ExecReload=/bin/kill -HUP $MAINPID + + [Install] + WantedBy=multi-user.target + +After that, you can enable the service at boot time and start it with: + +.. code-block:: bash + + systemctl enable postgrest + systemctl start postgrest + + ## For reloading the service + ## systemctl restart postgrest + Alternate URL Structure ======================= @@ -215,7 +259,7 @@ This allows compound primary keys and makes the intent for singular response ind Nginx rewrite rules allow you to simulate the familiar URL convention. The following example adds a rewrite rule for all table endpoints, but you'll want to restrict it to those tables that have a numeric simple primary key named "id." -.. code:: nginx +.. code-block:: nginx # support /endpoint/:id url style location ~ ^/([a-z_]+)/([0-9]+) { From 8670ce6ffea246f6fa165feee748e57bda20a279 Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Tue, 11 Sep 2018 13:17:45 -0500 Subject: [PATCH 186/711] Highlight 32 chars long and fix indentation --- install.rst | 46 +++++++++++++++++++++++----------------------- 1 file changed, 23 insertions(+), 23 deletions(-) diff --git a/install.rst b/install.rst index ea6ab76f19..a2805432ea 100644 --- a/install.rst +++ b/install.rst @@ -146,28 +146,28 @@ server-proxy-uri Overrides the base URL used within the OpenAPI self-documentation hosted at the API root path. Use a complete URI syntax :code:`scheme:[//[user:password@]host[:port]][/]path[?query][#fragment]`. Ex. :code:`https://postgrest.com` -.. code:: json - - { - "swagger": "2.0", - "info": { - "version": "0.4.3.0", - "title": "PostgREST API", - "description": "This is a dynamic API generated by PostgREST" - }, - "host": "postgrest.com:443", - "basePath": "/", - "schemes": [ - "https" - ] - } + .. code:: json + + { + "swagger": "2.0", + "info": { + "version": "0.4.3.0", + "title": "PostgREST API", + "description": "This is a dynamic API generated by PostgREST" + }, + "host": "postgrest.com:443", + "basePath": "/", + "schemes": [ + "https" + ] + } .. _jwt-secret: jwt-secret ---------- - The secret or `JSON Web Key (JWK) `_ used to decode JWT tokens clients provide for authentication. For security the key must be at least thirty-two characters long. If this parameter is not specified then PostgREST refuses authentication requests. Choosing a value for this parameter beginning with the at sign such as :code:`@filename` loads the secret out of an external file. This is useful for automating deployments. Note that any binary secrets must be base64 encoded. Both symmetric and asymmetric cryptography are supported. For more info see :ref:`asym_keys`. + The secret or `JSON Web Key (JWK) `_ used to decode JWT tokens clients provide for authentication. For security the key must be **at least 32 characters long**. If this parameter is not specified then PostgREST refuses authentication requests. Choosing a value for this parameter beginning with the at sign such as :code:`@filename` loads the secret out of an external file. This is useful for automating deployments. Note that any binary secrets must be base64 encoded. Both symmetric and asymmetric cryptography are supported. For more info see :ref:`asym_keys`. .. _jwt-aud: @@ -211,15 +211,15 @@ role-claim-key A JSPath DSL that specifies the location of the :code:`role` key in the JWT claims. This can be used to consume a JWT provided by a third party service like Auth0, Okta or Keycloak. Usage examples: -.. code:: bash + .. code:: bash - # {"postgrest":{"roles": ["other", "author"]}} - # the DSL accepts characters that are alphanumerical or one of "_$@" as keys - role-claim-key = ".postgrest.roles[1]" + # {"postgrest":{"roles": ["other", "author"]}} + # the DSL accepts characters that are alphanumerical or one of "_$@" as keys + role-claim-key = ".postgrest.roles[1]" - # {"https://www.example.com/role": { "key": "author }} - # non-alphanumerical characters can go inside quotes(escaped in the config value) - role-claim-key = ".\"https://www.example.com/role\".key" + # {"https://www.example.com/role": { "key": "author }} + # non-alphanumerical characters can go inside quotes(escaped in the config value) + role-claim-key = ".\"https://www.example.com/role\".key" Running the Server ------------------ From 0ec963b295415390f0aa30666753265ddcef7221 Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Tue, 11 Sep 2018 13:28:04 -0500 Subject: [PATCH 187/711] Fix #105, correct command for running postgrest --- install.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install.rst b/install.rst index a2805432ea..36905b5cbb 100644 --- a/install.rst +++ b/install.rst @@ -45,7 +45,7 @@ The PostgREST server reads a configuration file to determine information about t .. code:: bash - postgrest /path/to/postgrest.conf + ./postgrest /path/to/postgrest.conf The file must contain a set of key value pairs. At minimum you must include these keys: From 83183ec8c6e7f9b2eed50025dd106adcfaf77486 Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Tue, 11 Sep 2018 14:01:44 -0500 Subject: [PATCH 188/711] Fix #171, postgres logging in docker --- admin.rst | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/admin.rst b/admin.rst index 934f2d5d3b..7c5a4978aa 100644 --- a/admin.rst +++ b/admin.rst @@ -164,6 +164,22 @@ Once you've verified that requests are as you expect, you can get more informati Restart the database and watch the log file in real-time to understand how HTTP requests are being translated into SQL commands. +.. note:: + + On Docker you can enable the logs by using a custom ``init.sh``: + + .. code:: bash + + #!/bin/sh + echo "log_statement = 'all'" >> /var/lib/postgresql/data/postgresql.conf + + After that you can start the container and check the logs with ``docker logs``. + + .. code:: bash + + docker run -v "$(pwd)/init.sh":"/docker-entrypoint-initdb.d/init.sh" -d postgres + docker logs -f + .. _schema_reloading: Schema Reloading From cf220c5a91128d1f94684ff020dd885571176234 Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Wed, 12 Sep 2018 14:35:18 -0500 Subject: [PATCH 189/711] Fix #164, overloaded functions/named parameters --- api.rst | 41 +++++++++++++++++++++++++++++++++++------ 1 file changed, 35 insertions(+), 6 deletions(-) diff --git a/api.rst b/api.rst index d9344c790c..f20a15c75e 100644 --- a/api.rst +++ b/api.rst @@ -552,26 +552,36 @@ Stored Procedures Every stored procedure in the API-exposed database schema is accessible under the :code:`/rpc` prefix. The API endpoint supports POST (and in some cases GET) to execute the function. -.. code:: http +.. code-block:: http POST /rpc/function_name HTTP/1.1 Such functions can perform any operations allowed by PostgreSQL (read data, modify data, and even DDL operations). However procedures in PostgreSQL marked with :code:`stable` or :code:`immutable` `volatility `_ can only read, not modify, the database and PostgREST executes them in a read-only transaction compatible for read-replicas. Stable and immutable functions can be called with the HTTP GET verb if desired. -Procedures must be used with `named arguments `_. To supply arguments in an API call, include a JSON object in the request payload and each key/value of the object will become an argument. +To supply arguments in an API call, include a JSON object in the request payload and each key/value of the object will become an argument. For instance, assume we have created this function in the database. -.. code:: plpgsql +.. code-block:: plpgsql CREATE FUNCTION add_them(a integer, b integer) RETURNS integer AS $$ - SELECT $1 + $2; + SELECT a + b; $$ LANGUAGE SQL IMMUTABLE STRICT; +.. note:: + + Procedures must be declared with named parameters, procedures declared like: + + .. code-block:: plpgsql + + CREATE FUNCTION non_named_args(integer, text, integer) ... + + Can not be called with PostgREST, since we use `named notation `_ internally. + The client can call it by posting an object like -.. code:: http +.. code-block:: http POST /rpc/add_them HTTP/1.1 @@ -579,7 +589,7 @@ The client can call it by posting an object like Because ``add_them`` is declared IMMUTABLE, we can alternately call the function with a GET request: -.. code:: http +.. code-block:: http GET /rpc/add_them?a=1&b=2 HTTP/1.1 @@ -641,6 +651,25 @@ By default, a function is executed with the privileges of the user who calls it. Why the `/rpc` prefix? One reason is to avoid name collisions between views and procedures. It also helps emphasize to API consumers that these functions are not normal restful things. The functions can have arbitrary and surprising behavior, not the standard "post creates a resource" thing that users expect from the other routes. +Overloaded functions +-------------------- + +You can call overloaded functions with different number of arguments. + +.. code-block:: postgres + + CREATE FUNCTION rental_duration(customer_id integer) .. + + CREATE FUNCTION rental_duration(customer_id integer, from_date date) .. + +.. code-block:: http + + GET /rpc/rental_duration?customer_id=232 HTTP/1.1 + +.. code-block:: http + + GET /rpc/rental_duration?customer_id=232&from_date=2018-07-01 HTTP/1.1 + Explicit Qualification ---------------------- From 7052446abfc2c89f2bb427f225f4a2a2182c0eaf Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Thu, 13 Sep 2018 11:47:50 -0500 Subject: [PATCH 190/711] Fix #160, reorder reloading note for functions --- api.rst | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/api.rst b/api.rst index f20a15c75e..b00821e6fe 100644 --- a/api.rst +++ b/api.rst @@ -569,6 +569,10 @@ For instance, assume we have created this function in the database. SELECT a + b; $$ LANGUAGE SQL IMMUTABLE STRICT; +.. important:: + + Whenever you create or change a function you must refresh PostgREST's schema. See the section :ref:`schema_reloading`. + .. note:: Procedures must be declared with named parameters, procedures declared like: @@ -633,10 +637,6 @@ PostgREST will detect if the function is scalar or table-valued and will shape t { "title": "Blade Runner 2049", "rating": 8.1} ] -.. important:: - - Whenever the function definition changes you must refresh PostgREST's schema for this to work properly. See the section :ref:`schema_reloading`. - A function response can be shaped using the same filters as the ones used for tables and views: .. code:: http From efb39e5e122e5402f8e6dfd23397d243d8dade77 Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Thu, 13 Sep 2018 12:32:06 -0500 Subject: [PATCH 191/711] Add SIGHUP deprecation notice --- admin.rst | 14 +++++++++----- postgrest.dict | 1 + 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/admin.rst b/admin.rst index 7c5a4978aa..79585a3958 100644 --- a/admin.rst +++ b/admin.rst @@ -187,11 +187,11 @@ Schema Reloading Users are often confused by PostgREST's database schema cache. It is present because detecting foreign key relationships between tables (including how those relationships pass through views) is necessary, but costly. API requests consult the schema cache as part of :ref:`resource_embedding`. However if the schema changes while the server is running it results in a stale cache and leads to errors claiming that no relations are detected between tables. -To refresh the cache without restarting the PostgREST server, send the server process a SIGHUP signal: +To refresh the cache without restarting the PostgREST server, send the server process a SIGUSR1 signal: .. code:: bash - killall -HUP postgrest + killall -SIGUSR1 postgrest The above is the manual way to do it. To automate the schema reloads, use a database trigger like this: @@ -209,14 +209,18 @@ The above is the manual way to do it. To automate the schema reloads, use a data CREATE EVENT TRIGGER ddl_postgrest ON ddl_command_end EXECUTE PROCEDURE public.notify_ddl_postgrest(); -Then run the `pg_listen `_ utility to monitor for that event and send a SIGHUP when it occurs: +Then run the `pg_listen `_ utility to monitor for that event and send a SIGUSR1 when it occurs: .. code-block:: bash - pg_listen ddl_command_end "killall -HUP postgrest" + pg_listen ddl_command_end "killall -SIGUSR1 postgrest" Now, whenever the structure of the database schema changes, PostgreSQL will notify the ``ddl_command_end`` channel, which will cause ``pg_listen`` to send PostgREST the signal to reload its cache. +.. important:: + + As of PostgREST v5.1 reloading with SIGHUP is deprecated, it's still supported but will be removed in v6.0 + Daemonizing =========== @@ -246,7 +250,7 @@ Then create the systemd service file in ``/etc/systemd/system/postgrest.service` [Service] ExecStart=/bin/postgrest /etc/postgrest/config - ExecReload=/bin/kill -HUP $MAINPID + ExecReload=/bin/kill -SIGUSR1 $MAINPID [Install] WantedBy=multi-user.target diff --git a/postgrest.dict b/postgrest.dict index 83af75b114..563e11994a 100644 --- a/postgrest.dict +++ b/postgrest.dict @@ -46,6 +46,7 @@ RabbitMQ RestSharp SHA SIGHUP +SIGUSR1 SNS SQL SSL From d0c0312e35df809c28f4a1b0f3def87a4e4fa791 Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Thu, 13 Sep 2018 12:41:55 -0500 Subject: [PATCH 192/711] Change server-host default --- install.rst | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/install.rst b/install.rst index 36905b5cbb..7e09df3f33 100644 --- a/install.rst +++ b/install.rst @@ -68,14 +68,14 @@ The user specified in the db-uri is also known as the authenticator role. For mo Here is the full list of configuration parameters. -================ ====== ======= ======== -Name Type Default Required -================ ====== ======= ======== -db-uri String Y -db-schema String Y -db-anon-role String Y +================ ====== ========= ======== +Name Type Default Required +================ ====== ========= ======== +db-uri String Y +db-schema String Y +db-anon-role String Y db-pool Int 10 -server-host String \*4 +server-host String 127.0.0.1 server-port Int 3000 server-proxy-uri String jwt-secret String @@ -85,7 +85,7 @@ max-rows Int ∞ pre-request String app.settings.* String role-claim-key String .role -================ ====== ======= ======== +================ ====== ========= ======== .. _db-uri: From d5365b6ead2ffabf0b8ed98fb7d730317999474f Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Sat, 15 Sep 2018 13:24:33 -0500 Subject: [PATCH 193/711] Reorder stored procedures section --- api.rst | 90 +++++++++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 68 insertions(+), 22 deletions(-) diff --git a/api.rst b/api.rst index b00821e6fe..9099dcc30d 100644 --- a/api.rst +++ b/api.rst @@ -556,7 +556,7 @@ Every stored procedure in the API-exposed database schema is accessible under th POST /rpc/function_name HTTP/1.1 -Such functions can perform any operations allowed by PostgreSQL (read data, modify data, and even DDL operations). However procedures in PostgreSQL marked with :code:`stable` or :code:`immutable` `volatility `_ can only read, not modify, the database and PostgREST executes them in a read-only transaction compatible for read-replicas. Stable and immutable functions can be called with the HTTP GET verb if desired. +Such functions can perform any operations allowed by PostgreSQL (read data, modify data, and even DDL operations). To supply arguments in an API call, include a JSON object in the request payload and each key/value of the object will become an argument. @@ -573,31 +573,49 @@ For instance, assume we have created this function in the database. Whenever you create or change a function you must refresh PostgREST's schema. See the section :ref:`schema_reloading`. -.. note:: +The client can call it by posting an object like - Procedures must be declared with named parameters, procedures declared like: +.. code-block:: http - .. code-block:: plpgsql + POST /rpc/add_them HTTP/1.1 - CREATE FUNCTION non_named_args(integer, text, integer) ... + { "a": 1, "b": 2 } - Can not be called with PostgREST, since we use `named notation `_ internally. + 3 -The client can call it by posting an object like +You can also call a function that takes a single parameter of type json by sending the header :code:`Prefer: params=single-object` with your request. That way the JSON request body will be used as the single argument. + +.. code-block:: plpgsql + + CREATE FUNCTION mult_them(param json) RETURNS int AS $$ + SELECT (param->>'x')::int * (param->>'y')::int + $$ LANGUAGE SQL; .. code-block:: http - POST /rpc/add_them HTTP/1.1 + POST /rpc/mult_them HTTP/1.1 + Prefer: params=single-object - { "a": 1, "b": 2 } + { "x": 4, "y": 2 } -Because ``add_them`` is declared IMMUTABLE, we can alternately call the function with a GET request: + 8 -.. code-block:: http - GET /rpc/add_them?a=1&b=2 HTTP/1.1 +Procedures must be declared with named parameters, procedures declared like: + +.. code-block:: plpgsql + + CREATE FUNCTION non_named_args(integer, text, integer) ... + +Can not be called with PostgREST, since we use `named notation `_ internally. + +Note that PostgreSQL converts identifier names to lowercase unless you quote them like: -The function parameter names match the JSON object keys in the POST case, for the GET case they match the query parameters ``?a=1&b=2``. Note that PostgreSQL converts parameter names to lowercase unless you quote them like :sql:`CREATE FUNCTION foo("mixedCase" text) ...`. You can also call a function that takes a single parameter of type json by sending the header :code:`Prefer: params=single-object` with your request. That way the JSON request body will be used as the single argument. +.. code-block:: postgres + + CREATE FUNCTION "someFunc"("someParam" text) ... + +PostgreSQL has four procedural languages that are part of the core distribution: PL/pgSQL, PL/Tcl, PL/Perl, and PL/Python. There are many other procedural languages distributed as additional extensions. Also, plain SQL can be used to write functions (as shown in the example above). .. note:: @@ -619,15 +637,35 @@ The function parameter names match the JSON object keys in the POST case, for th Starting from PostgreSQL 10, a json array from the client gets mapped normally to a PostgreSQL native array. +.. note:: + + Why the `/rpc` prefix? One reason is to avoid name collisions between views and procedures. It also helps emphasize to API consumers that these functions are not normal restful things. The functions can have arbitrary and surprising behavior, not the standard "post creates a resource" thing that users expect from the other routes. + +Immutable and stable functions +------------------------------ + +Procedures in PostgreSQL marked with :code:`stable` or :code:`immutable` `volatility `_ can only read, not modify, the database and PostgREST executes them in a read-only transaction compatible for read-replicas. Stable and immutable functions can be called with the HTTP GET verb if desired. + +Because ``add_them`` is declared IMMUTABLE, we can alternately call the function with a GET request: + +.. code-block:: http + + GET /rpc/add_them?a=1&b=2 HTTP/1.1 + +The function parameter names match the JSON object keys in the POST case, for the GET case they match the query parameters ``?a=1&b=2``. + +Scalar functions +---------------- + PostgREST will detect if the function is scalar or table-valued and will shape the response format accordingly: -.. code:: http +.. code-block:: http GET /rpc/add_them?a=1&b=2 HTTP/1.1 3 -.. code:: http +.. code-block:: http GET /rpc/best_films_2017 HTTP/1.1 @@ -637,19 +675,27 @@ PostgREST will detect if the function is scalar or table-valued and will shape t { "title": "Blade Runner 2049", "rating": 8.1} ] -A function response can be shaped using the same filters as the ones used for tables and views: +Function filters +---------------- -.. code:: http +A function that returns a table type response can be shaped using the same filters as the ones used for tables and views: - GET /rpc/top_rated_films?select=title,director:directors(*)&year=eq.1990&order=title.desc HTTP/1.1 +.. code-block:: postgres -PostgreSQL has four procedural languages that are part of the core distribution: PL/pgSQL, PL/Tcl, PL/Perl, and PL/Python. There are many other procedural languages distributed as additional extensions. Also, plain SQL can be used to write functions (as shown in the example above). + CREATE FUNCTION best_films_2017() RETURNS SETOF films .. -By default, a function is executed with the privileges of the user who calls it. This means that the user has to have all permissions to do the operations the procedure performs. Another option is to define the function with the :code:`SECURITY DEFINER` option. Then only one permission check will take place, the permission to call the function, and the operations in the function will have the authority of the user who owns the function itself. See `PostgreSQL documentation `_ for more details. +.. code-block:: http -.. note:: + GET /rpc/best_films_2017?select=title,director:directors(*) HTTP/1.1 - Why the `/rpc` prefix? One reason is to avoid name collisions between views and procedures. It also helps emphasize to API consumers that these functions are not normal restful things. The functions can have arbitrary and surprising behavior, not the standard "post creates a resource" thing that users expect from the other routes. +.. code-block:: http + + GET /rpc/best_films_2017?rating=gt.8&order=title.desc HTTP/1.1 + +Function privileges +------------------- + +By default, a function is executed with the privileges of the user who calls it. This means that the user has to have all permissions to do the operations the procedure performs. Another option is to define the function with the :code:`SECURITY DEFINER` option. Then only one permission check will take place, the permission to call the function, and the operations in the function will have the authority of the user who owns the function itself. See `PostgreSQL documentation `_ for more details. Overloaded functions -------------------- From 7cff51c002854263a71b83ffba476895000b85fb Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Sat, 15 Sep 2018 14:17:28 -0500 Subject: [PATCH 194/711] Fix some code highlighting and add computed col ref --- api.rst | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/api.rst b/api.rst index 9099dcc30d..705cfc31e6 100644 --- a/api.rst +++ b/api.rst @@ -221,7 +221,7 @@ As mentioned, computed columns do not appear in the output by default. However y .. important:: - Computed columns must be created under the exposed schema to be used in this way. + Computed columns must be created under the :ref:`exposed schema ` to be used in this way. Ordering -------- @@ -378,30 +378,30 @@ Binary output If you want to return raw binary data from a :code:`bytea` column, you must specify :code:`application/octet-stream` as part of the :code:`Accept` header and select a single column :code:`?select=bin_data`. -.. code:: http +.. code-block:: http GET /items?select=bin_data&id=eq.1 HTTP/1.1 Accept: application/octet-stream -You can also request binary output when calling stored procedures and since they can return a scalar value you are not forced to use :code:`select` +You can also request binary output when calling `Stored Procedures`_ and since they can return a scalar value you are not forced to use :code:`select` for this case. -.. code:: sql +.. code-block:: postgres CREATE FUNCTION closest_point(..) RETURNS bytea .. -.. code:: http +.. code-block:: http POST /rpc/closest_point HTTP/1.1 Accept: application/octet-stream If the stored procedure returns non-scalar values, you need to do a :code:`select` in the same way as for GET binary output. -.. code:: sql +.. code-block:: sql CREATE FUNCTION overlapping_regions(..) RETURNS SETOF TABLE(geom_twkb bytea, ..) .. -.. code:: http +.. code-block:: http POST /rpc/overlapping_regions?select=geom_twkb HTTP/1.1 Accept: application/octet-stream @@ -502,8 +502,8 @@ PostgREST can also detect relations going through join tables. Thus you can requ Whenever foreign key relations change in the database schema you must refresh PostgREST's schema cache to allow resource embedding to work properly. See the section :ref:`schema_reloading`. -Embedded Operations -------------------- +Embedded Filters +---------------- Embedded resources can be shaped similarly to their top-level counterparts. To do so, prefix the query parameters with the name of the embedded resource. For instance, to order the actors in each film: @@ -832,7 +832,7 @@ All tables and `auto-updatable views Date: Tue, 18 Sep 2018 13:28:25 -0500 Subject: [PATCH 195/711] Fix #104, default privileges on functions --- api.rst | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/api.rst b/api.rst index 705cfc31e6..3c941b20a0 100644 --- a/api.rst +++ b/api.rst @@ -695,7 +695,26 @@ A function that returns a table type response can be shaped using the same filte Function privileges ------------------- -By default, a function is executed with the privileges of the user who calls it. This means that the user has to have all permissions to do the operations the procedure performs. Another option is to define the function with the :code:`SECURITY DEFINER` option. Then only one permission check will take place, the permission to call the function, and the operations in the function will have the authority of the user who owns the function itself. See `PostgreSQL documentation `_ for more details. +By default, a function is executed with the privileges of the user who calls it. This means that the user has to have all permissions to do the operations the procedure performs. + +Another option is to define the function with the :code:`SECURITY DEFINER` option. Then only one permission check will take place, the permission to call the function, and the operations in the function will have the authority of the user who owns the function itself. See `PostgreSQL documentation `_ for more details. + +.. warning:: + + Unlike tables/views, functions privileges work as a blacklist, so they're executable for all the roles by default. You can workaround this by revoking the PUBLIC privileges of the function and then granting privileges to specific roles: + + .. code-block:: postgres + + REVOKE ALL PRIVILEGES ON FUNCTION private_func() FROM PUBLIC; + GRANT EXECUTE ON FUNCTION private_func() TO a_role; + + Also to avoid doing ``REVOKE`` on every function you can enable this behavior by default with: + + .. code-block:: postgres + + ALTER DEFAULT PRIVILEGES REVOKE EXECUTE ON FUNCTIONS FROM PUBLIC; + + See `PostgreSQL alter default privileges `_ for more details. Overloaded functions -------------------- From a1d4b3ed3475ba40c50fe8f112a0eb9d2178a0e3 Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Wed, 19 Sep 2018 13:34:28 -0500 Subject: [PATCH 196/711] Add #fff background for snippets --- _static/css/custom.css | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/_static/css/custom.css b/_static/css/custom.css index ee869c6da7..75207887ce 100644 --- a/_static/css/custom.css +++ b/_static/css/custom.css @@ -1,3 +1,7 @@ div.wy-menu.rst-pro { display: none !important; } + +div.highlight { + background: #fff !important; +} From 518b465ffafea319e09eaac327d69b364f5d19f7 Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Thu, 20 Sep 2018 10:24:22 -0500 Subject: [PATCH 197/711] Fix highlighting and move running the server header --- api.rst | 23 ++++++++++------------- install.rst | 2 +- 2 files changed, 11 insertions(+), 14 deletions(-) diff --git a/api.rst b/api.rst index 3c941b20a0..dac2e18b55 100644 --- a/api.rst +++ b/api.rst @@ -103,22 +103,19 @@ The view will provide a new endpoint: Full-Text Search ~~~~~~~~~~~~~~~~ -The :code:`fts` filter mentioned above has a number of options to support flexible textual queries, namely the choice of plain vs phrase search and the language used for stemming. Suppose that :code:`tsearch` is a table with column :code:`my_tsv`, of type `tsvector `_. The follow examples illustrate the possibilities. +The :code:`fts` filter mentioned above has a number of options to support flexible textual queries, namely the choice of plain vs phrase search and the language used for stemming. Suppose that :code:`tsearch` is a table with column :code:`my_tsv`, of type `tsvector `_. The following examples illustrate the possibilities. .. code-block:: http - # Use language in fts query - GET /tsearch?my_tsv=fts(french).amusant + GET /tsearch?my_tsv=fts(french).amusant HTTP/1.1 - # Use plainto_tsquery and phraseto_tsquery - GET /tsearch?my_tsv=plfts.The%20Fat%20Cats - GET /tsearch?my_tsv=phfts.The%20Fat%20Rats +.. code-block:: http + + GET /tsearch?my_tsv=plfts.The%20Fat%20Cats HTTP/1.1 - # Combine both - GET /tsearch?my_tsv=phfts(english).The%20Fat%20Cats +.. code-block:: http - # "not" also working - GET /tsearch?my_tsv=not.phfts(english).The%20Fat%20Cats + GET /tsearch?my_tsv=not.phfts(english).The%20Fat%20Cats HTTP/1.1 Using phrase search mode requires PostgreSQL of version at least 9.6 and will raise an error in earlier versions of the database. @@ -346,7 +343,7 @@ By default PostgREST returns all JSON results in an array, even when there is on This can be inconvenient for client code. To return the first result as an object unenclosed by an array, specify :code:`vnd.pgrst.object` as part of the :code:`Accept` header -.. code:: http +.. code-block:: http GET /items?id=eq.1 HTTP/1.1 Accept: application/vnd.pgrst.object+json @@ -621,7 +618,7 @@ PostgreSQL has four procedural languages that are part of the core distribution: For versions prior to PostgreSQL 10, to pass a PostgreSQL native array you need to quote it as a string: - .. code:: http + .. code-block:: http POST /rpc/native_array_func HTTP/1.1 @@ -629,7 +626,7 @@ PostgreSQL has four procedural languages that are part of the core distribution: In these versions we recommend using function arguments of type json to accept arrays from the client: - .. code:: http + .. code-block:: http POST /rpc/json_array_func HTTP/1.1 diff --git a/install.rst b/install.rst index 7e09df3f33..3b7a23fd05 100644 --- a/install.rst +++ b/install.rst @@ -222,7 +222,7 @@ role-claim-key role-claim-key = ".\"https://www.example.com/role\".key" Running the Server ------------------- +================== PostgREST outputs basic request logging to stdout. When running it in an SSH session you must detach it from stdout or it will be terminated when the session closes. The easiest technique is redirecting the output to a log file or to the syslog: From 73e59a1643a7962c67aefbb23b2153c3f89c8381 Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Fri, 21 Sep 2018 13:46:53 -0500 Subject: [PATCH 198/711] Add pipenv instructions --- .gitignore | 1 + Pipfile | 14 ++++++++++++++ README.md | 27 ++++++++------------------- default.nix | 3 +-- reload_docs.py => livereload_docs.py | 3 +++ 5 files changed, 27 insertions(+), 21 deletions(-) create mode 100644 Pipfile rename reload_docs.py => livereload_docs.py (68%) diff --git a/.gitignore b/.gitignore index e35d8850c9..bf70826eac 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ _build +Pipfile.lock diff --git a/Pipfile b/Pipfile new file mode 100644 index 0000000000..52ea333a4d --- /dev/null +++ b/Pipfile @@ -0,0 +1,14 @@ +[[source]] +url = "https://pypi.org/simple" +verify_ssl = true +name = "pypi" + +[packages] +sphinx = "*" +sphinx-rtd-theme = "*" +livereload = "*" + +[dev-packages] + +[requires] +python_version = "3.6" diff --git a/README.md b/README.md index c8c5fb53d8..5e705d82bf 100644 --- a/README.md +++ b/README.md @@ -2,28 +2,17 @@ PostgREST docs use the reStructuredText format, check this [cheatsheet](https://github.com/ralsina/rst-cheatsheet/blob/master/rst-cheatsheet.rst) to get acquainted with it. -To generate HTML version: +You can use [pipenv](https://pipenv.readthedocs.io) to build the docs locally: -1. Install Sphinx from the [sphinx website](http://www.sphinx-doc.org/en/stable/install.html) -2. Clone this repository -3. Generate HTML - ```bash - cd postgrest-docs - sphinx-build -b html -a -n . _build - - # open _build/index.html in your browser - ``` +```bash + pipenv install + pipenv run python livereload_docs.py +``` -If you use [nix](https://nixos.org/nix/), you can just run: +Or if you use [nix](https://nixos.org/nix/), you can just run: -``` +```bash nix-shell ``` -This will build the docs and start a livereload server on `http://localhost:5500`. - ---- - -**Sphinx Installation Notes:** - -* If you're on OSX you might want to install the Python from homebrew - then a simple `pip install sphinx` does the trick. +Both of these options will build the docs and start a livereload server on `http://localhost:5500`. diff --git a/default.nix b/default.nix index 6d32f96097..c70878de80 100644 --- a/default.nix +++ b/default.nix @@ -8,7 +8,6 @@ stdenv.mkDerivation { python36Packages.sphinx_rtd_theme python36Packages.livereload ]; shellHook = '' - sphinx-build -b html -a -n . _build - python reload_docs.py && exit + python livereload_docs.py && exit ''; } diff --git a/reload_docs.py b/livereload_docs.py similarity index 68% rename from reload_docs.py rename to livereload_docs.py index 4ec06803f3..9983589aa5 100755 --- a/reload_docs.py +++ b/livereload_docs.py @@ -1,5 +1,8 @@ #!/usr/bin/env python from livereload import Server, shell +from subprocess import call +## Build docs at startup +call(['sphinx-build', '-b', 'html', '-a', '-n', '.', '_build']) server = Server() server.watch('*.rst', shell('sphinx-build -b html -a -n . _build')) server.watch('tutorials/*.rst', shell('sphinx-build -b html -a -n . _build')) From dc9a2858252cc94dc04007cd93edbbfec0951951 Mon Sep 17 00:00:00 2001 From: Kyle Johnson <1007162+kyle-johnson@users.noreply.github.com> Date: Sun, 23 Sep 2018 03:08:24 -0700 Subject: [PATCH 199/711] Note Postgres' (current) RLS limitations for views --- api.rst | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/api.rst b/api.rst index dac2e18b55..d0acc499fa 100644 --- a/api.rst +++ b/api.rst @@ -98,6 +98,10 @@ The view will provide a new endpoint: GET /fresh_stories HTTP/1.1 +.. important:: + + Views bypass all row-level security features and are invoked as the role which created the view, much like stored procedures with the "SECURITY DEFINER" option. + .. _fts: Full-Text Search From 87520699343a927a6d8619cb8b2d40fa415d236f Mon Sep 17 00:00:00 2001 From: Kyle Johnson <1007162+kyle-johnson@users.noreply.github.com> Date: Sun, 23 Sep 2018 11:38:34 -0700 Subject: [PATCH 200/711] Tweak view RLS warning --- api.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/api.rst b/api.rst index d0acc499fa..08110d422d 100644 --- a/api.rst +++ b/api.rst @@ -100,7 +100,7 @@ The view will provide a new endpoint: .. important:: - Views bypass all row-level security features and are invoked as the role which created the view, much like stored procedures with the "SECURITY DEFINER" option. + Views are invoked with the privileges of the view owner, much like stored procedures with the "SECURITY DEFINER" option. When created by a SUPERUSER role, all row-level security will be bypassed unless a different owner is specified. .. _fts: From f2e81062a0166728d07aba29032122e9fc72b8c4 Mon Sep 17 00:00:00 2001 From: Kyle Johnson <1007162+kyle-johnson@users.noreply.github.com> Date: Sun, 23 Sep 2018 11:42:38 -0700 Subject: [PATCH 201/711] Further clarify view RLS interaction --- api.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/api.rst b/api.rst index 08110d422d..cac1eea1ed 100644 --- a/api.rst +++ b/api.rst @@ -100,7 +100,7 @@ The view will provide a new endpoint: .. important:: - Views are invoked with the privileges of the view owner, much like stored procedures with the "SECURITY DEFINER" option. When created by a SUPERUSER role, all row-level security will be bypassed unless a different owner is specified. + Views are invoked with the privileges of the view owner, much like stored procedures with the "SECURITY DEFINER" option. When created by a SUPERUSER role, all row-level security will be bypassed unless a different, non-SUPERUSER owner is specified. .. _fts: From 89c62aa7e38481004dfd5c8a9a0a5e2457e5ef05 Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Mon, 24 Sep 2018 09:09:24 -0500 Subject: [PATCH 202/711] Add a workaround for RLS in views --- api.rst | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/api.rst b/api.rst index cac1eea1ed..6d27c0b86d 100644 --- a/api.rst +++ b/api.rst @@ -100,7 +100,15 @@ The view will provide a new endpoint: .. important:: - Views are invoked with the privileges of the view owner, much like stored procedures with the "SECURITY DEFINER" option. When created by a SUPERUSER role, all row-level security will be bypassed unless a different, non-SUPERUSER owner is specified. + Views are invoked with the privileges of the view owner, much like stored procedures with the ``SECURITY DEFINER`` option. When created by a SUPERUSER role, all `row-level security `_ will be bypassed unless a different, non-SUPERUSER owner is specified. + + .. code-block:: postgres + + -- Workaround: + -- non-SUPERUSER role to be used as the owner of the views + CREATE ROLE api_views_owner; + -- alter the view owner so RLS can work normally + ALTER VIEW sample_view OWNER TO api_views_owner; .. _fts: From 215bc80ff128caa091ad3b1007e59483fd5efddf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Steve=20Ch=C3=A1vez?= Date: Sun, 21 Oct 2018 17:54:21 -0500 Subject: [PATCH 203/711] Move intro to index and add shields (#184) * Add supporting development section --- _static/css/custom.css | 4 + index.rst | 196 +++++++++++++++++++++++++++++++++++++++-- intro.rst | 155 -------------------------------- 3 files changed, 194 insertions(+), 161 deletions(-) delete mode 100644 intro.rst diff --git a/_static/css/custom.css b/_static/css/custom.css index 75207887ce..588d99d4cf 100644 --- a/_static/css/custom.css +++ b/_static/css/custom.css @@ -5,3 +5,7 @@ div.wy-menu.rst-pro { div.highlight { background: #fff !important; } + +div.line-block { + margin-bottom: 0px !important; +} diff --git a/index.rst b/index.rst index c59042d724..32e5a42248 100644 --- a/index.rst +++ b/index.rst @@ -1,37 +1,221 @@ .. title:: PostgREST Documentation -.. image:: _static/logo.png +.. figure:: _static/logo.png -.. toctree:: - :maxdepth: 2 +.. image:: https://img.shields.io/github/stars/postgrest/postgrest.svg?style=social + :target: https://github.com/PostgREST/postgrest -.. toctree:: - :caption: What is PostgREST? +.. image:: https://img.shields.io/github/release/PostgREST/postgrest.svg + :target: https://github.com/PostgREST/postgrest/releases + +.. image:: https://img.shields.io/docker/pulls/postgrest/postgrest.svg + :target: https://hub.docker.com/r/postgrest/postgrest/ + +.. image:: https://img.shields.io/badge/gitter-join%20chat%20%E2%86%92-brightgreen.svg + :target: https://gitter.im/begriffs/postgrest + +.. image:: https://img.shields.io/badge/Donate-Patreon-orange.svg?colorB=F96854 + :target: https://www.patreon.com/postgrest + +.. image:: https://img.shields.io/badge/Donate-PayPal-green.svg + :target: https://www.paypal.me/postgrest + +| +PostgREST is a standalone web server that turns your PostgreSQL database directly into a RESTful API. The structural constraints and permissions in the database determine the API endpoints and operations. + +Motivation +---------- + +Using PostgREST is an alternative to manual CRUD programming. Custom API servers suffer problems. Writing business logic often duplicates, ignores or hobbles database structure. Object-relational mapping is a leaky abstraction leading to slow imperative code. The PostgREST philosophy establishes a single declarative source of truth: the data itself. + +Declarative Programming +----------------------- + +It's easier to ask PostgreSQL to join data for you and let its query planner figure out the details than to loop through rows yourself. It's easier to assign permissions to db objects than to add guards in controllers. (This is especially true for cascading permissions in data dependencies.) It's easier to set constraints than to litter code with sanity checks. + +Leak-proof Abstraction +---------------------- + +There is no ORM involved. Creating new views happens in SQL with known performance implications. A database administrator can now create an API from scratch with no custom programming. - intro.rst +Embracing the Relational Model +------------------------------ + +In 1970 E. F. Codd criticized the then-dominant hierarchical model of databases in his article A Relational Model of Data for Large Shared Data Banks. Reading the article reveals a striking similarity between hierarchical databases and nested http routes. With PostgREST we attempt to use flexible filtering and embedding rather than nested routes. + +One Thing Well +-------------- + +PostgREST has a focused scope. It works well with other tools like Nginx. This forces you to cleanly separate the data-centric CRUD operations from other concerns. Use a collection of sharp tools rather than building a big ball of mud. + +Shared Improvements +------------------- + +As with any open source project, we all gain from features and fixes in the tool. It's more beneficial than improvements locked inextricably within custom code-bases. + +Getting Support +---------------- + +The project has a friendly and growing community. Join our `chat room `_ for discussion and help. You can also report or search for bugs/features on the Github `issues `_ page. + +Supporting development +---------------------- + +You can help PostgREST ongoing maintenance and development by: + +- Making a regular donation through `Patreon `_ + +- Alternatively, you can make a one-time donation via `Paypal `_ + +Every donation will be spent on making PostgREST better for the whole community. .. toctree:: :caption: Tutorials + :titlesonly: tutorials/tut0.rst tutorials/tut1.rst .. toctree:: :caption: Installation + :titlesonly: install.rst .. toctree:: :caption: API + :titlesonly: api.rst .. toctree:: :caption: Authentication + :titlesonly: auth.rst .. toctree:: :caption: Administration + :titlesonly: admin.rst + +Ecosystem +--------- + +PostgREST has a growing ecosystem of examples, and libraries, experiments, and users. Here is a selection. + +Example Apps +------------ + +* `subzerocloud/postgrest-starter-kit `_ - Boilerplate for new project +* `NikolayS/postgrest-google-translate `_ - Calling to external translation service +* `CodeforAustralia/heritage-near-me `_ - Elm and PostgREST with PostGIS +* `timwis/handsontable-postgrest `_ - An excel-like database table editor +* `Recmo/PostgrestSkeleton `_ - Docker Compose, PostgREST, Nginx and Auth0 +* `benoror/ember-postgrest-dynamic-ui `_ - generating Ember forms to edit data +* `ruslantalpa/blogdemo `_ - blog api demo in a vagrant image +* `timwis/ext-postgrest-crud `_ - browser-based spreadsheet +* `srid/chronicle `_ - tracking a tree of personal memories +* `diogob/elm-workshop `_ - building a simple database query UI +* `marmelab/ng-admin-postgrest `_ - automatic database admin panel +* `myfreeweb/moneylog `_ - accounting web app in Polymer + PostgREST +* `tyrchen/goodfilm `_ - example film api +* `begriffs/postgrest-example `_ - sqitch versioning for API +* `SMRxT/postgrest-demo `_ - multi-tenant logging system +* `PierreRochard/postgrest-boilerplate `_ - example auth back-end + + +.. _clientside_libraries: + +Client-Side Libraries +--------------------- + +* `tomberek/aor-postgrest-client `_ - JS, admin-on-rest +* `hugomrdias/postgrest-url `_ - JS, just for generating query URLs +* `john-kelly/elm-postgrest `_ - Elm +* `mithril.postgrest `_ - JS, Mithril +* `lewisjared/postgrest-request `_ - JS, SuperAgent +* `JarvusInnovations/jarvus-postgrest-apikit `_ - JS, Sencha framework +* `davidthewatson/postgrest_python_requests_client `_ - Python +* `calebmer/postgrest-client `_ - JS +* `clesiemo3/postgrestR `_ - R +* `PierreRochard/postgrest-angular `_ - TypeScript, generate UI from API description +* `thejettdurham/postgrest-sharp-client `_ (needs maintainer) - C#, RestSharp +* `team142/ng-postgrest `_ - Angular app for browsing, editing data exposed over Postgrest. + +External Notification +--------------------- + +These are PostgreSQL bridges that propagate LISTEN/NOTIFY to external queues for further processing. This allows stored procedures to initiate actions outside the database such as sending emails. + +* `diogob/postgres-websockets `_ - expose web sockets for PostgreSQL's LISTEN/NOTIFY +* `frafra/postgresql2websocket `_ - Websockets +* `matthewmueller/pg-bridge `_ - Amazon SNS +* `aweber/pgsql-listen-exchange `_ - RabbitMQ +* `SpiderOak/skeeter `_ - ZeroMQ +* `FGRibreau/postgresql-to-amqp `_ - AMQP +* `daurnimator/pg-kinesis-bridge `_ - Amazon Kinesis + +Extensions +---------- + +* `pg-safeupdate `_ - Prevent full-table updates or deletes +* `srid/spas `_ - allow file uploads and basic auth +* `svmnotn/postgrest-auth `_ - OAuth2-inspired external auth server +* `wildsurfer/postgrest-oauth-server `_ - OAuth2 server +* `nblumoe/postgrest-oauth `_ - OAuth2 WAI middleware +* `criles25/postgrest-auth `_ - email based auth/signup +* `ppKrauss/PostgREST-writeAPI `_ - generate Nginx rewrite rules to fit an OpenAPI spec + +Commercial +--------------- + +* `subZero `_ - Automated GraphQL & REST API with built-in caching (powered in part by PostgREST) + +In Production +------------- + +* `triggerFS - A realtime messaging and distributed trigger system `_ +* `Moat `_ +* `Catarse `_ +* `Redsmin `_ +* `Image-charts `_ +* `MotionDynamic - Fast highly dynamic video generation at scale `_ +* `Drip Depot `_ +* `OpenBooking `_ +* `Convene `_ by Thomson-Reuters +* `eGull `_ +* `Elyios `_ + +Testimonials +------------ + + "It's so fast to develop, it feels like cheating!" + + -- François-G. Ribreau + + "I just have to say that, the CPU/Memory usage compared to our + Node.js/Waterline ORM based API is ridiculous. It's hard to even push + it over 60/70 MB while our current API constantly hits 1GB running on 6 + instances (dynos)." + + -- Louis Brauer + + "I really enjoyed the fact that all of a sudden I was writing + microservices in SQL DDL (and v8 javascript functions). I dodged so + much boilerplate. The next thing I knew, we pulled out a full rewrite + of a Spring+MySQL legacy app in 6 months. Literally 10x faster, and + code was super concise. The old one took 3 years and a team of 4 + people to develop." + + -- Simone Scarduzio + + "I like the fact that PostgREST does one thing, and one thing well. + While PostgREST takes care of bridging the gap between our HTTP server + and PostgreSQL database, we can focus on the development of our API in + a single language: SQL. This puts the database in the center of our + architecture, and pushed us to improve our skills in SQL programming + and database design." + + -- Eric Bréchemier, Data Engineer, eGull SAS diff --git a/intro.rst b/intro.rst deleted file mode 100644 index 20ac027398..0000000000 --- a/intro.rst +++ /dev/null @@ -1,155 +0,0 @@ -Motivation -########## - -PostgREST is a standalone web server that turns your PostgreSQL database directly into a RESTful API. The structural constraints and permissions in the database determine the API endpoints and operations. - -Using PostgREST is an alternative to manual CRUD programming. Custom API servers suffer problems. Writing business logic often duplicates, ignores or hobbles database structure. Object-relational mapping is a leaky abstraction leading to slow imperative code. The PostgREST philosophy establishes a single declarative source of truth: the data itself. - -Declarative Programming ------------------------ - -It's easier to ask PostgreSQL to join data for you and let its query planner figure out the details than to loop through rows yourself. It's easier to assign permissions to db objects than to add guards in controllers. (This is especially true for cascading permissions in data dependencies.) It's easier to set constraints than to litter code with sanity checks. - -Leak-proof Abstraction ----------------------- - -There is no ORM involved. Creating new views happens in SQL with known performance implications. A database administrator can now create an API from scratch with no custom programming. - -Embracing the Relational Model ------------------------------- - -In 1970 E. F. Codd criticized the then-dominant hierarchical model of databases in his article A Relational Model of Data for Large Shared Data Banks. Reading the article reveals a striking similarity between hierarchical databases and nested http routes. With PostgREST we attempt to use flexible filtering and embedding rather than nested routes. - -One Thing Well --------------- - -PostgREST has a focused scope. It works well with other tools like Nginx. This forces you to cleanly separate the data-centric CRUD operations from other concerns. Use a collection of sharp tools rather than building a big ball of mud. - -Shared Improvements -------------------- - -As with any open source project, we all gain from features and fixes in the tool. It's more beneficial than improvements locked inextricably within custom code-bases. - -Ecosystem -######### - -PostgREST has a growing ecosystem of examples, and libraries, experiments, and users. Here is a selection. - -.. _clientside_libraries: - -Client-Side Libraries ---------------------- - -* `tomberek/aor-postgrest-client `_ - JS, admin-on-rest -* `hugomrdias/postgrest-url `_ - JS, just for generating query URLs -* `john-kelly/elm-postgrest `_ - Elm -* `mithril.postgrest `_ - JS, Mithril -* `lewisjared/postgrest-request `_ - JS, SuperAgent -* `JarvusInnovations/jarvus-postgrest-apikit `_ - JS, Sencha framework -* `davidthewatson/postgrest_python_requests_client `_ - Python -* `calebmer/postgrest-client `_ - JS -* `clesiemo3/postgrestR `_ - R -* `PierreRochard/postgrest-angular `_ - TypeScript, generate UI from API description -* `thejettdurham/postgrest-sharp-client `_ (needs maintainer) - C#, RestSharp -* `team142/ng-postgrest `_ - Angular app for browsing, editing data exposed over Postgrest. - -External Notification ---------------------- - -These are PostgreSQL bridges that propagate LISTEN/NOTIFY to external queues for further processing. This allows stored procedures to initiate actions outside the database such as sending emails. - -* `diogob/postgres-websockets `_ - expose web sockets for PostgreSQL's LISTEN/NOTIFY -* `frafra/postgresql2websocket `_ - Websockets -* `matthewmueller/pg-bridge `_ - Amazon SNS -* `aweber/pgsql-listen-exchange `_ - RabbitMQ -* `SpiderOak/skeeter `_ - ZeroMQ -* `FGRibreau/postgresql-to-amqp `_ - AMQP -* `daurnimator/pg-kinesis-bridge `_ - Amazon Kinesis - -Example Apps ------------- - -* `subzerocloud/postgrest-starter-kit `_ - Boilerplate for new project -* `NikolayS/postgrest-google-translate `_ - Calling to external translation service -* `CodeforAustralia/heritage-near-me `_ - Elm and PostgREST with PostGIS -* `timwis/handsontable-postgrest `_ - An excel-like database table editor -* `Recmo/PostgrestSkeleton `_ - Docker Compose, PostgREST, Nginx and Auth0 -* `benoror/ember-postgrest-dynamic-ui `_ - generating Ember forms to edit data -* `ruslantalpa/blogdemo `_ - blog api demo in a vagrant image -* `timwis/ext-postgrest-crud `_ - browser-based spreadsheet -* `srid/chronicle `_ - tracking a tree of personal memories -* `diogob/elm-workshop `_ - building a simple database query UI -* `marmelab/ng-admin-postgrest `_ - automatic database admin panel -* `myfreeweb/moneylog `_ - accounting web app in Polymer + PostgREST -* `tyrchen/goodfilm `_ - example film api -* `begriffs/postgrest-example `_ - sqitch versioning for API -* `SMRxT/postgrest-demo `_ - multi-tenant logging system -* `PierreRochard/postgrest-boilerplate `_ - example auth back-end - -In Production -------------- - -* `triggerFS - A realtime messaging and distributed trigger system `_ -* `Moat `_ -* `Catarse `_ -* `Redsmin `_ -* `Image-charts `_ -* `MotionDynamic - Fast highly dynamic video generation at scale `_ -* `Drip Depot `_ -* `OpenBooking `_ -* `Convene `_ by Thomson-Reuters -* `eGull `_ -* `Elyios `_ - -Extensions ----------- - -* `pg-safeupdate `_ - Prevent full-table updates or deletes -* `srid/spas `_ - allow file uploads and basic auth -* `svmnotn/postgrest-auth `_ - OAuth2-inspired external auth server -* `wildsurfer/postgrest-oauth-server `_ - OAuth2 server -* `nblumoe/postgrest-oauth `_ - OAuth2 WAI middleware -* `criles25/postgrest-auth `_ - email based auth/signup -* `ppKrauss/PostgREST-writeAPI `_ - generate Nginx rewrite rules to fit an OpenAPI spec - -Commercial ---------------- - -* `subZero `_ - Automated GraphQL & REST API with built-in caching (powered in part by PostgREST) - -Testimonials -############ - - "It's so fast to develop, it feels like cheating!" - - -- François-G. Ribreau - - "I just have to say that, the CPU/Memory usage compared to our - Node.js/Waterline ORM based API is ridiculous. It's hard to even push - it over 60/70 MB while our current API constantly hits 1GB running on 6 - instances (dynos)." - - -- Louis Brauer - - "I really enjoyed the fact that all of a sudden I was writing - microservices in SQL DDL (and v8 javascript functions). I dodged so - much boilerplate. The next thing I knew, we pulled out a full rewrite - of a Spring+MySQL legacy app in 6 months. Literally 10x faster, and - code was super concise. The old one took 3 years and a team of 4 - people to develop." - - -- Simone Scarduzio - - "I like the fact that PostgREST does one thing, and one thing well. - While PostgREST takes care of bridging the gap between our HTTP server - and PostgreSQL database, we can focus on the development of our API in - a single language: SQL. This puts the database in the center of our - architecture, and pushed us to improve our skills in SQL programming - and database design." - - -- Eric Bréchemier, Data Engineer, eGull SAS - -Getting Support -################ - -The project has a friendly and growing community. Join our `chat room `_ for discussion and help. You can also report or search for bugs/features on the Github `issues `_ page. From 9475f53fd73da8e1c1a4816292e0308ad273e6c0 Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Thu, 8 Nov 2018 10:42:51 -0500 Subject: [PATCH 204/711] Clarify important note about SIGHUP --- admin.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/admin.rst b/admin.rst index 79585a3958..f8bfd1a958 100644 --- a/admin.rst +++ b/admin.rst @@ -219,7 +219,7 @@ Now, whenever the structure of the database schema changes, PostgreSQL will noti .. important:: - As of PostgREST v5.1 reloading with SIGHUP is deprecated, it's still supported but will be removed in v6.0 + As of PostgREST v5.1 reloading with SIGHUP is deprecated, it's still supported but will be removed in v6.0. SIGUSR1 should be used instead. Daemonizing =========== From 6d1adaaa54c47029624f5d3a707eef5d4dd4c960 Mon Sep 17 00:00:00 2001 From: Russell Davies Date: Wed, 14 Nov 2018 13:09:16 +0000 Subject: [PATCH 205/711] Clarify config and auth sections on JWKS. See PostgREST/postgrest#1205. --- auth.rst | 6 +++++- install.rst | 2 +- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/auth.rst b/auth.rst index ee254594a4..a0ddc2ee58 100644 --- a/auth.rst +++ b/auth.rst @@ -239,7 +239,7 @@ Our code requires a database role in the JWT. To add it you need to save the dat Asymmetric Keys ~~~~~~~~~~~~~~~ -As described in the :ref:`configuration` section, PostgREST accepts a ``jwt-secret`` config file parameter. If it is set to a simple string value like "reallyreallyreallyreallyverysafe" then PostgREST interprets it as an HMAC-SHA256 passphrase. However you can also specify a literal JWT key JSON value. For example, you can use an RSA-256 public key such as: +As described in the :ref:`configuration` section, PostgREST accepts a ``jwt-secret`` config file parameter. If it is set to a simple string value like "reallyreallyreallyreallyverysafe" then PostgREST interprets it as an HMAC-SHA256 passphrase. However you can also specify a literal JSON Web Key (JWK) or set. For example, you can use an RSA-256 public key encoded as a JWK: .. code-block:: json @@ -251,6 +251,10 @@ As described in the :ref:`configuration` section, PostgREST accepts a ``jwt-secr "n":"9zKNYTaYGfGm1tBMpRT6FxOYrM720GhXdettc02uyakYSEHU2IJz90G_MLlEl4-WWWYoS_QKFupw3s7aPYlaAjamG22rAnvWu-rRkP5sSSkKvud_IgKL4iE6Y2WJx2Bkl1XUFkdZ8wlEUR6O1ft3TS4uA-qKifSZ43CahzAJyUezOH9shI--tirC028lNg767ldEki3WnVr3zokSujC9YJ_9XXjw2hFBfmJUrNb0-wldvxQbFU8RPXip-GQ_JPTrCTZhrzGFeWPvhA6Rqmc3b1PhM9jY7Dur1sjYWYVyXlFNCK3c-6feo5WlRfe1aCWmwZQh6O18eTmLeT4nWYkDzQ" } +.. note:: + + This could also be a JSON Web Key Set (JWKS) if it was contained within an array assigned to a `keys` member, e.g. ``{ keys: [jwk1, jwk2] }``. + Just pass it in as a single line string, escaping the quotes: .. code-block:: ini diff --git a/install.rst b/install.rst index 3b7a23fd05..e641340f46 100644 --- a/install.rst +++ b/install.rst @@ -167,7 +167,7 @@ server-proxy-uri jwt-secret ---------- - The secret or `JSON Web Key (JWK) `_ used to decode JWT tokens clients provide for authentication. For security the key must be **at least 32 characters long**. If this parameter is not specified then PostgREST refuses authentication requests. Choosing a value for this parameter beginning with the at sign such as :code:`@filename` loads the secret out of an external file. This is useful for automating deployments. Note that any binary secrets must be base64 encoded. Both symmetric and asymmetric cryptography are supported. For more info see :ref:`asym_keys`. + The secret or `JSON Web Key (JWK) (or set) `_ used to decode JWT tokens clients provide for authentication. For security the key must be **at least 32 characters long**. If this parameter is not specified then PostgREST refuses authentication requests. Choosing a value for this parameter beginning with the at sign such as :code:`@filename` loads the secret out of an external file. This is useful for automating deployments. Note that any binary secrets must be base64 encoded. Both symmetric and asymmetric cryptography are supported. For more info see :ref:`asym_keys`. .. _jwt-aud: From eb81bbc464b14fb0a71bd6b12ece3884a1a4136d Mon Sep 17 00:00:00 2001 From: Lee Johnson Date: Fri, 16 Nov 2018 21:50:39 -0500 Subject: [PATCH 206/711] Update to include Heroku deploy steps --- install.rst | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/install.rst b/install.rst index e641340f46..ee1c05f899 100644 --- a/install.rst +++ b/install.rst @@ -336,6 +336,19 @@ If you want to have a visual overview of your API in your browser you can add sw With this you can see the swagger-ui in your browser on port 8080. +Deploying to Heroku +=================== +Assuming your making modifications locally and then pushing to GitHub, it's easy to deploy to Heroku. + +1. Create a new app on Heroku +2. In Settings add the following buildpack :code:`https://github.com/PostgREST/postgrest-heroku` +3. Add the require Config Vars in Heroku (see above) +4. Modify your postgres.conf file as required to match your Config Vars in Heroku +5. Create your :code:`Procfile` and add :code:`./env-to-config ./postgrest postgres.conf` +6. Push your changes to GitHub +7. Set Heroku to automatically deploy from Master and then manually deploy the branch for the first build + + .. _build_source: Build from Source From fed4c8c9af4aed652f94e8e7c7fea6cb808d2154 Mon Sep 17 00:00:00 2001 From: Lee Johnson Date: Thu, 22 Nov 2018 14:19:34 -0500 Subject: [PATCH 207/711] Added link to variables settings --- install.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install.rst b/install.rst index ee1c05f899..56545bda0f 100644 --- a/install.rst +++ b/install.rst @@ -342,7 +342,7 @@ Assuming your making modifications locally and then pushing to GitHub, it's easy 1. Create a new app on Heroku 2. In Settings add the following buildpack :code:`https://github.com/PostgREST/postgrest-heroku` -3. Add the require Config Vars in Heroku (see above) +3. Add the require Config Vars in Heroku (see https://github.com/PostgREST/postgrest/blob/master/app.json#L7-L57 for more details) 4. Modify your postgres.conf file as required to match your Config Vars in Heroku 5. Create your :code:`Procfile` and add :code:`./env-to-config ./postgrest postgres.conf` 6. Push your changes to GitHub From 3220373803c68c85dd702f04af46db2d9cf3cbcf Mon Sep 17 00:00:00 2001 From: Lee Johnson Date: Thu, 22 Nov 2018 14:34:47 -0500 Subject: [PATCH 208/711] renamed to postgrest.conf --- install.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/install.rst b/install.rst index 56545bda0f..64bd488856 100644 --- a/install.rst +++ b/install.rst @@ -343,8 +343,8 @@ Assuming your making modifications locally and then pushing to GitHub, it's easy 1. Create a new app on Heroku 2. In Settings add the following buildpack :code:`https://github.com/PostgREST/postgrest-heroku` 3. Add the require Config Vars in Heroku (see https://github.com/PostgREST/postgrest/blob/master/app.json#L7-L57 for more details) -4. Modify your postgres.conf file as required to match your Config Vars in Heroku -5. Create your :code:`Procfile` and add :code:`./env-to-config ./postgrest postgres.conf` +4. Modify your postgrest.conf file as required to match your Config Vars in Heroku +5. Create your :code:`Procfile` and add :code:`./env-to-config ./postgrest postgrest.conf` 6. Push your changes to GitHub 7. Set Heroku to automatically deploy from Master and then manually deploy the branch for the first build From 93c3c59134b3b597e33c02dfc85dcde13bf3ab34 Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Mon, 31 Dec 2018 21:46:25 -0500 Subject: [PATCH 209/711] Fix #190, Add option for db-uri from file --- install.rst | 2 ++ 1 file changed, 2 insertions(+) diff --git a/install.rst b/install.rst index 64bd488856..aab99d31a6 100644 --- a/install.rst +++ b/install.rst @@ -98,6 +98,8 @@ db-uri On older systems like Centos 6, with older versions of libpq, a different db-uri syntax has to be used. In this case the URI is a string of space separated key-value pairs (key=value), so the example above would be :code:`"host=host user=user port=5432 dbname=dbname password=pass"`. + Choosing a value for this parameter beginning with the at sign such as ``@filename`` (e.g. ``@./configs/my-config``) loads the secret out of an external file. + .. _db-schema: db-schema From 702e055d435bd443eb78b45cf1e23d99caa371e9 Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Tue, 1 Jan 2019 01:38:20 -0500 Subject: [PATCH 210/711] Fix #191, Add db-extra-search-path config --- install.rst | 48 +++++++++++++++++++++++++++++------------------- 1 file changed, 29 insertions(+), 19 deletions(-) diff --git a/install.rst b/install.rst index aab99d31a6..41ef578766 100644 --- a/install.rst +++ b/install.rst @@ -68,24 +68,25 @@ The user specified in the db-uri is also known as the authenticator role. For mo Here is the full list of configuration parameters. -================ ====== ========= ======== -Name Type Default Required -================ ====== ========= ======== -db-uri String Y -db-schema String Y -db-anon-role String Y -db-pool Int 10 -server-host String 127.0.0.1 -server-port Int 3000 -server-proxy-uri String -jwt-secret String -jwt-aud String -secret-is-base64 Bool False -max-rows Int ∞ -pre-request String -app.settings.* String -role-claim-key String .role -================ ====== ========= ======== +==================== ====== ========= ======== +Name Type Default Required +==================== ====== ========= ======== +db-uri String Y +db-schema String Y +db-anon-role String Y +db-pool Int 10 +db-extra-search-path String public +server-host String 127.0.0.1 +server-port Int 3000 +server-proxy-uri String +jwt-secret String +jwt-aud String +secret-is-base64 Bool False +max-rows Int ∞ +pre-request String +app.settings.* String +role-claim-key String .role +==================== ====== ========= ======== .. _db-uri: @@ -107,6 +108,8 @@ db-schema The database schema to expose to REST clients. Tables, views and stored procedures in this schema will get API endpoints. + This schema gets added to the `search_path `_ of every request. + .. _db-anon-role: db-anon-role @@ -121,6 +124,13 @@ db-pool Number of connections to keep open in PostgREST's database pool. Having enough here for the maximum expected simultaneous client connections can improve performance. Note it's pointless to set this higher than the :code:`max_connections` GUC in your database. +db-extra-search-path +-------------------- + + Extra schemas to add to the `search_path `_ of every request. + + Multiple schemas can be added in a comma-separated string, e.g. ``public, extensions``. + .. _server-host: server-host @@ -341,7 +351,7 @@ With this you can see the swagger-ui in your browser on port 8080. Deploying to Heroku =================== Assuming your making modifications locally and then pushing to GitHub, it's easy to deploy to Heroku. - + 1. Create a new app on Heroku 2. In Settings add the following buildpack :code:`https://github.com/PostgREST/postgrest-heroku` 3. Add the require Config Vars in Heroku (see https://github.com/PostgREST/postgrest/blob/master/app.json#L7-L57 for more details) From a163828c6ca2eaa53b09ad5e3b691daf7577d2af Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Tue, 1 Jan 2019 17:20:01 -0500 Subject: [PATCH 211/711] Fix #192, Add section for quoting filters. Also reorder the Unicode Support section. --- api.rst | 52 +++++++++++++++++++++++++++++++++++----------------- 1 file changed, 35 insertions(+), 17 deletions(-) diff --git a/api.rst b/api.rst index 6d27c0b86d..566552f15c 100644 --- a/api.rst +++ b/api.rst @@ -232,6 +232,41 @@ As mentioned, computed columns do not appear in the output by default. However y Computed columns must be created under the :ref:`exposed schema ` to be used in this way. +Unicode support +--------------- + +PostgREST supports unicode in schemas, tables, columns and values. To access a table with unicode name, use percent encoding. + +To request this: + +.. code-block:: http + + GET /موارد HTTP/1.1 + +Do this: + +.. code-block:: http + + GET /%D9%85%D9%88%D8%A7%D8%B1%D8%AF HTTP/1.1 + +Reserved characters +~~~~~~~~~~~~~~~~~~~ + +If filters include PostgREST reserved characters(``,``, ``.``, ``:``, ``()``) you'll have to surround them in percent encoded double quotes ``%22`` for correct processing. + +Here ``Hebdon,John`` and ``Williams,Mary`` are values. + +.. code-block:: http + + GET /employees?name=in.(%22Hebdon,John%22,%22Williams,Mary%22) HTTP/1.1 + +Here ``information.cpe`` is a column name. + +.. code-block:: http + + GET /vulnerabilities?%22information.cpe%22=like.*MS* HTTP/1.1 + + Ordering -------- @@ -419,23 +454,6 @@ If the stored procedure returns non-scalar values, you need to do a :code:`selec If more than one row would be returned the binary results will be concatenated with no delimiter. -Unicode Support -=============== - -PostgREST supports unicode in schemas, tables, columns and values. To access a table with unicode name, use percent encoding. - -To request this: - -.. code-block:: html - - http://localhost:3000/موارد - -Do this: - -.. code-block:: html - - http://localhost:3000/%D9%85%D9%88%D8%A7%D8%B1%D8%AF - .. _resource_embedding: Resource Embedding From ff74567473b723bae2bbdac26670c666b6dc4640 Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Wed, 2 Jan 2019 13:17:31 -0500 Subject: [PATCH 212/711] Fix #145, add authenticator role to tutorials --- tutorials/tut0.rst | 15 +++++++++++---- tutorials/tut1.rst | 2 +- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/tutorials/tut0.rst b/tutorials/tut0.rst index dea41538c7..c42a396fd0 100644 --- a/tutorials/tut0.rst +++ b/tutorials/tut0.rst @@ -93,8 +93,8 @@ If everything is working correctly it will print out its version and information
Windows -

All of the DLL files that are required to run PostgREST are available in the windows installation of PostgreSQL server. - Once installed they are found in the BIN folder, e.g: C:\Program Files\PostgreSQL\10\bin. Add this directory to your PATH +

All of the DLL files that are required to run PostgREST are available in the windows installation of PostgreSQL server. + Once installed they are found in the BIN folder, e.g: C:\Program Files\PostgreSQL\10\bin. Add this directory to your PATH variable. Run the following from an administrative command prompt (adjusting the actual BIN path as necessary of course)

setx /m PATH "%PATH%;C:\Program Files\PostgreSQL\10\bin"

@@ -144,13 +144,20 @@ Next make a role to use for anonymous web requests. When a request comes in, Pos .. code-block:: postgres create role web_anon nologin; - grant web_anon to postgres; grant usage on schema api to web_anon; grant select on api.todos to web_anon; The :code:`web_anon` role has permission to access things in the :code:`api` schema, and to read rows in the :code:`todos` table. +It's a good practice to create a dedicated role for connecting to the database, instead of using the highly privileged ``postgres`` role. So we'll do that, name the role ``authenticator`` and also grant him the ability to switch to the ``web_anon`` role : + +.. code-block:: postgres + + create role authenticator noinherit login password 'mysecretpassword'; + grant web_anon to authenticator; + + Now quit out of psql; it's time to start the API! .. code-block:: psql @@ -164,7 +171,7 @@ PostgREST uses a configuration file to tell it how to connect to the database. C .. code-block:: ini - db-uri = "postgres://postgres:mysecretpassword@localhost/postgres" + db-uri = "postgres://authenticator:mysecretpassword@localhost/postgres" db-schema = "api" db-anon-role = "web_anon" diff --git a/tutorials/tut1.rst b/tutorials/tut1.rst index 84e357a381..6abe846980 100644 --- a/tutorials/tut1.rst +++ b/tutorials/tut1.rst @@ -16,7 +16,7 @@ The previous tutorial created a :code:`web_anon` role in the database with which -- in the previous tutorial create role todo_user nologin; - grant todo_user to postgres; + grant todo_user to authenticator; grant usage on schema api to todo_user; grant all on api.todos to todo_user; From 14cb86d14798f33ac46ea96328c8202c7432181b Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Wed, 2 Jan 2019 13:29:20 -0500 Subject: [PATCH 213/711] Fix #182, change default port of tutorials to 5433 --- tutorials/tut0.rst | 16 +++------------- 1 file changed, 3 insertions(+), 13 deletions(-) diff --git a/tutorials/tut0.rst b/tutorials/tut0.rst index c42a396fd0..e061b4761d 100644 --- a/tutorials/tut0.rst +++ b/tutorials/tut0.rst @@ -29,21 +29,11 @@ If Docker is not installed, you can get it `here Date: Thu, 3 Jan 2019 12:17:53 -0500 Subject: [PATCH 214/711] Fix #183, change immediate revocation request to PATCH --- tutorials/tut1.rst | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/tutorials/tut1.rst b/tutorials/tut1.rst index 6abe846980..bcef5e6329 100644 --- a/tutorials/tut1.rst +++ b/tutorials/tut1.rst @@ -230,13 +230,17 @@ Restart PostgREST for the change to take effect. Next try making a request with # this request still works - curl http://localhost:3000/todos \ - -H "Authorization: Bearer $TOKEN" + curl http://localhost:3000/todos -X PATCH \ + -H "Authorization: Bearer $TOKEN" \ + -H "Content-Type: application/json" \ + -d '{"done": true}' # this one is rejected - curl http://localhost:3000/todos \ - -H "Authorization: Bearer $WAYWARD_TOKEN" + curl http://localhost:3000/todos -X PATCH \ + -H "Authorization: Bearer $WAYWARD_TOKEN" \ + -H "Content-Type: application/json" \ + -d '{"task": "AAAHHHH!", "done": false}' The server responds with 403 Forbidden: From 9e9f913c9eb22c4465d919cbd2bd77b5fd2e4b6e Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Thu, 3 Jan 2019 13:08:57 -0500 Subject: [PATCH 215/711] Fix #150, add example for url encoded payload --- api.rst | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/api.rst b/api.rst index 566552f15c..10c82e4dd1 100644 --- a/api.rst +++ b/api.rst @@ -888,6 +888,15 @@ The response will include a :code:`Location` header describing where to find the On the other end of the spectrum you can get the full created object back in the response to your request by including the header :code:`Prefer: return=representation`. That way you won't have to make another HTTP call to discover properties that may have been filled in on the server side. You can also apply the standard :ref:`v_filter` to these results. +URL encoded payloads can be posted with ``Content-Type: application/x-www-form-urlencoded``. + +.. code-block:: http + + POST /people HTTP/1.1 + Content-Type: application/x-www-form-urlencoded + + name=John+Doe&age=50&weight=80 + .. note:: When inserting a row you must post a JSON object, not quoted JSON. From 474b8e6426c42952efebeceac44dbb72bee31184 Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Thu, 3 Jan 2019 13:36:28 -0500 Subject: [PATCH 216/711] Add chinese translation link --- index.rst | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/index.rst b/index.rst index 32e5a42248..9b4afc945f 100644 --- a/index.rst +++ b/index.rst @@ -69,6 +69,11 @@ You can help PostgREST ongoing maintenance and development by: Every donation will be spent on making PostgREST better for the whole community. +Translations +------------ + +* `Chinese `_ (latest version ``v0.4.2.0``) + .. toctree:: :caption: Tutorials :titlesonly: From 2dcb5ee746b9180ebde2e86fca957c233e8e6ad2 Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Thu, 3 Jan 2019 17:22:23 -0500 Subject: [PATCH 217/711] Fix #180, note about volatility marker --- api.rst | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/api.rst b/api.rst index 10c82e4dd1..7d58bea723 100644 --- a/api.rst +++ b/api.rst @@ -673,7 +673,11 @@ Immutable and stable functions Procedures in PostgreSQL marked with :code:`stable` or :code:`immutable` `volatility `_ can only read, not modify, the database and PostgREST executes them in a read-only transaction compatible for read-replicas. Stable and immutable functions can be called with the HTTP GET verb if desired. -Because ``add_them`` is declared IMMUTABLE, we can alternately call the function with a GET request: +.. note:: + + The volatility marker is a promise about the behavior of the function. PostgreSQL will let you mark a function that modifies the database as ``immutable/stable`` without failure. However the function will fail when called through PostgREST since it executes it in a read-only transaction. + +Because ``add_them`` was declared IMMUTABLE, we can alternately call the function with a GET request: .. code-block:: http From 4119538ab76b3c991efabb3a16d250e8430dc7bf Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Sun, 6 Jan 2019 18:49:10 -0500 Subject: [PATCH 218/711] Add section for table/columns with spaces --- api.rst | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/api.rst b/api.rst index 7d58bea723..722c790007 100644 --- a/api.rst +++ b/api.rst @@ -249,6 +249,19 @@ Do this: GET /%D9%85%D9%88%D8%A7%D8%B1%D8%AF HTTP/1.1 +.. _tabs-cols-w-spaces: + +Table / Columns with spaces +~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +You can request table/columns with spaces in them by percent encoding the spaces with ``%20``: + +.. code-block:: http + + GET /Order%20Items?Unit%20Price=lt.200 HTTP/1.1 + +.. _reserved-chars: + Reserved characters ~~~~~~~~~~~~~~~~~~~ From 367b259bd46b6fd9978a2c1c7b3308c2eab86889 Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Sun, 6 Jan 2019 20:02:32 -0500 Subject: [PATCH 219/711] Further clarify db-extra-search-path --- install.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install.rst b/install.rst index 41ef578766..32a7af31ff 100644 --- a/install.rst +++ b/install.rst @@ -127,7 +127,7 @@ db-pool db-extra-search-path -------------------- - Extra schemas to add to the `search_path `_ of every request. + Extra schemas to add to the `search_path `_ of every request. These schemas tables, views and stored procedures don't get API endpoints, they can only be referred from the database objects exposed in your :ref:`db-schema`. Multiple schemas can be added in a comma-separated string, e.g. ``public, extensions``. From a106edc5d0396ebffe292aae5f1117fe07380073 Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Fri, 4 Jan 2019 00:37:31 -0500 Subject: [PATCH 220/711] Add release notes --- index.rst | 10 +++++++++- install.rst | 2 ++ release_notes.rst | 32 ++++++++++++++++++++++++++++++++ 3 files changed, 43 insertions(+), 1 deletion(-) create mode 100644 release_notes.rst diff --git a/index.rst b/index.rst index 9b4afc945f..febf872232 100644 --- a/index.rst +++ b/index.rst @@ -58,6 +58,8 @@ Getting Support The project has a friendly and growing community. Join our `chat room `_ for discussion and help. You can also report or search for bugs/features on the Github `issues `_ page. +.. _supporting-dev: + Supporting development ---------------------- @@ -70,10 +72,16 @@ You can help PostgREST ongoing maintenance and development by: Every donation will be spent on making PostgREST better for the whole community. Translations ------------- +~~~~~~~~~~~~ * `Chinese `_ (latest version ``v0.4.2.0``) +.. toctree:: + :caption: Release Notes + :titlesonly: + + release_notes.rst + .. toctree:: :caption: Tutorials :titlesonly: diff --git a/install.rst b/install.rst index 32a7af31ff..de4bf4187f 100644 --- a/install.rst +++ b/install.rst @@ -124,6 +124,8 @@ db-pool Number of connections to keep open in PostgREST's database pool. Having enough here for the maximum expected simultaneous client connections can improve performance. Note it's pointless to set this higher than the :code:`max_connections` GUC in your database. +.. _db-extra-search-path: + db-extra-search-path -------------------- diff --git a/release_notes.rst b/release_notes.rst new file mode 100644 index 0000000000..c4aa0b7c29 --- /dev/null +++ b/release_notes.rst @@ -0,0 +1,32 @@ +Release Notes +============= + +Here we'll include the most relevant changes so you can migrate to newer versions easily. +You can see the full changelog of each release in the `PostgREST repository `_. + +v5.2.0 +====== + +* `Explicit qualification `_ introduced in ``v5.0`` is no longer necessary, this section will not be included from this version onwards. A :ref:`db-extra-search-path` configuration parameter was introduced to avoid the need to explictly qualify database objects. If you install PostgreSQL extensions on the ``public`` schema, they'll work normally from now on. + +* Now you can filter :ref:`tabs-cols-w-spaces`. + +* Included the ability to quote columns that have :ref:`reserved-chars`. + +* Thanks to `Zhou Feng `_, now is possible to reference an external file in :ref:`db-uri`. + +* Thanks to `Russell Davies `_, Json Web Key Sets are now accepted by :ref:`jwt-secret`. + +Thanks +------ + +This release was made possible thanks to: + +* `Daniel Babiak `_ +* `Michel Pelletier `_ +* Tsingson Qin +* Jay Hannah +* Victor Adossi +* Petr Beles + +If you like to join them please consider :ref:`supporting PostgREST development `. From 44b825b93900fd8714572d0f11a7e2f0c83fbb1d Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Thu, 24 Jan 2019 19:07:54 -0500 Subject: [PATCH 221/711] Add Simply Connected Systems --- index.rst | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/index.rst b/index.rst index febf872232..faec2ae8fe 100644 --- a/index.rst +++ b/index.rst @@ -189,7 +189,6 @@ Commercial In Production ------------- -* `triggerFS - A realtime messaging and distributed trigger system `_ * `Moat `_ * `Catarse `_ * `Redsmin `_ @@ -200,6 +199,8 @@ In Production * `Convene `_ by Thomson-Reuters * `eGull `_ * `Elyios `_ +* `Simply Connected Systems `_ +* `triggerFS - A realtime messaging and distributed trigger system `_ Testimonials ------------ From 1c357179fd8639cd2cd1658205963a7a87106be5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Steve=20Ch=C3=A1vez?= Date: Fri, 1 Mar 2019 16:18:20 -0500 Subject: [PATCH 222/711] Add TimescaleDB tutorial (#201) * Add TimescaleDB sponsorship --- _static/timescaledb.png | Bin 0 -> 91295 bytes api.rst | 9 + index.rst | 16 ++ integrations/timescaledb.rst | 327 +++++++++++++++++++++++++++++++++++ 4 files changed, 352 insertions(+) create mode 100644 _static/timescaledb.png create mode 100644 integrations/timescaledb.rst diff --git a/_static/timescaledb.png b/_static/timescaledb.png new file mode 100644 index 0000000000000000000000000000000000000000..d6403efa4c91d87c9e6a3236438748662ea7a135 GIT binary patch literal 91295 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 literal 0 HcmV?d00001 diff --git a/api.rst b/api.rst index 722c790007..398c37b961 100644 --- a/api.rst +++ b/api.rst @@ -366,6 +366,8 @@ Note that the larger the table the slower this query runs in the database. The s Range-Unit: items Content-Range: 0-24/3573458 +.. _res_format: + Response Format --------------- @@ -577,6 +579,9 @@ Embedded resources can be aliased and filters can be applied on these aliases: GET /films?select=*,90_comps:competitions(name),91_comps:competitions(name)&90_comps.year=eq.1990&91_comps.year=eq.1991 HTTP/1.1 + +.. _custom_queries: + Custom Queries ============== @@ -587,6 +592,8 @@ The PostgREST URL grammar limits the kinds of queries clients can perform. It pr * Geo-spatial queries that require an argument, like "points near (lat,lon)" * More sophisticated full-text search than a simple use of the :sql:`fts` filter +.. _s_procs: + Stored Procedures ================= @@ -942,6 +949,8 @@ Updates also support :code:`Prefer: return=representation` plus :ref:`v_filter`. Beware of accidentally updating every row in a table. To learn to prevent that see :ref:`block_fulltable`. +.. _bulk_insert: + Bulk Insert ----------- diff --git a/index.rst b/index.rst index faec2ae8fe..ee17eb075b 100644 --- a/index.rst +++ b/index.rst @@ -23,6 +23,16 @@ | PostgREST is a standalone web server that turns your PostgreSQL database directly into a RESTful API. The structural constraints and permissions in the database determine the API endpoints and operations. +Sponsors +-------- + +.. image:: _static/timescaledb.png + :target: https://www.timescale.com?utm_campaign=postgrest&utm_source=sponsor&utm_medium=referral&utm_content=docs + :width: 222px + :align: center + +`TimescaleDB `_ is an scalable time-series database packaged as a PostgreSQL extension. See our tutorial for using `TimescaleDB with PostgREST `_. + Motivation ---------- @@ -89,6 +99,12 @@ Translations tutorials/tut0.rst tutorials/tut1.rst +.. toctree:: + :caption: Integrations + :titlesonly: + + integrations/timescaledb.rst + .. toctree:: :caption: Installation :titlesonly: diff --git a/integrations/timescaledb.rst b/integrations/timescaledb.rst new file mode 100644 index 0000000000..ea372a507b --- /dev/null +++ b/integrations/timescaledb.rst @@ -0,0 +1,327 @@ +TimescaleDB for Time-Series Data +================================ + +`TimescaleDB `_ is an open-source database designed to make SQL scalable for time-series data. It is engineered up from PostgreSQL, providing automatic partitioning across time and space, while retaining the standard PostgreSQL interface. + +PostgREST turns your PostgreSQL database directly into a RESTful API, since TimescaleDB is packaged as a PostgreSQL extension it works with PostgREST as well. + +In this tutorial we'll explore some of TimescaleDB features through PostgREST. + +Install Docker +-------------- + +For an easier setup we're going to use `Docker `_, make sure you have it installed. + +Run TimescaleDB +--------------- + +First, let’s pull and start the `TimescaleDB container image `_: + +.. code-block:: bash + + docker run --name tsdb_tut \ + -e POSTGRES_PASSWORD=mysecretpassword \ + -p 5433:5432 \ + -d timescale/timescaledb:latest-pg11 + +This will run the container as a daemon and expose port ``5433`` to the host system so that it doesn't conflict with another PostgreSQL installation. + +Set up TimescaleDB +------------------ + +Now, we'll create the ``timescaledb`` extension in our database. + +Run ``psql`` in the container we created in the previous step. + +.. code-block:: bash + + docker exec -it tsdb_tut psql -U postgres + ## Run all the following commands inside psql + +And create the extension: + +.. code-block:: postgres + + create extension if not exists timescaledb cascade; + +Create an Hypertable +-------------------- + +`Hypertables `_ are the core abstraction TimescaleDB offers for dealing with time-series data. + +To create an ``hypertable``, first we need to create standard PostgreSQL tables: + +.. code-block:: postgres + + create table if not exists locations( + device_id text primary key + , location text + , environment text + ); + + create table if not exists conditions( + time timestamp with time zone not null + , device_id text references locations(device_id) + , temperature numeric + , humidity numeric + ); + +Now, we'll convert ``conditions`` into an hypertable with `create_hypertable `_: + +.. code-block:: postgres + + SELECT create_hypertable('conditions', 'time', chunk_time_interval => interval '1 day'); + -- This also implicitly creates an index: CREATE INDEX ON "conditions"(time DESC); + + -- Exit psql + exit + + +Load sample data +---------------- + +To have some data to play with, we'll download the ``weather_small`` data set from `TimescaleDB's sample datasets `_. + +.. code-block:: bash + + ## Run bash inside the database container + docker exec -it tsdb_tut bash + + ## Download and uncompress the data + wget -qO- https://timescaledata.blob.core.windows.net/datasets/weather_small.tar.gz | tar xvz + + ## Copy data into the database + psql -U postgres <`_: + +.. code-block:: bash + + docker run --rm -p 3000:3000 \ + --name tsdb_pgrst \ + --link tsdb_tut \ + -e PGRST_DB_URI="postgres://postgres:mysecretpassword@tsdb_tut/postgres" \ + -e PGRST_DB_ANON_ROLE="postgres" \ + -d postgrest/postgrest:latest + +PostgREST on Hypertables +------------------------ + +We'll now see how to read data from hypertables through PostgREST. + +Since hypertables can be queried using standard `SELECT statements `_, we can query them through PostgREST normally. + +Suppose we want to run this query on ``conditions``: + +.. code-block:: postgres + + select + time, + device_id, + humidity + from conditions + where + humidity > 90 and + time < '2016-11-16' + order by time desc + limit 10; + +Using PostgREST :ref:`horizontal `/:ref:`vertical ` filtering, this query can be expressed as: + +.. code-block:: bash + + curl -G "localhost:3000/conditions" \ + -d select=time,device_id,humidity \ + -d humidity=gt.90 \ + -d time=lt.2016-11-16 \ + -d order=time.desc \ + -d limit=10 + ## This command is equivalent to: + ## curl "localhost:3000/conditions?select=time,device_id,humidity&humidity=gt.90&time=lt.2016-11-16&order=time.desc&limit=10" + ## Here we used -G and -d to make the command more readable + +The response will be: + +.. code-block:: json + + [{"time":"2016-11-15T23:58:00+00:00","device_id":"weather-pro-000982","humidity":90.90000000000006}, + {"time":"2016-11-15T23:58:00+00:00","device_id":"weather-pro-000968","humidity":92.3}, + {"time":"2016-11-15T23:58:00+00:00","device_id":"weather-pro-000963","humidity":96.29999999999993}, + {"time":"2016-11-15T23:58:00+00:00","device_id":"weather-pro-000951","humidity":94.39999999999998}, + {"time":"2016-11-15T23:58:00+00:00","device_id":"weather-pro-000950","humidity":93.69999999999982}, + {"time":"2016-11-15T23:58:00+00:00","device_id":"weather-pro-000915","humidity":94.69999999999997}, + {"time":"2016-11-15T23:58:00+00:00","device_id":"weather-pro-000911","humidity":93.2000000000001}, + {"time":"2016-11-15T23:58:00+00:00","device_id":"weather-pro-000910","humidity":91.30000000000017}, + {"time":"2016-11-15T23:58:00+00:00","device_id":"weather-pro-000901","humidity":92.30000000000005}, + {"time":"2016-11-15T23:58:00+00:00","device_id":"weather-pro-000895","humidity":91.00000000000014}] + +JOINs with relational tables +---------------------------- + +Hypertables support all standard `PostgreSQL constraints `_ . We can make use of the foreign key defined on ``locations`` to make a JOIN through PostgREST. A query such as: + +.. code-block:: postgres + + select + c.time, + c.temperature, + l.location, + l.environment + from conditions c + left join locations l on + c.device_id = l.device_id + order by time desc + limit 10; + +Can be expressed in PostgREST by using :ref:`resource_embedding`. + +.. code-block:: bash + + curl -G localhost:3000/conditions \ + -d select="time,temperature,device:locations(location,environment)" \ + -d order=time.desc \ + -d limit=10 + +.. code-block:: json + + [{"time":"2016-11-16T21:18:00+00:00","temperature":69.49999999999991,"device":{"location":"office-000202","environment":"inside"}}, + {"time":"2016-11-16T21:18:00+00:00","temperature":90,"device":{"location":"field-000205","environment":"outside"}}, + {"time":"2016-11-16T21:18:00+00:00","temperature":60.499999999999986,"device":{"location":"door-00085","environment":"doorway"}}, + {"time":"2016-11-16T21:18:00+00:00","temperature":91,"device":{"location":"swamp-000188","environment":"outside"}}, + {"time":"2016-11-16T21:18:00+00:00","temperature":42,"device":{"location":"arctic-000219","environment":"outside"}}, + {"time":"2016-11-16T21:18:00+00:00","temperature":70.80000000000003,"device":{"location":"office-000201","environment":"inside"}}, + {"time":"2016-11-16T21:18:00+00:00","temperature":62.699999999999974,"device":{"location":"door-00084","environment":"doorway"}}, + {"time":"2016-11-16T21:18:00+00:00","temperature":85.49999999999918,"device":{"location":"field-000204","environment":"outside"}}, + {"time":"2016-11-16T21:18:00+00:00","temperature":42,"device":{"location":"arctic-000218","environment":"outside"}}, + {"time":"2016-11-16T21:18:00+00:00","temperature":42,"device":{"location":"arctic-000217","environment":"outside"}}] + +Time-Oriented Analytics +----------------------- + +TimescaleDB includes new aggregate functions for time-oriented `analytics `_. + +For using aggregate queries with PostgREST you must create VIEWs or :ref:`s_procs`. Here's an example for using `time_bucket `_: + +.. code-block:: postgres + + -- Run psql in the database container + docker exec -it tsdb_tut psql -U postgres + + -- Create the function + create or replace function temperature_summaries(gap interval default '1 hour', prefix text default 'field') + returns table(hour text, avg_temp numeric, min_temp numeric, max_temp numeric) as $$ + select + time_bucket(gap, time)::text as hour, + trunc(avg(temperature), 2), + trunc(min(temperature), 2), + trunc(max(temperature), 2) + from conditions c + where c.device_id in ( + select device_id from locations + where location like prefix || '-%') + group by hour + $$ language sql stable; + + -- Exit psql + exit + +Every time the schema is changed you must reload PostgREST :ref:`schema cache ` so it can pick up the function parameters correctly. To reload, run: + +.. code-block:: bash + + docker kill --signal=USR1 tsdb_pgrst + + +Now, since the function is ``stable``, we can call it with ``GET`` as: + +.. code-block:: bash + + curl -G "localhost:3000/rpc/temperature_summaries" \ + -d gap=2minutes \ + -d order=hour.asc \ + -d limit=10 \ + -H "Accept: text/csv" + ## time_bucket accepts an interval type as it's argument + ## so you can pass gap=5minutes or gap=5hours + +.. code-block:: sql + + hour,avg_temp,min_temp,max_temp + "2016-11-15 12:00:00+00",72.97,68.00,78.00 + "2016-11-15 12:02:00+00",73.01,68.00,78.00 + "2016-11-15 12:04:00+00",73.05,68.00,78.10 + "2016-11-15 12:06:00+00",73.07,68.00,78.10 + "2016-11-15 12:08:00+00",73.11,68.00,78.10 + "2016-11-15 12:10:00+00",73.14,68.00,78.10 + "2016-11-15 12:12:00+00",73.17,68.00,78.19 + "2016-11-15 12:14:00+00",73.21,68.10,78.19 + "2016-11-15 12:16:00+00",73.24,68.10,78.29 + "2016-11-15 12:18:00+00",73.27,68.10,78.39 + +Note you can use PostgREST standard filtering on function results. Here we also changed the :ref:`res_format` to CSV. + +Fast Ingestion with Bulk Insert +------------------------------- + +You can use PostgREST :ref:`bulk_insert` to leverage TimescaleDB `fast ingestion `_. + +Let's do an insert of three rows: + +.. code-block:: bash + + curl "localhost:3000/conditions" \ + -H "Content-Type: application/json" \ + -H "Prefer: return=representation" \ + -d @- << EOF + [ + {"time": "2019-02-21 01:00:01-05", "device_id": "weather-pro-000000", "temperature": 40.0, "humidity": 59.9}, + {"time": "2019-02-21 01:00:02-05", "device_id": "weather-pro-000000", "temperature": 42.0, "humidity": 69.9}, + {"time": "2019-02-21 01:00:03-05", "device_id": "weather-pro-000000", "temperature": 44.0, "humidity": 79.9} + ] + EOF + +By using the ``Prefer: return=representation`` header we can see the successfully inserted rows: + +.. code-block:: json + + [{"time":"2019-02-21T06:00:01+00:00","device_id":"weather-pro-000000","temperature":40.0,"humidity":59.9}, + {"time":"2019-02-21T06:00:02+00:00","device_id":"weather-pro-000000","temperature":42.0,"humidity":69.9}, + {"time":"2019-02-21T06:00:03+00:00","device_id":"weather-pro-000000","temperature":44.0,"humidity":79.9}] + +Let's now insert a thousand rows, we'll use `jq `_ for constructing the array. + +.. code-block:: bash + + yes "{\"time\": \"$(date +'%F %T')\", \"device_id\": \"weather-pro-000001\", \"temperature\": 50, \"humidity\": 60}" | \ + head -n 1000 | jq -s '.' | \ + curl -i -d @- "http://localhost:3000/conditions" \ + -H "Content-Type: application/json" \ + -H "Prefer: count=exact" + +With ``Prefer: count=exact`` we can know how many rows were inserted. Check out the response: + +.. code-block:: haskell + + HTTP/1.1 201 Created + Transfer-Encoding: chunked + Date: Fri, 22 Feb 2019 16:47:05 GMT + Server: postgrest/5.2.0 (9969262) + Content-Range: */1000 + +You can see in ``Content-Range`` that the total number of inserted rows is ``1000``. + +Summing it up +------------- + +There you have it, with PostgREST you can get an instant and performant RESTful API for a TimescaleDB database. + +For a more in depth exploration of TimescaleDB capabilities, check their `docs `_. From a8d209cd1c22f7c91480076d2cb473204c3e6f0b Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Tue, 5 Mar 2019 10:33:05 -0500 Subject: [PATCH 223/711] Add translations section --- README.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/README.md b/README.md index 5e705d82bf..f82cffcf54 100644 --- a/README.md +++ b/README.md @@ -16,3 +16,14 @@ Or if you use [nix](https://nixos.org/nix/), you can just run: ``` Both of these options will build the docs and start a livereload server on `http://localhost:5500`. + +## Translations + +Translations are maintained in separate repositories forked from this one. Once you finish translating in your fork you can upload the project +to https://readthedocs.org and we'll link to it in the official documentation site https://postgrest.org. + +See more details in the chinese translation [PR](https://github.com/PostgREST/postgrest-docs/issues/66#issuecomment-297431688). + +### Available translations + +- Chinese - https://github.com/Lellansin/postgrest-docs (latest version `v0.4.2.0`) From c0fe0a5ce10c77534aaf2bd2b6896140fb1af7bf Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Tue, 5 Mar 2019 11:35:19 -0500 Subject: [PATCH 224/711] Add repo in default.nix --- default.nix | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/default.nix b/default.nix index c70878de80..9bc5b1c42e 100644 --- a/default.nix +++ b/default.nix @@ -1,4 +1,8 @@ -with import {}; +with import (builtins.fetchGit { + url = https://github.com/NixOS/nixpkgs-channels; + ref = "nixos-18.09-small"; + rev = "95fed28ac372c61eb83c87ad97c24b0f957827bf"; +}) {}; stdenv.mkDerivation { name = "postgrest-docs"; From f32c9c7967babffc89466cf4ec1495bf172bc19d Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Wed, 6 Mar 2019 10:30:41 -0500 Subject: [PATCH 225/711] Remove Explicit Qualification section --- api.rst | 29 ----------------------------- 1 file changed, 29 deletions(-) diff --git a/api.rst b/api.rst index 398c37b961..32e5d1a444 100644 --- a/api.rst +++ b/api.rst @@ -786,35 +786,6 @@ You can call overloaded functions with different number of arguments. GET /rpc/rental_duration?customer_id=232&from_date=2018-07-01 HTTP/1.1 -Explicit Qualification ----------------------- - -As of ``v5.0``, PostgREST executes a ``SET SCHEMA `` on each request, since this overrides the `search_path `_, function bodies need qualified schema names for any database object that is not in your exposed schema. - -.. code-block:: plpgsql - - -- Assuming that: - -- exposed schema is "api" - -- ST_AsGeoJSON is in the "public" schema - -- streets is in the "api" schema - CREATE FUNCTION api.sample() RETURNS json AS $$ - SELECT public.ST_AsGeoJSON(geom)::json FROM streets LIMIT 1; - -- Notice streets doesn't need the schema prefix while ST_AsGeoJSON does - $$ LANGUAGE sql; - -To avoid having to qualify many database objects, you can add a ``search_path`` to the function: - -.. code-block:: plpgsql - - CREATE FUNCTION api.sample_distance() RETURNS float8 AS $$ - SELECT ST_MakePoint(1, 1) <-> ST_MakePoint(10, 10); - -- If the search_path is not specified, this would have to be: - -- SELECT public.ST_MakePoint(1, 1) operator(public.<->) public.ST_MakePoint(10, 10); - $$ LANGUAGE sql SET search_path = public, api; - - -- existing functions can be altered to add a search_path - ALTER FUNCTION api.make_point(float8, float8) SET search_path = public, api; - Accessing Request Headers, Cookies and JWT claims ------------------------------------------------- From 3d734c44cf2ef4437a3596fab891dc0db31d94ca Mon Sep 17 00:00:00 2001 From: Paulo Vieira Date: Sat, 9 Mar 2019 22:25:05 +0000 Subject: [PATCH 226/711] clarify the usage of upsert when the table uses a surrogate key --- api.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/api.rst b/api.rst index 32e5d1a444..41b7f75e28 100644 --- a/api.rst +++ b/api.rst @@ -968,7 +968,7 @@ You can make an UPSERT with :code:`POST` and the :code:`Prefer: resolution=merge { "id": 3, "name": "New employee 3", "salary": 50000 } ] -UPSERT operates based on the primary key columns, you must specify all of them. You can also choose to ignore the duplicates with :code:`Prefer: resolution=ignore-duplicates`. +UPSERT operates based on the primary key columns, you must specify all of them. You can also choose to ignore the duplicates with :code:`Prefer: resolution=ignore-duplicates`. UPSERT works best when the primary key is natural, but it's also possible to use it if the primary key is surrogate (example: "id serial primary key"). For more details read `this issue `_. A single row UPSERT can be done by using :code:`PUT` and filtering the primary key columns with :code:`eq`: From b77149d48e164ed19980272ed79530d30c34b53a Mon Sep 17 00:00:00 2001 From: Hao Wu Date: Fri, 15 Mar 2019 21:52:38 +0800 Subject: [PATCH 227/711] update doc based on postgrest/issues/1253 (#206) --- api.rst | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/api.rst b/api.rst index 41b7f75e28..20c4113650 100644 --- a/api.rst +++ b/api.rst @@ -970,6 +970,10 @@ You can make an UPSERT with :code:`POST` and the :code:`Prefer: resolution=merge UPSERT operates based on the primary key columns, you must specify all of them. You can also choose to ignore the duplicates with :code:`Prefer: resolution=ignore-duplicates`. UPSERT works best when the primary key is natural, but it's also possible to use it if the primary key is surrogate (example: "id serial primary key"). For more details read `this issue `_. +.. important:: + After creating a table or changing its primary key, you must refresh PostgREST schema cache for UPSERT to work properly. To learn how to refresh the cache see :ref:`schema_reloading`. + + A single row UPSERT can be done by using :code:`PUT` and filtering the primary key columns with :code:`eq`: .. code-block:: http From 3b8ec49fba9700d0718a8addf8091bac5b7472c6 Mon Sep 17 00:00:00 2001 From: kraserge Date: Sun, 14 Apr 2019 19:08:48 +0300 Subject: [PATCH 228/711] SQL inside pgjwt (#207) Correct url https://github.com/michelp/pgjwt/blob/master/pgjwt--0.1.0.sql --- auth.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/auth.rst b/auth.rst index a0ddc2ee58..0800a08106 100644 --- a/auth.rst +++ b/auth.rst @@ -155,7 +155,7 @@ You can create a valid JWT either from inside your database or via an external s JWT from SQL ~~~~~~~~~~~~ -You can create JWT tokens in SQL using the `pgjwt extension `_. It's simple and requires only pgcrypto. If you're on an environment like Amazon RDS which doesn't support installing new extensions, you can still manually run the `SQL inside pgjwt `_ (you'll need to replace ``@extschema@`` with another schema or just delete it) which creates the functions you will need. +You can create JWT tokens in SQL using the `pgjwt extension `_. It's simple and requires only pgcrypto. If you're on an environment like Amazon RDS which doesn't support installing new extensions, you can still manually run the `SQL inside pgjwt `_ (you'll need to replace ``@extschema@`` with another schema or just delete it) which creates the functions you will need. Next write a stored procedure that returns the token. The one below returns a token with a hard-coded role, which expires five minutes after it was issued. Note this function has a hard-coded secret as well. From 7d8bceea1003676c1a68dd6e33d38c5365da8124 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Steve=20Ch=C3=A1vez?= Date: Thu, 23 May 2019 17:55:07 -0500 Subject: [PATCH 229/711] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index f82cffcf54..f60577cdc7 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# PostgREST documentation +# PostgREST documentation http://postgrest.org/ PostgREST docs use the reStructuredText format, check this [cheatsheet](https://github.com/ralsina/rst-cheatsheet/blob/master/rst-cheatsheet.rst) to get acquainted with it. From 3dde972d31519d3afc319015bce1dc0f73adeb8e Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Mon, 27 May 2019 11:28:19 -0500 Subject: [PATCH 230/711] Add Nimbus - In Production --- index.rst | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/index.rst b/index.rst index ee17eb075b..07bd59d3b7 100644 --- a/index.rst +++ b/index.rst @@ -216,6 +216,10 @@ In Production * `eGull `_ * `Elyios `_ * `Simply Connected Systems `_ +* `Nimbus `_ + + - See how Nimbus uses PostgREST in `Paul Copplestone's blog post `_. + * `triggerFS - A realtime messaging and distributed trigger system `_ Testimonials From 93e457cd89a1cf2b7394b59dea32aab4ceab9f27 Mon Sep 17 00:00:00 2001 From: Anupam Garg <1021183+angarg@users.noreply.github.com> Date: Thu, 30 May 2019 11:57:34 -1000 Subject: [PATCH 231/711] add Datrium client library and testimonial we've been using PostgREST in internal production infrastructure at Datrium for a few years now. so, we're giving thanks in the form of a testimonial, and providing a link to a python-based postgrest client we developed and use. --- index.rst | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/index.rst b/index.rst index 07bd59d3b7..3d72f2994e 100644 --- a/index.rst +++ b/index.rst @@ -167,6 +167,7 @@ Client-Side Libraries * `lewisjared/postgrest-request `_ - JS, SuperAgent * `JarvusInnovations/jarvus-postgrest-apikit `_ - JS, Sencha framework * `davidthewatson/postgrest_python_requests_client `_ - Python +* `datrium/postgrest-pyclient `_ - Python * `calebmer/postgrest-client `_ - JS * `clesiemo3/postgrestR `_ - R * `PierreRochard/postgrest-angular `_ - TypeScript, generate UI from API description @@ -221,6 +222,8 @@ In Production - See how Nimbus uses PostgREST in `Paul Copplestone's blog post `_. * `triggerFS - A realtime messaging and distributed trigger system `_ +* `Datrium `_ + Testimonials ------------ @@ -253,3 +256,11 @@ Testimonials and database design." -- Eric Bréchemier, Data Engineer, eGull SAS + + "PostgREST is performant, stable, and transparent. It allows us to + bootstrap projects really fast, and to focus on our data and application + instead of building out the ORM layer. In our k8s cluster, we run a few + pods per schema we want exposed, and we scale up/down depending on demand. + Couldn't be happier." + + -- Anupam Garg, Datrium, Inc. From 2cc48151dd9d7fc6c539110ffbfabe86c16feabe Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Sat, 15 Jun 2019 18:10:37 -0500 Subject: [PATCH 232/711] Add 2ndQuadrant as Sponsor --- _static/2ndquadrant.png | Bin 0 -> 90540 bytes _static/css/custom.css | 8 ++++++++ _static/logo.png | Bin 8149 -> 191528 bytes _static/retool.png | Bin 0 -> 63627 bytes index.rst | 12 +++++++----- 5 files changed, 15 insertions(+), 5 deletions(-) create mode 100644 _static/2ndquadrant.png create mode 100644 _static/retool.png diff --git a/_static/2ndquadrant.png b/_static/2ndquadrant.png new file mode 100644 index 0000000000000000000000000000000000000000..3b6a75589173d2fe9056ee5c3ec9a758b19c7529 GIT binary patch literal 90540 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 literal 0 HcmV?d00001 diff --git a/_static/css/custom.css b/_static/css/custom.css index 588d99d4cf..d4c0ceef8b 100644 --- a/_static/css/custom.css +++ b/_static/css/custom.css @@ -9,3 +9,11 @@ div.highlight { div.line-block { margin-bottom: 0px !important; } + +#sponsors{ + text-align: center; +} + +#sponsors h1{ + text-align: left; +} diff --git a/_static/logo.png b/_static/logo.png index 030673cfbaa40c2bc994436ff1aa67cab3a01d0e..7d23fffc4aad5ee9722dbb2e21818babaa22a4fc 100644 GIT binary patch literal 191528 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 + @@ -179,20 +181,23 @@ Next, let's add an endpoint to register a to-do in the database and modify the ` + ``hx-target="#todo-list-area"``: the HTML content returned from the request will go inside ``
`` (which is the list of to-dos). - + ``hx-trigger="submit"``: htmx will do this request when submitting the form (by pressing enter inside the ````). + + ``hx-trigger="submit"``: htmx will do this request when submitting the form (by pressing enter while inside the ````). + ``hx-on="htmx:afterRequest: this.reset()">``: this is a Javascript command that clears the form `after the request is done `_. With this, the ``http://localhost:3000/rpc/index`` page lists all the todos and adds new ones by submitting tasks in the input element. +Don't forget to refresh the :ref:`schema cache `. + +.. image:: ../_static/how-tos/htmx-insert.gif Editing and Deleting To-Dos --------------------------- -Now, let's modify the ``html_todo`` function and make it more functional. +Now, let's modify ``api.html_todo`` and make it more functional. .. code-block:: postgres - create or replace function api.html_todo_template(api.todos) returns text + create or replace function api.html_todo(api.todos) returns text language sql stable as $$ select format($html$ @@ -200,7 +205,6 @@ Now, let's modify the ``html_todo`` function and make it more functional.
- -

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 UW`QN$zZL`JrIn<9Ng4$HAD&l41^@s6 diff --git a/_static/retool.png b/_static/retool.png new file mode 100644 index 0000000000000000000000000000000000000000..abf26a1eff1573bbb66e102e3441e87d4df877d3 GIT binary patch literal 63627 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
  • RZ^uC~9UW1}Ooq-w*yRWdeEzX$W4r~- z7aax7U>X@i_vYQ_?e^rL?VQg!&~K?E$4eBwZfu;_1}UO=!*b*u#EGxf?`=MEq6eVN zCLi5*^QrAyTv^~4O&T3mx`bP~r1zwoaOyWmY(rqmInK9=@75;t#V`Jl#nbhHuqhp+F^MGc_ zYIWKVYXxqaxs85he7;*WY}O&JhzxzO0P4&=ieLELok2)bE@sNBBny)@z~D^5Xck5p z9bKhyw5hA<@Cm>;cxm3rzcjqq67?l2H&??%fQ(ii7#RY0p}rQrSp?s-$0MKpq-U^s zV{S%p>|s#hi=2X~MTgk}miW)rSVHw3pyyXXLbDr#g>fQ2`RyZF8zJ)(g3dbsyOob+*3P}rh~0EztPbJ{ywH9?h$u+lx_4#U z2RhOm%9b4jN%*g0*4N@o`W+VIxpb-Kog2PM`@z617bKs94)R+qO4;(UD`qDIHiu&& zEqyXQV5;IidYpW)HA~G$R4hM#^*YV>eM?3AF6D;7c?H8KCpWXz{T=p5zN^H#IDj}7i5)`c$BeBet$kbbKL#dK^$6D!Xs z7enZI^FGK2K+qRV+8`}frhwa8L1N!ivc?tw1jjgZtoR$+eIx?zBA|#EQRVDYHl2A` zsHg-Gb`*;>xV2S-S%u8<=vcbPREj55j|XV1uDXdro>6ULW5tr-FZLk{FY0nr#o6|b zSiHq%uiWrx`cMk!OtS!MUJhkYsAKKvV3=5LWp3=)|`+AJ!7*cg& z(3iBGwZ9FQB*d}wr%XADGrZX9|B8%}4Wf(o<=%UUV<{fMmv$bl;N6Qmx%!hmL|jrP!o=LQSZ?+NqMNT*&NT zf?GyJZeL7|MqLPna%uzjB~r^NH3_jn=x;7)*{m)x`sbl7|xYNEV8S@Kv%N8^jQ`}Zzq zQ=8_M!jM0xkLdh|J-;z|PeKHWuc};qvIlkZBHIy=|EtJdjJnNf#SMSCvJ9jp1GF;% zK7WGbR)qk@0=r?_*OFeB`-M7X?nUDtCid)4bmcz6_6XkK4VZjSO!Vhtv3&PH2u<33 zh^wZ0cJskgw3~VMU%I-UMlG}Tp4d?KE0FRo4$RMOq{NY*jWajV;&5aLhx7;>u;>yW zy)Qir$Eb*JG1JpDbHg$su6TZkVBBMZC_Cdla(;(m@>}sK;c&ixP_{g<~UwtV0Ka!>8 zIS>=S!G8C_q*8PFc#5*q{a*YN0`?v>%96Oi9;^}E&u;_j6U!&XtdkSfrmKy-x(uC13d<#3#k z)@rvZ`7~8VuG9{KQ2(3 zufmPt!6|@nnGmq+S1!0mhqIq338#JoXq(2xb`zHSPw$H3s^%hd&uLwr1g#2%Cw0!q z@w58N`X%7XgaVHF76@$rpc!vaLt7J&#c`1&;mV&p{NOC`D+ZN&ODHL}JA8#lu;khp%f<_dcqyCTR! z<$we{flagO;eAF2!9-z#!hO%k8Vg%tyMC)jE=qT&6MK%hsd_XegyXWD277#fBi^>W z@E{8+FjPCAZ?bH<2bAJv4UEm4b6)gGcf!fQoB$b|IRm`fb3z2S*SohfCD~Pm%K-MC zn<0$WZN_NqS<|npJ(>g+pdlTImC7TJnP@X$$PsF#{cul;3;8JL?z~ZQ&A-KA@8W6@ zIeTkQg_z}dmQ)q}m1l0H<@*wZCYYpPx-yUNU8!FboIa&n@^IcHvo1GSC`3o1dQLvheo6#7mxC9$_p4Pr~ z%sp#T;@X?WX`k?z9$+@b8+LMWr2C~ftf7Cv0SY|B@ON2rI~~Qwt$$h5ov`|x6$}$X zNvbF1!#~Y1^?J_%%>jXHb1l5r3ELy<>`8nO4S;`26QEFGG9xAV#|ZbVNt?0{8xUpn z*y*ClG{@$c6jVvoQ-}$b4&~$ln4alz8dPcev-?v{-h9VnnA`zudm0$MTPFG*%M{O7 zAyLl!E6NxreQ|H>v2!of zun^dJESUaS>~XtaZKxNxNVj(>7fm!Hkk#4?iIw?z{Y>Y8gF5#ojg2?aKj@wexC<~) z_7L5VsHla5t8%4_?_ zAMK3c^h~8`vV0wnZAM$xs2q~`sv+a@O%><2qC26`lVI0Zi5^{~i-}r+g^ao4nB3|j3=Zo< z=u}n=1J@u?e(`<%K6-Dg_??_8?YeSa<&`JHX>xmYN`K$lSLRCL)_=qMsrWQqgV+vh z)HD=bnS`|$>$m=kAJn@M0p?;3W)R&YXKqTWOk^DCYan>r^|kD_#AZng1szFVSo4pN zf$|e2Ri~DLtx^W`=L$;Ad>w;bZOZW3V>1=aACKhH%@q|@P!inRgbzN7I<^6^Xzz&e z+f6AtO6N1(@kW75r#@`jWK;KL@eq^7VeP8BE0gW0c*iC+k;>p==@s?*tpl1GkyKv7 zbE_qT2_;l1utk|;gRnQj?4=?gtne!JDEl$+s|DcQlkKa~;|3p$yK|!6x_E7itmr-K zaC~jPUxVMZdIWAFtpOHjrueH%5{&d%@J5F$xiPKy^MBsd^)mV4(E1XlRLAXK3QyA9 z0D8$0ug@%`Eo)vrK%F|+*K#D$b(I$z;|4IDw_MC%Ic46T)TWFl>_F_gPRnUeRr(-r zBQ6cxnyBy0TgBU7FIV@rlKOkZa!8slzZVViVO1l>?>50M+~_wHI@(aHbwRfxD~c7u zY^s3d^RsB2V9oOINO;Qt2%kC{1O3)RfY~m!)M0*>Ymp>PzC#s2p;#CzLyui$_E;CG3eF8)#d~Z(V7B}QHP4Cu)=rNE zC@uOF}nN#%Zh^&#K;u7x76^+B^ zT;QDe^5MDLYnpIA!68G!Jng2!7;Az9#R5(3R#QUxCTts-h{9n%Ksj?up1h$>ttPl} zyv{9(K<*tNyAPS0^6s7ykN63()~vXE`&>gU5a)p1{I_YYNw(-M{sBN%uKMfKI*eBx zVmS+A9*E3y=hdym-936siEu}xt&N5GY zd|C~9Zx``@Sd@aNuoCr1Ay515_Awp-IDAl-`v$B*3I|=F7C_^p`AO0zzuLHIkn4X$ zBKWk6_;CId=GKk{!soQWLd6jFGI3h)e)hChH^r^K}9PKCa1?5&drg`gEi>E($LTu(}FJOr94vtf~vsSD;0ZlW!57LUVW zL6>%J2|~q~!+R2P<~;inU1K0|!IgP6xckm8`mR30Xf~KmfGCw5v=P{$W+(B$(&aZJ zOQ-=~{H|^O1~OZE{X2KE^#N!YV>Dl0E<(YxR8GOmBJGch~Z8-KxnNR(5gW4O|owcRJle?aSX^J zP1OaGW;5z?QNQ-E(U;eT0yzM>+p-h|!5=1dSyVCpNfktGXuClK!hTM26%MhVI5{=J zUNZyPhxA@sH4+rp0(QqGK8!FLb8p{!NQ4;uC-ZczeP(`N{A#PwU3iJKx3QRru5g9r zfN)IXzK8D$x-nyH5F*2Qh9z`m^(JrlsOJr82#nvsd6jWpEZ{IcGN$o-Nu<8oRn+DDP;8cOjBM!=k)+Y#|dME-r2rBUZDA;f3MAt9WfVG4^!_A6d(N`0~ zKn-A!8ot8BFouP^g0JGKv0x_-DuXMEWQIEJWE|4bOsr4x@M?Hf-4bbXOb#-UVN&vS8bl_6YbJ`tK5>X#1}0%Oj$KlC9USqo<{f|X$mHG_tTcPg<1cQT*34F1g>hAO<6=I8yNX~ zfR)~T@pM*;L&0HS-rom2jylZZIi$EwSNga9`Y8SFCi$8%4INpOQ!giau_G=k6W-vIXCL?K2LsYIQ=gg9=>(V2(!K^-X&!5;Ab} z4kvHJ_hl@;Fv6Agpj#Lfl1so?im!u=7GQKksFv2n~YA7!i@DXyE=M_g=RhqhY6JQ)0 zdIpE;0UpC~@|MOI+huXX0Idi2T5R7`w_!J;1d2E;(yeHEC5(R4xTp6t!~aK*Aqb|% zqEX^W)k{ge1n+-$liz)vb1DZX&c{w$6)Vj~wrHFiIkL?go*IB1yF(m&@2|*7KxUt8 zG-s35Mr~dzIQ#W=uhuOk!e}*obn$g#f4*Dk9@Jgm3VugkTG|1_9u_QY#aKI`dsE#9 z?Xrgo#bSfo`W{169me=2xgD{~5|8$58v`4~=x0GW3D5m@F|I<)w+FXsU%)X8$u%!6)KTkD7!vW5AFp5DQ-Q*BumOt&IRRM82uGAdqhZZ(UOeSLzDe|) z8B2b9vh;HBtp&aEkI(9q!k%KydOn$0WK}YZbbSSh*Kkf>MTP8)l@qG68D?nIz^A4N z-o))wX|Jf(?wu;pNc!HwOaIgq9IvqJc>MX~@a! zwt%}7&d!~S(o(*2-?>e>cLj?}IzBQ&Yx+dUs2(Wd%jZhZfKy*g_{&c1`2lAcM**_# zC6ymLKRThapcP5|hvt602o8jSc>Y*6g{3~+u56qmM@b1bDFD1R2CS9I zOuKP3&)x?}3!_dM1u$+*kIjS;ds6S}<&_5tEN`x}I{-~6c*1lOy~ z^zo4ZAqGnvT!N&T5|;QX*tcVwee$b6V*3k1jH?oyeRf(-XoY`6Z|~#ZxRk&tic_TJ%0=I7)DneMayB-% zDZBXlK<@B(Z+*G`T&gMLXZSY1f-&PE2iI)JBID(hYZj@+Gb8crLu~GkB8Dd|YVN@N zm*#W}6N{yzpGLBw7OebHyjwl-a!_r$#Wt;of72|}hU)}ht=sYJ`%#h{3CV0*Muae`zU>8ZGILUoxhTs`sg2$rKP*RizO7`QSe1lkaP0$rrzF{FrScFDBCU4@(cKg+WAFAw{Y)S z8fjkyKWJZe2F<10Hg>-1JvBcYq(hWk2(bA#KXB``cKwVe8#%rOkFZY#vtbvoGPD5ej0nx z{$-J(1S?W(Pcs|`Mi_)uBu1e`E?y4aeO`<I;^FC8iHjjl*X#p_6@5Ms`{9MIZT?fY z8BZpomj;k?mN z6>E2vTt~U~aZXgp!{^(i0N8q6%k+0=FEKRap&r_|d*fq2f=-7xZ z?W<91lr}WL^QL9sP{+lLZAMv$&R|mH%&uJT1@(hX+e)a^fncwnFX}}wFGWe3iUlo#GIZjj#BxgZ_5;5%r+C{>P4(|9pKp zJzi%aiB$PCT0{5EQAUXe{dI8v3Q2u^x@ z{Vv3nDPIpye#`VH1aGMW)<5@0_3w)pu9y0=xnt&Okj_3rde?51UtOT7^KG# zMR|2Q)KCS(sg5uC#GidnudRhGTR@HS>I!B(g{@;;$#8@U?Ys-&`Ie1Ta}?O)1^6kf z-C>TT7%RPR-;Gq;4^+E~&axX0+!Lo~9WURi!z2)=DVtPKAA5QIRxLfu4W@y)YbyuvM09{qw%zcxmmmmVLp7 zlk-12^*>+AiwyxiqsUvPo>j}4IZ01V$Sd*|Tf?Lc21(M+h>ME*d?Df zd%O1DUJHo6ajBy$?_xe znaH*bebsXG)fOpZe859ppusxLFi)wR;W*sJGNgt|pLaqA36Z_c19n~qItxJAi`{bG z?LLb&J0OnLTaq>u6csgsZF5h2Zur{u2D;rOt+sZ5xq=$^daKq5Y9Ps2uafuh?-4P2 zu-Hs;E~+Rx&FmEn-@mHZB9`#ix`@&vSI)+0{KdbYo9zvMW)*h`rG}wefeM&_i^{<) z&@+PK7(XU>chbYNDjFtU(i%^H!bo=2=sNvGUeV9!%A|0iVPCVim zK7V$=b@ybMhMM7)^po8YMN;SiC=^TZ+7dmwx{QDRe*BSAu|X!G0!<%m{%Z`D1T*tyge2o^I@|syGXe zHgC5~FX=nFrUPlY8ZvaLNK9axf|RKqFNq4yIvh?+6Mrq6^F3%ia)o$T78`4sGatHGTE5{$gO_9;AMZ@ETP8BBoNe}M8xhsp-{*NDthRO! z@QLOJ4*z_kSBlkCbxLjRH3Mc_U?e|;vO6YRWx)xl$XBU+*|oLKKZVd8wAF*hndZLQ zJoT&&(IuTLz_frcs^j4~s|gYGZs3+)Wm1`RLIfV;K^~{qD|@(QZa1m@Xt$E6b&X!U zu#O2-L5{FUbJ$xMexO@ctgZb6J~a@v@XRc=SfedSTzu-^XF%8AeyE6Ccc6Q#A=5Zs zangrDbtnfPAvTCY3fGq_vK4v(&RyMZrdpZ03|&q-1ipeAu*I*iX+qpWEG`Cp8#E;O4mrSER4 zt)bhfBrW1>SFa0LfWx4A2NS}prQ0*R!qAfrd*kCh<9o>m9VdW$szu z1@-O&Vy*4grMQp)0qw4$grGGSw;j-1WIDzNE8ed5W#Pa~@VbaSPN%M^3wYZAKQW?H zj{;ci)dct3y*(qAg?Uw{Q^~!$1IV&ms>8Myr&_{ z5;aY-wD?qYTpXVAfOhU5Jo?srXOI!1g{Jyg#!uGs)2to~|Ik@9?D>XK4J>ACc3>USveWxxEHv7eT zJzw3(Kj@A(pKI@Q^e?qie`e+}{6hEq2v=$!=2m#zCzp>8F1tSlxpp7(os_c(Wr!yO z=wudN?>f#hzkylYw!o=_3X{`+CGPL*>;2$AH4KgagKXUikkFIhT7)Go94s9Bj5{L1 z+rS5c;-MAoZVstu9ZBDR%uM7GME!&b=4h1^%_ZHeBT-|arp3p)CQL=O_db)Y7$ph? z3!hhQTI#5_j^zUmrpPovClsrw#-zI9Wd6qoPs{X438%*{lr6r(gz~(iQE+{j^;>85 zyLEavCG1~%VHJ?T*$Yt)n4O11fx?k zk&pItXBpw9k$m6f>V=?0i?k%_@tJY0w;xzbS!teH98?uotMrB!OkOS@tIKl?qxw%k zqIp@_Q9PnU%}BKv%<0J#V;S}bb zoSpl@ftcQ9l|_4r*^T=bcSJ14I<9Vh_P{<+sh`Y5Q`vdlWP#uoNiGR(6e9l=U{BKQeGap|qq z?f=XH0>_K)&vyU)|7bJE4X?QBZ^6&zoX2e^DG$5RFGH;I@Z9sXD_MCVt7v70B}ZI?^+ zU-TDzTTUyT7+!a|f&T?dPFJYPXkl0VZ5ACAN#ihng_4=3MP(-ijjG`Xz(lq4El5{w>}3ykU?R+|?~@`m-BfZtC;K!q1N z=o;8uX_3O15muZ@p`I5y_#(I-?;HgM4Q7UylDYlR7QFfJ&?=x`LTLHzilXDF7BYKY zQQV{wAFU%e+e|CEwim!~IQ0&)3Z+W=I15Zu&swBTYZ6aGA8?A+>MazpA~Kpx1a;@# zRnN|}ftKNT1Zt%0T*JmuauCPpJYTXLa9YV47HQflg{v4f+AoXZt^&CMB#9$tg*8k! z)lAN%zF%=Us`zd1+EMoeTokpZ9iaCpN5CS~66;|Z+-AlPPl<{+C%i(SJXNN_JXeEp zKb5+8hVmJ}+BPlrtE_%iu+X@-C;`t8Zl-Pfb0}W824-JS-l;@OZ3Z1c`#ON}j{|(H zUl}z1+E9P)qK^s*m&AT<(H$P(Qo)L20csr;xhS*pqgTPig3ZJU!X>Bw?T3<}r3>;R z0XMaz7iqyJqA!-5LkHyhe)#Y|AgyeKv{qRxXP84=R-mG~)fD(je=p%JMt&N_S(>2S52>*e^<7#) zVSQs+wY5d1c=hmL3FJat&K|hT?uItiWEOhFdDDYA-1rm)n%B?|CebRb?LD>>u?a|C z7b5r!591WD!ozFKF&G!R2$N4>fypK4hve_1?tHk?0Hu57N7L_)`wI<6Vl$0dl^a= z7JV=1@YNgO9P6#IuKvDrb%}bH#GDQ>tur7Q&`J_N-|!12R3g9kd%4JrCt?;M57i~U zp;(SN7l49N=Ri?3n)sR2VnF8`Jp2c}THBM_{r<22)o7?NJO!cUIWh(iK%!?7*-_(A z6lUGX2vULUTT8v!Jb}PPydp4;goQ-}-aaBAaH{t95nh)UiBi+IJC&<&fi1QyyX08Qc>uJP9A8TrA1<`|#gaJoI(& zQ#szfGVB2d{qG<7+S_Xeh>2$O)J$uQX6TrP8r(qR2h-ju|GYu**-LoeZApDiePvQZ z16Pt2P!x||ZpynO!7HjCTeYuA*zyqxCer1*ZBsz)O13!_>^)W32hpLW!kj|x{XhSrxTJpsrOh^fLs6-;beN4ee6GQFJ212 zlvztP7vV00-0b&zQC=Sa;!4mq7ofe`N(A8ByBB-_jayinavL&v6S%2q_MAI+B~Hb9 z$Rp}xvVbNauW!_;SFzg!gX=s<#?Gi4cn9kI4y7eor492d%xxjgQ>lACy{1EenQOt! zEPK0|bAJ_^;tm#UU7 z!UJ8Q)^<67cVp}IWx_OkxxZ{lfo%bHmmQc|HwMn}8q`c#2XUwp4FonXfJf!CUVMC9 zKa&TrvIC7%&Ll453^r7a@xebsfG$z8L6roShq8tO1dHvN(~W5i%QVrF9c$?hkYF*^ zgTCW=Zy>}sxEI%8y|{@Oli@UxG9LgtV1?6;Cs_gTa{cs4CFB}oS+U-4?p;WOnx=i) z-^~pi)XaIVJ<;`Ukr>Po(#0UWopiw2FIkLg9KV) zup9U$@E!^WxvoA~G$T@<<%lo(yAOat-PYC~5Ip@J5343Kr&H*o;MM48(~DqjE5yglr_HGo*5P}Ew<|w8~s2>=@-(D8+99mG~Hz+pq_kt zopOyo?`rAFtbxg{t;K#&H;;K>(x`w`G`VB~}U+wii1It1^-!v^T`2j{# z0CiuEFX&9f>#DhnIm3BRoTchOYtmZ(vIHrVUSDrG-PCSpJWF}8_BYI--Da%BkjaqO zhYNMr(q&=f5cLfN@d{ouD^kdZa1$>D>En2rhFln3KE+=6CB<+&aPk!~$q|Ce^5i@Y ztC=1C(&+6}?4$ZkNs$nTF9bfakaAGXJ!f~8)eE!*2sZM%*hCx9w|<$0cYOr)qP@)j z#~FwNOE$kcWx>vP>rp_1p{+L{&ooJxBCxsS6RtZgfKaT`w3XPo{MD({xVIl~I5qYy zf2IN>xw!~bsz5TuR41bCmE>G<(BY-?-D7b_>&q4!rI?^>*F>iwyJ#&6l2NRR7tQx` z26qP!&!B_<5tYN~9Q26#nycIJ-25fiINU!Z+Nh3nJ6RQeX@jvFuwR~Y`z+J-`5WI{ z+6u&7g?lI)A-!;&I;`BEEPX@k5T_{P&xg@#_wlCSDuOM~snk0?Zz%7S?`&B-O`Dt6 zxO?Av7+*+2sm;k?UJ#518yp(Kb&_rB-?0}xM&59{@Uav*^wj-h9ieye6hfHllJ+#) z;$XRZ$@%Rc%T+aFJSR@ec)&eZQXK!y>#A?|ThP2p-NV7A^E&P*dKL=(4phD2bDGU2 zNTC$x_BgRZ{eX{URH;P_MssOyVEO|deL#Dw&u6Wnn0U&g32c;WK3UsQMe6t%FW?{p zaYmvl^kIusy+z2)WZ9hP(9H;LX%@^!{@zL4J2x<+F zf|gv+_jPk*K_y!2-jo#bFb#<=W##h>T#sRxEwyF`oA%GGyArLfpbGb=&wKD{wBz(D z9aAV8^7iD}qY!53S32F9uVXBM+>Z5bNDR{M0Ceb2K5;(SS1GqcDPAI+-DD7AGoy_x z6$ZL)7d9djkHIKUwaCK~-fSC@X&paBx=Wh%-6d-Mmb~Rz-PUqGo!Wio$ zccFHB@8GJHOt+FQ@+gi*XM5^+gVDZ3aD}b*M#z|IsJjkCygL>ps1vCVt|dw3pYj zaP3|D&b)q!gMp41S=w%~Ey_s#HW|r9FR8Gq5YicjUUC^wla07I46%(wJWt zm@F6l5!PJ?Jg}zU3XJ)cp5G(hr1N~9r}x|aZEI9UAoPTqXA8D|52iMLnr`D7I5hGv zZ`ar?zhHW9YqgoiV!H|+_SJJ|pNvtPr zne%dYi1}549ibGCaAh=EWswk7%@=;fE=~z&bWI;Aw6D&k9+kjh%u<9_0%8Y+04VN}$0r#NTJI)}H;9&gnyqLxt6shgIR%*a3e5G4>W z!7vdmU;!vzFTDBQO51hVT0b$umb@rgRs1}0EWWgXvVN zj_M!6AIT9K2<z#2zyP#-l(Tn*EN2=XKw{9n9k5 zJZWlMWR6E-wsdu(%T*?n!6+yC&64y12d26RYbYtMX4Ej_4-VcEwlZ51h^@c6EuX4;2GHfwz4DNS!1FSEkyd=Tp^ zoqQZ-3?1@<7g)W6X5w>THM$b{KI;YgkI~07dD~{i&yp)To2;xn;S8C3NH%JDi5V_F zA&>JP^#>w zj>!QMUQpeY`$k1N1*eXY{wUr5YOtDq(9pEx(iR)r@ohC5?UwR1KWV*s2_MB0 zESVomSvzoZu@A_Hi|?99q;v_7?HbP^03&@qu_Of3c^$Y55u-rVSnQgnhSX9Be4ewf z9WTp&fxo|dqHPq?ZpNivXz-OywsPXL@%n|TAvQ-}Tidwb$+#VG58Z}3Mv=jCW0EOG zf1VosArj|Zc!k`*8qcDJP$@s=c+QxGh&BDrFr94n6Qe)k#9ktoWdC^&=hSn+A=~ji zhwj!~?qEu#n5pg0FzXQh^_nNj9DLN(8e1#;@m|L$&oweK6B@0Ccd)|Mwrr!oa$tG# z>z|fD$cZFq* z!*CB?V9}Er{^kmt8i(;8l$fT}QZa&&Df`-E){p{K*u13`H!V|&c~LNlj;Ipw`DiCm@qRQj5HN56i06f6chaqZ)^I^w69SMoH!+W)rmX^ zojrDO{D$AHla>Ej%%y0xh~|k;sih6cyUs|931+SAI&*5jB)UOjqAb71M;yNw6weI! zZ(l7y_yn^G>lF+TLryMU!-DP0T?`|QV|@+K8HMc{D{$SS#C$;lErt5kl%JM}BCr_F5D4zUms#^A}ij7!0{7Z11LPXw6G(dx9I?bEn>(MScFXlK4! zd45G{O4!_hn~?N7%jnNB;fFR0cBiqTbdVRVxFQe*bFxHOjB(QSqzaQ&w|Z*E|skmvCEub2&!@>6G}iP~2QqBeUgKk-++SWi=?-4xPA??h{!E$f;x^ug~1eGmaBCgD^T zJe0O>?@^b(JxN`s z-;6*i?H8{D7mL^8!V+0?y$nA|*L$|%^K#=4?KCIWO~IBPsXEQ4B@F^Trx*o>2&eoE z`!+dH$B7tTFc;*2BfiM@zN7@`9N3(mS-t@jYfU{zAS_U+{=HjiKib=}QOBXeaLVsV zKpq9e`N*Mq{0F0SdXI)gPp0*S<$;d2Hqsja6};H`on001#Y3>8ppoVt-@zKYYwZ-C zx)FSH_OubF`L>l+VW;jjSq+nr8>bm0G+5<#x8V6sI5uva)_m16JzkZFJyglnVKq;G zyCFO}t-sFzH_5OGi@qbOA7h-udug*7dAD|x)oc;;_iAr(b{2Rpr38}Nx%ou{n^Mnh z@3n4hTJXbSmh2f%%|D%mJHx#_<{r+ED|MKwdiSYBSb))s@+QNCxby^#`=%lycXRGukKI&RVcSFGkA5+Zxt3URAF8u6WA~ zP2^d7GIw4GFU-pPfYuu`PI0A>E3)q5l5F%8$5Dlh_eWxWNrhSXOK&6g)M8sXt{^1! zWfiJ~-5+#xp#C&oAt)Q+hne<|$y8skb64iHh}xveq+xPKLTfThIv72x^gfU}qyX-~ zav;}3i=+&o4yeFP$TC?ouiqkb9zfUKU>v(k3f)%lTUaq_$SA6%-(e+lZ98PJ7 zA!lOWXcf(527SJ$KESyC3CqN%HwG0SXv!||T-tmx`K0V285RMkJ{VUokYzgC0R9YE zOSM^nZF25N6{i4h{@^-e{YhDXur<^vDX)P0js>mdsxA^&olm@yKljB>6V<@eZnLnV zM*ArG4Mi|(>-V|&4Wr`&nd#&;Tis;2|NDC6wjYLt=pF^_60~VCu*vaDs-{0}ivnR1 zM}wx2+NMd&5Rasvloepcnw!V>1VUVKq&@876|PQS>Fg>-LcYkTjZe_TCzAXQEK2Sr76+o(icq7*4*Us}j3ONCHb zZYs)>B3riGr=pD_`}S5ZQsPR;eu@^dv?xN{6v}!__U-q~T-W=3zxm_bbLY&NdFGjC zpE)!0q5Xc;4GFU`AfB^q2WOauQ&WZ@@8 z_r0~ZQOYFV-10Tb5(N>r|H~({bUk1W*cKB!kSDpWch=&P(ESh~c$?2Z$K3C)j7~q~ z+`eaW<_Y_U3}}jA%iM{ugW5e;7DdwmZZp_uoSkS(pyyVVNfK>=+{_DQa_!#ECsgVz z#<~@bi9wH!D^h2hExNpM!~g3l zIAc_5$O}FL@{se1w3ASjIX`L_A{pi~*-wFmt@BokS)ALD2{M28wG$d%0bA($7w&Y` zpR_)SdQIn2y%s#WC2Pm!66%=WkM6r+?`LzVZ$6A(aqf@PfJxD!e)T{ zuEM?SaTl*oZr&_5yLlf(9C=AC_P1N#(5!%a^>2?gGVOa(+TFrvF)0v&u2J*@NyrgBB%+P zfkzJ8NYzRKiK2Y^Z)y3tdEJ4?!X9z+*^1HW@{hg8q}ryn1u=}q%#SI@ zei|pPdM{+--kSMgDUyl=&+jM*cC1CWkdO=&qPCr!R6P{%WyxmNHQ;+b-Uc+hT& z%if%??%gHJItZA!!Nvp~J|6uDyoxJ?_q4$EkfaKJvVT80)wo2ORRz3hdLLH_7m~Mm z0aj8kPno;mOxBm0)$14h7Z0d?nTIq5ePOI_c`Izf@W;_gxO@0j%BDy8mof`79&IYe zd_=?#)`mH5^sJnznyv-HV0y8Mo$l?)IM1{zg5RNLit))}0D@*c-gP5Q6`JMyV*Sr$!*+tKMY=oT# z!@~X~laFRKY_|vA6LQ}muB|<-dNmk6YC9C5v2+<@XTMUGJ=>InKIsbLt!m-3?j8rW zC13IgJgbX;GHtnm2FDmDpcemlyfYX?o9$OnvcV_d@uKD5*?v@iJ8ABx7>uM3ePLmb zmU-Hv=Jg!ulh$QC<=6UAytGfZ{7xLV$lqXD?*(^+odTKa*mfcIoG@owT`YH?sSE#f zQn{s=5WGo+L8m9VuEE`>SO2IlI=7*gdN+*_Q|@bBm8mjPpzke4338xI!+Pjl+fc1e zZ$a$ao6fZ0lmnbUSnJ8~AI#gM?Vjnc_2b?BlfUYND!HZlN?MhizhIVyb&Ps}-#BXl;JA_WdiK(2 z@_x?)Hc^Oyhaj}u>MC!8E1)nx4C?ofDPv14#dPuCP07ufmqrbRIij&E+4fLop`Wye zm$BA$e<>_MtUo(XTRzBjU5nWi_GOYSyxl)%0oe$<0xsZT>Qq^~+N|evRqI8waY~gn zCMJ-8>HHi=IIk=&*ca+^y>$LS|^q``BdL~Xz{J|fYxJY%fdmrq0^XvZ}*;-pnf##7+S>P zcXEBgM>DeroWB?Z*iJNry~duYRd5?omgIkt9xl=Z!Koz_{TI(A-hctsdHuxXxOeHZ z`sx#?B68!XC`A`S6&EqXVOcmRoKy1gR*4TQzcXmFpmQ6em0INLU+`gAx8tRrm3@l`P z#){Shs!BzJXralJiNrZE{a73N&9FfM{Uc#%)Iqc zLFe&OS>KNa_(9R%VACcwR_=O@;73W`VLD!XKZGQ4kJx!|Wi@-S56vX&+(9t4eW`OJ za$C|N9BjuaBXyiY$y*S_7gBh8U%-619X={+)-4C(yP{FXc>}&; zKmWJC?Ar(#4n5*0^eBeJL422zu0Oh-3g3Ux-uOLu6u%MCG)nXhAbKIP{FC+ivA*}T zz3riC&rdDSKlDu&Bhn!Gfl&BzA|mLVdTAT0U{oJ)%p{Q;5(n`kc}2CA=naDQ0J$7( z>eQj;IWT1Dk2awlN?BV$pQDw}fEUZ02>%48@Umw-E>zp8@LQYGi!Wt%1-);*f{j7@ zbE_$7xm$Fr`9GjR z$AsP2SWETn#nS=T%YBO@c}GG+ttz$tsOTaS$M@!1^`GzepGS2j9+=L5Y2&aFal|u@ ziA8?$0c; z);8)>o`?6rDq>8Hi4~o}%J(06NwK9PywubVPPp!{2d7zfI}^88v%i&<-wshG%C7^z z$jELXmEzfb1_^EOPAF$LEI@)}^p6h}?5V-&k`bmJvS%=^Msy}SMW!JV3+4{maFv~o zw5R7j-p`g~oIKWH57@{K5_ua~T)RB~{RLUipEpf7&%KVzE%rM8Ik{;1k;SL!apQBW ze;geZ5&lPX;ES$+oQUwo$_V*c66uDZft>@}GzMPIkr@1cBqGBhk=uf^EJi;3ER4ep zaD0GS2DL4`fO$cQvSm8_ujQXwpPR2Rz`k>B*YKQx2aiPS%xc)*Z6O$s{7lca6~_pM zf8>ZtYFt{uTkK6uV|t_JdH zdTbC^U#1u3I(_Ih-`Qv35Vi2dx`eD%z7`w^?2QQqRR|xsI&4%J{NHhlW5D4rD5apt z{z!kq;|sFGY2eQthdk!?I9x;4JMj}Q-BAK09&5q>%;N!nGAB-Mj&B<>{ z5PtsJ^vd=>($!#SvZaXh#3TJt+erb?W$e_TX`i#KJCO4i|I%+XQnc`06G)IXRJq#% zPWebEA{z%M-@MWDUly{&k(wE)U)em>y-Shx&t^2AfS$AXLttsITzi~c`-}csI}VM| z-+>OPs+-5IW9I7A7=oD#CN;Wu{tY{&q#mceK@QShb~fOrKik?xL0DLw)gjb>ZFH=j z+&w&5U>Jj2G8pS*h)c9hgHvB{J9N%0i`|21xvXgpZfI|mg)d(zgmon-$=j(lvc=Xl zSvWA{85ucl2~kw&9r?278g`Fq@eUgw20t|wS7&8GpkP{NIfU(UU8OO-S(AmqBR)~T zb)tS7khn%vsSHA-Kj&|5I81hZzJYgP0Dm<( z&p8GG{h7+cN6{RuG1I6(O~_t++aLuIGD?=Qj6Bx>NCHe>=mE37&TKj5tn415{=jHAD!KJbvu>^oGgN*_1?$0q0730JFsAG zZnLwtG7GE=c1i@BflAeUvy?7vk%y!w`L^gvaBIPB7r;Ku|8gQj5Rn*2%e8I&U)0E- zRO`Yxrmcdo2TTyekaIw9dg3ue4bbiLf`gA_akKbf*!VA?EcyK|D6H9hZo_8Kl}l$) zu^CN#t+ho(AkpR>mb0p>*W0ia=+*jv1j^P>E+ZnW_T3ER&2XEdoUej-%L*Vz=l z;;$uKpDDoyn-0HT!u5_49YXG(W2m!6^*<@gJ$?AE!#`eyH44!@LMf%Wk8(F$2_Tv~ z=YJh;JGt}YBW|L>M4=4B%cylY)w*sph;m{6$hM)c&yjJa)_FrO`hLV$R6tq#n0Q9G z?>0F?uS3oTjT22ML3%Vf(!)w$O<@iE$H_N)Tyk1t=<8lK8FI2|HdUK&U&)dO$q7TDK6#(zG=|SdGby2jifH`94Tf{me9u84aUh2tH#en9bdbhJnk&^C@Bt4 zpY!~Z(#uSibv$LihcmWxzCuISjs#rW?1d&?osL^1OVW~8OCOR_*(xT_rF2YOZsEVf zYVTv$xyO~RS0FmhP}D&0@^u)7S?eFEf8X(PwtB6>4HZ8df+7rND@Qk^X6zwc6J6t6 z#P{+u+Hp+$)63cSI+ccwMto2BLxgWt!v4jQUosUzhZ_qb zJNh{!POwV-SB{@S)z7$@GxgJws?*ukmo#Xmd!Lr4Q8h#So+{3I6h-k_Lf0hoq=@K? z!^gzUQc$xrTkCbB`}L2w^q=E^NlzO)+7qaN?RJzm(UL{Q&wB2~e8e{md`+*mX^HSh z2aik2?U=>q7v?4*@@t{tV}=4Mwq(e`Ep@l7b8&GirfQUzVmqKnw!YG|JS>X-LZa6y zFS~T5fGvM|@?s`&Zi9Qylj;l3QC!?6TgAuE*q_C@aPjg!CLXEhzjZFTv+#@uHb4Cb zXK>^pHEYN5^=VdoZV399=7@=xhp_}~a8Ve?;4t1eoJ!S;)C&=SW71z`3Du)vXz<(afJr2tDDpwo~ zlaSzAayIGsX(#Az@mU909#u1f3KgY8k5Q1SdZFIIs{>*uDLblgnR?-NTzml{E zBAGpG8`n$-zN>nG?|SYYZaf=yB5Vl{*OK2~puRxF$v(6blIU>?aIkyWsxltY+m~kA zSmT2F0g&Y&s|%-|ETD&?S&M+3Df%SF8zZ9OfVrO0bsmG)9b4;?pK*qgmRcR&95;`- zrun+x({1a}JHEFDBunewXE>aC^`29Vp{v+BZ`!Y?>=L$j*j2-ozFR4q%~OST10r@| zd6&7QzAIKdXL3p~nqF$Ahg-(ZXRh&jjV+Cm7Vj{3S?2@#YM&@GrRb~kyoH!fJ!KJh zIPc+K`iAI3Smn^IjP(l}H80PXUpJ5?G=ij(%HH3{ zP#bc%Kd36TE~$z%mr7hK=R)5Qa|m-b-73rP&+q0nWOCs%p%G5bL*UT4?Kxf;By>caO$ zPYySF>S>B_NB=zvWK)LiJa|G{AC}DDzM8c5)*3o`3LCOs#x7wKfXMXZ)%qMEODc@t z{*Exu;?#_PNz>|0m_JB;tX#INk=GFiem{bT5EU5$(OD=d+`-eZYFKZ12SPmEe!vgV zUOk

    wpW(Qd3H0)i?v4)B9g3`f&`~S@PPD^W+0kE_(>64$X?@SwoM}`cl)ek zHeCHmv-vZY2#Fs%G_M5Iy*JBwqQKr^0P6JGrFGqJq{efW3)t;c7_bpxy-T)tTZQZR z-|NV_DyxtM94PpXC4O&-C)9e8ZoGnWnJ?lI*FHSlm^EwWcxlJ=`%Z(5MxUGfSE5gE zM|&7RmpgO)7{663ZjF$0{6xpkID2tQDGMAE?+e>hHJ_2KDAZhw=gkPUuj&;Akse2} z2ty^so*9PKgAlj|F? zS2+HBo(@(EjJ7_mlQe2<)_CW5%DicOJ*PtE+SB0^&OK$j*g!*e;N87g0qw`aKJeQPRGQT>z%F^U@U3z`GG4N0t5+R$(-| z(>-Mg%A8F0Z@}ppB~i-+)VziDXh6%qIUEL7YINKR=8G>u5Stw|hrZU# zLGLl5Lc%62^pAXeZ)7-+T@fLFsy{sbhM$EY-VSOe6Mo33=rl|bqzN)nRD?yMpN`he z0#44clFV09C$Eht4;|fr4Xd8wa7nHD_sdgoTTn%Ge6?r6iJr0-AXEls-^5M$#>80T z8}&<|fx_I*Ubr%Ts;A7gizCkonnP}=Z0$lJR!`sLI95n}ov#izK8W;iIE>!}&e0o* z{+{DA#laOjyQIZH4d00!k?obK$Y+q{U!?P+&vT$6q91^Y*E>A{B=*r3M(jH(eddf& z*o3A2k!X&W&!jo`4No8KDf28@^1rZ;D58zDAbA-8uS<5`<^KM>Jq_o;Mc#X$H?WFO zFOJI+io&z)?*onVN0i*Q5Q$ZfblDX@HVR93I3?`Qp;E%;rh{kcNhN`>b#^{P&wOuC-h-ru2z8{K7ly}Gur>wqoJn^PqN z03P{SZxufwKg68E6h+oQz@)v1X#>`GA0`A`Li5;w#lRzZ*oI-UAt?DDl(!=+Pwx|G zjejeD56Dgh!Hefb@N4+uby$JDJaJ?t#&#Rm#2YXw^;I}U=(Q`r>G{4(l&| z;_?j#@~&Tu$1$Kyvf@FcqA;fnY@j4LnwcfUKdWFH-1;K0KSJAFU4=~=ayJ%R{JgAH zd2;5n!z$*`Q)ac;K7=S~>Da}}_eY?RJYX_0@;Bd$^w`8f1{vPuJ3Uy|5R{!IGQu+Mb2+ARa8=IrDz-n5~ zQLD@fUjx^I$qK&61pg#S#J)wYb328{FP!=$Sz`L?wF91fRd@o&-)Z*u3 z>1cYd!E+}gd*gf*z~lhy%8|{9P)e-YZ?Qc#s?a;^EW0 z8`$RH^BB$H9!Y-#SUkmUKv5k%_65=g|InCQ{q;E5#AzsxuFLY1bqi=F&Q3B1R&LCL`APLZ>?T8njhIQeil~(Fa~{&&+~#P2^=2%--+f~?SyHEoc?T0 zeY)3`x_}HgrvOThBMb>vuv}O({{q$_@q{m!zY-h3GsmZ_;+lk96Tf$&5Xn%&@!6{R ze%?5QxRh2}-GgyM?m=ed){0we08Y7oE02Du*{l*bhjnOp%8y-pg}1EpA$_&wqBE5- zceY55+RHjy>Bp&g&T>9}I6J<7M|wmakNJM`_ZDKR8Aj9b1_u(@!(!;GYQ+r(QJN(J zHXSAqmO+c;AutQ(vWE@EhheU#DR~IgIk>?;Iq$N6tv?wApga1hhso99e-Q5RXU&*5TAON%1Nn*h35a1-)5Oq@I%{6sM4wbdgu851i@2Itkp$=Dyvs z)t(*r9xgWh>J^)Fo^&5>j0xf7v43lir6`~~@{f}^ZQ|V@Ldaw7GWef#wsB?55N9ob zG~1ilcU*3h{LwrxHnGSf$PnesWUKo3AqzR0lJ&7gY9=7Chuy%;m7co&gD|?MsVWM| zeR`jvC?p@dn)wWiB3_$jGfy%5t|PjsGMWSozh048{-gJp=r z4%LUQD{SE4k=;(>O9OLsM?ck|`Q)jA>uFc|X4kc-VN$#(l1-=0)QU${|Lp-Y0xVlGO_A7@UkJq>La_6lc#q4lt2nt zK~C6tXs}Ue!kre)INbPoh%s<0hO49jS(^~~VJDJ5PC8$S`wa6m(A_GmhZ~l}`KW7x zv(L*J5HC}gaO7`40Ed276)|-ZD)IP@JKAAWmtOY7@2@NuakDwhH_Z^}s}tZf;&lqU zkOEwyjB!af9$c-@kKMAp&(Cm*g!W+)20P1wZIW{y&^If5z_O9as(UY|B(x!RIrE`+ z@GKY&D~^dP+V6JR#4UOsO#Ga)sKa!PK`_H2esL;EEXOQGiMR&T>} zpbWO|x5JGN1845)ag|i;(&QAO)nE5(h+pDoFTy0N7Gfwwg9iZSEgULMta>OposJ^V zsarV%!G3$fUcnjP4YdyaE{0H>8@F$GD8wPLB{Y$I>%#RRLUey0eGyOUy zY|)#j4ZMXhDw9|jhnyuj$5VYT{h>oIIAaQqQlhL_(aT6=cwf|p9(NjhT-T#3;=b?j4lWwVN|y zrv(6`?es|Df+d)C=$+e!j^?ZMOR6$D!H%4;!HjU`K4^(g??Yrc^u_u|u|Ef5-p(}+ z@q4jdirQh_Z@$B(G$%WCltG^~)h}$ed}6Oj*Ui4U7-gZb-*w0u9(BLEa4-b>Aq(@uM z5uqJl8u-M6I8_in;Kf;m<>x>czrS@e%BJly3frXQc}ZmTOd;l>iRj}8_0__0KOvK@ z`*=A9lgLTh#rdzd!nnjJGg-6%N7B{kCG2`i`!V4Jy?hTO!bgqUR;B z5^rD#p-$E&>vbT*9qs?0L6a7HNDRS2)2e%46PBJED$dRFk^}L>7K!Ll&mHeDpE53= zHi$JPXQ3SW{Kn>Gk0B1X3Y(aa!~9%i2tf}&=~+($l_TW0D_q04?I}6jsIIrq^|%~e z*BykOF+8MiHrH2+#3N_@33ymxKPeWo3UhrlBV1CylfmgDM9vbT0zkhcG~sGzFDb|E zFi+6GnCTbp{r${<*k_AOLgb~>GhJmcMvID&L78O0)$`O7LfC9kE!8Jk(LSSBp>PqM z?P2}mG>My-4dBw0KE4leJOvK76t~x6(3R?I08TRR@CLTmEEv6ttKn#zLL3~0hTfd$ zDvI=2$I<6xw%XqJj;EsHl#YJq*f_+9e(GXW_Fpm@u7e|4w$KY1Cy-tc9}=hofPu%^jxa@IEUYB?lX<}n_LW8`ZxNT0maRSUvZCFtO=Rhm9^vg z+&>nKuXj&BJlspJ;ZHfS!P zVyzNZf#rX=>u_-@hZPThvX6596C-{>4!GdA9BDO_OFvqXW+2f9%VicVB(q2BJZ{{< z^nsp{iZLIH4=kR`+wm&barrKcmXXcED$DF!@I4e!{Ps`H<%%@R2ebB3K%3D8^fDoG zPa_Q%6VTNvVjY$wYEP$><0o)|?VJibG^ql%yqCXcYsBH~fFIOUTR#qVX>Ki@rl(zH zg0^zrVLFb9v17#Ysy?udsPKJZpTkI1C+NhUEeOVB+e@}&W_4XTjALXDjVSK5&tJ@g`%_`I1im%J9e z0hwfExUw0xp+x?H1=-6NGLFLOJNXp+K565c0F@&{4JGoWs7`t9(5$Y6xuZL-_<>h% z1zYgAxynT4R9ID>MM@%xukdSf33 zkE{`)?Y4t6`_QInAPM3`>l7BKM3|hw6+lkI{cHZ>ud+D)Gkz7m`)mvsMYrUet{{rs zSc(Tx6u%Enn*E4*7CmX8ME!?Xk$J3XyZHh(_*R0{HmOwC`?IQgmHT3f=j8R-K*Gq= z0XF(*=Z3U#H(9Q(G9Q49t9#&}DuqFm=VcsJiPd5moG)XgJ+X$$ykxix1H*Jtc~Gq9 zDl_EB0p97;PVI^2+E@-5q;l~Bd$h0?OJ?gMA*MoHpN$}r@F4^=m3Hi_1&~) zF8=%Ni8Q8YdS|$a_Y#UHtgE~89e59V3N+i*VyH(&{LZ(@lb z?_qAGYVt4elFEa_iOB|3TLBZCdYnWu67lq3CktV7Sj}JoFWc-~$3A>! z1@vIGcDW%i7n??)9PgdJPK)oR|F%LnjmA8052!QJBxj)^HP*8^QTU9}|K1@B!YN+ugL{xiN-$;dI=CM(r}x z7QF>t+$OO36mx|oI-AadUYe@K6ELDSeQO}oxA#rJ)Z0;S`p$yaY0Yq4(mHHVAjIsv zU%WokO=eIua}?`ITr0Yev>tr^F2NjcH*+oKuhg2ezU~@i2rpw43I7FBmfF$Liy{KcAL9*gT!+ zmqXNc`x&)o^v1eOO=9jwAlbVmn52ylckKOF<{^Lto|UlUv?W$r<%2KjX7pzTAV96v z(ZkxlZPewJ_=S54H-eL1@cO1AQH8&W@z4#h8;Bd?AF}_wZ@g5!FY`yKM}v*D^&XWUE_k2ho)86{QUau*S$AB z@nnW-MOsx;M$CDRB}52Rx*H|;-H5w3n}gaT8gBcsgR~=VDiNyda}-0>4#?4;#a#ii zp$q3;4OY;xpT!Z#sPXv96WS9d7fG8xpEV7k0@{+U@fb?hkLh|P8-IR3EqX!fucB$M zMjJkE_}WUx=mZ>XYWWto1(!fjwDZSRIe+ml-SD%yH@c&1MVi3&J8CDmMJ|CbKZMTX zqYHP~AMp4L9O#7sCzXNj!cAcBy({xBl+s|3i?M~X8_uS*nwFIJ?g{iDbCRJj`{Ra&(!+?Y(2CHx%~lA45>c8;!f-F&Qa{-@DpX zH8faZ9kag8f_tyalE*^<< zZ-;eNmT{PpWH#4LIsmm?;bMcy~*FTgr<0ht#7`1Pu+D)$6LA?CB zTcdgHY{Y?H3VbylzxRvMxbn{~*3SOn=6b{Co%@iozAhZh-LP5Z3`6cqa(kc$L{bQ^hUQjEj zwpa5x7?-2J^`Dd=qla0-ox;VaM6#<>DOtnJ?_tY-R0M~ME(YKrPH)s z={ZLdirfw?*esjs+T3r#(e$`U!pp;lEgD!ZNZh~*PK9+`A_<7n%K>5J<>n3QYCRS> za?jW2s;e+_Vsbp!v1G^{cqO`ot67~Y zWlV@X+W3x(v@?wC&U_>-I$S?&F<9@?T;iXzXgj+zR zIaVe*RcP{9xjy~5AF!eO;#VM`V-*wte#isi;b<3@$MwNec2j*oZVlsB+3oQ5u{WFjy#9=q#Xb-C zBzoGW^l{A$NG#zTD}^`6;rOeX9y|i)-s4?{;4@AzKF3<-mV&|qlPM-Q^V=L5M$n<@6Hp-T5T50M3n!Fi8sx6&(Mn8>*Ff{fDqS>jg8V zB5HbvQTx{qp_H@Y6wgpC(0yK6{mTjZqjy3}69RfyETzATxh6oAd^w))Z(%;-T71-? zTj19V)w0h~0d9{iwS33gRm(EF`SajZHhYlLK1Lrg?sAP*KWM(P%%deWIJ);d1wm6{ z-n4yiqS7#6@wi9Om}kw`T2o8C_K*T{Z9EUea_sibzkh0n`+pu}@61`;l11DdIiL9_0e zjYE+0;wuKE>IZeM^g zRt{~RQ9MjN%RS|B!OHuM8uY;IJc$=8v#yT~WGPL$e;(eg+}|3fF+8=2HOI(R1`cet zl#wF;_5(wYy}1dorg&(D%|kp% zT(oYGNI~wGKTLhQQm2%nD46u89*9X(T>O(r*Q=)bO!a$2PfG1%(h|nCu7L;kYfwuK zTR|m#H`Qzi;#ae`i$=Pc>=^W8`1fA=IBe+kA!%c5FyF|Yf%wX_VSf&cyg&a*dN{BL zD=kzBNng#6t>2gSHg+Jw?uoBIH}yl+xNE1{4?e9))rk$M##+8V__SrmjvfFFVqkP) zIVEaxK#XYW+?zr;J*;qbPB?051hNs3|DkNuYLQA8iH4(AC-WO0##bKIF8Z12*5Aq= zOqD-5+;%i*H9z*7*&y$`C%*FB)X9@?Z@mv`ITTR*CauoqO;E4}xDwzw7FvtKc8qV* z;`fxR!-?N>89ACjK8rRJO~*mlq;H8I_qO}frTR`M;G>h)kfXpgK=x^mVr4jaO?4^O z-A>?Cn7Q9~)h-g=(sMBlFZ{U-X8w3d(yn5MfJ;h#{n_VN2Mdj?Mif%>g9EC7SwhrP zMk(hn?QI|aEE;`Ttj~|Fcq56nB5{FpDYuXGr@8C*>+LrGBm%npOk@8Y zG_FMMeyr^y6VKK_cnv>@L9$39F@P|;BTwVg0NfXpEA`< z^;Djoi?u>!v0OAK0Q!`+fyCVmrTBSg>^0K26eVq{7jhIB095yR6w4D5d0;ZIKZ0i@ zcO4$CeSYcDAegK%UI?g{fa~*9L(uNXee*``^c|T)$Mdhx>*wQOR^Y=9pf9Ja_dVF6T4w*KW2VDl=k8_HuDF;~E%^Fu3aCz<8W)Uu`p@zUF zL?ZmoauL2(M(u{$>Xv+!=rq4t;@09xfsyh85~{TJv6v6$efFQM=fd*s=eo8jQg2}y+|Q1l7;_p zfaSRL$LxHt2fvl*1`eM;n)lJoF}2W|V{X&Ae4WG{q}I8yY7G5TplUDVhz+uNF=Sg+o}3|iMclWKjiGFQ<>sFiXVFQ zyjegrxI>@)|Jqj^;!!N7UKk$iWs@0S`Kob;B=t1L^28M+lj^v9gdOHGvIP#$rR@i- ze!b^@dC5+EQOnTfO*0sg%%ME`kMpc@um;a8T~{Jeoa<$gcG#F4G=cmd0$Vhfkg| zr;1yaJY($=`y@Pd&?ay&=RONqI(|N;K99;LE+qf;CXmUekE3t{qY3;PFd4yJR;Etv z({AoNZ%EUv+j-6WIqwX}B2TWxU!5wO`A3wwN(*^3++nX5vm9!lOZ0>RHIQzfg^p@1 z(&X9tGqW51FLDQJu-pM=l;*3X;oXBqw|QutD;_T(_W&Zl`QNx>t^1w^+l$#mZ>mqC z-p$xpt_I6djf&xUNDt!5}@eq zl5l~d)@4%$)`v!Brt{I6K+Qf-8U?vifp?$(FwjA?L*@YjAmly}{1@fyLptN2oSRHd z5~h84D$vy2vkQTV60PhHo<5=9`n*JhV90_q2@bIKgeXP$KPRriVdd`H>8>(4Utgy& zxae6A1AmWoj-pXtKniO@%q?|2oLo`i>Zf@qqm%MWU%Ti=Fwb0jebGOT_N8_8UVe}G zmopFf8C!cqU)X?}V+2Cb+dDvXPrI(qRs_(98qn_(s{tu0oExFFLCWdUdEVZ=w^3P? z0`2}kEf@~n<|jlz18qxvjEJ;mPNiU4^&UBDTPFl|12&7InENr~BpZPGLL(fGz%{}X z>&(qU`grtszV)AO0b!Zy$cLG~GDzjTHECG9)`(Rq^ro9*sEfDzM5!P;ea}6 zar@3WYs8*dZf1pWocXOUYE%Xp{UZ4utcj;S{ws|r_{hv5uJ42`HeFH}SA&Oh^8dqR z?t{4y_hJ`U8D!swaS?I1O;l>rHc{J>5`S`y@S0zpOPT=Be5i0O?rK#URG2?uRxF*- ztzq21EQf34h*{+;LA9mWX6nfRKTzWNc?p3J_QTSs;myeq#RlJc@_vAJ`Mw20_uLNp zXtC#D;3@4baM3I349^h_!D=V$quNbtuuDbI)Q8|x83Dju?Dfi{eWc^4fz4Ew(_}UV0G8Xv|3KGzl9HIcnQPAgcLWF9P}_Fh;TjQi z)8S$IfU+6@Cbv)ED$y^t2W*=5uUj`~L~3KZZBW8|?34rt!z`uQJdx`#5Wdl>J3j_}Lnt1+; zxMvEr9F)=&G#{vOf_d^{K97MpASQ<_6m4O!=Pn2Xfe1S?#?bHrGdoAZ8vSpzB-O=F!`Bwp|^=T|MG&`WI}TZ$V+cEj02#zChy zu2g?`K6KK!KmUCH2H4-}%Lab68f$FMGoP8Rqum4PuYflXBX+|ynqSlQD9W!;nBtWb z+0?JVG5ZBtH>KVMcVi~8jB5_!VARWF`^*S3rOs|11o21O!pYQJ75?I+hvsgrTo^W#hqr88uLgAgkQGRFfo?s zt)Vn>&zO8^3FqZO+FkEa4PHy*x31~Bffw9?&+^{}abkTmmS8;W(9BL=XZhFRN@xN@ zKxt09kWW&#wzGfikPDwJIW8Dlv;*&SgYz%o4Gk5A>v25BiW)*uA zF36Yn>Ia7W_hTt*dhuRVg*?><+yrZ5XaAcJg^ZYnlfbSD-8;}<-yL7+XLKUv)_kHT zBfipm+MpF6i{d6~k7qCl-)bPccp$qe`>-WC|Jiwe*w(zi`h4isIZSi$nGMpY?3qtv z^4gdvMFFFM=G5g=2?4D=<#3i!DEGx@$`2>)$~inC?^Uy$BMgh;eRAxARH3>rC+Hm#M+ueR~ zlS4n_qN>NV#<`g5Mn)IYTS1wmP9_OS%kTtxE~4~{mw?f^4aXgo>3MP}ah8a?d^^+Oo}_Z|6ATv>^LDU{;HJ&fJh)*);j z*xwk-*6m-$muUDU&^xUNHIC+G%qV9QP4fSUDL7eLb*r#<`y^`$oeJ%;x^)QV&+n%G zE~|gP$*i9;OAQ52{e$x2xnw|0UF#8z*=Ydv!idFK49N42gF~0N8}U+=MB9!FN9{!i zcmD%(wCAU726<9oH&p20@a~^--+5sdKH!H;7GVGy$3J0bwzo*0CuIv5MIRt)vTY9^ z{mU7uJpz;I2=v-jyE<{hBK2!A1K2`xdN`%gp%c(i<$ti@dNy!D)ApJxGvvCjL+I0* z(o@clGwe0T-UQVOLF{{aqE20d7E~oRY0WV`NQL{8f4j--eIutf`Dro{wM5$WJX8ZS z3;2<87DC9EE+rg{Qz?D~zDMp&yJ*&Jm@o@(mBPf@I%f9UVqR4t7Do!-mw7OO!Xu% zj!JY*dS?7VPyifneYc2rd)l8ER2b?y=)+7Lvhlaz(^#^Jv96{|l$y<6PX-0)_UG#K65v0Lb2?JVONC7s6{{k7?K(C(@DjJYNx+7eBv$AjO?p0SwL5( z+*ISb^(D`bt8d<4x@!{WY3r_0<$g|yE{bkiF>k)eRdPSEKAaMt+353KqA9Fe>n73R z{UGIauXACK=Q9l=#YdK~kj>d}NQ-V%rbAdaLJ%>-l#BLs&j+1JU*po<&4XL%H~uJ6 zLv%m9_&FF?zw#fRxYHTW1!69&M-Y>FPplMb(|pA#{TJu#>oSc;nF25$2TsYA?2|02 zU@t@nar$&fUuj#1LmqBiMFjUxtJ*|45**SPgonRR<2i)%>KNLe(+b69Z3k3 zoh)ehsg+c8(6zyfZ=)k30*-AN6a z`RLL8Eqls;oh(o;@gF#R?;PzLhHCw$-5#tLbZJySJrm|2jkdB*CV|m+9pwldfWXb5 zFHp|VTd#f{qP9am)%C5%4Y#A{DRk}cKR(N(0{XHdOg{hgarvlO=rh?rZoQgZpxj;i zhoco3qDrnONDuaEuTN!>s-QOy#69?K`jYa?MB9m<@-(&JbUeg(R3h|@+W(>x3`>;= zFiwl0E9*}aW>vbo_j6sg-)0rB3szQPrBI;hbklUc4L_XZeD^a3gp~*O+iqsS&Bf}C zr<%6M(vZlJKM6`pyBr+t4{x)98>F0YS%N-&ztg8HCO_A)rU^`EKf%U~(E!RVYFhxc z?Nwutl_klqT#?o@pX1WePTAc(K@Kg$2JWY_jqcn;-^NteMHF*N)<$*ae9=AH5a#4b zak!U~wV#W5>bt22we5-crp`$<;$fBjPC6G1g3qKIFW*gi*B2Opkl=6KN|~LDxfEYZ zx4zj*)4dnVAb!xBpK&mPP|c}#(Tz)qPzU4 zotp5UN=*_s9##?^tiLeePAZJ}CgKHAsIOpI7T*GT{%aZfXVw%6Zr|{Mpaa_FwE(&@ z^U6o}cA$Eb`q=o&L^>DqXqVrUfPQPfisIp^)%5LWlK&#gO)l zHMX6bW>R%9jH~GYmbT2KKMVCWBrXQ!54PfNOdObO$?uJY6ZfpQu{PDbn9*lvJSST& z>j4Wp*NcJ&IPN~Vkvb(!%@|kMP3-F}SKom^ghWq{368v=CUPGCV+iJ&&L^IN0c&KG ztT``0TAo&sJD$@4=Am+`Ee|)*e85@8tUqZ`v$1tw-U&W(z%_yobxs-nB*_-T*eIPI=tm) zy&&CP(L{sS$sBv~bRXsI>8tzNcQS&iTHL?k2xF_$NJtuJ;4mQ%%<}6K-q)b#FPRI%1j|7W3gZZfvOSeahEJyy<0!geubyi%Zfx0Qm_BhdTXbQq#MYX$o(+P;Zj=51 zu=ft#A|i;;FK4TZl=xxL9<%pQ8 znTLP2T4OETXR z8&$*ZGFwKDKnOuan1bMHh9xe8YCrmQ`1HRPI-(qaRTx(L9Q?8b2Bdd%Ff({$EmbpZ zE^A?--Q>&|5Sv~Yq~o&bk7Yl?oW*UJ?6;K4pJ?+BY(U}+q)tD~+ zT+sJRj3sJ``L!`aB{aBSd)~g&N~vwlGqg+cKj<8QCys?FL(^mC0cQPXhIFm7M!0k6 zJ+Hk%?-7paAM=v;5Tw0I1f14#J=pmU;dt_2IuKn?CAwu&A4j2}Q1hSucf-q;&=;Qj z0;`^$b328+J9l7}sAr-Ap>JFtc^dS}0uc*75VXs#UT9jymOEr1tOb&O_snJjkf*%~ zHO*3XuD>qP)=D|Maj%!LecQ}XTP%b(G01kQt&p1cm4?Z_z2Pz^~&Rdxf6YN{DbM)aVZRl!dQs zH|<$FV=7r}aZl0)`lxCFvE>OO;RcOWGsFJ?AGxHEvVM1@i3-F7A<;kPCTkM%PAU~AEqVlgL$2155t5*BS5{+O6H5CnbdL7hCm3Y6K~w~|zkh{awz-519Gaa>Hw#NJ;3 zL-u)q4Tl)O083Pa#dthdQS5gMVg8PUX@Nspv~IJvtdmWCq53l*eF9PdB_@dULueOo z;L+I#JM1{{W-%&7KbV`WO315YCNn(`M*&N;`DstYnylzF1;sIscw^G9Fz9d6uQoYp zZ{7@tJbZ)>TG-$Fc~?=suZwiJG{@d))-NVKHx3{auDp=1z=m?WTpc)2a`U7;!gla(WJyILyUNZ~DoN2M zvQ1h@mZ^jY|MSeuqxbuJ|M&AL%skIM_nv$9bMC#j4{i!ZR0ki`k5KeJfI_|Jib5bR z&Bowa_COR5_9W*y)WrAxnzkO+otolCQDuj~I~PLV_Ahq=8!__-Nv+QZB!QYh;a+#X z2egF(tc)uClzr7KxDS{!JD}b@m@SM1Ot!cwXX!wcaxu^N&CaL*InmlLwvP=G6t|JQ zcQdVDJJUaNMTaNgG!aH9Ts>Hrw*K`aeT6PnxxxoszdYyDa>};N;oefhTw?mRe#)F23ZQNdtapgnF&H`u>(6swUKMi% zX~)6bT7BbdPtME>0qWb-H!E)EJE?NzqO;tR72(%d3~T7TFyj!miu@BIg=xAtY#M)G zZSv~VQ9FM>3{O4Hj>l1b!G;0ds;N-p+akQO!EeiFhmEr%tvf3zRh)9#u?L@6;e&f( zJZL2pp2{mM5iKfsgM^EvMTZr8-oe%exMd~?*aHe+dTqameg~EHhTEBg1FJpS>37yd z9C^AfcN!RJl3L%-of}`_zIkGW0R7RpfWQZ50laU+1e=XIBDgzLgafC4hEc^t-H0l) z;|_=$OgZhrDqVoA3S`+1x335k{q7Vh#ODw?8i2o!H^Z|@GE!y4^lu;7bQDp2Kil>{ ztk?)9wJz;~q*>io=B65jtYT$*e1p`$n?)dXC)P|RMg@SsZPII7bBk!~Wf+_Ym=bbv89!_@_Fr4uP6h z00)xgquJgN$DV_xc!4Xc0@1@#qLFY`y|9j`H0`(~h$#b;g`a8)Txkn#d$wlmevO

    ZOj+d|b3Nr(3%<)l|G0p1kY+1wl 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�Wog)oJ^|t6GOdI_*XvblBzaC~k3g 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

    J=>cK zcRIJIWX|yN2(848FAaqK1V6%X&#cU^b&NAx?)jhSI4yE~k-h%uP+dr!c?Q~7HVgmp zfvPtPVnPojX2pF#5H{~OWV`oWg7tzp z;DbVveuGx#@_7LDcdOunapMG;tKTpN zdRu{v^wqlGl4=jadLKrGTNlkoIz{Z5pSMEHc~aD4uK}9pp~al$Nw_}qwij4{Jqc=J z(|2EK^fYgM=WYTD@pD{%G>LZjRC{Np4nPnFfoEf(*N=670cw9lqOFOrg&p43@%ZD6 zCFJjGnIjT94iLlwY1P$B!Dq{2(Ag zz?Ze&^%Cds>M4001ktrDLqk6`VU%XGfg7{TWrexCbj0OE-gef`+_heV;>QQb&VbR; znR)&vPTc4K@d4LZ(-M8N7s&qfVyo@+nfxOgw30jLn$1FE|3d%R>dEnUyg-(F?UfDj zApbfgxc4+p02$zx*9PX}bV1pZ5K~|C6Egu+KKVJ!jp+P9GJ(I-*npZ{U~l-hSgaAR zf@8M6+Atx4;a-3=<*z*VVIR{h@6}^? zQBsohN@QM%+rcZrb^U2F!l=h37ZdaF^vD%|o9KPlj@3$SRDFH?VssCWG8Z?V|>%N?zrA{FSz=&t7LCg{O?%M_2ba;vO=Miq0NX z|9Z?Kpj%|)rO`1GN~QJ+=X$B?BCILiru2Jq;SI#dj}Jh7@quovsY@RhgL3%~ zovR9kc;-@rrw>8Eb?xeXbjwl3iC(rVg$+&Sn{d}B{fF9GW0O+$9E3A=6Zeu)D_mK9 z*wnI4NVDVZX18<7Xm~+14<`E^F(pj$>V$<_-d#`*BewMlcZ=41@!UbU1zg z7D&d(I0xh>H;AldVFVL`1Hv_HH@{s({?w?+#?tJMfwi5s&m84Si%;Ec`^}FEL!Whi zH}`?*B_qa8MNv|-qBzrdqkU1Y=Q=eM(nmsClD>B2+Ykp^x$;G}Obl2tUWclNPwxI} zYy~H-a*gW0=`%fN77qKDQ4a-AhjzH%#sMEK9M^QvKapeR7~BAEh{jXnPyPp;-!t}6 zH`|2We}7J(A9frGhjY_6!*#c;?ka|NL<%&A6E3bKuWk`RXjr(F-djTj@%Px>PB_U6 z4h=7q_~_?v$hhj*X}k3YT)en`E=Rh#z(1^>R{8`U_R%yzr)VpL9kzGc>OSPAD#G>Y zzAs5=AO$4+?Z}GkKSI2$r2l{r*k7S$mC;KN-1FZ%fgwEb!r>kx#;nuUw+I!U zj=zZdl6WF;3Z*^XV#XuT@exk%Ods3z4ciPHoctS(vAwhqt^~F;<*yBZb#P#JziPOW zPiiT@IQ!4pAJnG)o5xQ_$@xT{Z3VlyP;v0wc)^c|-2p-*sv8{e->e(U$Kw2zu7`C{ zuz$fG>b#>iMhjLV>12E*cu=9!V0xHt(F0BQ!Db2pE@x_VBzanLY46opQ0!mmzLuYb zq~Sc#jwm5St$hDGWnR&P+lK#-tuGIR^85b3Gq$oeZxv-LN`+8LWUbInmQbRhq-S{b_NVAwk)^C}OC(#?iR|0&3^U%}&*$@d{$QAS=AL`+x#zsj>)hv_ zVixMl`_EC&8m`3<8at|Xh!=|)(G{6k#<7a5u%EPz-mx)I%c0>J-o-Dg@@aMZq`4Kk z0EY9wuKv?4MsVWk3N`z)&4YDBME3f7;I3y|qS=TF!Sv&SljzTvg1vP8BA*FQU}3ND zVnR7z!f1g%T22J zj{3W5k0_$FGaI&|si%%9`xmqY(xkL?s_06u?hAZ1c(h0rn1D}wki(V~zp-mg38Oa) z1B#U|K5MZk!{X1_B*&CZD#zOP&CEh3^O&x+a^y&=@Q>p$%E+|oz*+RCD%xOSFeSRJ zSSVg3*tD48g!^X|v!8o#BPa-}5Chg~IHKFx7)S7|4j#){%z7itF|SUHrE7-SrKL8# z3j=t`XW;1LGrtMQ{#gq_W0hF`=T;76CltVqiN0)D_@ttX%q}#v2K8*MS0bAUKfF~g zqCCTbs1fc}*bf_;V&z)K7m7f6ogj*W+V*3Cxydn$&vq=e1utS#9aBC+tppbP{%6r! zfRLQ}dqCE+&E(C1f(lBr-XM#v^jIV>+=1W9w?T24r+#AT=lNut5ArLHZA}_B2SZ^O z3EFw_WX;i?0*r89v%BT_J;KPq|6l{*yUDWTGyCUm!7*eYS};XJi{s*B3Ojc6&Qo?x zzLv#j>J^=370Er0a=J45>~Z1nJO408_Gbe7#3Lv^XA1YGLS-qPlF+wcMXMQ8IQ1h> zbd9{t(z=`aILG8=u)8UdwyQ~8v+w>c>@v!ruida@xEF?`tDQjRmq;d5?Q%2R8ZM+N zy2NoApM`NV1gn}2?qddjk>e5V;I)Kh3Dvi(xUCW zj+>C!b~v5Q$7ok=^>F;b9Qtk4Y$*Iavjb|hs{MG(-hV{JzRmx}k77ClGa=TvhviHJ zo)^>iY?!g58&x?ehxSn>685uKEKM`!ySrAJA%mvek(y;<3yTmGQ|?ZA$BowEBfPkO zkk&HI;1ggN>6d*e-NLt9gy46NvT=*KhZ(L3g#Ml`>%Jr5gy;QBWcb^uZNJ0^K8|Pc z#O}r07k?@l!Se8!)7ZR>InsEduWj%|s*WDv52xsx#mo;lihMt=U&N0savqRVJXgpD|5#Yw--_ zHq^Auj<248xF75RS1ShnyUnl*aU+gK%erp;k4D9(M%w0>oR8l;LA|IPI%LI)*d2vQ zr{NgGG_v>xlx?{|8%?D+rX*23A%9E1sOtkm2|c^(x0B@{wUR#hO*DfA38r+u`fz{j z$D3#3j3#=r>45lDGAYXMzZ=EwQWe;;&ooxV6Omw4R4JUy9}j0WH036XeqhBF?>t?m zS$V>9p|QS6DLKsVawXENFW<4O|EpF5b(P<1IHm-#Z%i6i6ED0V;@cPRC^bY~_&7qj zLpuJn5f#d&ZH#}QKVdBb%-6Foo6V-u3@4~hD35N#+(4Ph7t`xZ|Iso+_GJeipg+y0 z-YtA~(f;?HD#Lsp0}L`#aNvVYq1@MCSXVD)F?VOo8n^2Nw=MbY>)kEN%%-Z=!07*@ zz-l(KHOXrADkQ%H3Q#7vO{4=VjZz_!?Q{}YGO|2hEh=5StxG{lyZV8z%=zd z|1j|3^OIrB=Yl`a5msKa-yfh{JDD6duD<_}f9n;96<#q$6)@(sG0}Is+)8H4%-^{m zz8f^eIO%p8#UOk|hmovAJD+v&AyqFH>TwAtVwDXDs9h5MU_pnserzXBgtL_)*HAk_ z+L~tu{^^rphB>P@0apZiQRXG4U3}>OtREq@_j(l?|E;{5{xwHOp+280yP4BUl7c=F z`GDiQOG!?!+*s*mIO#X6$4+(eBcn+!HdqI>lqclXE<%C+CD$CCkkBV6f&L3__^ta^ag> zeoE7fKao6AUX`~LiCuZN03@oV?aO18Lk~MaHy;{Kijw>`3m7YsR-q=v2b+^*o2**6_XfC_j= zzAkkBrHeixzYWl+`Oii+@9Y3}aw-_8Q@2;59yq}}XT3EwEH5{CP@6&2LI1-s;})a; z&lK;kJ-YMspwU+``|@yDMf?z~bk3IFH?XumS5Kt!OS~Y;uUNf~-YDLC*P4y?{**9s zz2nh=Cqew_ZUu9cCxWU3fLOlruRgtvDs{`lI4^yt-}fKa6gfq^Aq8xc5S-xbQ}w;x z+fXvCKLaqY6M@PlkqoUZK1hU@R%o%&Vw(a(rYWWrR_v}R4EF?0P>J=-R@_)*O*;Yo z*`sUS?z17yT7Orl0#k`vx~FX?DvvOuCR)g3JW~Koo7$sU&6#hj*4fuW5i}Q&z#PgF z?eyob>$=E}MXw21jje~#-XiX}m=px4CLGAw#>N#+=;5rFXGLaC$aj|3v*M<|3w5KM@o}UP~G`RqnW|q40w4hc_ljGrSxQOuSBg z2?66dHzHL*;ww>pox(zz3I;(NhTI5-{D$4?O9vzyvGi%_r1m!|D9)wv>cPTa{-dh( zM?1$EU;pRDVAK>o4t=JH+xyrgs>52Zh$gT2 z|909Y!Jr`kianUVMw%R7zO>!QQuB&oCyVJAK%3_l@>5u7RN(TqM9}gR)0P5AIDzgc z3eI6HJB_*fOX$|8h!# zvIh@q9r?hCgkM56WAQ?%<#meNlK3$n!GmkC^%ulmJBBX6%OW=^am=K=gos~t4kGe` znJ6o+;^KLy`^8zxw~Pgz>3A)2k2S4(e~VEt5U~qa&+8XcZ2~S!O>{O0BV<%2_U5nU_?8~8xrBpeT=4EO&5Ge?+Rbb)lBLq|IcPVc05XTQ8TFH3JrIF6@>H8W4v(5JA)O54Izg4vqydWx5AksxFdiv50EkU$R#Q z2|v>I3L+|2R#4pPue_fkn~TY**;UXN-14YGu#U%s0*SzS~7&{EPO$ z;}_#4(u@W7d3KJszeWa1`&ywk>8c;*{{ig)M$73Hl)4`HKX5)=_6gMpw zs@E#X8{S0zkQHpmp)Z(61gsK_)R@X{Z;Fl0;#XsiLS|Jc^Kl@P;AOUmu3XIV>O4_S zKp*7J%`Ww1So9$-(P- z6V|txU$>Dg92wyKvU6zV>4!)t2SBClZf4W)eU<0t}3l^UY*7lW|;>27cbM&e8jQqMK?6z#)f1z|4L9KL+})s$IhO8__=dzOLVZWzc&+B$c#1OaW2tltbZU zB<+&>RLe7v1YfufA=k#5H~h3`Hm%GQ2A;QiL3S_QnrH&WX#V?y<9*(2C zFnM$?;>M4CQ4S1?-t#=FbU3dkbL#po`bN&hYv{_q`zNam%c5l}OK(O`{Y7#iv7o$% zbdsj%CbyWg$*xc@52XI#KtB|b{lXBS9!f!3cz8LzoawP!FN)MZClstExEiz=8ID&| z1wzKqI)vAC(*4b$m$dbPV`~`h2D|&2UNgw_A}u3gF|1(-L;pqg1QT;|(9lS&zxjmj z2i^^cyb1gbXU6PjDotyk+3D63@bvI_t5-NV({B9=A zYr%d5f&FlRI-7FiPa+GJi_urXsXI`#^nM4St$T4G+T4@By%?&?_R}Z|}#^|m{wd}R2lwF?T7a@fI&x?%1DBPw5 z_<^6>O>%s;J{{{GP=r+yL!_Bb#!!q1v?Ljf*`%-m5$1KK=%c7#4t4PSJ zOJrA-5by>=Ndjwc7EC-g{LRgUylZ5{E1oVB%RV0)z*Ne60M-?5QXh1_A&n<6Z2(gM z%rbQWP2P%O>Hn;+1tpuhiBL;6bRoD{z9QR7MhB@k9biGUk;G2tub*Bm__H>!JBBY% z{=iuKSy2+7IFYO;3ga?(ljqN!;#E`)6XjKYE(q6gmMR+>EIP!O{oaQWrfTlm+BzQd zi`Ul<4u)F1Oas%S{CeUxgOrmeIwY>pML_U4W1^W*1tLpjHV_lWtncfmGx7Xu*CVQ`^o4&4m&uGQ< zfNrN3FaQds0T(40|0D0zbGAbLd5k|1`GO2vLnIu42Iaf7c~M$Qfybl$CHJey(yAOR zmsaT5BFyi^Li;E)?;#gHO;?MdH8DUZ+}+w}$EzvUa(>lV?+^&_iGUsNFe;QA61%}> z2ATQAOYQpO^cuKYd0#fENfq~AN! zo_YZJ4vn>UY!UaRaAG16S@mnN@3wqqa17E|?}8wPFIdpLp>C(=<=Cq4a;V9vo|h>~ zoP@JfeOagO)U{Ax7DqSB{+B%Ptnrz5_;>Rxg)ERo-h;uzt#mCT?=OTmdmk*>UT*ZwigP87lAJ_xZwy$f_KD2T( z+Dq%!w_rAn-&+XcR1%B7&qf0yqJn7iS>x<}T&&r>89sw-*!692c1wPZ`rEA~MEXr~ zQMXyz#_1Z!lIRCxuoVo`8FVGnQEI$~rVM8kLJ{yV4Rp^C4!5g+$3bYaUeZGU*R4hs z0QoLb!y?`?1R!ti3fj&Zev)C$QJY`R>Sf-yi(I7U<`CA|Tn;CXA0TEs$`~Nt@&gix zCdGG&ek<+4yZZ=Oa}Z#}Nke`|*+q|-EM6~<)g&n6_@akEehc=Xb$!MRKbG#I%K(OP zW>BnC+lCrO=MDpy!@-aQe6SuMLa2|k_nO{ssN`z!2apU{diTMu`+n@y<8Q!5YIEZ8 zYc8-NUqBFW{CNW1?qPn>fkg7oHv*f=_&yAlu;F3Nbnwi@FZck+QmtRKEftN$HxZ7& z@&ifLQe4*p8x$6=DiP(-3)4q8Qez_Wm*il)z*YsZvBjPPv@4*2xb<{9-?mu#KJ{(L z1+L%{Mdu^|+jZG;!E4SdhqB=(>C3|Glpz-X7|{OM55uTVqh|>m^b*&n_LsEU`bX1* z#1_9=bAN|XSaC<@A2vHPn0|hst^f0)-UhZ34ijF+r4FW%Zm8Qiupdy!Om2wK2sBro z@9WAObm@|g6alLTU}Y|Qa>ate&A3XkW3|wI8I4c*u#-m2wcf%Iu|w)Di6Uqxs$PCv z*ILRK3Eo;D3ep`L0y^UeMUWp`xLh^qvCQ1JRrV!sKK`dffRA$}Nxx-wPOOAHY9)}* zVrU9VFy-fu?JtSQwcG?TY1^@&9W0Pr)m*@J=~1PLGN_K8qZI2rN#s5Wft)2vAo$nV z9#})iVWWnb%Bl0u&NZz0KLSkie9$tXZfg}`m=FBiVCUZ`N}2(75LQnQVv4xDQ-EZB zjU_5O-okk(nas1X3BwLYQ= zMF#H;51qm22T*R_Xsebf`u+IL2nZx<>+#U9c58o$i`E@&E_}Vv1rFp}c71_cpZRIT zi|j^X2-wk_TWChXp1hjm@es}BC{VQ$VPR-Rw-oat@WU`=Ta>Z1<*D)*f_h7^g)Ydc=pL+V4w}BL0g6!y^5~Shi z`__abu`-kw8***Q5P@^;8|~ZlkCF#;n~DPv&f00@ZZ{G~X$TjSsm)ocgZ;$Al8;R_ zfXkZ63AdS@99psq6K1njwf`KdmtwVhV`vi%CE&COsQRH{MD2-=_UnmLHGI*R=h2b( z3fl;{N92}ObZKrJ1!206w4e#yZca8@>r{MRFoi4es=iWrvgajEB>9XdAoXbem^H`Y z<3cY`7-}T=L={6T^sGJNDQcVkv+qq6TJTysf>|flj1(8_?wEvH3KO^b+{;m0 zrny$hrmO{lP6ZIrGl;IuBH6S{3O|v5?O>+e1z%*(|2ER0ZRp>`^id3{5Q;gX;X3Z% zzJ=y$6myUZ`8MP%Bx$JSQ0NVCiAFlFkFSwBn(Hvk(?K+!9YUDXKNop8+&hWr=huw# zK=*X^Fui}5P-*fh?UH2gwu9zd{$~|axo4|dv`W(3-=FW-Dw&QdJ+cAG%MMI=Z&_^` z@R6cqVvC-2MU*6BhDmv=Myq6<<$C1A z949<@x8XLy=rRyV2Fddd|`$zlGk%jP?ky7Zwc z+y}K=KPA`fxfDogF!3{8^REtdrK+t=dUAYUxYgyWr@?VMvf2l0;M} zGj}D{J9&m`U^82#wpke&{yAccXf9v{1J}Pb#c87Tlqzt)#jN9AXZ};;h2Yw7rpB zE*TB-hoEw;^jD~qoYglZWbGe1)xa0+bs9n?6k4i?JGt) zSo-Ms@-=M-zdR)AT-YQIrLyz)6Uc1znzc@1r0HHB>BJ@Vp}baG$>p_~d_jG5pT`rX z3to}}PXR^M?=IP_bm!Xz-A>u0m+-8wX<^i%=xEQB8mhC+Azu8UT8Jo`$p=*uZ;$?q zKBUx}ccF}{U6;StILRsF4l?WWhLyg~7du_e*OKtvLR#WZowe=Ms) zWtwvt7P~bExisb=AM!mRQbT)whklcN1j|*HncT@A-(g;i4q@pdFU(nx=USVwA^ds4 z1wKt8(vwLtsPFH+UZG;kCGC;EG)PJvM(4(kL5*Xz>0PDFnL6y0nPz`Ad@s{Vx7lPV zZ>#5A_9W}{_`d8MTZHq&0?D3iOX}s6Ht}+b*`k6B$B$eC?*bl`Mj(Mq*jCpKuGpqC z(FF3e(m0E1yl+qMv2d=PH}zG@lVy5Y?pqPDB)|dzltxdx{Rb^OZJ%6qv0i|iV1bLG zN@c`l2ja2Byz>RSm@Az*K&b9VT6qxR@8mI}+3QKVIOj+3zUFU+qc^gi7bp#diekxL zl6%mE+iaD&c1gOy!pv#AJ4?y2@q#<__i|I{QAuQNSUc31BZh6N;cK}J3T-HuWs?2_ z8(KwZ6X-O8-E@UJ{}7D-wT~oNccNJMODr+D4jijA}IY#QHk$SULlXn@BC^@J%?pD+xk(x_V9Hs%0itGM|ogzB` zMxaoF|H8iJLH0IaIr7zwoG*Z3x;m;<9mtOz{e9#CqU~5f5^qZBXcAwoyh0JLegvzX z=Ym2fYlElFKolST*PneRVsCSe%>)agDHCc*?Jn|YCa#X!ZO}qaZ~n+IGimxlHJ1cP znH@;lC8LHhB2*)fQYN}aw3aWyS1$lyX@;`hopkp(+LAUhH6F@S*F|^log8FC)ezW~ z9u0~@yA^zh4r1^yrN4II)pQFKbirjKTZ8F{dj;rOQCw?EVYE(G10SjQ{Kw5@WNYvrc_xmGH%wz-njVI4r5##YajG{Lm$=pY4Z`)` z0bho<6S0f1xB7Kqq)I89-A+Sar1)9k0uc`xdAFe54liO2{|QyZLsI&NAQU4|soMXg5_-ITQfxj^_m9iaBqFR7=0e z_7zQE&XZ@xB-&-c^hu)$FDTM3{kxzrlIngDIs#jzB0C~>5ZW$)T{F?pl#-_3Yu2t= zh4gH|7_A`L&;>d-Ak2qzf{i1Q-q`YlI0=&iqizqaCA8_mGU#)AxwD5*cX-M7gHP%2 zGP3n6s_*5K_OL5rV%H_H;z{k( zI_Ug@1+UKt!LMA{!Dy4p?r{1?!7M*jvHK81@t34Qcl0$}-Ol|*qOfz%Uej-~zbdhwMMm4)#?$B|_Sx&TJ2zDn@QikeS*QQO ze*!3wg_Bf7+2*>5zOmHv_4~=Q=a&3fnz3$Y{-E@0KjMO>-W+Dev!%^aj2*ntPrk^k zHQ#X8s4k;H7+-64T(K;#SN7=sqEXK~EGR1-nJoB9pNCmC9`3uWu;cE(w7HSHt` z`bP+(2BXRiT&S#?&s?ORroTW!H=I?RCCYpRO#5u^m<9GZ*Rk6f)jfsL<-38O71>{s zpk}`unMou$uOby46xR80k-BJD6!Z0xjwS5lN#377Sa zgDFETtu9jY{r-b{Z-5`H^Me|o(|d1zji9SD7m6IrxdG1^oJ+ragY7VCGgH?oDK?oe zZ;73oEEGBI1xVU4L@Lto@*0xd{GX3dUVXY&V}7zIdEVDXyGR_Nd7Dj1&eRLzPtlp} z8qF#ibF|5lTZY)zY17JotcZfKzC9T*0rM5ozwxuRl_egd1F#o^|oyjKv?3{Nw%%Oej;4~0BD@ktdzpig4 zJc3OT0Q^M#RIc6ldO2-8%8Ec1QVrjZ(sazIX)GsvO`PGW-8ZLat&2qGTm?v{71f)^ z_jwFi|BgL*bnaC6kZ4?}VKPq;Z{gIFCq)RiuxlTu;tc zF4^`n*QzT+%&y@E5aWMJ{xYh3?Q`nT4=CCTlkd^aO1=%F_G~VZMt)sU{)vNZrW(Ej zrRkbCd`iv_qU*v^L7LhfK|_-h$4A(FNM&Fs3MPaRrRi@t8m% zRF@#@2!@ZVlLHI&vakQ)KQ=N~_7%cHrHQby-IK#7b0$;g7rL8Aa-t>0uI40QLB>PZ zr{c{HtRd$BK(_fPrY<%awOoF!SYOTwVHC36&hDm))%BpbA8;CWm|^ntE$~rB1^{*a zl7}W4QpOx;QqZrrY<<4v&iAZ2vnAOXFYsruh$WM@2UE_(zt{0xMH+`-*vBt$CAQ60 zAv^O+h5uKtRE|xksVk?1Kpv$puhW9F88e8wGMMC4f7hR4T2hqpj;r(Bs=_Pjv-LV* zQKe;+=O1CUS^DlD=q|hjC7mxp&2%9wQRPCbPs1ZlszvZX6gPgOhGW086tDm~j?`^C zgc1260FLy}Siv57-|i((uNssao0(CpQ^K|J=0PPmw&A}ns->;m)7`=6_EV{(Uav_X zI>k=s5LZZ}GZ4z`QV^5;aYnAJnj zCsvT58h;O`&KLZ= z38#$T2{J&^J2aZ}l))xDXyxmBU|F6j8qFg}2!CD6anLt>y?si-d0qk9v3}EX#cz>dk9}h6l|P8HlaDW`^2v9W+tq7NjJFfXW@_Q8 zD9uEK^XuvzgEA+HRBQF@zE&{+np|>dVw(frkRUP-*)IwuoTTq3niV?;JkIgtaj{(~ zJXC{MWB*(_{SU#o{fx>ukxBscUYT4oq+s!xU(vv)YGgyw_E&NQ%o<=y7Dw1X_0?Y! zrWyjw$gb_EYvWovIWHgGZ#ci#s-s zay+`b`{&#q3uK?#{eS}-g(ab$>WrK9iqEC=CG6Af zG}nsqy2p(rg&F=6L;*g<_|&7Q2xbK6dqn7uTgJuZN4`h+Wc^n!5U#jrwszTYDmK#R zA^LDFUrY3Jf~Re|Soh5n6Y|PKU^yu~n8VnqDWD+T2og!d!N3_K=iApHN^&4dVYTNb(@PIR7#FgXg2WW4^P)bF(na)>^_^ zCHm8ohn|APQ@RkDf=uI~U+u73{Ip6Eb6I3QX!Pb7Umz#~nifzF<+qcd{_br{f(T56 zWHY9OXs=F&T%Ec%Y^QzWAe|9h%B!@lPugxby}{zSfc>3_&5UJ4emFQ#ZCO0P#muH* zZpp8>%=8k+_hLaN-DS}=P%1Kg0bQ!4PnD{7 z${5n?&5bz|x{~~}_8f~FkL&&#>Tlg5Tct}9j>uQ5>9C7++u9?IN0^cRyqQpkTSnzF z`zSM(rHw00ox>cAYy`TDx=2p_Y)B|`?3fU2bRap^@wHt4M3?~bxTP*+BrD)cV{#w3GC z?tJ~tk6yoV&=Y1z>-X)JeAMeb+;TM>iVwP%jX4;5QJa6gVm15uddwtMArSo1 zUn-~-f;fWo93Q#e-Ufx9R333VIw&i;AP zV`*12TAmkGs;%KFx|^jX#9Qh5)2Zg!<8w#kB+;C%Zeqo5?2*(x99@R|6QGGFB#dMwz0(GbhvSw5;LczS>E z^uZ?$?fSSO)n{0cnci(Q%F?h~Vf-7_t#^91+=Pc?wFME%4t_@V4Z$gC|&g|G=F-y z0*Rl(+jvKT!V^(6SM4$i^8wyeHp#&MZ*D7MTL5^+sg1vm&R(z-HVw;OH!`Fh5ml-FXswV-T0^Zn(?ut~XK!m=;_ z`Shr>6zquVgU!gBv8~UbOHqDxHakifiA&m$`Z^nuQ<^Y!XT_*6vm4}=-nlHrCdOyr zQP~u++*ftMpYKRDs9zL^=S7lT4qxoxqZYt|PS@xbl4EID7Hd0yRG*0ZUC9td@{Xf~ z89-wY-9n|$8y_jAuYW#+AYPlbE`Dd&l!r@lw(`&harpnLMkn1BU0^|*SY3RBCNYX#9x1L2(a5;snnZGg0fV_!}j$R-C$0?Xw# zMOtmQ<&&sC`^MK9pb5RoS{C#-EZ5YiL$hjfAJ}k@2|*H2iog6Fcqv1$rjd=DZ1cnt=-4KVsPn4tTH$!d`n$!hjlyNew`-4rrqvkL@K zWJ=38WEt+>vwY$W+{US=h*lqy%7u;qc5!==Fjtsl#nNykRvbvD)xbI0du_wYzwwzn zymkM2H}{@b4ZED^n*3!b#6^5N_8aJTa}mFZQ~pi!lB=UZobm%PD za3$;4ry=@7u&{mxEt|NA)GfetXX|N)5E@in$`cml#~i+0asAS$P&l?11-rHO)tUT{ z%C-5W`a}+nI$ldRsU(0Iv>kc|Gau+6w+w#ZYE}76dlLqn#sLyXoo3N1f>Gw_Y`hqayIcKi)IYVZ`fwiy#;buJQx8 zN)D*cHCHwY$obF-G$B1(6%BhdRlV7Fj4F)61MK4BvJgof6T~ijJBt)!m|h<@KJT^e z+<@nLw>IhSv0Uba$ZwZpW4^{4YSgzvT>bG^!6mG&+Tl}jvrY+g#N#$m-W)caT~QCF zh-`bWv)iMH9nCknj1sV4uuxzEi^h{Dkm7e$aYumr5FNk0>QG;C(`4W|SK%g-ez3&# zwFL6(-mJzhs5=Qci1ND{-n?L+=iSXKgGvebu9_jGLA4vugHtp~@m`CBobZle-r1`$!!-DH30YxS3*iP8%Lgm73rG}+#$GarEPfgoP- zjnR;9gMDzi9;g~m<*H@qS+eW_U>(~#-xDSAj#{}L7kgoff|Llpx^!ftA3TyR@BK}2 z=7caiHrkk3-_>YzoEQBB<}VV~kMKbJGR(o%yz=G)jyA8_(dMX9Ix%w|kIkph$$qnX z>FId0%`5P?prwE}O%kpKjlbB*<1X9eY%OfFHQg{p+wLbf&!f00n4eoM`M)5dnIGwaT!M;;^l95Mf4GV zDC%|JHY5RL0DYQH`Moflgw$1T%=8T&yz;!4+c}5KyKd}lL;1I1nheGRqJSCAG(f2) zLPa$r)M>>Asrj^{?OF?ummzfIsBULls)gXxXF^eX+GrEg#6A0!J^F%a9}xK{hzmO| zwM$-bV@3MiKh3+0Dw>+VN#7)z7SvUayjS;bkP>Ukw?b_yY9^b}qr%-c61I|Mxw8p^ ziI=sSYl_>}!I*ach;*;f?hMJir8NkrK7@5CCB5uZAmN_n3^d(3WOM|-m6y@2x}Jq5 z4Q)ciT+0!#>aU4gQ_9mjlAK!}^EOKh;=@_9>#{!MT%EVloy{VP0~m1n(Y2{&2QA@W zmkFvbE^D~%y3Is7I7MVRBXtOr=5rV7(3khb!uS{o$b5CfhM>@E1ew!-1J#DIC%@wE z5dc-!xu6N(%34mOxNlZ7$}pL)UryZWbQ-dQa8y>j{qOKF^t1L>?(DV(Ag--EHz1kX zui<^N=qF=hgcaL}LjAcheXQKL;d4IjHwC)~W3LYBSFVCR8+~=IZ5FjC#v)H6^(ec= z7CHOqkJ&@?Y#&_Y*NxwAJ;^RiHW8-Ph&CN#?pI%Ym;TciQg?h{uN8VdvRDg?0k*&a z2yb!{O>VQ({wxGzb$3NJ-bx<|_=i!{1&t`P99^MQ}tCd#$7qHeDycdBQ((2l}7 zDdm&j3R+v^;yGjY`*Pi_L!xk!Ld=)X;dWcm&z%fgP`3u-0aM^~jjb)9*1v%lM#A#y zkdem4SUC4Yq8(r)9Dz3j$1jvMe)%x|m|CmbJF>FLf^|`3@+nx_vA@2W`2SdrZ;x(T zdX`=2-4t_I9n|WBcrn~?(nf1WlD|!*fI@-oNSFI~+!8M#J;;#NoeS?BTHbWwJ73Gq zenQ(vH4_EYAmbqa0k&n#TO_r!ndW|^Jm)GhagzveX0gAOo!l*z^iqhlX+UYU9GZE+ z-^udm7C6#=2&1VL$o^j66-WNfNH2Y`8u&fCFYos`;Cv~uIeIQqZ_2aOS&I=4d&J#dAl`;w7^#zHe=C z4Rm-BL8ht0snob0(8NG1WbYKF&2GUxAWaRUUW=u|6P1DA@O99U`w+$}{CZZWk?Hvo&QkUp%U~<&gb8cNNY~o!n z-gVh6x!|w8sC|68-EsI5%5%wsb$v)U&7r06U9g(uhi4VYtJ|-sR@2Zt~Y!t9n{5+2r#m2giO&#cP ziQnIu6c30sx5vOsQiahYs^OP|XX<~gXRKj_8}}M`!3fEbeqUU}>Z_@~e_Sy$*H*pj zpG4>hk&_nd8>ir-d39CJP}dPn*pJsAAcp!2WwSdQF}dAosa+ey3I)Wmffs_jT|dk6A}LDss)7wfKGL?6+#G|-1W$c) z+o8Uc&pWRrPM;(5@Jh7%XdQvSD}TO%c_(uHIjS7EZEKm@YHIHr*{p7H#%#<`a&7O5 zi)X5`{&+ew`XY{K)*k;Shq-9o%L=@i(*~zv$!6JrS`{8YvxQjK<^YOxN~#M`2_VkqBFx^|%RfV$SjL8IM8OV2aNLj)}CUQ&C&l8im#q+sr@- z{H8>=T$kTuEyB40&Fq=;jpAI6yPx3ZDEr-Mu3nR8WP=n<)yb;RL6ZlpxE&1tag(Fp z$0ybi@W=g`J4677o(OMDY$N7nWIVoZp!c{jm{t8}?&0*u3X8Kut3AX=$=B)ZzW#Y_FDBIdRQ!Tnn~2dbKY@vtJY4PbhwO-s5t*moRrmpYuic zUO0s9A;CGPO-*{dZIb-M>>V4nA0~7aCpPd(kT(NX+a{9J;D;?_7V~be@(-8DR1K6V z#iyB`D%rYgUWOlk95j-W+Lc`+URglq=zpAR%X>)VLT{P^jg2p{i$Su|IAA$zYgtSR z+o)fcm(nQUVCzo^go)bDMO7H%=^?^naIaQgfo>|^`);t%+drY>^o@ZHoR@Er&3A?j z`#v~fhVK^9DJdHH@-5dEXyCNN1EI@U@}4yxK3dC;718X%PpYj4kTb^m7n<5AAW*t4 zHu0!ZT(_fyRg6h^V`L!*3)XGOX;uc-XuY>Vn3ofp>ZfKr=JzKPva79>-mW?QJxIL0 zIqo?5I;hMqE2XLuF)XMm(fy=J`2jWLDVg&N_iwh3+adBud75aS=bU|cHR<9;{s|#| z=J60!dXp_R6v(7JsZ84!&Q>MCm*~gb2THwOnszYRI;r-!OI4z=oF#KsvyGMec5ZcH zBh)z*eHryKGdUXbLu1H5MZlWeRC`=u%d5kqB(}Ly?eNBkWdwYxKVT#Jqvso6l<`}X-(h&+#q2^3$ApF{Qu-iqBiBFIzcF)uR9jIxPouwgCymRT{sxT5gEEwci=rDFC* zzM`S4rk)aJK0iG?5JY7PPyI0b&$~oc=JKPK5BKBS{mZyz+mt(fy)X8rD3`e$mS{gB zCPj{{IUeG5SGTPH+rG~%bAJOB!TA?TtB>&{YHEO)tSrWQQzE2oiE6aCI8I#hmw{I( zS7+jR-; zqflq3r%H%xJ*4llh9ov6%0=E}4v!MGZvk#(Wzq0>O+L)omV}~Ed32>sUhMUdf!D@= zP?H1nAxLh>vGi5YzIXWH%b%t<2mZh{{gC3x@J4I%okdzDMb@02>r;<%h*p+smE?pE zV@Hpfl<)D?R}w#$W4vJtzRPoS?BWidKOdjwdvM`>6M2?7f36Zcj7>XxE07t9OCbj7S_==wA>kij4acR^c=9{m?R6kS|QeMj)Ggy{tHq zYjSk`@sPmf-JFs5-3e39M8#EvhPB{6NH5Y-&zy zq}~IS^VJvux6Vqp0ilIbJFtuWOKe3{6PPRK?tj-KA4Np$5kcD z)@>?5xi#Op;DiV`g(OqS4oFZxMW_EcmJ5+zbri}&2bAaMC3fOmWv>W+^x5iDE!rVo zF`7!W*at>rd)^;Y*d|GPad;pCC*UI!2Tu{Oi2`a4U^2?v)hoz{TXagmHJ&!N9a$GE z9l%N!>MT~vQG%tlS$u94N#L*L_}$&1rdSL3w~Ry4?-aOcQNuQ04o-f7XTZ0+Npg5< zgNVc zrF(ol!C>ZdDrm2wh<0O5R!Wzi3u5UtiDQNN4PMrmDMn9v!kga=21PNsYh)j+YL}GpIE3OU z?SM;{#qPVo4J9_G(6W<$J+6i>9MO~4~I;2%S}13?yOCP2u~Sarw$8T zfNyTA5`OFd(e>T&RKM^4w^1rZC-0)HGE(7C%E)R^i3nw6od({NjI!79?p;n(k(Jew zWJdNnMZ<_PBE+eTva`3}^?DsI@6Y4+czo|a$~outy6@}0?rS`+>s}R6fv^L$*T7p; z3-#p>`zoX)*@SWaJ*6xw!X++56_ni`_z^X2x%r*4x46(OjCaF$=Z4Asd0S<{ZFjS- zgf)rYb093L^J4et*A(y2xIG(AW^S`}t}d$L@CmA=P#(Wrmwu?xzI?G4sD%6cT0)6_ z2^KwUa+M&xyl+kX?DpwZbdXY*IfV^Ya@Ig)m(04tVmp;8gV}tNz#~?)*7}rO+D4^6 z&}ofA^pP2@TX1d$DAfkig4C6rNM4hCVSXLyu!X(DX4X&2U`z_?s|)I3=A=aA$D5O| z{#WkqddgwxYgcCfd9zIWlHYc2{l7R>2*!C2z#JFf41>(Ss-oF-?gEt_r*(h z&e@b!%EQzLb{2c41gvh*avm>F*76JdzB?{--SI`bA9g?UN+FCv`V}s*#l;ecYH`A5 z;8w+IA?h&~IGyZp*#ZE)lU-|t%GVCL4@dt5|2xtOqUk=R!eSC=RZt&$6ILvj#Fg=( z$zXDpG3g%Xa^8Q~3o~YwMpL!>^~0MpT@V}clIE?;ukT{Jz5q+IeS|X}TJSULHM(-c1(QIe}t1U3_^jr~zMW*kpMl^=!Jc}iG#WooJA;V zhk9wrN3c$_X}L7oNMS|Z0XReHh0^x1=VwTzg9UCx)5V*v8Pe;l6IOH*K|C9O`4*#?@*N`97gXNd2cl;ysH|p z92Fl5ZwAX-NrMvs9zA5K`L#u)dbs;o_^I2luTl~^7)0}F_cK~GD>pHKE?hUf&f4S) znxs}-SO8W$@Lqt7r^=B+KCZ%CcDin*_q1!nt%{*Yn3KpZ%T4BXZIBWewtlya%-R4*`Wn%?C>5w-=ow^k?b+rUMrC-4HdJO|fN{Ih#VLkoQqe zyRx-5p8d@Lz|2=wWY-$jLUvUJ7RLI%m3z@pmWw_}c?i}S69#oprRE1ywc}gT(a_w{ zm(u=mT?cQ3m{V`k6b`JSFK?;gXuvGuI{HO3KY+*ZEys}SvU7xujH^mt(Qz;cB14`?xZ$#`NT^ zL^6(g;7lC#SFt3xHt2|+vEd<^T)8>xiOEC+Y?}i9kange*_;??7c_zusWD+!o}<28 zFypmVX&}L!^6FIuE3-u}xe-qq=_ApGCi(+B`$wpiJ)dwb+xB_nrEVE!_h8 zVq!;@4O3&R?@)bn&wDAiHfb{bmKYLMqv`rQB7B5XV@mBJ|F}!V(Zia9XgSuMQ-Qp= zysgg$2P;9^xqV`5VD0k4f2{KB$;*V0Wm{|n8)|=o`}*$qZ4aAP`UF9~1T)=UXsGb$ zmWw9}RtGl7HqiJsMtPX)asOa8r_&&Sou!TQMzSkT#7 z9A~kN&ZSuIfwB*#R^ETd>UleUjfb^p)|o}hskv~BA~Cl>^ahR&zoQZb4oEBZH!o?% zfU}RPVBMKV%jq2Hw{uJMJeR(|=f%d9DzfT*e#Uy=J_x1ZPU^kmWrAoDSnnwE<7w&x zQ&`7ygdwS-q0zQl#ZZNv8g4xBU7}M+EiI=O(XTbhaD44r$NEY5=J(Bmq&whR>xOUr zc)R0Qkhx5R^ffjP8Vh4$ZUzi9$9R8$;Hzd2#`nbE`#``%zYk@=pq#QJ4;`8eSn~%= zXXuiSsD{^=>W~&5PGA zzXl{K#fHiKrf;tAl$Hn60H4KQe(k~+JfpN>@DS=3XBQ2B7>k^;ZIynRsY~UCQ;pnlrJoV zykpCW|3mk*Q*)A;O7{b_k-VGNDURjBgZ5}?!jXFHE^a;y!|c!0i2v^5!pa(P zxtgu%A;Yh~e?6n97-ESgAuBNfKq36X#a3=MRcAhuV`YVmhLwM<52NiWYERwG%a^j7 zSMjeyl!Maw^}6DO3T^fS2`3XvjEEsZr~petP3pk7y)W!?(L z4A=<+n=oCGA0~VOYeGwA4%>vX(R*7$*bpTK1_j{pLHREEZI2pZMK}b%$J*IgP|L%= z`iF~VO*M2Xn_=yn9uOApANpao)ai3k@B6<8eys78CoX!ahYy^A`8qz>|WZd@T&mg^t$4u>ysA!Zm0OX11WK~ORRgMn(8t*B%YJK{$tr*B#g)G}+ zA=Te&Bs8rD5uaw6H_NrQ56g-(3-jyk@30}W=RSco(AoCibs6KG>!`fDx7UQB(I$w{ z%L5-ns%$FqTvr}@_Ni3Cstu(9u=aTJ=v3=5i#?t}9VKs9|H_-q7;VXjeZVahw`uL) zYWv~&Ti&K5ZKSunBChmr|!h_{(7kr z_~#hripuZhVy4^QEwRWs;FB@*^P`kto-NA$Bx7M;BMw_MN@G|v%e3`pDpR*zGeJ?+gyE*(6)~pebSjBm`gggEcOAXK*jF# zc%k9$h-(B8LP6czbhU$)j_3ImCAyIi(T6oIgOPxIbTXoLC2&*QLC3l$eZzkC*HzUf zOvO*Tzf7tqdR^xw`kB6A21EF)ER;)q<*;r&8Zg}B?&n}cHKMmu-{|Innn8l=74&ci zhqDdni}#eB>A-ImkBcG0F>DBeC6}1*mwi0lPxY)0e9X!(Q_?4A0Z1HAsXyuD1nDtI_Ql-?@4qql#QaGLY8l?4)fI^!);udGqpEM8QlA1d{CXuGoyK^pYFDv{Pfu-q5SuSVmxOAz?LAC<@JaE$ zM|d>202dPHyC(XI?z1Hyixr%DmV6jom;=bBl&za^cX*dl?SYycfVC9(x^7pXz^|x4 zm4dGVPHl80Vl!XUa)QNH7n)VyD2y| zx|yG48ABVgV^fggGwoSjHw^n)cMY?A&wT47%j1YV{5;hmgwpc-)8H#ZAK6PjKRc>7 zb#p7b!uU&11LKd+ck?LjP;XzswGWQ=`42a#6bJ3uIlDNwgeFgc1wXnV+N1>@y`$IM z4Z5wm#}z^n=D7g)=rY_b>}|1B%-@bz*%_vSVPk=jA)S2#nvoV>hFxK8?$8Ym{pym` zDk{^Jg@-EG(mX_eHftOE`s zFO7q8Teosz74rFfM$sc#4kWa?V&WQa8e_`0isRqPL18p>pyDp1M?1n#O}rIkyq!DA z^G{2|a`q(k%8goX8W?!E%|2`ubo2@f+_O6`6{jsUMJ7P5$7Op8fwIu->i{Q0X6eGN zIG7*(T?L-DDoUnG+IO{e=;b%azH3FEoZelsdtuDE{U__tvOy-0l5dHfMUYJc zhb`2mZ~Sqah|P`1Lys?tg5Y*Rq<>Wipyfa>i%F)PrzPwq&En%4ZtH>^r@K+Hx=Ijz z+M=T!#?VPL8-VCAXA&;+CGm*zL?CP|VUAXNi;=&3bME%u#EtvsFIXMzv;q6_a5qWO z#BS@uuiW&U^4lJVs>O*Osd#l4ZeHxsP>c(ApzmwqC-e(${Q01I{!Y9gqb3CWM8Cpuba$&lM>(?r zWtYxZ&sWjED4TyRne5w_QG0)L#Yl6{*R%%T(I~z7 zf*DA!y!=@)@k4*gP;Ji|+HjoeT=()Kmcm=^zLNul8Jb+>Nhv+?aFGRwk$K2QpZGxU z2ErhMG^lRs5_xpQ=bB4 zS&_{4_Qpmm{aKeG;KR;1Uj(_j9@7ofK@fDI-qk-Vm0g!ldIjydIt;gYTwul{!`dN^ zohu%?bE$v*=`mu=GWk?%zuTPFrGF&+8}2iTckl67`J`r6j_W8}z)An9?&XY=g_7M1 zMCYdm@<&aG50fMXuYRKIXw)#g84_}btlza3SE7gRMl~dVuV<5UJ?%a=7k`)X+T3ls zKPK+Kr}1*kor>vttw^isj$a{DDX6fxSEed%Ig)RR?LdIKwfj{>x-eBdV{?VCxcU8T zL0$ZK{3=-G5!VnuuGU@&UEVUrW$z1b z*76LfkA(%{KPEXBa+W`084^_slUpE&_MK2ne>8gPe>(J-z;Ngjq^i>(V%02L$X$&l zm(N&5=)($L?RL&x$p5=h$uZQVt6t8J(vN{L!V`)G8CzIpP3ON&?h%=X=|C*4a0tOV z$7OGQf`SK6!j8l+@A?Q1|E;iu`1 zzYUaSO5l?-u#3%X{=#>WUK0Bep1PyGIhuwxh1N)lRyXn zxMyhhYbmi$ZT3VyuTM~r2NxvDiut$>k@OSgK8a49N*m6K^XCu~LfH^b&&;~$X_#wE z02}@pmiwSVCx%q$*y;;Q#PwP3BfdwpcH8hS&yGQMFwq{T6Q&(l>25PxaEhVDr}%N0 z)7~cXf;PD=ag;71G7n-0h6qsA?Wb(0C0XDfl^e8nv31lMMaXsT1KP+yTOJO@g?m=_ zrTaK6$XWGHJqZ6BHA%yS2a591^OlB9KXlFyH9}8@r3m(XavyY2FZ(Y7M8&VKQwS32 zIlw!GK$v^-*q_(lWk83M{N}{`5uIEfwH|^)(w`vOq_l{TScISpFtDSyK)XNjv?8LX zLiW2Ird9{KWyJWX>u2Dw`L!q(CLeMkzo6%O&8lHz6AO3esrkdj*}SE%L!YwJ2P$Uz zthwL%N&y3-Q$^35h}}i7Uq9CErqD- z4PV1;K!EzA098Q_kt4p^NqX`^q|e9V%0{QWu!arjp+tT?ELMFUtpLQCmj6I4#B#V>q3 z{2hM(A~n$x&A9`TYH=Ow;9?ANR;9s_xis3OW*wLOC)Ygrh0pQh^@m`CBnF0#8fIL* zi$-I&z|p%80MTGb$NjUuMxms4e)`JP$~~U<(?0v8RIEau;^o_UZo$suiPzBRmo4gM zw<OtQshW!914 zO2gYUUtYE}hCIGHr{TzQxZSg&s20+3Ph1u*Z!(PtG3R) zrB9_?ms{4B*16`w+@A)3wrKFg)>d==?0}9ZSv=KU?#Jz92fKh5hV$mu6T~DRVgz;y zwQHXy3?fx{*N$$dJ6GZ1Nfr!Cu&+gKHL=lfUk6ye9U?*ss(_!=^+eC~J!VA0oFtY@ z*s}t`idusxZVe%rzmQ~On|RCh(0y2_TBn(%i5;6iQHj#QVw+CyqcH*9uRe@j1s;5rMlq7s1( zmHfO6O{zguKyqG3;@raiOEAy`H66h+ygLPwzid=VODErSIW}ip{BAgFYX+j{e6T%J zF$e6T=XgQo+wBQbf{Ioi_S_szOkg3I52nl9zFz;&lm|)rIv z&OmVRAh+@S)MKysxaJLQ`K;Om@9#Zmd3NPbe)IdAN(;?lp|`r&U_6A@3leHHF|bUb zZHbkH=~Ssu?F4GJERs*xcCiewaNAr!bSGUXPko8A>F}1-cPu0E5K(ga%VpqxTR>{p zX_+u-09#+`R33_nynFMGSL*2L`9gD8bEyL9NkEJp-s!N(L#hpCF1TM+#c!e>%i-f1 zsC54V6YuWFdsZj(toGTTx-+`_B%Iwy%>tJT>)ICd{MMQx#BhYP=h}Y=$z0o*w?Gj> z5=&VK$=r39-I}g<5Iv$#cc>}BjE~5fjimPnV6E%y)%Si;tn8=&us;hb)`hGwO|cRt zx3I}4{%up;#j@jH9JarS>yBIA1nZgZxCqMw0u&-$3KU~;Ym3Ua*M+oS1t4CN)f^L@ zp4KqWq->J7^SRt;GK>Rc;1+1yA~1>M^SWTRZ?hu7#vtFWL(`Rn zMWAPXidwR$V4*5u-nizI70B)+^dinVrF|KE$+8PIwH*&XWkv29++2PdqS(t7G<8N-OC?knanLC{dgFP?>eid_P z6px<;`~a(TV5WXbcy2$KE2 zV}U7r?Movp@H&LzM*ze93R2Bm4hP`H?|ie{&+)#~U5*DG$HFqWu6p!Z+-IEu5Rx(Y z8rDiJhcqN~h8aC?qU(B@8Go$b!i(HqgCX1T@g0`7zhYpec+$3MWlsFNyK(yA5PB5B zmAIru_U;fq2cod8t&2FKN;0{Gl6r z-yZ-2qfzGiJI7Oo4}B8$c3A^cR@RrSEsY?#eP6-C=*y$Kj)gZ3bgbMGEygh>x4eMB zSR)$dmro7UOo;PPx?$35YYOTM#;3Hpt=~=#>&BceXjN465rizgyj@#dEuZFJhP~R2VP&RPG0?nf^=&a8$=p;WKVc_x@A55pZEvkfW(Ot-b+l;jj4KTE`K~X_kln z;~fHsVI6ubVk86H!lht^zhR0>>TOH6v)QIB^H7ng&|^E{DBx`qz9IScU8H-BkLua_ z{w>Y7hg^Jj?aF;tAkOLyOoC;8dSz8Z9(r{?2XZ^mW(In*ps)4;Mt-zfdCX{$SnA=a zxtFs8`4jIJzd(#mf$MvS4=P|su_+U!No~0y;H^6VetkdkT`%-2LDiE3dH7oMRR}MC z4Dzs!BoY7T>86`>APeB$9%7YEUJ%Fb0+qby~vG2=xiI&8Xn?Ceo!m_J=iqWa4`8 zaPivU#PJ__J}>s%=VL>C$;`#6!h=_&*w8-AoUzst^URc`$UptFOI)jhLD?M_2g3IO z&Yg3G*eO)b?)@2X7)1}kFs$`H0Q*EEaR}Ftu;3D(?tS8mmWIG+uF}CaM!w9|ftht_ zlKgO}=xnG<2?nhp4uqheg3S6A2g5HzZc7x+#=UhK`ntCilicqM=E?QE7ctQt*bdNa z(fa;T&xHgwrMsxI2GxSn;N?GZQQEHAXLm^c^8w)QWU zz?Bi1-EQR7hc<6!4IuH+7*y<^wY9Gvo>0AIo9d!=`O38oF6RV}W~!>y60jV+tz8 zL;Zepjh?~XTI0d9>DDFn6Iy&xz4p+lY^w{=7MYdf(#nd_fq9h6W z4nf*$l84uSruXoI!pPvlNJ)*lN1Ckg!f4^8Gd-+%7zmkMk+(>gbQpbthb zq^gA-&Ht2n3?@-9E41E+uV=2h$4%=^ z%`D6g{`NlzzqziE@rP-btJzdSGDCs3}H??APSiS)aF3{w9Y0Z+p{OlQV4=c6b zIUw!31rAtiTG^cy%65_!2|v)npJBA~N}QKGtaVLnP!mpm84oY*$!o@H8#wG>9rKi1 zAQyJIq6=Am&-_izlng}|8`@VrqxxITR$~cs$n$l-c}Z&^4SR^% z?`CPH^l1wk@|L@f*DxE`T+yjG+m~X3vMVyh4)4H-$yNV(AX+n68FoLxns?i&tJdL* z&7qP>>(d9Vsf`QPx`G&Y}o{}GOj zSS)(B(KVM+K@*$yb~&&jfBUWYQb%e~Qc9tAMtH{o4P^G+G}!kfCLpb8%@tneo6aZ! z=@$YE#BTnPB6jA>x;jc-AS%snO=11&%(-l7=M%7PO&-2&T`%Fbi<(F++&42u>?Liry0lWumZg98GvP{NTaS0Dq`9I$ zSEb`rA*k-XX;WW)vzJW-B8tc_a6Vo7wf+jxpxZyD>-zF}D^HJ^R}$Y1joM2l`1%Fy z0E2oq65>9emyyr$AB%MyI-g}{9C3jy#kbv_VyvYG>YL>qtBnh_qJgWCuW(gQ3bJ)u ztctq5fPYZ`KNaX(H6j-A&($zOJ1KIvM!dNi;3I#0O^eEIM;c{;en&&ZgtU9!%NKUHsx{ZIdH6s*+= z5G1&b()VLbv)r0j2b!;vSK!>%6}baZ({_g7;EUeKAHJnJB>E;dMN}{eGbfDG4Mtol z5*&ys;cjX6H7%v}1vaKwiOB5*W_tDPXMO}r^4@&qGm6y`BhyXad8*wMbAJKYQ{s{> z<_J=3f^jLDl*c7yfAB%x?JV-uNuBAZo->>C9f}r!?2nJ*dpVGOywK}of;jmvCJ5m| z24AIn+e@C$+QowF+2bW{X5Mmd+Mtzs5?TmKjVtXgHiLs5k|I0sN{aOyI+IIsUGJ@< z{1iySYGQo9T~p4j3C=yJCq3Im%msfAhO{sxMWEj3q9#!>GIOx#S^~GTpw^@btqngT35P?eNPX}9SGXGCoaq1NO1?hPcYYJmq`a9! z=jQV351@N(F}J!M5Y>Apk0|yleJ&}b^^4I4vLWk*f6wBWP$hQ$mWr1DAwOwQvRvM| z3#w@;$#22U;zg(RWJyw=5YZH%IkpC(tMo3gB@#*})&qr6rGKK=ASXwg$GAv&DE`!L z+fp7A!4g}g2hLdn+!3O_H#EyjNvQ&DfD~|XrDm|E`dQcp$t)4MBh5Fwmwe2Llsz>X zh3QsAW3YE=U;>T%EFTR>ageL5_>SFIx1HrrM)CMM4T;Ief7r2R862>3U zwBTqO{9Rn`>0n)w?INkhYz$F;aJ?@mU;Ka!t>@VdU7k7+pPRSAGx#zbAJ%+DmeX5E8jHRYuht zd}@>zA(ZrvlmsCZa%KQ5F|%B_*L<|(XLfkUDM#qx+vzD!wb%p}Bvhu8j6V>RknIxP zF_!x;iTd7E3Z6mK1bs6l?cv%HXJ|0l&qfX8a%nSeL~e2N>6#1zl~Jv_^1j^&Sm~K9 zV8pSCFmKfUoo$!Q#PW`VZ25fgR9BxVhP%!_*{s7~^Dxf}b=T_px$6)Ts=<3nv}zi} z#-Sn%HY})sKX7$4EY4sSY!EA2|7)~e_WkYcO11KfKf~OFn%r~D*rxQr_=L25G2*If zWk*7#Iu-aML2218b>Tb5<8S@o@Hl~8&IOihZ&s*lux79%h%4Q3RQ$g8&&Z976;dj= zW-^w?5!F-GbJwrr89t+wyy1VkXlSO?llkunpwZt+F*Y1n`c|h3e?`yMyrN0wL|Y;Y zLw^T2kLS)pg&5^~Gq zZh*Te-Tx@4G2x`G+!eQE5wcAj;@f>ehCYcx1@$$rG4nmlLQRkj*^6&u*>P06ZS9^%A0Ay8;`Po6tpuxL(Z+sNLS|* z=FzrcYK@m{<3+EXvWW#n+zs*L8t6V9&xZ7@w|Zg^P(K=&DIIlDBwu1@oW_SX1EaWU zH6}~N9vuh7VWnwqubB7Gjes)nLV1z;P8rPVl9RHkDqQuf=fue3?6nKNNXYw zq6&VgDZp3-^Y(fU&+vDsA3@TzGmZ>fsv_=ponYhOlt%;18-Vu6xdJy@Z(n&MTM zlwoCS-_z_2r$EBSF?w?yU;hixB#BL!`2hUeaYPc zh5Zb^%r)3ESaLm!3M~%MKlv1VyV(7|8SuAqS9%!}NMlU>NRp96yOB1^@s^mk}-Yiup3=pvk@-(^ZKR!IK~ z2rxAJn)93>fnjNWB$EhJwfOH8T1K#PK6z8*n z3rfkcdaAfz#GY&t#|Bg;q|jIjc3E{a=0({aWrNeBb>#4RTApNQ=I>P3pZYdqu za3Bo(Iw}b>{;t8wd!XU((~)CfGn_`@o6yO+ig*x0H!AWE(t)slPKX2Nhf%l05*h?6Q_@?N@ICTsB!HMY0y*^xVa9m;~;(*@UYYmQjL`S*1Mh z6ie~f&k!wK=Y}`2T$yf2A@JE1_?k{2kth@O067a!O4AiQ!#YeZ zW3RQ?3Mk6zxjcgI516W-t$r^ju~;3wezbtc8!*-b!Vr46DD0pH?S%wT-rtK4A*{QA zHaWB`CGrgSfKhoKCllCQ@$xte)naFz81@+b;)@gkaitS7bcHE9rQ~r9tiE*LcL8iO zT5Wt_pXjQ;Y%3JzZhftJz)Fnq)~>nShp)d8=8(DuM&|P}pZZL(@XFJBcrm8or7yd= zqCjje^-~svow*#wTI2ST;cwWHTe(gY{y+iPrZC(#!QlgP_b{ejfRM&6_$oH8K7oE= z=C^FMnUx{9=%|I4YWivMBV-h+Os)iZhjq9pC3j&v=kY@QW`qm%drvLE!YOU_M$-ee zW)LnF*gV744ST>d{M@|`-3DaUiMa#~%=%$^-TP-_9^P<@-!*9XC{gA1JY5X8o!d_c z8~vS28k<_bX>es{`h!Z$3gE@fDlYu~xg#zK7a?wVlQyEDcXc`Hdl6}a6X#}yrIB_P zui#)*#*|}jh*ALK^FDwrZ4E#~2Ir{U&tAW4eYRQwL}z$v2agqkhQ3!?zt{x2kgENS z9_RJNKMs@Z2;ytXM1#?EQGSt_aSt}@U3e@*77ovBa+PD|_;gAqS$*zxoa#hYeH;fR zvHIO0DvH5-`%Y6`?vCx@#j2>=e@|@f$_h11A$oh^D*v9>wyN60ddh_SA<8D)>S+cm z?BGBQo`K-P)D(fSktcUy0gFPNELIo&@-3M+ygyxzqT;IGE+(qsSRd%)a!#PjdcO`X zhoKo?L%?ygwaYj7bfJRt6CZ+(l<%n=K6(D+z=oHFi{IhRCSW-eBPE1{bB|^in|Z>F zCS`}s1Kfp0gh9w`r5o8{K8CD1OoK)Bv99)Uv4L1m?o;Oh6%tvji+-Y2Tq!YSv~zX% z5+H8cdp`8F@zi@4lNiiAza++iK9H1>42c9W$A&dX*3)-+cT{u5<7^k@FU$EzE-hcu_@6{^gZ@2EL#E`I~dfv8%_zYjjQmsBw1#(Wi4BJST5o2xE+*-SK( zZRpS`Umi2fNSeKmNp|2Ex0BKz5V;uv(x{4ov%geUzPHWtOL}!u$$u>NZPSTikq8 zOaW70+yrC4=zxUm(khX={Ky5!2VPZuWU!-W7oOpkj%t^b5-qM2?Zt(x7=sY0uf?1m zePAbyFU6p3EBF#APXf9;`vHrFnk(8o95*bsN&QCgTkaEOt2Lh`V03txkTt5^bIkXT zhZG8R?*hP5kQ!2$oFV`YDkA@DJ@Y9>xb}TpEiO0>(KJB>V`kGatgC&66I$0GfvY}~ z$V7g?VOkDmbBZMhKBjwLyu7NtvjlRx-#{dJMHi{T`)UzadB5WTFj)Eb)9hW4%V^+4 zcdO3fkL;WG4H%XxuM~4vM$^uEEmGGxFs)A zMp>?LhD)%_*Z;xDCc%sJfoTeZe!iv(78*9sh{0GrkNb0iu*o{~vP%frgv&GY|yd z`5zJ>71Ey>9c-Q`h$xcL;4q|g+mpav@W_3~Ume={lXJq)dHB>mB<#8a6JYA^=ZiV~ ze#jRmac^u&N-=*y_<;y&&Ya(QhtAw=mn2XIyim1HB?%6E%M@DxaR)D%C1JVv3yJ`t zJ?3D2uj5#-GByZLd&OjCq;$u?0k-KJ!k_Y~$YsB@v-lPVBL@TaOhEJOiMm1>79ct> zKpGD1WC|)g9}zqvrvAm~&bz#|L>oGdw+FtzE#&w7aF8J97WgtPw?2moLN$CKP>=;`VuBmV5EOy%^; zY!?{R&xCP7T2-yoz%i+Ef1te6#pI(kp^OL{d>qlK4pgur#&2`+-`?7KuHd&_ZHDoY zWL%n#FUK;xZ&)X9tKA(o!9h!%9G8IN(OqJmgP^}dzy7EF$L%3}(;3N-M_Ag!F-bqg zH?+-Ce5%pKL{J8-`n{#@@2)p$6aT91k_z_iuzPritAq7vA=rSD6IqVaNR`1R6kv`) zT9(>A=?Q9!pXU$(d0Fe=d7ocp;4>Nee7lyo{PraHFbU^G=mN9&Ikt)qTgndoJ%8_9 zk$};R2%#jP_U>cgFMPM&SN4Xicb7`JCHP}V^%Q^8al>EsNp#Nr4xIml{C=Jgz`m;6 z1O3(=-c=q7Nn`pI&+{Lct-w8~EOTl-fXZQ3cRgWn=(epZRtPn4Yt4HrC6fV->WwZv zzUHUSbI)L&P&P;__d0Lw-rp`LV}q!Ja(&0M6xS z*Ty|6(Q;83gYg~EXF8X2OLU}{roPi$ebbpln0e&0()}32uJGva0@z#+5TIVHD!jN^ zwLgL|U_d$RT^>NQ)}UgZc`&>RAv}mNUxnwmV1?Tz8EqjkC0-%AfAl65%)ITJpA(qd zU2Yl782~C0u6B;`QSlr_nm}um!(-yc2Vo?a#2mHL&AB{IE&M9shIz|}oEIHpCZVomvbT#$@6uLq_NkAn}IC%CFb1WVaqlBx!X?xb5 zfmTp~-qCM^X*1-><{N{c`6|@N<4iJyAixY4W10VH%O-(+GkM&hGb6heLfsVr_ima? zY@GJ}x49yP7znChz3uK<6EoA%f@e!PBZhaq(HGW#Z~xh$1z`df_8M~H)WJV}#l`27 z23vaya^4A=W0ps&ea;fFl_ccHqOxbnnarS4T zvVyNak@#*f_VLcRIm-USW`k_@9ipaX+gwt+6XZWyD*SN9^MzYLhR>E1Uh&JWGRe!3 z%GLaTGo?G&Bl3S1^OK)h;&5d?&AfJR_~lKcgYVUpwD`n7O2!>j{2g zCGtbqm3**YV!bTUgBnWw^K@4(kssYO6B-Ujv0t7&>Ho3Uz90_%{JWGq0 z^nL9IaIFZl@I}HgHN7_%KOx4|l)rFGg@2K)O}5)elJHe9uP?G7Id2vL@TsOzrrFZX z1$(+Dbw4wkUk>+w=$lY}w2ggpk{`pRXQ^#o6H6go7H<9l_-PqLo9B$9>>b zm-d{uoZ7FkF~iExjlLClm#`01>67m6FgPMV0%^HnJV^EctemYeueBrFiBo`ti5TWU zd2nTI-zB2EWl4ZBk7{ZHE9#f6~Kv>i=c`QDE}g#ZFR5 zaDb5o@F{#Z?>3@cGaKQGDNYbh`*A&9JF{0Yk?Z(6Lb}p_UThhD?%xq? z0|YJYs%SEhd`%Dnsf}`Ri$k~s>_wD79~uo9#+&z4`85l=kTAFiFE5?H&6YrNe$qtO z5S;ktwA}}LzxWW@E>e5%b=m}6Y)ykRdh&y4Ry_}&n%9~iS*)LaXNHfoP$k}ANz>*e zW^_@Lo2yOa-6awrsiS0!bFug%ofS11HIhDeVkBqXhXorg?#!$OL;Tg%IG`bkLD#St z{pKXbq``=6Cq#l>7TOxEl42-bQ?0)DzIm;6?~?y&(#%QG8<{b$H6`0^(IgsmtIDDi ze?T5=amMue;O|BZ3^PWPNQzjQ1pmXJ4r@`U#!YLeQwk)-J zh$6o9H{t{3R|&uT7im!Rhh;MCgL%;?q~37;p4YL*L%@mO%FGidhiYB4T(`m6&cl?) z|aqYwG3kQM7K`jHK;O`V)H1ds|I=CP17ddMchCf;O z%)GX6@Y=M*l8JG;+eRSpTjU@3jpZ(oy1dtS=HwSE(tWX&1d^jNLVcsH{V zQ2W;U!6CS5A^g<_fyM6-Pu2~Z`lQOFG91+8=<|1hcH^pLaGggx zbFm230ervx8ct+5oH}?-?m8|Ftu9(4=C!cLCWvMR^I?7omcoT;jhtio`<)jnr%D@p z3;Nxr37;w{)dasoa0N~7cE6Cw^gr06veJ1^UCDMENSKcOVMG28Ek%8-(l+*FU14QG zx7v$u;j}kx$U6N91|mU;ca`jxkz)Ry;ZEg8OSHJ@z2Fkcy+u2y$wAdBNNHs6hY40@ zp+q&P1#0$RsS-~S!{SH0`2XH3(zXM4xcFxsfD3}8OaNjnZMB!+K;MX0GkYuLL{ghw zLArS|WSGj9twm0hR}|V9wnFE_{_~8zJosF(jClBoL9LH77bCJBu?61XMj-~_eARH5 z`(k7CY_JiUs(DXC!SXT-BU8G6j`#o}eZ~I_!vMtfAuhrsdu+x97Z?g> zOjf}4_itFX{s5C{3sw(ud$7^~tQYL$S!|vaQS}Q_}v6R`X7oep@1e(%h_)X4<|c+`;kpRQ-8YBv55pg z?Jtrn2}a`1Zda_Kp-mtYZb9~6u5sn6bEBUw7V1AQX=&#X*1_xr@TmNPpnHO%y@XDr!gV0{M@`Ou@>OMljhb> z?xm(?HeQ>>D6Bmtu5jxOk380?G;B=tu`y}*&ISh;@}cxPwfZe=d1Bg}1X~;ocqOEI zR07Ov4=jbzL$8{vgJ7$P5jG#qER6kRI}6-k!OfJ>l3b|o)!v^Y8U0&fA<05U8dJ3| zB$?N~7`#@O-?UqVi+!06y`Y%CTI$krsDhD|B_med;ybabPcoK1BmZX~R}}OWJQ~B)tsc#9_vhIl%aWzdk_DV(y{90~uDFg68%Oh}08{?G6w*4RQiMrETpmEfX`-Jp9eYK> zzyO8aSV|TsCsY?Km@*9^))jiA{iP3K;JXfKsM?a8A3lWT9co{`#oJI}W7UcAleoT8 zErPZ4!F%r(F@o(3DwK{kaQyeQ^Vi}20FxHj-4DQ@8a3VQ7A~}72l5GN9#MA$Z*~+`gBUg& zAHyGXJ4XHuek?Pa(y&>R(gzZ0^0yE+WEA6i>mv@o=$%gX2d)MNz?>Gd zsDwn(OtJ?1(@rfcP2!3^!eEAE)Gu{O>-<&1U{T9YHT5o8a-@=AZV=-w591E^4mA(dVs2UQBCaO&w~oVp zwyI(STuss|!D)bD68&L*m;Pa{)xGrb9*8K5>bYt?c2|2n187Q|IlJFZSKZQLO{Ul2KH<}@bUNI}JVDq=z-JB`$)d1HF$om( zyyg=B)egqE56fI7vin^Kb*EE-SV${p7!kT7TzSI}1$K#uln@!bcqqXx5HHi)~B&C~Y?F(7!Jm3WZjz=X(j9->~U3Rv{n% zK@P=!!jb!zT|nz zFM4GBQPj7BjnFu1d%<;D0k%IlKjtL)w{AQ^0hRX^jV8Q)2~{Hx2Zx%)?n{aEcuMji zx3a+ICvn=RR;&h#mn{Q<1(bJU;jj7%zC%i9s|lqHZYmKXB^C!O??LYl zI|SN&v+~*|2Gt$YFmITPhv@%1%=L4Q$KzrH_i8;WWr}_-omK?KU|0C%?dPyspKT6* z_1ua9lpfQlYG$y&*mxXkbodj;LJ%bD*Vylv3s>p}HbOu>j=h8xIvK1W0H{4BOUYI6 zH~_0!PGXW_s!@N5EQKuf`(LMdXTb@`R^YVz9{66zHCGlM1Oy1CSc*a^^BX8Q{m2uu zN!0D-;@>pOPOA2s(lz;2oEWzuhRt<|J9txm1>vEZe1V?hC25|G)d_26 zZKPyuK#&S9GRxvp-1x__Z^zxkVl~T@16YSP_DD5&&Iy3qg55{doh>aFZS;EQJ%ReQG<{NW+&oUoYV34$;L%zopl!thm(*TYtNP2XL2){K4JV z$zOiRC9HUS2Nf>8UA|gM1)TB!S@;4mvt3=A59hikgYLJChgCxm4N)O__P1l^S3Efc zs}evOj%n0yy?5|Bo9OtK@ZCJPi}r~HT?~(@L zN~g@r8%XaTFXziz?A!HCFpL;G4bzzK^3=MQYH7@-RR!Ghj$0gPRICF+;xM#Nm7{_~ zc9n3;|D)`?1EM&-$M>izO@bndfJ&FD^o|jUh=7eMO%RTvRHc_AL_`HqdIt+Af)wff z6cqs}f(TMirAj-g(tmG{#3bKO)cfrpu(vz&X6E(xW_AV_069R2X#2CY&7VVdPb={HG0ygx|xuRnb%C}M+nXS8vTUC+|e6?~x3{PMree0xHaTXOJd zbBlgAqx}XcYOVdPTyshdRIa}x&`w|@?;Ft;PZ0x(&e#08GC1laj>SCy%)s80;PklC z;PfxEFwZRY$ix)<@=cX}YvS*l{=4Yxh4VYNn0FnN)YKl^i!Wns(FlSLgdZP+(yyK* z4tO3w!!~9iEgb$;WixN%71Ho@a+K^n*yM@Y*D%TLt2Ism(&hy1zaoLZTlxFWLlk@z zr7jb%hb>6+=b<-!tx@1f;fvoxL&r9uLqfW=E;=>w_Fh935MmkxX+yIYPCsCKqzEcILL*nfUHFCatFR1Hxh7-`c;V}n z;e3=4NvUmI-54-pMn#er2kzu@tfoB60knaN3TY3*>>Fah;RDFZZychz4=HKrzvaTw z694Bi?|{5T>wNS(S7BA$ddXu2&2B?TutWlNOkeg{=byAARp84(37U5^I54Awf~_#c zMMHldNq(Xq=PxtgZe4Yk760loBy4V>*fRGnz;0s-q`i5BGUT$!WCX__BEmfbpmB{mEN4uq%yHmy{`F_(u0-vf2D(bDp4FLCHi zOMpC%aN;=rW~o1$a7z$f7P|Aycdrz;m}JGSvrBp!IF3s*Hjbme;=rj%nwL%pwINj^ z+^%Ae-n9VkZXIvZCK59gnW6p=5nm&>jXl?Dl8XkFVIj;9cmv-LvBQ_X*5YF{7w({L zd%Igq-)0Dai~507%o{?i2nrEGvfrKulp+66z~j-NzBw5NWGE<0+7csDYl{5yI z>TfsgKSt*R2^(#$2~pq7`*@)ezfKe2_AOA(tqpB(!(mv_wr>^sOcBxp8E4~HD3IK8 z&^0qQpnq#WQYCjb)|dwb8^E;3KW0Mzx2-|dNz%M}PFN6S=8d{tfQQRO^S;1h}H>do6n*r|>9PNmr zoY`}Zqj?@UF{hdG-Zc9cAYRU0C~uJX7pDS_;W0{1aTl0xf|+I(QeYku@qrR=R^o7& zn*Lj|?mt?8jThq!rhD!)Ho5qE^B*t-!j=N`;hYeDJp4HJ-0Wm`Q|n-jJ(#+22$)Q~ z6B^Z5NNo{!K)UBf@cKz^^8r+|Z(z>$Gni_2d8aPz)kS9g-``w~Nfj>-c0P}fVKuyVpn5=|WvBOpk+1mfq>(8rG!YXVJ({eKH zl|8e&Q@-P3D!zJmNoG{egWNFA*tP? z8>5s#P24Wmo9$cJO1U6iwU=bG{qHMD$a!A6NxuiT3J;y6pQ2$;#gwB0MMZ z0I1HhM&QsDr7)e@VfuUy^~-_#_bb5LLX;^#k_dyx+Jw5UXX@c!^>(}@z=UuM3KlrOd|+g}*~1(274$tJVTOkmc0c&8{+5X~ya<236Yo zl(O4n3mrO+^kDA)UX!t>W{gtM$pr$b)^yVz(d{5&KbZgCBX^51zo1g9-pB4Jqw=cvFqK|HGcZ8T{L1iOQT2aeAvV;g>%pW@<#J&J z53MP)_Xpqbu|}rpVc#_ODRGXMeo70VBJe&a{#8izeeM}`O|ZA9ui|!kxG$%lbu1(4 zyrGZx4sV|H^C^LT1Y%9MF?}3r+KVZ5^}zQl&%3|>ucrTcwjx$o(5B$OQX1wsC86}o z^r4D!SC!GZq1%le%00GaoG<<6j`l-}6d&;6c9iR++ zDxJ(U4nDcknX6p>$zhBlUkURma-E;Drlxk&6QA}{QYahr${i=X0~~)_)%aH@{`sG9 z8_-%6GyAF8zf*Cttg?UBqq*37`C5*zkIv}aZwm>gOqT0kd>=rao(NzQBU1Q{cYm1H zTeWB}7bt_n^ms{ytd?$g2;IetN^k3StX$QWre(d*;N>cgS21L;tnT}`@FNR_c;AVh z=XDQX%k{j_X6NcZy8eXo<(lTC42Y9Ct#G>SpHnG54;m9H)^vU|=UbBqS=F@s5#xOu zC7fJwVWaVWN490%@ExZpB)({hO!RbqEApe8Tm{xP$+(S{CN)GZMhzI~K>IM}dh!4e zzshgKc=$^B7?#-ERw5J62|sG_+q=JOuI_y47d3F@KK?lDuM zq!Ku9J*ZPx;ai~} z-4Ju-H`d9SXEqH|TMuPL53T$DsKU2*M7%sKHG<3Bd!yqA#3icRTbn|^P3L?o`d>Fp z*aKP-J)}3eR)qy)Jip0PO3bv0&+Ds`H}Z)wNz}`ONnK}A3Gu^X_O|>%|DQD{*kAg^ z4d`bC#K|3fl9iUkwviY7ukQZySy5)&Mi|KX+A4g(g;K)x)_Frsg#(KJEcD&`3px)( zNG}ybz?^D`4$xSS?5TSa?PlZi-8%n#(Rou_pY+>9wx+XMds^MaJcuz|*xvT)OY(-l z++mA`9q8U5iglsmczO z3x4Mgx10|g3v)zpc~BJ=ScPM|C?)1Z>qf=r?f+Z?@SUpP9)I;q3L^a=+KAq#wT6A8 zTK~#8ek=3eHtAaD{tv_|vj=-OKs|!J za}to)ynLgss2}AA{sF)zMSH_`dMJWHjxdfzVoRZVd(TGi{!#KjZ}AHw8($0IYC*w{ z@i@LlUiTP^OxR8Sl@R{VYTq6b&R(u3$u4}5bJWFhi}_F!s2ta@Zv}pM(|`9gnzaW% zuwQ(>L&G$lVh^^kK!_BG|F9zZk}w8#Dx8#>Lfq6uCgkgGDw(@2w6Q?#~y*KOlC#9@&3>m{RVL*UweZ%opL)g99~lp z%Tao7`}Y1vH^l18OQiRBhn+9is65l^Ylt=kcy(hFm+nI^g$VmAG(F8UrHWMe){u1L;RS9If2lYJ zeusiK>TMj|;K!dp`DfVYao5haL*wQ+E%Ajzcp{@^^`Cn5Cm?XXt%e&mJGp>v2IB*p zdo&nzxxW8NwT;)E{5Ndl={Fn(9RrfsGhnK^bZR=y>c||xNY)06>GY*-##Ge-=Ln6G z*ETKMHsoaC(lHj9xE#(kv5BZ<%3BINEb?uM%nxDd=wjta1v=?=SW|tq#%e?t798G8 z7U?}6$v2P+;@f0GRxgL^rvrdm4ZXqw7BT@`m(Sb)&{uNY#ZnsYsQr zjk>NS{=3|FevLnAk|({&H6zK6q!7MR?ik39QVdyk7iUrk>4A+HF!w4+b}rC4<(Sf2 z`U?tvr_FyqE>F+j;N9`Znr#$4PueTWG6P==MjuDk=skpC^c$=4aZ37{<=QUivAD-xF$0U> zG#=dGitjc2=W}9<{0mZB=B!PP^tqQwqIWujyyk6^K9a!XqH#5!r@bBSvBJ@V?^;FE z$WmK`z2NTr`9Y3#YP4JY`2s2UC^cfh2hwo^Kk4|!>kHlBw%y(s0H2+015fif1JS&X z-%~kc^_UA;Ac`_hZ$uQhB=I7MInB6X#jL zjfS1bNt^wAYw~+HxZ$D)0;HGp4K9TxTGMaF5yy|RbtWcK!_(w3Q{wzvlJ|-`R3@!} zPk660ZEqsgcY{1`lD>E9di+M`RWG;q@XHk_;S-i(2YgD6dJ@P2ft$*MjSbO@{$124 zrmx32yc~{o)gr4het|9O6xBxe1K`{}<+?j?F8DLChW3xGWT`^L=Y~={sde*~>>y6W zJaFZNej{M-H+8Z)K$zMUbxMtdXdEV!)PZ66s@~)HL6dA&89wr0WXzMk07Y<5%XfLf zR#5pV107{{+21y5CiU-ofAFV6j|o~pLwKan#Q)a7z>L}2ps#X2myfR1YW^x#U{0`Z zRbQoi{WG?By(&)UWigx|X$*(&HqRO|;b%5z<>PyktTY8~U3`C<09sTbePSt)hhL-0 z&sd?iwR-+^_;T|?v6*rc|EF%1bu6s=g$?1O2Ke(3=~m0|QQ*x3WXTrdZ++$%Ga5S- zo#~!~P2ZHw#+CzlYAJhX4%C@IBOTR~!x3M4X;vJN+%IrA!q=6ZWsV}a&^gWU%t5;^ z=KH>fsDC}LlHQ*djE;jndtxbqXKYNM?)`A>;c}(-wLA+NlWV?>{GXOZ7JD&-_Kk78 zz({v3`A7g&-L1(&6+sh3V-K{Dd#Ed0MPqvKvR%rKFR=rnbrZw2<%{QisssJ`5k)w- zomOKlgAM=kYzkI1CiBJXGym%7_kOH&Ka3gqQN*Iik~6g^X{yHskV7)zFY#hnziBBD7HLSX^QRO2_s3|2xH_SQ`- z#RCT&4#U9aIGIBNbyMjyox4)P6UFpzC`6FO?ex&`gR`iuA>IYV=(x-;%IkTL`5tvi z7_f$3Gbqs@XEmsr%|MascUc03FCDC&dl>qikq^bh30XTl7i67pU3dccn8qc$5H;*0LD9ZaMg#y z?wQc?t@F_+x4(+egp}}-+{*$L&$&&T)WS}4FkkT7<&kbv&k9FTEHs@C4 zE7fpON(q@dPJurQ(z2&cg#nX$+RrqbRsY-0dH>PRzaMpq0FE^P$83p3V`1UPRm`p? zV=g=l)5wnKdCmWcmK#IVg9B7~OT}T?{^Bjv>dM;xUHu1lH~jEz0KDYmTxu+0%}182+^GzxK(h&*n?YglmKygPMPj^;yCj{L z2Bttit=kOeQAJd+?0{oK%u;ed(*=^}#23|qDnj!tMZj-ZjqLD5qhHnrSC^y?0N_D5 zp%jRB>-_5C6ER_Y({d!q8;jfZQ%pbsbA=E<1~9$35NM)kKt=}j2c}B1YIV>Sm5PXB z3^*ncD|-a+<|`$}BH4{(B^h%U)zh{~08`}Zg5+reOT2X<@=SH)#DN_Y+ky1M@lyAA zs_8b13(WAep;p|DoX+AJrGO{ESHL}PK{dq~&jZ##$LX0RDan)&t^rEe`b5`tOkpRU zpvWg@md#q6PF7B`^ElAW7CO*r11!v2dd%gV;8zC_x{eN?gMPPIaE@^5uV=W~3re>8 zB=a;1Bm4O!-3&xS*QH3GLN#%A_=@>n54SK4QE+FD8zEJ2-1mY8BMOvBqY34OMe@Mb zCZqFaooW|5%y>(6rUL^AM__xX4!2cb;Ei7>i456CDA}^w=He=|cVWp&Pv961?oaCk ziNJ-vaa;8Syk6A{(4X5|HwY3O!GU`KY7&&$3ktRhbo}it+&>>Zl(_Ia=o~cet|&$A zvoXJ1Ax%YwS-3HnW?J|bydRF{(sbFo4Nm}PpvqVzkvy<{Ey-U|plRR-b!EfM-`Vif zmiUC_y>)clcm53bD#lSfcV6ZsH`5;ba^O!p%CmW@V+=VvW{AH@4hR05TC&Vb%QR2v74dn z&oAQiJUTB;;DwHYuwD+=4L_WBZmdvavOBw4k{2;6VWq^W?Ps+b9hj~v=3Zh z3AhovJF%3{lh1Q?OO5u@t@HAr1RLp8O{Cm4Zqjm5;8Y-TSad0L@*@kX$6jyr+bUuY zjNYakCZ+b*-NEPPYe)1z&uuM`@YibK^6buOW`ZNrHx7~c8C>E)AiXV0dTG=U0O`+c zr?E;#JIeK%QT#ZZO2)JJU=ic-I~Ryk;fbHYBfW11Z}&FDxHv4xsBU=5+drOqkvLQ) znF6T+lLc-+3UWaMjVb~S$OCE#Kz{+CQzX~RFx-+ifM+Vg7@|7b14vLBoKnvtlut=i z%z24i0EM2aX?%V-d*x#$?#f zKv%UT+83dZZ-j97W+wwfl61WLg9CH^%_>)ZS?Gp+ZNW&ZFBJEKnV zfd5Nyv@Kub0cZB`AdWwlKMqAe9^z&Oi2)5i87ZWnunMgIZ43V&_LX=M$Uh22Jf0Md z!BVWl2MCT!V3Z-)*-V?e{P|I-mW!PooWgr`?)^Ck(SpgcQpAPvQ4nbSX>eLVpoHsG zs3@zRo(t~>9k`9je5jFeE(EW0|@fNboAF&@CLfD2BA##BZIC}7G|9;Af-?_j{!>)Yg z53=K7r^|F|!p;hCDNgT&azDS;dXlA~luyRQ(mkHyv9srJ`qN=WV{mfV_7e^;n}~&4qPCGF}duZ?2k>C%V9j!*X3n|_34Jm z@>g*=Ew-nb1=LBl0xpz|v}x&)jOP;miIk)n4n@9J@G3KbNx zJRAD=$#XE=pnGW2t5}1vk?}&@jk#rga7cqFJCz}Ay0@<95>k;1(sKL=SzHrj*E|h9 ztRZ>e-8{>Dv_)^fEct?_r=+B~kj9>mA#Ujd)$#W}G(Q@+xSF>fV6W4c6ftQ%ada?m z;K=E3hT)6z;NO)V*oou}JSelXwjj&vIGm3KUjo+)=#m6OUX>BR;hZ>71j;6m;zAe% z8n@0n97Ig(!1tDboyvZG;r71I2T8_H+M$kN(zO7NOC&wR@(FTP?5-H%b&%w^%^OPs zegcmEMKbycp4(|u-lksDjpwfN6vMdLcADGw#BRaqyFr|B{L)XLkY1Z_n$H3T$o1~Z zPT}*!8kr;W5j{mF{uUQ-jm5?yoZ+vvsPRJO4>PU#_2OQHokaD`QgxqLkCzTIk#~d z+dXA{Xc^E&S%~4k+d!f9a4Ixzw0mwZkMh9}p3>v~{zt4U1pn?YAzb$zn7oqRf-$yg zK9Yh?S7?~?G)sGSaiz}a@lgF*9e4mB6Ipb9A>6VM3 z`t!=iNMF|4Y(ulcPE6UIjPBZCwm3>0@E z^-HRRUOJL$iAt2z#wr)I{U2N{GEpz!b(zTEwCFzN_{{`!5YA(z^t{v~e?;v>MpDDH zdi!>fB?2Q6^+o`y7djFe9CZz0blAqMV2EjQ%r{X{39F8!z%h17UG}yliz!mY_G^Nq zUpifH#Rhw4vBhp82)q=GNh?5-awRAcj@cD0>vrHU*&mGU+bdPBGkU=OBU!p?A+IT& z&MXMV#63r_#o#S+plnN4;EGdzm<6P1Q4)-?QtOGMA@KNVl^(xOBbynuf?VqKJzXq8 z2|fP#WwOxL))sLa3d-{g9t;f*lg7wqh%tYeY!g#adBy0&snx5j5?DJ;*>Y~qy1Z{E zSu5H`9@QTNh`qN_moGH$*m^@WSOAYA~tRJ_cQJ07Ar{UoE;(R#2*JFDg5_ zYV^k`oLD~v8ysbFk`@}pjFbc{Z2vhBz>`%J`VES_<#uLnS0u6Bx8BN{0@v1kp@WI} z%MmX`-l6C1#IvL1fKuI|s|T2st&VI^+&6g~)3Uib-Pl13Y=?vb#!2wr5G>!t;|9*n8fGW z)`*u4p_{C^awqMmC1{C1KO{Jy2dQ)e6&|;hP$Jzur)`0Fea_A}D?`?poLHmA0ZuK{ zS6V;H;KV#67{h*=Vs|h08fGNJlWbzaYypttrqG}Z3$tq+M)c*LebGZyvSmrnk=aP{ zR)fgiIOYa|b?>a&b5(2H4HtAs+XxTcrYTx1-L-nlcK#HzPyiQ!T1gF1#yD<`(&PI+ z`p;6A9EH8R=TXHNzk?tfUpA*hk1UNhC!EVSDJK)?!}GwivNuuZB6^y_IO~v_@M}7! zGbw}AskJm!3}kWQgEJX0W8x&)5X|<9&gspmdMgVH+`ac2bgIq0QkTc9$r&D^eK#Ds zOdy^Tol5qK0gc0L!6Ss%^-OW`#Jb?_eH9i$b`Zdlktya6_j>~R82M4o;o_k# zIYyUHx%)+67Gk`KOcp*9g|6MBEsSI#*oB@Jm6)O2-J^X95q(}lwiHN4p}B>tw_W1Y zo+l+D`WKU3cA9!q;V8Q|Z^2W?$&gE)n|H&(uo28zPf-|G1}tFk=PnkFsqFjcZip$_ z+ALGk6H5+x@CVL30u@>Tu0JO;w;(1s82nDy5`?xef(1ths+e5ic8ah10po__E7r3jXI8 zt!^D;--upafmkBu~3KIp4L-~=2 zaqLO5SjGmZ`vIJv^3#>)*z$rQOyNuZ@+KESe> zu!r+J6@j9ZJZ%z~aUXoZPExpN2}zs)LkRJ<;S-dOZo*%QCtDTtWuZHA6Lg23V2Hm$ z$Qevcl>XE3qr)LSCM)A9`^PcxAaJV?lYoU}z$ro0qUS3|I z=cuE_Q!m$Am%EWSF7Hepu)-dBrDu@cxP{I5Zp9H={1q~hl5-0Ent*6YLdty#0)ist zSBi?Rz)Og6$#S|wFQjRHe&PG}*Fh=M^P(&W?LZ|3(Mw?hDWQv%=@5Qzh;*zBD?GM?Bn}L zQBkigjbxK)_c}FsA?U|(QjdZ+@*t)7cDpj$8CNp^xNw5~laVK|v5Q zt)C!H`v4Mq9%g<%;XGn|t(d=W_QPy(8RVvm~iXAt8!^6gW?ep|F3 z7I4BMc0h?LH>KGN<7CxCo|wz%wnF6FhM>qupQAKBHL#m>P86z zoOS6a3Y-MH+Vkg|{si%gJdeRgmlq^mRjqz-Xz{l#h`hNq6>dkj29VT+Jn=Botpm0o zKDb7YTzW1$=weBa+u<3x87Cy^@Ol0n5&HJi3%{-}NP>|8FkZc8LsW|1XLDIm5RNTI zgXsPITG8SK*>IYGtT6L|s(D7_QvLJYfQJO2=iZ-rrRx?`lQ+9w6$N3Y?hKjw-9Vo2 z2$0>3%s&=0;-~Q7#?ceh5JxI;W;W3ww_6Gr`+aP?RXg&yiTd671GY0_EjsIpI#Ko6 z8LrkXU3c3n=est(S3>X{?7zaOZZZCW;DUCtS`}VAi6jrI$08$lK9mlRGA!-PQ?B#Q))W*6?` z5awaQT>bp|3r5eOeo92ulHvN3U1vFQ{Joo)5hW>)h51S{!CW;%cm5qI4XlDK;nmq6 zM2d%nV@R%^qK$zP@-@`*?0eS%N64jcUv-?{SyfXdrD>DYYTzd%X`!Lmu|ErP zY%Q93?>#QgVQg}9^c51C1^=KLDRg)2A3i)ASXGO`nJz8W&P^r%tw-fk-`RN2V|`P- z9dhN3Ysy!=?Dwo>1&oCq`U3Ttq%Omp^z|o?%%-N68DIHxJr<1ie-~uYM039HdBYx1 zkASGuvvLjZarpEBVU>4l%H8+E{~R2S=7wRwXn+LE`^jDYOG~BK-uGEPn)ppS$4$Cg zk+@Esnl6y}Se8l2JMC;Czt%&UxOdshDt0>AZqkmEi!f5W@nl`V{VpZ`PaJB0tp#v4 zI?Z^$PhmuR@^JqiXxzMaS6TDd6DmXZ)2Ymzcg5?cEE+dtbj*yYEJ!z)7|Ge5HRPCISthc(~Ad{5ik2`4$EZ+(rFda)dG5OGOli@2Y;%*=$MHnpqpA81CNpFHj0#(?HWzwDEZKV%<}apU zR3H^(uNT>#HCdKSslgFM$s*3sX1eKHPZBGQ$5$gWX;!S1kM zx#U}4Q?s$dE!O@WS?nY6-r4JCIqWNxa#ZX)Ry8C?t86>YqBU^yWm4j9(!xc}-g?EZ z(es%ba0qdUaULgpxm?^Fn%-|todbsHNVrfw^dQW+vf5dX5lQW~le;z1rQ~cjb+z3L z^$%S$CM4#Sa>DIaV<#jik{&b-n5NiwtlRp~9%uiGE|6|vsrFf(Z#06!m8T$74D|jauQz- znqj?f6;{3yyXeEMs`C6ohgW0Wt5%hU4x`?>@x<8zYIHYjsU@1miJ8ZVSG~;v;z&j( zHmf7L6YImd9HN?8ms#Ca>*aeVc?I5O)r<94`LbL9qPbsxBCjdPVdRMzeKgy$1w-OQ z=VPORTQMz`>uaBu7XCh79>EO?)qmEKG)s~)@7+FsWeGBSUH1=9G1%nY%_?#*S!Xae zNL2aMrE<-FJtn&X5-(tESd=?oK??6>=wQQ#xw+Vk+hg-|-_B!d= zi%{^6V@s<~)}Z2BR0XL1);_;;!PJu`VA;2#J>vaNck_vXcKwetk2(3Pu9fgIzwQf&>d1?XAgMz z&F_*V46p5?>~{PZm6GRxs+V2Fe2{_JV-v5RCrh~6&n&)+lWVTUw{Ej4G$|k2v9Hnv z9i;u4$aVw9^J!J@CjG^F*8!xe_Y37u!o^SQ1@)VhxpP^UzT_k+q8|uqenIuG8l=NV zqV8t7oNlVll1D_QhufQmil`||`oW62QodNrj7D9F-Qtmqo6DGLVvea7@^2XAM>LtkNEc6}*mAesWV( z7*cURTf(zwXuqr3Xt6nC7c;Q+iyN!8m9i3VUJlo0CnUv{mjKJpE3x6nwpq=kyJ^d> z%WZ8{UsP1!e+r2WzQuEml2DRIQar@L7< z#a(k-H0r)uG43sn8y2j$6UttYb2Qj=Hgmu@Pj@Wyl-ErnBc*p`0GNa@OJ!X6-_x^FzS7Ye{Po5M0-5X1w~}a$>F9HLxY{FT{^-HY7~dM2KP#C_iFfZlb)juKCNraP7rpsiJ=vFwB~zNEW;?{*`CWX= zsM4>iDDkYKr&{H8rM%*=O;6h0KJj8TQc8vc{35zB27zqP6uljUy`IpNrn{<`%F(3Q zQ}*yTrBgWF@SzTM)(K1V;gV?B>7OyjRCTQ*CNoJ(=}N$r>k_WN&2yc-DDEvPTL0Nz zk!jfXRYMgm%~$aA&N^4B1iR`NvaSW&lztZd5q)0gqqTg)=Df4jn*O-iuuxpfy3rebLY5@za*ARP0VFThRrdMMVYfEkH)rmw;f{H_loBjwKY z0>I!n>GzLUv&t7%d)|ah+Dj&vXH-k3P{!XC$fT^nn;uu9LRutg^#+c-6j_PGjN}<{ zPjZJEDA>MBT`myFRN-EaWH0EORT6J;-{tJy>f5nGr&S8awNndRf6{e2a|{09;8eU( z($sFsHoy`9iqk8Bh@Kt4=VT{+y)$e5^tsv;SjO zuT_5_$Toh}4-R=mQgu)V+6ghTYkr1Nw0rc06;T>CN2kY4q=T{jDarnh3=6G3j0XId zZN*~PQ;ZAduF@i9yz%+(y?x^joz$ZRQw^tI*%Zi{d8AI3=&K8+wXN*0|7=Akk+2D>>&)khxV}e@NzR{?j7na?M<$L+2 zrZ(=H->d!|%OpI>in)LA#w_jakbEiSzq^C7Osr!E$570eGScE++H5kOHnzP}%Y_qp zZO@j&wLp_syo9}IcKKsD6+&3{Z8aUx9haD|o$!5`FYEYWjm=BVv@*upb3W%bR>gG! z^~NUk-vExhtebzQY&jKZykd)Izz0g+p-o-rtMpYt4SNH4;xLN7IEIC?oW-7kcRmiE z?_q=wgG|t9Ro4sDp5UfOQui_nKhF%g_hu&|d2GPZy3ydO-h&S7<;~b5h9>HPddsve zCkqeJFTX2^neNj%_Z7TN;xV}tk4O-nqljsyK&JD6a689BbE@=FCuue5Vc|J+k&WMp zv9ESVDw=LQSrSPupZ!9El$~eG@d``JDa|=mkv{34YL*zcXJ9Jm6H2Q6$yetdUcD&@ z&d2P`tGN*Fv2Oe9Ww7DTO_xp%9HLRiRDS4#oEuyFjE!?NwkXGIRFMg3*-_~Gk_EfX zODt#I)~~Kmb)hbkWx9)N2tp&SPhF1DTLD3%`g^~j$->*2jRseqZb5x>Grk-Yhx;DR&aCKZ&1E zxhZ_0c$;&diVBn2bJP37=WOzNs=2clX`QENFBj)5?^vn?LHR}Q)=F1lZl!+pf-daq zu1SxTvJy<28BvIt5saA@L{xXY#|~`%teJWbWUY42%rvQc8f#GuaY|RAnKtw}^?_d@ zWF}P2p5NNkXo%S4D`nCW_fWSW1dW==GK0_4>-rl zyZW)o$Z}ad_ zI-F)!aB@J^+LwElYM{uA0e_@tx!w~Y{&MfDwp^&P+M@Sh>%tbK#m!m$174ZC`F<6Z zysBxE+~87M&B}HA^(%{jVPrM`TqEdM&I9K+;flILDfS``i=UR<8KRLrX>Y*oDt->4 zh9qCy7Al<$JRf~Efz|5rnaHSNdxGKJrx8P(IWofac0KbDD;6X#-+m$c`B?&zngq_d zK>dE1)5^`mV#3_6yPhXM^`F@z=}q0jxackwv}0|1bq%Fvt;B%u#~Gjg6OrxLB;bQz zyu^T?*!)w(<5adt)9^3*u%%+yI*EyQF445VgJSDtZNBO0@wL#XHfrZ{*Cn&hlo(uc zTraI}aQ-hb&hzRM!UbyJlKLmb5w2J_*TlRLqO-|0nk1fHS$kG7Jv?-JZFlJ;C2|qC zDkAdKB>SaD9TGaPrwq_fG=Ab)X&(+xwlhlVygmY#uXb?rz>Bb9fD~@kT+HO@Sl8WbMq{5zi zyMRILSr}ePO&W*X!P+8vA~e?rth0vW^PcQkrnz${|HYo5hL!Tqo;UShEilxUW_UYH zI;cW|fk@TNfGCcvve3uzMt@fkx08BH zKB|WYhoe?{KE9@+i>#*1c6Hb{EI`E?e`N9&Z|CJ+TBM7h$H*aB&J+4Sj{kNXgS>m{+iSsb zd9)E}F)lr4-PHe5_4b`Ki_O-7Ez`O2BAB4La;e}uxje$J_QaPD`+i_q2CadooX)R_ zBOoWR9>SXY&~M~8PO&Rbz0WgzOG|#E+fLak9RJ34mh5B@A9d?+J&3Yv(=#B+#J1y`H|_W zX6IvqQ=3!N{824k=3CQ^9CeA#YSNL@bcTG{{59{zj1M!R(H+*0^r(=LyhF3P^;kZ> zBZhKZTkLN&3k|wzF1o*w;1LR6D9!oQmBYD3FUzfW{r==1+ns^LyACn_u|2kT`7<*W z{_en3^i1qY*FBFAy!;V|!PZ4Ly;sWIS#cHe_TrIrK+=&ShB4Hc{^M8hJS@)hVmKw? z?AD_-5KywCYlV;oiIAtJDc7IWQ|g4#D_-eq#hv@|d>dj=3UPD0wP=rO%|Rskkc7jo zJu(zc-jw|FH0DxvjU^__hG~b6jmoA)vb%6yQ-q9d!xbDdtIydNch#fb@QFpgYjn^i z3J3_F&wSE)%SA72@~P48h>I_wWa=qMmdKQ^Pwe2mqy*exW>VZ&p(c^1j|T16FZasSw6O6d;kE7QZ{If>p8V>IT6rbFUqIyI$I zXb^*pv!zkL&Kd?nRCdKz-GD)gPf}HB$K4_@rKyLdh568giF7G4LjQstVOrWJi4c=E zI6D-=G|9BtejEIUxZPg+c1?~OOUSbFP@HK^`>bfh6DDJ?E7Rd`+-Xx zpP@J7!m&Us&@|0w0taQNu)qyb4fAdOt+wm{ z293-$90uFlV_T?d9*QK6kWxhq?C&6O8rht17P)k7N(#5E1#W)T42jz_i@C1my4JLD zYsse0NG2O|=20VhjjOdT+h|fLayK0@485mra9A(i`qnA=u%WDOJzCaJdJ>bq=hF7N z9G+xC69KA?d6nWgzlVdu>*4wL52-u*4Yn$QKui8cznJXhH~z=I4zVK)LWpV#!$(D( zDjE4VI-6PVxmkZaanv?-<@gG?J=pB!TsBWLl@yKo;gg@%w#1)ztIkk9GVuQJ=5%HIqR{F(yk4xC$et{?PD zCj?I0;&_5RfSH^-Vt^3JFP;OA#}(EwjB4L|Ume)lVzNtHG^~>X5n^d%k@7gp*(iwd z$YWdbjytuq)l=W*QBUGr#M3FF*O!p=oibWO@i0aG)+CrlwfF_{G~t!uuPoaI)2hJ~ z-bNjOx%xsX&sW7>wc2%anp`d-nGi|irWVv|-{@#)?=pQTkXd;*%ONo?m6!2Tng98x zgu&^`(|sLb5*jUM7OMsz#JJX%f#CP4F`f^fIxv2xO}yqIr4y*|eGK-cQA)SrKyIN9 z>lcfE=*;i5l`Um8*y?%N$XaEAN&hsgSZpz6e+U0YC+p8U-lQX%XI0v@zC9XD2xIMgsOwr1Pp>meGns5Vij)uV9e z?6~^WTNWW2q(ZG}2Y4UMa$ED;Yz{6|A;O2({7Rb^4$q&&;9{;4QN%-q8kg03fSEg+0Ik4aveqqB$yn1M zx#o+0BQKTrBjRDQpBz$dOE*Yec`(28!{R{uXs}@lOC{>p8lA5}Hy=_Wq;5h??#nU} z{J8!W=*E2ZKvTY5DZeVbxWyNGDBAJD9#$lmVpmYk%adGvuoZ-UWV>vdq!cmfrhvuK z&`QKZb;S>elE?POWwDQ!$x=4&7Vwj%=h5!CG+LYL&dh_Vw?tznPG`IaN0N7c{r+KU z6}6kU)?`HhSBv@xjw?to&9yR;kiDXCGO|5Xg5}a{zwslV+mHp|iE@EVAJfSbJ|j3# zv=I`n@bTnFWsmTMQxhp|r)pw%I;FEh3SigU`IE&|tcb_)rW`dh?d6b5hx)LIvcrr_ z5&94A%>rT&o7)UGK$Fhmi;mEw2KrP30>ZwKR9Isnd#Db>*Wc%Np3RS93zkAh%aa|n zERS$TT|KN3c4s-O^ugg6z${$=55`Q5{`1M;^rBrFi&P6war-J66FrxYWKSm=w&!J4zGmKdMR>yu6)e zv{Op~gG;-H6(6S8vrOHqfG}N~8n9i<-1Fv~=cagHiFFr0x%}(fV75+1#7SRS#hK;urxt}Hh7&K= zKHX`5Kx^%NyGf_TUJh#z*=}`gv|uVPwat3*#KIziclS(z+)g5;94oWDHQNk@wy-cb zVMhg%h7~Q|?x8?l&+p`)7P{1v?e*)|gbH~jiLplE4pd*AU}puQj>t0X!;I_?i~_}6 z8={70%Z)5$7|)wQs@dv&YTU<#(|s2&yP2?HaJ&aExE4yLQW0+6&0=&hl?*z3sAI6= zBaiYzi$dYKDJ}~emP@_1oQf7HXsl{wBfzBUJy4-Ve^V(c|32+Bc13Y`)U~SbcZf3^ z2F}e2rmXY5onAta~5>^)CEzwfP>be)f{pBo+uh`LfE@08*JKl*G%M zRq{KL7Ds2dp@>RX`N7dF?z=Bq?nxCBgLcIXJu?W}QqO=;1||l}dbDl7WoPeeQ-QF0@MC)d>D`$P2Hu zErH5N?6o^nJ3zP&-NCw8PP&GcjwW<%rK#x~P3Y}hjtT^%t;s&&r)lxIofEffwn~vzw|c;L#)k{cebMafbAf4&<qu{<*gaaqbvIY5M}EqlvHOuxE<1 zMapgEI^Tx_?H|0eS0hR*U@(nO&M85sZc0dQ!iml((K>bPIDo-%6_JjLHR6}KBL`_t zKAJt4#yf&vK3|gq`+nfUuaqtA5^uNRwuJ`s3#R$LNv)+v(q+J`O8gO!+>o-$^raj? zUo!KfDama@8Y5?>j~EV)&C<$gdR>T}nWq6i6F&nH8OP=+g{#MZsw`R->uk?^y$yU!^sT_5T$FPUp>5oSPA}dJP^nHIndBp1kXg8 zI8LpcCfpmdIWc@fIt%i+mWQ)CEI@EfnfhgrTw}{GCO7VJR$&plyO=MbFSCffM=c%7 zgr_cUw~9(|<}$MRIw`)c-MK)G;7mJ1jUuQ&^k_o8{jauDh0> zrr72QS;XI|5vQDIJGYeaG#wupeql*R=Uy`O|7iLOu&BE4>kB9$-JK$#2#hq+2pFU& zq2!dJ1&CAiUj%=?DwdFMRf7ISGkA~o;rH)e;45~`V=bvy z9myO&$YG8n6`^wRpC|P+KfkfC*KwU7?1q5vLnOg`q_AcHGCZ) z>MA(%h0w>ttnXO!sm=`-7DGdNiAg^#gDMk%Zv0xOwd7^-Hd&$qf^agv3Y}89m?(>D^dlj)SC{YTy}At52_Ezo`5%0zt_-HN;U%yN)x;b?Dm6nMBL1E~ zl!-AG{Tg5gMUHOI02LAO1JsdnC3ZN#b1#zf%^-iP9zLRp)sk|M&oZ80UIlUuAxdrL~+7B)1l(Il+7QkeF_D-vbe`7XQKUcBT|4r;P^G zP||OR?$ER?wWCUjC@g5T;>HsK1in>Osb!^iVxv2ZD3*+Tbqo6z$Y;k6vQvqW2QeIX z%LEm_Wo>;l{5Ap#rwX?`^e5$y3~0CIREuHNGJ%`=Z?&Fi!jg=0r9sAF9H(&uOs`e4 z8hW?O@DwaXZKgo{ui9@lqC^is6_%P z!5^CA=y$kGI}r+n>0mAkI2Pyw^6R}jgrydsJ;cIx13|Vs=A#ROvMB~X8zb98`Q^2; zI&%(iPOfB}hf6*eC)*9Bf?sb3${zp6%-(hsRY5Z#@U!3sXbD*;73{A{KOuB zwR7vh#kiSxLsCRF=%5*cmz@u8``o|UmL3%~rCv@0%7m&SqciO^!H9#tmCMy{f>6Jb z`*4s$Gslv2{rQj>AyPv=;e;RRSKC$$c3HP_!GlOzml$ArP2cd^I3i4LC>6|bSb0gK zK@R;>elvz#h5E1w_$Al;KcG|RD80AX%ho!;LFQ~@*G&dBm`F-V@}pRz^Gnxkh+ddT zzL}_L--6@Wz77yqC_jgY8m9VZ9)SO=>S}-uR6>i|x0ww$?s+Nex*$RT{mJw#lT6Fe z7#{-gV&-1u***X0ejyFhY;<~5XmV(nJjO5W&p8ywfV+n2``!~b*O29?2vw;}oCm)l z3T0;h%S_Nhmo=_@8F^5FCH-QX``RecIO0QB&`}YXfP$bDSM^wsv#5UQGa!}R(r9PO ziZ5ybu^m{E3XZe=yOSSe(om5m9Uh(qUdA3P7467?8-qBLBMg@{-wZQb+?08yNUxb8 zBy$B+$6K3vraUHTS(S&+WPwWf;$hQtb9oii0~*}Liq}m(s#3fjnx+E9A@bB8n=JBR zgJ=dkKG*UKGc+*3;I6qb`d`byT1W5#J8z*q=&SYMt}zi?I4?Y*hWeO;bSBP!tQI#C zTd}U?5~{?Yan%as4O4e>xiWyZPd^f1^65lTJlPej%A|~P8)V5kkdtnbldI?*Vu)&2 zV=mSeeeulxJ8oN&O3Hg-m!kw85^X!hT2p|ggfCfKV`iH_^g>_KZnCDjTs#6K3Q1U^ z|C@6McPn8ELGUg{m*0=a$;vrkgHCkc_FCYJ^2bpZnx{E4HU+_yajjk)4EfEN4i0=Z zI_kY+U}T6`u)1cexVwifg3ayv+G|)@YX%oV?@-ZS>pFvUL}*2{%No!4J1ATJ8v`4} z6dBC7JbZ;3}c$qX}Dx$`09URS>Qz}5-oEBc?muB`7bieqF!BPbzc5qQrA({`-g zIjxanTFB-e=Q}b7FCmYxa+7+%tK$e&UM_HePBh9D-Q*SeA#tAA>StgLm^5fpDrlrJ zX$Zo{N@^?&3GS?vKSYJECS`#^sumBYNI=N@4cLsKesy%aD2!u{Tt^bDavPBcTxFZ>*P?J+G>8H|X;%i#;I}w)` zhD;XE0#&3=P}wlo#2DEY*>J=koC>BEnjB$PHy6f%W2IQB11%aE?{8yG@P{@+8!VxtGZ}nA<(vU__`K(LYmA*! zzcvb$8fpZ!G)yQC~N4U+Gt4gc-Zy)DOyZsG-Qe39JxS-*Z z6e3pBD<))eE)bLRT%)oq?==quU|tAzQS`RZ4geWLNwo$%qnV zeMAg<*M7unbUovH{c!6sOCV6uCOxfn2rNWBt}UyPI$pil0>L|+DQ29jbCo2}R^ZNn z$m6|54_m^FR=3Cyd9(f!$U?( z6DJx*Hzd=V;9?0e7V z4BBs>n@B*XT)OpVMqlN1l?NK?8xM$PtUnO{B;_{Z1Md$vU$tJRXab^`3oD@C&vXcu zjC)K8SFc^%J#$uZly#i9qA>x~du{ncAKZF&&QoeTkTlLl`AsrtrSdI1+~F`<`EjZU zm8NizmS&rgKrxctM~t+Wk>75|Y(BU060l9KxW2Q}Z-O`21ku}a!W4lN0AH-}mx>uF1TWjY_T^Hpwk`KY5a(7D~g=)4!rFB{97 zWIa4zs6JP^GKm4->2Zz(B1pe#hCE@vOuZ4uOnhPx<1 zkJ7&pOR)yokx-)Y3_MyF$cY?G-shLLUoiBrc8Nm(ZR_T>gGpwrVOb9`bQw1{P0j0y zfbA*gn)W;4KgAK?s0=GnknvFwa~k=?0d#nFm4Ga*Q%L0gMzbt~j@>K6ts)obEoHNuwr=G`?aHd$kcXRjBA^1k)X0hjm9qYS+;Fu0H|0l0(Hlxr6N-T~b5 zQ=mr4Rhhfn$GL++Z%Cp0U5|H#1+@N-S4Of&=)()Rj>#*#PUmUT-?Mn+t(Rip{^-MZ zZbP^m-PcEGv&gBd)S8OY|J5);K?ffDcVOH^k(>xPJ>U_0?AD_0w(vO=&68Dy71Ei< z07G_%MDj^SdwM|SD%*|MNeKI-9|lmi5Uy)Z(L*Nr`K7wOU;oo&{gd01eOeI>QVsOeBBubg?)gM?G7oB)ARxKQ|I_v+Qm7G*qXg&uofYQ9;UH%u zxaIbX4wJu|g+t-t6a5MiK+FD2{sqKUwQ6d=y!yZONKnm>aUel1-?-{0%GH1UYU?us z$nNW(u|T`m7VGm@zhG~MxURk!n69CMw&2XRm0M;QZ52e;s#KdJ8uz`JM{S;B@h*WC zY;FR@L0Y9=)~Hlz1bWC(jfRj(&L~2G32v8VU|_U!qv8I|FG>ve?7pdg3j_Aw9ist0 z1;XJ{#J!7O!Rq|hnV);{I&4jvusrF=Ah-|)rKI0~@FK2ofh6@M7o^P?GFJIAuD4Fi zvAOnNt4jKw3fz%%W1T>4K}4*L=t;4-Hjqe(4TkQ{C#fBOcu1`dyIDxg^=fZ^VF znub8#7d~|b%L1cHIPl|Q@?8+jOj+ifij9tCS*$x*fM*K0z>lTl_aQ}ZgP(4WJ6y&- z1iQcvst%uv0#HP>_vrrv4Vg zIfvki?z`gM@Et1U9h9ITCcwK!VVR`n8@Kan8geWPXt#x!h(hBF?uL zjMOmm-AS+~ov;8cn8Q4w60--Uk#}z}vfU$;O!(g1&lZ-4=)JnpC|I`LPga!S2IK+3 ztkD}p$0B8+sFa|Ym(XV)qqoVyK&6xHiW>4A9C-FI(_MdFK-?grbPkX$`p^xk_nkAfjKR-(A)<$)|1O94-5 zT_}HE`MI~Mrc`p+k(XKTSi+#0QL1IW^2ZWW0oV2vcQI#6a9-&y>XhW7fXWP z6%;ZtLBXSR7alyrsvGlFo<_*OJ#p2W-9h>iG{`}wS>nfa*^UV$d-EMP9KB<^AxL(= z64~ViWoDbIN`X)KYk)9Iq5T8KH#kgv|GdpRwS^$IIi7>Tqp@7!4;OQ|7ycP+`rPSa z-fkyE=EI)!hrO}76SUtI2$|}h@?S3K6D;&z+WR52LOG+lo&8SW@^6hsGDyL2k6M{Y z?9U}XDv0U%wA^#ZB(mV+J;LAWE@6Ti7N?KizuVpM8vr=ORYVE|=czOrl!ZUc3bse|9@!c)+$ zt0!`7wlw?ZAf;nXuQdI`w(^XWf8v6cg)Rnc{RCR0Ak|fhfj1;uAN?)9^`{!M##^rYr2O{z-Y_z}sB zl01n~io_mu!fU2#H-U>b-KGoI?Y~23)dxU8f#21tjA_da#-lCIpP{<9MY_9l0F-E%0b>Xb z1egdL-G91v?~p^~e8H0;rwD~jH!bXcqV;nV0A#H|J>7{-HNor)W=-I|501YzHV7bG z_X1J@9=$yG(1Oz+(JWNbp7j9$Cc8J3CI5ozVw=DmGWuc5XHyY_}}jyyu*vGZ3A&;m6P3$`h~gKGDTEau$w55q`VAL&l0f0 z9~waz^%S0{c!4FzX>D!39T-_UdE}V1dS2~+JO$oBaxt<0TIj%VO~Xu{o}|&Ma4NbE zJf*e6{U71ybaix(lqz;cow@0oeH>)l zPoYBFN6~cmc14e*^8VGw_tLTSKdm>t$Dbyf-YrhPF;dqR!~<35xzxYZulhNY@H^Gl zomcO8d?IX0)a@tlFus9oxNBniMte?t|GReoXg@Y{H6`zPi5YYj=m)(we=%8aIy% zI_=?cnajD9Sfq?K0AF8VRpGC`<$~J|+^az-e#ptq4DM1rk#ap-+k1TozlB+;u6O$M za2f`s(Zek@3^>^6@BYr4aD@EJxmP4*9v35sAdwEG`C7$wiQu?qfHs~@eSt-6l^EpF z7?YfNFk)_Ys{#i)?4Z7AZ{NKqBxw!WhR7M5axng&S^3=3h5!n2H@QdyCT-Rt6Yeg1 zcXcMci{@tzAk28ySZG!3xhIcB$f)cXvkfrl^Ca8KJ8RTkU#y?OpCSK z=wsYgiVk_)?;|hyan|*Uhk8oKy>4V$Gijl~-YDavdEAm=?IAijLNLSa z{yD(*E)O{`?zphX-w;}GWWsI}K;)4X%*)d?oA$ZeoBqA*QwW8$@uv#qSXomExmOHx zD=o@u!AFl}Yh;r>Q-E>Q@!v^7$%`73$b+7(w4jL^{(PSWpM%S!$8^#=Zzd-E(|b+T zjJ+&}GYaS^O5-YHr1k^O465sN#O0>j>7VRYy#u2z*SgA>2I8f39#1tMU{|UG9EbxM z*n7Cz_;O>h&z*d2b&_G1QM`_oha86)comS?UPWy}UB%;~l5b1|xFi2E%EBt*6{Y${Xx6W{m8}rb~x~vkBZ8*Q< zQpjyJ%a56En(|r6QwL8(+J{}{&l}Ru5xfTnYq5K;bBqcYH&z9~?dk3v6TFkD7>;>T zpO~5$5XA2TA*I$L%o+->f1%)m8g6cIM>RTioL2hxj!z*d&dRuw6bnEMvjo1JFR9<~P?97~@JHdMYAx(_-kbs07^Oasm zB?Y4s@CNgF9g^0ikLmM^)$wwLS59|H7DU75>W>OrD)e#pP8g#DH(YSnqr7bzv<)}4 zg*z$7#^YA&lP17S1tj1k(=gs)v@|+jF{Zm9PV5wa;f)hjFSFDhIrrVH(z+YS$8S_ zT>e)Od&sHqFuy`N-m7-9#)e!_fmN(?DT^U#9>B_c#goF*OEO>E>O2Kf%+2`k@5B}>wxjOLn0G#~d;<2CB z{>KlXy*X(nHzY$=W*h%H_^WU6AWMdqt`9u3AdnVfdaNY9^b-G&p)I2DIxgdrg6pRp z0qI}aRr(+6i@Qq>)72=Bit>e&7&Y8;Hy-J>ht&q>Ff0(~&+8+{t$>5Q&mM9v`pYKn z2eb9F5#SBTv!AiwcnQ8xK6mtE!qZks>apML|5i;*JMW1^&-v%4PLsG>gAty=gWr{I z^QY9lZE+G_V;PG|5c`%sLt96_P_WadovPyQ9=CSi74GX<`|*e-v5Zd?uqEzRzpbqV zO*cQ(?dob0r1Glf8ar|48xt95Ren!|09n)4`25>(xDPju^;~d6!s6Oj?4g%S?l#Yc zL~s>W_DV;^l)PUZ#isfam+$wG{Tfgpg`&BEo_=v9me;!(wOj&03hw>4w~ePz+uGew zKEuCPJOgqrEG7!CaPE6Lzz|)`4VIJ&qRT0=y}8vd)_utI%H>*S+T7{c5fP?WRNEPb ztJR-J<7`5bXA#&*ZPkruitPbTZntr~uDL-ou3sAU+5&b1zn>kQpH@-(X5m!?`4tje zJxn9O{^ghDG!P0ESL7s`R_>A82idb;-tmY_w{ZDtD&jbWQF%!V(r;9|{% z!y>^%*jfchiS+3x-QG`=x#X7H6sQGymz9)t_f`@y6c08dq=?fVyJjwLPFj4sF#KB4$X2UU{~q zuS;08R}KbL_za_h+CQiNwM@xnF;?yg;-DMWGCTDPN>X#N_I5!}f~qocnuxzJ|HY+3 zb%t9$ugBrJo9|^^aGzm!vzkefJYv){A?b>TDtzV{%0wy_49wc&ej*>KT99x9-LR*4 z+~K1%`DJ)&g^G`FjwL7+Y`L3kTh7BG(l!G0+lY1MT}3~fhCyIlTeZ6Tx+@6e{q4ND z#-r7M5SKDH+&z&2=aAN17URth!gK$?=yu1l)HvY#Me}Q*2VSJezeT zxpLm0)`naYB!!T9S(H#na%^m{227 zX$cd+Q!-nSRX#M6DhsQFW#gfo8IB5wp#-^9<{+JJb0E3rJ0;jn~^7^%$Jm@G~WJ}G}^3Ci?O zlVmc(K^f<~qg_A4WMdTdCFp&bOMRnB|LYgoPn(IHUIjRxe-&##eN%YdH9EgG-H|X* zx~W8apvl)%X%3r;%E{?So5mvuHk4vqzu16nm>!{Twh{DfK1j;VmV9OVylC4L^a!*K zJI5R7JTDarNUxoIiOS517!`3Vh4nPgn_=N8Y^}N-V(!lK+5n5FccQuuy&P88wsfD= zOfGM6!9a1VDmVu z{F^qw6PA$FyL+=;cS8zVtu>|@PG&os2T^%P885O_xRAo^#aB(((ozz^s2F=I6K`}G>85KUusobgl_EI!WbnisrmIhp7a*PJmlZx!x8-X zX`>)`Q*=MvS1*0Y*@v|`gn3x#5m%oYO9ZLAJDGq zXZJ3`pU%g}OgQ>x2VrOXavc?Q_tgb9%s3b!i-n_6ZhS0xIkuKDWVpE+o2KNxe=pt1 zEXblarXjP$%Y(*7ND#i3Fprh?tZp&YYCoGiAr14h)sZrMhr`XcY4hT&8s>;?4u_4llB@9<7lfZpr zm8_+YoS%|YtJBzLj`|baxRv$xxs+bX8db71H*|`JqwJUUuvXArfK&yC84GX>L?|8m zT%|Hs*BpnlsDN1A&c-IYPXie&O^9hva)3*J%P6LgD?i3NGxBU}JJuSN;am;{tNvYb)8Yzg$i% zau&dYg^)^cusF~dRp1QHpm3iZfXWbrpUyr10)}P5g*-cbSTp(gKX2{WcCRDZq25c- z03&%MSH_%3R$C#*l`KLEb(`gV#aFU-43m8f&w0k_$ZK=je|$EMuBKZ0feoyiyFDO+ zb7v_Q+n(}HIu6ij$c?Byc`ia1!WClgE62qQ_}7Og3|tU&i*^e2CZyw1p;-Hg6fH+l zzrxn_2nh(#IWc%}McSgT$vDt!YO?V3W^prY;V)RHS3UfTJi%aTwMe_D>-^)1rWaD~ zde6klH1y^y+wwZvScfhRI@hFr55PWp?rA%B&3$?w+c*MtYo0aQ{{?fmn7idp+p=7e zkHeLK?TX_2`@fACaziWKTy7{aCkP&?wr{GLt3nS2iElaJ++E5%qCyqg6z6a|l4Tuh zHm)Ng!!b0Q#MLfkOH<8rW!op1u8Ff^e~)?hvntRrIJxIMyssGU4v3k5ahL&gF6BBij2{yLz zKZE1`4hRI`6ezCBga$~xKyUL$5B-!eBT7alCW>83UoOWDq(c9Q1 zIz^K?Lj+xA!l=IbW&%PrO@`y(UU2MDWo}!6mb!@laaKA@>KazNfnSOGNBZG;6uvTt zU_Rf-qE2CXgnr|%veaW?u?iBM$HA1?_I#l;`i_)f0IDw@S%r?$!Voz}T*<4owp9CJ zqMos#udp2R%GNgz3_0klZDghdAoRcyaXoVNcG?TEuiqqh1BhNpSieg-sl_jkHHs0m zTnh6I?9FYA-2THIlYhuEf8Z1$@ra%Y`(qH5(0W$^tyoQj5U^mz@golSwFDPny&l}J z2GPfGk4Hv6+?#)W3{N4Op+}24vBm);e{zo{ApRRU^ha$J32GmGc8dWSv;VX+k#WRr zE%GA`U5oqnTjl9Cs0UW}fu(N^a~;E!Y`C@OhCiy3K<5kjqX;weQKH*)5`QgCZjU24 zVuRW*wKdSX@4M3&TdMTlY=}mMIY=gG{b>zI2Jjz({Eof{{$mGF6uAang3d*&9V!pU zYm+l(Dd4AP_0KI%@I;rNMgq}=oMhRRlJshky?L-`FaG^$79NUyWI}x=gHtv6Z*yBV zs3!<2)Ft>S!WkaUk+Dd)hq=AGq78 zU4L^>-uAEvLk1>@XNnF-rw4yIobIXgR4Ra%8A5K?533L$<@Dm#A5WTYWZ;UOVFL`k&GWT& z0`AsQNN)QR7EG55CRjFe;?aj)271Gq$(#n1ftxK{18mQ7YTdfa+6TclrQH>^to8TB z_oaM^>86R|!P++ooB5A;Yvv_8s86qa>uVQQ$i#rHymrWyki=#=?wP(y!u`6V$fWGs z&iI@^PN98MRPkJT<9;KlRrK8MRdhF^qHHUy_NYDkcfeIu)B)X9bGSsNb+fgXP9#}m zHU$Duy8FE!jEjaT?(GCu2F08bY z75#|#i1#lG@`VoIp}md08L>;El5=to?T{7GIAKb{-GbWDSN1~Ex}dl#U3##s82;V2 zefh5%!9C>JE0Y|Pu5KlvM<`a<6o{MV3uTR_NALdO(P&=~P4ypMhBpUhCh=+$1vJsF zxzdmQk^n)}?llh3gL>sk$3+{GFceqBZ^56B@6)jN`1_drs7zZ-4jTMS8en4FRL{SG z@!^2N8F%?SlYhxyZKyf*xinHCEI3~ao<0}Tc^v-aD0S92_CfA#u?m=V=^{oqL4tmK zp9SN6TcScK;7x%CtK+pd#NV`xJh?aSVbWbR4U<8^nq<`2KKD3mU@u=ao3LEqiT!2f zY|AtgKygmGtUl;I{i&m<_OsWH$DD6=$L5xHLx7E1V{b}5>I=k_Ra}ATE!t@MSR%@|ozmB4K*E^=7ef|cc8zM_wvupkJ2JN_#6Q@Jw zZ-YHpu<8&2F%wns9sI0-8;bn5Efj(rZ{nMOgzlOeCg-Wx3axB~MCTt~L@pJz^g&UlfK=;C+W->JDa(li@J;+}* z0%#FsblQjTsT#L_ ztc?;Yaap%~++V1&LhIr?ra zDN)_1P1rnh(*JXr703EFV$+QeJyfG>76f78{0@??9c54YKn)P}?v(_kH|;h(AU+Da zL&$$7cG3bM2e4Z-(chv9)dzN%{am2oFl%hL4f4;Aj7nYtIilF`1#~}oQU%0^CForrYr(f0&@x1`2O?z-4b;<=%Ud%9T zsQs>){8`D5fq2M!uyKyX?-mfwamBU6$r9471J~cRh+9~#a^=-3! z!Gh>sdO&#K9tCUG=oJXHEBdV=V7^)ruwnI!(1?Eldv29d|Yp5*V$o%=q7$8*IYiV}>{FCQ-^Z9n>D=p|S2EhkDDPYL_Ht{O_ zCa{7)m2$ZH`jvj20e6v01UC8iI5!?ZiAWRKt$s7x^-{oV01SCYl3^&a{4*^M_<7#< zX)oZP0(~KZqD}0lZ}75Cqs#g%b;aG|rAqrul8=w17?ctM+7iYnTb9;4mQaAmRhf^e z6IBbhXE`R78{`7jb3nz-*E$veE|}hFWjwkfNCf!n?;45-krIxaH1PP`Gye9%#a~qO z<)H1uplot~j-!~d%2W>_;No%IZ)2_J;ph;M^owzKagfUtgHlLxkHn5sqY~7q2N^F} z?abAA+X~2h0*><_%43opwZaGg4z((^TBsSJWpYQ&!=Uqgo~_$r1MsF zjDT4WSOctYDp!Z zST;S>R9*axuMRv~L@B=fW@@OD`J+FR9+P)6@n|s&@!htK@Q>C8jy-P+M7#EM**C@V z=f(n7HfjxPMTOTVaWW$DM|vyF&aXBB8z}K8ljBA$ZXdc3sT3~l*f$?i?REP_Z`a47 zXec&+rblh3jVHZ`hkGvE)=u>t=s5!4qwlS#tQT+qJho_}!&(PCwDEo>Unn|A0!7P9 zypsnY#;a{$6J8X3y;I<{~1n&m|x`|#n;xCo#DEY4k$;4 z_bCh8O(9Jge|!bcrP$C-zVFtP-ddW3kig~y13ZqppIigQj5Af;_$gmuT+W0Gjrue$ z%J4`Td~fOZV5d7htpethwhbn@ZDsLZ<9?#R@AgjN&eTrolinGmF1n*NS71H$W=dP5 z=nCZl1#h>GohI=7lR?>PCx_?L26iH7Eb^#IaK}F2xoZ#_zM-BCT>CDVf1T+?*S=D` zw=5)mJ*z0~`JSJlM+P1enavZrGQCUd@X3QIx1&^GkWoS08`6Fp7=P+OC^M%t99P>t zQyD*O##Jrlc7EY{F<7_#rDFt^0ckddFq;UPz`~z_SV(}08PUUq1KM5uf&Es5%YxH? zBDfks|Dr8xCjphv7QV)$F^d3(yE`0T{Qo^~i2olt)_&?V;q~(oIO}{{^?RH_eZMU7 zwf?hc!DV2$!V;JIUnZniBtH?Es5eAxu(yWUo!o|lDVEXcCsd4!IU;TD5zK7xAiGaH zl2eYOU(1!v7}`Q4Z?M0W0)GBpbpjgw$bw)pX0eEjITdX08vQydyQPqWu$FDw1h;eU z77QlCyNehzH?-Cj+CFv#jm9Qmv|}?p8Q8sMQR4TsP}D7Sn8{78^@+ydn}YOB-VhDZ zSS(iOF;`f|fn4BdMU3BQo>4z=Kse;_CG!28-8vCDVZaNDmsZxTmja;-$-kavbm3Tc|GT4xthpEduZrBg3*vcJ zJkWqa`Jxg}#A93x0AC^rUB7S~r70Q8JJEIoEmeLg5_%F;$RXh$^|k5k&GW;L7M+E% zGV!vd-%qXJE7h4%e$=82zDi{H#HbL=MN$@+s@d@5jtS+s(Ew1_J=xf8BBV}wTb6q` z{hYNHOsPE*ExV()(nKjBNv?2r@8ZNgksdrPIDnTW^UTz#j=6{|FnnRqnHlqj8vqX? za$EvPiVfPwh5~#W^xSe1^0k5O{#&82-EgC@3N(L3^vH3`o zw6^6(&M-K2^%os3MsMy6)@pFW^+{HeMHXW95?bnP8RR*Q4H8H@+3R=th7Hw$PB*v5 z3f#OXx2-PV8jkI*#l*Zmcabvu2DH##=?Y62Hv2_0Z>a;S9Ut!HUs_}CVfEOOk`85F z0HA;u?yViY#hXy9)wz69ijH?OO>~9FYU?V z2)#YIUlEu`1hxC>S)<{!8|8w5&N==*Ot=y7eeB1RYsj1;8{b+70V&d~*W+Z4BU`rh z7OBo#(0GPjNHVwR@gCV9B^sEP4Lbza$k&#YNQtf-;lKplBLyv53^u46SXf}$L0;E` z8+kcw*TY{@r=#~c_*w*}l|WnyNS?TQ8+w^EJPQ%(!QSq*YkTxGs~gD^jy&XGkE2p? znj5?jYJ2TzZ}Q2TdveTAO`}-WU!jBfmz-pI%YymKl*~b$$w~tCxwWP2&DjfJs}yhT z+y8tjk)Z1}w1BAuk|R>&)m$O?n{$O10c$l}Q&u*vt4>=zJMnS%zbESSP#V7uvu~8Z zATU$^eh_s9*%f-)%p9pDNBa#DdcZYQ4H%j);^}zw(Fet_s3=cwkisccC_qDNK)-|7 z5_%blnnh^(h;zf~tw$U?o2@xUpSZ=D-MNp{H|E88zU>sYN(91E4Qub7(dGUcRxfeagRC4DNU4_r z7P<;cw2!LT*it%6!<+1>fC?JNB6bdM9}xgh&Si~6tX*mT71|^%ZT`waq;@oZzzsb_ zPm32m;U88?3)=PpUL$qemf@d??p`1a0aY-93_iUIXa?ZBpm(c9@}))>#!#(l0M3o8 zCxGbbGATAQB`n;S*tv=Y3n-Ju zdamLlu!K~QCd35iI2*S-K|g1r(#AQ0zBw2i*~+np19KL^oOq2L*NU8#m)52k0Y5H9 zmQdd}Q-s0SUnV^z1q#FSju#iWL4}S#h_FFVRq(J>N8ZOfHXAidAQUMtji%MD z$1@l&P+lno(9^D=`>AdmRm(%kGxOdd2GKVmF=2zstSKLayA?fvZwKH^!FDE6SGdd4 zGc9kulw0cqu{iaO0OFy|q7@yBV~8x` z>2+(fn35vl_TR1bXF(e_Fr@yMF>uxtAkCbH;8yrM1y~`uV~1gasr^10fdXp{!hjtFOL(3rPDF8Xo@PX{>#{*bgcsZ_v) zZC5tmiUmpB;UFhcHkI3hJAx~!4VYd&__g3=3YFfkA+v$4_nf4)2;u6Tj-F%eN8o#H zRTIqP&af9Wyz~D@jMhQ=~3vm(?$CIJz`!lIC`P==9(?vNS6dy zJQJwTwIXdn1ju_I$3@Xw2Yp7HY82=IGrl>0lgY^a;vTAJSIdajlFGEsK&mOvEoZ^U z(lhS9Dve9ExvAhWxAO9cWz{R05B=6a?4x$8nDbeR{_vh^$iVogBE%{ zFVf5!D3A2y+L8cTF>#DI7s;_?<|h(wZgUbK$s*g9C94;2MtF@2^OKd!;(BqD@u!4- zKs}f>`}>XeNi_WQD$__E0;DoX3C(xL&yV>l==nPaAdv&QLk@sBEgOi48lzA%9hz0f z33(_pr(0TTaGSe$qtiqjCDfAd(RbbhlX+wThSRcqQ`AJf{OY~N{sfYd2l+7(QY z$i7;-ABiGNB$rd$#MABer-?ewFMiB~1vmXV#ScFEkoAfJjqvXbtq0ZAznVM14%8*> zsd(XkNC~=?$HIION-9e~W>*WZ>jA+Sq%Eh=)-eju+1lD|bbRj@0RW8lON4Yxt@wS2 z{8!{$P>oHq%G3wswgxEVs3@=r|K^JXq} zLlj6350CXv3W~cuVLcXW?GhlITY3&8IGFuhAqXq^m=)6+C@uQncKYakVf&fQIe3m( zd%{&I3Xk3EIJIv;hfN7mKc53=2|#{coV$tUr1$VX6#Hb-dpUh$mFn*k3jT{~^rqZ~4FI7_K~lxgv%5QjE%=5TP-3O4?ZvRq+0RFd&jF|u##9&}yv8}7?fH$x zd(LAB0T8+^r4NZ)Y){UPGE{&u8Dv{jUn3S38wJq9LQF_k5Jw8l+_NhO3HpJ8@?a># z|3I~%XAi{YK~$M12rx74vx~XQU0V;CP%qGoxPRCiRL7sw5r%-i$(+qR;V*y>|-dnksXPf;nSqVpA#;H$8RbDFN7Md9%<-DDEvG zF<7!{Vu-BDj`8`@h9w0q^LZ!=xJ=AdU=qaCFCHH|x#8CNMa3_cb1UgUkLRV{0GaF0 zPmm6Sb3oj5jl;r#kNnq^0RYa-Wx7Rz&h%v-aK8%l)K(E{l9sW3?Ls`?t$--4bKT); z?|%$25Ym0O)E104rnP^DV#Z{2UHt($9FP2x&?em7$N}E_(-nNb8Boc;Q;7*N`9c6z zzmno?4+5N)hq7M7z%1i|l@2`R^tc~%BJOiXrna4S(8GGZT}(m!1e(ESm)yBn4M%wr ztr>`?Kj^e7#q32{y$VHUSZ-)AIF#sh4M@SQN-r*o9d^)tXDvAQ?6durnPt4E8x(5< zyk_Ne?>bs#P_S1e)~DoVt-P|JiqRZbSAnTzRN4&)<)*YBwm2V`q z$++%Sg7AD_SkK4RYQtCxsQp2OWXh~LG{Xt^AU8<7%_-y2o;r6Xerr1?Cf5jft0s@Ia>OFB_dpZLsFfbx-P#_MZk&fjKz@xv_U#F9iL2 z3zdnlfx-H4du?V(0wBE9Twoqhp+@%0vxykt#Sg{Zw=3e4*Fj8YQ!KQbejZxW-OeYl zy1av(22n9$V97%swd?Cz#U$Y4mW3X|dwyA_Zd2a&4iGsdJ6aB|23~Y;92RupMUwm^ zJhx%OmykG=C1K(Xl6GLO8On;ESS_0>S}KGDLl{F7Zf5F00CyE)$r}~%n4Sn+u3Q@Y zBL6FrZN~hHN3&k=V?OxqbS8lHWE<4;S6#+(@wFs(ZRaXy&<()FsQ|H99>`%U=hL}_ z_ndt6VY^qqlv;49I_H_EMAz=9cCb)(MR{Ly5nG>Wgb>5Bj`q)^@=1$2YlWH3X z0CTY_i3%0kZt6gMDaOX$INZtFgG8&)rQQ&?HWgX2D+UtOa;sp$0Q=D~NPq9w(?C0u zM^#!2=LZEVWG@x&StDjYDVY zK0#+3%iR!Nw8~fSva*BwgU>I01*(^E#ddPkOCo3mRs@cgpUZm6&Al&se6NM9nz@cqJb z<87ZWDW}X5?j|+aO9GHMut3;dqIdlhl z|F&GHQ)d+4_y`$rlg$#0T;iA@)`w`2j-Zr&AP2#5-_s~p_-3)~ z-U|aQeyli8)Qf1(rj5W-W@0G)Ygxcppl5t0%zQKw6lkAB&~k0~uK1=Dz0@52S=83` z3UfLwUhq^uG1JeQd**v&>79$Iz=0R`7NHtobV9J>tITpmo)80U--ge+GIVynPRl}=E0=SvGdlaT4m?vX6_Lh2{D+Tj)J^#))Bgo9=&x?VDo9aQbeP@+V6th~oF=U#@W5?q1(r-#nM z7L2P0xjhn_Z54q4+*y6{?gh~60@27Al9r2K22VtQ%hy;0iT{3=a!J3H_V{6qxll&A zqe}Cx5AP;GAq<|u$$T=9xM;?B)0*vuk88>ivxJQ^3DjHZ^5mc0Nxa6hnKb?%S8o9o z<=VXuKY)aXwCE5~5RsB@1;wEB%uzsU1Ytl*Kn7umQ4mx>P>>E09YwmOMELIy$AvtEdC<~-3ILvn>sTU1Hn%`WY}Z!5^fGH-II#7rY$Y!qQ?LkpD-zaM29)W4FUUn z9L!A2#hQ%pal2%ahZL7yJ-qc^T2Y75bNKR+G8-5m5L-{keMh=#S{5TE*x!i! z5{2!iDBMZ4?i$_D&t4kUUB=K`5`8ae<<~!a@F3{t*d}g@0_Y}P6vU4!zGFG>R4xPm zPkas!%v`0;U3DQrDWSQP(lB#>{Sx%@`ueP~%1U`BT7pKf#A#K|PCOa*`MrMnIRHrg z5E_JSkn3s9(=O*^BM;}JV-w=}P&5r`ZPypUR=}^d#EwT$IX}aZx9RL0CoQAO1;?(b zald*043V7{>%?`YBc)bld(FxKYM zT@m(ic2<*+iK>AQ$Je*iVWj2ivFzt0S`GWg{1>nk;6WGnAdNHIW#eSw$K`2h4cGT= zZ6c#=U>OzB#5G%{)S}qz)#SNfnMopMR?9WZL>o_+8B{7H#W4wds6WOKPceoh9MbsGl=;6J5eFJUpGyw4BJ?;xf}>Z7|u(X4H6bXy%5ptB>14B1eyN?z6d3tfXUs{!CFvIScaegmXe$@QmSN z{c6Cv5N(O4p?C70<+~^-$R*MNSs9)shO;NSNwZ()i7B)_@m&*AmIwOQc6HtG!*VEY zn)pXJpyuvR+@-W0*jX%ZeMX2#C#P}9=jDZjSR+!Z^j$ue{r<`^uX`A=qL$@2Qza2* zq~q7Fk56s*`u7ftmU^%Tw3#ad>_l^JIU#k-^6QLDV8+>QJExG5+nR$mxewu}|HkTq zHiVykR*l?EO}kce1&JE1Jb3;Vpj3riK#9my-Bkz9i+(Hs|IQ_4oZz1wR(LpU7x!sr ztwE!#|Cf7c;$v|n$1JHv5|>U@IMFFNApZQL}AZS-7j{gb$O-B3cr3W zByd(QmBWzk zF6S%^qx+|LFm3C+eY}#)1=ca@3=*eP^yKPx$c?zl33Y_AKfd}Vb$CJPoaSJhRepJt z!PdFuBuF;7H~Y_vH~Ad=eq&xK0Ng?z>6LJae@N12FG=;_^bUWw3eO(lKQS|suLJVY zlh^LBBd&{R0#%f7-(h^h6&47j_@rv>3!?IYgGIsR8tV4B_iRJ@n zQO}AvK<7>hV&gblwcPv9c)C5nD2d_+W~dP}D*R1e&cc)RJQg8uR|c$iOOqxNJw!I5 zdsmk7Zx}yUa|H-9kiA5}W2(>g9EoGN$KCMt*ZO;DOPxbdRvr-_s()@N|JZ&C2DyIn zp*3EH<)2jwM~JsAGf!6N4o<-Fel?+{ z(gcn^BF8EY-u`IKTW%zr=HO#QXKOcX_^1u-agkql;peTXF%e7kF>BMZDWtD~)ik@9 z+HI9E@EsM)n4#@SrH-e6Aw}P0Hmseq27Ya)@qUcvgMk;RT1Falr>aW(JL6_c+5N#+ zpPkfNmcFfz-nij*OE!2|fIam$5Hs({?YuNK7SfI3Jr&MUx7I!`@`xRtF@F&QKXbm} zHka+a71?5UcRLG!d+8`_u5t?fRmO7J*N5UXDLrg)vqEhm7}4&0f#oykg6Sgo<$Cjj zh!pd^-{X(X(H_&gMEtf8O$vsP6g=a!uLm z<)A5LUzY`Q0n!KnMR*Q<1mk(Sqr-GYp$F^{*PpSVC5W2+C)WunY&KTT_YQ5PjAYsG z-=wi?DGW$23uz?UOnd>8F=sxBqb268g&KLqed^2z%q^4BvM>3^JNag{=6p1r^PRG| zXo!?ckZk2w(H&iK>mfWlE(S!geQI&ew`Zn6XbuQsW+kH`l7{}&>^?LaRoAh5!2U)f z7;3P$eNp}1s29cU3LL6V^)(p25}km2zu;S<7liE_Da)TY7@1eUl;1aPujBbRF zcCD`IL$%tlp_0aya`lBp|GLxKSxgURL_-fg-nXA zl|1_iS`pr!W?}C2;E(@QZoEL!FD+Rm{urP_=d0o@idww@0je-7n;(0Q7tQ#Km`AYy zJC)Rbip^{vlsIE=$=iSWyUphodzHp>XG#4OM{opHu zeSNmp+$+v|p9)=VsW#Won>p*&l=9@}Q3kt% zX`~gJfD%P5O~41vr$93Y{H0Nj^<^1zwP+_6=V%YX?5kwF79;4mRrWNvsx+z|M$MViS@L{-Tz{w&X}N#*m56%?kGD7 zQs$(>^Fb`@uQ=JNci*)sCA*a$^JKdaCP7*`bmnFhWIflKg{LBRU(o`Cw+OC&>`s+aS!_w*Y_EyMpt~vx z@o`bNmcG-Rr|^W47D3xPG3^cmHi@q;(>9$P{+@Ye3|JDM{OB**HCyLPvS$q4!F%v} z&~d<>3ZW|vW5!Z8EmuEGnm|7bVs#U0g1upK7sNaxWpoV2g3eB$|Kd1Ey!BL#3Ne`V z|8QB&M*Fg!cTcya9)N_9Ayxt~dRK1t&H@Cy(Z+)u7M5m1tEDV#=Sm+q ze&=5hO#?hdmm>$a<}43+HGs}g@8+4ajV7`do_%MUo4-~q59^u!IPiopOrIOefk@$v z@LBRjlDEebPiM^e4iXFX+BTohSR+gBDG27aCR5ev=TL_tPMyA0rmR6)p->y8a}r%b zM&EC!QkG-CBg23~)|kPCTVs=1`c1DY2fr_x$NUMF2kmEMgjR|zphq^5$Tc6n?Wg#7 zrdJ*_M}@>FV}x&cNOv(}UfKK-5mWJCd3{LbmWDW`^Xtdc{fKQvgm~rIqm22yv<7EX z#lu>mu?sM3`_a6*j78hm2XP29FGh$FP~EVB7;=ad1|#bZ)m?@nSuMh5wcfXK*T+jp zpf#z*R?k6es;|DFJ#PIMU{qvm14hMf~jFXcr#P{)d$Pkli>8vwc(ly)dC=v#FCTAgE2PoS~{h#c}-&hQm zs{5DvU+1T*YvJ9|T9$4plC?NT7Mo@EOV`Y?0zCSezijR%TkHM^L(oPXwd0Bd#{l?>8l-PUhBim1xKu-98np6i0b6q(UicphcZ$>_U^PyJZy9r6yNt zOR&`Py8f+UY@M<&%*(*gu>4~kE}CHz1V7g+Gr#+BU|zP;FQ;70s+PTX-8|7dnE7^U z?d>dRr&fXb9D)QM?J)_W^E?#|@jQOSUB=vNMVyE`0YVnt4rwe|*kfS2^sjw zw(qGw9U?adq@iAZ{+H~1`s2oswdo$r2^`+v5I^^T1-_n}kBb4{v_@qo|xi6P?kYCgl| z8e`=^iWmGkz^If&lmij$mS#X{HAZu3HZ6OiH0@fb3)gdAa*b^PENs9@gtmHsqu}Z4 z^M9y@5&9gNyP(ei`Y_G63YVaDsmk8`ouSCXv0jlKx^wLZnNx*y48h;=6ftT}t?=F= zm{(I^;=!ZqA8Tu$#Y(NQE$t zZoQrPtZvfP{8_!_<1B#YSHQsK6j)g4{`E!yupjWBZLe(`T3Qn%Z=WB;{-GnyHEF)Z zDg`~L@$lI!Nk5c-S4ui)YKWn#ahDM)LQvDhIPSg$OKmCkIV2bjXyrc3FNcAib0+|? zEAv1G-kH{w$Gyqr(DA;_qCQ22o#%t$fGZ$T)G#<&MU!E-#E*?~_H$qCXA7$g#Kn=y zBil2u_9eaU{t$BI6|V7KR&`h3+i;T&Tk0q{*F^7opx^~qT}u5qFNW7Xf)RgoF!mB}qAmi4Lb0*V^=QHQ=%Y)NyTq|Y>UjUO`SIM7Y;H63<0sVBiZ`+a3)smiY$?(}XR z@(DZ9fQ(TYU6*phNxbTzmS%sNi}X{su`?JSpVlmn%$874_cP&qE+_m^P}uaw}btr>?fZ!%CT4 z#3={4*?DKjSnw@qYA4-uh|n0@DWdC!DlIx=_8I(5BAu-JO^McxlWW;|1LjVQ8p?-5 zMZ{C70)!8fI?hrfQ8TUMMFwZ0dn86Hn#Lvb`EJ`&=irxyT*p-o7@gP-4Q>mMcfVh0 zt1baMbn$k1@uU-Y@V?HnaXnlIg- zqsp0tCuptLkf^{z;+&eUW|bw8EZtlTWEo8U8kbX z!S-mf5HEh0k(juabjaug4i%i6tuK%e_vFcU5sGswv<79uA8Z{Fz)P1(rz6?xt4lhY zsy;`rA==+z87YD|yrAjJ{vb-be+;F5PttUPY(9uDNlR}JPd_ve`vRvdfpDIQR#kU2 z=CJ?##;V9Ml!$!IWIKD;(8>w@tULm1*n&%7b!=ra7}(ey>a3V@B-KGumr?7aYwUP7 zL|1oHkKxX6ITkzI`Fe}#R#uwW?um)fSwO|h*Ktb)e+zgPwfN;^)|A`tJMLx7DorWC zbaN|!aL$=q@>$LPDyX(WClkLfUcD;DO<0`%?J7X<<2TAabK;I?=nhzz_=&?yB%L6A zjv;$$UVZVE ztZcAcR*_LqHSW1cMX;zq_Nc%;d#UWs>&*}PJ6zym6x05=$9!$mvnZT8@774u*|QgS zYqk`viazIwtVzVT$K1Y?xK8NF8F-_^NjMgZQ*?jHzk8jCs~f z6P47xwXU+V;%xmeiZHfcf(n@Tp94V=51f8Qi*|5oK27{vwDkadRb}q$@)Rn1i2RJ{ zj>R~dXoY#!&)6y}>e*kDxA&HiC1JX>dzQHvK`Y6kz54TbnvBC*iiWeK5yG{K*%@!= zra5Xf`bPJ~;I;#??n{*`c?v!P$00dBH{kkGN_o1FV>Cb9z5Vj4HSW*%<9j;0{JA4B zK2JrnR|b^{ruRNb4ESj8&AY^60->``i-p!#a4Br%*`$l~v}E^Xmfcl-%LYSf>q&pu ztBzsL;Z(wPU#NOInbwDlWdCqyB>wYVrqW!=?Y$MyQ2V#G2q)LV0K}SJBRDugEITh z;(VL6vleSbWEvPYRA}j!c|1TEyJ|RBGXK6Ot~QdCXy((_cZRZe-(GmXchKiIO1|KN zjJdTVH)`)L-*7CcYV}5bF7NiKDCzN0LRL%N0u9{!6)Sh%BTQ_nklsKP=cp0PL@cO@ zT-}UIRy~HG1WBKHbDL%Oe=AWxxSLqSnGCaeX)?;vVu`b*!5qMcq$W4P5RTL#!#E6- z`6RNajNWEPTV(BRhV38u8>y{MaRFgX1-agV;n&<8|F!EX9az;>q$%gQ@JWt)vo`(D zLyE7ZCC~dy>wZlRym5~K>mb@xB9R&PP$hiIMJA~^|IG>_hPeY zskqWt!)CdJta;0Z)IF}AkF)f?A)?WHJatJH2wp!b3Y8enh`DYQw5HTy#fD5w@~MA$ ze(S%z0L=KSr%R+fYu}4{){>;h+f&Csj@`e!vbph%iCM19p!g z75UcJ!2F)w$MfT*OU}h3Iv(QhkdUWxfO(LW^C-jd>x-!+M!iGl>zZFh2K#9;sQlV| z_uj&_yR+*FDFb5{LxW_yo%A&*HEXke#38n!QfDbbn0+OP{*;hyQn@Y|;F`8%r@PtQ z>#K-Po0XKP?GG%x7f)<_U9QUyuJXpcWvoX0AjfMRMgyF>_K5Y;#GqPHVNs5}*e5Y= zzLMK;^+{LKcIC00*fpyL9i_7VB-Tns!PzXEkEu&(nZ{s}`SaC&F4EQ*VRoVYE93&t zMVw4WEa}UtOLnX4To7AjO(e;x!MSe59~4h>yXBpMtH-1kj}#(h+Y-}MUvdf&u2p(G ze#W!bVw~$ybg!XBOuwerhqQE+LKDWeQHTUniOIU~AJ8~qZv4y7&WsAMOg+6wiXRD_ z-fSr~ZAs2I|xXWfpfvzqgN!4L;wSPr-4Z)UkcC$O8_P?zjdw2 zWI|f{lb$c*yfzF!zfA`z{}m<}(2)l7#cxDbTz&a4!lh+cGMgGU#n~LAPTwk!70pf^@@gNU9mfmNwlh%5a3y29uu;h`fb7xsRt~-sWSpC^^n@Hurn1ww#J*h z&pId&c5L2QO}_3g@lf2iOK-BTk5wbd97KW_`IHB)4OPXJdY$&m_(kS_rZuC7{_3Q= z*WeJurmxB1AwAv^vo!E>FM((&J3imy3so<~zGtHE#YJC%`w?XZ7})Vq0>TI$|>+V7T10W1v9Zzm~SAt%DEIucAqZ$O zs8F}pTcHfa1{eX^;3okjuHE3d;ME2YM}m{?%DkoEx}KTRH}KI?{A-0thSSG&c1Pnq z_XYZQ1M{#ic(|9@Ugwu%P>_Bj-+Hq6uzJ>*mPZ{Xj=noXOzs4JE45DNjJh(muhzPo z!US*GCotuS)*sp~>rkLZj1QE*%z(9{g=N@F6jCgDgpQ4-?x{2%NnS*BA-wpypS%d=D;|>27|mSP_Wf zFL^OPivrQ+*j;vYbW^%%K z_}+D_Sw4iti}#bB+9noO$eMa=5#h5T?Q1o<>Rd0yIX0<*uZY^G6zti=*3HA3^VS)97ne?R~fX z-u_fd@&YLd4JYPjKFI7fe_^ktY|_bjEarq>iGqztz=B}Ff{E_t34*s`n6+-*Z~huw)D{2bcwhdk6W=Oj7AwQBucwq_8S^@BJ9hgWm_>|h$;1730^j%| z2MAfSnbgQkfmpv}>F>>rE#19b6=0mHJ(uRa`Ln|E+h+{#(GCZ(`HJHnOOK~QR7``M zC`OgMGuQ{gUH;DH&dC!Re-V$G#jh4_OOqa+A~8f*SyZTOPcuE5EKo@ff;=bNAr?>_ z`V2rC+WatKUOZLDU3zrk(P}EG2mi`KOV4cZwMJ93<{F)%jXC)W6Xv$3dU|HQTgkdZ zkPjaxvJ&Z0_CZe1OfBQ*@D0{gRWg?NPha|v3{K4rUX<@s(d3%Qxkq0&D5CH(f_IkB zN=uiC=50Au8#z9RHd<>o6j^t4q`-5b_U>hY_zsRl)xv%7)Xak35MkDwzx$8$(IDNz zgq>RjlX)*>s;r>d(gW`Q!+Bj7uU4<$+Tb0`SjzBY5~L{obqxkY_o-U=d`pl#8bSA3 zHVpMmxK$C7zJn)N3W+b=*GgJ6O*$m}g*#Klqp=k?m-HAXQQC*)pdN%VQA}ZiMb5fnP3>8DE;fvv8&r4Glf{A*r%&K5VoXB03zvrthUbp}ze- zO>7%Fnw2Y#Io^7od93%?h`v)#uLgs;4(q2Eoz@wln0yUOhM#V_n}P)IECn7!%5`YH z%+q0d+U5!k9in|fplb7@1r7Ss7}xe_qN)i!*q-pX>Lef9n zO_|F+jb0Cm5@Yh@M5Hd=3)%WG8&tt6=p8IN3{b%P@)uiM^?^jPDEu<7)U@C2Xt&?UUq)-lP8}C+fz_tj2 zq{1Knd12d(ORqMfdoV}GKWCC}-Sa+@jvgGwz4s(+i%V+l(p8hdc*) zT;2+%L3oa9$kLPT z7?-`>C;6G^v?{#?x5hKWCiAO`bi#`MBL|9edWQjZxIeU7w%o#kI6Pi2+Wc-vC1t&K zc55cvv)0X1n^Sfse?Fs&lgVRAqI!~oBX~>*prA2_>%|c|-3y0^+};&Cf3t9@K9@si z?*3~VAKIENO#|f)Ia;N7pu)Z}HPcCSF2}Bxe^X~=LA*x3pKL1VUWcu?H&(CbduG!R z8cO{*v6>8Ixv9Vl9o|Lp+iScO)@nuDq}bg-d%{&6Fa5O>oaKbq6@QRFT3XL6(U>NW zPD8={y&({G2e;PBo49_|)N5dudpoGpEj$+$ zsEZudSCc}BBM*DXEh;KV&aJtmju#)Ru7pX#eiDs|JH1Y1$?YUec{nEEOK$d1BKdTn zw#3JHJ~A|FoVRd@1-YXipDac=PtaaMW~`bKA{!_H{A}O2O0qU(_P1h!7m}3wj1;!a zyc4hG3fT@qWPEX8>gs#04dJ1=jLVpT7os@xN1}Q20!dZ!Q+vLLassPboy#UZ9I=O- z3h_#7UX-($yi{gAoHuC|P=8Odp?~eb153)?UTEc6``l|iAcN;pNRAVz)V=;mR~fwY z+G{tx!S5R9F3vmtwi$>et=ige@qbvzf6?U2@KcN7XU`wCI!nk{KaNNpptnhjpr|mN ztT}?_ot0^>tJFXugh`4QfeqWox?CoK`@IgR{ z6v&&@Zr(qowr3arN$2+V_88IDhE?~4`~GR~DuxXc+@S@}5(Y&8qtlNbRkq6d3EsN{ zRxp)sCHDqEgduIk_}h&6S!nD+bT671Zsu>=(DEl5Lr}S*x9!azDD}P4juhc+pvJ;i z4+2RVnD4}7gsF3XD>|b2P=FGU_S6X8hfwOb{1_l`C3y`R=}`ac1=b5`@Z@hP1CGlf z(bD5V@}!3+NemVF&exQ4vs*@F-NzF@sZjQupO)F}%C=qnkA0Pakt($Vbtr&-O(QC*A!$1b`IZTH~ndLfAB9M9c(KQCvT_`o?oW*-eUofi}fbT9AVOrSMcbuQcxG@ zsZ;vx@=P#*RWQK9ssS8Re$3Jx$O}7ZXb^{}A#p|*D5`*E@c(^uwFI03z9Lw<&uN%O zV^5BxxJo1n_ZeC|E#%g6cbrgO+=MdS%GW46cx~ZpZET3v+cym8&`NV(&-+SH@c|2g zf4<$}tBNVs;+0M0W$e+7&u~X!)>T6@krBH}p=9i^Id!S%&|K1F2`%CKc-3ejkEY^5 zLDN4Fj{~@hm^`0bMv@%;9&Q7jUEjdM!K7AX-Q5YSUrgUJHol48F~_FP!(a$H?nRS| z&Pq0OvJe$=-^o?oLyPk+tCCEco)Tu>*y`gLscdocv+!JHuveu^|3SfW2t_P^5W{oP zyssEu!AYNAN2>8M0K|FM z@glAyP6ux@02IiI`+e|azz}eHn=B+3{PsGzdYz;)zdVB6N-i_K%fsh<%+jQisOZr%whfh!b|$P?b;r z=QD5j()`wDwL;KGUR?B%Slgx=@$2+7_~tthwpph-`chRWBf)3Y$tk|ni?bd7lYWi6 zv~P_ctQ0QR1M39saAm}&*d9GfOsJUlS%UYJWku{( zcz%1rjAvXjH8Gj*d7UngPxif@)b)5?Ez(>;v@eZrsQdm(q|av$!2ptA0FXlpe{#?- zpu%D~VjmNKFxh6nXX+ZE4Bvb7NhUqwcwO;*G%4(maB9VI`+*RTw}z)ci!Oq{V%PjE zzhD0K17L0FwvQ)p)b4cVN!s{5^&dJ;;?ffK8+utuYww+!G$70UH-E{6xdCxbhYI{85`;Ihox+atKpRvuptm3z|-NffCR@b%H$y)eG> z)U5-WzIfxFl&BVY#I#+&5fYrn1h}9u;nV~qg-Fl4U4F7wvb;P7k{*eG1*JcE52U3N zAtFf5#j?kJ&(zou^kC<`=E+hKpO;i`IQmsbMe?QXPLVeDBt2_UAe84mcV;g-vio;c zq6Xu>=&#^GBJxg+&<}(h!QNS-;zWiGk@(bDE=21M41j>5|B;5N^xt3s<6#uoxvg%> z)+L|WdBw8GFlpO3^jVyRv@t{F~=xX4i{u(D}!@jIv&vSk05lHQIBY=BZrxsTAN0%MA}TFzFlb+OP*As z!|yAy2gQ0Vs&|>c!43PTtaM>@`^xyFlmI40`?4<6}ns<5px-RW7D{(2O|!o!gRnzK+*nRn>m!~^ittvYbm??I*h&3Z<0 z?Y&%{)l(slNR3V`fwH|R_S2t!bS&6SyPyfXY+r-^fLkr#$~t9hBP&Qy)@fCE3xIDI z?8i+1l9$swh8|xPjv1p}e5PvkyUu~cmNe<{F8=cNbO^rk*WgD=$p4ROpt|IrccS4+ zNEHPYBz}2ysnKk}mLJ)IS`9pVV7;|uu!|Hf;RS&ok6E$XH&||%oU^}3OYE$PY&;dJ zLP4f_IBbd}#b$CSHX|7AEfuy@xejV9{a-a^N2!O1Rvo&qafGAKL&yUnKJohNt>Vl1 z>u*uGr#UY7c*}ArK%D4d&N`|v`ai27_FrLX>N|8nK_grC!rW^fz*Cms@))qQJr zl^Y*&eOs=|gv~8A@cwZlkg5h#_^hy%a2muWhrT_OVlR&U^gN#tN>X;VWsy^DASO z4(`14QxWIr0%4twBA>%O$?=u8j%L7)@zLXto#rr|5xbf#>uz0j2(53O$cfr3u6(EZ zQ##;2S`uzq4KAv*9S&$BmHqhIdF4TBkfMLj+Ue6XBaZn>0)>C`xb&}4EhprCbd^{! z+qSU9<(ux_zjeEX10hUiDv_(X84#o3n5EqEsUP!mH)ULL($*wJAGeOq*JUw*;{|h9 zB}w1kR<2w53XE}msq|8~XT%k3kCRI*=V~I$9oNbq4oJ04MdLvfoAe7;=Q* zIq8t>)$g5G?(94DMRDts>>>4dFE;#dyXk4D$-O+;STMZjaTq1x=eVrp@5KC&D>Ki) z7OPUyQy>7f8f549#%I84rCl7yd$_kP-Lg=h|{-Gk~KwR(c zrd8r;@c^2gW;GmAla*YwkM+^tYGDtVr(aC%bB^N z{R-B7Pu5aL(p8HoIeH`_Wj>t;cN`%$yq5VS7=U`26mKMr9au6X+QVmvkiNg#l_Nde z)zYx>)UIs-*#XVS2sGnt;rb(xnL~9{4yd7R`+@V4qQb}&YjQoZ@{%k9lH!zSzFa!M z(~pl8CwOJEgf3?3z`~Btm)~qdXs^~m#`j+mV@+|M=Wo&=#I)ZxO&~2RZ zF9=~rNkr>eR7ZySkk4s4>)jLapy39l0#Qw?2$+wUDz~jumvsp6*>EyF0T`Wlc6_$F zVv0@kA(J34=ou{SnSwH!U3`SK@6aUsXwyZ79>DwyzH z<{Vbq8blH4BbXVa2rkYmI@NK8mk-;YWzzjiC!trU;`K#yV{UXw6h12u#wD+gS= zxS#ZH#)T5J@E@=YdBbKXFAR3xt$jG(O+^P zwWQ9q=UDkDpkOYTxG^HFjB`pMNAlZZZ?DzxGP$(!+?^xFJWMLPk)5k_8MXVxxNLV# zZRcOPoFRB~qt@U?&e1o;4hr2NK*%LLVZ%a1!#EBKAq$V!R8R(9-PX5~ZfMv9>SyXw zl;jA>?f)weqJTsI6`p^w;y|kqq|>S!4s>rYEqZWp2$RXckBK%}Y@WuO+@%ok;#UsW z*b>wy-;XsV70h161 zsg|0sZVLZO;jDz(?8U6Z-Hn$X4}N|~@!GMJbfMPoS?k@wsI8neCCIvuDD~EuGP|^@ zE!a#`O?{6&SX;gPBh)LD8M009I)#XxpM3@GV$1)BGNCmjR8$}a6yxOZ&%y60Fl}|y ztNjVv&@)#N3`IX3Oreme|HxkE3!OJfCd#*oReGG_n^c8p-U+x-BokU>9=ur+23$z* zNAaKF%QyTrO^~f$x#E_zZ!BazY2QflLoY(^A9v%@dKaIjEW0e@1Erdj4_1tGy{3E1 z<*5|9=@!vr*uh65^*DK_d=C16cw*jRcl{jJ`f?K2&c%fp$o}qLh^fR`1uB>DP#hiH zjSSeRY~{YhwyR6dEoh9mF$##2nBVV1GZ6X+36K_4Lm|N5C|ajIj8PuL4Fn2qO8pZB2{Ph2yAmVW{%2hFWBwYw+Rz(32;YY&gxD{TRA}iG;&ycBP zO07ME3-H&UvL`1i2dDc{l&{K1Dw)RI?@bTdI$U;b8LWQ1^GUvm=w8y@lnThP`kMS; zIO)bzCUh5#mJO(f<a!R5wttOn zm9<%gD^LTM@5baIHM~rzqWk`|iR=krg~y2*0<)#e7~M zAs*O5gp-*g1-p*5rI{f0(Lf*OLh0SF0|mb9=os z%Io7~O-!EqX({W=Ysgft>jiL^-V7ARTBABr@(-YIR_l}H=p~VTPt(9>;5`eY`S;GE zCHteY1G@4tL$NvsK$T)3->%T6f+Y0cy#TCpv46QojjpGqrGLY=PyyZDOjBPXF@NtP z4f)X^KqE%`gW6Lq?^?3wifaQ4c7Jd$eyCg1Vh|AwXpC7ROOL0=ETzFb{Zyy|;q4Lk zUWE8}P2@0$$%lb_u_)i7KfeVbQo|w28TVLT4y%{>sz?!&YRBMrO6%(XNlEZ1;?SE( za~!F_I(Z?zIRl_WNAFRP(!NiryjQ9wVzK5&6rm!@3 zY1U|ce8H;-`qY*!s)3htXo_lu_uaWXa2>WBAo5eX3shS(Gvm>J&u-QqrGiV3nBWOv zDw*lQKtoWrFuOuYkl6qOXV&gLN@rHi9pOT+m?g)A>R50r9vyEqA< za{`(`9cTi=&NeFt)qtB#U%3i)^c+wQh<18fdiqijm+y`Gy2Lf_5UIOsU&?L_gZDj; z0iXPYP5s#q+aEz}EODjnICf|QS<4uGJtUqzVJbdzV*fj*S!|bnr{l_blg9Ps&QapX zYq|6P(*BT30KqmBL=AUFqtw~@^(id_=D=;q6TG|T{k{iD5IQRpnO#QU`q8-x-KrQ~ zx~y`OD*NGlzimO%Mt60du4_+XpCKk>zUiLG(n}Cft;0bm_7L|AE@`f7QWNP+W!>M0 zGrXAuFkAu{7_B7%U;P`M7IPqM@Y4H z&5aIM=#>H+J_Rpr0|W{Bc#$q}HN@cr#)AmYec>s@|ECNOUTp5<#QzOAB|3OMN{wBYDGIQ3dfPDDgf_e6e7S{OylA&EMqyAi6s9@kv0t!Su zpqK2CzTdTdr)sY`cJGV<{S5x;FtiEatCWr$M!IKj3yI(_D0zH@mGfo0|3$gASC0%k z4Kdl}?9{)!-}FGGI_^~4u|dCJ%BGucarHDa##R0KVjPw z?+y6@g&nIuN%<2Gg#As41O1!_B|L}R2Ff$Juh7`Ht#X%AN<+3JDB5n?!o0(+`4IC} zJ0&4v7n}=}A`U>C1F&dw+mn|&@?~2(Dq98wS$%0hLK!Owmf=84G6?c|1#*=nLWQyK z+Y3<$IAM*YU*FN3$5d*R<-%QDO_`ZrR2+u|8`NuyrYibV&D)S1We{~C)DQEaFc~DU z6moefeG3TVwZmH;6KGi{Ee3i$v){}t z$cn!1CUJZ6+QW4mAI4tUcKVvLbnSF)Q;VbD@zI13FtyHQX~D8Tr4t~XCml)05&X@E zY&VgSQ`XKW2&P`cd)%6eZ37R}^vB;L=t5A^zXW%5Vq%{{JI)4l9T2O(wSzawP#xf# zDg;K!p&{x!Sc>XzT_eOO0v8%iMfbb2fGS7$|B7nFhf3kiQ-#r%voXJ8CA^fgJbTN$ z`)&-=Ga!7MPVt#`)Az#d%dtO_y`&=5gX03Ib}j?L_8GaY7!&ULvSr&f7hVcT*|7>d zru#*`{kM&af0Xvl`j{2&|R znNzX-J?@fb*w{XZ+qVkkr{#H*+>iUU=jas^Lm}a%$IJ32`A}H6^*71mxcYMbBpssq zz8S|K^#h|@vQoZlx`+94yL1NnPPNx$sLo3kLX%$;%MsL4NVH?pqLGG8Qm%;Na(;Hp zQ_rHZ#Xg|b{*ycJn8km0|003R+?QxTz5&&zQ}XVOv^$dV$bS?LSjvgzt_P)fv1AdX zDUGt@_w4D&t@sGx#PuMW6jWk&xnpmUiZh~U@lD{be6tmIv>W%vO2_x$?e4MlHc64DCe8n3TMW#XYMNPgZrn<-b;~cLrfP&ZBk*@2O5lFd{QI@3oF|#eM|! zxjwXP)iAjfqI$uHf>8b&sAF56(Bb72kKDz7S>j?LDsR9_WjNrRenv0TN`(Q=d!44# z8|8e>u?Xj(&}Rn{+Ou!bc}17<7RL7b7}q_!GPkq&4bWWcG}0-vf+cH z&+0Re*4M9sebq=J=RI(i-3AmcvC;q)MiarV#Sm?+p-RZ8Jcbx`7Ji52zd&9W$zkhG zk+@Km&qbr%jH@8p7gzLQ)!6M_Iy+yhn;07sHL=X7zwl`hGIaQ#iuZ6obG>nb0SX#BnL{tP#-j;Ywe5^t zK;JjZz^tcPeqF#^k!NiO)UqW=igq{@>v?)#13Y<6`vK*$JE`Luv1j2(F|SWNWz{@D zeEvCv8NJaE_cPV=0QwT-mY@V<*Q{QwxiWF4Tgj-PWCABt!M#^Uk_UA3ANE7pIMhZL zVKN?Y=vd!%u(IQI|G8Al!Dl>)>==|)dG?z3SBlHRq+N4~L42ulve$Xxsku%HG(ei( zkHxXfrd3WU5=0Rg7IC~Y=g~Dwvsbg5QE1#=j;-`Wh`i;J(0RD_Am%MN zos}9|e6xz}wlq18Q8?>|#ZpQ_<4a6}tWPBVI7DQtq1V z>)URM8jF8;2=o!~wRSvi!*R%lmR-xPGzDd>%_I4PPaz#aP@QXWN^+Z${Z89eRKYkg zEPQXFyr?#Pwy%QYQ=2G8Xm7By>kBEzeRQQ|1tI6fmHtQ|M-ofkOtY56sZ$Ol9iF7WmF;}4nmp9-bYAfr_6)O z%3dM+RAxA~tYc*F?PPziqu2ZM`@Q~niFEG!e%{yfx*pf#dR*5NL;OiD{sVPaUcjuu$kKA@G?2WeB|10z+dt6dP`KY+n>P4GW8u~DILA|V<~{pzYedP+ z2WJm#h0_sGxFAWXDQTcb2-$9DnXPa9o>qEX27c=J2ozf`{Y~q0)~50YZj1)LNdfTD z<=@J|@BO@ahei2k^v!CeKcpSBjo%>2R+6Sh z=-!2cm0UKs(*@gD*Ou=(g6ht{=8D9>XyIO?!WtFr{14L&K8t!pU$ZCv^6L*Yr-04k zePoVCY+?0n6p;%30A!j4pH8YuozT)zT+J*#)hUUnKIMRMcSkI%Xm*}Jid3X?7EtJs zsC&K903cy=s*K>qZ00Ur!f>sCLIa5ig!c-Po+CfXpPh(#L0CPZ{Ftl2E(1Z%KO`J{ zZ}SZV9cz8~c^+?wC5K0M&8eM-Y=KPHOoBd!eeZKjr&8Nj-7bD#;7=THzI9+IY4++q z#4yuSFhPtiAA$Z(YA#yY~PHk3v{*=-3V9$5P-QNDg z>mLf2zQtQht|F+G-j=P?)A|9Fu7&)^ezvuDIJu~7^l@EZ5HrfKWm78h-A$NumPAiB3`YpshmAbo zooap2eefc}MfwEqO29zmx-^5)NBDbNU~!(3!tA{*ZGSm+-uG}2U6n)dFJ%sJGCrSo z3sDwubKDmfQc^f@u~3YPjo;%Q!L4A^k0sW@@&2SJo8d3naCgc?K8*i0_eXJQGECUn^ zw@Lp~&p}_t4dVqZ!+xr-73;afMG)R%fcpUFc!I@bET)P`xABn4I<0w1eSi8;Np1AN2bU&INTS?)6k z8a?aa*lkjL*M+9-d&&<_l1rnIUGj!*MW+ z^xjezTf@M&Fwr+PdOOwf{@fp{Q=+$hb5Papaa3T=E?+J8Az?gWRlhZvQ!KmqDSS*4 zH?IFyC+a+~TfQBEu!=h{7qi&}7y+AdixhBJvA>BDQ51?3;TAXXjx3K6iIp(n{OScn zZ@ll-0OsP7qj{Zs-u%CqBH8kU9jhSVO@ls^%pOdc{jnx(`c4xW=OgrwOu4z_yF~n& zBxfhTg`EmhIQRL5?91@n+r8>U&H&OV1^S|Uo-xPfdgk)~59+EwMB3~8w!82XeNeT|0_`|PHukCG@*(23lKH*-*P-p7&Zp%R;F zel^-A=XqR6O08WI`OYsJ-}WyDFgQ%!fa(`3RRez}e_N zEY;tlvLin#Qj0_OM*pIDigG@cwXL5su_a%5>nzdp%M>4RVC&j*MJv_Dhrl_13o`n& zR<~5f-b?rBQ*ulBMeG|tqYzWYx#V4mRZTp7FOT=`Etj<-_oL)bm`!l2@zP{I{AWKh z{H}@3;o5=1B<9%FS=?fS1TXm)(g|T*u$s0>MVFAr#IcckNYc;)ira{!b7^t;gDV{H zD_CLiOMXqoaX0nr{J8x;&8MbX+9z}GL!9T)EL0=oNx5S=1<~_gprLajT9er!h2qA6 zp}acJNb*aomLa1dd;(|moQ8_%S8(RYU^Ez}ia~LS*1=y-O0%Y_-2u2Y&)Z*-DsUgbsfyk~BrlHbj>CKV}E6sy#z`#E+iA)-7=$avbhLdrwyihSw(BFp_6Lkcg(;FFM}a z;>v;Lmbxq`;WY0%tO|mBM8biSEt( z`*jT+Yz>!NnBPpF)a?(D%J4o?&?fV#R1%IkXv#ss$)AWB+zM)Z>UxW>Ntv?KBhz`Z zo7tLFL;1OlN5jE+IVhED2Q~?8`boA96NLYsq9#n7{HjoAHm@8!0sKo%?zf{SvCoQ& z%awd;EtO>vkv`qWdd|k=2g1+?HvCayk>>7gt;+qI`dZ_B4HYXd(q{X#KW>$&-r&Aj zNlJzh%hzOaK74&u?zcOQlJW;m5WBrh%G4vsI}@|D6qz8oe>u@cQbKc~lq(1B5M!QN zEOCG*q1eKOFC10ILf8k*!b{vxgCn=&WlN;YJwo|C$QpgD8;yA6b3uhhU2IAN?io?D zJ0b7LSpTD&4-Oatp8-#n`9Ny8`rnh4_Jy&MpN#J~(*d5R!BlvZpdT_=h+wsJ{K*T0 zLCx4n&kJ}zZ~6T_qnSz1=ArLTcELUK(-&N+X;QWf2&GLJJ2llX7I^@3%RmbUZRghx zj2qC(u4bSM%gFT;thLQfI{~6t)+_W~_#V+sN{#+%Vh?eH`L_FAbvv7LP}B*v$8El* zK+GSY{J`H##;(-pcrg4;6I!!{`@kODfR&RCtBR?kLEKk}62tuC{tIfo>$pWtNAgEv zthEiG{*e7mlNpfh4W502{H=*0G@cX@1!>du(JK?^RdHlNZT#Wy@K`c&fUttuF+i8H z@sbt`qeX&43z!+v-m-xKaeMLfvT>BDSAHJZEv8Q+VP|I(D|2rSWLU``C^Vq+fPJ+a z^zX?Qe~FsOME)r%h%q6rwZERam_YchUyAXofsu9!L`lQn=u`DUr1^Xfsx@}Za_WY@ z@nCXmZ043K`JQR-U#R*G_SSG2L96PD%t(QVZhHu~=i-?Q&ybUCp`?j3h^#X$5AH23 z(w!rREO_x(kXvz^L5`8g0R05#7&<#Pp*|C8}X^p4|%*vNh4Z85dEAb3)I^< zoy%uaEz@U_Fx2*1b*}gUp3*xNRe$I_786rBlrg%DE z#nJI>@wt9|{-~p|Tn--RS7@;qbebeen#1!v8qIe$Ur?J*D=w-N4I+O?H6QWtj%dey z@I@GV3T#1Z4^Ny(`9YpOTFxy6Ns}u!1V}^>glO>wUID(oGWT0ZI~D$LpjrsqRf>~E zu$jUS%Fr3{3Zi2#W4Zz1%VC~oMR9SukeA$ zP?anGoNz#Pwg2BXvMoGA-urhxg&aW!`f75;84n@u&)*5LQ{sm^R!8eb;^A)*ye8*Z z()X>tc0W~JabC00=ZN7x40~YXvXWZUp_q+ntN8o$jF|k^#{umNywIvSs((;yt7a2k z9hu!g6wiiLDIXZ>>m%e3H*oCy(Y*;jWKG3|$E;PaDV^f77$?Ew4YL?(DV1f?0evQL z0v%R$^}rDHvUc`;_ejXYa*&6|AXv{k+pIF60y5N^P>136%ZriK|I-2l*eE)N*(j2) zH!(3!Ne#~QMGlHPwfNSXpA~fc_>pH3)ObCe$9nGDH6xX8*|N%aT`m;aj$P`&&HnIkJ^r?nf%>8f zJk6~y5WWr!RddnkVzN@B^LWPEz^Al&>8Ia`iuZk13T=4%xjRZJFehV`m}K7?g{;XQ z2HUP(_xy13dz=ZS*rZL!6bmi54_GtRB8J%%w?hc#gS)tilGC`=eomYSd2h?Hc(7c6 zt0hV_R#9F$Mj4SA5h_J7C>EkkJ)hVjdk29D&tzEWx!n8fPYXV7-5B zo-t~xZlHq#(H%j@B+~KVt81H{sVWP^e%S0Ij<|hd%(oWwP%d_G<17y9ql8bwlO8II{}2&Ur}+k)v}zk0i~Kkp}#Sd4O|i zux}avo^c1|=Z91KZZ4yWm`CL`bf?emD07bW)*m`cp&9=GCl#h(n!3&B{akQOsSoU$ zkOY7e)->l0ycAbUaqG$9d7GqV6%EJoPDX(r7L+JjN^kC`8J!?p6$+E zlVp5rWPPmuhXiyH9To6B2M&rb?(cj}*oeSJ{;iKb7p}tV*5nTGM)+nQ=s!lr$c{;w zg|MF%^G@dR|3!HvhQ=|aWQg*`kCmoJp$YLIHXvn+Z=1m)+S7#i>+tsB>0gxveeH@^#N8X{Hu~?5OWsFP;{Xwmhj|{2U2G zKYgl(1xgW4D7sah%fps$g`BTSd2xy&9Ar3!@(a~uekMEZ<^F~Ipd!I^fRK?DC3^7g zn+`cBLaTf1K}uxfre@gsh-M&-bssrWijG7Hj2?B&+WD=ZN8M@&$z84VK8)HHb)$VJ zymvK0Ja_W)TNZoqW@{>cMN3N8sA!}DO5V|r`6kM?`JBxMM&RS*93=Q>Lz^4(XK^g> zEk+#nd(mkzCq0_53uRe?sl`sB*xI=@cquat6c$90sa=E76T7t(ytHp zs8x{Zs)-N?3Jiu?eGyE^$EGC-!{YcwfHjQy4?6;)L{>WG=Jwt@Z-LPZc(Y-5czLk5 z?$aN}c9OHajaiudJ-oF|wthU_Xdmb0`DV_Bgsw&h11+7it{rb-{+n62-$(URvZ1e@ z?S?xx6smOuyRzd3A(a zxj_eDH4X4PfUj{Boo}7C@n%kCYne={qKSB>!sbrqOCM$08#GqfwMCUx| zTJa)z1_@%`9<~6lH{DxN9%);Y2=n1vLu_BzxkbKtC3w|B32Z@)8;@#d_mwBVQg!Kk0?Yd!$+PtA^gcA3D$lRm zxJd+k+1J=MNjqTGeJb78aEdoh2l6yYu z>221WuZ3x_>%m{~Ps;QFOYQ-|EPPF{{o{UQW6sy6S`3P?1U9xJ*$rpkeVEFTrUH`P zp4zY4sNNOUK3&oB^oo`vh2relGlo$H2(z`F+j_8{4+UD6e|-}mA^^3KE^~ry=WvdN z5+PZw&s2uI6adP%bsj{=xqyS@xh!kc*cp%M@Ncj` zFeFdKwNXi)UxMh))an|auXtz|Z+%Q{G*AkDtg5TWNJz_ z&#>FVxI^^{+LvNul?A^qR~nadRfQm$@rK`H>v~4nBs@B$->kbBAU2-@w6*oH zr-E$k6#}ZcsnL%i<$E>gYooXt!4~~hMb?IJGe~J_hwSv4Wwpol!LGG?!TX7qhnh8p ze_$R#g$yuZ7Z>*sv+bt{E0@F9*d|_glcFw+;e_2)mcQ=>B1Cbh`O+Q-vg-M_p)mQZ zH2yi<6|5~&{htq%ME_a{$uo_zRO?i zFTJB4gG2w|feqHVe_H)fQZ3Dx8vA-9R5-D;yo4Ll zPsq&UUGCxUlpZhZwA{nBm?s5FkQd`0CH%RiDt`z~D;!qkld=yJ3E@li^f;A&HGoZ{ zxTsk2ljHA?$Y1FFyq?a#zAxi-i)$|}FGV)ByP0vGaU^e+8!;rJ$>b0uK2{i%A8!Db zE&FSYi!tS-r&}obUkimt(T=&@HomiIFt>A2l%3qu-pm1urV}D$>>azFks2MZd>Gj0 z_o2mYg@ftM#HV^}NH+cWWPjkzwbtJ$FkSv?tk>j+_cpBce@=%f^yIk#2NAK;gAzvb zJLw%qx~|wk5FEQh(%uC?COCed5}{X-F}bocgj?)Xx`;L*uuXbW?cI!dYuE%ibm;=2 z@#O}vMMEx2ZVY(Z^#BT1nSZQvT4Hy-arb7_?B^!0>5x1iuFu4Y!5Xs+q+NI9GYhj% z_Z;s9QY(AjYad2f_SwEI9x+PyWA~jcAwOUY{c5XsV~t$C1dYNWm}8h#)DO<<9_s=p zS=5P~2e6rT3VolI=^!7ymNl78Emj^B-w<78wOuj28}DP8 zw8pu4e-788{m-G18BSq$5HLk`K3O`-hPBA|gb^Jxo(S@_kVXD)_=XjXhIDfvI1b`M zJgxU~V*H2&Szm}C)5q%noC5EFr=Xra8|L%pDw1AFCIuJPZ`s0+My59I50eY?AI~4s z>#@--;VC+3CtAlc&|h_z8nD!4%#R1l>gzT%NZQA%3+6%Ws|Ch~`Upcus1M@nM<|IV zDMz29{8p591qaTQvOIF0BBfg5R8b-0uL<@vmv!NTCo**C#=GeAKWlNpcleFO(q#+l zRai)x0E!VX#)Yp@8dX*e<^(tGUuJ{JSLyBZ`p?T8MoZ_QEDf|cYXG=Nc))7`5u8I|aBR++QK&ui z-$8ufk0UDZ#F!)3JegJ&n-wa%70RC&K9MSa2 z`rH%c3U^PPoHxX9gD%E72nM@=y<>t73zLnb_V$<^Rgs ztB@xNrgG6r;0LcHT^DJi#z%4b9Esh>fw>zyvkp%J=WvXQG;)FK zkimO|{x$$n9&fI^%c1#?#Z0cT&rsJ1K=-a~GEf8xD8G1sIxSPvd!4XO#d{dGI6#K8;*_3Z_&1U;y?@xCecG~`h?u$z9T%);Ek1C<8x)P@`row$f5L$_^mdmS3w8K^`v%U${l0zh*eFlOI_v z-)Ibeuk(CZ6%ZYv*;MquJ|(Fl>Gc3{uUX2`;-7Q=U)IK)fBr?rv$b3b@NM!}r9xeX zh);uCu3Gjbefik1niyx*n)Q+%_A`CTUAN$FYvmI!p+@zZ}U#D()I#DjoSd_2Z_Dd zz>ZfD%S)-#L@1IN6N`3f%y#B2qBy0Xf|C4|`8LVyx_3y=#Ab)5+@r@)*W-WKGx6=mJcBIlxO{WF*=4i$flH76THp2R_b($CkN*Ck zh!EP21+3vRbmbJz_lPc#XwGwikmWu&F&{56F%pz&+1VZJX4*JFtf5BaW!n1H z(~N@4!NMOy!Yqqxk>|JaNfUL_QIbdb`GOVh<%S7TURL*;WQ*>kx1?aGvY)KU72gB7 z(cozL1G{*>iwIgkR>H(}92X)AeoP%yT&>6R3zCrF>aT{di{S2lus})rE4jfW^UIUp(!_>Y*=u-pT&w*mwaC$ z6aI40@0MA~z$@_uQK^Cgs*eGh%q;69QPH0Rhj=($NjG$b(-ySV#ggBC7Oe78+>Igg z9^~;iSmlj`ISPa;0T=IauuI3}+2PAT_QnP=YKEp->aMFG7=`|-+~MllM+a!=QTYc!wGD2|29aOeY$gr_=ST4$>s#Y_tvJ_ zjXwu7h}F3fkGMgGH7XV1F()En@sH(M4@{%&YV^4UiP!v_N)SNS zpJ=Q2C1IY8V&4_?{oDujzE%ue0CN`H4ahj7vy1Lqj=*rL142ekxg3q1aBbZ$0OObH zAC6syp%K8HmdABh!_Vc*fon#%b7G0jsD(Q;+`l3|JOWH4VJO-)*o-OJ~tnIgLXS>zncQ@%zIfv??!761Tp73y|*AYKts7J0nl zXkNx#|A!!=eO^kP=vYlTsL(oZiSlcMJ0{#Y_jjFdoE@}Cp%Y7#ANW@93<*9G+x*v3 zPv7uH`lp6_o=|mdo%O7-!`>{Hi4`fH|K(elMh8&B{8z334<g zzW$CiowAPjDKk|66w{>wz@1tjDSiK^Gf!G8x-{Z%zKyu|RZ2AH|1ZFYtR3!$h%nYS z%&&Iq#@iPaxaw8nSslPT$az3=kXzhz)s}#9sQUNx6fzn2rb`Mz>DE&!aY z@lQ#*Q&V%(A_p`Z2vd#Z7H&do6Tuq?vG+~ZB>kIk%1Pl&q>c~O!)Mt4qKAm>bS zA9X8j6vW=XAma#HNI7rX*;YDcLeOYuH%Px!Ic4ne&y08^M(ab@R&|rvyX#A*gI~~t z_}zJ7QTz4Ut5HV~_VP>kK>8sl6ZT&f~ z>&*qF^^-xud`Bh-L8U{8_92WFPptoSh6-KGtCtydR8$y?Rx8`RT?XPEU4d3*I{uem zzm*Cml@%J0N$>Lx@8_#8_FAipl^9eWsI!@cu6kIqmq346Tj>k5>h?omqbaib4wYq? z!0yUzAJI8y+a1sYE?Jbiz;|&ee9ZWC78MdPPp)ULuMWo(R7_$++2S7>AJ=bvcM>CqJ922QvWgb5ly{}>V9NURxmvuL5eqraMohK4R`Db zPv?W;B$z+2*t{C>G?7-knW-ptzDSC!$fyoG3)Zr74dOIzF?13dp04?HAQNc-C>}Jg zdL5+f`Vzmj*AtM95;SVNQ&g0xs15RDr{`3s0%vCgRH*QDoV5K)z%``b3L7@37cw}+ zRJ;#k=zbqseMJUUX%B`%B4PXxtvm7zZ>T3VF9u7ZnemmMRbKq~7*t*zE-Hct_M11h z`e#IbxLuwb8>0pX^unexUmAA9ZPM*;ZL{&lI6U!oGKF zh>>ZV^y)YVy>MI!HG-BX;$AMasop+8V6%!5dDqzw`lo~Y%%14Q-FI%Ns49%ATUz&zZbos?0Vee1Q=2=-+$1ZN!-s}q!e>5;B5tdh{%^c7KGgo= zDpDG}`HZN^LEd(6M~jU~f3E!Q1u`E7Xlqu+e*vDnap!I|`7QE3+kMvSjhYeoT_w{% zy6}6nxm=%L>Q4EzOn%u-k}`tnYjtYRTG##MRm5FpCsXL}DaGjjYI8BBDEgooI6A(8 zP!*T-6ar!T>v)ulR9#FI-|7aUNo|*165@3Tx~@{<8dLsKBBFzwI{>!|QXEqI2#_SXCs9Wi@qz<0Mo$rw2Slk<6pCe& zJV1^4q_k!07=OVOV-RNirzNe(zCH@us+I zJ#Z$Z6t4mp$7xYV-7fS+l6|MtN%%UWB_UI3(!3Uc;05&I53 z%SQ91tljDX{T&c(r)KqckHK7{y@^y$bNTg?Q#nM#5k~=0-;%`!IFaVj{Hz0+@B(Td zOi9m|Tx1}`h^Qz^nzZLxSwrJLbU1c7syck!6#y@NOZzhzOS2HI7iBup?KTsWJwiQ( z7oo!UB;2_!7!G!Xq-CE^olTTSUt^m-kg%OSn?j?{(6}CU=Spw42K_MA;lyjoqz;Io0UB<_SpPccGB??CyG+6C9@ghQ7 z(QT+=^_lohq6dha&})eHU0$*56ZVR|Io$yu`Cl<)(?1L1z*3aPK=NWP=@9---S@d_ z5ncp86{BGnugikqqY_HEq2L8c{`PYMYm7)>ludQjf8&UTrHTF9cd5b3{oBHvz{^g= z>9DRewZ^picY=4F!)v)zaFvW5l9y7pg5H0Jl> zunQV}$!=^yx5FrQYt8sp^=c2(Fx(dyRfwhP>i+sm6WcR z&(v_!8{I5N75i!eCv|Ww?pqV-H3imM{4h^x;2v-L9jEe6iV?#?Awdl!mfeOm|wVa0TFQp&oXz_GfZ4P-N?ZDtSjDXyx8aAXaf$c^HSyM4} zRr96=gW&(P0KqW1$bN~7m$h`OtjK~-d)W<2OaE1tRv^G|z#i2&cida%!ATbEr#&&0 zoJ&g=f~gE#B0;Sj!Jj*8+!8AtC0bWSxyH9>z~Ug>?n%OZD^L@-OC?8hFLD2>OlZ};vQQ0RcpJ~TpiZjzVA?a{2G7nlHm)( z%TnDZ_IB^(*-Cobuou$|_xm5mQ6H~AMa&QfO~|VezJa>Aspl`12WC|%@Zt%pf2K8= zZ>)0*v>EM`bZhXxI(knei^FaibMl|60~nU2SGut45-Kix#Gf=_#`<(qO=qS?dwmLE zLonEW4Lido7$ZT011l3HQO=|ZU3X)wmbcXZkE!X|lbG+^XJx`9-lvfEg-LlmfYMDf z*Sk@a>6IXzt=AO|f$f7R-thEX!_8&}ojSi9v*w1SGLkJQi~mH=gbi4Z7Va%Ga5`^u zx%GFxxi32h75Z|K9BI;FKX@;@@HgD3CMG%{?nS;`wTdt%@A7OJkmP9fX9PFpC*Qlo zdkUtPf#&Cu9{BzUURkNKweiF&!x|^@Ro0e?W~{kXdA|cBjnJ;^mKKj#;u1>=)?;lq)FS)8cV&WRHO!}2 z5J62{4S27zMsrC6sUGg*`k2_&=pnz8+@rN!Ks;l02xR&%2;#I-DZlTa=p^)r(zO?6 zDq$|dP+4EVwi4W5{EpxjEScBy2#&4dKI(-RDQ8zw#3|7iYb2bSARg2cL7`aul}sL| zKd?M@$0aH*^Xj?G&kG|uDRp^c#I$A8bRqM)wfiFG0oh2z&&YAt%})FCs}t*=Kg8># zGa-r>!m6%Wet7|6Fw31oS8{b(y{}Dw@VVmX;qW53f)_p)D|&O&PMzoqUB!a^B5r0( zZe7E|^4g@S5ZiZCg-sMd5{AKl5%rm?Q!1v(($}pMv7=P>r8Z&${Z}xN1sv|6$gtZh{Ye4X@f?e z9D3=}ij-bYU4QfjW40!Tba~rmCi+&Mw=P z4V@j^4ihq!^4!$oW6JMBt27;j95AwskN|wGh=xsy-KqDvdU$!i7`QrS7T^0!>`3u9 z$OSfn9CokNHqlGHq{+^9X?#omRZ(l65{|0#oj?1#TwQ4Qw=mvdw0M0;jt(m7rm3yJ zHYxl=7G0uc@^VmDNR(){b%*)W+dv|ooVU@8UJW0s@Vn(>JiuT*$nmGoUpIAXY&SBp z+dyk8qiGm6aV!f!hbFERW%R=jrWIAW&EEn)m4xp0)P2WR|GGYc%ia|o$m@m^qcu55 zJw2O8>J9F$KZK+VqKeH{BF#^>w*w&5i_Q;@ytXEaMmmMH{3fo0mJdgpsxbmmlk_M{K`elG7V?qQYj*T~80?s(_*;_qy12@A}Yg zo!_tg;kD&{>y12%DX~B8J236)`G~0fqn|PEP~mtYP1N4_dx1~-#*R#-r&VpB%o+N} zJIbLVZT-XlV)E~>BG`PauUsQ=?|kBv*zodmHt)C*e_%F7f8$nWA}KJ!lbg#YJ>ac@ zYTjp_rnRdZvr!PNCnx^Bd&HlBeuSi5<8?L*Hxa2VzX zsJ8EMlg8ZxQb~ldk!Yn=8ynDwB8aR*+`RP`U|uwF{s_P1g8QVgw!0)RdFdSLF{kba zG-xtI^t!KG1LbmUn}Iu~!W7wO%{J%Sb!e~$Yx9RymL&{-3AlzXH?{|BX8{GO=>h#Y z%@Bv5NpF9bFceC}361*`Q!H9z`s7~`T)uIP2SM2TH;)xN1YUpq^Ci4|>;7<{ll6QK zV}(nK%S-DOxG&98PVl)|af3MTpAxyVDsg6wNnh)*a*Dnt(=|#=m|=_O)x|5+_>sg- znW7Lda*77oS{b)sN*k zI;H64=v*ta;TlCjiKO57b*2ZCv*f_){Vg*-x;9c`vr~&vw;N8+m2zT7Uj=<9=nMw7emfCo=hQtk{V1}7 zHJPUrZO0v05I>KK>iq&*2vP9u+^Faj<_+>L>#QEn_%Q z>bsY7Am)7o%CIf**$LJ1;FMt01~lepBu=Sq)&F($?mu#y}`xfLhnMvA*t@MPtbJvJ6MHYS>@5 zc%6h9^`elI?Hk`j035e3=nLGRk4v?T9bva6Phk5I)R#3uuo6_#)O9%V(9Y%^i8`pA zvgg~+Hx=%PE}7KSpx0ieFJh~C5g=8>4Zw+-f8hHS!Y1zxC#yf&!ad_dkDKBB8fkq(y;qe zphY2mo9sH0ng$~&K7JVfU#}2evM87sU@UZA1LTj?Rp^`Q=TtsK(L~80DA8l zWqrAVxQ>_n>EmB7yl*|%*s|py9QD|Kc+0=MWglEE!u!3;d(z+zde|nW=O^aNlF7C( zObt7xEma%mGSTMpuDczCMVi76_p~Kcx2dSn1dXNGAB8#&>n^io9_mt9RUFBsm8<#S zz-kd$jD&g1y}WT@n|a{NjqkL?B9WFidEBoWHVdPZUB!+?d@E&EU615G>zd(T^SfyIo1b7h;ABl*mSk9vzvnX`?~6dD4X=N*w?g zosItv9zxJ4cJli@5O_X!FjrQF22DZY#^2> z^U8c;nL~-w?QP~)moTt$xPpfBuyW5wUnaA=P;K@3>Re|-_@;p&XaKmACo?inP8VQO z`nS&<M+Ze1jV7 z!%Y+=S;E%k=qY-8dhN&$OWiivH`|Z2zzd#rIZ0e6?nm6uL8Ufxa`~2b7=cS4RA^8O zRV|k?c~S=M&jilRna>OPC7n>7fXfZ(%x=+3<`{su@!xR(Sp9k*Rnb-IzZEhgFS%i+ z?mtFlXKJ})HPHn84uYAznZaf-63-LkL&bQa&(|@ zSc>@t${QD9ZH}sUC2F<>Qa%BbKBe<>TjnwYHV`&I9XWUDr`Z{4q2joPyTphh!c0IL z9j}G`H`=*a2;spcUqqyphuAJcJ5+H}OhQxrs<*7z-cr$bTReI>D$=J1H*-{RCtfx#q5R1$x8s3|lC5gJhshqLXk7iXT@+q^guV+?;M%e$+ zdMC3C_LU8TB>EF%PLCNrJ68tzfAwrh{>n5?uhv=IWaexKLt$2bq+9*b)G5A>=G}LC z-EpLbrGbDqBulXuP>90nc3mWc<)7iv&Lv+M7OYMfXg%eF<^+%fLvO-@9yv{^+3PJZ zf32uMe7ctFY(|1!zo_J(lw}E_O}^#CaT#4Yg(9ienHM~? z9BnM+%RTFoP*OmU7@X-j;%!rAixXZv@4|^OeI6S>VvVE@Ut>Lu;IU4M&i(q(<%Rn+ zu6uwa%}Tq?oV*kX0*HkCc8i^57;P>v@WwHGr!x1i_KwYw`coMqs-R*W>9d{qP&yWB z*c_lk^{O`Zu7enyXP3=JeuuHsQq!sVkbNjJFd%-pvcDU5P3Ct3hc6dYQp9U+s;KiI ztw)1Zkc2h66LL4?&QZ1;ef@UuKKXyg4lheyJLP$X_wO5ukGC5JA7=Ef{VF(3$%=T% z4v_w&5{oZ42T-&mtH#+Rgs~$F@4nHncTV|ypYqoQq(^sz#MU$;!Z0RRns?lK)wr_5 zgs(Gc<8MsKMnrfA%K23_r@z-xonP;3$!B3H4pk_T*~=^5UQ2CPFV1xJotl@=NiW3PA??ey#;#2kNbp{+>l{z3Za! zaXL^jdfw(BvU*(0IVQZr;@#`z}N+Xw$`G-|rvdDTfcE55@f%uq|GUxBAg!5Z=%i6H5~?Gj3#8jJG?@ zczmrs#?N%-Rv<<5gRRTr4fW^R*_})f7rPlHPUHen>x8Ji=|FIZq^K}5d~`U)#7T?T zWiwUjLtfMRqibx}h@o9=gBdCF9XYt(>dKC2#)oll{#urA*AZRm%dYvMVw_dk7uUu{ z(qV<-7xa=K>R@EvqRI|%1Ye%?^l?^ulH$z)U5%^8c8dd9yZqKzM$Ip(L()%|$hpnq zHxgVo_&y$mHkCvH(T1N_bu~;B!gkWX9YmH*gqX&LPBAm>N7&EiUSfJH(^x-sapwY2 z%)LyUxzI}K-rShV@fo9iOg))Am!sgt8S`EKeqO#Ot!O*Ns|(fB&#kt6GOjE~Bw!z# zr(x*A=b8|`6QG8!s_uJ{yEAD`-B`;(w@&G#6;s`JwrRfyX(s(V{z;#A+10lF=95<| zys8PfMt%8qelx;6$I}ay(aX8CIr+U2@i$2$gGjT+-%byc74{IXM$NK|BFM1XlSu_# z4gG;hy(E+Kn@(DfnY5;)prL@rK)Sa6Ta%++#QTz-}p!G1SnZuVK`53!ueEiss44WWEU#5yg))wIfpZ#s^ z``Iq&XdoCagP?hLsu7f?u14}(h9BmfmC(l6EFY5i`_?<0q+U12fI#Cj^8uWzUbS4_ zayW7CaCvNo_v(5ck84XwR|IX+^@d!D^+(s2 zIPCm$mxnoFhgax2wbMVzSzK zaI{#qoI+TCRay3rEs{Kg^0mdtgvcvGX%DN-iw(F^7iQ*vm%dppO}9*P{OP2{^|nyV zxB{fVtO3$$U>#^7g)sLwb%&z-DDNyL)wbT^dyL>S)5X&06f&^;*O>-fU?GqaKE;*> z!v?QUG&v`Kc;@(Yi$DBAjcG|2#prG&QD9*H%0i0Hr0&z5-r&!D8Jtz}HQ9`d>uK6| zUF&8*UyApy>T5i2qf@`SFY{>m8RKr;s}C~|bTwkXJC_bX-`i-(N?d=9PJY$fRlF?9 ziTL5B}V@$9vgtFrQFK&j^$M@G6+RLG$WSPe633=F5AW$J95k*}}kMeTDV@8b5oCvKuo4aE3?zF0LddPNZdL^p+jBvekxzZ5X8=V~! zl{&HgP*ovJH(>ImePV6v5svd=P9)bF!;r)mw?X_iPQZyJ=}N}4km^W{4|tn8tK`BB z^s0l!mdr6F@v(G>_7SRQDh!tmZJsJ3)k2+tp`is_1Nz{~nWw9^OyhFYXhe#`dETUn znMjLW6+S#<>E~MV+0=0Q~zOVgz=q13X~Xk!A1f6sb_)*m-DP3X(zrO57a&1K#UBH?5k+5U6T`F8n6S@d%nAOf$`UN(QftN@d55I-f3r-4z zS#VB-doy!RMOTCHP?SHjANOsevNB3-NK3Y7>DSNQ9YLYApE*HtrHXb_(N5=bSC-!k zf{Zw#Px6e72lnSm*MESfFO*rr7{gMoWNeQ@p14U;sW7Yzi!e2Z!D^7=H%3AxWixqQ)|PW~ z%bzHX;1MNn+}Dg0*cozvGk46v1g4ZP!MgOh&s?b6S1EaENJ4gM!t`gwxIX22;+lKZ zvJ5$x8#UR&!#3!JB)|4|M}6ysw=iu3x@)7h{RPViN*5k$`jnmLDc-t*wI zk)qmG--D0m+s{6sSUw}ekbN>|(Dvc}EUdM}y$9S#G2?J!GJC(R!HmL-8_Biz6`uCq zTZs5xWf$Q_WH0T7-FPqa-D#(bqe7BR^;5PZzYln1XIfe6HN1PgP?%Wod}pNodggJ+ z14rn#J31l+jZp@HvH8on#798>q11E^i)XdrHdOsJbTwG4<8a270W8hoM_kV5u4w9| zsC*fvlsj)NG}AI6%18Ypq87T1gTK+7(aVxvcLhoR(cf2&_s)2C-M{u{DnqMDxyIt~ z_GkJ2{>Qo+hVJ8Co6l4-;GJL|tSN!@<1aF4IS)OTL|cE#?w&q%$4comVrx~VR8(e5Mm9x8K5s7LBmb2q8)$zER{!p~0c_bv zBIqgQJ6rFXskv~k)}jQxQ6+RTJaicD)R0Y=&s|SNw83k99l>k3ucLby$=k#tLcA=2 zkVF#w%f?AJ{ybtpmB zjY&Lgrc9M?sDzk`<$|}H8eVGi1=}BSWV6!}I#o(xuWgdREs{IzS#%#WaF-Rl-ZzF* zsxeN<2RZ2{hy2wINzSP4DFkPiYj|h^HNS;_S2TP) zPXySr(D^3d4fl?S`C7LAE@O_=@E$iG9)Dkd zbM5}exmYI2%Q4vVVOxdQta{uigfA0K*{N4pVx)pZ(K=<)J%cu=_M@XqfxrMP#9~py0H(s&dT{Fluw_(qN3C5(-$! zE62g-FHe}cGlX&U8P?ONtWxaa!d!>43bbkKAuMISN!-}JJ@f9ty!|CnQ~36ct{dEh z*7q4V9B%#O`8cl2NSEi}k6F(G^V#WYy5|vX+~%=z#(W>M zHQ50dz@A}78UH5q$P<`lC;w6pJs{nBE40 zKHl!lUiGjo=BBjYDSmd!{Joiw1F+l%mJ#EyRk1H;L6BwBFzI00+q119XdaSgbV_Wf zP4(;9;`EP=AmaXWM*z94`=YDaTT8KmVuovnAcqnjX(r%vgx&^kj)SR71y}i(uE>T6qwa4L^OXsQtMRDsMQr7v}1}Y zKyC=5Z+GXeFq@}ct9WFoS77c`u`Bow`nsQ?qK2`=af)aShdO*uWRHkr8I*&gZX=>K zD{1FV?WAmae(-t%g}9&p>Kk&N(cF`Neqi>5Tp*tpMT&CS7=8WYt08qh7XUcddy$4o z(eD$kBQJf0{?Y_$u~feryvZYj%!yYk+f31dMZ`yqDj(d(d8FaOGPNW?ye%LSv=G`M zUj0(*Mc(DJbw}b6r4gWVNz;USAu>dtP~R!!rYt@DaqtVVTLmP9=a1AjL)XN<+`a^N zWRZGI48(?itpan@5)JN~&2ti`B{}(Btlc^o!)#MDE3|!Wp{pdXr>~BX4?jwlPnX6? ziw?V^xe|q<+h~9&zkO`6Bj@Vqg0E5rjD3=-ZqAvRkM6Ku$6lDRnM7M?bv)VRFd8R2 z(zzWfbV@`Vt&Ku28o8Bjc<1DSMTGDb_)_)pw~Qr(1@v`jD&v_7QgWJKISefhvVR`) zw|ZEUVc18D=)BUSUG?$EXR$8AFchOqy~zm`raG&+hh<`*9VN{9gFbgWsC-d?$ZeZO z>b-HY_Mb7uQ<5pSd1s&Vew;Bj@I^QxW|)f|ex4*Z_q_ePY>#~Vt1f1;1o#Q_4FJvV1+A@jiJSyDm2#LRyFCX3j^5buUaovhVBzl2^A|Is z#gZn8%FEM1DI_hiUL=4BvjD%RLwa=Cz1k;ZU>=UmL_S6hlN_sZP{bJjv=M$*#23LN z{HiQ7Pp<6-oVRJsb5=iGMsX|QfX|y^Qo%$F&O{RGS6q!l#TeuhS_Su%`Po(O7jHZK zCc&q-F%Uy^6dl=0Y(7VZ7ct}9WzSM{Gnx2?+2+UhgljJe(TR4(RE$(J;xdu_F|TfF zq^;q?t7qoW_LEgiq{sVxyi3LCYL0xrOEz2p{okVEZh2Fk{F=;J1Vc-a2gc%BD zMzGGlHurFnG=03I%p9FOhy{6+qRPi=2Q%eW@H#lhUwm+JzNRV+j}}52O9j^lE+NOS zCTzfT8P)}G*G&tdt z`oG##MM&jWDo$QEzaqfYeY3QW(H0D5Xi_OxL%vCCTrQv1Ks>LjPWY7`)k4n^WOS`5 zL50KwE)QK^1!g9%Z@^gYUvYiuln&-_ukpwAkq={V;N}zU6!zK=WTZzp?m>*OQNQ?M zh#V1}R6FWA zcsh-Ea%{G!?Jw7E_g1|BB#-AR05#YluNTW|=cuv<{izjQvgGM<^uKa68VxPF4vP#P zo7$XRM3S_vBhST8D}qpb9|Z#)N}=6r?SXrP-QD~qe7%y5XHn5t?QX3(jii`KwF`cF zYw{(N-qm{y?xQ39Qd6}`iE{MgAab~daM9!S3|0#xf8+~*W{vPVBKk0LY zlLqnUEW})r>ukq&2b<=UgR}c9x8a$(hq-v*OFApCk~-dvzPQl64sAX28*HQ(s8Hc1 zo_Z#gD?2mwjzteOEnob*5u^6YXjD!=W%C-?CHeaLuN4cNZ_9!Y=rMJuxz*hbdUc4C z_~rQDhy}zX56YOVn|vqf;A=QIEL+T6wV)e-Y=x8B+@omucldq%jBjvBktI!H?ySMh zJ>Fm(GjqKNQ2w&@FJ{n#_pBdG1kR@lLD|K^L);S!&Ic2?2v_P1M$gmv*9COUDkBjc zwY|3CFwb^cSoIf?R650Rrsi|+pORoB@9HMpV)8qi6;Xdi!d~&YtEC(memHzL>3Gh| zp5@PWo@OPuviM`0)U*g9KcFYU7=HYff^q`jUOkjy9rs38@;rmI7K!>2#}!0&)UoKO z5L!uYa^xX#KaM2;*%<>coR0DohNXnUNJZ?DSMcai4;HdPjYN4?X5-b1$TG6VtUq+0 z!wV$C^-&g9H04?%^n0&zowTk%DLt1?rV4BUe48+z zO!u%-_B5W$b{t0AvlC(`?wX&zTo-D$_|D}C_sGaTmL9#pL;X3vX|pJH>X&kLqOmC` zG3@iJ(uv6$OX)sq2zp8LP9QaaWgqleC}EIJz$MO4dwVcl+N>NXf#^s=rg+1>F&u-j zAgaa{2LR)0Dg1S9DhhLHz|frKTEaV4;mG--@;gbm?aj#CWSd~!)GCYUm6O1@_DJJv z3g$8A_rK7|h?wU82+z8zEig^*Iv!y23*I7lu>Ql<-Y0Kaj`d{U-JUx;j(s^{;|x-U zu0$36SZC^AJZ;J$X(ZO)7#9ngm7!}x4l)5~esm*E>vx7hW^3uXoQ*;Uy9WNNpRG*3Zrk-xhA> zdnqK}>2NGk{({~E5=GapRjh*g!1PY$mKH4^^nzVa5ZQzailT1~iQFxliyWiVDY<7? z7{t4EGOKJh<;y=uK3CJGB5fO{UY&;}5CJFD6r{(IjhuT4UNL8ppTlLOOkNh-1skn6 zG)>;@FLO(W&hteC95C0Z3cm>1Xn-!Yy1;LRVEB35_Ztt6gf8VEG1~U`)4p zRcous$V5y+<*Ju!Wd|HUfTR=~q4zm|V=;4uVsaxyn3OxoL(%L2(1srcMr|AP(SSDY z5_LLT=6ZZ`)wX;=GAX3@7hd9?=_{c*9$lKl%rJ;AamQVxc?2UWzjTg|!&~(I?HL2x zH?)Y!$o_b0G8Sf|=!(CYl#)$3t;KjiBM^PHGHm*Rw{&7qqr=#8W4RfQn*qPW7vDUF z%IbdWjpSGgos4+ZizIc1S}H1vuNy zDKWsoRF8H?TGP%wnx&9?W?v{~{$<~f%kBos!O@H>T=%b7?dE9C8tj@(?Q=Xx)@tj< zSziYJ`USs5L53$7q$L?DiKJyG5%@;evyimpTiup^-WPb_z=kG?h`Sw_2sR`Pu}z~Pv5X7%IQp0Ouv`V|C^5@E2`1sdl{Rk0yz47*Xrb;9)Gg%PIfwTB67GX^&k z8n(+uJMBNdWO+wd)ifkJ-3czcXO^e>h$Fj17T#b6R3 zR@U@>ahqQLDJN!;|-)$SLAzjeI{HZ)u$tpN_`yAm)_5S8Rk?Je_getaYR|`#U#IA;*MM& z;nDK=pE3WI*1OIkGxVivndN`b7y3ng5Q038h`vf@HUNfFf3xb*#p+EU$SfryOv*1H z*d^oH)sRE-4G&xv^)XHw26&*-mS0)FDh@L(xQkVA!Oh@8NxHj^2+{PVv$ZxKL{|B| z+j{K7zZ6(7G@-ceK1?)wSrVGR*eDel0cf-NYo6#^1>0ZsYOZ+JHva;m4x?G~<6>xU zReV@w_Kb0ln%Rx_dNbtRZ{Yb18T&aS6FKA+q(e2>U7*E&liS=gav&rvFv(glZ1|3C zO<_*bj)fQ4xb(&5N{~{hE-WW7w4~fIF`sZ{(1gVHJe0vC1Yv!ALR>`iymJ!G_L=lx z*H9ZpdMNpsmN^ym4p&!ajzDfQ)V1{$U+dNkNIX|OId2Ud3EG4&$*9}O4FQy&Lnl+; zxNF)nD$2^}Oo|6%{=zL+5#onMI&qsb4r6~T#QFaUG3$*{D2I+@7!lRh(G0%;Uj`g9L^uhQ+ zpOvaR?u))P6Lo#&voG61iBYVvMKzG(w%;XdEi!8os~;IGdcyLV>K%=gwY4t2{mom; zJQfv^Gum`=?V;l9%4IBUb7EoVo0*{PHPia4xD{jm}B^1tXF zvoh5GB{JL+S?KrNTnV5|U-ii`JwPNMS%dPvkp*L2EnNohUM%qro?(_Aky%Z(bo1dhDhKzWHj zae9Nb0~@I=p5i@&Gr4|CYrW`~HoMn7LBFH+m%)VLnQ=%GG)ubY4eBsNh-L5`q z&P?pjwMO>>Zb5=0b4mv>ihC{;{=jiJF6B_DRZu(sRmb1d?E}_`(u|GI z8AAyP9wb+0%kwOoNYL{E9tx+ES?{CqZ0UJt>eTp|q=C^-O7c6W5%hjKb9!c*fezzk zEM>ppq+Znc5Oj1&*slH~T%T5YLdtakMr2r^_QoN41b1U~GIDW5YPX2gk8VqcN~xUR zKbAw<0tDwB<()ARddA#pfFuA>t_f)h2c3y|7bP;Z)abW|aR?8XB%0;C#e+#gRH#r9 zI$&tT^z0$idhY!LuJ_wIT)+j0)t9crrP#m!FNBA_FCJzTN*{-=dRMvqudNv!ZNwZl zQ>c%0)#%tvcbC^Bm3QBSU;?0psdDM$ac;=%q&rf8Ud8OG0}SRZ;(m<{dl-84B_XZ? z=o4k#%{6?SY8iY}%-C1teATza3zGAVQsYPNXmNw<$cCid(w+>{9f<~-s=){L3_U)n zjugm`cX1dqqle}`Yz0MY(f+cG#@?nfGa;^hD_7@zwH(HRL`WL`5@IWc^YMk=S@m!{ z(t5i?t#k8VqCGN8GAZi3GIsrZHLBFn2=&Jecrtzc9dR1aE5QCvDMuHTf7EHz7olFX zc@iP0125v;B=Q=%a*5oPy>N${@dSd`ph|tLp+1NvfT6AKUk!Sw_1|tU8-Q6#w@e1* z$+{ZrwbjZkd*iyT+S2Sll^wO!CA7P+u{SUn{HDB%86_O0l#pVO{ ztlrz>eC%Mw`_iHG;(rFiY*2s@9_Wou|E8_`L8ML|Q#T%4oKxjrHnt%YxpnrcEEuXV zT!n92nN0uq=JUd?-D0m9q)rm7bivMrk`JDat?(c`)ihQhjQEl zVx3WX>-BK49aL9C!;|>ZS5A#^gn}A=W2`26awDjp@?eo;&7bvVE95Jif=(sf*Clgp z7XwkJOY|wlKQriLPWO)J@rD941ee}Mtj$;2BMWk)6F*!R8qKqR;)>if-KgSuinJ0h z+hZWDU#V@ljtGD4WeXeu0f}q1Yl*7-Gt#Yb-DY=%3f4`wJ3$>RrSoL6OEV-*RXX(K zyD^t+oi~Fto_;SK;{NC#)Z=^cgNSi*IYzfi9j+OLe?>(8aVB#^IZRGnReZf)F1-0G zt4r>#)cXbRO`QN{gq+o=VI`MCOEQ6;H_?w($%M%8eIaegoG}b7W!-OPr7_XTn8nIv zbKJddra5`NailW4W9}`z8GB=%0*(QT#5etizm_jU+cBXnZT;|rsahqe_80uVnyxRW zdTYE_ky`m7@F1vFsy3wrM>qE~C&=gI`L_S0l;WRok5H_PdzI^+1k9%pAJZT^ayY3J zSdF1E*&`SS^;IG7L*kwwhAGWGorXmO4pS%3R=TfL&=HRYVs7@-+%4ojIX&i1H`TMV z=tCcOm;RQEZL60Blq|+ zf+B`B6|H-&w8ItgOJ0}=hw)a6B;DMLD(xe_ofTj_JBzBt5yb9pf>a1^S0MC0{IA;Z z8>*y@E|hOlZYL~6Mm=^pUc%kF!2gtey8|Oh)v7ax<99qCXa%e|zQ+D^7$LfjO? z2tXz?9yeeI^sbAf>s)xZLx^LWkgwIQLQ!SeM!IYI zHAsl-e!*wFAbE>uzyXA3#=!C$B8ULA5^Mdje{^M$KcWP7>;L@g|IG)B(X6P~?Y(yE zdCK2wYGzO0-Oq}>@G0pESuNik^2^*m^J-aH$ESO+l9IEeHSdWF@Jxx^j;wIoQ!KZM zj0_h$ZY4gOqhWQqUi_A8hy_RybkD)QSFihWYW+n(62+u!U0~Gg)EHl4VfYA;I&iC* z?e)&}`xk)5)A(Gcu`{I-lGd*YxmG)8p_-i8z{j-awVK=gO%X1#uf{j#kYs01=kbDiDMvxfdbQK;prRGH#$^A*j%nZByQZceqnzR zseRL+^+dt&8{uRdDv*oNxk+v`F`YuS(dv4~y$9&&K)L5hb3uqhh&|lF4p~p$a!-CN z^CrrEbO9uf6KdNvD>^GAR}kF8V8t$9ao}Kj(Mn@~X*tc{m+R z?n7*b{WMxa=Xw7wj-SBO?(F{j`k3R}=WpAfy@-r)M-csDAclb*_b)a4Y=%>R71!Gh zilOTNa{W)hi2Bo7m*kI=CuKy42rdk7ogt(lkduf4F2DSJlj5U9#j7La2d#XI2&yKn zy2)*AJBr-`Z)!;Rl0}8hYr#k+Pze?!-(DpXfyAZ|2}5uS-KbBBBplMA3h7x~x|Z52 z2D;$T#Uf=tM|`#6uX^oF&Kl|GRO5X)?HB{5y<&jC#A$O?w+~uL*?{Ur~s#EdT1QkU{q9ZZ>B^^;c+Oey)Q1rFS#DB*aMtHk=X(}vT|&~TC1815hPiCPY5~B4*@MfcPt}a{ zd1;L?NpF=m_oztNBJOv zAd&ko@abuR5|v4Tc?-#XaT$=)`g*`ji?ibm{?aAjCxVYIU?h1&VXdyaaRFa3WHbX| z@v!fBO`<~$7jm)y;0#}|=ZP!dF7B_0K0Ro@8G(HUH{^H$W)!2j6+K%OsJZa$$?t!; zPPPXFiAsfnQ1P$(4dlUmxAgyIIsz~o)+dpeRV`rHg8li&i8!JZKgy=qxfA#VHd@_77bkM_ZM zlz9M7dit0B9+0e7nQZ&GetgOQxN~XVc3C)K%z&?h?SXxCNo4;}H(vtWWdecXg|%}#iZsB}})j*j>dH;r_@b(%BzXD$^stzIc?EHuDGGt8E$AGKbCEog z@91uYT>+0Zsz|1mCP42Yo-K9GSMIOBGD8fX6INn$4g4(X1GqOd8#i9LD!nHn$8M+^ zXOgxiCA0>1%;-Nj|5oNYhwCx(+iSb01%`b8YmD@uF(UQ<6Bi3NHhdYwZ)bLAi)+xE zKvp6yxQmjo1=6ubd>viYctuDUZ~S5JYsT9~o0$PV3Q$n3xFCDB=YMV9KBlEtUI}Tm_|L_ErHQqheq#;yqc2PDF+11|MXQ z7Pgwf885dhzF*eE82DKWckVJgCZ$7ki~+wzqUHXlc+({z^^6;CXBu1|C!`OmNGage zI(NjZ!T~gRrn;G~-6!=fbb_goj~h+(!z+R`|N_kPy>A}L72!269W4z0RykHZcN61pXJRvKQ^^YMGra1QJ zvPi)72=pUL^djQl`>j)f;baKU&!@9@4n`jujrj(12E(B1@=cq|xq*)Cb@tV^D*+9s z20S}QR+fp@838T=lbU~JuUiLeG4A8KYZl6{H$iHx_A+AY*gWiM!f+p+5xh`)e=KGn zrja=j_Y(Y7w`UEk$?WQnGij!lL_p=}_3&?{=s)aB;gk*^=6(k|FkzZ;o&AC1EeH9~ z8DMt2VOHJnRSOi@fJx9q`sV;=(wgvuNMT0SVHIG0yeGsDG(S!>^$YdthJ?&VjZ#Vt) z%*hh%e)}RWlVk6G>^xd%-ep}w=c_n~gZdUHF03#s-S3WsdJ&EGb$axJ6@x@ktG<)4 zS+CyH;h@*UcH}+k(+QIdjW^!d@03f3j#O@Z^g??@shysop7T_S!)l<*@3C^tt#->h zBsChjeEVC^wdUfu5dlI|81XJxNKjRe@qoh z_h{Fdxv{1Pg!X?#T_CM)f3cR)S`F8*Q04I)~`JP=uu~l3ta> zJp4&q-6W>lud?20aMcFp2`x}GfHsO(f`FHExnVOncqwV<9AZzw6xWYq7==c2< zlilxs&2=Q3o(iASJcl)>;bBX{GxVa^vhF)LPDO_caJF^`Hl136vnrgOX=@H?PgF&5 z(LLzSxgJ{;Xm!=$2cSYmXSau3-C3~nq^{@MXxna;_A}%5eBmY1P%^rlzIK?f!gM5OY+KCA5zb^DjmXSls&biz5qZ ztrC^wJRN63SLEMIo>%q7u1A+1;R8wvkNjgaL449)^)DO9@3k?)GT7V*ZLT-81UHrr ztyBn|X}QRyzYqTf4Hx&+3tBQH30mJ>G&T2+H+UZggBL6PMzmsSqtbhR{4vy6I1M)P zk2>p<^L|VYKFA0+5|=&I$2Im*l98)+iH@o2KRz*DL7vkkalw(;hi4A zBWC74mkXU48ZEI)y}Cjdz3sS`@iv6ZZuN8=ZJRZ{5LZSZ6Jyn$#alSv0QLj1yOS%8 zTGDx#+x9$f{L?{X)a*M{S-Jml;JfLUTymhdf_dMsXD1CH3yGvJPiP3?>dAU*p-Bz1 zf{M2}C2DycF3X+b8iX~kpp}*#HKO!O!>=XY6L05PKWQinu<2~=lenalp;u%4Q{c#k zNT0UJrs~&i0xS$2nZ0<|wYO~~SYY$*Z&PfmUR8`nBa!pN!umo->}&GbCF`f-iPu%# zuB)DBlxA!jnhi9_FP?&V+I}Z2qRUl~7@ayWGBCGql$($uY!7gL8aiVel9s_)0N|Y% z{J!0>=vqrr-ZU?9+kd8TXuV5`Av`=BEejnD5UQ8x&ZuIo?^m+uk5gccFFW*nbQ;p* zye}8Lge^CW=ByCt#-2CZbjTUr+cF3_?+UP`XN}ySwFC9$jR6fGz5ywS{urW}@nq8Z zO05+HXZmq{>!J_ty-t8RRNLqWUeWk=GhLEY7K%_}7{j4XxuY$$end=5kVagJfRlWD z5j#wG+4LT`*&0+8Q&>x0wt6jh8P5KmioSZ-c6x2%2){#CR>emgWS%;5qZJCAG#|!n z9Oy0xE+8Yf@$jah;pvj!6XUzIv|%HDy;EG1BD=@{Wj_G)mPD zmaP`2yJ|xW8}ilqe~mZ+Q?a|*W_&UdW#1YE!w^4fk$aBUkL*)9_Dj8l3SqMu&$ETm zDm@T8*ZOG0;6w$m*z!90$svxRlYF|0A z;DQd3Ud~#b+0NaSMN9OUXH%#{Ih)Cfi5I@Ed&J5mGxm~BKDRwGie5LXCe$A+f~lo* zV(?-xa@lW{U0dQ+{(d!dl?fN>1@uy@{1FA@g?K?cuo(_{wFHElQ4B4ybTZmrhI28v zn8*$qvjRkogie!TxW;!vkHc<%(gC+~6)bz?o>@B?71#UFX$PVJbfAvrEsa7?M`f|119B+vKrx!=N`^ z@2*hOhsu?N52dHaDI6s~o0^@s*E%AFiG?;SAYVw*KVUr8k<>ZSqxR-|c`nvwof7@` z0BS9zegp)9KlS@@45U$NtxIGU8ppuZuXA_%@f8Jh)GTMa;r>C)>PN>VG@b2Z-|lg_ zf;iwM(K*F@psQw<5ht}3n;#kvcj#*b9$wpa(s4Dl$)$AXRC0Ptx(-&pi5dOL(z-|? zLYNqN2fM-$Vvq)O7Bq>B6o9cytd+M;8%b6&fMf_Dk+T@K@0;k9+6)e78+AuLZ88c`|AEJF_x-g zuf^rZdsAU(x;f>w_TjNb zcJI;6M&6l?Z!|!NO%Fj=M*6tT)Xq?kR5#w1WWS0ux|ABP#@j7A_K{%2307l6bfZPw zyg{0G3l1>PRA&V{R&V|ekv&8j8Rn#2IqrB~nUGCfbqacwz0SZ3VAY*%kYf3hOJlU( zwqqguE$z$~LD@MIBi6=06YMUOm#yh?&lEN_uW#L>X|gllx!d=w`~eF5n{qY!IodfTi3ZDJbvFRngUrYqpt2t=WuqmJg!0gTh~nM5f{~Ml z+-S61djlR6_J2PImEu8d&CO2Ia9BGykU-juHBHA-=o;hZJ-OhRvZ$Vh3$juB<}POu z+s{MNwCh9yB+X$DZ@k>hOAiZQ|9A8HW~mL%8vX?j(l^&jH9%Z^nP~hbzJog1Hq}vj z^6W1?tYqyyTc{)5zD^&e3OT4;^Xd;%qLT#Osr)#n&vE(5{HZ>=`hqSe;PcU-$Paey zA`zID`SH_lo!TuwNHB*jEXjjzl=5nprP8S-#%$o;Hu(kBlW zDK=0@64)a%VoV4T0TP>gCjLI#z|@i_f$DjX8X;On*3_*@=~5Q34bI9T;FL}T#;dlt z=*CvK1DNfz&gny--9iaTn*mVMz=A+J?^S%=a2YN{J^)~XmX;gBrm~AY=#)fLGn-_o zu<3AoThMKipL^=R3qk5<0HUFo#j_d)Y1j>6{a2SXp2cars;4Z$cPkIvg^>e$LRNV!j?wM)|RA}_;)fm}`)l@%M@K0#dgHBFd z(7%~OOn1!<)|<)jVWr}AP4QN(v8HuNaKmojL#=(o%Z==fBqv(lgn9<&9j!|*xPIw+ zZQ@N+>ov-huX}h27IgZT>m%;Q1$)QUAo0rL)EfK(?-s`(-5mB1LMuSjN5V%O%oA0r zx-ss9zoaS1WmTEvL>+IrM}NMG(~z{LpKxRPwMDrNb?3l+tIf(|sqMk2{i{d{;qsDZ zO!T8F+~Y3rDYk_KDVC0U&xfMO4r=I2V($c&`;Z@Jq=I277pxK88rMVmiMW^X^mMt^ zgfIdiOsrR#pzxA73?0|I8DUN9HQOuRdz|A8qhLY9oIpzuA~wrp}_cF!2n4MlCnSb39 zc}k9a_Rqwic+H9O0i~$p_pjadl3bMbJ)VXXQg&r0y8R5LYh z^GaVUBb$G_b>;NW*N>|#Dx|g9*?0>s%j}P|76eNKr1woCw%_NL3G?#lGWm7?^!e=;$WBEd|yin;9_FVdrAeOf5G?wpw;7VI}0zm2SATU7M@ znCh|?+oHHFWx0B*Nb9+iB z)Sfr*@=I4JFkSZWO>9t1jMt7j=WUIY+qT5HBgSYJNzIq+FLUg(>L7cakU)Y|4BUVOX&3FwEvmG zQn!`Ro|Re=(R3L>YnuW}UL?SUlDg&WGUCE?xsamfri2yAy1JS4m|fTpM&C^=ce$Q( z5=4@9X?d&ytAEK>iD+wx>siTIpYU|bkkJae)$SOy4Nq0VjakR{m%gfz7-2&y|K((e zK7j9UlQKbS`rS@gb7`gjE)JClhfE-^-`9hmnZHRE-5;rhT5)-G_5_e~))x^5JDulH?NS&f$H!GLd7k^R5iz6%s^EjoMhSWtH~ z3L_L7_dB8oGddrmW>E4p3JKgu6|vLidV7z2s>>NZ0VY4`NeYM!Ey-#>^yUQ+o5u|OHoghz2 zlhY5zcHiAH(@gl}<=pAT=*r>{9)o&3DXF6&pX14^H;x>nWNrho#DZd1Oow^>L-3{E7#alhM%kACY#vUuyuoHEa8MXv9c0f9PDc zNFyCdwW#$ck9I4Sz5K;_6^y|E@#*p}&ybC~p3ASXddRu2P4GJv zRo3&>Tnu>f+cI-x?WNLG;Gs)0M~RJxkaEdb@`oMMTm8c}nOEM8*)c6TaPJii7EJWm zKN_=JEVD7`G~@3U)Fl^57#QL5m;8#%EY=?Ke9F#zy3e~IXFO2~L(2K;r1PomBVj$m zmBwu!GKB_KRYJ~Il?mQgy#7|+oKKFWu?%B8%4Ou7<=6u1ytYR~zVsUyyEy;Vm<(<> z?)EC8A39Vl8Hkop$$dY zRMq0~gIVcTrqz)0)jfKsleoRI~o!i1bJ61SFZ z%s3iD>!T-6v!AxF;ZHR&ZoN%q@XCr>W|7kY zlB6HfpM7`IY96C`P37UhRLo?!2W0?zKMsT(>_&x3eWrC+^DE`>}@I|(5N>5p*$a1lO z^t{+C$?6O40FmvWeByn*9ET?jr209Flt&gq!BsO8H|Jf|1hX0i{iWUR@#XIBN$ zklt;W^YE5U35xv5urpz`qHtWf)-PxnZE`EY7u!X<&o8dr(%#S{IGn)2w2&;{G_XdO zyT{=xe)_R@&+yb;o^$i>Tj}!yqX5K7kUaI~}JFtQqBV zuv}U9=HhyrZ{mMG0=<~dGEawMs^{mlu}?6tma-4rdh6)x)EH^+sJ156DP zIWY-T-L#1sETJk>L-m>va=5;3*}*^CG$eMw#G|~xVrz<_gPTD1804y0CTTB@FHCaV3 z3#vwDAhaS=RTey*DFoac_m!?cqwbwcqwC^L_*tP+GNwzkKCodaR2e+qpe0w6I+b${ zk@|bT?!3>uM73m0T`fXM#N9PUm&)W(`5~Ng`h>9w&7o8-c zqrvbnk(8dZb+y9$drtxpA}XoZJ`h!umdewZXq6jy$qJ6_?g;*z_bxa?tsdLv3IIP! z$#|BdN%L%nylkhMdw;NB4f=l(>1OvnYMW)6lND~8`xC`QF& z2`3WpiS$WLs{KssPEdp%?RZ$ty+D~UyWa9uWh&p+ugqHen-8G^ktPlr3G(hzMCviy z8z)-*bu)tNyKWu_EcbFhci{aZVt6qqrQ_}?M{w3eAWts!JQ3b#q`Gx6V0_Z>L|HU7 zWF}?Ca2~&t;CBtxxOF0>6m#|@_EdG7#v6pAgP#;4X?mUJ)lZ1ffu@yxbI#OTmGLVt ztPg4wjWTKnpZp%jYfp->4{7x(R3Yhp8#vpSxmmicf+&zklsaSGo7YO=bY;kqS}r#I z`WGEz79YAF1~Dp|^~1L~(<~XYCErfJn-{P@C*eAt$!Kh9{~*7{sH^8F)1rbh~nP7_&3Jx9P347Vgl2TC6*pezT03IxJXl&f~j#SPM^Em+hW3{F@3D-^9hAO^u0{?Yy zQ(WkF-94g+B{nl!pmj)L`{YP^x@~>S(1C)p)jtHqy2`RErB8Dcp?yWtof-!sjmEjK zf`nGTZC9g?0=%BAW{iiF$D+^=smnc2XiNyUl{gm+b}22v<|ic4AH??CJ$sbxJF~qr z(l*RvnJG+g-z)XMS^%*zyE~URj|ZFdWO|1F`Gr)%kGND^AM&u?gAmUWEiSkTpv=#) zY`&v%uSXB(b@6pfGKqUDUarT4w&zGQD$wONLK{DkH?rn3^SsDmkF2Ctcv^DNB{KP2 z)w=qGc1mCti9|AuEOp$!0|6JAdeJ=H>2(Q{8ooC-FPT@LSt%}TDnCl)?obVR^EL$z zwnq35q4m8xZgjo{%T?vGTlcH3{837CQ*6V_$#tH3D1QGMU}PihnE74ZoLn5CdJG+B z_LQtuOt@@{5)Y!_mQYB!ZpXSzH?EQ$8)3gNh9}8#)2EvI^i_CFiblV=eSAWdA7!2t zx12zKmt_i3Xy<@#oX4K)s5U$OgVPZ)kF}aDOzRGtK*_6NUg;5Qzs?9EA>1w}Xa0^Y zUzLY`WGq0ehUfWVnMH;8u}ancT~}8yfh%=hK;ws@2c!O{sh(b?X;B6>Z*E*cJ{PF1 z^DO=u5zJ-CsZusuF3tR{6hE6gVnJ?nmfiko*?i0{G4}gA;Y)C3oIpU#W$k_TKs@!9sZ`ded)a+XFpf){hJl^U|MiSr37cQyqr3581{q z|E9K?^Sx-UNMeJG5kS4xM_3n~uF1-cyeZ($8rz@^8qJFr_v6-& zkIksa7~3dg3>vcb0h`#KmjTssK~D_K$q#66IVU+$ zH=5Z*ooMh%v`0kXvvv8cuS3~qC{DL88dH%rBaCn*rf$kS3-p_!HjKhushC%*`V>!d{dk$_{i5vS+ZF_s40Iaf4D zF1y(+m11pv)-9Xlc)!J)B8N==cqd^zyF$$rJ5dHyJJbiXh%DRueVwXtHVLcirS|0! zo%-&NwyS`HJ6%-PjvkPd(x0*W<%es(ruR z;S=*mARMb;>wttv)<5r^{Ju%=v8p50d2BZKX&CDM>h+k+zW#7Y%%t;C5Y%Hd_`-h8 zFd|}Yb|rYF$nEChL!5!Gt|$DOF6;*n!EiJ#Gaz%55LlqEnsZ*>xgX>CG3{@42SlF! z!@0Bko@wIfiH3s07K4B%NFsR)&kdGy5a6AFYMs|!To*$1;yJ~6swEnyXO&>O541=- z16@ynq!_=KSKCURb-x8UR7>m@(7@A2-isLcV3(Xy8-Zxkt!V=>M`O z_FjLP5^M6&4iyNf(l*(yvQZJS_dXskpWz*|74#ReYmUtj45jFE1%3Gxl~;6R;h|Kl zeRJ{0<_yKDV2+DLLs@e3K}E#8Acnp!{z2xr#R}*ZmMkaz)5T~OS(ZIrr4N0tHL4zH zj~pqq?`-l@YKCZZuHM^VJ$0HCW-T^jHC*!r5mC9r#{JkZ0g)|Uvs=4>{>b&hJ*{QO zylxL#r**Q1_6C%#3k#5gMM(4wv3puNwvjrGUAn6c!(J7-OVvgD@qsgK6@d+>fkJNM zz7You1IHxc%?a;p$^`DxpK2Zh4#vMyr-gODu~cqbh$C>+sU(C}R0 znuES?xjJL6QoX-(-qxnGhMtS(qmSymx1TW+&^?iqv!Oin!Ufto4QT4o$=*Qmxh7Jr z-LtkT_vk_G zjlh{~P3P+HxJQ#Xbi{oEcIP?`UBq2=W$QsXcD6QE=I#6YB3@kvaM8T2E>=!)k`VC@ zB4Dv-p4euVt&_1!G&kNhP&J4=a$_`smE%R7x>o3hT{gW07w9HlV% z$k-xz5c%8^+i;q2a_b=(CmpaA_&T;BiVMV<+mh_$(LvY_;(@0Q>-n9hb28)iPp2rq z4MX*ixr3*1_s5@rN54BtXaj>n5TNjvX1j^0?r!7xk(+mJ!noJ2yA zI~jn@P7MqlCV7q0{pTIWJQBVXElmqtoLeMP@%DQe)&ZQ3XTiWWI3t3ow1-)3&iD6G z#w6RaNrNzA$vn?jVv+aoo`{x2At;jeO_)!ZxBIjgB(?Sxrc+f*k^~v`K<4nqxzf|R~pSSx@~g=!!~n^9mhHr8cLHz5g852`6|T|I^$8x<7PsU z)#U-4=eJ&))`kl!MFHOE6GyzpLZG)OpcrqQt_9egx6CamrF+}fOQi*i3dIx3v%}vt zE$0|aT8iU2Rnk4drbjR0TRSv^3C50v=GP^wX3ebm2m!;D$n1o929>1c^p-w50>;g< zRjji<5gpb&C$pujbn>pQUwK{u3Ap+QWP+as$I>hKkMItw$;W_V3_r9) z=V0E|bwgDglaekW7`V7esMVc!rbRe4<~X54y(|w(<&GB(blTsi2+FT^_Cxw#d_R=H zKb!@@1lw8V?&(+5iDFxvUHTvgTzYiX;t5X$f)fSr6H)h6;%ud!^E}+za1a`S0eGxH zP#xyMtoPZ(08|vzbO$<%>m=E(`BZw4WH~Hc4DX>qu%!9BRExFWz4471EOa4VbWa7c zXs?y#Au8rKI1hQTUqB zKEJ0Tg)I@RS1p3!>=|o&CI~zcD)0hcGZEf6)S79DNr?AeqRwu$StBedD z9H6NCm`DgVNP<3+eoq-lH&sm}&qUjkop54ZkR;S-_0ykW2MpphdSDm!bT5v_f?kCp zN@LkN4x!jarCP9k0XT=x<~8L`*b!Di0a4Gdts|ZW5q0f3j8t+ zN3udd(Hw4W!e0xBQ3AIV5}hJ+k0ept9tXnqD6KOkb7HsI`4kZU)#k*?r8-h?UR>Tl zs@=}8il7sH}Mh^i`(Dg)YYrR0Nn^2JJ zrg1#R@v2OBt*~K6i+j|F@T|@$MZIS-CFYrZhV|ms>#t~2wqFkbAFJ^?GXit?e>QKM zM^`W8vD*(MlJz=@e~)o{pF%Oivn+qZUPDoTgDTx-L4YzB$dZ|&s+hK))^#i7x%rMe z-@(J?cH$22VAdOsUT^$sye=lCzHgMRFEkV_c6bCcRwPt(dNoVW@)O!no={^A>kATd zPWW%TOev?F0kfqiqgZhw&w(=%Ezz!sCQlOfjsjV4ky~a;;8<5fr(x3ByPomaWmb>W%1O~5MA{K`#%8?Nyb9d1tl_#r2kPy7f~Ig05wf%h0R|fu z)*NEPR*-VgC6Ekq>)h44IIaw>81myay;-g6zCT8qCfGhxi3dUdn%+7K1Y!-G7Y01v zi0vB3C`M~r@d2q#GS2RRn9zdu8b{|U8|wy7S@jNEpO-}mm`SWwZ@WbTjzbo4K;{^x zt34ke>D0ekjhZzVQO=QVe!ZH+ zk_r`ELQH&n))=!NFu8}U5LJvpQ{(6(am35#Nz>K@Yb->uXk8N$+Z)E~4PE1K_10(nDqlnX-E?B*u0#OoW{ zuN;wnZw{yk%J=p<6D;I&<~;LKAZU0Pe^ch-wAK9^y3J})xp{_SC+HA)UO0y>9TfFZ z>F!EIsI)r<1;6iuYpk(cZtU zoC9~s&lmxKuM)99waA|>cl!LRKaOQrzdGwW?Yq^_Q@tL0aeU85+xqvkdT_j{o_0OG z+7-!dkV9+CnLcM-5!P0!ZQ7fYV{X5*i0dV?PbP-NqCzr!%ZmY z8`?@Ac<8~pK$7Iw&cTikrIPgLO8I;r#&N5_pkVq=>c=oAqIUH#Jviy`OhBai{wYEy z%%f&FgQFCnXsHOYu*-sl5B+=i!|bnx^y$w%L7nAP;UM&857e?Ne2IKuc&9L3NE{g# z9S!J|^MrB=6m0ZZqXs7ha`$JWmPz788)G2#goUOOWQq%JZeTAwp(oX5s$qfYux!#s z-AF-zz9>cClwu*Psir#NMf#GwH&4MdT>A0_vMcupCxp35!L6e~BK822oCjqtIlZ+& z*TbS!FT67@Ly)5o0-43z^c-}q5r-2?+5%i|B!k6asr4{(K72Oe;+3LM&ACSzF_2k@ zTTp2fJ>{8`%>)e$$n@QnqA?zCNQed)>w{SRg4i!D;BB^o&eaQXp(53czEqL2ByuG-1*9 zT96POr4Q+wDjWy4-VvahOL1m}jo(XXGXa^&IV^%UBIn@$)ucAH38wWiK)yi2SIyIs zNY+eGTku4cr)B*mN>RJL9c*${od?lx4sUWLAjxCwUDANeKH!>~CFnZ!O=8?=5+-7! z#+L-^DHCf0h^2+hc(|^!+_-TRWW(7@_~NGvGsX}?~t+Ix|&A4S=X80t=^^@ zEczNZ=k&eixMB3LzPpw&p0S(XS|Qvci4+a1HUbJ31=U2&FlXlLg-5)$p?IxPOHF~) zl6yc)EX-GY?tC6sE(Nm%mLc)iNkY+%2$-L{oTJq_XIb9^!$|9e3YjjSD;8Y)*afO^ z#|#p0O5IuKXf+nqy5-M0U|#j03q1G~qJ8*Z&kz3Am?rS3z)X*w(*Sv09#X$Jmo91E z2x{>WllZEXi9J0gNEPLrvweG&2+?2Zquny59)(Ib1X7dt1_i+A`jm%u@zW7+cBDV< zv0O7mAr%-h0su{y#|QegOSIdWPf}Yj$g1!!;zHOA@`?nUaUoA1@nOxBfKJE&QMaSl z>weRpKCL-Zema0tk8E56D6{_-=y( z3Iq?T5dZK>Z8?Ur&6{IRXy|r(zZK+1@7Jw7#iZbm5^n`*P z&ut%^d^6+MgX(<|NHJm|j_T`Znix?EveR|Ab$j0!gT9un*8?61q1Udp*~BFJf8!`09 zu=vB8bSABUB$R3~!vbqx#;Rs7faJIvpEg@AUu<<9b%F(?3sGPBqZAkR=;|JjB~NZ$ zaC6+?!goUM&CirRq}|Q7+MvF1*8~Pk7;t3jLla~Kde^&>mrrl_f@e-`jsZdQk!@4z zJL7uFgWCrMKKdoj^aKz}qWzaR6&Ogj2WI#=C`p7#-fMak9#Yymk`$;#^ZVz^ zG3-C9e9xl}9fG4xT)$_L&QuK#^^{mb)>`RfKs{Wegt%u{!|x%kQCs=MN~XL|wd5|s zo(|RbBQ=i*LDv}_-PKB-JT+j?b1T5`z<(6d_@35lIJ>EI+oX>yKIHU32Q%$0`sk7S zg0Y>|Yz9Eeg5s|?!((BY%sV#YJZu#BP-Rf>f_&=Jx=Na(>@zqx2YF4oUM-&8NB>dj zR=@!%?2#Y>cg7RN-x!`xj}Dys)(0s1&jd*7VSdzkOo#_W^+iO-hqo!I_cnu)O1RvZ zKv15rN$7nMD-l5#IXm%2R)C|HDPQ<%6`rlcs!?;?%W>wc^i~dR(vL%LfJuEI37}&V z=zop1L*S;en2PIa@tZ8zgnF84Mti%y8S>Qi4p`CS4NiST8Byd2lLk{xV)4JB|7a#9 zgsAIOUtG)>5Ff+uAp4<`Wj|J{if<%@4@hmFsz9Z)aClq^3Xds~!0QatrCr<{&M+ zIDvCG`cQ$OSnBFG$1l`8UtjxUk?DwCP&6#!1Cb?cm@LQ-2v6rd@w7hw=nU$iTEQ}u zt#A;qC5T*6eFj{sJJ5OZJ5bbb$tINYM7B?$^3=MEJ1Y=9M+53y)#8;9RHOC$rQ#hz(ATL5&E319YKE(q%>}_MNT}(49XU)@XzYYb7V?2_$p62skjy z?8tcS=*kZ%3w>@e+8i~{8|=3V6|`eFHH#W5i}+WSr*8lyctbDCL5DU18&Xa|(5R-e z@$9_;dmTa`@*p)~%kOJSK_hRAu7j_!6h;Tu5kpj|b4b-2G_e=K5_V2L{P0kFu3h!0 zlBjHKMx(_+uy8~WPI4_%GNY6WsC?@SRHN0#exW7FFi@I$td}8o)hOL8!_Is~T?Oo3 zqY_Moj;#G_N(HR^BP0CxYW070ha@wZ@uO%M2-2fGW8S5d28;v&@gg8|d;i#f2rE|( zb0TYjHZAy$#o*1aZkojjV*543phO5;7>5Arm-(4~D=jsosdwu)*I6w(XD~2@c{#YG z!6YrEe6JGT#es#DPi9Vk2qdFtQgg*e=$kn%<$(s7zD|q2 zlOOwV%M?Q)tt>b7O7kF83GuO#QWq=`(o*`6Xjokvi?UNVxo~OK4!P*i(wDfy-3b&wqFEZ-u%#2JY@$2}y7+pXX8-#^?6RSDBYp zAV5gD8pF+MMCv(I=oFgk3hB2p#n)JGk;)9m*mv23-s}T(?`0KY-JN4HxWkZ&=d_?@ z4cu5*52#V#?=#x+CX64jDz>Qs^OCpu@VhlP=M{6WD=glge>_E|w^XStzW>aF7M#N8 z7yFPy9FvJJsHC$4%5qWrR)A~*v&nS<8l*i| zlC3u;33Tw^tZec8wkWBf1z08RZZ$Z)1rACGb+a@+@c>)$ezCI=czwPBlfCf(ow)Q* zn2=TCsjNvqeb^?QQ%SSHJyE!DTrtM-U9gzywWo#wQ@73XE?=NM%9asQw~&EmL^&|5 zAp;y7KljnsHmk%76kJ7Ns#j2)@Mcc0Ce`FBC>X5`GUlwY<*!~+mGB zOaKuv1ek;vG`g0Wj;^f~lDX1<>#P|!F7QAAkDC^%eE7MV(&h@e*f;W?ba^Z##*k$| za{0DzxqTdDIqin6op^P)-4pe%C-rO|VTP#pidi-Y)9rY)rd>-kDTW}zO0M0fyE;vSk|+-w(9{rF z==ULBfl__aQfRL8+?aM_^cx+7mfE8TFZ@M_9upD#q%%RZT4r|l zI>fTMwmi2|=CEjNb6_gCj0rOLm}2Wh2eDrZ`53mwA;#K48&xMvM-DU~p@bjnd8>AL z#+daKC-BOKJMET8=lpL?bWrhoXmaYkY7L1G=b&;HBHYm~=*)3Za zobt}w9@h-rRCAJ4>K}krq2LDjgT7vO{Q>$Kocv8eVb4QX-+DOucZp>M60552^&J9e zO-cl_Wq$;6Bv*-`xLw%HXuDw??%RnC_Xm@+$K>QdaTPfO6xGRq$YO=5uB)iQUiTFJ zc$V=158{ojIoxI$!sV_Xb1Y;K0D+aU+f0Gt7#&@t`D_M**m^o1=tQO*V%h`U{q z(owWV0lD3DS_^Wsab#UB0wG0DjgzF{PIGRZ-2Fa1?7>vvM;O~Ztd#Y$fN_@}o!!J~-+Nw>HP$&o2Kb=$525pM z)4IkKkMqi5L_osp6Pu}0{9(RDWr$vzVuXmc!oO+(us)}^29jJmwTd)vWL2n^ra+^X zU&$A;%t6K>9t0;L7p!UoV3M98LdPjktREHzi_-6T$ z1{m7Fv0XWw?V@&bGLocL@a&&d{|PaBJ^q2J$gyCjPL>LuxoM#xr#7N&g!{wE%rr z9fAhHZe81fHTFfc6Z|aRs)~7`$y8kODY_sPz!Wr7Xr?hLNk7!`q7;Kl`V)>Gv*4y` zG7V|@0;Sf(7{CHK=m(Myr+vX*vSYSiZwi*D{Jvoh~Us)$6Wm|*pCmh z-D?r6*cq&^8EmJOKW+_2tFdnIT<9{O4(UIw+%str@frb#8=u)hg((Y$W-ZXXbpXKw znHbB7jBN^a0VInC_TK%=n4I zXswp|2!o9X?%YZv0^O$}$~`8H>I&nXxN z)(|>mDf40_t^w;+mskR{W5)q5F3YDuYTPQNn}Vd44efk{kR@VAUy}3>Q%~t|uX~@4 z$K+$IBMwI)9}z@5w0m4HJKo{S+thoMFl6KS?gOzoGeH)nyPBB)EX_9<(gQ&`A?C`w z8FGT*duDno(CbJVd#daW@F19RsJ>vnY!DDNoSev^*PO{^opjpv%EQ#}pkK?YK-`5x`-$7RI7{#qk70{!efbHtjB zQ@1ZY;S|_#P3H07rADf5c`rh!mQkQ%E=xTRm6;aMy0I&hF5gZZb(g`Fk z>LaCsn0EMulwtL@dg}|Nj?Vr>kYlEmSQjdjW)t}kmDjcqBdN~zFi@-Ajj*`lO~G8R z;=TVCS3W23Yu(4ntT8zpaxi_v+a&`i$)9a+@UhZ|lh_I)8{{}g)O)(p1W|CA7#as4 zBg9@%I1%AVnwK(RE+-YH6&)fSW8%_L^X6_lw#5fb3MxrMtEEC@+&-IwX0~2CNmV^_@)VLhhXb@xVLk!x*&LQx3XCnMv0ra()r+R!Uh& zzYBC-bMBxb&(klZ-F{~6F*3^QqBVippzGi7oF7CH6(*Vtu#qK4@(P;zbHc@yfw29g+VqV?BQ4)q z7N6GW8Gr26Ix=mN_76fiW7cm+xX_qayB}rEF#`pk2Ig9cVoRZ72qo;>vuI5;J(r3T z)9i)HSW8Zon3;4pGV$+IitpY6C!gjIWa#5i=9u0`PW)G1kJ#IIK!q9^a7)Lx?VjMy zBoH3Ycqn~X#+q7m)RvFWafSL1(Q?H^ErNhw70@k0KK#&#fX%WG_)T~q4W$dG5Y%YR z!f!(JZf9Qmkr*d{Za}mhlr|_>Z6^*fTJ9_mGOcbJLWhh57B0faom}3+u;o3-TN=f* z&MGy0zrzv^Fp`LY(uf|wW5oU(Z6M~Mu!vA)PL-Yt{b*!B?GQ0A@Bn?IrK#sVI!Q)) zjCSCr!m$*`z(8f@SZ5iL%X>fcn%JtkmEJ`YFYJy1y;YDUia#g~O5$Zd4jH%NY%L%H z1HM%Hx-QVTMl_|%1u0F}YjxS%3N9Rs!DPl#vY*Ko2Y&sV6t}IR)O$Q{#X-Plra-Vr z54$hi3?e4IFIDCKV zfA@`a-VQh|xo>_1eF@sad77FcO3YqcW@ctKU}z>oSX&=KRno(jC@C|uAz77sSLCL& zq9deZj9fZI<=qGNZmD-ZJ|36Q!u&P>;#PBmTapXgb@wW& zXf~1E7?l2IWRgFFFE!Gv-)o4OL)Ijfx|yK=WY+c46xm-UD%r*|I<$&PJUC|BEiKUW zGg(TP|>;>kuU}Fj-Rk1u&m>dM*Pu(iI>+RU8i#0wh+_JFBmxguq z&ptbpUt$1o*bOJA<~J0^e(ZP=f@UCuj33cAyQq$q~S(8qsvR zQ}Nm~<9v4c{+)X#o{kcR2bQWXzyQCrqXcO9`Nap~Wt?!A*I~Q z27GOtADlO^H!-PfJUZnL4SN?dF4b-@0fqF-VKjFo@SS`*gM-s}jhGHd5lK9^wyexu z9`J%tOMO?6I}fZrrPl0{x%HDItkruc5ZC}ftT<(i8E~*qo^(DaQ*E3V`yMU5jdjJ} z#6U{TE~2OK0ZZD#iGm=S4?{4C>Am*jNz+;pPIB{1^h!{u&$%AhFiCsKhv<{KaQV(o=C)+~ZPE#HbC? ztC=bH6zTjTmY6dB(HFacxgQ<1Ii$?`sqGtV2sh&aX&+);;3Q-V7a(B@kaz@;s3ZkC z!7RjK^%D}gDu^Ct$DH(5CUFtdx81*|3?5J_^pBpEmLX~XqEioK>bC|zIC*>u7nw#c zST9Bijh&T5JHz)Y?c??1ih3k^?4KpUEK#5}&CHn9lUX0C_j1&^!7R zGZbF@vxk%KIoOun*0jx|EibME^#l`Bc6^gDkGPk(8!*6h##jS2V7BkfaiXUSU4Q_| zEdcW!xCJHAggjTw< z;~g)Z`L7->F+f0;eD~m^FEW*a1sF}*0qKt$01wO?w)=FzR)q9duZizH0G^_`l>@n% z@t;kTJ(ylfz#_8s04ya5lyHc&|GI=Fly-M$ma!fMtD#;dyBQO7A6(r79frwuZGDDH zZEQgoCEp3#^Si0Qq=HnTv_VuzG*V0QhTEo;xy zqj(-TMG(+lI+Mf*g`m?pf8nf#nRP-@>XvGLL0X?ilcEb)d89C0rq3?o#dUAU^cGfw@JY z%w{TO*v&lL64)@3*aGWd`Yi+QOmY4?gnjGLW}7LuN=)a9E@E2Ie;U*k+kv9i;q(Gs zIsi_LBu;})y_q+_SEHVV+_1K}ISUQ4Q0Pk!N(}-%)Q3N4#G~5pXwHb;*TFMeMbJ2UA^B75AINc1{#BT2PJc}IX%)4+fUjUzd zGexbYf{ksd?{c{F2vK~0+)qEfEZlF!&=>s7Xq{pV1Z?V^Nl;21 zAvGc(X#k+tSzG*itG-BE`s~6Aj zgBN6~1URw)lfZ%hegMb6y089KnRkJa@a7{wF2!BUIstyNwCvPvJ{o*t`V|F1e4laH zo2*8}ol4@>utu4zHDn8G0*<7lLB&_#nU9sHE$soE}m$`KTUT z!9vr%{mRI7)(|XBFe|&f@79Mko8SHH031(G9L4pPBu2S<7m|-h ze1u3~oEtpB7U&NxdmdLLTc1$Wgg!=Zei}3p^NmW;f(YUSas{A<18cZ)mto7}rkdJ2 zD*qoq-hj$ivH_tGO%&n)!RVhYmuN_#!V6ea4sm|-zC7HTAeL`s&p}Z>h7!S=f_Vdv zH{d2wn4Hy|K2PHs5O?NkDvx;s_;fhK!%UCia4s884=6QJ+`0J+blgXY5qlbs6Jrk7 zL=!9I{btuufJ}sR=J8$)Q8V|PQl1ADZ_@Cqd(X@rDmF7gaiigfLCfU?-h0YdKB3NsNkyN0l^SwGm_vJY0EmjEmt#1pH~?hc|W_PsOQ#9qvp>iLNib zZU8aqOou?ez9xAMKzSaN1CI6?VtE|{RxA!y2ra=t%?%}Rv{*Ws_K076%5s(O1}V-5eN(Z% z+l~tu-~v#xs)j>B`?kZ$Bdh}t% zrxN%vr)MM1aEmi4R(Oi|q=4Ng93BXTx;7E68GIYM8)CE;HZPb=U3<(Ab99?uiaRM- zQ0Yk6cMpLvo{RwMQ5E|dO!)lSEGQ$@|egIYw`AnUXC z`Q<|>ZE-|f$Y^VG3Ru~E;5l5IXF-=M@2D}(yO+@Jfa{BJ$I1z>5@%QzNV)dlgeXzK zGw|w62O3fWHQSZq)UM2s`8r%%d;q(I6J7{?DSSw`9&nODM6#yZF5e)i62B{Ne-Z8* z9d{aTo>>M6a!!&Hp1@xGAZq-rV?M4kk3^{VX?w$3K!$P{IfOS?{i0itj`VpahfXx~ z)p|pv-OkFM#OZ0mkg;v-Uj!6qiXs_G9YM>?6Cq|jhbOV#}} zmh+=ok300Yay7Th396OSukC>Cf!4l%gE&{f1%|<3c&FTeU8g=3f*#S_>b-7re}P$~ z$v0#kn6~MYUYGj|FFbK*##b_Wj*H%~W}T4K>iFEiXxeN~%P`A9-vPNN5e=SkiCRGij&A3VS@i@o|G*)N`#( zBg{1)(oMHO+EQGQAe3;o!N>RD%6F>XBxe|T{`h*CRNm0tC)NC{LveC>*C#X^U-${=0laNC+4UB^KmYOv!Wvz2Mhj)sL z_UizL#yb8!9kk)XCb`buV_?P9mBuf$qa+1QPx86^lkF?Dnt0yxzz6Bz8cc;8x*4gJ zB+cOLYCXNRm}$ri@3DA1LT=T-TPVHF0B#pu{R+=|UqC3Yf>mZf<0@n_78o%`PbtsG zd?8f>d)sSR;V}-ZrNqTl-x@I?uFZmULdIv;*L*7Y-S&!~pRk^dyw?rvx?Nb4c?S*^ z$ca5*_ALTY4ITSU)1L(AFs?~iV%A=pXj73Ulw7->%<}eB$R=Uw&d9{?0y3-2WyQR+ z|M-x{?t_Bnk2qxsaJJ*ROA#85c?#QCG-=*f)r6MoKOUO1J=!jh47#28d2>4d(e4vl zox>pqp{OzNQ`6;&a$>?{hjA|I&~Xbq+)XT+QyORsPJR45EdIs^AYdY&junGs5wm+)am6T4d=3Z+sc^f}=)#MHlOG z`SpP5DhPz4{mJ@A=?J}s;xb_~+5L*NguWpsl&!A#`&)*aS$U}5=g(uH%9@Gdx#w4K zByl|Ep90|QHAvk42^{M2G}%Fsw3)QL*ZyLTnOWwe>X4*f zL-Nx0FIihu%jeV7r5(4_WZfb)lYM&1@Qy>rfwo2|xP59H_7VvCf>IfdnGe6$*+JQW zTC?b=QK6Zp$F#+*$Uc{o=VEv5hgw7FNbQa*<)R;}b{Aj?>hB7#)CAA`NO0890&50s z2BW|ES$FO{!2px5)((SFBww++tTL|St)d8G9fhWz@h=LQwm#ERm38AkkON7ZsYo~a zne!A*%3SEnAs4yQhr9Iv)$UTp;k(!1qWu%3p2__iA(-KqO=tIzli zOqy4#c(rEFcYC1bHmGxt&qnr#pWc87MJy(Q z*Hgn-s$;cqFRigQi2SNn@lKWbsG0vdI=XoZZ?U*H?1ruIk0^BrFA?fsT{kYkN}DJu z$Ufg^Oxb&EAH)vcp$%FNtq;*E80VR1;jf(ULXWTFu&*x(_FKacJ7VrV5eP#sQ@}oN=LEk2$pLxQWUJwG`&!Ks`ID8&QeeD2-rG^9*$VS^+~5#qN9=!M3D%&X+drE~gPL1BgFJXQ z7~fKPHr$k9Hn4#1jrAGUs1XZ29mvPA`KVdlCrG#VsP(J-{J@A{)g0R{3cqA`D$lgCy6qLFbtbsxgF z@L;3;2b$5{g{S9t97G(_CpjT=bR8UxCx{f7lv9l$oe@x3uF8=@p~0c_Snl)VG`-CE z0`pPlg94y90Xy&DKc&3&^eB~lx({OoGX07pF;981U>s_ETtuo32DeoDgpW6D=G(bI zrjG+TSMDNA6ae$zJHA1Iv*q``1CfJekCEmgtJ5R@0hv;#zC!Vu<9Efik zT7P2+Zi5%&L)5p$ggRp?FfGbtyV@2=X~bFQ2B14pYZlm#1#y$iN7Edr_y)J92oX== zrN}+S1NPoc{)8X3(zae?fJ5|RabgTH*BxDsys>6O{uejwoRg!MRaq1t{^mXTIKapA zW=trfs_enaw-O+G8s7^-Z>8073XP#u7AeL%#@fN4*(aGVrdhFMj#-*E_fu9cmim|3 z+T-%Tp$!m-4P6K8B>y$6VTsuMV=`TpK6pyJaSFcl5B_=Pb>wbw@W23@rp5gXGx}RBpd>_M3Mg$e$AXk z^Tw*oEi%#w>$Atx4r@Cy-3?)*0N`m~G|iXVTTN+F3JlD}jv@}U*;$kjn!vYpd;SIl z@XrR=4A*_@_nuGUqGnANN%@81q|!VMR~GbUu~sIpw);q*vg3;5MU`{nKvf=*=B=-(b0J{QzpZlpKYnme zcVl;JpQ7O$=+6Sfh0sCOa0IJL-{gR?{w4_fMxMX1sMB>@FgcLHf|oub$t$o~v2a(B zb&Jiu*e<)6Tr_x3sid?2M28SU;=3nEvAE0HkKNj7NY;jRKk)}21+^}F*LnHjS+{LQ z-y#JOq**KW>GK7Zb`AshO(`)Q4~J|e%5y#FqZALDJ_npvT_au%mG6`g+Q4t&dj9rv zzUpAkX}(MFv)W$&-Ib$o?j~^@0;}Qi??KcxEGbE3VVKTV^R$(aV-tE>^7LErE#CFE zt;8r3!+>nc&)IrYq=+Ra02mVrg*)3VXZr!S<|IIw3Zt$yl%hoI4^4*C9#k=xr;jEmlg~ zcUKel@U@}I_Q{Gp;5lkZII1)s4Jarg0cp|5Ml}Fkn2>GF#k&I~kFT>TTkBfKfSQO&(fZXwag8KD*DPnu7`we4ggU^yf40%=q!;ciHs z34qNyh4Mm1$AfK!U?{FC{?><1hY&Z8ML26!;O;dggf4*2=P`0Z@sBeCSlK+i4hEEG9+&$)ry`2#r> z3kgx>-^+6Qm>EC+W5A4MC6y&O09*z>mmMfzNML_HkCq!b|6{c+PuT`n7Z^GcG&g$J zRa-tMxf6zvM4yB&u?GeA6BnP=@^dQ~n$uAs6=JSL@O07w;ZkKxHpd7r=5sn()VHR<6j`~)N&AnI!Tryh>+PJ%CS+}A>qXJV^hxTC-= z)DVHLYLE_j_J;}VmOQ|P@q{C;8d)1x$6H)@j;FfSCKLib642A)!<^_RgmIysd1U|2 zj+|%Z3_M&-iQ_>@Vk~q#ZtO!P`2wj=WrUiSQt}sDz?W36{dkHS`wbV+a4qZ$D*!4V zKNu#|pWNOb-P^(h7F&}Ki??cWwJ%H1IoO7&279lk)lsBMP786-vr_1>u>~@A!22gS zBoM&5i+QFzZ~n#K9WUXQ!+A8?Lt3QuYPg8}M5sEN=5fCb|^ig&Ah$ zLub)_r?-Ns=NZ~=?VMYu5-Aa5#-7-&dN7{3)$*94!` zZiuLE%U7HEJbMqSiOCAU#l)^vgFJ-Ias|jh{HPKFR=`<0xIql>Z%Q;NdT-eEtxnq% zq1D+_=JsO{ln6Uuz6eX@WnyDSx~GQH@}YBf$}3(|mDy<)C*ruHznkM^0NV=1hxmEj zfUCmINI496J4nDX6dmuNpTsXfr4WQ6NK>75^SwbVS>Gf za246H%7w(#(*=^D#EQAneCbgzT6&_rG6^QeaTtw|7Lv)x8^ zTl8<;K42tV^&H~EbBR4a4i738P8G|PPpBQ6^5nRN(}`fN1@Ndb!PMLArcv>%3mY7^~JoezO5u-rgFU#GjLbyrQ> z;#j$H=(Vmw@Ow2?XLZ8PyCD#?_b{C^x2obIwuOnrT}z~70)N+`NXv3eY}iSj86 zz~fC*-2$dk2#MBTS~p!n(nL=|-#6p!jTCt|bI0PE1I6OpgKs2XUyeb@S17Jgsb=p^ zOwD$M*^C#1Y*Aav(T!@R5^UsM&=9!0$`ez#G5PK*?V2sfu?9^vEUOesyJnU+erAWO zwbNS_7*NJcc|PTJy+%qk`(mPyabimR*!c~jzr2{~!hNWeRnTEDT|EpqkVe;VG!5ZR zr=jOwZO&h=BA<3{hRTk4ffNOOfod>PU6WT2P`*^*i6M{E``Sas?BtqQfbJNM~t zwv*&_hMC$8XB)9kD&8R#GqIbH-z8LUu~*+=ll$yq(3o9!7P-~}*`($O-RR+fmF{Yw zG%F1h*sixMM}~s+FA!>hF+ns9quTQ zrQFEm27^y&zu)km{4<;m=!e)f9-3ESqz7w%j+UMkQaEk?CY-;zWv)F?$Qv~6;@7A+ zRzR^CbE=RjFi|y9^ksiDzrVVNcQFWHm9FWNiIsGH_B9mf`ok@SBB8DPIhFmZ8~pxx zOwn-loeEo+212HW*mNT2gvj@pe8qHWW=u_+)QijPc@fq03=wgJqCGr3cvc&-#*6yG{%|c z73|uNS@I%eE|G^8JP1~ggz`U@d)|UFX1Lh3KD^p9a;|yc(#U;)fcUSN=BZypM%w?Z zRVw`M=-Y6{>~*3VK3oF^L7e-h_CNbFxa#;bQ2%Q`T%~3CbJ}K}cmspv9DC3xF;~=)V96aw$Up1w#LCMCefDV96UeOK*L=Os}Oy zUel}piLa@e|8Lpt%gcW?lPs0_eU+j-+%B@I{%KzAD>(zbBWCVs3QIy&i_wDOmD3R1v!0HM-5gp zblG-ef`ofb@#%k(zxW$emzVzyl7IW)5}8Y6F16`bGH{8^B{G-J=9e;XsUE+C=F+eJ z3Ytq~E|Ix39KVu*OJpvQxnvx_l!5;Z>cRGpD=iKq|6BELmzV!aE-sO|LtIyhP?N zaQyV<5}BXC_{+;nWc~ujPj4=f`3a1_yu3u_FL3@8pE|K{OjK93RL?-u-N(=Ot-G}F&qGm;zz(z{{ zVYAx(Z)GtqFaHlw1Rq`^bBWBQ5d2C8E|IxJ=F&#~QU)&7=J0spxERsR) Date: Fri, 12 Mar 2021 13:02:42 +0200 Subject: [PATCH 382/711] Update api.rst Changed SET LOCAL to SELECT set_config( ... ) so that the value of the header can be dynamically calculated. Supported in versions 9.6 and above. --- api.rst | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/api.rst b/api.rst index 548c7094d1..4c72eb03ae 100644 --- a/api.rst +++ b/api.rst @@ -1530,9 +1530,9 @@ PostgREST reads the ``response.headers`` SQL variable to add extra headers to th -- tell client to cache response for two days - SET LOCAL "response.headers" = - '[{"Cache-Control": "public"}, {"Cache-Control": "max-age=259200"}]'; - + SELECT set_config('response.headers', + '[{"Cache-Control": "public"}, {"Cache-Control": "max-age=259200"}]', true); + Notice that the variable should be set to an *array* of single-key objects rather than a single multiple-key object. This is because headers such as ``Cache-Control`` or ``Set-Cookie`` need to be repeated when setting multiple values and an object would not allow the repeated key. .. note:: From 9f50e1d2d701a2805e74490f59b340268ba5610f Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Thu, 25 Mar 2021 20:15:08 -0500 Subject: [PATCH 383/711] Add Supabase as a sponsor --- _static/supabase.png | Bin 0 -> 4488 bytes index.rst | 6 ++++++ 2 files changed, 6 insertions(+) create mode 100644 _static/supabase.png diff --git a/_static/supabase.png b/_static/supabase.png new file mode 100644 index 0000000000000000000000000000000000000000..9c3686bd041532138671ea54604bc77885f7cad1 GIT binary patch literal 4488 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 af&T->Exd?b>wZE20000 Date: Mon, 5 Apr 2021 21:52:31 +0200 Subject: [PATCH 384/711] remove translation section from readme TODO: implement a proper translation workflow --- README.md | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/README.md b/README.md index 0bf6955132..9f964a975d 100644 --- a/README.md +++ b/README.md @@ -18,14 +18,3 @@ Once in the nix-shell you have the following commands available: This documentation is structured according to tutorials-howtos-topics-references. For more details on the rationale of this structure, see https://www.divio.com/blog/documentation. - -## Translations - -Translations are maintained in separate repositories forked from this one. Once you finish translating in your fork you can upload the project -to https://readthedocs.org and we'll link to it in the official documentation site https://postgrest.org. - -See more details in the chinese translation [PR](https://github.com/PostgREST/postgrest-docs/issues/66#issuecomment-297431688). - -### Available translations - -- Chinese - https://github.com/Lellansin/postgrest-docs (latest version `v0.4.2.0`) From a1178a80164d0f5fe92368dd87993abb08c874a3 Mon Sep 17 00:00:00 2001 From: Wolfgang Walther Date: Tue, 1 Dec 2020 00:30:05 +0100 Subject: [PATCH 385/711] move "Build from Source" to installation chapter and remove "Running the Test Suite" --- development.rst | 156 ------------------------------------------ index.rst | 14 ++-- install.rst | 61 +++++++++++++---- releases/upcoming.rst | 2 +- 4 files changed, 55 insertions(+), 178 deletions(-) delete mode 100644 development.rst diff --git a/development.rst b/development.rst deleted file mode 100644 index ff9c987a9a..0000000000 --- a/development.rst +++ /dev/null @@ -1,156 +0,0 @@ -.. _build_source: - -Build from Source -================= - -.. note:: - - We discourage building and using PostgREST on **Alpine Linux** because of a reported GHC memory leak on that platform. - -To help with development, you'll need to build from source. `Stack `_ makes it easy. It will install any necessary Haskell dependencies on your system. - -* `Install Stack `_ for your platform -* Install Library Dependencies - - ===================== ======================================= - Operating System Dependencies - ===================== ======================================= - Ubuntu/Debian libpq-dev, libgmp-dev, zlib1g-dev - CentOS/Fedora/Red Hat postgresql-devel, zlib-devel, gmp-devel - BSD postgresql95-client - OS X libpq, gmp - ===================== ======================================= - -* Build and install binary - - .. code-block:: bash - - git clone https://github.com/PostgREST/postgrest.git - cd postgrest - - # adjust local-bin-path to taste - stack build --install-ghc --copy-bins --local-bin-path /usr/local/bin - -.. note:: - - - If building fails and your system has less than 1GB of memory, try adding a swap file. - - `--install-ghc` flag is only needed for the first build and can be omitted in the subsequent builds. - -* Check that the server is installed: :code:`postgrest --help`. - -Running the Test Suite -====================== - -To properly run the test suite, you need a PostgreSQL database that the tests can run against. There are several ways to set up this database. - -Testing with a temporary database -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -If you have PostgreSQL installed locally (:code:`initdb`, :code:`pg_ctl` and :code:`psql` should be on your PATH, no server needs to be running), you can run the test suite against a temporary database: - -.. code:: bash - - test/with_tmp_db stack test - -The :code:`with_tmp_db` script will set up a new PostgreSQL cluster in a temporary directory, set the required environment variables and run the command that you passed it as an argument, :code:`stack test` in the example above. When the command is done, the temporary database is torn down and deleted again. - -Manually creating the Test Database -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -To manually create a database for testing, use the test creation script :code:`create_test_database` in the :code:`test/` folder. - -The script expects the following parameters: - -.. code:: bash - - test/create_test_db connection_uri database_name [test_db_user] [test_db_user_password] - -Use the `connection URI `_ to specify the user, password, host, and port. Do not provide the database in the connection URI. The PostgreSQL role you are using to connect must be capable of creating new databases. - -The :code:`database_name` is the name of the database that :code:`stack test` will connect to. If the database of the same name already exists on the server, the script will first drop it and then re-create it. - -Optionally, specify the database user :code:`stack test` will use. The user will be given necessary permissions to reset the database after every test run. - -If the user is not specified, the script will generate the role name :code:`postgrest_test_` suffixed by the chosen database name, and will generate a random password for it. - -Optionally, if specifying an existing user to be used for the test connection, one can specify the password the user has. - -The script will return the db uri to use in the tests--this uri corresponds to the :code:`db-uri` parameter in the configuration file that one would use in production. - -Generating the user and the password allows one to create the database and run the tests against any PostgreSQL server without any modifications to the server. (Such as allowing accounts without a password or setting up trust authentication, or requiring the server to be on the same localhost the tests are run from). - -Running the Tests with the manually created database -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -To run the tests, one must supply the database uri in the environment variable :code:`POSTGREST_TEST_CONNECTION`. - -Typically, one would create the database and run the test in the same command line, using the ``postgres`` superuser: - -.. code:: bash - - POSTGREST_TEST_CONNECTION=$(test/create_test_db "postgres://postgres:pwd@database-host" test_db) stack test - -For repeated runs on the same database, one should export the connection variable: - -.. code:: bash - - export POSTGREST_TEST_CONNECTION=$(test/create_test_db "postgres://postgres:pwd@database-host" test_db) - stack test - stack test - ... - -If the environment variable is empty or not specified, then the test runner will default to connection uri - -.. code:: bash - - postgres://postgrest_test@localhost/postgrest_test - -This connection assumes the test server on the :code:`localhost:code:` with the user `postgrest_test` without the password and the database of the same name. - -Destroying the Database -~~~~~~~~~~~~~~~~~~~~~~~ - -The test database will remain after the test, together with four new roles created on the PostgreSQL server. To permanently erase the created database and the roles, run the script :code:`test/delete_test_database`, using the same superuser role used for creating the database: - -.. code:: bash - - test/destroy_test_db connection_uri database_name - -Testing with Docker -~~~~~~~~~~~~~~~~~~~ - -The ability to connect to non-local PostgreSQL simplifies the test setup. One elegant way of testing is to use a disposable PostgreSQL in docker. - -For example, if local development is on a mac with Docker for Mac installed: - -.. code:: bash - - $ docker run --name db-scripting-test -e POSTGRES_PASSWORD=pwd -p 5434:5432 -d postgres - $ POSTGREST_TEST_CONNECTION=$(test/create_test_db "postgres://postgres:pwd@localhost:5434" test_db) stack test - -Additionally, if one creates a docker container to run stack test (this is necessary on Mac OS Sierra with GHC below 8.0.1, where :code:`stack test` fails), one can run PostgreSQL in a separate linked container, or use the locally installed PostgreSQL app. - -Build the test container with :code:`test/Dockerfile.test`: - -.. code:: bash - - $ docker build -t pgst-test - < test/Dockerfile.test - $ mkdir .stack-work-docker ~/.stack-linux - -The first run of the test container will take a long time while the dependencies get cached. Creating the :code:`~/.stack-linux` folder and mapping it as a volume into the container ensures that we can run the container in disposable mode and not worry about subsequent runs being slow. :code:`.stack-work-docker` is also mapped into the container and must be specified when using stack from Linux, not to interfere with the :code:`.stack-work` for local development. (On Sierra, :code:`stack build` works, while :code:`stack test` fails with GHC 8.0.1). - -Linked containers: - -.. code:: bash - - $ docker run --name pg -e POSTGRES_PASSWORD=pwd -d postgres - $ docker run --rm -it -v `pwd`:`pwd` -v ~/.stack-linux:/root/.stack --link pg:pg -w="`pwd`" -v `pwd`/.stack-work-docker:`pwd`/.stack-work pgst-test bash -c "POSTGREST_TEST_CONNECTION=$(test/create_test_db "postgres://postgres:pwd@pg" test_db) stack test" - -Stack test in Docker for Mac, PostgreSQL app on mac: - -.. code:: bash - - $ host_ip=$(ifconfig en0 | grep 'inet ' | cut -f 2 -d' ') - $ export POSTGREST_TEST_CONNECTION=$(test/create_test_db "postgres://postgres@$HOST" test_db) - $ docker run --rm -it -v `pwd`:`pwd` -v ~/.stack-linux:/root/.stack -v `pwd`/.stack-work-docker:`pwd`/.stack-work -e "HOST=$host_ip" -e "POSTGREST_TEST_CONNECTION=$POSTGREST_TEST_CONNECTION" -w="`pwd`" pgst-test bash -c "stack test" - $ test/destroy_test_db "postgres://postgres@localhost" test_db diff --git a/index.rst b/index.rst index f0fb38f8f3..c071b055bc 100644 --- a/index.rst +++ b/index.rst @@ -188,15 +188,6 @@ PostgREST has a growing ecosystem of examples, libraries, and experiments. Here * :ref:`eco_extensions` * :ref:`clientside_libraries` -For helping with development, see the following page. - -* :doc:`Development ` - -.. toctree:: - :caption: Development - :hidden: - - development.rst Release Notes ------------- @@ -277,3 +268,8 @@ Translations ------------ * `Chinese `_ (latest version ``v0.4.2.0``) + +Contributing +------------ + +Please see the `Contributing guidelines `_ in the main PostgREST repository. diff --git a/install.rst b/install.rst index 88595fe822..87d650c9de 100644 --- a/install.rst +++ b/install.rst @@ -30,17 +30,15 @@ If you use **Nix**, then you can install PostgREST from nixpkgs. nix-env -i haskellPackages.postgrest -If you use Windows, you can install PostgREST using `Chocolatey `_ or `Scoop `_. +If you use Windows, you can install PostgREST using `Chocolatey `_ or `Scoop `_. .. code:: bash choco install postgrest scoop install postgrest -When a pre-built binary does not exist for your system you can :ref:`build the project from source `. - -Running -------- +Running PostgREST +================= If you downloaded PostgREST from the release page, first extract the compressed file to obtain the executable. @@ -88,14 +86,9 @@ For a complete reference of the configuration file, see :ref:`configuration`. .. _pg-dependency: PostgreSQL dependency -===================== - -To use PostgREST you will need an underlying database. We require PostgreSQL 9.4 or greater, but recommend at least 9.5 for row-level security features. -You can use something like Amazon `RDS `_ but installing your own locally is cheaper and more convenient for development. +--------------------- -* `Instructions for OS X `_ -* `Instructions for Ubuntu 14.04 `_ -* `Installer for Windows `_ +To use PostgREST you will need an underlying database. We require PostgreSQL 9.5 or greater. You can use something like `Amazon RDS `_ but installing your own locally is cheaper and more convenient for development. You can also run PostgreSQL in a :ref:`docker container`. Docker ====== @@ -157,6 +150,8 @@ The database connection string above is just an example. Adjust the role and pas host all all 10.0.0.10/32 trust +.. _pg-in-docker: + Containerized PostgREST *and* db with docker-compose ---------------------------------------------------- @@ -208,6 +203,48 @@ If you want to have a visual overview of your API in your browser you can add sw With this you can see the swagger-ui in your browser on port 8080. +.. _build_source: + +Building from Source +==================== + +When a pre-built binary does not exist for your system you can build the project from source. + +.. note:: + + We discourage building and using PostgREST on **Alpine Linux** because of a reported GHC memory leak on that platform. + +You can build PostgREST from source with `Stack `_. It will install any necessary Haskell dependencies on your system. + +* `Install Stack `_ for your platform +* Install Library Dependencies + + ===================== ======================================= + Operating System Dependencies + ===================== ======================================= + Ubuntu/Debian libpq-dev, libgmp-dev, zlib1g-dev + CentOS/Fedora/Red Hat postgresql-devel, zlib-devel, gmp-devel + BSD postgresql95-client + OS X libpq, gmp + ===================== ======================================= + +* Build and install binary + + .. code-block:: bash + + git clone https://github.com/PostgREST/postgrest.git + cd postgrest + + # adjust local-bin-path to taste + stack build --install-ghc --copy-bins --local-bin-path /usr/local/bin + +.. note:: + + - If building fails and your system has less than 1GB of memory, try adding a swap file. + - `--install-ghc` flag is only needed for the first build and can be omitted in the subsequent builds. + +* Check that the server is installed: :code:`postgrest --help`. + Deploying to Heroku =================== diff --git a/releases/upcoming.rst b/releases/upcoming.rst index 4ef4ea9af6..c7fb082c90 100644 --- a/releases/upcoming.rst +++ b/releases/upcoming.rst @@ -5,7 +5,7 @@ Upcoming ======== -These are changes yet unreleased. If you'd like to try them out before a new official release, you can :ref:`build_source`. +These are changes yet unreleased. If you'd like to try them out before a new official release, you can use a `nightly release `_. Added ----- From 92395eae8aa2185bc2e9d0f689e647434fb26f31 Mon Sep 17 00:00:00 2001 From: Wolfgang Walther Date: Mon, 7 Dec 2020 20:08:42 +0100 Subject: [PATCH 386/711] added postgrest-docs-linkcheck; clean up links * removed outdated links * updated permanent redirections * updated postgres docs links to current version * sort links in ecosystems by repo-name * change http:// to https:// --- admin.rst | 6 +- api.rst | 26 ++--- auth.rst | 8 +- configuration.rst | 12 +-- default.nix | 14 ++- ecosystem.rst | 121 ++++++++++++------------ how-tos/casting-type-to-custom-json.rst | 4 +- how-tos/providing-images-for-img.rst | 2 +- index.rst | 43 ++++----- install.rst | 6 +- releases/upcoming.rst | 2 +- releases/v5.2.0.rst | 4 +- releases/v6.0.2.rst | 6 +- releases/v7.0.0.rst | 4 +- releases/v7.0.1.rst | 4 +- schema_structure.rst | 12 +-- shell.nix | 1 + tutorials/tut0.rst | 6 +- 18 files changed, 141 insertions(+), 140 deletions(-) diff --git a/admin.rst b/admin.rst index d131708e45..2a8d03d4ff 100644 --- a/admin.rst +++ b/admin.rst @@ -1,3 +1,5 @@ +.. _admin: + Hardening PostgREST =================== @@ -51,7 +53,7 @@ However it's very easy to delete the **entire table** by omitting the query para DELETE /logs HTTP/1.1 -This can happen accidentally such as by switching a request from a GET to a DELETE. To protect against accidental operations use the `pg-safeupdate `_ PostgreSQL extension. It raises an error if UPDATE or DELETE are executed without specifying conditions. To install it you can use the `PGXN `_ network: +This can happen accidentally such as by switching a request from a GET to a DELETE. To protect against accidental operations use the `pg-safeupdate `_ PostgreSQL extension. It raises an error if UPDATE or DELETE are executed without specifying conditions. To install it you can use the `PGXN `_ network: .. code-block:: bash @@ -60,7 +62,7 @@ This can happen accidentally such as by switching a request from a GET to a DELE # then add this to postgresql.conf: # shared_preload_libraries='safeupdate'; -This does not protect against malicious actions, since someone can add a url parameter that does not affect the result set. To prevent this you must turn to database permissions, forbidding the wrong people from deleting rows, and using `row-level security `_ if finer access control is required. +This does not protect against malicious actions, since someone can add a url parameter that does not affect the result set. To prevent this you must turn to database permissions, forbidding the wrong people from deleting rows, and using `row-level security `_ if finer access control is required. Count-Header DoS ---------------- diff --git a/api.rst b/api.rst index 4c72eb03ae..d5951818af 100644 --- a/api.rst +++ b/api.rst @@ -108,7 +108,7 @@ The view will provide a new endpoint: Full-Text Search ~~~~~~~~~~~~~~~~ -The :code:`fts` filter mentioned above has a number of options to support flexible textual queries, namely the choice of plain vs phrase search and the language used for stemming. Suppose that :code:`tsearch` is a table with column :code:`my_tsv`, of type `tsvector `_. The following examples illustrate the possibilities. +The :code:`fts` filter mentioned above has a number of options to support flexible textual queries, namely the choice of plain vs phrase search and the language used for stemming. Suppose that :code:`tsearch` is a table with column :code:`my_tsv`, of type `tsvector `_. The following examples illustrate the possibilities. .. code-block:: http @@ -183,7 +183,7 @@ Casting the columns is possible by suffixing them with the double colon ``::`` p JSON Columns ~~~~~~~~~~~~ -You can specify a path for a ``json`` or ``jsonb`` column using the arrow operators(``->`` or ``->>``) as per the `PostgreSQL docs `_. +You can specify a path for a ``json`` or ``jsonb`` column using the arrow operators(``->`` or ``->>``) as per the `PostgreSQL docs `_. .. code-block:: http @@ -427,7 +427,7 @@ To do this, specify the ``Prefer: count=planned`` header. Note that the accuracy of this count depends on how up-to-date are the PostgreSQL statistics tables. For example in this case, to increase the accuracy of the count you can do ``ANALYZE bigtable``. -See `ANALYZE `_ for more details. +See `ANALYZE `_ for more details. .. _estimated_count: @@ -676,14 +676,14 @@ Since it contains ``competition_id`` and ``film_id`` — and each one has a **fo GET /nominations_view?select=rank,competitions(name,year),films(title)&rank=eq.5 HTTP/1.1 -It's also possible to embed `Materialized Views `_. +It's also possible to embed `Materialized Views `_. .. warning:: It's not guaranteed that all kinds of views will be embeddable. In particular, views that contain UNIONs will not be made embeddable. - Why? PostgREST detects source table foreign keys in the view by querying and parsing `pg_rewrite `_. + Why? PostgREST detects source table foreign keys in the view by querying and parsing `pg_rewrite `_. This may fail depending on the complexity of the view. `Report an issue `_ if your view is not made embeddable so we can @@ -879,7 +879,7 @@ Similarly to the **target**, the **hint** can be a **table name**, **foreign key Insertions / Updates ==================== -All tables and `auto-updatable views `_ can be modified through the API, subject to permissions of the requester's database role. +All tables and `auto-updatable views `_ can be modified through the API, subject to permissions of the requester's database role. To create a row in a database table post a JSON object whose keys are the names of the columns you would like to create. Missing properties will be set to default values when applicable. @@ -1044,7 +1044,7 @@ All the columns must be specified in the request body, including the primary key .. note:: - Upsert features are only available starting from PostgreSQL 9.5 since it uses the `ON CONFLICT clause `_. + Upsert features are only available starting from PostgreSQL 9.5 since it uses the `ON CONFLICT clause `_. .. _delete: @@ -1138,7 +1138,7 @@ Procedures must be declared with named parameters. Procedures declared like CREATE FUNCTION non_named_args(integer, text, integer) ... -cannot be called with PostgREST, since we use `named notation `_ internally. +cannot be called with PostgREST, since we use `named notation `_ internally. Note that PostgreSQL converts identifier names to lowercase unless you quote them like: @@ -1161,7 +1161,7 @@ Procedures that do not modify the database can be called with the HTTP GET verb .. note:: - The `volatility marker `_ is a promise about the behavior of the function. PostgreSQL will let you mark a function that modifies the database as ``IMMUTABLE`` or ``STABLE`` without failure. However, because of the read-only transaction this would still fail with PostgREST. + The `volatility marker `_ is a promise about the behavior of the function. PostgreSQL will let you mark a function that modifies the database as ``IMMUTABLE`` or ``STABLE`` without failure. However, because of the read-only transaction this would still fail with PostgREST. Because ``add_them`` is ``IMMUTABLE``, we can alternately call the function with a GET request: @@ -1215,7 +1215,7 @@ You can call a function that takes an array parameter: [2,3,4,5] -For calling the function with GET, you can pass the array as an `array literal `_, +For calling the function with GET, you can pass the array as an `array literal `_, as in ``{1,2,3,4}``. Note that the curly brackets have to be urlencoded(``{`` is ``%7B`` and ``}`` is ``%7D``). .. code-block:: http @@ -1420,7 +1420,7 @@ This follows the same rules as :ref:`binary_output`. OpenAPI Support =============== -Every API hosted by PostgREST automatically serves a full `OpenAPI `_ description on the root path. This provides a list of all endpoints(tables, foreign tables, views, functions), along with supported HTTP verbs and example payloads. For extra customization, the OpenAPI output contains a "description" field for every `SQL comment `_ on any database object. For instance, +Every API hosted by PostgREST automatically serves a full `OpenAPI `_ description on the root path. This provides a list of all endpoints(tables, foreign tables, views, functions), along with supported HTTP verbs and example payloads. For extra customization, the OpenAPI output contains a "description" field for every `SQL comment `_ on any database object. For instance, .. code-block:: sql @@ -1446,7 +1446,7 @@ Also if you wish to generate a ``summary`` field you can do it by having a multi spans multiple lines$$; -You can use a tool like `Swagger UI `_ to create beautiful documentation from the description and to host an interactive web-based dashboard. The dashboard allows developers to make requests against a live PostgREST server, and provides guidance with request headers and example request bodies. +You can use a tool like `Swagger UI `_ to create beautiful documentation from the description and to host an interactive web-based dashboard. The dashboard allows developers to make requests against a live PostgREST server, and provides guidance with request headers and example request bodies. .. important:: @@ -1664,7 +1664,7 @@ Returns: HTTP Status Codes ----------------- -PostgREST translates `PostgreSQL error codes `_ into HTTP status as follows: +PostgREST translates `PostgreSQL error codes `_ into HTTP status as follows: +--------------------------+-------------------------+---------------------------------+ | PostgreSQL error code(s) | HTTP status | Error description | diff --git a/auth.rst b/auth.rst index 99a29c1f30..7451060437 100644 --- a/auth.rst +++ b/auth.rst @@ -16,7 +16,7 @@ The authenticator should be created :code:`NOINHERIT` and configured in the data .. image:: _static/security-anon-choice.png -Here are the technical details. We use `JSON Web Tokens `_ to authenticate API requests. As you'll recall a JWT contains a list of cryptographically signed claims. All claims are allowed but PostgREST cares specifically about a claim called role. +Here are the technical details. We use `JSON Web Tokens `_ to authenticate API requests. As you'll recall a JWT contains a list of cryptographically signed claims. All claims are allowed but PostgREST cares specifically about a claim called role. .. code:: json @@ -48,7 +48,7 @@ Roles for Each Web User PostgREST can accommodate either viewpoint. If you treat a role as a single user then the JWT-based role switching described above does most of what you need. When an authenticated user makes a request PostgREST will switch into the role for that user, which in addition to restricting queries, is available to SQL through the :code:`current_user` variable. -You can use row-level security to flexibly restrict visibility and access for the current user. Here is an `example `_ from Tomas Vondra, a chat table storing messages sent between users. Users can insert rows into it to send messages to other users, and query it to see messages sent to them by other users. +You can use row-level security to flexibly restrict visibility and access for the current user. Here is an `example `_ from Tomas Vondra, a chat table storing messages sent between users. Users can insert rows into it to send messages to other users, and query it to see messages sent to them by other users. .. code-block:: postgres @@ -208,14 +208,14 @@ To use Auth0, create `an application `_ for .. note:: - Our code requires a database role in the JWT. To add it you need to save the database role in Auth0 `app metadata `_. Then, you will need to write `a rule `_ that will extract the role from the user's app_metadata and set it as a `custom claim `_ in the access token. Note that, you may use Auth0's `core authorization feature `_ for more complex use cases. Metadata solution is mentioned here for simplicity. + Our code requires a database role in the JWT. To add it you need to save the database role in Auth0 `app metadata `_. Then, you will need to write `a rule `_ that will extract the role from the user's app_metadata and set it as a `custom claim `_ in the access token. Note that, you may use Auth0's `core authorization feature `_ for more complex use cases. Metadata solution is mentioned here for simplicity. .. code:: javascript function (user, context, callback) { // Follow the documentations at - // http://postgrest.org/en/latest/configuration.html#role-claim-key + // https://postgrest.org/en/latest/configuration.html#role-claim-key // to set a custom role claim on PostgREST // and use it as custom claim attribute in this rule const myRoleClaim = 'https://myapp.com/role'; diff --git a/configuration.rst b/configuration.rst index 8654866b1c..dddc9d0d59 100644 --- a/configuration.rst +++ b/configuration.rst @@ -16,7 +16,7 @@ The configuration file must contain a set of key value pairs. At minimum you mus # postgrest.conf # The standard connection URI format, documented at - # https://www.postgresql.org/docs/current/static/libpq-connect.html#AEN45347 + # https://www.postgresql.org/docs/current/libpq-connect.html#LIBPQ-CONNSTRING db-uri = "postgres://user:pass@host:5432/dbname" # The name of which database schema to expose to REST clients @@ -59,9 +59,9 @@ raw-media-types String db-uri ------ - The standard connection PostgreSQL `URI format `_. Symbols and unusual characters in the password or other fields should be percent encoded to avoid a parse error. If enforcing an SSL connection to the database is required you can use `sslmode `_ in the URI, for example ``postgres://user:pass@host:5432/dbname?sslmode=require``. + The standard connection PostgreSQL `URI format `_. Symbols and unusual characters in the password or other fields should be percent encoded to avoid a parse error. If enforcing an SSL connection to the database is required you can use `sslmode `_ in the URI, for example ``postgres://user:pass@host:5432/dbname?sslmode=require``. - When running PostgREST on the same machine as PostgreSQL, it is also possible to connect to the database using a `Unix socket `_ and the `Peer Authentication method `_ as an alternative to TCP/IP communication and authentication with a password, this also grants higher performance. To do this you can omit the host and the password, e.g. ``postgres://user@/dbname``, see the `libpq connection string `_ documentation for more details. + When running PostgREST on the same machine as PostgreSQL, it is also possible to connect to the database using a `Unix socket `_ and the `Peer Authentication method `_ as an alternative to TCP/IP communication and authentication with a password, this also grants higher performance. To do this you can omit the host and the password, e.g. ``postgres://user@/dbname``, see the `libpq connection string `_ documentation for more details. On older systems like Centos 6, with older versions of libpq, a different db-uri syntax has to be used. In this case the URI is a string of space separated key-value pairs (key=value), so the example above would be :code:`"host=host user=user port=5432 dbname=dbname password=pass"`. @@ -79,7 +79,7 @@ db-schema db-schema = "api" - This schema gets added to the `search_path `_ of every request. + This schema gets added to the `search_path `_ of every request. List of schemas ~~~~~~~~~~~~~~~ @@ -92,7 +92,7 @@ List of schemas If you don't :ref:`Switch Schemas `, the first schema in the list(``tenant1`` in this case) is chosen as the default schema. - *Only the chosen schema* gets added to the `search_path `_ of every request. + *Only the chosen schema* gets added to the `search_path `_ of every request. .. warning:: @@ -125,7 +125,7 @@ db-pool-timeout db-extra-search-path -------------------- - Extra schemas to add to the `search_path `_ of every request. These schemas tables, views and stored procedures **don't get API endpoints**, they can only be referred from the database objects inside your :ref:`db-schema`. + Extra schemas to add to the `search_path `_ of every request. These schemas tables, views and stored procedures **don't get API endpoints**, they can only be referred from the database objects inside your :ref:`db-schema`. This parameter was meant to make it easier to use **PostgreSQL extensions** (like PostGIS) that are outside of the :ref:`db-schema`. diff --git a/default.nix b/default.nix index b422be002b..a571acffb4 100644 --- a/default.nix +++ b/default.nix @@ -1,9 +1,9 @@ let # Commit of the Nixpkgs repository that we want to use. nixpkgsVersion = { - date = "2020-10-27"; - rev = "cd63096d6d887d689543a0b97743d28995bc9bc3"; - tarballHash = "1wg61h4gndm3vcprdcg7rc4s1v3jkm5xd7lw8r2f67w502y94gcy"; + date = "2021-04-04"; + rev = "c0e881852006b132236cbf0301bd1939bb50867e"; + tarballHash = "0fy7z7yxk5n7yslsvx5cyc6h21qwi4bhxf3awhirniszlbvaazy2"; }; # Nix files that describe the Nixpkgs repository. We evaluate the expression @@ -72,4 +72,12 @@ in | xargs -0 -n 1 -i \ sh -c "grep \"{}\" $FILES > /dev/null || echo \"{}\"" ''; + + linkcheck = + pkgs.writeShellScriptBin "postgrest-docs-linkcheck" + '' + set -euo pipefail + + ${python}/bin/sphinx-build -b linkcheck . _build + ''; } diff --git a/ecosystem.rst b/ecosystem.rst index 53c0f399b4..9344ba0f13 100644 --- a/ecosystem.rst +++ b/ecosystem.rst @@ -19,27 +19,26 @@ Community Tutorials Example Apps ------------ -* `monacoremo/postgrest-sessions-example `_ - example for cookie-based sessions -* `tatut/postgrest-ui `_ - ClojureScript UI components for PostgREST -* `priyank-purohit/PostGUI `_ - React Material UI admin panel -* `Qu4tro/pgrst-dev-setup `_ - docker-compose and tmuxp setup for experimentation. -* `subzerocloud/postgrest-starter-kit `_ - boilerplate for new project -* `NikolayS/postgrest-google-translate `_ - calling to external translation service -* `CodeforAustralia/heritage-near-me `_ - Elm and PostgREST with PostGIS -* `timwis/handsontable-postgrest `_ - an excel-like database table editor -* `Recmo/PostgrestSkeleton `_ - Docker Compose, PostgREST, Nginx and Auth0 -* `benoror/ember-postgrest-dynamic-ui `_ - generating Ember forms to edit data -* `ruslantalpa/blogdemo `_ - blog api demo in a vagrant image -* `timwis/ext-postgrest-crud `_ - browser-based spreadsheet -* `srid/chronicle `_ - tracking a tree of personal memories -* `diogob/elm-workshop `_ - building a simple database query UI -* `myfreeweb/moneylog `_ - accounting web app in Polymer + PostgREST -* `tyrchen/goodfilm `_ - example film api -* `begriffs/postgrest-example `_ - sqitch versioning for API -* `SMRxT/postgrest-demo `_ - multi-tenant logging system -* `PierreRochard/postgrest-boilerplate `_ - example auth back-end -* `marmelab/ng-admin-postgrest `_ - automatic database admin panel -* `seveibar/postgrest-vercel `_ - run PostgREST on Vercel (Serverless/AWS Lambda) +* `blogdemo `_ - blog api demo in a vagrant image +* `chronicle `_ - tracking a tree of personal memories +* `elm-workshop `_ - building a simple database query UI +* `ember-postgrest-dynamic-ui `_ - generating Ember forms to edit data +* `ext-postgrest-crud `_ - browser-based spreadsheet +* `general `_ - example auth back-end +* `goodfilm `_ - example film api +* `handsontable-postgrest `_ - an excel-like database table editor +* `heritage-near-me `_ - Elm and PostgREST with PostGIS +* `ng-admin-postgrest `_ - automatic database admin panel +* `pgrst-dev-setup `_ - docker-compose and tmuxp setup for experimentation. +* `postgrest-demo `_ - multi-tenant logging system +* `postgrest-example `_ - sqitch versioning for API +* `postgrest-sessions-example `_ - example for cookie-based sessions +* `postgrest-starter-kit `_ - boilerplate for new project +* `postgrest-translation-proxy `_ - calling to external translation service +* `postgrest-ui `_ - ClojureScript UI components for PostgREST +* `postgrest-vercel `_ - run PostgREST on Vercel (Serverless/AWS Lambda) +* `PostgrestSkeleton `_ - Docker Compose, PostgREST, Nginx and Auth0 +* `PostGUI `_ - React Material UI admin panel .. _eco_external_notification: @@ -48,14 +47,14 @@ External Notification These are PostgreSQL bridges that propagate LISTEN/NOTIFY to external queues for further processing. This allows stored procedures to initiate actions outside the database such as sending emails. -* `vbalasu/pg-notify-webhook `_ - trigger webhooks from PostgreSQL's LISTEN/NOTIFY -* `diogob/postgres-websockets `_ - expose web sockets for PostgreSQL's LISTEN/NOTIFY -* `frafra/postgresql2websocket `_ - Websockets -* `matthewmueller/pg-bridge `_ - Amazon SNS -* `aweber/pgsql-listen-exchange `_ - RabbitMQ -* `SpiderOak/skeeter `_ - ZeroMQ -* `FGRibreau/postgresql-to-amqp `_ - AMQP -* `daurnimator/pg-kinesis-bridge `_ - Amazon Kinesis +* `pg-bridge `_ - Amazon SNS +* `pg-kinesis-bridge `_ - Amazon Kinesis +* `pg-notify-webhook `_ - trigger webhooks from PostgreSQL's LISTEN/NOTIFY +* `pgsql-listen-exchange `_ - RabbitMQ +* `postgres-websockets `_ - expose web sockets for PostgreSQL's LISTEN/NOTIFY +* `postgresql-to-amqp `_ - AMQP +* `postgresql2websocket `_ - Websockets +* `skeeter `_ - ZeroMQ .. _eco_extensions: @@ -63,45 +62,45 @@ These are PostgreSQL bridges that propagate LISTEN/NOTIFY to external queues for Extensions ---------- +* `aiodata `_ - Python, event-based proxy and caching client. * `pg-safeupdate `_ - prevent full-table updates or deletes -* `srid/spas `_ - allow file uploads and basic auth -* `svmnotn/postgrest-auth `_ - OAuth2-inspired external auth server -* `wildsurfer/postgrest-oauth-server `_ - OAuth2 server -* `nblumoe/postgrest-oauth `_ - OAuth2 WAI middleware -* `criles25/postgrest-auth `_ - email based auth/signup -* `ppKrauss/PostgREST-writeAPI `_ - generate nginx rewrite rules to fit an OpenAPI spec -* `seveibar/postgrest-node `_ - Run a PostgREST server in Node.js via npm module -* `Exahilosys/aiodata `_ - Python, event-based proxy and caching client. +* `postgrest-auth (criles25) `_ - email based auth/signup +* `postgrest-auth (svmotn) `_ - OAuth2-inspired external auth server +* `postgrest-node `_ - Run a PostgREST server in Node.js via npm module +* `postgrest-oauth `_ - OAuth2 WAI middleware +* `postgrest-oauth/api `_ - OAuth2 server +* `PostgREST-writeAPI `_ - generate nginx rewrite rules to fit an OpenAPI spec +* `spas `_ - allow file uploads and basic auth .. _clientside_libraries: Client-Side Libraries --------------------- -* `supabase/postgrest-js `_ - TypeScript/JavaScript -* `supabase/postgrest-rs `_ - Rust -* `supabase/postgrest-dart `_ - Dart -* `supabase/postgrest-py `_ - Python -* `supabase/postgrest-csharp `_ - C# -* `supabase/postgrest-kt `_ - Kotlin -* `supabase/postgrest-swift `_ - Swift -* `technowledgy/vue-postgrest `_ - Vue.js -* `SocialGouv/postgrester `_ - JS + Typescript -* `Kong/py-postgrest `_ - Python -* `datrium/postgrest-pyclient `_ - Python -* `tomberek/aor-postgrest-client `_ - JS, admin-on-rest -* `hugomrdias/postgrest-url `_ - JS, just for generating query URLs -* `john-kelly/elm-postgrest `_ - Elm -* `mithril.postgrest `_ - JS, Mithril -* `lewisjared/postgrest-request `_ - JS, SuperAgent -* `JarvusInnovations/jarvus-postgrest-apikit `_ - JS, Sencha framework -* `davidthewatson/postgrest_python_requests_client `_ - Python -* `calebmer/postgrest-client `_ - JS -* `clesiemo3/postgrestR `_ - R -* `PierreRochard/postgrest-angular `_ - TypeScript, generate UI from API description -* `thejettdurham/postgrest-sharp-client `_ (needs maintainer) - C#, RestSharp -* `team142/ng-postgrest `_ - Angular app for browsing, editing data exposed over PostgREST. -* `andytango/redux-postgrest `_ - TypeScript/JS, client integrated with (React) Redux. +* `aor-postgrest-client `_ - JS, admin-on-rest +* `elm-postgrest `_ - Elm +* `general-angular `_ - TypeScript, generate UI from API description +* `jarvus-postgrest-apikit `_ - JS, Sencha framework +* `mithril-postgrest `_ - JS, Mithril +* `ng-postgrest `_ - Angular app for browsing, editing data exposed over PostgREST. +* `postgrest-client `_ - JS +* `postgrest-csharp `_ - C# +* `postgrest-dart `_ - Dart +* `postgrest-js `_ - TypeScript/JavaScript +* `postgrest-kt `_ - Kotlin +* `postgrest-py `_ - Python +* `postgrest-pyclient `_ - Python +* `postgrest-request `_ - JS, SuperAgent +* `postgrest-rs `_ - Rust +* `postgrest-sharp-client `_ (needs maintainer) - C#, RestSharp +* `postgrest-swift `_ - Swift +* `postgrest-url `_ - JS, just for generating query URLs +* `postgrestR `_ - R +* `postgrest_python_requests_client `_ - Python +* `postgrester `_ - JS + Typescript +* `py-postgrest `_ - Python +* `redux-postgrest `_ - TypeScript/JS, client integrated with (React) Redux. +* `vue-postgrest `_ - Vue.js .. _eco_commercial: diff --git a/how-tos/casting-type-to-custom-json.rst b/how-tos/casting-type-to-custom-json.rst index 1cc6061279..b4687bad2f 100644 --- a/how-tos/casting-type-to-custom-json.rst +++ b/how-tos/casting-type-to-custom-json.rst @@ -4,11 +4,11 @@ Casting a type to a custom JSON object :author: `steve-chavez `_ While using PostgREST you might have noticed that certain PostgreSQL types translate to JSON strings when you would -have expected a JSON object or array. For example, let's see the case of `range types `_. +have expected a JSON object or array. For example, let's see the case of `range types `_. .. code-block:: postgres - -- example taken from https://www.postgresql.org/docs/11/rangetypes.html#RANGETYPES-EXAMPLES + -- example taken from https://www.postgresql.org/docs/current/rangetypes.html#RANGETYPES-EXAMPLES create table reservations ( room int , during tsrange diff --git a/how-tos/providing-images-for-img.rst b/how-tos/providing-images-for-img.rst index a90c7939ee..5a1463d5ec 100644 --- a/how-tos/providing-images-for-img.rst +++ b/how-tos/providing-images-for-img.rst @@ -38,7 +38,7 @@ We can retrieve this image in binary format from our PostgREST API by requesting Unfortunately, putting the URL into the :code:`src` of an :code:`` tag will not work. That's because browsers do not send the required header. -Luckily, we can configure our `Nginx reverse proxy <../admin.html>`_ to fix this problem for us. +Luckily, we can configure our :ref:`Nginx reverse proxy ` to fix this problem for us. We assume that PostgREST is running on port 3000. We provide a new location :code:`/files/` that redirects requests to our endpoint with the :code:`Accept` header set to :code:`application/octet-stream`. diff --git a/index.rst b/index.rst index c071b055bc..5614f859fa 100644 --- a/index.rst +++ b/index.rst @@ -8,7 +8,7 @@ PostgREST Documentation .. image:: https://img.shields.io/github/stars/postgrest/postgrest.svg?style=social :target: https://github.com/PostgREST/postgrest -.. image:: https://img.shields.io/github/release/PostgREST/postgrest.svg +.. image:: https://img.shields.io/github/v/release/PostgREST/postgrest.svg :target: https://github.com/PostgREST/postgrest/releases .. image:: https://img.shields.io/docker/pulls/postgrest/postgrest.svg @@ -39,11 +39,11 @@ Sponsors :width: 13em .. image:: _static/retool.png - :target: https://tryretool.com/?utm_source=sponsor&utm_campaign=postgrest + :target: https://retool.com/?utm_source=sponsor&utm_campaign=postgrest :width: 13em .. image:: _static/supabase.png - :target: https://supabase.io?utm_source=postgrest%20backers&utm_medium=open%20source%20partner&utm_campaign=postgrest%20backers%20github&utm_term=homepage + :target: https://supabase.io/?utm_source=postgrest%20backers&utm_medium=open%20source%20partner&utm_campaign=postgrest%20backers%20github&utm_term=homepage :width: 13em | @@ -71,7 +71,7 @@ PostgREST has a focused scope. It works well with other tools like Nginx. This f Getting Support ---------------- -The project has a friendly and growing community. Join our `chat room `_ for discussion and help. You can also report or search for bugs/features on the Github `issues `_ page. +The project has a friendly and growing community. Join our `chat room `_ for discussion and help. You can also report or search for bugs/features on the Github `issues `_ page. .. toctree:: :glob: @@ -204,25 +204,21 @@ In Production Here are some companies that use PostgREST in production. -* `Sompani `_ +* `Catarse `_ * `Datrium `_ -* `Supabase `_ -* `Nimbus `_ - - See how Nimbus uses PostgREST in `Paul Copplestone's blog post `_. -* `Catarse `_ -* `Moat `_ -* `Netwo `_ -* `Redsmin `_ -* `Image-charts `_ -* `MotionDynamic - Fast highly dynamic video generation at scale `_ -* `Drip Depot `_ -* `Convene `_ by Thomson-Reuters -* `eGull `_ +* `Drip Depot `_ +* `eGull `_ * `Elyios `_ -* `Simply Connected Systems `_ - -.. * `OpenBooking `_ -.. * `triggerFS - A realtime messaging and distributed trigger system `_ +* `Image-charts `_ +* `Moat `_ +* `MotionDynamic - Fast highly dynamic video generation at scale `_ +* `Netwo `_ +* `Nimbus `_ + - See how Nimbus uses PostgREST in `Paul Copplestone's blog post `_. +* `OpenBooking `_ +* `Redsmin `_ +* `Sompani `_ +* `Supabase `_ Testimonials ------------ @@ -264,11 +260,6 @@ Testimonials -- Anupam Garg, Datrium, Inc. -Translations ------------- - -* `Chinese `_ (latest version ``v0.4.2.0``) - Contributing ------------ diff --git a/install.rst b/install.rst index 87d650c9de..8704afd40f 100644 --- a/install.rst +++ b/install.rst @@ -18,7 +18,7 @@ If you use **FreeBSD**, then you can install PostgREST from the `official ports pkg install hs-postgrest -If you use **Arch Linux**, then you can install PostgREST from the `community repo `_. +If you use **Arch Linux**, then you can install PostgREST from the `community repo `_. .. code:: bash @@ -30,7 +30,7 @@ If you use **Nix**, then you can install PostgREST from nixpkgs. nix-env -i haskellPackages.postgrest -If you use Windows, you can install PostgREST using `Chocolatey `_ or `Scoop `_. +If you use Windows, you can install PostgREST using `Chocolatey `_ or `Scoop `_. .. code:: bash @@ -252,7 +252,7 @@ Assuming you're making modifications locally and then pushing to GitHub, it's ea 1. Create a new app on Heroku 2. In Settings add the following buildpack :code:`https://github.com/PostgREST/postgrest-heroku` -3. Add the require Config Vars in Heroku (see https://github.com/PostgREST/postgrest/blob/master/app.json#L7-L57 for more details) +3. Add the require Config Vars in Heroku (see https://github.com/PostgREST/postgrest/blob/main/app.json for more details) 4. Modify your ``postgrest.conf`` file as required to match your Config Vars in Heroku 5. Create your :code:`Procfile` and add :code:`./env-to-config ./postgrest postgrest.conf` 6. Push your changes to GitHub diff --git a/releases/upcoming.rst b/releases/upcoming.rst index c7fb082c90..b7fa223234 100644 --- a/releases/upcoming.rst +++ b/releases/upcoming.rst @@ -25,5 +25,5 @@ Changed ------- * Docker images are now optimized to be built from the scratch image. This reduces the compressed image size from over 30 MB to about 4 MB. - For more details, see `Docker image built with Nix `_. + For more details, see `Docker image built with Nix `_. |br| -- `@monacoremo `_ diff --git a/releases/v5.2.0.rst b/releases/v5.2.0.rst index d49067b394..7cc90611b0 100644 --- a/releases/v5.2.0.rst +++ b/releases/v5.2.0.rst @@ -1,7 +1,7 @@ v5.2.0 ====== -* `Explicit qualification `_ introduced in ``v5.0`` is no longer necessary, this section will not be included from this version onwards. A :ref:`db-extra-search-path` configuration parameter was introduced to avoid the need to explictly qualify database objects. If you install PostgreSQL extensions on the ``public`` schema, they'll work normally from now on. +* `Explicit qualification `_ introduced in ``v5.0`` is no longer necessary, this section will not be included from this version onwards. A :ref:`db-extra-search-path` configuration parameter was introduced to avoid the need to explictly qualify database objects. If you install PostgreSQL extensions on the ``public`` schema, they'll work normally from now on. * Now you can filter :ref:`tabs-cols-w-spaces`. @@ -23,4 +23,4 @@ This release was made possible thanks to: * Victor Adossi * Petr Beles -If you like to join them please consider `supporting PostgREST development `_. +If you like to join them please consider `supporting PostgREST development `_. diff --git a/releases/v6.0.2.rst b/releases/v6.0.2.rst index 90cdfb514a..88a73ee5c8 100644 --- a/releases/v6.0.2.rst +++ b/releases/v6.0.2.rst @@ -13,7 +13,7 @@ Added * Ignoring payload keys for insert/update can be now done with the ``?columns`` query parameter. See :ref:`specify_columns`. |br| -- `@steve-chavez `_ -* `websearch_to_tsquery `_ can now be used +* `websearch_to_tsquery `_ can now be used through the ``wfts`` operator. See :ref:`fts`. |br| -- `@herulume `_ @@ -62,7 +62,7 @@ This release is sponsored by: :width: 13em .. image:: ../_static/retool.png - :target: https://tryretool.com/?utm_source=sponsor&utm_campaign=postgrest + :target: https://retool.com/?utm_source=sponsor&utm_campaign=postgrest :width: 13em * `Daniel Babiak `_ @@ -76,4 +76,4 @@ This release is sponsored by: * Christopher Reid * Nathan Bouscal -If you like to join them please consider `supporting PostgREST development `_. +If you like to join them please consider `supporting PostgREST development `_. diff --git a/releases/v7.0.0.rst b/releases/v7.0.0.rst index d725790863..34e5d46db6 100644 --- a/releases/v7.0.0.rst +++ b/releases/v7.0.0.rst @@ -85,7 +85,7 @@ This release was made possible thanks to: :width: 13em .. image:: ../_static/retool.png - :target: https://tryretool.com/?utm_source=sponsor&utm_campaign=postgrest + :target: https://retool.com/?utm_source=sponsor&utm_campaign=postgrest :width: 13em * `Daniel Babiak `_ @@ -103,4 +103,4 @@ This release was made possible thanks to: * David Fenko -If you like to join them please consider `supporting PostgREST development `_. +If you like to join them please consider `supporting PostgREST development `_. diff --git a/releases/v7.0.1.rst b/releases/v7.0.1.rst index 6adc232358..5186216e5d 100644 --- a/releases/v7.0.1.rst +++ b/releases/v7.0.1.rst @@ -48,7 +48,7 @@ This release was made possible thanks to: :width: 13em .. image:: ../_static/retool.png - :target: https://tryretool.com/?utm_source=sponsor&utm_campaign=postgrest + :target: https://retool.com/?utm_source=sponsor&utm_campaign=postgrest :width: 13em * `Daniel Babiak `_ @@ -66,4 +66,4 @@ This release was made possible thanks to: * David Fenko -If you'd like to join them, consider `supporting PostgREST development `_. +If you'd like to join them, consider `supporting PostgREST development `_. diff --git a/schema_structure.rst b/schema_structure.rst index c45f30f32b..d21b9332ef 100644 --- a/schema_structure.rst +++ b/schema_structure.rst @@ -8,7 +8,7 @@ Schema Isolation ================ -A PostgREST instance exposes all the tables, views, and stored procedures of a single `PostgreSQL schema `_ (a namespace of database objects). This means private data or implementation details can go inside different private schemas and be invisible to HTTP clients. +A PostgREST instance exposes all the tables, views, and stored procedures of a single `PostgreSQL schema `_ (a namespace of database objects). This means private data or implementation details can go inside different private schemas and be invisible to HTTP clients. It is recommended that you don't expose tables on your API schema. Instead expose views and stored procedures which insulate the internal details from the outside world. This allows you to change the internals of your schema and maintain backwards compatibility. It also keeps your code easier to refactor, and provides a natural way to do API versioning. @@ -20,7 +20,7 @@ This allows you to change the internals of your schema and maintain backwards co Functions ========= -By default, when a function is created, the privilege to execute it is not restricted by role. The function access is ``PUBLIC`` — executable by all roles (more details at `PostgreSQL Privileges page `_). This is not ideal for an API schema. To disable this behavior, you can run the following SQL statement: +By default, when a function is created, the privilege to execute it is not restricted by role. The function access is ``PUBLIC`` — executable by all roles (more details at `PostgreSQL Privileges page `_). This is not ideal for an API schema. To disable this behavior, you can run the following SQL statement: .. code-block:: postgres @@ -36,7 +36,7 @@ This will change the privileges for all functions created in the future in all s ALTER DEFAULT PRIVILEGES GRANT EXECUTE ON FUNCTIONS TO PUBLIC; - This will work because the :code:`alter default privileges` statement has effect on function created *after* it is executed. See `PostgreSQL alter default privileges `_ for more details. + This will work because the :code:`alter default privileges` statement has effect on function created *after* it is executed. See `PostgreSQL alter default privileges `_ for more details. After that, you'll need to grant EXECUTE privileges on functions explicitly: @@ -73,12 +73,12 @@ Another option is to define the function with the :code:`SECURITY DEFINER` optio end; $$ language plpgsql security definer; -Note the ``SECURITY DEFINER`` keywords at the end of the function. See `PostgreSQL documentation `_ for more details. +Note the ``SECURITY DEFINER`` keywords at the end of the function. See `PostgreSQL documentation `_ for more details. Views ===== -Views are invoked with the privileges of the view owner, much like stored procedures with the ``SECURITY DEFINER`` option. When created by a SUPERUSER role, all `row-level security `_ will be bypassed unless a different, non-SUPERUSER owner is specified. +Views are invoked with the privileges of the view owner, much like stored procedures with the ``SECURITY DEFINER`` option. When created by a SUPERUSER role, all `row-level security `_ will be bypassed unless a different, non-SUPERUSER owner is specified. For changing this, we can create a non-SUPERUSER role and make this role the view's owner. @@ -90,7 +90,7 @@ For changing this, we can create a non-SUPERUSER role and make this role the vie Rules ----- -Insertion on views with complex `rules `_ might not work out of the box with PostgREST. +Insertion on views with complex `rules `_ might not work out of the box with PostgREST. It's recommended that you `use triggers instead of rules `_. If you want to keep using rules, a workaround is to wrap the view insertion in a stored procedure and call it through the :ref:`s_procs` interface. For more details, see this `github issue `_. diff --git a/shell.nix b/shell.nix index 81649475d8..4800d62ec1 100644 --- a/shell.nix +++ b/shell.nix @@ -13,5 +13,6 @@ pkgs.mkShell { docs.serve docs.spellcheck docs.dictcheck + docs.linkcheck ]; } diff --git a/tutorials/tut0.rst b/tutorials/tut0.rst index a0c49bac2d..4d39ca5e71 100644 --- a/tutorials/tut0.rst +++ b/tutorials/tut0.rst @@ -23,9 +23,9 @@ As you begin the tutorial, pop open the project `chat room `_. Next, let's pull and start the database image: +If Docker is not installed, you can get it `here `_. Next, let's pull and start the database image: .. code-block:: bash @@ -109,7 +109,7 @@ You should see the psql command prompt: postgres=# -The first thing we'll do is create a `named schema `_ for the database objects which will be exposed in the API. We can choose any name we like, so how about "api." Execute this and the other SQL statements inside the psql prompt you started. +The first thing we'll do is create a `named schema `_ for the database objects which will be exposed in the API. We can choose any name we like, so how about "api." Execute this and the other SQL statements inside the psql prompt you started. .. code-block:: postgres From aa38221fc16d04eb5e8e82e3659e62b6d7d1340d Mon Sep 17 00:00:00 2001 From: Wolfgang Walther Date: Sun, 4 Apr 2021 16:06:45 +0200 Subject: [PATCH 387/711] Add linkcheck to CI --- .circleci/config.yml | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/.circleci/config.yml b/.circleci/config.yml index 2d7162fb6b..0cf4e87839 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -25,6 +25,18 @@ jobs: name: Run spellcheck command: postgrest-docs-spellcheck + linkcheck: + docker: + - image: nixos/nix:2.3 + steps: + - checkout + - run: + name: Install linkcheck script + command: nix-env -f default.nix -iA linkcheck + - run: + name: Run linkcheck + command: postgrest-docs-linkcheck + workflows: check: jobs: From d5b9f6cc8877e31e516ec18dac3127777cff3f2d Mon Sep 17 00:00:00 2001 From: Wolfgang Walther Date: Tue, 6 Apr 2021 11:09:33 +0200 Subject: [PATCH 388/711] fix postgrest repo link in CONTRIBUTING.md --- CONTRIBUTING.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 20fdb43dbe..be92f4d7a9 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,3 +1,3 @@ This repository follows the same contribution guidelines as the main PostgREST repository contribution guidelines: -https://github.com/PostgREST/postgrest/blob/master/.github/CONTRIBUTING.md +https://github.com/PostgREST/postgrest/blob/main/.github/CONTRIBUTING.md From 8273e270f2c594e609a4bbc371945f98bad9d095 Mon Sep 17 00:00:00 2001 From: Wolfgang Walther Date: Tue, 6 Apr 2021 15:43:32 +0200 Subject: [PATCH 389/711] Change http to https in README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 9f964a975d..29050fb9a6 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# PostgREST documentation http://postgrest.org/ +# PostgREST documentation https://postgrest.org/ PostgREST docs use the reStructuredText format, check this [cheatsheet](https://github.com/ralsina/rst-cheatsheet/blob/master/rst-cheatsheet.rst) to get acquainted with it. From 7e4810f0a6a2ccf72248762a51c2ebe31c242fc1 Mon Sep 17 00:00:00 2001 From: Wolfgang Walther Date: Tue, 6 Apr 2021 15:51:32 +0200 Subject: [PATCH 390/711] change Master to Main in heroku deploy steps --- install.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install.rst b/install.rst index 8704afd40f..6a682d8fd5 100644 --- a/install.rst +++ b/install.rst @@ -256,5 +256,5 @@ Assuming you're making modifications locally and then pushing to GitHub, it's ea 4. Modify your ``postgrest.conf`` file as required to match your Config Vars in Heroku 5. Create your :code:`Procfile` and add :code:`./env-to-config ./postgrest postgrest.conf` 6. Push your changes to GitHub -7. Set Heroku to automatically deploy from Master and then manually deploy the branch for the first build +7. Set Heroku to automatically deploy from Main and then manually deploy the branch for the first build From 535ebba219c0a564e68accf4e8eece99ecda92fd Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Fri, 9 Apr 2021 23:33:50 -0500 Subject: [PATCH 391/711] Remove subzero link --- ecosystem.rst | 7 ------- 1 file changed, 7 deletions(-) diff --git a/ecosystem.rst b/ecosystem.rst index 9344ba0f13..7761678340 100644 --- a/ecosystem.rst +++ b/ecosystem.rst @@ -101,10 +101,3 @@ Client-Side Libraries * `py-postgrest `_ - Python * `redux-postgrest `_ - TypeScript/JS, client integrated with (React) Redux. * `vue-postgrest `_ - Vue.js - -.. _eco_commercial: - -Commercial ---------------- - -* `subZero `_ - Automated GraphQL & REST API with built-in caching (powered in part by PostgREST) From 038fcc02b2eb96036ea85ad21ad517bb0b0acfff Mon Sep 17 00:00:00 2001 From: Amanda Date: Mon, 19 Apr 2021 01:04:34 -0700 Subject: [PATCH 392/711] Adding a hint to Hello World This note helps people who are hitting this error `{"hint":null,"details":null,"code":"42P01","message":"relation \"api.todos\" does not exist"}` https://github.com/PostgREST/postgrest/issues/1009 --- tutorials/tut0.rst | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/tutorials/tut0.rst b/tutorials/tut0.rst index 4d39ca5e71..04e6420a30 100644 --- a/tutorials/tut0.rst +++ b/tutorials/tut0.rst @@ -165,7 +165,10 @@ PostgREST uses a configuration file to tell it how to connect to the database. C db-schema = "api" db-anon-role = "web_anon" -The configuration file has other :ref:`options `, but this is all we need. Now run the server: +The configuration file has other :ref:`options `, but this is all we need. +If you are not using Docker, make sure that your port number is correct and replace `postgres` with the name of the database where you added the todos table. + +Now run the server: .. code-block:: bash From 27680197106e48686ef4d3716b30391f38413b09 Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Wed, 21 Apr 2021 17:00:44 -0500 Subject: [PATCH 393/711] Add GNUHost as a sponsor --- _static/empty.png | Bin 0 -> 468 bytes _static/gnuhost.png | Bin 0 -> 9360 bytes index.rst | 11 +++++++++++ 3 files changed, 11 insertions(+) create mode 100644 _static/empty.png create mode 100644 _static/gnuhost.png diff --git a/_static/empty.png b/_static/empty.png new file mode 100644 index 0000000000000000000000000000000000000000..99fabe47fdacf17f9341a7150d38ddb3d609bc36 GIT binary patch literal 468 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 KMNUMnLSTZ?dYi)l literal 0 HcmV?d00001 diff --git a/index.rst b/index.rst index 5614f859fa..380746df81 100644 --- a/index.rst +++ b/index.rst @@ -42,10 +42,21 @@ Sponsors :target: https://retool.com/?utm_source=sponsor&utm_campaign=postgrest :width: 13em +.. image:: _static/gnuhost.png + :target: https://gnuhost.eu/?utm_source=sponsor&utm_campaign=postgrest + :width: 13em + .. image:: _static/supabase.png :target: https://supabase.io/?utm_source=postgrest%20backers&utm_medium=open%20source%20partner&utm_campaign=postgrest%20backers%20github&utm_term=homepage :width: 13em +.. The static/empty.png(created with `convert -size 320x95 xc:#fcfcfc empty.png`) is an ugly workaround + to create space and center the logos. It's not easy to layout with restructuredText. + +.. image:: _static/empty.png + :target: #sponsors + :width: 13em + | Motivation From 92c5066a79f8a8298febece5da8d1d34d6b7b59b Mon Sep 17 00:00:00 2001 From: Lee Yi Jie Joel Date: Fri, 28 May 2021 21:45:50 +0800 Subject: [PATCH 394/711] docs: add elixir client library --- ecosystem.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/ecosystem.rst b/ecosystem.rst index 7761678340..5cc044ec8d 100644 --- a/ecosystem.rst +++ b/ecosystem.rst @@ -101,3 +101,6 @@ Client-Side Libraries * `py-postgrest `_ - Python * `redux-postgrest `_ - TypeScript/JS, client integrated with (React) Redux. * `vue-postgrest `_ - Vue.js +* `postgrest-ex `_ - Elixir + + From 07cc6547eefb3532ce18a91530cb5ccf3f702830 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Murat=20Mirg=C3=BCn=20ERCAN?= <45563173+muratmirgun@users.noreply.github.com> Date: Fri, 28 May 2021 22:21:04 +0300 Subject: [PATCH 395/711] Add Supabase-go Library Ecosystem --- ecosystem.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/ecosystem.rst b/ecosystem.rst index 5cc044ec8d..92507af6c1 100644 --- a/ecosystem.rst +++ b/ecosystem.rst @@ -86,6 +86,7 @@ Client-Side Libraries * `postgrest-client `_ - JS * `postgrest-csharp `_ - C# * `postgrest-dart `_ - Dart +* `postgrest-go `_ - Go * `postgrest-js `_ - TypeScript/JavaScript * `postgrest-kt `_ - Kotlin * `postgrest-py `_ - Python From 574e57d01af583e937fe5b70c240dc5feb4360b8 Mon Sep 17 00:00:00 2001 From: Wolfgang Walther Date: Tue, 6 Apr 2021 10:25:19 +0200 Subject: [PATCH 396/711] Upgrade nixpkgs to enable linkcheck in CI --- .circleci/config.yml | 2 +- default.nix | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 0cf4e87839..36c6ba737f 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -42,4 +42,4 @@ workflows: jobs: - build - spellcheck - + - linkcheck diff --git a/default.nix b/default.nix index a571acffb4..039ae825bf 100644 --- a/default.nix +++ b/default.nix @@ -1,9 +1,9 @@ let # Commit of the Nixpkgs repository that we want to use. nixpkgsVersion = { - date = "2021-04-04"; - rev = "c0e881852006b132236cbf0301bd1939bb50867e"; - tarballHash = "0fy7z7yxk5n7yslsvx5cyc6h21qwi4bhxf3awhirniszlbvaazy2"; + date = "2021-06-02"; + rev = "84aa23742f6c72501f9cc209f29c438766f5352d"; + tarballHash = "0h7xl6q0yjrbl9vm3h6lkxw692nm8bg3wy65gm95a2mivhrdjpxp"; }; # Nix files that describe the Nixpkgs repository. We evaluate the expression From 7447b03295e83ea922b171a2c0b5b14bfae0c22b Mon Sep 17 00:00:00 2001 From: Wolfgang Walther Date: Wed, 2 Jun 2021 09:10:24 +0200 Subject: [PATCH 397/711] Fix broken links --- api.rst | 2 +- auth.rst | 4 ++-- configuration.rst | 4 ++-- index.rst | 3 +-- releases/upcoming.rst | 2 +- 5 files changed, 7 insertions(+), 8 deletions(-) diff --git a/api.rst b/api.rst index d5951818af..7e2c8d9af8 100644 --- a/api.rst +++ b/api.rst @@ -472,7 +472,7 @@ If we make a similar request on ``bigtable``, which has 3573458 rows, we would g Response Format --------------- -PostgREST uses proper HTTP content negotiation (`RFC7231 `_) to deliver the desired representation of a resource. That is to say the same API endpoint can respond in different formats like JSON or CSV depending on the client request. +PostgREST uses proper HTTP content negotiation (`RFC7231 `_) to deliver the desired representation of a resource. That is to say the same API endpoint can respond in different formats like JSON or CSV depending on the client request. Use the Accept request header to specify the acceptable format (or formats) for the response: diff --git a/auth.rst b/auth.rst index 7451060437..3d0c915bf3 100644 --- a/auth.rst +++ b/auth.rst @@ -208,7 +208,7 @@ To use Auth0, create `an application `_ for .. note:: - Our code requires a database role in the JWT. To add it you need to save the database role in Auth0 `app metadata `_. Then, you will need to write `a rule `_ that will extract the role from the user's app_metadata and set it as a `custom claim `_ in the access token. Note that, you may use Auth0's `core authorization feature `_ for more complex use cases. Metadata solution is mentioned here for simplicity. + Our code requires a database role in the JWT. To add it you need to save the database role in Auth0 `app metadata `_. Then, you will need to write `a rule `_ that will extract the role from the user's app_metadata and set it as a `custom claim `_ in the access token. Note that, you may use Auth0's `core authorization feature `_ for more complex use cases. Metadata solution is mentioned here for simplicity. .. code:: javascript @@ -272,7 +272,7 @@ JWT security There are at least three types of common critiques against using JWT: 1) against the standard itself, 2) against using libraries with known security vulnerabilities, and 3) against using JWT for web sessions. We'll briefly explain each critique, how PostgREST deals with it, and give recommendations for appropriate user action. -The critique against the `JWT standard `_ is voiced in detail `elsewhere on the web `_. The most relevant part for PostgREST is the so-called :code:`alg=none` issue. Some servers implementing JWT allow clients to choose the algorithm used to sign the JWT. In this case, an attacker could set the algorithm to :code:`none`, remove the need for any signature at all and gain unauthorized access. The current implementation of PostgREST, however, does not allow clients to set the signature algorithm in the HTTP request, making this attack irrelevant. The critique against the standard is that it requires the implementation of the :code:`alg=none` at all. +The critique against the `JWT standard `_ is voiced in detail `elsewhere on the web `_. The most relevant part for PostgREST is the so-called :code:`alg=none` issue. Some servers implementing JWT allow clients to choose the algorithm used to sign the JWT. In this case, an attacker could set the algorithm to :code:`none`, remove the need for any signature at all and gain unauthorized access. The current implementation of PostgREST, however, does not allow clients to set the signature algorithm in the HTTP request, making this attack irrelevant. The critique against the standard is that it requires the implementation of the :code:`alg=none` at all. Critiques against JWT libraries are only relevant to PostgREST via the library it uses. As mentioned above, not allowing clients to choose the signature algorithm in HTTP requests removes the greatest risk. Another more subtle attack is possible where servers use asymmetric algorithms like RSA for signatures. Once again this is not relevant to PostgREST since it is not supported. Curious readers can find more information in `this article `_. Recommendations about high quality libraries for usage in API clients can be found on `jwt.io `_. diff --git a/configuration.rst b/configuration.rst index dddc9d0d59..b7f4e475d6 100644 --- a/configuration.rst +++ b/configuration.rst @@ -203,14 +203,14 @@ openapi-server-proxy-uri jwt-secret ---------- - The secret or `JSON Web Key (JWK) (or set) `_ used to decode JWT tokens clients provide for authentication. For security the key must be **at least 32 characters long**. If this parameter is not specified then PostgREST refuses authentication requests. Choosing a value for this parameter beginning with the at sign such as :code:`@filename` loads the secret out of an external file. This is useful for automating deployments. Note that any binary secrets must be base64 encoded. Both symmetric and asymmetric cryptography are supported. For more info see :ref:`asym_keys`. + The secret or `JSON Web Key (JWK) (or set) `_ used to decode JWT tokens clients provide for authentication. For security the key must be **at least 32 characters long**. If this parameter is not specified then PostgREST refuses authentication requests. Choosing a value for this parameter beginning with the at sign such as :code:`@filename` loads the secret out of an external file. This is useful for automating deployments. Note that any binary secrets must be base64 encoded. Both symmetric and asymmetric cryptography are supported. For more info see :ref:`asym_keys`. .. _jwt-aud: jwt-aud ------- - Specifies the `JWT audience claim `_. If this claim is present in the client provided JWT then you must set this to the same value as in the JWT, otherwise verifying the JWT will fail. + Specifies the `JWT audience claim `_. If this claim is present in the client provided JWT then you must set this to the same value as in the JWT, otherwise verifying the JWT will fail. .. _secret-is-base64: diff --git a/index.rst b/index.rst index 380746df81..b375f8b670 100644 --- a/index.rst +++ b/index.rst @@ -21,7 +21,7 @@ PostgREST Documentation :target: https://www.patreon.com/postgrest .. image:: https://img.shields.io/badge/Donate-PayPal-green.svg - :target: https://www.paypal.me/postgrest + :target: https://www.paypal.com/paypalme/postgrest | @@ -219,7 +219,6 @@ Here are some companies that use PostgREST in production. * `Datrium `_ * `Drip Depot `_ * `eGull `_ -* `Elyios `_ * `Image-charts `_ * `Moat `_ * `MotionDynamic - Fast highly dynamic video generation at scale `_ diff --git a/releases/upcoming.rst b/releases/upcoming.rst index b7fa223234..698e4f4ed7 100644 --- a/releases/upcoming.rst +++ b/releases/upcoming.rst @@ -25,5 +25,5 @@ Changed ------- * Docker images are now optimized to be built from the scratch image. This reduces the compressed image size from over 30 MB to about 4 MB. - For more details, see `Docker image built with Nix `_. + For more details, see `Docker image built with Nix `_. |br| -- `@monacoremo `_ From 8e0b67ed09fde863c9412bc5353f171145e00107 Mon Sep 17 00:00:00 2001 From: Wolfgang Walther Date: Wed, 2 Jun 2021 09:18:49 +0200 Subject: [PATCH 398/711] Sort ecosystem --- ecosystem.rst | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/ecosystem.rst b/ecosystem.rst index 92507af6c1..c89d12820e 100644 --- a/ecosystem.rst +++ b/ecosystem.rst @@ -86,6 +86,7 @@ Client-Side Libraries * `postgrest-client `_ - JS * `postgrest-csharp `_ - C# * `postgrest-dart `_ - Dart +* `postgrest-ex `_ - Elixir * `postgrest-go `_ - Go * `postgrest-js `_ - TypeScript/JavaScript * `postgrest-kt `_ - Kotlin @@ -96,12 +97,10 @@ Client-Side Libraries * `postgrest-sharp-client `_ (needs maintainer) - C#, RestSharp * `postgrest-swift `_ - Swift * `postgrest-url `_ - JS, just for generating query URLs -* `postgrestR `_ - R * `postgrest_python_requests_client `_ - Python * `postgrester `_ - JS + Typescript +* `postgrestR `_ - R * `py-postgrest `_ - Python * `redux-postgrest `_ - TypeScript/JS, client integrated with (React) Redux. * `vue-postgrest `_ - Vue.js -* `postgrest-ex `_ - Elixir - From a9dbd9e14f42493442a09e33cc5145b7a641fcf3 Mon Sep 17 00:00:00 2001 From: Wolfgang Walther Date: Thu, 3 Jun 2021 16:51:45 +0200 Subject: [PATCH 399/711] Add user-agent to sphinx config to fix some linkchecks --- conf.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/conf.py b/conf.py index 29f4382cb4..71122e56a5 100644 --- a/conf.py +++ b/conf.py @@ -289,3 +289,7 @@ def setup(app): app.add_css_file('css/custom.css') + +# taken from https://github.com/sphinx-doc/sphinx/blob/82dad44e5bd3776ecb6fd8ded656bc8151d0e63d/sphinx/util/requests.py#L42 +user_agent = 'Mozilla/5.0 (X11; Linux x86_64; rv:25.0) Gecko/20100101 Firefox/25.0' + From 326019cca2ba7fca378c632608bf15a61002424a Mon Sep 17 00:00:00 2001 From: laurenceisla Date: Mon, 14 Jun 2021 19:30:22 -0500 Subject: [PATCH 400/711] Add reference for OPTIONS on the API page (#407) * Add CORS documentation * Add options requests to upcoming page --- api.rst | 51 +++++++++++++++++++++++++++++++++++++++++++ postgrest.dict | 2 ++ releases/upcoming.rst | 5 +++++ 3 files changed, 58 insertions(+) diff --git a/api.rst b/api.rst index 7e2c8d9af8..7617b0841d 100644 --- a/api.rst +++ b/api.rst @@ -1452,6 +1452,57 @@ You can use a tool like `Swagger UI `_ to The OpenAPI information can go out of date as the schema changes under a running server. To learn how to refresh the cache see :ref:`schema_reloading`. +.. _options_requests: + +OPTIONS +======= + +You can verify which HTTP methods are allowed on endpoints for tables and views by using an OPTIONS request. These methods are allowed depending on what operations *can* be done on the table or view, not on the database permissions assigned to them. + +For example, the OPTIONS request and response for a table named ``people`` are: + +.. code-block:: http + + OPTIONS /people HTTP/1.1 + +.. code-block:: http + + HTTP/1.1 200 OK + Allow: OPTIONS,GET,HEAD,POST,PUT,PATCH,DELETE + +For a view, the methods are determined by the presence of INSTEAD OF TRIGGERS: + +.. table:: + :widths: auto + + +--------------------+-------------------------------------------------------------------------------------------------+ + | Method allowed | View's requirements | + +====================+=================================================================================================+ + | OPTIONS, GET, HEAD | None (Always allowed) | + +--------------------+-------------------------------------------------------------------------------------------------+ + | POST | INSTEAD OF INSERT TRIGGER | + +--------------------+-------------------------------------------------------------------------------------------------+ + | PUT | INSTEAD OF INSERT TRIGGER, INSTEAD OF UPDATE TRIGGER, also requires the presence of a | + | | primary key | + +--------------------+-------------------------------------------------------------------------------------------------+ + | PATCH | INSTEAD OF UPDATE TRIGGER | + +--------------------+-------------------------------------------------------------------------------------------------+ + | DELETE | INSTEAD OF DELETE TRIGGER | + +--------------------+-------------------------------------------------------------------------------------------------+ + | All the above methods are allowed for | + | `auto-updatable views `_ | + +--------------------+-------------------------------------------------------------------------------------------------+ + +For database function endpoints, OPTIONS requests are not supported. + +.. important:: + Whenever you add or remove tables or views, or modify a view's INSTEAD OF TRIGGERS on the database, you must refresh PostgREST's schema cache for OPTIONS requests to work properly. See the section :ref:`schema_reloading`. + +CORS +---- + +PostgREST sets highly permissive cross origin resource sharing, that is why it accepts Ajax requests from any domain. + .. _multiple-schemas: Switching Schemas diff --git a/postgrest.dict b/postgrest.dict index 0d043e8058..6530644f4b 100644 --- a/postgrest.dict +++ b/postgrest.dict @@ -17,6 +17,7 @@ centric changelog ClojureScript config +CORS cryptographically CSV Daemonizing @@ -146,6 +147,7 @@ UI ui unicode unix +updatable UPSERT uri url diff --git a/releases/upcoming.rst b/releases/upcoming.rst index 698e4f4ed7..1034cfbf54 100644 --- a/releases/upcoming.rst +++ b/releases/upcoming.rst @@ -12,9 +12,14 @@ Added * Allow HTTP status override through the :ref:`response.status ` GUC. |br| -- `@steve-chavez `_ + * Allow :ref:`s_procs_variadic`. |br| -- `@wolfgangwalther `_ +* Documentation improvements + + + Added the :ref:`OPTIONS requests ` section. + Fixed ----- From f7f3aadab86b4fb9c3498f349266ad560beb6049 Mon Sep 17 00:00:00 2001 From: laurenceisla Date: Fri, 18 Jun 2021 12:10:31 -0500 Subject: [PATCH 401/711] Reorganize the Schema Cache information into a separate reference page (#404) --- admin.rst | 50 +--------------- api.rst | 14 +---- index.rst | 7 +++ releases/upcoming.rst | 2 + schema_cache.rst | 131 ++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 143 insertions(+), 61 deletions(-) create mode 100644 schema_cache.rst diff --git a/admin.rst b/admin.rst index 2a8d03d4ff..03b7579c1a 100644 --- a/admin.rst +++ b/admin.rst @@ -196,58 +196,10 @@ Restart the database and watch the log file in real-time to understand how HTTP docker run -v "$(pwd)/init.sh":"/docker-entrypoint-initdb.d/init.sh" -d postgres docker logs -f -.. _schema_reloading: - Schema Reloading ---------------- -Users are often confused by PostgREST's database schema cache. It is present because detecting foreign key relationships between tables (including how those relationships pass through views) is necessary, but costly. API requests consult the schema cache as part of :ref:`resource_embedding`. However if the schema changes while the server is running it results in a stale cache and leads to errors claiming that no relations are detected between tables. - -.. important:: - - Since v5.0, PostgREST also makes use of the schema cache for stored functions metadata: parameters, return type, volatility. - It also uses the schema cache for resolving overloaded functions. You should refresh the cache if a change in any of the prior is done. - -To refresh the cache without restarting the PostgREST server, send the server process a SIGUSR1 signal: - -.. code:: bash - - killall -SIGUSR1 postgrest - -.. note:: - - To refresh the cache in docker: - - .. code:: bash - - docker kill -s SIGUSR1 - - # or in docker-compose - docker-compose kill -s SIGUSR1 - -The above is the manual way to do it. To automate the schema reloads, use a database trigger like this: - -.. code-block:: postgresql - - CREATE OR REPLACE FUNCTION public.notify_ddl_postgrest() - RETURNS event_trigger - LANGUAGE plpgsql - AS $$ - BEGIN - NOTIFY ddl_command_end; - END; - $$; - - CREATE EVENT TRIGGER ddl_postgrest ON ddl_command_end - EXECUTE PROCEDURE public.notify_ddl_postgrest(); - -Then run the `pg_listen `_ utility to monitor for that event and send a SIGUSR1 when it occurs: - -.. code-block:: bash - - pg_listen ddl_command_end $(which killall) -SIGUSR1 postgrest - -Now, whenever the structure of the database schema changes, PostgreSQL will notify the ``ddl_command_end`` channel, which will cause ``pg_listen`` to send PostgREST the signal to reload its cache. Note that pg_listen requires full path to the executable in the example above. +Changing the schema while the server is running can lead to errors due to a stale schema cache. To learn how to refresh the cache see :ref:`schema_reloading`. Daemonizing =========== diff --git a/api.rst b/api.rst index 7617b0841d..ae9006734d 100644 --- a/api.rst +++ b/api.rst @@ -990,6 +990,8 @@ In this case, only **source**, **publication_date** and **figure** will be inser Using this also has the side-effect of being more efficient for :ref:`bulk_insert` since PostgREST will not process the JSON and it'll send it directly to PostgreSQL. +.. _upsert: + UPSERT ------ @@ -1109,18 +1111,6 @@ For instance, assume we have created this function in the database. Whenever you create or change a function you must refresh PostgREST's schema cache. See the section :ref:`schema_reloading`. - If the schema cache is not refreshed, PostgREST will assume :code:`text` as the default type for function arguments. This could - lead to getting error responses like: - - .. code-block:: json - - { - "hint":"No function matches the given name and argument types. You might need to add explicit type casts.", - "details":null, - "code":"42883", - "message":"function test.add_them(a => text, b => text) does not exist" - } - The client can call it by posting an object like .. code-block:: http diff --git a/index.rst b/index.rst index b375f8b670..8b8e69e9ed 100644 --- a/index.rst +++ b/index.rst @@ -127,8 +127,15 @@ Technical references for PostgREST's functionality. configuration.rst +.. toctree:: + :caption: Schema Cache + :hidden: + + schema_cache.rst + - :doc:`API ` - :doc:`configuration` +- :doc:`Schema Cache ` Topic guides ------------ diff --git a/releases/upcoming.rst b/releases/upcoming.rst index 1034cfbf54..a3e10dc9fd 100644 --- a/releases/upcoming.rst +++ b/releases/upcoming.rst @@ -19,6 +19,8 @@ Added * Documentation improvements + Added the :ref:`OPTIONS requests ` section. + + Added the :ref:`schema_cache` section. + + Moved the :ref:`schema_reloading` reference from :ref:`admin` to :ref:`schema_cache` Fixed ----- diff --git a/schema_cache.rst b/schema_cache.rst new file mode 100644 index 0000000000..a57cf83f33 --- /dev/null +++ b/schema_cache.rst @@ -0,0 +1,131 @@ +.. _schema_cache: + +Schema Cache +============ + +PostgREST caches metadata from the database schema to avoid repeating expensive queries. This metadata is not required by all of the PostgREST features, only the following: + ++--------------------------------------------+-------------------------------------------------------------------------------+ +| Feature | Required Metadata | ++============================================+===============================================================================+ +| :ref:`resource_embedding` | Foreign key constraints | ++--------------------------------------------+-------------------------------------------------------------------------------+ +| :ref:`Stored Functions ` | Function signature (parameters, return type, volatility and | +| | `overloading `_) | ++--------------------------------------------+-------------------------------------------------------------------------------+ +| :ref:`Upserts ` | Primary keys | ++--------------------------------------------+-------------------------------------------------------------------------------+ +| :ref:`Insertions ` | Primary keys (optional: only if the Location header is requested) | ++--------------------------------------------+-------------------------------------------------------------------------------+ +| :ref:`OPTIONS requests ` | View INSTEAD OF TRIGGERS and primary keys | ++--------------------------------------------+-------------------------------------------------------------------------------+ +| :ref:`open-api` | Table columns, primary keys and foreign keys | ++ +-------------------------------------------------------------------------------+ +| | View columns and INSTEAD OF TRIGGERS | ++ +-------------------------------------------------------------------------------+ +| | Function signature | ++--------------------------------------------+-------------------------------------------------------------------------------+ + +The Stale Schema Cache +---------------------- + +When you make changes on the metadata mentioned above, the schema cache will turn stale on a running PostgREST. Future requests that use the above features will need the :ref:`schema cache to be reloaded `; otherwise, you'll get an error instead of the expected result. + +For instance, let's see what would happen if you have a stale schema for foreign key relationships and function signature: + +Stale Foreign Key Relationships +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Suppose you add a ``cities`` table to your database. This table has a foreign key referencing an existing ``countries`` table. Then, you make a request to get the ``cities`` and their belonging ``countries``: + +.. code-block:: http + + GET /cities?select=name,country:countries(id,name) HTTP/1.1 + +But instead, you get an error message that looks like this: + +.. code-block:: json + + { + "hint": "If a new foreign key between these entities was created in the database, try reloading the schema cache.", + "message": "Could not find a relationship between cities and countries in the schema cache" + } + +As you can see, PostgREST couldn't find the newly created foreign key in the schema cache. See the section :ref:`schema_reloading` to solve this issue. + +Stale Function Signature +~~~~~~~~~~~~~~~~~~~~~~~~ + +Suppose you create the following function while PostgREST is running: + +.. code-block:: plpgsql + + CREATE FUNCTION plus_one(num integer) + RETURNS integer AS $$ + SELECT num + 1; + $$ LANGUAGE SQL IMMUTABLE; + +Then, you make this request: + +.. code-block:: http + + GET /rpc/plus_one?num=1 HTTP/1.1 + +On a stale schema, PostgREST will assume :code:`text` as the default type for the function argument ``num``. Thus, the response you get is: + +.. code-block:: json + + { + "hint":"No function matches the given name and argument types. You might need to add explicit type casts.", + "details":null, + "code":"42883", + "message":"function test.plus_one(num => text) does not exist" + } + +See the section :ref:`schema_reloading` to solve this issue. + +.. _schema_reloading: + +Schema Cache Reloading +---------------------- + +To refresh the cache without restarting the PostgREST server, send the server process a SIGUSR1 signal: + +.. code:: bash + + killall -SIGUSR1 postgrest + +.. note:: + + To refresh the cache in docker: + + .. code:: bash + + docker kill -s SIGUSR1 + + # or in docker-compose + docker-compose kill -s SIGUSR1 + +The above is the manual way to do it. To automate cache reloads, use a database trigger like this: + +.. code-block:: postgresql + + CREATE OR REPLACE FUNCTION public.notify_ddl_postgrest() + RETURNS event_trigger + LANGUAGE plpgsql + AS $$ + BEGIN + NOTIFY ddl_command_end; + END; + $$; + + CREATE EVENT TRIGGER ddl_postgrest ON ddl_command_end + EXECUTE PROCEDURE public.notify_ddl_postgrest(); + +Then run the `pg_listen `_ utility to monitor for that event and send a SIGUSR1 when it occurs: + +.. code-block:: bash + + pg_listen ddl_command_end $(which killall) -SIGUSR1 postgrest + +Now, whenever the structure of the database changes, PostgreSQL will notify the ``ddl_command_end`` channel, which will cause ``pg_listen`` to send PostgREST the signal to reload its cache. Note that pg_listen requires full path to the executable in the example above. From 3f2a58ab7657c82ddb71a095c7a71fd0f4d2fc7b Mon Sep 17 00:00:00 2001 From: Laurence Isla Date: Mon, 12 Jul 2021 17:04:55 -0500 Subject: [PATCH 402/711] Add Oblivious as a sponsor --- _static/oblivious.jpg | Bin 0 -> 27612 bytes index.rst | 10 +++++++--- 2 files changed, 7 insertions(+), 3 deletions(-) create mode 100644 _static/oblivious.jpg diff --git a/_static/oblivious.jpg b/_static/oblivious.jpg new file mode 100644 index 0000000000000000000000000000000000000000..955e1a57d324c5a4423db4a66d8096ed4cf4a7ea GIT binary patch literal 27612 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�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 literal 0 HcmV?d00001 diff --git a/index.rst b/index.rst index 8b8e69e9ed..795d1a4796 100644 --- a/index.rst +++ b/index.rst @@ -50,12 +50,16 @@ Sponsors :target: https://supabase.io/?utm_source=postgrest%20backers&utm_medium=open%20source%20partner&utm_campaign=postgrest%20backers%20github&utm_term=homepage :width: 13em +.. image:: _static/oblivious.jpg + :target: https://oblivious.ai/?utm_source=sponsor&utm_campaign=postgrest + :width: 13em + .. The static/empty.png(created with `convert -size 320x95 xc:#fcfcfc empty.png`) is an ugly workaround to create space and center the logos. It's not easy to layout with restructuredText. -.. image:: _static/empty.png - :target: #sponsors - :width: 13em +.. .. image:: _static/empty.png + :target: #sponsors + :width: 13em | From 8562f48a37d3cf9834d67da7ff05ec096dc4d1b8 Mon Sep 17 00:00:00 2001 From: laurenceisla Date: Tue, 20 Jul 2021 16:15:17 -0500 Subject: [PATCH 403/711] Add openapi-mode configuration option --- api.rst | 8 +++++++- configuration.rst | 36 +++++++++++++++++++++++++++++------- releases/upcoming.rst | 3 +++ 3 files changed, 39 insertions(+), 8 deletions(-) diff --git a/api.rst b/api.rst index ae9006734d..735aa29402 100644 --- a/api.rst +++ b/api.rst @@ -1410,7 +1410,13 @@ This follows the same rules as :ref:`binary_output`. OpenAPI Support =============== -Every API hosted by PostgREST automatically serves a full `OpenAPI `_ description on the root path. This provides a list of all endpoints(tables, foreign tables, views, functions), along with supported HTTP verbs and example payloads. For extra customization, the OpenAPI output contains a "description" field for every `SQL comment `_ on any database object. For instance, +Every API hosted by PostgREST automatically serves a full `OpenAPI `_ description on the root path. This provides a list of all endpoints (tables, foreign tables, views, functions), along with supported HTTP verbs and example payloads. + +.. note:: + + By default, this output depends on the permissions of the role that is contained in the JWT role claim (or the :ref:`db-anon-role` if no JWT is sent). If you need to show all the endpoints disregarding the role's permissions, set the :ref:`openapi-mode` config to :code:`ignore_privileges`. + +For extra customization, the OpenAPI output contains a "description" field for every `SQL comment `_ on any database object. For instance, .. code-block:: sql diff --git a/configuration.rst b/configuration.rst index b7f4e475d6..960002b674 100644 --- a/configuration.rst +++ b/configuration.rst @@ -30,12 +30,12 @@ The user specified in the db-uri is also known as the authenticator role. For mo Here is the full list of configuration parameters. -======================== ======= ========= ======== -Name Type Default Required -======================== ======= ========= ======== -db-uri String Y -db-schema String Y -db-anon-role String Y +======================== ======= ================= ======== +Name Type Default Required +======================== ======= ================= ======== +db-uri String Y +db-schema String Y +db-anon-role String Y db-pool Int 10 db-pool-timeout Int 10 db-extra-search-path String public @@ -43,6 +43,7 @@ server-host String !4 server-port Int 3000 server-unix-socket String server-unix-socket-mode String 660 +openapi-mode String follow-privileges openapi-server-proxy-uri String jwt-secret String jwt-aud String @@ -52,7 +53,7 @@ pre-request String app.settings.* String role-claim-key String .role raw-media-types String -======================== ======= ========= ======== +======================== ======= ================= ======== .. _db-uri: @@ -175,6 +176,27 @@ server-unix-socket-mode server-unix-socket-mode = "660" +.. _openapi-mode: + +openapi-mode +------------ + + Specifies how the OpenAPI output should be displayed: + + .. code:: bash + + # Follows the privileges of the JWT role claim (or from db-anon-role if the JWT is not sent) + # Shows information depending on the permissions that the role making the request has + openapi-mode = "follow-privileges" + + # Ignores the privileges of the JWT role claim (or from db-anon-role if the JWT is not sent) + # Shows all the exposed information, regardless of the permissions that the role making the request has + openapi-mode = "ignore-privileges" + + # Disables the OpenApi output altogether. + # Throws a `404 Not Found` error when accessing the API root path + openapi-mode = "disabled" + .. _openapi-server-proxy-uri: openapi-server-proxy-uri diff --git a/releases/upcoming.rst b/releases/upcoming.rst index a3e10dc9fd..398370f05c 100644 --- a/releases/upcoming.rst +++ b/releases/upcoming.rst @@ -16,6 +16,9 @@ Added * Allow :ref:`s_procs_variadic`. |br| -- `@wolfgangwalther `_ +* Config options for showing a full OpenAPI output regardless of the JWT role privileges and for disabling it altogether. See :ref:`openapi-mode`. + |br| -- `@steve-chavez `_ + * Documentation improvements + Added the :ref:`OPTIONS requests ` section. From 204b0ed25950162df36b130b1d668409b096f691 Mon Sep 17 00:00:00 2001 From: laurenceisla Date: Tue, 20 Jul 2021 16:40:45 -0500 Subject: [PATCH 404/711] Add improved error messages for RPC on a stale schema Error message for a not found RPC. Unsupported overloaded RPC with the same argument names but different types. --- api.rst | 4 ++++ releases/upcoming.rst | 4 ++++ schema_cache.rst | 14 +++++++------- 3 files changed, 15 insertions(+), 7 deletions(-) diff --git a/api.rst b/api.rst index 735aa29402..2dea57d3fe 100644 --- a/api.rst +++ b/api.rst @@ -1346,6 +1346,10 @@ You can call overloaded functions with different number of arguments. GET /rpc/rental_duration?customer_id=232&from_date=2018-07-01 HTTP/1.1 +.. important:: + + Overloaded functions with the same argument names but different types are not supported. + .. _binary_output: Binary Output diff --git a/releases/upcoming.rst b/releases/upcoming.rst index 398370f05c..cfebed6d28 100644 --- a/releases/upcoming.rst +++ b/releases/upcoming.rst @@ -37,3 +37,7 @@ Changed * Docker images are now optimized to be built from the scratch image. This reduces the compressed image size from over 30 MB to about 4 MB. For more details, see `Docker image built with Nix `_. |br| -- `@monacoremo `_ + +* Improved error message for a not found RPC on a stale schema (see :ref:`stale_function_signature`) and for the unsupported case of + overloaded functions with the same argument names but different types. + |br| -- `@laurenceisla `_ diff --git a/schema_cache.rst b/schema_cache.rst index a57cf83f33..9e994c75eb 100644 --- a/schema_cache.rst +++ b/schema_cache.rst @@ -53,6 +53,8 @@ But instead, you get an error message that looks like this: As you can see, PostgREST couldn't find the newly created foreign key in the schema cache. See the section :ref:`schema_reloading` to solve this issue. +.. _stale_function_signature: + Stale Function Signature ~~~~~~~~~~~~~~~~~~~~~~~~ @@ -71,16 +73,14 @@ Then, you make this request: GET /rpc/plus_one?num=1 HTTP/1.1 -On a stale schema, PostgREST will assume :code:`text` as the default type for the function argument ``num``. Thus, the response you get is: +Next, PostgREST tries to find the function on the stale schema to no avail: .. code-block:: json - { - "hint":"No function matches the given name and argument types. You might need to add explicit type casts.", - "details":null, - "code":"42883", - "message":"function test.plus_one(num => text) does not exist" - } + { + "hint": "If a new function was created in the database with this name and arguments, try reloading the schema cache.", + "message": "Could not find the api.plus_one(num) function in the schema cache" + } See the section :ref:`schema_reloading` to solve this issue. From a7cddd8ecebcb74e8c3a2026eda4fa121f68c830 Mon Sep 17 00:00:00 2001 From: laurenceisla Date: Wed, 21 Jul 2021 14:40:34 -0500 Subject: [PATCH 405/711] Add log-level config option --- configuration.rst | 24 +++++++++++++++++++++++- releases/upcoming.rst | 6 ++++++ 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/configuration.rst b/configuration.rst index 960002b674..577d14ae9f 100644 --- a/configuration.rst +++ b/configuration.rst @@ -43,6 +43,7 @@ server-host String !4 server-port Int 3000 server-unix-socket String server-unix-socket-mode String 660 +log-level String error openapi-mode String follow-privileges openapi-server-proxy-uri String jwt-secret String @@ -176,12 +177,33 @@ server-unix-socket-mode server-unix-socket-mode = "660" +.. _log-level: + +log-level +--------- + + Specifies the level of information to be logged while running PostgREST. + + .. code:: bash + + # Only startup and db connection recovery messages are logged + log-level = "crit" + + # All the "crit" level events plus server errors (status 5xx) are logged + log-level = "error" + + # All the "error" level events plus request errors (status 4xx) are logged + log-level = "warning" + + # All the "warning" level events plus all requests (every status code) are logged + log-level "info" + .. _openapi-mode: openapi-mode ------------ - Specifies how the OpenAPI output should be displayed: + Specifies how the OpenAPI output should be displayed. .. code:: bash diff --git a/releases/upcoming.rst b/releases/upcoming.rst index cfebed6d28..8de3d97b1d 100644 --- a/releases/upcoming.rst +++ b/releases/upcoming.rst @@ -19,6 +19,9 @@ Added * Config options for showing a full OpenAPI output regardless of the JWT role privileges and for disabling it altogether. See :ref:`openapi-mode`. |br| -- `@steve-chavez `_ +* Config option for logging level. See :ref:`log-level`. + |br| -- `@steve-chavez `_ + * Documentation improvements + Added the :ref:`OPTIONS requests ` section. @@ -41,3 +44,6 @@ Changed * Improved error message for a not found RPC on a stale schema (see :ref:`stale_function_signature`) and for the unsupported case of overloaded functions with the same argument names but different types. |br| -- `@laurenceisla `_ + +* Modified the default logging level from ``info`` to ``error``. See :ref:`log-level`. + |br| -- `@steve-chavez `_ \ No newline at end of file From f5c5094d7dbc8ae6efa787211f3cbb03a90d51a4 Mon Sep 17 00:00:00 2001 From: laurenceisla Date: Wed, 21 Jul 2021 19:49:41 -0500 Subject: [PATCH 406/711] Add db-tx-end config option --- configuration.rst | 23 ++++++++++++++++++++++- postgrest.dict | 1 + releases/upcoming.rst | 3 +++ 3 files changed, 26 insertions(+), 1 deletion(-) diff --git a/configuration.rst b/configuration.rst index 577d14ae9f..b6b9db3d64 100644 --- a/configuration.rst +++ b/configuration.rst @@ -39,6 +39,7 @@ db-anon-role String Y db-pool Int 10 db-pool-timeout Int 10 db-extra-search-path String public +db-tx-end String commit server-host String !4 server-port Int 3000 server-unix-socket String @@ -133,6 +134,27 @@ db-extra-search-path Multiple schemas can be added in a comma-separated string, e.g. ``public, extensions``. +.. _db-tx-end: + +db-tx-end +--------- + + Specifies how to terminate the database transactions. + + .. code:: bash + + # The transaction is always committed + db-tx-end = "commit" + + # The transaction is committed unless a "Prefer: tx=rollback" header is sent + db-tx-end = "commit-allow-override" + + # The transaction is always rolled back + db-tx-end = "rollback" + + # The transaction is rolled back unless a "Prefer: tx=commit" header is sent + db-tx-end = "rollback-allow-override" + .. _server-host: server-host @@ -317,4 +339,3 @@ raw-media-types raw-media-types="image/png, text/xml" - diff --git a/postgrest.dict b/postgrest.dict index 6530644f4b..6d86f45b20 100644 --- a/postgrest.dict +++ b/postgrest.dict @@ -142,6 +142,7 @@ todo todos Tsingson tsquery +tx TypeScript UI ui diff --git a/releases/upcoming.rst b/releases/upcoming.rst index 8de3d97b1d..4a8f356880 100644 --- a/releases/upcoming.rst +++ b/releases/upcoming.rst @@ -22,6 +22,9 @@ Added * Config option for logging level. See :ref:`log-level`. |br| -- `@steve-chavez `_ +* Config option for specifying how to terminate the transactions (allowing rollbacks, useful for testing). See :ref:`db-tx-end`. + |br| -- `@wolfgangwalther `_ + * Documentation improvements + Added the :ref:`OPTIONS requests ` section. From 41325fd9ba6856fb45e1232be6e2dbe6a5189c37 Mon Sep 17 00:00:00 2001 From: laurenceisla Date: Fri, 23 Jul 2021 11:41:47 -0500 Subject: [PATCH 407/711] Add db-prepared-statements config option --- admin.rst | 13 +++++++++++++ configuration.rst | 12 ++++++++++++ postgrest.dict | 2 ++ releases/upcoming.rst | 6 ++++++ 4 files changed, 33 insertions(+) diff --git a/admin.rst b/admin.rst index 03b7579c1a..4a1c7ab263 100644 --- a/admin.rst +++ b/admin.rst @@ -120,6 +120,19 @@ The burst argument tells Nginx to start dropping requests if more than five queu Nginx rate limiting is general and indiscriminate. To rate limit each authenticated request individually you will need to add logic in a :ref:`Custom Validation ` function. +.. _connection_poolers: + +Using Connection Poolers +------------------------ + +In order to increase performance, PostgREST uses prepared statements by default. However, this setting is incompatible with connection poolers such as PgBouncer working in transaction pooling mode. In this case, you need to set the :ref:`db-prepared-statements` config option to ``false``. On the other hand, session pooling is fully compatible with PostgREST, while statement pooling is not compatible at all. + +.. note:: + + If prepared statements are enabled, PostgREST will quit after detecting that transaction or statement pooling is being used. + +You should also set the ``db-channel-enabled`` config option to ``false``, due to the ``LISTEN`` command not being compatible with transaction pooling, although it should not give any errors if it's left enabled by default. + Debugging ========= diff --git a/configuration.rst b/configuration.rst index b6b9db3d64..066b117be4 100644 --- a/configuration.rst +++ b/configuration.rst @@ -39,6 +39,7 @@ db-anon-role String Y db-pool Int 10 db-pool-timeout Int 10 db-extra-search-path String public +db-prepared-statements Boolean True db-tx-end String commit server-host String !4 server-port Int 3000 @@ -134,6 +135,17 @@ db-extra-search-path Multiple schemas can be added in a comma-separated string, e.g. ``public, extensions``. +.. _db-prepared-statements: + +db-prepared-statements +---------------------- + + Enables or disables prepared statements. + + When disabled, the generated queries will be parameterized (invulnerable to SQL injection) but they will not be prepared (cached in the database session). Not using prepared statements will noticeably decrease performance, so it's recommended to always have this setting enabled. + + You should only set this to ``false`` when using PostgresSQL behind a connection pooler such as PgBouncer working in transaction pooling mode. See :ref:`this section ` for more information. + .. _db-tx-end: db-tx-end diff --git a/postgrest.dict b/postgrest.dict index 6d86f45b20..7c36449399 100644 --- a/postgrest.dict +++ b/postgrest.dict @@ -88,6 +88,7 @@ ov passphrase Pelletier Petr +PgBouncer pgcrypto pgjwt pgSQL @@ -95,6 +96,7 @@ phfts phraseto plainto plfts +poolers PostGIS PostgreSQL PostgreSQL's diff --git a/releases/upcoming.rst b/releases/upcoming.rst index 4a8f356880..d35310ceb6 100644 --- a/releases/upcoming.rst +++ b/releases/upcoming.rst @@ -16,12 +16,18 @@ Added * Allow :ref:`s_procs_variadic`. |br| -- `@wolfgangwalther `_ +* Allow :ref:`connection_poolers` such as PgBouncer in transaction pooling mode. + |br| -- `@laurenceisla `_ + * Config options for showing a full OpenAPI output regardless of the JWT role privileges and for disabling it altogether. See :ref:`openapi-mode`. |br| -- `@steve-chavez `_ * Config option for logging level. See :ref:`log-level`. |br| -- `@steve-chavez `_ +* Config option for enabling or disabling prepared statements. See :ref:`db-prepared-statements`. + |br| -- `@steve-chavez `_ + * Config option for specifying how to terminate the transactions (allowing rollbacks, useful for testing). See :ref:`db-tx-end`. |br| -- `@wolfgangwalther `_ From 77faf9e9bc6088be3916eac0e1a1e2e1897eb62c Mon Sep 17 00:00:00 2001 From: laurenceisla Date: Fri, 23 Jul 2021 17:15:30 -0500 Subject: [PATCH 408/711] Add explicit headers-only POST request using Prefer header and default the request to minimal --- api.rst | 2 +- releases/upcoming.rst | 9 ++++++++- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/api.rst b/api.rst index 2dea57d3fe..3ec32d019b 100644 --- a/api.rst +++ b/api.rst @@ -889,7 +889,7 @@ To create a row in a database table post a JSON object whose keys are the names { "col1": "value1", "col2": "value2" } -If the table has a primary key, the response will include a :code:`Location` header describing where to find the new object. If the table is write-only then constructing the Location header will cause a permissions error. To successfully insert an item to a write-only table you will need to suppress the Location response header by including the request header :code:`Prefer: return=minimal`. +If the table has a primary key, the response can contain a :code:`Location` header describing where to find the new object by including the header :code:`Prefer: return=headers-only` in the request. Make sure that the table is not write-only, otherwise constructing the :code:`Location` header will cause a permissions error. On the other end of the spectrum you can get the full created object back in the response to your request by including the header :code:`Prefer: return=representation`. That way you won't have to make another HTTP call to discover properties that may have been filled in on the server side. You can also apply the standard :ref:`v_filter` to these results. diff --git a/releases/upcoming.rst b/releases/upcoming.rst index d35310ceb6..81c3a8a575 100644 --- a/releases/upcoming.rst +++ b/releases/upcoming.rst @@ -16,6 +16,9 @@ Added * Allow :ref:`s_procs_variadic`. |br| -- `@wolfgangwalther `_ +* Allow sending the header ``Prefer: headers-only`` to get a response with a ``Location`` header. See :ref:`insert_update`. + |br| -- `@laurenceisla `_ + * Allow :ref:`connection_poolers` such as PgBouncer in transaction pooling mode. |br| -- `@laurenceisla `_ @@ -55,4 +58,8 @@ Changed |br| -- `@laurenceisla `_ * Modified the default logging level from ``info`` to ``error``. See :ref:`log-level`. - |br| -- `@steve-chavez `_ \ No newline at end of file + |br| -- `@steve-chavez `_ + +* POST requests for insertions no longer include a ``Location`` header in the response by default and behave the same way as having a + ``Prefer: return=minimal`` header in the request. This prevents permissions errors when having a write-only table. See :ref:`insert_update`. + |br| -- `@laurenceisla `_ From 5cbabe4a2129a48dc3bfc8c8d93e1f09f395da11 Mon Sep 17 00:00:00 2001 From: laurenceisla Date: Sat, 24 Jul 2021 16:27:02 -0500 Subject: [PATCH 409/711] Add database notification functionality and configuration variables for schema reloading --- admin.rst | 2 +- configuration.rst | 18 ++++++++++++++++++ postgrest.dict | 1 + releases/upcoming.rst | 7 +++++++ schema_cache.rst | 42 ++++++++++++++++++++++++++++++------------ 5 files changed, 57 insertions(+), 13 deletions(-) diff --git a/admin.rst b/admin.rst index 4a1c7ab263..7b5e5e95f4 100644 --- a/admin.rst +++ b/admin.rst @@ -131,7 +131,7 @@ In order to increase performance, PostgREST uses prepared statements by default. If prepared statements are enabled, PostgREST will quit after detecting that transaction or statement pooling is being used. -You should also set the ``db-channel-enabled`` config option to ``false``, due to the ``LISTEN`` command not being compatible with transaction pooling, although it should not give any errors if it's left enabled by default. +You should also set the :ref:`db-channel-enabled` config option to ``false``, due to the ``LISTEN`` command not being compatible with transaction pooling, although it should not give any errors if it's left enabled by default. Debugging ========= diff --git a/configuration.rst b/configuration.rst index 066b117be4..bed5a750db 100644 --- a/configuration.rst +++ b/configuration.rst @@ -39,6 +39,8 @@ db-anon-role String Y db-pool Int 10 db-pool-timeout Int 10 db-extra-search-path String public +db-channel String pgrst +db-channel-enabled Boolean True db-prepared-statements Boolean True db-tx-end String commit server-host String !4 @@ -135,6 +137,22 @@ db-extra-search-path Multiple schemas can be added in a comma-separated string, e.g. ``public, extensions``. +.. _db-channel: + +db-channel +---------- + + The name of the notification channel that PostgREST uses for :ref:`schema_reloading` and configuration reloading. + +.. _db-channel-enabled: + +db-channel-enabled +------------------ + + When this is set to :code:`true`, the notification channel specified in :ref:`db-channel` is enabled. + + You should set this to ``false`` when using PostgresSQL behind a connection pooler such as PgBouncer working in transaction pooling mode. See :ref:`this section ` for more information. + .. _db-prepared-statements: db-prepared-statements diff --git a/postgrest.dict b/postgrest.dict index 7c36449399..bc12f84384 100644 --- a/postgrest.dict +++ b/postgrest.dict @@ -91,6 +91,7 @@ Petr PgBouncer pgcrypto pgjwt +pgrst pgSQL phfts phraseto diff --git a/releases/upcoming.rst b/releases/upcoming.rst index 81c3a8a575..cda81ff1bc 100644 --- a/releases/upcoming.rst +++ b/releases/upcoming.rst @@ -16,6 +16,9 @@ Added * Allow :ref:`s_procs_variadic`. |br| -- `@wolfgangwalther `_ +* Allow schema cache reloading using PostgreSQL :ref:`NOTIFY ` command. + |br| -- `@steve-chavez `_ + * Allow sending the header ``Prefer: headers-only`` to get a response with a ``Location`` header. See :ref:`insert_update`. |br| -- `@laurenceisla `_ @@ -53,6 +56,10 @@ Changed For more details, see `Docker image built with Nix `_. |br| -- `@monacoremo `_ +* The ``pg_listen`` `utility `_ is no longer needed to automatically reload the schema cache + and it's replaced entirely by database notifications. See :ref:`schema_reloading_notify`. + |br| -- `@steve-chavez `_ + * Improved error message for a not found RPC on a stale schema (see :ref:`stale_function_signature`) and for the unsupported case of overloaded functions with the same argument names but different types. |br| -- `@laurenceisla `_ diff --git a/schema_cache.rst b/schema_cache.rst index 9e994c75eb..fe684b7081 100644 --- a/schema_cache.rst +++ b/schema_cache.rst @@ -89,7 +89,7 @@ See the section :ref:`schema_reloading` to solve this issue. Schema Cache Reloading ---------------------- -To refresh the cache without restarting the PostgREST server, send the server process a SIGUSR1 signal: +To refresh the cache without restarting the PostgREST server, send a SIGUSR1 signal to the server process. .. code:: bash @@ -106,26 +106,44 @@ To refresh the cache without restarting the PostgREST server, send the server pr # or in docker-compose docker-compose kill -s SIGUSR1 -The above is the manual way to do it. To automate cache reloads, use a database trigger like this: +.. _schema_reloading_notify: + +Reloading with NOTIFY +~~~~~~~~~~~~~~~~~~~~~ + +There are environments where you can't send the SIGUSR1 Unix Signal (like on managed containers in cloud services or on Windows systems). For this reason, PostgREST also allows you to reload its schema cache through PostgreSQL `NOTIFY `_ as follows: .. code-block:: postgresql - CREATE OR REPLACE FUNCTION public.notify_ddl_postgrest() - RETURNS event_trigger - LANGUAGE plpgsql + NOTIFY pgrst, 'reload schema' + +The ``"pgrst"`` notification channel is enabled by default. For configuring the channel, see :ref:`db-channel` and :ref:`db-channel-enabled`. + +Automatic schema cache reloading +******************************** + +You can do automatic schema cache reloading in a pure SQL way with an `event trigger `_ and ``NOTIFY``. + +.. code-block:: postgresql + + -- Create an event trigger function + CREATE OR REPLACE FUNCTION public.pgrst_watch() RETURNS event_trigger + LANGUAGE plpgsql AS $$ BEGIN - NOTIFY ddl_command_end; + NOTIFY pgrst; END; $$; - CREATE EVENT TRIGGER ddl_postgrest ON ddl_command_end - EXECUTE PROCEDURE public.notify_ddl_postgrest(); + -- This event trigger will fire after every ddl_command_end event + CREATE EVENT TRIGGER pgrst_watch + ON ddl_command_end + EXECUTE PROCEDURE public.pgrst_watch(); -Then run the `pg_listen `_ utility to monitor for that event and send a SIGUSR1 when it occurs: +Now, whenever the ``pgrst_watch`` trigger is fired in the database, PostgREST will automatically reload the schema cache. -.. code-block:: bash +To disable auto reloading, drop the trigger: - pg_listen ddl_command_end $(which killall) -SIGUSR1 postgrest +.. code-block:: postgresql -Now, whenever the structure of the database changes, PostgreSQL will notify the ``ddl_command_end`` channel, which will cause ``pg_listen`` to send PostgREST the signal to reload its cache. Note that pg_listen requires full path to the executable in the example above. + DROP EVENT TRIGGER pgrst_watch \ No newline at end of file From 2e50a22e641e077444a0619bf836df2baa8676e7 Mon Sep 17 00:00:00 2001 From: laurenceisla Date: Sat, 24 Jul 2021 18:52:52 -0500 Subject: [PATCH 410/711] Add config reloading with SIGUSR2 --- configuration.rst | 34 ++++++++++++++++++++++++++++++++++ releases/upcoming.rst | 3 +++ 2 files changed, 37 insertions(+) diff --git a/configuration.rst b/configuration.rst index bed5a750db..56aee47132 100644 --- a/configuration.rst +++ b/configuration.rst @@ -60,6 +60,40 @@ role-claim-key String .role raw-media-types String ======================== ======= ================= ======== +.. _config_reloading: + +Configuration Reloading +----------------------- + +To reload the configuration without restarting the PostgREST server send a SIGUSR2 signal to the server process. + +.. code:: bash + + killall -SIGUSR2 postgrest + +.. note:: + + To refresh the cache in docker: + + .. code:: bash + + docker kill -s SIGUSR2 + + # or in docker-compose + docker-compose kill -s SIGUSR2 + +.. important:: + + The following settings will not be reread when reloading the configuration. You will need to restart PostgREST in that case. + + * ``db-uri`` + * ``db-pool`` + * ``db-pool-timeout`` + * ``server-host`` + * ``server-port`` + * ``server-unix-socket`` + * ``server-unix-socket-mode`` + .. _db-uri: db-uri diff --git a/releases/upcoming.rst b/releases/upcoming.rst index cda81ff1bc..b8cf803e32 100644 --- a/releases/upcoming.rst +++ b/releases/upcoming.rst @@ -25,6 +25,9 @@ Added * Allow :ref:`connection_poolers` such as PgBouncer in transaction pooling mode. |br| -- `@laurenceisla `_ +* Allow :ref:`config_reloading` by sending a SIGUSR2 signal. + |br| -- `@steve-chavez `_ + * Config options for showing a full OpenAPI output regardless of the JWT role privileges and for disabling it altogether. See :ref:`openapi-mode`. |br| -- `@steve-chavez `_ From 6909e3435e3d0f3599ba345b03d3dbb4c3fbc02f Mon Sep 17 00:00:00 2001 From: Laurence Isla Date: Sat, 24 Jul 2021 19:42:47 -0500 Subject: [PATCH 411/711] Add changelog for embedding views recursively --- api.rst | 4 ++-- releases/upcoming.rst | 3 +++ 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/api.rst b/api.rst index 3ec32d019b..246d17a20f 100644 --- a/api.rst +++ b/api.rst @@ -695,8 +695,6 @@ It's also possible to embed `Materialized Views `_ +* Allow :ref:`embedding_view_chains` recursively to any depth. + |br| -- `@wolfgangwalther `_ + * Allow schema cache reloading using PostgreSQL :ref:`NOTIFY ` command. |br| -- `@steve-chavez `_ From c4387ec7dd2964c02fc3f79788e3b9b0fd41d120 Mon Sep 17 00:00:00 2001 From: Duncan Ogilvie Date: Mon, 2 Aug 2021 18:45:12 +0200 Subject: [PATCH 412/711] Mention environment variables in the configuration section --- configuration.rst | 2 ++ 1 file changed, 2 insertions(+) diff --git a/configuration.rst b/configuration.rst index 56aee47132..e1138ac181 100644 --- a/configuration.rst +++ b/configuration.rst @@ -60,6 +60,8 @@ role-claim-key String .role raw-media-types String ======================== ======= ================= ======== +You can also set these configuration parameters using environment variables. They are capitalized, have a ``PGRST_`` prefix, and use underscores. For example: ``PGRST_DB_URI`` corresponds to ``db-uri``. + .. _config_reloading: Configuration Reloading From 20bee2ec34c641f45bfb389580b869953b2bb380 Mon Sep 17 00:00:00 2001 From: Laurence Isla Date: Mon, 2 Aug 2021 18:33:50 -0500 Subject: [PATCH 413/711] Fix log-level value for status 4xx errors --- configuration.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/configuration.rst b/configuration.rst index e1138ac181..9a3711ef2e 100644 --- a/configuration.rst +++ b/configuration.rst @@ -281,9 +281,9 @@ log-level log-level = "error" # All the "error" level events plus request errors (status 4xx) are logged - log-level = "warning" + log-level = "warn" - # All the "warning" level events plus all requests (every status code) are logged + # All the "warn" level events plus all requests (every status code) are logged log-level "info" .. _openapi-mode: From 33f0da0509b2c2785a2a30f2189da54def8c062c Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Sun, 25 Jul 2021 23:59:38 -0500 Subject: [PATCH 414/711] Add no downtime schema cache reload --- releases/upcoming.rst | 3 +++ schema_cache.rst | 15 +++++++++------ 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/releases/upcoming.rst b/releases/upcoming.rst index e64afadbb5..3ab9d21c68 100644 --- a/releases/upcoming.rst +++ b/releases/upcoming.rst @@ -19,6 +19,9 @@ Added * Allow :ref:`embedding_view_chains` recursively to any depth. |br| -- `@wolfgangwalther `_ +* No downtime when reloading the schema cache. See the note in :ref:`schema_reloading`. + |br| -- `@steve-chavez `_ + * Allow schema cache reloading using PostgreSQL :ref:`NOTIFY ` command. |br| -- `@steve-chavez `_ diff --git a/schema_cache.rst b/schema_cache.rst index fe684b7081..df8804d21d 100644 --- a/schema_cache.rst +++ b/schema_cache.rst @@ -95,16 +95,19 @@ To refresh the cache without restarting the PostgREST server, send a SIGUSR1 sig killall -SIGUSR1 postgrest -.. note:: - To refresh the cache in docker: +For docker you can do: + +.. code:: bash - .. code:: bash + docker kill -s SIGUSR1 - docker kill -s SIGUSR1 + # or in docker-compose + docker-compose kill -s SIGUSR1 + +.. note:: - # or in docker-compose - docker-compose kill -s SIGUSR1 + There's no downtime when reloading the schema cache. The reloading will happen on a background thread while requests keep being served. .. _schema_reloading_notify: From 9543e746ec977001b716bb45ef147958e594a154 Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Mon, 26 Jul 2021 01:11:43 -0500 Subject: [PATCH 415/711] Mention log-level=crit/error increase throughput --- configuration.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/configuration.rst b/configuration.rst index 9a3711ef2e..5f074ac87f 100644 --- a/configuration.rst +++ b/configuration.rst @@ -286,6 +286,9 @@ log-level # All the "warn" level events plus all requests (every status code) are logged log-level "info" + + Because currently there's no buffering for logging, the levels with minimal logging(``crit/error``) will increase throughput. + .. _openapi-mode: openapi-mode From 57d725bab6fc935126d43f22be91a71af57e0e76 Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Mon, 26 Jul 2021 01:44:34 -0500 Subject: [PATCH 416/711] Add Bearer without capitalization --- auth.rst | 4 ++++ releases/upcoming.rst | 3 +++ 2 files changed, 7 insertions(+) diff --git a/auth.rst b/auth.rst index 3d0c915bf3..d00f673682 100644 --- a/auth.rst +++ b/auth.rst @@ -143,6 +143,8 @@ In the function you can run arbitrary code to check the request and raise an exc END $$ LANGUAGE plpgsql; +.. _client_auth: + Client Auth =========== @@ -153,6 +155,8 @@ To make an authenticated request the client must include an :code:`Authorization GET /foo HTTP/1.1 Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJyb2xlIjoiamRvZSIsImV4cCI6MTQ3NTUxNjI1MH0.GYDZV3yM0gqvuEtJmfpplLBXSGYnke_Pvnl0tbKAjB4 +The ``Bearer`` header value can be used with or without capitalization(``bearer``). + JWT Generation -------------- diff --git a/releases/upcoming.rst b/releases/upcoming.rst index 3ab9d21c68..0c1ee72a68 100644 --- a/releases/upcoming.rst +++ b/releases/upcoming.rst @@ -34,6 +34,9 @@ Added * Allow :ref:`config_reloading` by sending a SIGUSR2 signal. |br| -- `@steve-chavez `_ +* Allow ``Bearer`` with and without capitalization as authentication schema. See :ref:`client_auth`. + |br| -- `@wolfgangwalther `_ + * Config options for showing a full OpenAPI output regardless of the JWT role privileges and for disabling it altogether. See :ref:`openapi-mode`. |br| -- `@steve-chavez `_ From 52cdd505617e260056240e4cd38bd1ef4acb9576 Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Mon, 26 Jul 2021 02:14:37 -0500 Subject: [PATCH 417/711] Show timestamps for server diagnostic information --- admin.rst | 21 ++++++++++++++++++++- releases/upcoming.rst | 3 +++ 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/admin.rst b/admin.rst index 7b5e5e95f4..7ab4f1277d 100644 --- a/admin.rst +++ b/admin.rst @@ -141,10 +141,27 @@ Server Version When debugging a problem it's important to verify the PostgREST version. At any time you can make a request to the running server and determine exactly which version is deployed. Look for the :code:`Server` HTTP response header, which contains the version number. +.. _pgrst_logging: + Logging ------- -The PostgREST server logs basic request information to stdout, including the requesting IP address and user agent, the URL requested, and HTTP response status. However this provides limited information for debugging server errors. It's helpful to get full information about both client requests and the corresponding SQL commands executed against the underlying database. +PostgREST logs basic request information to ``stdout``, including the requesting IP address and user agent, the URL requested, and HTTP response status. + +.. code-block:: + + 127.0.0.1 - - [26/Jul/2021:01:56:38 -0500] "GET /clients HTTP/1.1" 200 - "" "curl/7.64.0" + 127.0.0.1 - - [26/Jul/2021:01:56:48 -0500] "GET /unexistent HTTP/1.1" 404 - "" "curl/7.64.0" + +For diagnostic information about the server itself, PostgREST logs to ``stderr``. + +.. code-block:: + + 12/Jun/2021:17:47:39 -0500: Attempting to connect to the database... + 12/Jun/2021:17:47:39 -0500: Listening on port 3000 + 12/Jun/2021:17:47:39 -0500: Connection successful + 12/Jun/2021:17:47:39 -0500: Config re-loaded + 12/Jun/2021:17:47:40 -0500: Schema cache loaded .. note:: @@ -157,6 +174,8 @@ The PostgREST server logs basic request information to stdout, including the req # another option is to pipe the output into "logger -t postgrest" +PostgREST logging provides limited information for debugging server errors. It's helpful to get full information about both client requests and the corresponding SQL commands executed against the underlying database. + HTTP Requests ------------- diff --git a/releases/upcoming.rst b/releases/upcoming.rst index 0c1ee72a68..7c86d907e9 100644 --- a/releases/upcoming.rst +++ b/releases/upcoming.rst @@ -37,6 +37,9 @@ Added * Allow ``Bearer`` with and without capitalization as authentication schema. See :ref:`client_auth`. |br| -- `@wolfgangwalther `_ +* Show timestamps for server diagnostic information. See :ref:`pgrst_logging`. + |br| -- `@steve-chavez `_ + * Config options for showing a full OpenAPI output regardless of the JWT role privileges and for disabling it altogether. See :ref:`openapi-mode`. |br| -- `@steve-chavez `_ From 8d4bc76aab358eb50d6ef61f2d9bceffa6f1e0ae Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Mon, 26 Jul 2021 02:46:44 -0500 Subject: [PATCH 418/711] Add entry for OPTIONS on views * Also clarify the schema cache page --- releases/upcoming.rst | 6 ++++-- schema_cache.rst | 5 ++++- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/releases/upcoming.rst b/releases/upcoming.rst index 7c86d907e9..fde6b391dd 100644 --- a/releases/upcoming.rst +++ b/releases/upcoming.rst @@ -37,6 +37,9 @@ Added * Allow ``Bearer`` with and without capitalization as authentication schema. See :ref:`client_auth`. |br| -- `@wolfgangwalther `_ +* Allow OPTIONS to generate HTTP methods based on views triggers. See :ref:`OPTIONS requests `. + |br| -- `@laurenceisla `_ + * Show timestamps for server diagnostic information. See :ref:`pgrst_logging`. |br| -- `@steve-chavez `_ @@ -54,8 +57,7 @@ Added * Documentation improvements - + Added the :ref:`OPTIONS requests ` section. - + Added the :ref:`schema_cache` section. + + Added the :ref:`schema_cache` page. + Moved the :ref:`schema_reloading` reference from :ref:`admin` to :ref:`schema_cache` Fixed diff --git a/schema_cache.rst b/schema_cache.rst index df8804d21d..e03359a8c1 100644 --- a/schema_cache.rst +++ b/schema_cache.rst @@ -3,7 +3,10 @@ Schema Cache ============ -PostgREST caches metadata from the database schema to avoid repeating expensive queries. This metadata is not required by all of the PostgREST features, only the following: +Certain PostgREST features require metadata from the database schema. Getting this metadata requires executing expensive queries, so +in order to avoid repeating this work, PostgREST uses a schema cache. + +The following features are the ones that require metadata from the schema cache. +--------------------------------------------+-------------------------------------------------------------------------------+ | Feature | Required Metadata | From 698db875908fdcdeaf407e44d21041d005ecf713 Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Mon, 26 Jul 2021 03:01:00 -0500 Subject: [PATCH 419/711] Reorder configuration reloading --- configuration.rst | 70 ++++++++++++++++++++++++----------------------- 1 file changed, 36 insertions(+), 34 deletions(-) diff --git a/configuration.rst b/configuration.rst index 5f074ac87f..c7355f0fb1 100644 --- a/configuration.rst +++ b/configuration.rst @@ -9,6 +9,10 @@ PostgREST reads a configuration file to determine information about the database ./postgrest /path/to/postgrest.conf +.. note:: + + Configuration can be reloaded without restarting the server. See :ref:`config_reloading`. + The configuration file must contain a set of key value pairs. At minimum you must include these keys: .. code:: @@ -62,40 +66,6 @@ raw-media-types String You can also set these configuration parameters using environment variables. They are capitalized, have a ``PGRST_`` prefix, and use underscores. For example: ``PGRST_DB_URI`` corresponds to ``db-uri``. -.. _config_reloading: - -Configuration Reloading ------------------------ - -To reload the configuration without restarting the PostgREST server send a SIGUSR2 signal to the server process. - -.. code:: bash - - killall -SIGUSR2 postgrest - -.. note:: - - To refresh the cache in docker: - - .. code:: bash - - docker kill -s SIGUSR2 - - # or in docker-compose - docker-compose kill -s SIGUSR2 - -.. important:: - - The following settings will not be reread when reloading the configuration. You will need to restart PostgREST in that case. - - * ``db-uri`` - * ``db-pool`` - * ``db-pool-timeout`` - * ``server-host`` - * ``server-port`` - * ``server-unix-socket`` - * ``server-unix-socket-mode`` - .. _db-uri: db-uri @@ -408,3 +378,35 @@ raw-media-types raw-media-types="image/png, text/xml" +.. _config_reloading: + +Configuration Reloading +======================= + +To reload the configuration without restarting the PostgREST server send a SIGUSR2 signal to the server process. + +.. code:: bash + + killall -SIGUSR2 postgrest + +To refresh the cache in docker: + +.. code:: bash + + docker kill -s SIGUSR2 + + # or in docker-compose + docker-compose kill -s SIGUSR2 + +.. important:: + + The following settings will not be reread when reloading the configuration. You will need to restart PostgREST in that case. + + * ``db-uri`` + * ``db-pool`` + * ``db-pool-timeout`` + * ``server-host`` + * ``server-port`` + * ``server-unix-socket`` + * ``server-unix-socket-mode`` + From 254a2f7f36efd687561593773d06b00c34d14e2e Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Mon, 26 Jul 2021 04:39:02 -0500 Subject: [PATCH 420/711] Add in-db config plus reloading --- configuration.rst | 63 ++++++++++++++++++++++++++++++++++++++----- releases/upcoming.rst | 3 +++ schema_cache.rst | 2 +- 3 files changed, 60 insertions(+), 8 deletions(-) diff --git a/configuration.rst b/configuration.rst index c7355f0fb1..d70869d5a5 100644 --- a/configuration.rst +++ b/configuration.rst @@ -47,6 +47,7 @@ db-channel String pgrst db-channel-enabled Boolean True db-prepared-statements Boolean True db-tx-end String commit +db-config Boolean True server-host String !4 server-port Int 3000 server-unix-socket String @@ -191,6 +192,13 @@ db-tx-end # The transaction is rolled back unless a "Prefer: tx=commit" header is sent db-tx-end = "rollback-allow-override" +.. _db-config: + +db-config +--------- + + Enables the in-database configuration. + .. _server-host: server-host @@ -402,11 +410,52 @@ To refresh the cache in docker: The following settings will not be reread when reloading the configuration. You will need to restart PostgREST in that case. - * ``db-uri`` - * ``db-pool`` - * ``db-pool-timeout`` - * ``server-host`` - * ``server-port`` - * ``server-unix-socket`` - * ``server-unix-socket-mode`` + * :ref:`db-uri` + * :ref:`db-pool` + * :ref:`db-pool-timeout` + * :ref:`server-host` + * :ref:`server-port` + * :ref:`server-unix-socket` + * :ref:`server-unix-socket-mode` + +.. _in_db_config: + +In-Database Configuration +========================= + +By adding settings to the **authenticator** role (see :ref:`roles`), you can make the database the single source of truth for PostgREST's configuration. +This is enabled by :ref:`db-config`. + +For example, you can configure :ref:`db-schema` and :ref:`jwt-secret` like this: + +.. code:: postgresql + + ALTER ROLE authenticator SET pgrst.db_schema = "tenant1, tenant2, tenant3" + ALTER ROLE authenticator SET pgrst.jwt_secret = "REALLYREALLYREALLYREALLYVERYSAFE" + +.. important:: + + For altering a role in this way, you need a SUPERUSER. You might not be able to use this configuration mode on cloud-hosted databases. + +Note that underscores(``_``) need to be used instead of dashes(``-``) for the options when the configuration is inside the database. + +When using both the configuration file and the in-database configuration, the latter takes precedence. + +.. danger:: + + If direct connections to the database are allowed, then it's not safe to use the in-db configuration for storing the :ref:`jwt-secret`. + The settings of every role are PUBLIC - they can be viewed by any user that queries the ``pg_catalog.pg_db_role_setting`` table. + In this case you should keep the :ref:`jwt-secret` in the configuration file or as environment variables. + +.. _in_db_config_reloading: + +In-database configuration reloading +----------------------------------- + +To reload the in-database configuration from within the database, you can use a NOTIFY command. + +.. code:: postgresql + + NOTIFY pgrst, 'reload config' +The ``"pgrst"`` notification channel is enabled by default. For configuring the channel, see :ref:`db-channel` and :ref:`db-channel-enabled`. diff --git a/releases/upcoming.rst b/releases/upcoming.rst index fde6b391dd..81f8bbe88f 100644 --- a/releases/upcoming.rst +++ b/releases/upcoming.rst @@ -37,6 +37,9 @@ Added * Allow ``Bearer`` with and without capitalization as authentication schema. See :ref:`client_auth`. |br| -- `@wolfgangwalther `_ +* :ref:`in_db_config` that can be :ref:`reloaded with NOTIFY `. + |br| -- `@steve-chavez `_ + * Allow OPTIONS to generate HTTP methods based on views triggers. See :ref:`OPTIONS requests `. |br| -- `@laurenceisla `_ diff --git a/schema_cache.rst b/schema_cache.rst index e03359a8c1..04c8c84bfa 100644 --- a/schema_cache.rst +++ b/schema_cache.rst @@ -92,7 +92,7 @@ See the section :ref:`schema_reloading` to solve this issue. Schema Cache Reloading ---------------------- -To refresh the cache without restarting the PostgREST server, send a SIGUSR1 signal to the server process. +To reload the cache without restarting the PostgREST server, send a SIGUSR1 signal to the server process. .. code:: bash From 12f8852183f2cb0120d2abd992d98a6bed1d2926 Mon Sep 17 00:00:00 2001 From: Laurence Isla Date: Mon, 26 Jul 2021 20:32:03 -0500 Subject: [PATCH 421/711] Add fixes and sponsors to upcoming page --- postgrest.dict | 9 ++++ releases/upcoming.rst | 107 ++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 113 insertions(+), 3 deletions(-) diff --git a/postgrest.dict b/postgrest.dict index bc12f84384..a5c4b6d0c4 100644 --- a/postgrest.dict +++ b/postgrest.dict @@ -46,6 +46,7 @@ HMAC Homebrew HTTPS HV +Ibarluzea ilike io IP @@ -55,6 +56,7 @@ JSON JWK JWT jwt +JWTs Kinesis Kofi localhost @@ -86,6 +88,7 @@ openapi ORM ov passphrase +Pawel Pelletier Petr PgBouncer @@ -111,18 +114,22 @@ RabbitMQ Rafaj RDS reallyreallyreallyreallyverysafe +Rechkemmer Redux refactor +Remo requester's RESTful RestSharp RLS RPC RSA +Saleeba savepoint schemas Sencha Serverless +Severin SHA signup SIGUSR @@ -136,6 +143,7 @@ SSL stateful stdout Stolarz +subselect SuperAgent syslog systemd @@ -146,6 +154,7 @@ todos Tsingson tsquery tx +Tyll TypeScript UI ui diff --git a/releases/upcoming.rst b/releases/upcoming.rst index 81f8bbe88f..21c84dc300 100644 --- a/releases/upcoming.rst +++ b/releases/upcoming.rst @@ -2,10 +2,10 @@
    -Upcoming -======== +v8.0.0 +====== -These are changes yet unreleased. If you'd like to try them out before a new official release, you can use a `nightly release `_. +You can download this release at the `PostgREST v8.0.0 release page `_. Added ----- @@ -69,6 +69,60 @@ Fixed * Fix showing UNKNOWN on ``postgrest --help`` invocation. |br| -- `@monacoremo `_ +* Removed single column restriction to allow composite foreign keys in join tables. + |br| -- `@goteguru `_ + +* Fix how the PostgREST version is shown in the help text when the .git directory is not available. + |br| -- `@monacoremo `_ + +* Fix expired JWTs starting an empty transaction on the db. + |br| -- `@steve-chavez `_ + +* Fix location header for POST request with ``select=`` without PK. + |br| -- `@wolfgangwalther `_ + +* Fix error messages on connection failure for localized PostgreSQL on Windows. + |br| -- `@wolfgangwalther `_ + +* Fix ``application/octet-stream`` appending ``charset=utf-8``. + |br| -- `@steve-chavez `_ + +* Fix overloading of functions with unnamed arguments. + |br| -- `@wolfgangwalther `_ + +* Return ``405 Method not Allowed`` for GET of volatile RPC instead of 500. + |br| -- `@wolfgangwalther `_ + +* Fix RPC return type handling and embedding for domains with composite base type. + |br| -- `@wolfgangwalther `_ + +* Fix embedding through views that have COALESCE with subselect. + |br| -- `@wolfgangwalther `_ + +* Fix parsing of boolean config values for Docker environment variables, now it accepts double quoted truth values ``("true", "false")`` and numbers ``("1", "0")``. + |br| -- `@wolfgangwalther `_ + +* Fix using ``app.settings.xxx`` config options in Docker, now they can be used as ``PGRST_APP_SETTINGS_xxx``. + |br| -- `@wolfgangwalther `_ + +* Fix panic when attempting to run with unix socket on non-unix host and properly close unix domain socket on exit. + |br| -- `@monacoremo `_ + +* Disregard internal junction (in non-exposed schema) when embedding. + |br| -- `@steve-chavez `_ + +* Fix requests for overloaded functions from HTML forms to no longer hang. + |br| -- `@laurenceisla `_ + +* Add a hint and clarification to the no relationship found error. + |br| -- `@laurenceisla `_ + +* Show comprehensive error when an RPC is not found in a stale schema cache. + |br| -- `@laurenceisla `_ + +* Fix Location headers in headers only representation for null PK inserts on views. + |br| -- `@laurenceisla `_ + Changed ------- @@ -90,3 +144,50 @@ Changed * POST requests for insertions no longer include a ``Location`` header in the response by default and behave the same way as having a ``Prefer: return=minimal`` header in the request. This prevents permissions errors when having a write-only table. See :ref:`insert_update`. |br| -- `@laurenceisla `_ + +Thanks +------ + +.. image:: ../_static/cybertec-new.png + :target: https://www.cybertec-postgresql.com/en/?utm_source=postgrest.org&utm_medium=referral&utm_campaign=postgrest + :width: 13em + +.. image:: ../_static/2ndquadrant.png + :target: https://www.2ndquadrant.com/en/?utm_campaign=External%20Websites&utm_source=PostgREST&utm_medium=Logo + :width: 13em + +.. image:: ../_static/retool.png + :target: https://retool.com/?utm_source=sponsor&utm_campaign=postgrest + :width: 13em + +.. image:: ../_static/gnuhost.png + :target: https://gnuhost.eu/?utm_source=sponsor&utm_campaign=postgrest + :width: 13em + +.. image:: ../_static/supabase.png + :target: https://supabase.io/?utm_source=postgrest%20backers&utm_medium=open%20source%20partner&utm_campaign=postgrest%20backers%20github&utm_term=homepage + :width: 13em + +.. image:: ../_static/oblivious.jpg + :target: https://oblivious.ai/?utm_source=sponsor&utm_campaign=postgrest + :width: 13em + +* `Daniel Babiak `_ +* Evans Fernandes +* `Jan Sommer `_ +* `Franz Gusenbauer `_ +* Tsingson Qin +* Michel Pelletier +* Jay Hannah +* Robert Stolarz +* Nicholas DiBiase +* Christopher Reid +* Nathan Bouscal +* Daniel Rafaj +* David Fenko +* Remo Rechkemmer +* Severin Ibarluzea +* Tom Saleeba +* Pawel Tyll + +If you like to join them please consider `supporting PostgREST development `_. From 21e54aacda4ed3c77cde9f1f4d07e4d2a6e1eab2 Mon Sep 17 00:00:00 2001 From: Laurence Isla Date: Mon, 26 Jul 2021 20:44:47 -0500 Subject: [PATCH 422/711] Rename upcoming to v8.0.0 --- index.rst | 1 + releases/{upcoming.rst => v8.0.0.rst} | 0 2 files changed, 1 insertion(+) rename releases/{upcoming.rst => v8.0.0.rst} (100%) diff --git a/index.rst b/index.rst index 795d1a4796..eb23a7c92a 100644 --- a/index.rst +++ b/index.rst @@ -217,6 +217,7 @@ Release Notes Here we'll include the most relevant changes so you can migrate to newer versions easily. You can see the full changelog of each release in the `PostgREST repository `_. +- :doc:`releases/v8.0.0` - :doc:`releases/v7.0.0` - :doc:`releases/v6.0.2` - :doc:`releases/v5.2.0` diff --git a/releases/upcoming.rst b/releases/v8.0.0.rst similarity index 100% rename from releases/upcoming.rst rename to releases/v8.0.0.rst From 37c2a8aa7b5c60a2fd1b54ca47ab7c7c4581e065 Mon Sep 17 00:00:00 2001 From: Laurence Isla Date: Tue, 27 Jul 2021 14:04:30 -0500 Subject: [PATCH 423/711] Make the landing page wider * Add max-width for logos only * Fix margin on sponsor images and add reference to the PostgREST team * Fix information on v8 changelog --- _static/css/custom.css | 12 ++++++---- index.rst | 52 +++++++++++++++++++++++------------------- releases/v8.0.0.rst | 45 ++++++++++++++++++------------------ 3 files changed, 59 insertions(+), 50 deletions(-) diff --git a/_static/css/custom.css b/_static/css/custom.css index cd52bc8483..6015b6d486 100644 --- a/_static/css/custom.css +++ b/_static/css/custom.css @@ -2,10 +2,6 @@ max-width: initial; } -#postgrest-documentation { - max-width: 800px; -} - #postgrest-documentation > h1 { display: none; } @@ -53,3 +49,11 @@ div.line-block { #thanks ul{ text-align: left; } + +.image-container { + max-width: 800px; + display: block; + margin-left: auto; + margin-right: auto; + margin-bottom: 24px; +} diff --git a/index.rst b/index.rst index eb23a7c92a..af28331db9 100644 --- a/index.rst +++ b/index.rst @@ -3,7 +3,9 @@ PostgREST Documentation ======================= -.. figure:: _static/logo.png +.. container:: image-container + + .. figure:: _static/logo.png .. image:: https://img.shields.io/github/stars/postgrest/postgrest.svg?style=social :target: https://github.com/PostgREST/postgrest @@ -30,36 +32,38 @@ PostgREST is a standalone web server that turns your PostgreSQL database directl Sponsors -------- -.. image:: _static/cybertec-new.png - :target: https://www.cybertec-postgresql.com/en/?utm_source=postgrest.org&utm_medium=referral&utm_campaign=postgrest - :width: 13em +.. container:: image-container + + .. image:: _static/cybertec-new.png + :target: https://www.cybertec-postgresql.com/en/?utm_source=postgrest.org&utm_medium=referral&utm_campaign=postgrest + :width: 13em -.. image:: _static/2ndquadrant.png - :target: https://www.2ndquadrant.com/en/?utm_campaign=External%20Websites&utm_source=PostgREST&utm_medium=Logo - :width: 13em + .. image:: _static/2ndquadrant.png + :target: https://www.2ndquadrant.com/en/?utm_campaign=External%20Websites&utm_source=PostgREST&utm_medium=Logo + :width: 13em -.. image:: _static/retool.png - :target: https://retool.com/?utm_source=sponsor&utm_campaign=postgrest - :width: 13em + .. image:: _static/retool.png + :target: https://retool.com/?utm_source=sponsor&utm_campaign=postgrest + :width: 13em -.. image:: _static/gnuhost.png - :target: https://gnuhost.eu/?utm_source=sponsor&utm_campaign=postgrest - :width: 13em + .. image:: _static/gnuhost.png + :target: https://gnuhost.eu/?utm_source=sponsor&utm_campaign=postgrest + :width: 13em -.. image:: _static/supabase.png - :target: https://supabase.io/?utm_source=postgrest%20backers&utm_medium=open%20source%20partner&utm_campaign=postgrest%20backers%20github&utm_term=homepage - :width: 13em + .. image:: _static/supabase.png + :target: https://supabase.io/?utm_source=postgrest%20backers&utm_medium=open%20source%20partner&utm_campaign=postgrest%20backers%20github&utm_term=homepage + :width: 13em -.. image:: _static/oblivious.jpg - :target: https://oblivious.ai/?utm_source=sponsor&utm_campaign=postgrest - :width: 13em + .. image:: _static/oblivious.jpg + :target: https://oblivious.ai/?utm_source=sponsor&utm_campaign=postgrest + :width: 13em -.. The static/empty.png(created with `convert -size 320x95 xc:#fcfcfc empty.png`) is an ugly workaround - to create space and center the logos. It's not easy to layout with restructuredText. + .. The static/empty.png(created with `convert -size 320x95 xc:#fcfcfc empty.png`) is an ugly workaround + to create space and center the logos. It's not easy to layout with restructuredText. -.. .. image:: _static/empty.png - :target: #sponsors - :width: 13em + .. .. image:: _static/empty.png + :target: #sponsors + :width: 13em | diff --git a/releases/v8.0.0.rst b/releases/v8.0.0.rst index 21c84dc300..55c5ad3731 100644 --- a/releases/v8.0.0.rst +++ b/releases/v8.0.0.rst @@ -72,9 +72,6 @@ Fixed * Removed single column restriction to allow composite foreign keys in join tables. |br| -- `@goteguru `_ -* Fix how the PostgREST version is shown in the help text when the .git directory is not available. - |br| -- `@monacoremo `_ - * Fix expired JWTs starting an empty transaction on the db. |br| -- `@steve-chavez `_ @@ -148,34 +145,38 @@ Changed Thanks ------ -.. image:: ../_static/cybertec-new.png - :target: https://www.cybertec-postgresql.com/en/?utm_source=postgrest.org&utm_medium=referral&utm_campaign=postgrest - :width: 13em +Big thanks from the `PostgREST team `_ to our sponsors! -.. image:: ../_static/2ndquadrant.png - :target: https://www.2ndquadrant.com/en/?utm_campaign=External%20Websites&utm_source=PostgREST&utm_medium=Logo - :width: 13em +.. container:: image-container -.. image:: ../_static/retool.png - :target: https://retool.com/?utm_source=sponsor&utm_campaign=postgrest - :width: 13em + .. image:: ../_static/cybertec-new.png + :target: https://www.cybertec-postgresql.com/en/?utm_source=postgrest.org&utm_medium=referral&utm_campaign=postgrest + :width: 13em -.. image:: ../_static/gnuhost.png - :target: https://gnuhost.eu/?utm_source=sponsor&utm_campaign=postgrest - :width: 13em + .. image:: ../_static/2ndquadrant.png + :target: https://www.2ndquadrant.com/en/?utm_campaign=External%20Websites&utm_source=PostgREST&utm_medium=Logo + :width: 13em -.. image:: ../_static/supabase.png - :target: https://supabase.io/?utm_source=postgrest%20backers&utm_medium=open%20source%20partner&utm_campaign=postgrest%20backers%20github&utm_term=homepage - :width: 13em + .. image:: ../_static/retool.png + :target: https://retool.com/?utm_source=sponsor&utm_campaign=postgrest + :width: 13em -.. image:: ../_static/oblivious.jpg - :target: https://oblivious.ai/?utm_source=sponsor&utm_campaign=postgrest - :width: 13em + .. image:: ../_static/gnuhost.png + :target: https://gnuhost.eu/?utm_source=sponsor&utm_campaign=postgrest + :width: 13em + + .. image:: ../_static/supabase.png + :target: https://supabase.io/?utm_source=postgrest%20backers&utm_medium=open%20source%20partner&utm_campaign=postgrest%20backers%20github&utm_term=homepage + :width: 13em + + .. image:: ../_static/oblivious.jpg + :target: https://oblivious.ai/?utm_source=sponsor&utm_campaign=postgrest + :width: 13em -* `Daniel Babiak `_ * Evans Fernandes * `Jan Sommer `_ * `Franz Gusenbauer `_ +* `Daniel Babiak `_ * Tsingson Qin * Michel Pelletier * Jay Hannah From 42656edfd9af94a9f2391dba61a743fe8e36c4cf Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Mon, 9 Aug 2021 14:04:47 -0500 Subject: [PATCH 424/711] Improve wording in some sections --- api.rst | 9 +++++---- configuration.rst | 4 ++-- index.rst | 2 +- releases/v8.0.0.rst | 2 +- schema_cache.rst | 28 ++++++++++++---------------- 5 files changed, 21 insertions(+), 24 deletions(-) diff --git a/api.rst b/api.rst index 246d17a20f..ecc34487bd 100644 --- a/api.rst +++ b/api.rst @@ -1459,7 +1459,7 @@ OPTIONS You can verify which HTTP methods are allowed on endpoints for tables and views by using an OPTIONS request. These methods are allowed depending on what operations *can* be done on the table or view, not on the database permissions assigned to them. -For example, the OPTIONS request and response for a table named ``people`` are: +For a table named ``people``, OPTIONS would show: .. code-block:: http @@ -1470,7 +1470,7 @@ For example, the OPTIONS request and response for a table named ``people`` are: HTTP/1.1 200 OK Allow: OPTIONS,GET,HEAD,POST,PUT,PATCH,DELETE -For a view, the methods are determined by the presence of INSTEAD OF TRIGGERS: +For a view, the methods are determined by the presence of INSTEAD OF TRIGGERS. .. table:: :widths: auto @@ -1493,9 +1493,10 @@ For a view, the methods are determined by the presence of INSTEAD OF TRIGGERS: | `auto-updatable views `_ | +--------------------+-------------------------------------------------------------------------------------------------+ -For database function endpoints, OPTIONS requests are not supported. +For functions, OPTIONS requests are not supported. .. important:: + Whenever you add or remove tables or views, or modify a view's INSTEAD OF TRIGGERS on the database, you must refresh PostgREST's schema cache for OPTIONS requests to work properly. See the section :ref:`schema_reloading`. CORS @@ -1583,7 +1584,7 @@ PostgREST reads the ``response.headers`` SQL variable to add extra headers to th SELECT set_config('response.headers', '[{"Cache-Control": "public"}, {"Cache-Control": "max-age=259200"}]', true); - + Notice that the variable should be set to an *array* of single-key objects rather than a single multiple-key object. This is because headers such as ``Cache-Control`` or ``Set-Cookie`` need to be repeated when setting multiple values and an object would not allow the repeated key. .. note:: diff --git a/configuration.rst b/configuration.rst index d70869d5a5..b758b1265f 100644 --- a/configuration.rst +++ b/configuration.rst @@ -391,13 +391,13 @@ raw-media-types Configuration Reloading ======================= -To reload the configuration without restarting the PostgREST server send a SIGUSR2 signal to the server process. +To reload the configuration without restarting the PostgREST server, send a SIGUSR2 signal to the server process. .. code:: bash killall -SIGUSR2 postgrest -To refresh the cache in docker: +To reload the config in docker: .. code:: bash diff --git a/index.rst b/index.rst index af28331db9..8b2033ea10 100644 --- a/index.rst +++ b/index.rst @@ -234,7 +234,7 @@ Here are some companies that use PostgREST in production. * `Catarse `_ * `Datrium `_ * `Drip Depot `_ -* `eGull `_ +* `eGull `_ * `Image-charts `_ * `Moat `_ * `MotionDynamic - Fast highly dynamic video generation at scale `_ diff --git a/releases/v8.0.0.rst b/releases/v8.0.0.rst index 55c5ad3731..b79098df12 100644 --- a/releases/v8.0.0.rst +++ b/releases/v8.0.0.rst @@ -22,7 +22,7 @@ Added * No downtime when reloading the schema cache. See the note in :ref:`schema_reloading`. |br| -- `@steve-chavez `_ -* Allow schema cache reloading using PostgreSQL :ref:`NOTIFY ` command. +* Allow schema cache reloading using PostgreSQL :ref:`NOTIFY ` command. This enables :ref:`auto_schema_reloading`. |br| -- `@steve-chavez `_ * Allow sending the header ``Prefer: headers-only`` to get a response with a ``Location`` header. See :ref:`insert_update`. diff --git a/schema_cache.rst b/schema_cache.rst index 04c8c84bfa..e4c265703d 100644 --- a/schema_cache.rst +++ b/schema_cache.rst @@ -6,8 +6,6 @@ Schema Cache Certain PostgREST features require metadata from the database schema. Getting this metadata requires executing expensive queries, so in order to avoid repeating this work, PostgREST uses a schema cache. -The following features are the ones that require metadata from the schema cache. - +--------------------------------------------+-------------------------------------------------------------------------------+ | Feature | Required Metadata | +============================================+===============================================================================+ @@ -34,18 +32,18 @@ The Stale Schema Cache When you make changes on the metadata mentioned above, the schema cache will turn stale on a running PostgREST. Future requests that use the above features will need the :ref:`schema cache to be reloaded `; otherwise, you'll get an error instead of the expected result. -For instance, let's see what would happen if you have a stale schema for foreign key relationships and function signature: +For instance, let's see what would happen if you have a stale schema cache for foreign key relationships and function signatures. Stale Foreign Key Relationships ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -Suppose you add a ``cities`` table to your database. This table has a foreign key referencing an existing ``countries`` table. Then, you make a request to get the ``cities`` and their belonging ``countries``: +Suppose you add a ``cities`` table to your database and define a foreign key that references an existing ``countries`` table. Then, you make a request to get the ``cities`` and their belonging ``countries``. .. code-block:: http GET /cities?select=name,country:countries(id,name) HTTP/1.1 -But instead, you get an error message that looks like this: +The result will be an error: .. code-block:: json @@ -54,14 +52,14 @@ But instead, you get an error message that looks like this: "message": "Could not find a relationship between cities and countries in the schema cache" } -As you can see, PostgREST couldn't find the newly created foreign key in the schema cache. See the section :ref:`schema_reloading` to solve this issue. +As you can see, PostgREST couldn't find the newly created foreign key in the schema cache. See :ref:`schema_reloading` and :ref:`auto_schema_reloading` to solve this issue. .. _stale_function_signature: Stale Function Signature ~~~~~~~~~~~~~~~~~~~~~~~~ -Suppose you create the following function while PostgREST is running: +The same issue will occur on newly created functions on a running PostgREST. .. code-block:: plpgsql @@ -70,14 +68,10 @@ Suppose you create the following function while PostgREST is running: SELECT num + 1; $$ LANGUAGE SQL IMMUTABLE; -Then, you make this request: - .. code-block:: http GET /rpc/plus_one?num=1 HTTP/1.1 -Next, PostgREST tries to find the function on the stale schema to no avail: - .. code-block:: json { @@ -85,7 +79,7 @@ Next, PostgREST tries to find the function on the stale schema to no avail: "message": "Could not find the api.plus_one(num) function in the schema cache" } -See the section :ref:`schema_reloading` to solve this issue. +Here, PostgREST tries to find the function on the stale schema to no avail. See :ref:`schema_reloading` and :ref:`auto_schema_reloading` to solve this issue. .. _schema_reloading: @@ -125,10 +119,12 @@ There are environments where you can't send the SIGUSR1 Unix Signal (like on man The ``"pgrst"`` notification channel is enabled by default. For configuring the channel, see :ref:`db-channel` and :ref:`db-channel-enabled`. -Automatic schema cache reloading -******************************** +.. _auto_schema_reloading: + +Automatic Schema Cache Reloading +-------------------------------- -You can do automatic schema cache reloading in a pure SQL way with an `event trigger `_ and ``NOTIFY``. +You can do automatic schema cache reloading in a pure SQL way and forget about stale schema cache errors with an `event trigger `_ and ``NOTIFY``. .. code-block:: postgresql @@ -137,7 +133,7 @@ You can do automatic schema cache reloading in a pure SQL way with an `event tri LANGUAGE plpgsql AS $$ BEGIN - NOTIFY pgrst; + NOTIFY pgrst, 'reload schema'; END; $$; From 98350e294148a2a066e47fbd12522f4ded7e9f4b Mon Sep 17 00:00:00 2001 From: laurenceisla Date: Mon, 9 Aug 2021 18:06:45 -0500 Subject: [PATCH 425/711] Update docker configuration --- configuration.rst | 20 ++++++++++---------- install.rst | 15 ++------------- releases/v8.0.0.rst | 3 +++ 3 files changed, 15 insertions(+), 23 deletions(-) diff --git a/configuration.rst b/configuration.rst index b758b1265f..5b6a28e375 100644 --- a/configuration.rst +++ b/configuration.rst @@ -32,6 +32,8 @@ The configuration file must contain a set of key value pairs. At minimum you mus The user specified in the db-uri is also known as the authenticator role. For more information about the anonymous vs authenticator roles see the :ref:`roles`. +.. _config_full_list: + Here is the full list of configuration parameters. ======================== ======= ================= ======== @@ -65,8 +67,6 @@ role-claim-key String .role raw-media-types String ======================== ======= ================= ======== -You can also set these configuration parameters using environment variables. They are capitalized, have a ``PGRST_`` prefix, and use underscores. For example: ``PGRST_DB_URI`` corresponds to ``db-uri``. - .. _db-uri: db-uri @@ -386,6 +386,13 @@ raw-media-types raw-media-types="image/png, text/xml" +.. _env_variables_config: + +Environment Variables +===================== + +You can also set these :ref:`configuration parameters ` using environment variables. They are capitalized, have a ``PGRST_`` prefix, and use underscores. For example: ``PGRST_DB_URI`` corresponds to ``db-uri`` and ``PGRST_APP_SETTINGS_*`` to ``app.settings.*``. + .. _config_reloading: Configuration Reloading @@ -397,14 +404,7 @@ To reload the configuration without restarting the PostgREST server, send a SIGU killall -SIGUSR2 postgrest -To reload the config in docker: - -.. code:: bash - - docker kill -s SIGUSR2 - - # or in docker-compose - docker-compose kill -s SIGUSR2 +This method does not reload :ref:`env_variables_config` and it will not work for reloading a Docker container configuration. In these cases, you need to restart the PostgREST server or use :ref:`in_db_config` as an alternative. .. important:: diff --git a/install.rst b/install.rst index 6a682d8fd5..afe50b6e86 100644 --- a/install.rst +++ b/install.rst @@ -99,19 +99,7 @@ You can get the `official PostgREST Docker image `_. |br| -- `@monacoremo `_ +* The Docker image no longer has an internal ``/etc/postgrest.conf`` file, you must use :ref:`env_variables_config` to configure it. + |br| -- `@wolfgangwalther `_ + * The ``pg_listen`` `utility `_ is no longer needed to automatically reload the schema cache and it's replaced entirely by database notifications. See :ref:`schema_reloading_notify`. |br| -- `@steve-chavez `_ From ff30d4d417547e4542aadcefac4e0d3d0c3bdb22 Mon Sep 17 00:00:00 2001 From: Laurence Isla Date: Mon, 9 Aug 2021 18:29:37 -0500 Subject: [PATCH 426/711] Update config.py version/release --- conf.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/conf.py b/conf.py index 71122e56a5..6e017e016d 100644 --- a/conf.py +++ b/conf.py @@ -54,9 +54,9 @@ # built documents. # # The short X.Y version. -version = u'7.0' +version = u'8.0' # The full version, including alpha/beta/rc tags. -release = u'7.0.1' +release = u'8.0.0' # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. From fcabf4012b0c650a563b826ba8260322b51c2daa Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Tue, 10 Aug 2021 00:26:24 -0500 Subject: [PATCH 427/711] Reorder release notes for v8.0 --- admin.rst | 4 +-- configuration.rst | 6 ++--- releases/v8.0.0.rst | 64 ++++++++++++++++++++------------------------- schema_cache.rst | 6 ++--- 4 files changed, 37 insertions(+), 43 deletions(-) diff --git a/admin.rst b/admin.rst index 7ab4f1277d..dca785cbf2 100644 --- a/admin.rst +++ b/admin.rst @@ -148,14 +148,14 @@ Logging PostgREST logs basic request information to ``stdout``, including the requesting IP address and user agent, the URL requested, and HTTP response status. -.. code-block:: +.. code-block:: none 127.0.0.1 - - [26/Jul/2021:01:56:38 -0500] "GET /clients HTTP/1.1" 200 - "" "curl/7.64.0" 127.0.0.1 - - [26/Jul/2021:01:56:48 -0500] "GET /unexistent HTTP/1.1" 404 - "" "curl/7.64.0" For diagnostic information about the server itself, PostgREST logs to ``stderr``. -.. code-block:: +.. code-block:: none 12/Jun/2021:17:47:39 -0500: Attempting to connect to the database... 12/Jun/2021:17:47:39 -0500: Listening on port 3000 diff --git a/configuration.rst b/configuration.rst index 5b6a28e375..04dd236db9 100644 --- a/configuration.rst +++ b/configuration.rst @@ -404,7 +404,7 @@ To reload the configuration without restarting the PostgREST server, send a SIGU killall -SIGUSR2 postgrest -This method does not reload :ref:`env_variables_config` and it will not work for reloading a Docker container configuration. In these cases, you need to restart the PostgREST server or use :ref:`in_db_config` as an alternative. +This method does not reload :ref:`env_variables_config` and it will not work for reloading a Docker container configuration. In these cases, you need to restart the PostgREST server or use the :ref:`in_db_config` as an alternative. .. important:: @@ -433,12 +433,12 @@ For example, you can configure :ref:`db-schema` and :ref:`jwt-secret` like this: ALTER ROLE authenticator SET pgrst.db_schema = "tenant1, tenant2, tenant3" ALTER ROLE authenticator SET pgrst.jwt_secret = "REALLYREALLYREALLYREALLYVERYSAFE" +Note that underscores(``_``) need to be used instead of dashes(``-``) for the in-database config options. + .. important:: For altering a role in this way, you need a SUPERUSER. You might not be able to use this configuration mode on cloud-hosted databases. -Note that underscores(``_``) need to be used instead of dashes(``-``) for the options when the configuration is inside the database. - When using both the configuration file and the in-database configuration, the latter takes precedence. .. danger:: diff --git a/releases/v8.0.0.rst b/releases/v8.0.0.rst index a47dfa5033..6b55c98e1d 100644 --- a/releases/v8.0.0.rst +++ b/releases/v8.0.0.rst @@ -19,7 +19,7 @@ Added * Allow :ref:`embedding_view_chains` recursively to any depth. |br| -- `@wolfgangwalther `_ -* No downtime when reloading the schema cache. See the note in :ref:`schema_reloading`. +* No downtime when reloading the schema cache. See :ref:`schema_reloading`. |br| -- `@steve-chavez `_ * Allow schema cache reloading using PostgreSQL :ref:`NOTIFY ` command. This enables :ref:`auto_schema_reloading`. @@ -63,6 +63,34 @@ Added + Added the :ref:`schema_cache` page. + Moved the :ref:`schema_reloading` reference from :ref:`admin` to :ref:`schema_cache` +Changed +------- + +* Docker images are now optimized to be built from the scratch image. This reduces the compressed image size from over 30 MB to about 4 MB. + For more details, see `Docker image built with Nix `_. + |br| -- `@monacoremo `_ + +* The Docker image no longer has an internal ``/etc/postgrest.conf`` file, you must use :ref:`env_variables_config` to configure it. + |br| -- `@wolfgangwalther `_ + +* The ``pg_listen`` `utility `_ is no longer needed to automatically reload the schema cache + and it's replaced entirely by database notifications. See :ref:`auto_schema_reloading`. + |br| -- `@steve-chavez `_ + +* POST requests for insertions no longer include a ``Location`` header in the response by default and behave the same way as having a + ``Prefer: return=minimal`` header in the request. This prevents permissions errors when having a write-only table. See :ref:`insert_update`. + |br| -- `@laurenceisla `_ + +* Modified the default logging level from ``info`` to ``error``. See :ref:`log-level`. + |br| -- `@steve-chavez `_ + +* Changed the error message for a not found RPC on a stale schema (see :ref:`stale_function_signature`) and for the unsupported case of + overloaded functions with the same argument names but different types. + |br| -- `@laurenceisla `_ + +* Changed the error message for the no relationship found error. See :ref:`stale_fk_relationships`. + |br| -- `@laurenceisla `_ + Fixed ----- @@ -111,40 +139,6 @@ Fixed * Fix requests for overloaded functions from HTML forms to no longer hang. |br| -- `@laurenceisla `_ -* Add a hint and clarification to the no relationship found error. - |br| -- `@laurenceisla `_ - -* Show comprehensive error when an RPC is not found in a stale schema cache. - |br| -- `@laurenceisla `_ - -* Fix Location headers in headers only representation for null PK inserts on views. - |br| -- `@laurenceisla `_ - -Changed -------- - -* Docker images are now optimized to be built from the scratch image. This reduces the compressed image size from over 30 MB to about 4 MB. - For more details, see `Docker image built with Nix `_. - |br| -- `@monacoremo `_ - -* The Docker image no longer has an internal ``/etc/postgrest.conf`` file, you must use :ref:`env_variables_config` to configure it. - |br| -- `@wolfgangwalther `_ - -* The ``pg_listen`` `utility `_ is no longer needed to automatically reload the schema cache - and it's replaced entirely by database notifications. See :ref:`schema_reloading_notify`. - |br| -- `@steve-chavez `_ - -* Improved error message for a not found RPC on a stale schema (see :ref:`stale_function_signature`) and for the unsupported case of - overloaded functions with the same argument names but different types. - |br| -- `@laurenceisla `_ - -* Modified the default logging level from ``info`` to ``error``. See :ref:`log-level`. - |br| -- `@steve-chavez `_ - -* POST requests for insertions no longer include a ``Location`` header in the response by default and behave the same way as having a - ``Prefer: return=minimal`` header in the request. This prevents permissions errors when having a write-only table. See :ref:`insert_update`. - |br| -- `@laurenceisla `_ - Thanks ------ diff --git a/schema_cache.rst b/schema_cache.rst index e4c265703d..f6fd237499 100644 --- a/schema_cache.rst +++ b/schema_cache.rst @@ -34,6 +34,8 @@ When you make changes on the metadata mentioned above, the schema cache will tur For instance, let's see what would happen if you have a stale schema cache for foreign key relationships and function signatures. +.. _stale_fk_relationships: + Stale Foreign Key Relationships ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -102,9 +104,7 @@ For docker you can do: # or in docker-compose docker-compose kill -s SIGUSR1 -.. note:: - - There's no downtime when reloading the schema cache. The reloading will happen on a background thread while requests keep being served. +There's no downtime when reloading the schema cache. The reloading will happen on a background thread while requests keep being served. .. _schema_reloading_notify: From 0d23be7731ca7e601f9540e937871591c56fd04f Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Tue, 10 Aug 2021 00:37:25 -0500 Subject: [PATCH 428/711] Fix logging blocks not showing on RTD --- admin.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/admin.rst b/admin.rst index dca785cbf2..908514a9b4 100644 --- a/admin.rst +++ b/admin.rst @@ -148,14 +148,14 @@ Logging PostgREST logs basic request information to ``stdout``, including the requesting IP address and user agent, the URL requested, and HTTP response status. -.. code-block:: none +.. code:: 127.0.0.1 - - [26/Jul/2021:01:56:38 -0500] "GET /clients HTTP/1.1" 200 - "" "curl/7.64.0" 127.0.0.1 - - [26/Jul/2021:01:56:48 -0500] "GET /unexistent HTTP/1.1" 404 - "" "curl/7.64.0" For diagnostic information about the server itself, PostgREST logs to ``stderr``. -.. code-block:: none +.. code:: 12/Jun/2021:17:47:39 -0500: Attempting to connect to the database... 12/Jun/2021:17:47:39 -0500: Listening on port 3000 From f7108e8612808afb372827bd0d43c4e7d778c470 Mon Sep 17 00:00:00 2001 From: Laurence Isla Date: Wed, 11 Aug 2021 20:13:04 -0500 Subject: [PATCH 429/711] Add example apps to ecosystem Add postgres-postgrest-cloudflared-example and svelte-postgrest-template --- ecosystem.rst | 2 ++ postgrest.dict | 3 +++ 2 files changed, 5 insertions(+) diff --git a/ecosystem.rst b/ecosystem.rst index c89d12820e..2d96671d10 100644 --- a/ecosystem.rst +++ b/ecosystem.rst @@ -32,6 +32,7 @@ Example Apps * `pgrst-dev-setup `_ - docker-compose and tmuxp setup for experimentation. * `postgrest-demo `_ - multi-tenant logging system * `postgrest-example `_ - sqitch versioning for API +* `postgres-postgrest-cloudflared-example `_ - docker-compose setup exposing PostgREST using cloudfared * `postgrest-sessions-example `_ - example for cookie-based sessions * `postgrest-starter-kit `_ - boilerplate for new project * `postgrest-translation-proxy `_ - calling to external translation service @@ -39,6 +40,7 @@ Example Apps * `postgrest-vercel `_ - run PostgREST on Vercel (Serverless/AWS Lambda) * `PostgrestSkeleton `_ - Docker Compose, PostgREST, Nginx and Auth0 * `PostGUI `_ - React Material UI admin panel +* `svelte-postgrest-template `_ - Svelte/SvelteKit, PostgREST, EveryLayout and social auth .. _eco_external_notification: diff --git a/postgrest.dict b/postgrest.dict index a5c4b6d0c4..202a9505ff 100644 --- a/postgrest.dict +++ b/postgrest.dict @@ -16,6 +16,7 @@ cd centric changelog ClojureScript +cloudfared config CORS cryptographically @@ -27,6 +28,7 @@ disjoined dockerize DoS eq +EveryLayout Fenko Fernandes filename @@ -145,6 +147,7 @@ stdout Stolarz subselect SuperAgent +SvelteKit syslog systemd Tcl From 91152ebad0625abc1acf7a0b65937e936b0c2f86 Mon Sep 17 00:00:00 2001 From: laurenceisla Date: Fri, 13 Aug 2021 17:31:01 -0500 Subject: [PATCH 430/711] Add partitioned tables in the schema cache --- api.rst | 43 +++++++++++++++++++++++++++++++++++++++++++ index.rst | 4 +++- releases/upcoming.rst | 12 ++++++++++++ 3 files changed, 58 insertions(+), 1 deletion(-) create mode 100644 releases/upcoming.rst diff --git a/api.rst b/api.rst index ecc34487bd..ea7b7bd63a 100644 --- a/api.rst +++ b/api.rst @@ -651,6 +651,49 @@ Embedded resources can be aliased and filters can be applied on these aliases: GET /films?select=*,90_comps:competitions(name),91_comps:competitions(name)&90_comps.year=eq.1990&91_comps.year=eq.1991 HTTP/1.1 +.. _embedding_partitioned_tables: + +Embedding Partitioned Tables +---------------------------- + +Embedding can also be done between `partitioned tables `_ and other tables. + +For example, let's create the ``box_office`` partitioned table that has the gross daily revenue of a film: + +.. code-block:: postgres + + CREATE TABLE box_office ( + bo_date DATE NOT NULL, + film_id INT REFERENCES test.films NOT NULL, + gross_revenue DECIMAL(12,2) NOT NULL, + PRIMARY KEY (bo_date, film_id) + ) PARTITION BY RANGE (bo_date); + + -- Let's also create partitions for each month of 2021 + + CREATE TABLE box_office_2021_01 PARTITION OF test.box_office + FOR VALUES FROM ('2021-01-01') TO ('2021-01-31'); + + CREATE TABLE box_office_2021_02 PARTITION OF test.box_office + FOR VALUES FROM ('2021-02-01') TO ('2021-02-28'); + + -- and so until december 2021 + +Since it contains the ``films_id`` foreign key, it is possible to embed ``box_office`` and ``films``: + +.. code-block:: http + + GET /box_office?select=bo_date,gross_revenue,films(title)&gross_revenue=gte.1000000 HTTP/1.1 + +Embedding is also possible between ``box_office`` partitions and the ``films`` table: + +.. code-block:: http + + GET /films?select=title,box_office_2021_02(bo_date,gross_revenue)&rating=gt.8 HTTP/1.1 + +.. note:: + Partitioned tables can reference other tables since PostgreSQL 11 but can only be referenced from any other table since PostgreSQL 12. + .. _embedding_views: Embedding Views diff --git a/index.rst b/index.rst index 8b2033ea10..65522fad5f 100644 --- a/index.rst +++ b/index.rst @@ -234,7 +234,6 @@ Here are some companies that use PostgREST in production. * `Catarse `_ * `Datrium `_ * `Drip Depot `_ -* `eGull `_ * `Image-charts `_ * `Moat `_ * `MotionDynamic - Fast highly dynamic video generation at scale `_ @@ -246,6 +245,9 @@ Here are some companies that use PostgREST in production. * `Sompani `_ * `Supabase `_ +.. Certs are failing + * `eGull `_ + Testimonials ------------ diff --git a/releases/upcoming.rst b/releases/upcoming.rst new file mode 100644 index 0000000000..5d9e0e4372 --- /dev/null +++ b/releases/upcoming.rst @@ -0,0 +1,12 @@ +.. |br| raw:: html + +
    + +Upcoming +======== + +Added +----- + +* Allow :ref:`embedding `, UPSERT, INSERT with Location response, OPTIONS request and OpenAPI support for partitioned tables. + |br| -- `@laurenceisla `_ From 34958e723a57a0ea323a3a4f0501640263bf530d Mon Sep 17 00:00:00 2001 From: laurenceisla Date: Fri, 3 Sep 2021 13:04:21 -0500 Subject: [PATCH 431/711] Add link and explanation to download the latest unreleased builds --- ecosystem.rst | 1 - releases/upcoming.rst | 3 +++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/ecosystem.rst b/ecosystem.rst index 2d96671d10..1104ac7a5c 100644 --- a/ecosystem.rst +++ b/ecosystem.rst @@ -93,7 +93,6 @@ Client-Side Libraries * `postgrest-js `_ - TypeScript/JavaScript * `postgrest-kt `_ - Kotlin * `postgrest-py `_ - Python -* `postgrest-pyclient `_ - Python * `postgrest-request `_ - JS, SuperAgent * `postgrest-rs `_ - Rust * `postgrest-sharp-client `_ (needs maintainer) - C#, RestSharp diff --git a/releases/upcoming.rst b/releases/upcoming.rst index 5d9e0e4372..120b69eaa6 100644 --- a/releases/upcoming.rst +++ b/releases/upcoming.rst @@ -5,6 +5,9 @@ Upcoming ======== +These are changes yet unreleased. If you'd like to try them out before a new official release, access `the list of CI runs `_ +and select the newest commit, then download the build from the Artifacts section at the bottom of the page (you'll need a GitHub account to download it). + Added ----- From aea3b24b31f0cb8ed78a767a4a5e9140377a74cd Mon Sep 17 00:00:00 2001 From: Laurence Isla Date: Fri, 3 Sep 2021 15:05:15 -0500 Subject: [PATCH 432/711] Update example apps --- ecosystem.rst | 15 ++++++++++----- postgrest.dict | 3 +++ 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/ecosystem.rst b/ecosystem.rst index 1104ac7a5c..dd096a5341 100644 --- a/ecosystem.rst +++ b/ecosystem.rst @@ -19,27 +19,32 @@ Community Tutorials Example Apps ------------ -* `blogdemo `_ - blog api demo in a vagrant image * `chronicle `_ - tracking a tree of personal memories +* `cloudgov-demo-postgrest `_ - demo for a federally-compliant REST API on cloud.gov +* `code-du-travail-backoffice `_ - data administration portal for the official French Labor Code and Agreements +* `compose-postgrest `_ - docker-compose setup with Nginx and HTML example +* `delibrium-postgrest `_ - example school API and front-end in Vue.js * `elm-workshop `_ - building a simple database query UI * `ember-postgrest-dynamic-ui `_ - generating Ember forms to edit data +* `ETH-transactions-storage `_ - indexer for Ethereum to get transaction list by ETH address * `ext-postgrest-crud `_ - browser-based spreadsheet * `general `_ - example auth back-end -* `goodfilm `_ - example film api +* `goodfilm `_ - example film API +* `guild-operators `_ - example queries and functions that the Cardano Community uses for their Guild Operators' Repository * `handsontable-postgrest `_ - an excel-like database table editor * `heritage-near-me `_ - Elm and PostgREST with PostGIS * `ng-admin-postgrest `_ - automatic database admin panel * `pgrst-dev-setup `_ - docker-compose and tmuxp setup for experimentation. +* `postgres-postgrest-cloudflared-example `_ - docker-compose setup exposing PostgREST using cloudfared * `postgrest-demo `_ - multi-tenant logging system * `postgrest-example `_ - sqitch versioning for API -* `postgres-postgrest-cloudflared-example `_ - docker-compose setup exposing PostgREST using cloudfared * `postgrest-sessions-example `_ - example for cookie-based sessions -* `postgrest-starter-kit `_ - boilerplate for new project * `postgrest-translation-proxy `_ - calling to external translation service * `postgrest-ui `_ - ClojureScript UI components for PostgREST * `postgrest-vercel `_ - run PostgREST on Vercel (Serverless/AWS Lambda) * `PostgrestSkeleton `_ - Docker Compose, PostgREST, Nginx and Auth0 * `PostGUI `_ - React Material UI admin panel +* `prospector `_ - data warehouse and visualization platform * `svelte-postgrest-template `_ - Svelte/SvelteKit, PostgREST, EveryLayout and social auth .. _eco_external_notification: @@ -71,7 +76,7 @@ Extensions * `postgrest-node `_ - Run a PostgREST server in Node.js via npm module * `postgrest-oauth `_ - OAuth2 WAI middleware * `postgrest-oauth/api `_ - OAuth2 server -* `PostgREST-writeAPI `_ - generate nginx rewrite rules to fit an OpenAPI spec +* `PostgREST-writeAPI `_ - generate Nginx rewrite rules to fit an OpenAPI spec * `spas `_ - allow file uploads and basic auth .. _clientside_libraries: diff --git a/postgrest.dict b/postgrest.dict index 202a9505ff..227ccefcb4 100644 --- a/postgrest.dict +++ b/postgrest.dict @@ -12,6 +12,7 @@ balancer Beles Bouscal buildpack +Cardano cd centric changelog @@ -28,6 +29,8 @@ disjoined dockerize DoS eq +ETH +Ethereum EveryLayout Fenko Fernandes From 5fb11e37a3bf5116a183a88fe335d6da49a49ab7 Mon Sep 17 00:00:00 2001 From: Laurence Isla Date: Wed, 15 Sep 2021 19:45:47 -0500 Subject: [PATCH 433/711] Add devops links to helm charts --- ecosystem.rst | 8 ++++++++ postgrest.dict | 2 ++ 2 files changed, 10 insertions(+) diff --git a/ecosystem.rst b/ecosystem.rst index dd096a5341..68d6f5bd98 100644 --- a/ecosystem.rst +++ b/ecosystem.rst @@ -47,6 +47,14 @@ Example Apps * `prospector `_ - data warehouse and visualization platform * `svelte-postgrest-template `_ - Svelte/SvelteKit, PostgREST, EveryLayout and social auth +.. _dev_ops: + +DevOps +------ + +* `jbkarle/postgrest `_ - helm chart with a demo database for development and test purposes +* `cloudstark/helm-charts `_ - helm chart to deploy PostgREST to a Kubernetes cluster via a Deployment and Service + .. _eco_external_notification: External Notification diff --git a/postgrest.dict b/postgrest.dict index 227ccefcb4..cfe0e3bead 100644 --- a/postgrest.dict +++ b/postgrest.dict @@ -24,6 +24,7 @@ cryptographically CSV Daemonizing DDL +DevOps DiBiase disjoined dockerize @@ -64,6 +65,7 @@ jwt JWTs Kinesis Kofi +Kubernetes localhost login Logins From 09ca21d032047086bd6c81545d0d4fabd3450b74 Mon Sep 17 00:00:00 2001 From: Boris Korzun Date: Thu, 23 Sep 2021 03:52:37 +1000 Subject: [PATCH 434/711] Updated FreeBSD dependencies Update FreeBSD dependencies as in bsd.default-versions.mk --- install.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install.rst b/install.rst index afe50b6e86..c7592f5e11 100644 --- a/install.rst +++ b/install.rst @@ -213,7 +213,7 @@ You can build PostgREST from source with `Stack Date: Thu, 30 Sep 2021 17:18:58 -0500 Subject: [PATCH 435/711] Specify external connection poolers --- admin.rst | 8 ++++---- configuration.rst | 4 ++-- releases/v8.0.0.rst | 2 +- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/admin.rst b/admin.rst index 908514a9b4..68df23052f 100644 --- a/admin.rst +++ b/admin.rst @@ -120,12 +120,12 @@ The burst argument tells Nginx to start dropping requests if more than five queu Nginx rate limiting is general and indiscriminate. To rate limit each authenticated request individually you will need to add logic in a :ref:`Custom Validation ` function. -.. _connection_poolers: +.. _external_connection_poolers: -Using Connection Poolers ------------------------- +Using External Connection Poolers +--------------------------------- -In order to increase performance, PostgREST uses prepared statements by default. However, this setting is incompatible with connection poolers such as PgBouncer working in transaction pooling mode. In this case, you need to set the :ref:`db-prepared-statements` config option to ``false``. On the other hand, session pooling is fully compatible with PostgREST, while statement pooling is not compatible at all. +PostgREST manages its :ref:`own pool of connections ` and uses prepared statements by default in order to increase performance. However, this setting is incompatible with external connection poolers such as PgBouncer working in transaction pooling mode. In this case, you need to set the :ref:`db-prepared-statements` config option to ``false``. On the other hand, session pooling is fully compatible with PostgREST, while statement pooling is not compatible at all. .. note:: diff --git a/configuration.rst b/configuration.rst index 04dd236db9..2da88d208d 100644 --- a/configuration.rst +++ b/configuration.rst @@ -158,7 +158,7 @@ db-channel-enabled When this is set to :code:`true`, the notification channel specified in :ref:`db-channel` is enabled. - You should set this to ``false`` when using PostgresSQL behind a connection pooler such as PgBouncer working in transaction pooling mode. See :ref:`this section ` for more information. + You should set this to ``false`` when using PostgresSQL behind an external connection pooler such as PgBouncer working in transaction pooling mode. See :ref:`this section ` for more information. .. _db-prepared-statements: @@ -169,7 +169,7 @@ db-prepared-statements When disabled, the generated queries will be parameterized (invulnerable to SQL injection) but they will not be prepared (cached in the database session). Not using prepared statements will noticeably decrease performance, so it's recommended to always have this setting enabled. - You should only set this to ``false`` when using PostgresSQL behind a connection pooler such as PgBouncer working in transaction pooling mode. See :ref:`this section ` for more information. + You should only set this to ``false`` when using PostgresSQL behind an external connection pooler such as PgBouncer working in transaction pooling mode. See :ref:`this section ` for more information. .. _db-tx-end: diff --git a/releases/v8.0.0.rst b/releases/v8.0.0.rst index 6b55c98e1d..a02a20f697 100644 --- a/releases/v8.0.0.rst +++ b/releases/v8.0.0.rst @@ -28,7 +28,7 @@ Added * Allow sending the header ``Prefer: headers-only`` to get a response with a ``Location`` header. See :ref:`insert_update`. |br| -- `@laurenceisla `_ -* Allow :ref:`connection_poolers` such as PgBouncer in transaction pooling mode. +* Allow :ref:`external_connection_poolers` such as PgBouncer in transaction pooling mode. |br| -- `@laurenceisla `_ * Allow :ref:`config_reloading` by sending a SIGUSR2 signal. From ad13e00f6456c75cbe69a0f8921114806d1ef2af Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Szostek?= Date: Sun, 3 Oct 2021 00:40:42 +0100 Subject: [PATCH 436/711] Typo in api.rst, correct `ignore_privileges` The correct setting name is `ignore-privileges`, with dash in between the words. --- api.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/api.rst b/api.rst index ea7b7bd63a..6ac6001ed9 100644 --- a/api.rst +++ b/api.rst @@ -1461,7 +1461,7 @@ Every API hosted by PostgREST automatically serves a full `OpenAPI `_ on any database object. For instance, From ec7ace2e73509e955b01e65b653baecd663b84ad Mon Sep 17 00:00:00 2001 From: laurenceisla Date: Wed, 13 Oct 2021 14:31:49 -0500 Subject: [PATCH 437/711] Add compatibility with PostgreSQL v14 --- api.rst | 24 ++++++++++++++++++------ auth.rst | 2 +- configuration.rst | 10 ++++++++++ postgrest.dict | 1 + releases/upcoming.rst | 8 ++++++++ 5 files changed, 38 insertions(+), 7 deletions(-) diff --git a/api.rst b/api.rst index 6ac6001ed9..2a56d9aadc 100644 --- a/api.rst +++ b/api.rst @@ -1584,20 +1584,32 @@ HTTP Logic Accessing Request Headers, Cookies and JWT claims ------------------------------------------------- -You can access request headers, cookies and JWT claims by reading GUC variables set by PostgREST per request. They are named :code:`request.header.XYZ`, :code:`request.cookie.XYZ` and :code:`request.jwt.claim.XYZ`. +You can access request headers, cookies and JWT claims by reading GUC variables set by PostgREST per request. They are named :code:`request.headers`, :code:`request.cookies` and :code:`request.jwt.claims`. .. code-block:: postgresql - -- To read the value of the Origin request header: - SELECT current_setting('request.header.origin', true); + -- To read the value of the User-Agent request header: + SELECT current_setting('request.headers', true)::json->>'user-agent'; + -- To read the value of sessionId in a cookie: - SELECT current_setting('request.cookie.sessionId', true); + SELECT current_setting('request.cookies', true)::json->>'sessionId'; + -- To read the value of the email claim in a jwt: - SELECT current_setting('request.jwt.claim.email', true); + SELECT current_setting('request.jwt.claims', true)::json->>'email'; + + -- To get all the headers sent in the request + SELECT current_setting('request.headers', true)::json; .. note:: - ``request.jwt.claim.role`` defaults to the value of :ref:`db-anon-role`. + The ``role`` in ``request.jwt.claims`` defaults to the value of :ref:`db-anon-role`. + +.. _guc_legacy_names: + +Legacy GUC variable names +~~~~~~~~~~~~~~~~~~~~~~~~~ + +For PostgreSQL versions below 14, PostgREST will take into consideration the :ref:`db-use-legacy-gucs` config, which is set to true by default. This means that the interface for accessing these GUCs is `the same as in older versions `_. You can opt in to use the JSON GUCs mentioned above by setting the ``db-use-legacy-gucs`` to false. .. _guc_req_path_method: diff --git a/auth.rst b/auth.rst index d00f673682..748a9fe291 100644 --- a/auth.rst +++ b/auth.rst @@ -165,7 +165,7 @@ You can create a valid JWT either from inside your database or via an external s JWT from SQL ~~~~~~~~~~~~ -You can create JWT tokens in SQL using the `pgjwt extension `_. It's simple and requires only pgcrypto. If you're on an environment like Amazon RDS which doesn't support installing new extensions, you can still manually run the `SQL inside pgjwt `_ (you'll need to replace ``@extschema@`` with another schema or just delete it) which creates the functions you will need. +You can create JWT tokens in SQL using the `pgjwt extension `_. It's simple and requires only pgcrypto. If you're on an environment like Amazon RDS which doesn't support installing new extensions, you can still manually run the `SQL inside pgjwt `_ (you'll need to replace ``@extschema@`` with another schema or just delete it) which creates the functions you will need. Next write a stored procedure that returns the token. The one below returns a token with a hard-coded role, which expires five minutes after it was issued. Note this function has a hard-coded secret as well. diff --git a/configuration.rst b/configuration.rst index 2da88d208d..2826e2d5d9 100644 --- a/configuration.rst +++ b/configuration.rst @@ -50,6 +50,7 @@ db-channel-enabled Boolean True db-prepared-statements Boolean True db-tx-end String commit db-config Boolean True +db-use-legacy-gucs Boolean True server-host String !4 server-port Int 3000 server-unix-socket String @@ -199,6 +200,15 @@ db-config Enables the in-database configuration. +.. _db-use-legacy-gucs: + +db-use-legacy-gucs +------------------ + + Determine if GUC request settings for headers, cookies and jwt claims use the `legacy names `_ (string with dashes, invalid starting from PostgreSQL v14) with text values instead of the :ref:`new names ` (string without dashes, valid on all PostgreSQL versions) with json values. + + On PostgreSQL versions 14 and above, this parameter is ignored. + .. _server-host: server-host diff --git a/postgrest.dict b/postgrest.dict index cfe0e3bead..396e67b5ee 100644 --- a/postgrest.dict +++ b/postgrest.dict @@ -45,6 +45,7 @@ grantor GraphQL gte GUC +gucs Gumbs Haskell Heroku diff --git a/releases/upcoming.rst b/releases/upcoming.rst index 120b69eaa6..060d528b09 100644 --- a/releases/upcoming.rst +++ b/releases/upcoming.rst @@ -13,3 +13,11 @@ Added * Allow :ref:`embedding `, UPSERT, INSERT with Location response, OPTIONS request and OpenAPI support for partitioned tables. |br| -- `@laurenceisla `_ + +* Make GUC names for headers, cookies and jwt claims compatible with PostgreSQL v14. + + + The GUC names on PostgreSQL 14 are changed to the ones :ref:`mentioned in this section `, while older versions still use the :ref:`guc_legacy_names`. + + PostgreSQL versions below 14 can opt in to the new JSON GUCs by setting the :ref:`db-use-legacy-gucs` config option to false (true by default). + + Managed to avoid a breaking change thanks to `@robertsosinski `_ who reported the bug that only one ``.`` character was allowed in GUC keys to the PostgreSQL team. See the `full discussion `_. + + -- `@laurenceisla `_ From ee1ec780d2dfe1e96257e67f406bb7c6586a0ee3 Mon Sep 17 00:00:00 2001 From: laurenceisla Date: Mon, 18 Oct 2021 17:34:49 -0500 Subject: [PATCH 438/711] Add nested embedding examples --- api.rst | 19 +++++++++++++++++++ releases/upcoming.rst | 4 ++++ 2 files changed, 23 insertions(+) diff --git a/api.rst b/api.rst index 2a56d9aadc..e4255eddad 100644 --- a/api.rst +++ b/api.rst @@ -616,6 +616,17 @@ PostgREST can also detect relationships going through join tables. Thus you can GET /actors?select=films(title,year) HTTP/1.1 +.. _nested_embedding: + +Nested Embedding +---------------- + +If you want to embed through join tables but need more control on the intermediate resources, you can do nested embedding. For instance, you can request the Actors, their Roles and the Films for those Roles: + +.. code-block:: http + + GET /actors?select=roles(character,films(title,year)) HTTP/1.1 + Embedded Filters ---------------- @@ -651,6 +662,14 @@ Embedded resources can be aliased and filters can be applied on these aliases: GET /films?select=*,90_comps:competitions(name),91_comps:competitions(name)&90_comps.year=eq.1990&91_comps.year=eq.1991 HTTP/1.1 +Filters can also be applied on nested embedded resources: + +.. code-block:: http + + GET /films?select=*,roles(*,actors(*))&roles.actors.order=last_name&roles.actors.first_name=like.*Tom* HTTP/1.1 + +The result will show the nested actors named Tom and order them by last name. Aliases can also be used instead of the resource names to filter the nested tables. + .. _embedding_partitioned_tables: Embedding Partitioned Tables diff --git a/releases/upcoming.rst b/releases/upcoming.rst index 060d528b09..37bc92dc02 100644 --- a/releases/upcoming.rst +++ b/releases/upcoming.rst @@ -21,3 +21,7 @@ Added + Managed to avoid a breaking change thanks to `@robertsosinski `_ who reported the bug that only one ``.`` character was allowed in GUC keys to the PostgreSQL team. See the `full discussion `_. -- `@laurenceisla `_ + +* Documentation improvements + + + Added :ref:`nested_embedding` to the :ref:`resource_embedding` section. From c6ef4305b13d2b6af1e4820dc71fbb0e100ff500 Mon Sep 17 00:00:00 2001 From: laurenceisla Date: Tue, 19 Oct 2021 11:34:18 -0500 Subject: [PATCH 439/711] Allow top-level resource with embed filter --- api.rst | 65 +++++++++++++++++++++++++++++++++++++++++++ configuration.rst | 16 +++++++++++ releases/upcoming.rst | 7 +++++ 3 files changed, 88 insertions(+) diff --git a/api.rst b/api.rst index e4255eddad..5826f7f45c 100644 --- a/api.rst +++ b/api.rst @@ -670,6 +670,65 @@ Filters can also be applied on nested embedded resources: The result will show the nested actors named Tom and order them by last name. Aliases can also be used instead of the resource names to filter the nested tables. +.. _embedding_top_level_filter: + +Top Level Filtering +~~~~~~~~~~~~~~~~~~~ + +By default, embedded filters don't change the top level resource rows at all: + +.. code-block:: http + + GET /films?select=title,actors(first_name,last_name)&actors.first_name=eq.Jehanne HTTP/1.1 + +.. code-block:: json + + [ + { + "title": "Workers Leaving The Lumière Factory In Lyon", + "actors": [] + }, + { + "title": "The Dickson Experimental Sound Film", + "actors": [] + }, + { + "title": "The Haunted Castle", + "actors": [ + { + "first_name": "Jehanne", + "last_name": "d'Alcy" + } + ] + } + ] + +In order to filter the top level rows you need to add ``!inner`` to the embedded resource. For instance, to get **only** the films that have an actor named ``Jehanne``: + +.. code-block:: http + + GET /films?select=title,actors!inner(first_name,last_name)&actors.first_name=eq.Jehanne HTTP/1.1 + +.. code-block:: json + + [ + { + "title": "The Haunted Castle", + "actors": [ + { + "first_name": "Jehanne", + "last_name": "d'Alcy" + } + ] + } + ] + +If you prefer to work with top level filtering as a default embedding behavior for PostgREST, set the :ref:`db-embed-default-join` configuration parameter to ``"inner"``. This way, you don't need to specify ``!inner`` on every request and, if you need the previous behavior, add ``!left`` to the embedding resource. For instance, this will not filter the films in any way: + +.. code-block:: http + + GET /films?select=title,actors!left(first_name,last_name)&actors.first_name=eq.Jehanne HTTP/1.1 + .. _embedding_partitioned_tables: Embedding Partitioned Tables @@ -936,6 +995,12 @@ Here we specify ``central_addresses`` as the **target** and the ``billing_addres Similarly to the **target**, the **hint** can be a **table name**, **foreign key constraint name** or **column name**. +Hints also work alongside ``!inner`` if a top level filtering is needed. From the above example: + +.. code-block:: http + + GET /orders?select=*,central_addresses!billing_address!inner(*)¢ral_addresses.code="AB1000" HTTP/1.1 + .. _insert_update: Insertions / Updates diff --git a/configuration.rst b/configuration.rst index 2826e2d5d9..c3a38301d1 100644 --- a/configuration.rst +++ b/configuration.rst @@ -50,6 +50,7 @@ db-channel-enabled Boolean True db-prepared-statements Boolean True db-tx-end String commit db-config Boolean True +db-embed-default-join String left db-use-legacy-gucs Boolean True server-host String !4 server-port Int 3000 @@ -200,6 +201,21 @@ db-config Enables the in-database configuration. +.. _db-embed-default-join: + +db-embed-default-join +--------------------- + + Determines the default embedding type between tables or views when none is specified in the request. For more info, see :ref:`embedding_top_level_filter`. + + .. code:: bash + + # Embeds using LEFT JOIN + db-embed-default-join = "left" + + # Embeds using INNER JOIN + db-embed-default-join = "inner" + .. _db-use-legacy-gucs: db-use-legacy-gucs diff --git a/releases/upcoming.rst b/releases/upcoming.rst index 37bc92dc02..a7ac4b1168 100644 --- a/releases/upcoming.rst +++ b/releases/upcoming.rst @@ -14,6 +14,13 @@ Added * Allow :ref:`embedding `, UPSERT, INSERT with Location response, OPTIONS request and OpenAPI support for partitioned tables. |br| -- `@laurenceisla `_ +* Allow filtering top-level resource based on embedded resources filters + + + This is enabled by adding ``!inner`` to the embedded resource. See :ref:`embedding_top_level_filter`. + + This behavior can be enabled by default by setting the :ref:`db-embed-default-join` to ``"inner"``. + + -- `@steve-chavez `_ + * Make GUC names for headers, cookies and jwt claims compatible with PostgreSQL v14. + The GUC names on PostgreSQL 14 are changed to the ones :ref:`mentioned in this section `, while older versions still use the :ref:`guc_legacy_names`. From 7e7d4df93b85bddd13957b2b131335bade205a4a Mon Sep 17 00:00:00 2001 From: Wolfgang Walther Date: Wed, 20 Oct 2021 13:14:32 +0200 Subject: [PATCH 440/711] docker-compose: remove optional quotes around environment variable Resolves #446 --- install.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install.rst b/install.rst index c7592f5e11..2c03932e18 100644 --- a/install.rst +++ b/install.rst @@ -160,7 +160,7 @@ To avoid having to install the database at all, you can run both it and the serv PGRST_DB_URI: postgres://app_user:password@db:5432/app_db PGRST_DB_SCHEMA: public PGRST_DB_ANON_ROLE: app_user #In production this role should not be the same as the one used for the connection - PGRST_OPENAPI_SERVER_PROXY_URI: "http://127.0.0.1:3000" + PGRST_OPENAPI_SERVER_PROXY_URI: http://127.0.0.1:3000 depends_on: - db db: From 8e11b6f5dfd1b07feb27a4fa947c531179809193 Mon Sep 17 00:00:00 2001 From: Laurence Isla Date: Wed, 20 Oct 2021 16:13:49 -0500 Subject: [PATCH 441/711] Allow escaping inside double quotes with a backslash (#447) --- api.rst | 8 ++++++++ releases/upcoming.rst | 9 +++++++++ 2 files changed, 17 insertions(+) diff --git a/api.rst b/api.rst index 5826f7f45c..e85864d60e 100644 --- a/api.rst +++ b/api.rst @@ -312,6 +312,14 @@ Here ``information.cpe`` is a column name. GET /vulnerabilities?%22information.cpe%22=like.*MS* HTTP/1.1 +If the value filtered by the ``in`` operator has a double quote (``"``), you can escape it using a backslash ``"\""``. A backslash itself can be used with a double backslash ``"\\"``. + +Here ``Quote:"`` and ``Backslash:\`` are percent-encoded values. Note that ``%5C`` is the percent-encoded backslash. + +.. code-block:: http + + GET /marks?name=in.(%22Quote:%5C%22%22,%22Backslash:%5C%5C%22) HTTP/1.1 + .. note:: Some HTTP libraries might encode URLs automatically(e.g. :code:`axios`). In these cases you should use double quotes diff --git a/releases/upcoming.rst b/releases/upcoming.rst index a7ac4b1168..9610ba27e1 100644 --- a/releases/upcoming.rst +++ b/releases/upcoming.rst @@ -29,6 +29,15 @@ Added -- `@laurenceisla `_ +* Allow escaping inside double quotes with a backslash, e.g. ``?col=in.("Double\"Quote")``, ``?col=in.("Back\\slash")``. See :ref:`reserved-chars`. + |br| -- `@steve-chavez `_ + * Documentation improvements + Added :ref:`nested_embedding` to the :ref:`resource_embedding` section. + +Fixed +----- + +* Fix using single double quotes (``"``) and backslashes (``/``) as values on the "in" operator + |br| -- `@steve-chavez `_ From b15dd8783e77ab7932c11b7c9bc2b7093015f886 Mon Sep 17 00:00:00 2001 From: Laurence Isla Date: Thu, 21 Oct 2021 21:08:29 -0500 Subject: [PATCH 442/711] Add Retry-After header when recovering the connection --- admin.rst | 11 +++++++++++ postgrest.dict | 2 ++ releases/upcoming.rst | 3 +++ 3 files changed, 16 insertions(+) diff --git a/admin.rst b/admin.rst index 68df23052f..df318e5162 100644 --- a/admin.rst +++ b/admin.rst @@ -188,6 +188,17 @@ A great way to inspect incoming HTTP requests including headers and query parame The options to ngrep vary depending on the address and host on which you've bound the server. The binding is described in the :ref:`configuration` section. The ngrep output isn't particularly pretty, but it's legible. +.. _automatic_recovery: + +Automatic Connection Recovery +----------------------------- + +When PostgREST loses the connection to the database, it retries the connection using capped exponential backoff, with 32 seconds being the maximum backoff time. + +This retry behavior is triggered immediately after the connection is lost if :ref:`db-channel-enabled` is set to true (this is the default behavior), otherwise it will be activated once a request is made. + +To notify the client when the next reconnection attempt will be, PostgREST responds with ``503 Service Unavailable`` and the ``Retry-After: x`` header, where ``x`` is the number of seconds programmed for the next retry. + Database Logs ------------- diff --git a/postgrest.dict b/postgrest.dict index 396e67b5ee..5a26892395 100644 --- a/postgrest.dict +++ b/postgrest.dict @@ -8,6 +8,7 @@ aud Auth auth authenticator +backoff balancer Beles Bouscal @@ -123,6 +124,7 @@ Rafaj RDS reallyreallyreallyreallyverysafe Rechkemmer +reconnection Redux refactor Remo diff --git a/releases/upcoming.rst b/releases/upcoming.rst index 9610ba27e1..e5dc3541b2 100644 --- a/releases/upcoming.rst +++ b/releases/upcoming.rst @@ -32,6 +32,9 @@ Added * Allow escaping inside double quotes with a backslash, e.g. ``?col=in.("Double\"Quote")``, ``?col=in.("Back\\slash")``. See :ref:`reserved-chars`. |br| -- `@steve-chavez `_ +* Add ``Retry-After`` header when recovering the connection. See :ref:`automatic_recovery`. + |br| -- `@gautam1168 `_ + * Documentation improvements + Added :ref:`nested_embedding` to the :ref:`resource_embedding` section. From 23ad30a20ab712d1ffc16689f5eef97d41fb63eb Mon Sep 17 00:00:00 2001 From: Laurence Isla Date: Thu, 28 Oct 2021 17:47:21 -0500 Subject: [PATCH 443/711] Add templates section to the ecosystem --- ecosystem.rst | 10 ++++++++-- index.rst | 3 +++ releases/upcoming.rst | 1 + requirements.txt | 1 + 4 files changed, 13 insertions(+), 2 deletions(-) create mode 100644 requirements.txt diff --git a/ecosystem.rst b/ecosystem.rst index 68d6f5bd98..787a8b75d1 100644 --- a/ecosystem.rst +++ b/ecosystem.rst @@ -14,6 +14,14 @@ Community Tutorials * `"CodeLess" backend using postgres, postgrest and oauth2 authentication with keycloak `_ - A step-by-step tutorial for using PostgREST with KeyCloak(hosted on a managed service). +.. _templates: + +Templates +--------- + +* `compose-postgrest `_ - docker-compose setup with Nginx and HTML example +* `svelte-postgrest-template `_ - Svelte/SvelteKit, PostgREST, EveryLayout and social auth - `blog post `_ + .. _eco_example_apps: Example Apps @@ -22,7 +30,6 @@ Example Apps * `chronicle `_ - tracking a tree of personal memories * `cloudgov-demo-postgrest `_ - demo for a federally-compliant REST API on cloud.gov * `code-du-travail-backoffice `_ - data administration portal for the official French Labor Code and Agreements -* `compose-postgrest `_ - docker-compose setup with Nginx and HTML example * `delibrium-postgrest `_ - example school API and front-end in Vue.js * `elm-workshop `_ - building a simple database query UI * `ember-postgrest-dynamic-ui `_ - generating Ember forms to edit data @@ -45,7 +52,6 @@ Example Apps * `PostgrestSkeleton `_ - Docker Compose, PostgREST, Nginx and Auth0 * `PostGUI `_ - React Material UI admin panel * `prospector `_ - data warehouse and visualization platform -* `svelte-postgrest-template `_ - Svelte/SvelteKit, PostgREST, EveryLayout and social auth .. _dev_ops: diff --git a/index.rst b/index.rst index 65522fad5f..eb891698bb 100644 --- a/index.rst +++ b/index.rst @@ -209,7 +209,10 @@ PostgREST has a growing ecosystem of examples, libraries, and experiments. Here ecosystem.rst +* :ref:`community_tutorials` +* :ref:`templates` * :ref:`eco_example_apps` +* :ref:`dev_ops` * :ref:`eco_external_notification` * :ref:`eco_extensions` * :ref:`clientside_libraries` diff --git a/releases/upcoming.rst b/releases/upcoming.rst index e5dc3541b2..36fd101b18 100644 --- a/releases/upcoming.rst +++ b/releases/upcoming.rst @@ -38,6 +38,7 @@ Added * Documentation improvements + Added :ref:`nested_embedding` to the :ref:`resource_embedding` section. + + Added the :ref:`templates` section to the :doc:`Ecosystem `. Fixed ----- diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000000..163f583b56 --- /dev/null +++ b/requirements.txt @@ -0,0 +1 @@ +docutils==0.17.1 \ No newline at end of file From a0bdcb706c01540173355bce05362c63453132f8 Mon Sep 17 00:00:00 2001 From: Laurence Isla Date: Thu, 28 Oct 2021 18:06:52 -0500 Subject: [PATCH 444/711] Add curl examples alongside http snippets --- admin.rst | 33 +- api.rst | 1213 +++++++++++++++++++++++------- auth.rst | 27 +- conf.py | 7 +- default.nix | 5 +- extensions/sphinx-copybutton.nix | 33 + extensions/sphinx-tabs.nix | 29 + requirements.txt | 4 +- schema_cache.rst | 20 +- 9 files changed, 1087 insertions(+), 284 deletions(-) create mode 100644 extensions/sphinx-copybutton.nix create mode 100644 extensions/sphinx-tabs.nix diff --git a/admin.rst b/admin.rst index df318e5162..d1352228a6 100644 --- a/admin.rst +++ b/admin.rst @@ -43,15 +43,27 @@ Block Full-Table Operations Each table in the admin-selected schema gets exposed as a top level route. Client requests are executed by certain database roles depending on their authentication. All HTTP verbs are supported that correspond to actions permitted to the role. For instance if the active role can drop rows of the table then the DELETE verb is allowed for clients. Here's an API request to delete old rows from a hypothetical logs table: -.. code-block:: http +.. tabs:: + + .. code-tab:: http + + DELETE /logs?time=lt.1991-08-06 HTTP/1.1 - DELETE /logs?time=lt.1991-08-06 HTTP/1.1 + .. code-tab:: bash Curl + + curl "http://localhost:3000/logs?time=lt.1991-08-06" -X DELETE However it's very easy to delete the **entire table** by omitting the query parameter! -.. code-block:: http +.. tabs:: + + .. code-tab:: http - DELETE /logs HTTP/1.1 + DELETE /logs HTTP/1.1 + + .. code-tab:: bash Curl + + curl "http://localhost:3000/logs" -X DELETE This can happen accidentally such as by switching a request from a GET to a DELETE. To protect against accidental operations use the `pg-safeupdate `_ PostgreSQL extension. It raises an error if UPDATE or DELETE are executed without specifying conditions. To install it you can use the `PGXN `_ network: @@ -293,10 +305,17 @@ Alternate URL Structure As discussed in :ref:`singular_plural`, there are no special URL forms for singular resources in PostgREST, only operators for filtering. Thus there are no URLs like :code:`/people/1`. It would be specified instead as -.. code:: http +.. tabs:: + + .. code-tab:: http + + GET /people?id=eq.1 HTTP/1.1 + Accept: application/vnd.pgrst.object+json + + .. code-tab:: bash Curl - GET /people?id=eq.1 HTTP/1.1 - Accept: application/vnd.pgrst.object+json + curl "http://localhost:3000/people?id=eq.1" \ + -H "Accept: application/vnd.pgrst.object+json" This allows compound primary keys and makes the intent for singular response independent of a URL convention. diff --git a/api.rst b/api.rst index e85864d60e..5e3fbe1ecf 100644 --- a/api.rst +++ b/api.rst @@ -6,9 +6,15 @@ Tables and Views All views and tables in the exposed schema and accessible by the active database role for a request are available for querying. They are exposed in one-level deep routes. For instance the full contents of a table `people` is returned at -.. code-block:: http +.. tabs:: + + .. code-tab:: http + + GET /people HTTP/1.1 + + .. code-tab:: bash Curl - GET /people HTTP/1.1 + curl "http://localhost:3000/people" There are no deeply/nested/routes. Each route provides OPTIONS, GET, HEAD, POST, PATCH, and DELETE verbs depending entirely on database permissions. @@ -23,27 +29,51 @@ Horizontal Filtering (Rows) You can filter result rows by adding conditions on columns, each condition a query string parameter. For instance, to return people aged under 13 years old: -.. code-block:: http +.. tabs:: + + .. code-tab:: http + + GET /people?age=lt.13 HTTP/1.1 - GET /people?age=lt.13 HTTP/1.1 + .. code-tab:: bash Curl + + curl "http://localhost:3000/people?age=lt.13" Multiple parameters can be logically conjoined by: -.. code-block:: http +.. tabs:: + + .. code-tab:: http + + GET /people?age=gte.18&student=is.true HTTP/1.1 - GET /people?age=gte.18&student=is.true HTTP/1.1 + .. code-tab:: bash Curl + + curl "http://localhost:3000/people?age=gte.18&student=is.true" Multiple parameters can be logically disjoined by: -.. code-block:: http +.. tabs:: + + .. code-tab:: http - GET /people?or=(age.gte.14,age.lte.18) HTTP/1.1 + GET /people?or=(age.gte.14,age.lte.18) HTTP/1.1 + + .. code-tab:: bash Curl + + curl "http://localhost:3000/people?or=(age.gte.14,age.lte.18)" Complex logic can also be applied: -.. code-block:: http +.. tabs:: + + .. code-tab:: http - GET /people?and=(grade.gte.90,student.is.true,or(age.gte.14,age.is.null)) HTTP/1.1 + GET /people?and=(grade.gte.90,student.is.true,or(age.gte.14,age.is.null)) HTTP/1.1 + + .. code-tab:: bash Curl + + curl "http://localhost:3000/people?and=(grade.gte.90,student.is.true,or(age.gte.14,age.is.null))" .. _operators: @@ -99,9 +129,15 @@ For more complicated filters you will have to create a new view in the database, The view will provide a new endpoint: -.. code-block:: http +.. tabs:: - GET /fresh_stories HTTP/1.1 + .. code-tab:: http + + GET /fresh_stories HTTP/1.1 + + .. code-tab:: bash Curl + + curl "http://localhost:3000/fresh_stories" .. _fts: @@ -110,21 +146,45 @@ Full-Text Search The :code:`fts` filter mentioned above has a number of options to support flexible textual queries, namely the choice of plain vs phrase search and the language used for stemming. Suppose that :code:`tsearch` is a table with column :code:`my_tsv`, of type `tsvector `_. The following examples illustrate the possibilities. -.. code-block:: http +.. tabs:: - GET /tsearch?my_tsv=fts(french).amusant HTTP/1.1 + .. code-tab:: http -.. code-block:: http + GET /tsearch?my_tsv=fts(french).amusant HTTP/1.1 - GET /tsearch?my_tsv=plfts.The%20Fat%20Cats HTTP/1.1 + .. code-tab:: bash Curl -.. code-block:: http + curl "http://localhost:3000/tsearch?my_tsv=fts(french).amusant" - GET /tsearch?my_tsv=not.phfts(english).The%20Fat%20Cats HTTP/1.1 +.. tabs:: -.. code-block:: http + .. code-tab:: http + + GET /tsearch?my_tsv=plfts.The%20Fat%20Cats HTTP/1.1 + + .. code-tab:: bash Curl + + curl "http://localhost:3000/tsearch?my_tsv=plfts.The%20Fat%20Cats" + +.. tabs:: + + .. code-tab:: http + + GET /tsearch?my_tsv=not.phfts(english).The%20Fat%20Cats HTTP/1.1 + + .. code-tab:: bash Curl + + curl "http://localhost:3000/tsearch?my_tsv=not.phfts(english).The%20Fat%20Cats" + +.. tabs:: + + .. code-tab:: http + + GET /tsearch?my_tsv=not.wfts(french).amusant HTTP/1.1 + + .. code-tab:: bash Curl - GET /tsearch?my_tsv=not.wfts(french).amusant HTTP/1.1 + curl "http://localhost:3000/tsearch?my_tsv=not.wfts(french).amusant" Using phrase search mode requires PostgreSQL of version at least 9.6 and will raise an error in earlier versions of the database. @@ -137,9 +197,17 @@ Vertical Filtering (Columns) When certain columns are wide (such as those holding binary data), it is more efficient for the server to withhold them in a response. The client can specify which columns are required using the :sql:`select` parameter. -.. code-block:: http +.. tabs:: + + .. code-tab:: http + + GET /people?select=first_name,age HTTP/1.1 + + .. code-tab:: bash Curl - GET /people?select=first_name,age HTTP/1.1 + curl "http://localhost:3000/people?select=first_name,age" + +.. code-block:: json [ {"first_name": "John", "age": 30}, @@ -153,9 +221,17 @@ Renaming Columns You can rename the columns by prefixing them with an alias followed by the colon ``:`` operator. -.. code-block:: http +.. tabs:: - GET /people?select=fullName:full_name,birthDate:birth_date HTTP/1.1 + .. code-tab:: http + + GET /people?select=fullName:full_name,birthDate:birth_date HTTP/1.1 + + .. code-tab:: bash Curl + + curl "http://localhost:3000/people?select=fullName:full_name,birthDate:birth_date" + +.. code-block:: json [ {"fullName": "John Doe", "birthDate": "04/25/1988"}, @@ -169,9 +245,17 @@ Casting Columns Casting the columns is possible by suffixing them with the double colon ``::`` plus the desired type. -.. code-block:: http +.. tabs:: - GET /people?select=full_name,salary::text HTTP/1.1 + .. code-tab:: http + + GET /people?select=full_name,salary::text HTTP/1.1 + + .. code-tab:: bash Curl + + curl "http://localhost:3000/people?select=full_name,salary::text" + +.. code-block:: json [ {"full_name": "John Doe", "salary": "90000.00"}, @@ -185,18 +269,34 @@ JSON Columns You can specify a path for a ``json`` or ``jsonb`` column using the arrow operators(``->`` or ``->>``) as per the `PostgreSQL docs `_. -.. code-block:: http +.. tabs:: + + .. code-tab:: http - GET /people?select=id,json_data->>blood_type,json_data->phones HTTP/1.1 + GET /people?select=id,json_data->>blood_type,json_data->phones HTTP/1.1 + + .. code-tab:: bash Curl + + curl "http://localhost:3000/people?select=id,json_data->>blood_type,json_data->phones" + +.. code-block:: json [ { "id": 1, "blood_type": "A-", "phones": [{"country_code": "61", "number": "917-929-5745"}] }, { "id": 2, "blood_type": "O+", "phones": [{"country_code": "43", "number": "512-446-4988"}, {"country_code": "43", "number": "213-891-5979"}] } ] -.. code-block:: http +.. tabs:: + + .. code-tab:: http + + GET /people?select=id,json_data->phones->0->>number HTTP/1.1 - GET /people?select=id,json_data->phones->0->>number HTTP/1.1 + .. code-tab:: bash Curl + + curl "http://localhost:3000/people?select=id,json_data->phones->0->>number" + +.. code-block:: json [ { "id": 1, "number": "917-929-5745"}, @@ -205,9 +305,17 @@ You can specify a path for a ``json`` or ``jsonb`` column using the arrow operat This also works with filters: -.. code-block:: http +.. tabs:: + + .. code-tab:: http + + GET /people?select=id,json_data->blood_type&json_data->>blood_type=eq.A- HTTP/1.1 + + .. code-tab:: bash Curl - GET /people?select=id,json_data->blood_type&json_data->>blood_type=eq.A- HTTP/1.1 + curl "http://localhost:3000/people?select=id,json_data->blood_type&json_data->>blood_type=eq.A-" + +.. code-block:: json [ { "id": 1, "blood_type": "A-" }, @@ -217,9 +325,17 @@ This also works with filters: Note that ``->>`` is used to compare ``blood_type`` as ``text``. To compare with an integer value use ``->``: -.. code-block:: http +.. tabs:: + + .. code-tab:: http + + GET /people?select=id,json_data->age&json_data->age=gt.20 HTTP/1.1 + + .. code-tab:: bash Curl - GET /people?select=id,json_data->age&json_data->age=gt.20 HTTP/1.1 + curl "http://localhost:3000/people?select=id,json_data->age&json_data->age=gt.20" + +.. code-block:: json [ { "id": 11, "age": 25 }, @@ -251,15 +367,27 @@ Filters may be applied to computed columns(**a.k.a. virtual columns**) as well a A full-text search on the computed column: -.. code-block:: http +.. tabs:: + + .. code-tab:: http - GET /people?full_name=fts.Beckett HTTP/1.1 + GET /people?full_name=fts.Beckett HTTP/1.1 + + .. code-tab:: bash Curl + + curl "http://localhost:3000/people?full_name=fts.Beckett" As mentioned, computed columns do not appear in the output by default. However you can include them by listing them in the vertical filtering :code:`select` parameter: -.. code-block:: HTTP +.. tabs:: - GET /people?select=*,full_name HTTP/1.1 + .. code-tab:: http + + GET /people?select=*,full_name HTTP/1.1 + + .. code-tab:: bash Curl + + curl "http://localhost:3000/people?select=*,full_name" .. important:: @@ -278,9 +406,15 @@ To request this: Do this: -.. code-block:: http +.. tabs:: + + .. code-tab:: http + + GET /%D9%85%D9%88%D8%A7%D8%B1%D8%AF HTTP/1.1 - GET /%D9%85%D9%88%D8%A7%D8%B1%D8%AF HTTP/1.1 + .. code-tab:: bash Curl + + curl "http://localhost:3000/%D9%85%D9%88%D8%A7%D8%B1%D8%AF" .. _tabs-cols-w-spaces: @@ -289,9 +423,15 @@ Table / Columns with spaces You can request table/columns with spaces in them by percent encoding the spaces with ``%20``: -.. code-block:: http +.. tabs:: + + .. code-tab:: http + + GET /Order%20Items?Unit%20Price=lt.200 HTTP/1.1 - GET /Order%20Items?Unit%20Price=lt.200 HTTP/1.1 + .. code-tab:: bash Curl + + curl "http://localhost:3000/Order%20Items?Unit%20Price=lt.200" .. _reserved-chars: @@ -302,15 +442,27 @@ If filters include PostgREST reserved characters(``,``, ``.``, ``:``, ``()``) yo Here ``Hebdon,John`` and ``Williams,Mary`` are values. -.. code-block:: http +.. tabs:: + + .. code-tab:: http - GET /employees?name=in.(%22Hebdon,John%22,%22Williams,Mary%22) HTTP/1.1 + GET /employees?name=in.(%22Hebdon,John%22,%22Williams,Mary%22) HTTP/1.1 + + .. code-tab:: bash Curl + + curl "http://localhost:3000/employees?name=in.(%22Hebdon,John%22,%22Williams,Mary%22)" Here ``information.cpe`` is a column name. -.. code-block:: http +.. tabs:: + + .. code-tab:: http + + GET /vulnerabilities?%22information.cpe%22=like.*MS* HTTP/1.1 + + .. code-tab:: bash Curl - GET /vulnerabilities?%22information.cpe%22=like.*MS* HTTP/1.1 + curl "http://localhost:3000/vulnerabilities?%22information.cpe%22=like.*MS*" If the value filtered by the ``in`` operator has a double quote (``"``), you can escape it using a backslash ``"\""``. A backslash itself can be used with a double backslash ``"\\"``. @@ -330,25 +482,49 @@ Ordering The reserved word :sql:`order` reorders the response rows. It uses a comma-separated list of columns and directions: -.. code-block:: http +.. tabs:: + + .. code-tab:: http + + GET /people?order=age.desc,height.asc HTTP/1.1 + + .. code-tab:: bash Curl - GET /people?order=age.desc,height.asc HTTP/1.1 + curl "http://localhost:3000/people?order=age.desc,height.asc" If no direction is specified it defaults to ascending order: -.. code-block:: http +.. tabs:: + + .. code-tab:: http + + GET /people?order=age HTTP/1.1 - GET /people?order=age HTTP/1.1 + .. code-tab:: bash Curl + + curl "http://localhost:3000/people?order=age" If you care where nulls are sorted, add ``nullsfirst`` or ``nullslast``: -.. code-block:: http +.. tabs:: - GET /people?order=age.nullsfirst HTTP/1.1 + .. code-tab:: http -.. code-block:: http + GET /people?order=age.nullsfirst HTTP/1.1 + + .. code-tab:: bash Curl + + curl "http://localhost:3000/people?order=age.nullsfirst" + +.. tabs:: + + .. code-tab:: http - GET /people?order=age.desc.nullslast HTTP/1.1 + GET /people?order=age.desc.nullslast HTTP/1.1 + + .. code-tab:: bash Curl + + curl "http://localhost:3000/people?order=age.desc.nullslast" You can also use :ref:`computed_cols` to order the results, even though the computed columns will not appear in the output. @@ -369,11 +545,19 @@ Here items zero through fourteen are returned. This information is available in There are two ways to apply a limit and offset rows: through request headers or query parameters. When using headers you specify the range of rows desired. This request gets the first twenty people. -.. code-block:: http +.. tabs:: - GET /people HTTP/1.1 - Range-Unit: items - Range: 0-19 + .. code-tab:: http + + GET /people HTTP/1.1 + Range-Unit: items + Range: 0-19 + + .. code-tab:: bash Curl + + curl "http://localhost:3000/people" -i \ + -H "Range-Unit: items" \ + -H "Range: 0-19" Note that the server may respond with fewer if unable to meet your request: @@ -387,9 +571,15 @@ You may also request open-ended ranges for an offset with no limit, e.g. :code:` The other way to request a limit or offset is with query parameters. For example -.. code-block:: http +.. tabs:: + + .. code-tab:: http + + GET /people?limit=15&offset=30 HTTP/1.1 - GET /people?limit=15&offset=30 HTTP/1.1 + .. code-tab:: bash Curl + + curl "http://localhost:3000/people?limit=15&offset=30" This method is also useful for embedded resources, which we will cover in another section. The server always responds with range headers even if you use query parameters to limit the query. @@ -400,12 +590,21 @@ Exact Count In order to obtain the total size of the table or view (such as when rendering the last page link in a pagination control), specify ``Prefer: count=exact`` as a request header: -.. code-block:: http +.. tabs:: - HEAD /bigtable HTTP/1.1 - Range-Unit: items - Range: 0-24 - Prefer: count=exact + .. code-tab:: http + + HEAD /bigtable HTTP/1.1 + Range-Unit: items + Range: 0-24 + Prefer: count=exact + + .. code-tab:: bash Curl + + curl "http://localhost:3000/bigtable" -I \ + -H "Range-Unit: items" \ + -H "Range: 0-24" \ + -H "Prefer: count=exact" Note that the larger the table the slower this query runs in the database. The server will respond with the selected range and total @@ -423,10 +622,17 @@ Planned Count To avoid the shortcomings of :ref:`exact count `, PostgREST can leverage PostgreSQL statistics and get a fairly accurate and fast count. To do this, specify the ``Prefer: count=planned`` header. -.. code-block:: http +.. tabs:: + + .. code-tab:: http + + HEAD /bigtable?limit=25 HTTP/1.1 + Prefer: count=planned + + .. code-tab:: bash Curl - HEAD /bigtable?limit=25 HTTP/1.1 - Prefer: count=planned + curl "http://localhost:3000/bigtable?limit=25" -I \ + -H "Prefer: count=planned" .. code-block:: http @@ -453,10 +659,17 @@ defined by :ref:`max-rows`. Here's an example. Suppose we set ``max-rows=1000`` and ``smalltable`` has 321 rows, then we'll get the exact count: -.. code-block:: http +.. tabs:: + + .. code-tab:: http + + HEAD /smalltable?limit=25 HTTP/1.1 + Prefer: count=estimated - HEAD /smalltable?limit=25 HTTP/1.1 - Prefer: count=estimated + .. code-tab:: bash Curl + + curl "http://localhost:3000/smalltable?limit=25" -I \ + -H "Prefer: count=estimated" .. code-block:: http @@ -465,10 +678,17 @@ Here's an example. Suppose we set ``max-rows=1000`` and ``smalltable`` has 321 r If we make a similar request on ``bigtable``, which has 3573458 rows, we would get the planned count: -.. code-block:: http +.. tabs:: + + .. code-tab:: http - HEAD /bigtable?limit=25 HTTP/1.1 - Prefer: count=estimated + HEAD /bigtable?limit=25 HTTP/1.1 + Prefer: count=estimated + + .. code-tab:: bash Curl + + curl "http://localhost:3000/bigtable?limit=25" -I \ + -H "Prefer: count=estimated" .. code-block:: http @@ -484,10 +704,17 @@ PostgREST uses proper HTTP content negotiation (`RFC7231 `_. @@ -848,9 +1166,15 @@ Here's a sample function (notice the ``RETURNS SETOF films``). A request with ``directors`` embedded: -.. code-block:: http +.. tabs:: + + .. code-tab:: http + + GET /rpc/getallfilms?select=title,directors(id,last_name)&title=like.*Workers* HTTP/1.1 + + .. code-tab:: bash Curl - GET /rpc/getallfilms?select=title,directors(id,last_name)&title=like.*Workers* HTTP/1.1 + curl "http://localhost:3000/rpc/getallfilms?select=title,directors(id,last_name)&title=like.*Workers*" .. code-block:: json @@ -872,19 +1196,36 @@ You can embed related resources after doing :ref:`insert_update` or :ref:`delete Say you want to insert a **film** and then get some of its attributes plus embed its **director**. -.. code-block:: http +.. tabs:: - POST /films?select=title,year,director:directors(first_name,last_name) HTTP/1.1 - Prefer: return=representation + .. code-tab:: http - { - "id": 100, - "director_id": 40, - "title": "127 hours", - "year": 2010, - "rating": 7.6, - "language": "english" - } + POST /films?select=title,year,director:directors(first_name,last_name) HTTP/1.1 + Prefer: return=representation + + { + "id": 100, + "director_id": 40, + "title": "127 hours", + "year": 2010, + "rating": 7.6, + "language": "english" + } + + .. code-tab:: bash Curl + + curl "http://localhost:3000/films?select=title,year,director:directors(first_name,last_name)" \ + -H "Prefer: return=representation" \ + -d @- << EOF + { + "id": 100, + "director_id": 40, + "title": "127 hours", + "year": 2010, + "rating": 7.6, + "language": "english" + } + EOF Response: @@ -917,9 +1258,15 @@ For example, suppose you have the following ``orders`` and ``addresses`` tables: And you try to embed ``orders`` with ``addresses`` (this is the **target**): -.. code-block:: http +.. tabs:: - GET /orders?select=*,addresses(*) HTTP/1.1 + .. code-tab:: http + + GET /orders?select=*,addresses(*) HTTP/1.1 + + .. code-tab:: bash Curl + + curl "http://localhost:3000/orders?select=*,addresses(*)" -i Since the ``orders`` table has two foreign keys to the ``addresses`` table — an order has a billing address and a shipping address — the request is ambiguous and PostgREST will respond with an error: @@ -946,9 +1293,17 @@ Let's try first with the **foreign key constraint name**. To make it clearer we Now we can unambiguously embed the billing address by specifying the ``billing_address`` foreign key constraint as the **target**. -.. code-block:: http +.. tabs:: + + .. code-tab:: http + + GET /orders?select=name,billing_address(name) HTTP/1.1 + + .. code-tab:: bash Curl - GET /orders?select=name,billing_address(name) HTTP/1.1 + curl "http://localhost:3000/orders?select=name,billing_address(name)" + +.. code-block:: json [ { @@ -962,9 +1317,17 @@ Now we can unambiguously embed the billing address by specifying the ``billing_a Alternatively, you can specify the **column name** of the foreign key constraint as the **target**. This can be aliased to make the result more clear. -.. code-block:: http +.. tabs:: + + .. code-tab:: http + + GET /orders?select=name,billing_address:billing_address_id(name) HTTP/1.1 + + .. code-tab:: bash Curl - GET /orders?select=name,billing_address:billing_address_id(name) HTTP/1.1 + curl "http://localhost:3000/orders?select=name,billing_address:billing_address_id(name)" + +.. code-block:: json [ { @@ -984,18 +1347,34 @@ two views of ``addresses``: ``central_addresses`` and ``eastern_addresses``. Since PostgREST supports :ref:`embedding_views` by detecting **source foreign keys** in the views, embedding with the foreign key as the **target** will not be enough for an unambiguous embed: -.. code-block:: http +.. tabs:: + + .. code-tab:: http - GET /orders?select=*,billing_address(*) HTTP/1.1 + GET /orders?select=*,billing_address(*) HTTP/1.1 + + .. code-tab:: bash Curl + + curl "http://localhost:3000/orders?select=*,billing_address(*)" -i + +.. code-block:: http HTTP/1.1 300 Multiple Choices For solving this case, in addition to the **target**, we can add a **hint**. Here we specify ``central_addresses`` as the **target** and the ``billing_address`` foreign key as the **hint**: -.. code-block:: http +.. tabs:: + + .. code-tab:: http + + GET /orders?select=*,central_addresses!billing_address(*) HTTP/1.1 + + .. code-tab:: bash Curl + + curl 'http://localhost:3000/orders?select=*,central_addresses!billing_address(*)' -i - GET /orders?select=*,central_addresses!billing_address(*) HTTP/1.1 +.. code-block:: http HTTP/1.1 200 OK @@ -1018,11 +1397,19 @@ All tables and `auto-updatable views `_. @@ -1155,27 +1616,50 @@ On Conflict By specifying the ``on_conflict`` query parameter, you can make UPSERT work on a column(s) that has a UNIQUE constraint. -.. code-block:: http +.. tabs:: - POST /employees?on_conflict=name HTTP/1.1 - Prefer: resolution=merge-duplicates + .. code-tab:: http - [ - { "name": "Old employee 1", "salary": 40000 }, - { "name": "Old employee 2", "salary": 52000 }, - { "name": "New employee 3", "salary": 60000 } - ] + POST /employees?on_conflict=name HTTP/1.1 + Prefer: resolution=merge-duplicates + + [ + { "name": "Old employee 1", "salary": 40000 }, + { "name": "Old employee 2", "salary": 52000 }, + { "name": "New employee 3", "salary": 60000 } + ] + + .. code-tab:: bash Curl + + curl "http://localhost:3000/employees?on_conflict=name" \ + -X POST -H "Content-Type: application/json" + -H "Prefer: resolution=merge-duplicates" \ + -d @- << EOF + [ + { "name": "Old employee 1", "salary": 40000 }, + { "name": "Old employee 2", "salary": 52000 }, + { "name": "New employee 3", "salary": 60000 } + ] + EOF PUT ~~~ A single row UPSERT can be done by using :code:`PUT` and filtering the primary key columns with :code:`eq`: -.. code-block:: http +.. tabs:: + + .. code-tab:: http - PUT /employees?id=eq.4 HTTP/1.1 + PUT /employees?id=eq.4 HTTP/1.1 - { "id": 4, "name": "Sara B.", "salary": 60000 } + { "id": 4, "name": "Sara B.", "salary": 60000 } + + .. code-tab:: bash Curl + + curl "http://localhost/employees?id=eq.4" \ + -X PUT -H "Content-Type: application/json" \ + -d '{ "id": 4, "name": "Sara B.", "salary": 60000 }' All the columns must be specified in the request body, including the primary key columns. @@ -1190,9 +1674,15 @@ Deletions To delete rows in a table, use the DELETE verb plus :ref:`h_filter`. For instance deleting inactive users: -.. code-block:: http +.. tabs:: + + .. code-tab:: http + + DELETE /user?active=is.false HTTP/1.1 + + .. code-tab:: bash Curl - DELETE /user?active=is.false HTTP/1.1 + curl "http://localhost:3000/user?active=is.false" -X DELETE Deletions also support :code:`Prefer: return=representation` plus :ref:`v_filter`. @@ -1225,9 +1715,15 @@ Stored Procedures Every stored procedure in the API-exposed database schema is accessible under the :code:`/rpc` prefix. The API endpoint supports POST (and in some cases GET) to execute the function. -.. code-block:: http +.. tabs:: + + .. code-tab:: http + + POST /rpc/function_name HTTP/1.1 + + .. code-tab:: bash Curl - POST /rpc/function_name HTTP/1.1 + curl "http://localhost:3000/rpc/function_name" -X POST Such functions can perform any operations allowed by PostgreSQL (read data, modify data, and even DDL operations). @@ -1248,11 +1744,21 @@ For instance, assume we have created this function in the database. The client can call it by posting an object like -.. code-block:: http +.. tabs:: + + .. code-tab:: http - POST /rpc/add_them HTTP/1.1 + POST /rpc/add_them HTTP/1.1 - { "a": 1, "b": 2 } + { "a": 1, "b": 2 } + + .. code-tab:: bash Curl + + curl "http://localhost:3000/rpc/add_them" \ + -X POST -H "Content-Type: application/json" \ + -d '{ "a": 1, "b": 2 }' + +.. code-block:: json 3 @@ -1290,9 +1796,15 @@ Procedures that do not modify the database can be called with the HTTP GET verb Because ``add_them`` is ``IMMUTABLE``, we can alternately call the function with a GET request: -.. code-block:: http +.. tabs:: + + .. code-tab:: http - GET /rpc/add_them?a=1&b=2 HTTP/1.1 + GET /rpc/add_them?a=1&b=2 HTTP/1.1 + + .. code-tab:: bash Curl + + curl "http://localhost:3000/rpc/add_them?a=1&b=2" The function parameter names match the JSON object keys in the POST case, for the GET case they match the query parameters ``?a=1&b=2``. @@ -1307,12 +1819,23 @@ You can also call a function that takes a single parameter of type JSON by sendi SELECT (param->>'x')::int * (param->>'y')::int $$ LANGUAGE SQL; -.. code-block:: http +.. tabs:: + + .. code-tab:: http + + POST /rpc/mult_them HTTP/1.1 + Prefer: params=single-object + + { "x": 4, "y": 2 } + + .. code-tab:: bash Curl - POST /rpc/mult_them HTTP/1.1 - Prefer: params=single-object + curl "http://localhost:3000/rpc/mult_them" \ + -X POST -H "Content-Type: application/json" \ + -H "Prefer: params=single-object" \ + -d '{ "x": 4, "y": 2 }' - { "x": 4, "y": 2 } +.. code-block:: json 8 @@ -1329,12 +1852,20 @@ You can call a function that takes an array parameter: SELECT array_agg(n + 1) FROM unnest($1) AS n; $$ language sql; -.. code-block:: http +.. tabs:: + + .. code-tab:: http + + POST /rpc/plus_one HTTP/1.1 + Content-Type: application/json - POST /rpc/plus_one HTTP/1.1 - Content-Type: application/json + {"arr": [1,2,3,4]} - {"arr": [1,2,3,4]} + .. code-tab:: bash Curl + + curl "http://localhost:3000/rpc/plus_one" \ + -X POST -H "Content-Type: application/json" \ + -d '{"arr": [1,2,3,4]}' .. code-block:: json @@ -1343,19 +1874,33 @@ You can call a function that takes an array parameter: For calling the function with GET, you can pass the array as an `array literal `_, as in ``{1,2,3,4}``. Note that the curly brackets have to be urlencoded(``{`` is ``%7B`` and ``}`` is ``%7D``). -.. code-block:: http +.. tabs:: + + .. code-tab:: http - GET /rpc/plus_one?arr=%7B1,2,3,4%7D' HTTP/1.1 + GET /rpc/plus_one?arr=%7B1,2,3,4%7D' HTTP/1.1 + + .. code-tab:: bash Curl + + curl "http://localhost:3000/rpc/plus_one?arr=%7B1,2,3,4%7D'" .. note:: For versions prior to PostgreSQL 10, to pass a PostgreSQL native array on a POST payload, you need to quote it and use an array literal: - .. code-block:: http + .. tabs:: - POST /rpc/plus_one HTTP/1.1 + .. code-tab:: http + + POST /rpc/plus_one HTTP/1.1 - { "arr": "{1,2,3,4}" } + { "arr": "{1,2,3,4}" } + + .. code-tab:: bash Curl + + curl "http://localhost:3000/rpc/plus_one" \ + -X POST -H "Content-Type: application/json" \ + -d '{ "arr": "{1,2,3,4}" }' In these versions we recommend using function parameters of type JSON to accept arrays from the client. @@ -1372,12 +1917,20 @@ You can call a variadic function by passing a JSON array in a POST request: SELECT array_agg(n + 1) FROM unnest($1) AS n; $$ language sql; -.. code-block:: http +.. tabs:: - POST /rpc/plus_one HTTP/1.1 - Content-Type: application/json + .. code-tab:: http - {"v": [1,2,3,4]} + POST /rpc/plus_one HTTP/1.1 + Content-Type: application/json + + {"v": [1,2,3,4]} + + .. code-tab:: bash Curl + + curl "http://localhost:3000/rpc/plus_one" \ + -X POST -H "Content-Type: application/json" \ + -d '{"v": [1,2,3,4]}' .. code-block:: json @@ -1385,33 +1938,63 @@ You can call a variadic function by passing a JSON array in a POST request: In a GET request, you can repeat the same parameter name: -.. code-block:: http +.. tabs:: + + .. code-tab:: http - GET /rpc/plus_one?v=1&v=2&v=3&v=4 HTTP/1.1 + GET /rpc/plus_one?v=1&v=2&v=3&v=4 HTTP/1.1 + + .. code-tab:: bash Curl + + curl "http://localhost:3000/rpc/plus_one?v=1&v=2&v=3&v=4" Repeating also works in POST requests with ``Content-Type: application/x-www-form-urlencoded``: -.. code-block:: http +.. tabs:: + + .. code-tab:: http + + POST /rpc/plus_one HTTP/1.1 + Content-Type: application/x-www-form-urlencoded + + v=1&v=2&v=3&v=4 - POST /rpc/plus_one HTTP/1.1 - Content-Type: application/x-www-form-urlencoded + .. code-tab:: bash Curl - v=1&v=2&v=3&v=4 + curl "http://localhost:3000/rpc/plus_one" \ + -X POST -H "Content-Type: application/x-www-form-urlencoded" + -d 'v=1&v=2&v=3&v=4' Scalar functions ---------------- PostgREST will detect if the function is scalar or table-valued and will shape the response format accordingly: -.. code-block:: http +.. tabs:: + + .. code-tab:: http + + GET /rpc/add_them?a=1&b=2 HTTP/1.1 - GET /rpc/add_them?a=1&b=2 HTTP/1.1 + .. code-tab:: bash Curl + + curl "http://localhost:3000/rpc/add_them?a=1&b=2" + +.. code-block:: json 3 -.. code-block:: http +.. tabs:: + + .. code-tab:: http + + GET /rpc/best_films_2017 HTTP/1.1 + + .. code-tab:: bash Curl - GET /rpc/best_films_2017 HTTP/1.1 + curl "http://localhost:3000/rpc/best_films_2017" + +.. code-block:: json [ { "title": "Okja", "rating": 7.4}, @@ -1427,15 +2010,28 @@ Bulk Call It's possible to call a function in a bulk way, analogously to :ref:`bulk_insert`. To do this, you need to add the ``Prefer: params=multiple-objects`` header to your request. -.. code-block:: http +.. tabs:: - POST /rpc/add_them HTTP/1.1 - Content-Type: text/csv - Prefer: params=multiple-objects + .. code-tab:: http - a,b - 1,2 - 3,4 + POST /rpc/add_them HTTP/1.1 + Content-Type: text/csv + Prefer: params=multiple-objects + + a,b + 1,2 + 3,4 + + .. code-tab:: bash Curl + + curl "http://localhost:3000/rpc/add_them" \ + -X POST -H "Content-Type: text/csv" \ + -H "Prefer: params=multiple-objects" \ + --data-binary @- << EOF + a,b + 1,2 + 3,4 + EOF .. code-block:: json @@ -1454,13 +2050,25 @@ A function that returns a table type response can be shaped using the same filte CREATE FUNCTION best_films_2017() RETURNS SETOF films .. -.. code-block:: http +.. tabs:: - GET /rpc/best_films_2017?select=title,director:directors(*) HTTP/1.1 + .. code-tab:: http -.. code-block:: http + GET /rpc/best_films_2017?select=title,director:directors(*) HTTP/1.1 + + .. code-tab:: bash Curl - GET /rpc/best_films_2017?rating=gt.8&order=title.desc HTTP/1.1 + curl "http://localhost:3000/rpc/best_films_2017?select=title,director:directors(*)" + +.. tabs:: + + .. code-tab:: http + + GET /rpc/best_films_2017?rating=gt.8&order=title.desc HTTP/1.1 + + .. code-tab:: bash Curl + + curl "http://localhost:3000/rpc/best_films_2017?rating=gt.8&order=title.desc" Overloaded functions -------------------- @@ -1473,13 +2081,25 @@ You can call overloaded functions with different number of arguments. CREATE FUNCTION rental_duration(customer_id integer, from_date date) .. -.. code-block:: http +.. tabs:: - GET /rpc/rental_duration?customer_id=232 HTTP/1.1 + .. code-tab:: http -.. code-block:: http + GET /rpc/rental_duration?customer_id=232 HTTP/1.1 - GET /rpc/rental_duration?customer_id=232&from_date=2018-07-01 HTTP/1.1 + .. code-tab:: bash Curl + + curl "http://localhost:3000/rpc/rental_duration?customer_id=232" + +.. tabs:: + + .. code-tab:: http + + GET /rpc/rental_duration?customer_id=232&from_date=2018-07-01 HTTP/1.1 + + .. code-tab:: bash Curl + + curl "http://localhost:3000/rpc/rental_duration?customer_id=232&from_date=2018-07-01" .. important:: @@ -1493,10 +2113,17 @@ Binary Output If you want to return raw binary data from a :code:`bytea` column, you must specify :code:`application/octet-stream` as part of the :code:`Accept` header and select a single column :code:`?select=bin_data`. -.. code-block:: http +.. tabs:: - GET /items?select=bin_data&id=eq.1 HTTP/1.1 - Accept: application/octet-stream + .. code-tab:: http + + GET /items?select=bin_data&id=eq.1 HTTP/1.1 + Accept: application/octet-stream + + .. code-tab:: bash Curl + + curl "http://localhost:3000/items?select=bin_data&id=eq.1" \ + -H "Accept: application/octet-stream" You can also request binary output when calling `Stored Procedures`_ and since they can return a scalar value you are not forced to use :code:`select` for this case. @@ -1505,10 +2132,17 @@ for this case. CREATE FUNCTION closest_point(..) RETURNS bytea .. -.. code-block:: http +.. tabs:: + + .. code-tab:: http + + POST /rpc/closest_point HTTP/1.1 + Accept: application/octet-stream + + .. code-tab:: bash Curl - POST /rpc/closest_point HTTP/1.1 - Accept: application/octet-stream + curl "http://localhost:3000/rpc/closest_point" \ + -X POST -H "Accept: application/octet-stream" If the stored procedure returns non-scalar values, you need to do a :code:`select` in the same way as for GET binary output. @@ -1516,10 +2150,17 @@ If the stored procedure returns non-scalar values, you need to do a :code:`selec CREATE FUNCTION overlapping_regions(..) RETURNS SETOF TABLE(geom_twkb bytea, ..) .. -.. code-block:: http +.. tabs:: + + .. code-tab:: http + + POST /rpc/overlapping_regions?select=geom_twkb HTTP/1.1 + Accept: application/octet-stream - POST /rpc/overlapping_regions?select=geom_twkb HTTP/1.1 - Accept: application/octet-stream + .. code-tab:: bash Curl + + curl "http://localhost:3000/rpc/overlapping_regions?select=geom_twkb" \ + -X POST -H "Accept: application/octet-stream" .. note:: @@ -1532,10 +2173,19 @@ Plain Text Output You can get raw output from a ``text`` column by using ``Accept: text/plain``. -.. code-block:: http +.. tabs:: + + .. code-tab:: http - GET /workers?select=custom_psv_format HTTP/1.1 - Accept: text/plain + GET /workers?select=custom_psv_format HTTP/1.1 + Accept: text/plain + + .. code-tab:: bash Curl + + curl "http://localhost:3000/workers?select=custom_psv_format" \ + -H "Accept: text/plain" + +.. code-block:: text 09310817|JOHN|DOE|15/04/88| 42152780|FRED|BLOGGS|20/02/85| @@ -1596,9 +2246,15 @@ You can verify which HTTP methods are allowed on endpoints for tables and views For a table named ``people``, OPTIONS would show: -.. code-block:: http +.. tabs:: + + .. code-tab:: http + + OPTIONS /people HTTP/1.1 + + .. code-tab:: bash Curl - OPTIONS /people HTTP/1.1 + curl "http://localhost:3000/people" -X OPTIONS -i .. code-block:: http @@ -1648,19 +2304,35 @@ You can switch schemas at runtime with the ``Accept-Profile`` and ``Content-Prof For GET or HEAD, the schema to be used can be selected through the ``Accept-Profile`` header: -.. code-block:: http +.. tabs:: + + .. code-tab:: http + + GET /items HTTP/1.1 + Accept-Profile: tenant2 - GET /items HTTP/1.1 - Accept-Profile: tenant2 + .. code-tab:: bash Curl + + curl "http://localhost:3000/items" \ + -H "Accept-Profile: tenant2" For POST, PATCH, PUT and DELETE, you can use the ``Content-Profile`` header for selecting the schema: -.. code-block:: http +.. tabs:: + + .. code-tab:: http - POST /items HTTP/1.1 - Content-Profile: tenant2 + POST /items HTTP/1.1 + Content-Profile: tenant2 - {...} + {...} + + .. code-tab:: bash Curl + + curl "http://localhost:3000/items" \ + -X POST -H "Content-Type: application/json" \ + -H "Content-Profile: tenant2" \ + -d '{...}' You can also select the schema for :ref:`s_procs` and :ref:`open-api`. @@ -1763,17 +2435,24 @@ As an example, let's add some cache headers for all requests that come from an I Now when you make a GET request to a table or view, you'll get the cache headers. -.. code-block:: http +.. tabs:: + + .. code-tab:: http - GET /people HTTP/1.1 - User-Agent: Mozilla/4.01 (compatible; MSIE 6.0; Windows NT 5.1) + GET /people HTTP/1.1 + User-Agent: Mozilla/4.01 (compatible; MSIE 6.0; Windows NT 5.1) + + .. code-tab:: bash Curl + + curl "http://localhost:3000/people" -i \ + -H "User-Agent: Mozilla/4.01 (compatible; MSIE 6.0; Windows NT 5.1)" + +.. code-block:: http HTTP/1.1 200 OK Content-Type: application/json; charset=utf-8 Cache-Control: no-cache, no-store, must-revalidate - ... - .. _guc_resp_status: Setting Response Status Code @@ -1791,9 +2470,15 @@ You can set the ``response.status`` GUC to override the default status code Post end; $$ language plpgsql; -.. code-block:: http +.. tabs:: + + .. code-tab:: http + + GET /rpc/teapot HTTP/1.1 + + .. code-tab:: bash Curl - GET /rpc/teapot HTTP/1.1 + curl "http://localhost:3000/rpc/teapot" -i .. code-block:: http diff --git a/auth.rst b/auth.rst index 748a9fe291..8e3383cb0e 100644 --- a/auth.rst +++ b/auth.rst @@ -150,10 +150,17 @@ Client Auth To make an authenticated request the client must include an :code:`Authorization` HTTP header with the value :code:`Bearer `. For instance: -.. code:: http +.. tabs:: - GET /foo HTTP/1.1 - Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJyb2xlIjoiamRvZSIsImV4cCI6MTQ3NTUxNjI1MH0.GYDZV3yM0gqvuEtJmfpplLBXSGYnke_Pvnl0tbKAjB4 + .. code-tab:: http + + GET /foo HTTP/1.1 + Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJyb2xlIjoiamRvZSIsImV4cCI6MTQ3NTUxNjI1MH0.GYDZV3yM0gqvuEtJmfpplLBXSGYnke_Pvnl0tbKAjB4 + + .. code-tab:: bash Curl + + curl "http://localhost:3000/foo" \ + -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJyb2xlIjoiamRvZSIsImV4cCI6MTQ3NTUxNjI1MH0.GYDZV3yM0gqvuEtJmfpplLBXSGYnke_Pvnl0tbKAjB4" The ``Bearer`` header value can be used with or without capitalization(``bearer``). @@ -422,11 +429,19 @@ As described in `JWT from SQL`_, we'll create a JWT inside our login function. N An API request to call this function would look like: -.. code:: http +.. tabs:: + + .. code-tab:: http + + POST /rpc/login HTTP/1.1 + + { "email": "foo@bar.com", "pass": "foobar" } - POST /rpc/login HTTP/1.1 + .. code-tab:: bash Curl - { "email": "foo@bar.com", "pass": "foobar" } + curl "http://localhost:3000/rpc/login" \ + -X POST -H "Content-Type: application/json" \ + -d '{ "email": "foo@bar.com", "pass": "foobar" }' The response would look like the snippet below. Try decoding the token at `jwt.io `_. (It was encoded with a secret of :code:`reallyreallyreallyreallyverysafe` as specified in the SQL code above. You'll want to change this secret in your app!) diff --git a/conf.py b/conf.py index 6e017e016d..be38720aa5 100644 --- a/conf.py +++ b/conf.py @@ -28,7 +28,10 @@ # Add any Sphinx extension module names here, as strings. They can be # extensions coming with Sphinx (named 'sphinx.ext.*') or your custom # ones. -extensions = [] +extensions = [ + 'sphinx_tabs.tabs', + 'sphinx_copybutton' +] # Add any paths that contain templates here, relative to this directory. templates_path = ['_templates'] @@ -293,3 +296,5 @@ def setup(app): # taken from https://github.com/sphinx-doc/sphinx/blob/82dad44e5bd3776ecb6fd8ded656bc8151d0e63d/sphinx/util/requests.py#L42 user_agent = 'Mozilla/5.0 (X11; Linux x86_64; rv:25.0) Gecko/20100101 Firefox/25.0' +# sphinx-tabs configuration +sphinx_tabs_disable_tab_closing = True diff --git a/default.nix b/default.nix index 039ae825bf..40db658258 100644 --- a/default.nix +++ b/default.nix @@ -15,7 +15,10 @@ let }) { }; - python = pkgs.python3.withPackages (ps: [ ps.sphinx ps.sphinx_rtd_theme ps.livereload ]); + sphinxTabsPkg = ps: ps.callPackage ./extensions/sphinx-tabs.nix {}; + sphinxCopybuttonPkg = ps: ps.callPackage ./extensions/sphinx-copybutton.nix {}; + + python = pkgs.python3.withPackages (ps: [ ps.sphinx ps.sphinx_rtd_theme ps.livereload (sphinxTabsPkg ps) (sphinxCopybuttonPkg ps) ]); in { inherit pkgs; diff --git a/extensions/sphinx-copybutton.nix b/extensions/sphinx-copybutton.nix new file mode 100644 index 0000000000..8d408d300c --- /dev/null +++ b/extensions/sphinx-copybutton.nix @@ -0,0 +1,33 @@ +{ lib +, buildPythonPackage +, fetchFromGitHub +, sphinx +}: + +buildPythonPackage rec { + pname = "sphinx-copybutton"; + version = "0.4.0"; + + src = fetchFromGitHub { + owner = "executablebooks"; + repo = "sphinx-copybutton"; + rev = "v${version}"; + sha256 = "sha256-vrEIvQeP7AMXSme1PBp0ox5k8Q1rz+1cbHIO+o17Jqc="; + fetchSubmodules = true; + }; + + propagatedBuildInputs = [ + sphinx + ]; + + doCheck = false; # no tests + + pythonImportsCheck = [ "sphinx_copybutton" ]; + + meta = with lib; { + description = "A small sphinx extension to add a \"copy\" button to code blocks"; + homepage = "https://github.com/executablebooks/sphinx-copybutton"; + license = licenses.mit; + maintainers = with maintainers; [ Luflosi ]; + }; +} diff --git a/extensions/sphinx-tabs.nix b/extensions/sphinx-tabs.nix new file mode 100644 index 0000000000..f90b1c18d8 --- /dev/null +++ b/extensions/sphinx-tabs.nix @@ -0,0 +1,29 @@ +{ lib +, buildPythonPackage +, fetchPypi +, sphinx +}: + +buildPythonPackage rec { + pname = "sphinx-tabs"; + version = "3.2.0"; + + src = fetchPypi { + inherit pname version; + sha256 = "sha256:1970aahi6sa7c37cpz8nwgdb2xzf21rk6ykdd1m6w9wvxla7j4rk"; + }; + + propagatedBuildInputs = [ + sphinx + ]; + + doCheck = false; + + pythonImportsCheck = [ "sphinx_tabs" ]; + + meta = with lib; { + description = "Create tabbed content in Sphinx documentation when building HTML"; + homepage = "https://sphinx-tabs.readthedocs.io"; + license = licenses.mit; + }; +} \ No newline at end of file diff --git a/requirements.txt b/requirements.txt index 163f583b56..7c17253241 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1 +1,3 @@ -docutils==0.17.1 \ No newline at end of file +docutils==0.17.1 +sphinx-tabs +sphinx-copybutton \ No newline at end of file diff --git a/schema_cache.rst b/schema_cache.rst index f6fd237499..1e708876df 100644 --- a/schema_cache.rst +++ b/schema_cache.rst @@ -41,9 +41,15 @@ Stale Foreign Key Relationships Suppose you add a ``cities`` table to your database and define a foreign key that references an existing ``countries`` table. Then, you make a request to get the ``cities`` and their belonging ``countries``. -.. code-block:: http +.. tabs:: - GET /cities?select=name,country:countries(id,name) HTTP/1.1 + .. code-tab:: http + + GET /cities?select=name,country:countries(id,name) HTTP/1.1 + + .. code-tab:: bash Curl + + curl "http://localhost:3000/cities?select=name,country:countries(id,name)" The result will be an error: @@ -70,9 +76,15 @@ The same issue will occur on newly created functions on a running PostgREST. SELECT num + 1; $$ LANGUAGE SQL IMMUTABLE; -.. code-block:: http +.. tabs:: + + .. code-tab:: http + + GET /rpc/plus_one?num=1 HTTP/1.1 + + .. code-tab:: bash Curl - GET /rpc/plus_one?num=1 HTTP/1.1 + curl "http://localhost:3000/rpc/plus_one?num=1" .. code-block:: json From 7cc3d319bc3971c8d897b817bc9f072630712a39 Mon Sep 17 00:00:00 2001 From: Laurence Isla Date: Fri, 29 Oct 2021 15:11:39 -0500 Subject: [PATCH 445/711] Fix broken styles --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 7c17253241..5a5a51b65a 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,3 +1,3 @@ -docutils==0.17.1 +docutils<0.18 sphinx-tabs sphinx-copybutton \ No newline at end of file From 8b74e14c4f9e9ca3762795a19411bdb68d0d6bcb Mon Sep 17 00:00:00 2001 From: Laurence Isla Date: Mon, 8 Nov 2021 12:27:22 -0500 Subject: [PATCH 446/711] Use tabs to show different installation methods --- install.rst | 50 ++++++++++++++++++++++++++++++++++---------------- postgrest.dict | 1 - 2 files changed, 34 insertions(+), 17 deletions(-) diff --git a/install.rst b/install.rst index 2c03932e18..2d789ad083 100644 --- a/install.rst +++ b/install.rst @@ -6,36 +6,54 @@ Installation The release page has `pre-compiled binaries for Mac OS X, Windows, Linux and FreeBSD `_ . The Linux binary is a static executable that can be run on any Linux distribution. -If you use **macOS Homebrew**, then you can install PostgREST from the `official repo `_. +You can also use your OS package manager. -.. code:: bash +.. tabs:: - brew install postgrest + .. group-tab:: Mac OSX -If you use **FreeBSD**, then you can install PostgREST from the `official ports `_. + You can install PostgREST from the `Homebrew official repo `_. -.. code:: bash + .. code:: bash - pkg install hs-postgrest + brew install postgrest -If you use **Arch Linux**, then you can install PostgREST from the `community repo `_. + .. group-tab:: FreeBSD -.. code:: bash + You can install PostgREST from the `official ports `_. - pacman -S postgrest + .. code:: bash -If you use **Nix**, then you can install PostgREST from nixpkgs. + pkg install hs-postgrest -.. code:: bash + .. group-tab:: Linux - nix-env -i haskellPackages.postgrest + .. tabs:: -If you use Windows, you can install PostgREST using `Chocolatey `_ or `Scoop `_. + .. tab:: Arch Linux -.. code:: bash + You can install PostgREST from the `community repo `_. + + .. code:: bash + + pacman -S postgrest + + .. tab:: Nix + + You can install PostgREST from nixpkgs. + + .. code:: bash + + nix-env -i haskellPackages.postgrest + + .. group-tab:: Windows + + You can install PostgREST using `Chocolatey `_ or `Scoop `_. + + .. code:: bash - choco install postgrest - scoop install postgrest + choco install postgrest + scoop install postgrest Running PostgREST ================= diff --git a/postgrest.dict b/postgrest.dict index 5a26892395..684faa9340 100644 --- a/postgrest.dict +++ b/postgrest.dict @@ -75,7 +75,6 @@ logins lon lt lte -macOS middleware misprediction Mithril From 4e4458eb95eb8ae57031b305b5fec2893eb2f2f8 Mon Sep 17 00:00:00 2001 From: Laurence Isla Date: Wed, 10 Nov 2021 19:35:44 -0500 Subject: [PATCH 447/711] Allow POST rpc with a single unnamed parameter --- api.rst | 42 ++++++++++++++++++++++++++++++++++++++++++ releases/upcoming.rst | 3 +++ 2 files changed, 45 insertions(+) diff --git a/api.rst b/api.rst index 5e3fbe1ecf..6917c937ff 100644 --- a/api.rst +++ b/api.rst @@ -1808,6 +1808,8 @@ Because ``add_them`` is ``IMMUTABLE``, we can alternately call the function with The function parameter names match the JSON object keys in the POST case, for the GET case they match the query parameters ``?a=1&b=2``. +.. _s_proc_single_json: + Calling functions with a single JSON parameter ---------------------------------------------- @@ -1839,6 +1841,46 @@ You can also call a function that takes a single parameter of type JSON by sendi 8 +.. _s_proc_single_unnamed: + +Calling functions with a single unnamed parameter +------------------------------------------------- + +You can make a POST request to a function with a single unnamed parameter to send raw ``json/jsonb``, ``bytea`` or ``text`` data. + +To send raw JSON, you can avoid using the ``Prefer: params=single-object`` header if the function has a single unnamed ``json`` or ``jsonb`` parameter and the header ``Content-Type: application/json`` is included in the request. + +.. code-block:: plpgsql + + CREATE FUNCTION mult_them(json) RETURNS int AS $$ + SELECT ($1->>'x')::int * ($1->>'y')::int + $$ LANGUAGE SQL; + +.. tabs:: + + .. code-tab:: http + + POST /rpc/mult_them HTTP/1.1 + Content-Type: application/json + + { "x": 4, "y": 2 } + + .. code-tab:: bash Curl + + curl "http://localhost:3000/rpc/mult_them" \ + -X POST -H "Content-Type: application/json" \ + -d '{ "x": 4, "y": 2 }' + +.. code-block:: json + + 8 + +.. note:: + + If an overloaded function has a single ``json`` or ``jsonb`` unnamed parameter, PostgREST will call this function as a fallback provided that no other overloaded function is found with the parameters sent in the POST request. + +To send raw binary, the parameter type must be ``bytea`` and the header ``Content-Type: application/octet-stream`` must be included in the request. Similarly, to send raw text, the parameter type must be ``text`` and the header ``Content-Type: text/plain`` must be included in the request. + .. _s_procs_array: Calling functions with array parameters diff --git a/releases/upcoming.rst b/releases/upcoming.rst index 36fd101b18..48446f113d 100644 --- a/releases/upcoming.rst +++ b/releases/upcoming.rst @@ -35,6 +35,9 @@ Added * Add ``Retry-After`` header when recovering the connection. See :ref:`automatic_recovery`. |br| -- `@gautam1168 `_ +* Allow calling a function with a :ref:`single unnamed parameter ` to POST raw ``json/jsonb``, ``bytea`` or ``text``. + |br| -- `@steve-chavez `_ + * Documentation improvements + Added :ref:`nested_embedding` to the :ref:`resource_embedding` section. From 4720cfc1d36081e3bf3de88f441b6972bfad38f4 Mon Sep 17 00:00:00 2001 From: Laurence Isla Date: Thu, 11 Nov 2021 17:02:17 -0500 Subject: [PATCH 448/711] Add example to rpc unnamed single bytea parameter --- api.rst | 35 +++++++++++++++++++++++++++++++++-- 1 file changed, 33 insertions(+), 2 deletions(-) diff --git a/api.rst b/api.rst index 6917c937ff..661fba0913 100644 --- a/api.rst +++ b/api.rst @@ -1848,7 +1848,7 @@ Calling functions with a single unnamed parameter You can make a POST request to a function with a single unnamed parameter to send raw ``json/jsonb``, ``bytea`` or ``text`` data. -To send raw JSON, you can avoid using the ``Prefer: params=single-object`` header if the function has a single unnamed ``json`` or ``jsonb`` parameter and the header ``Content-Type: application/json`` is included in the request. +To send raw JSON, the function must have a single unnamed ``json`` or ``jsonb`` parameter and the header ``Content-Type: application/json`` must be included in the request. .. code-block:: plpgsql @@ -1879,7 +1879,38 @@ To send raw JSON, you can avoid using the ``Prefer: params=single-object`` heade If an overloaded function has a single ``json`` or ``jsonb`` unnamed parameter, PostgREST will call this function as a fallback provided that no other overloaded function is found with the parameters sent in the POST request. -To send raw binary, the parameter type must be ``bytea`` and the header ``Content-Type: application/octet-stream`` must be included in the request. Similarly, to send raw text, the parameter type must be ``text`` and the header ``Content-Type: text/plain`` must be included in the request. +To send raw binary, the parameter type must be ``bytea`` and the header ``Content-Type: application/octet-stream`` must be included in the request. + +.. code-block:: plpgsql + + CREATE TABLE files(blob bytea); + + CREATE FUNCTION upload_binary(bytea) RETURNS void AS $$ + INSERT INTO files(blob) VALUES ($1); + $$ LANGUAGE SQL; + +.. tabs:: + + .. code-tab:: http + + POST /rpc/upload_binary HTTP/1.1 + Content-Type: application/octet-stream + + file_name.ext + + .. code-tab:: bash Curl + + curl "http://localhost:3000/rpc/upload_binary" \ + -X POST -H "Content-Type: application/octet-stream" \ + --data-binary "@file_name.ext" + +.. code-block:: http + + HTTP/1.1 200 OK + + [ ... ] + +To send raw text, the parameter type must be ``text`` and the header ``Content-Type: text/plain`` must be included in the request. .. _s_procs_array: From 06c0180e4f297a071c7ff3d166defa3e9bd74a44 Mon Sep 17 00:00:00 2001 From: Laurence Isla Date: Mon, 15 Nov 2021 17:36:29 -0500 Subject: [PATCH 449/711] Add the Logical Operators section to Horizontal Filtering --- api.rst | 65 ++++++++++++++++++++++++------------------- postgrest.dict | 1 - releases/upcoming.rst | 1 + 3 files changed, 37 insertions(+), 30 deletions(-) diff --git a/api.rst b/api.rst index 661fba0913..077a6665d1 100644 --- a/api.rst +++ b/api.rst @@ -27,7 +27,7 @@ There are no deeply/nested/routes. Each route provides OPTIONS, GET, HEAD, POST, Horizontal Filtering (Rows) --------------------------- -You can filter result rows by adding conditions on columns, each condition a query string parameter. For instance, to return people aged under 13 years old: +You can filter result rows by adding conditions on columns. For instance, to return people aged under 13 years old: .. tabs:: @@ -39,7 +39,7 @@ You can filter result rows by adding conditions on columns, each condition a que curl "http://localhost:3000/people?age=lt.13" -Multiple parameters can be logically conjoined by: +You can evaluate multiple conditions on columns by adding more query string parameters. For instance, to return people who are 18 or older **and** are students: .. tabs:: @@ -51,30 +51,6 @@ Multiple parameters can be logically conjoined by: curl "http://localhost:3000/people?age=gte.18&student=is.true" -Multiple parameters can be logically disjoined by: - -.. tabs:: - - .. code-tab:: http - - GET /people?or=(age.gte.14,age.lte.18) HTTP/1.1 - - .. code-tab:: bash Curl - - curl "http://localhost:3000/people?or=(age.gte.14,age.lte.18)" - -Complex logic can also be applied: - -.. tabs:: - - .. code-tab:: http - - GET /people?and=(grade.gte.90,student.is.true,or(age.gte.14,age.is.null)) HTTP/1.1 - - .. code-tab:: bash Curl - - curl "http://localhost:3000/people?and=(grade.gte.90,student.is.true,or(age.gte.14,age.is.null))" - .. _operators: Operators @@ -111,11 +87,11 @@ sr :code:`>>` strictly right of nxr :code:`&<` does not extend to the right of, e.g. :code:`?range=nxr.(1,10)` nxl :code:`&>` does not extend to the left of adj :code:`-|-` is adjacent to, e.g. :code:`?range=adj.(1,10)` -not :code:`NOT` negates another operator, see below +not :code:`NOT` negates another operator, see :ref:`logical_operators` +or :code:`OR` logical :code:`OR`, see :ref:`logical_operators` +and :code:`AND` logical :code:`AND`, see :ref:`logical_operators` ============ ======================== ================================================================================== -To negate any operator, prefix it with :code:`not` like :code:`?a=not.eq.2` or :code:`?not.and=(a.gte.0,a.lte.100)` . - For more complicated filters you will have to create a new view in the database, or use a stored procedure. For instance, here's a view to show "today's stories" including possibly older pinned stories: .. code-block:: postgresql @@ -139,6 +115,37 @@ The view will provide a new endpoint: curl "http://localhost:3000/fresh_stories" +.. _logical_operators: + +Logical operators +~~~~~~~~~~~~~~~~~ + +Multiple conditions on columns are evaluated using ``AND`` by default, but you can combine them using ``OR`` with the ``or`` operator. For example, to return people under 18 **or** over 21: + +.. tabs:: + + .. code-tab:: http + + GET /people?or=(age.lt.18,age.gt.21) HTTP/1.1 + + .. code-tab:: bash Curl + + curl "http://localhost:3000/people?or=(age.lt.18,age.gt.21)" + +To **negate** any operator, you can prefix it with :code:`not` like :code:`?a=not.eq.2` or :code:`?not.and=(a.gte.0,a.lte.100)` . + +You can also apply complex logic to the conditions: + +.. tabs:: + + .. code-tab:: http + + GET /people?grade=gte.90&student=is.true&or=(age.eq.14,not.and(age.gte.11,age.lte.17)) HTTP/1.1 + + .. code-tab:: bash Curl + + curl "http://localhost:3000/people?grade=gte.90&student=is.true&or=(age.eq.14,not.and(age.gte.11,age.lte.17))" + .. _fts: Full-Text Search diff --git a/postgrest.dict b/postgrest.dict index 684faa9340..fba460fd99 100644 --- a/postgrest.dict +++ b/postgrest.dict @@ -27,7 +27,6 @@ Daemonizing DDL DevOps DiBiase -disjoined dockerize DoS eq diff --git a/releases/upcoming.rst b/releases/upcoming.rst index 48446f113d..2a958c7e29 100644 --- a/releases/upcoming.rst +++ b/releases/upcoming.rst @@ -42,6 +42,7 @@ Added + Added :ref:`nested_embedding` to the :ref:`resource_embedding` section. + Added the :ref:`templates` section to the :doc:`Ecosystem `. + + Added the :ref:`logical_operators` section Fixed ----- From d12974339acec70abd0000100b5db23da856f660 Mon Sep 17 00:00:00 2001 From: Laurence Isla Date: Thu, 18 Nov 2021 17:34:51 -0500 Subject: [PATCH 450/711] Allow unknown for is operator --- api.rst | 2 +- releases/upcoming.rst | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/api.rst b/api.rst index 077a6665d1..1feb1a60c0 100644 --- a/api.rst +++ b/api.rst @@ -72,7 +72,7 @@ ilike :code:`ILIKE` ILIKE operator (use * in place of %) in :code:`IN` one of a list of values, e.g. :code:`?a=in.(1,2,3)` – also supports commas in quoted strings like :code:`?a=in.("hi,there","yes,you")` -is :code:`IS` checking for exact equality (null,true,false) +is :code:`IS` checking for exact equality (null,true,false,unknown) fts :code:`@@` :ref:`fts` using to_tsquery plfts :code:`@@` :ref:`fts` using plainto_tsquery phfts :code:`@@` :ref:`fts` using phraseto_tsquery diff --git a/releases/upcoming.rst b/releases/upcoming.rst index 2a958c7e29..9cbba9fe33 100644 --- a/releases/upcoming.rst +++ b/releases/upcoming.rst @@ -38,6 +38,9 @@ Added * Allow calling a function with a :ref:`single unnamed parameter ` to POST raw ``json/jsonb``, ``bytea`` or ``text``. |br| -- `@steve-chavez `_ +* Allow specifying ``unknown`` for the ``is`` :ref:`operator `. + |br| -- `@steve-chavez `_ + * Documentation improvements + Added :ref:`nested_embedding` to the :ref:`resource_embedding` section. From c946f02607a080c88779d2c6fb3a59eec79b9255 Mon Sep 17 00:00:00 2001 From: Laurence Isla Date: Mon, 22 Nov 2021 14:43:24 -0500 Subject: [PATCH 451/711] Remove partitions from the schema cache --- api.rst | 27 ++++++++------------------- releases/upcoming.rst | 6 ++++++ 2 files changed, 14 insertions(+), 19 deletions(-) diff --git a/api.rst b/api.rst index 1feb1a60c0..a58d4356a7 100644 --- a/api.rst +++ b/api.rst @@ -720,7 +720,7 @@ Use the Accept request header to specify the acceptable format (or formats) for .. code-tab:: bash Curl - curl "http://localhost:3000/people" + curl "http://localhost:3000/people" \ -H "Accept: application/json" The current possibilities are: @@ -757,7 +757,7 @@ This can be inconvenient for client code. To return the first result as an objec .. code-tab:: bash Curl - curl "http://localhost:3000/items?id=eq.1" + curl "http://localhost:3000/items?id=eq.1" \ -H "Accept: application/vnd.pgrst.object+json" This returns @@ -1084,20 +1084,9 @@ Since it contains the ``films_id`` foreign key, it is possible to embed ``box_of curl "http://localhost:3000/box_office?select=bo_date,gross_revenue,films(title)&gross_revenue=gte.1000000" -Embedding is also possible between ``box_office`` partitions and the ``films`` table: - -.. tabs:: - - .. code-tab:: http - - GET /films?select=title,box_office_2021_02(bo_date,gross_revenue)&rating=gt.8 HTTP/1.1 - - .. code-tab:: bash Curl - - curl "http://localhost:3000/films?select=title,box_office_2021_02(bo_date,gross_revenue)&rating=gt.8" - .. note:: - Partitioned tables can reference other tables since PostgreSQL 11 but can only be referenced from any other table since PostgreSQL 12. + * Partitioned tables can reference other tables since PostgreSQL 11 but can only be referenced from any other table since PostgreSQL 12. + * Embedding on partitions is not allowed because it leads to ambiguity errors (see :ref:`embed_disamb`) between them and their parent partitioned table. :ref:`custom_queries` can be used if this is needed. .. _embedding_views: @@ -1600,8 +1589,8 @@ You can make an UPSERT with :code:`POST` and the :code:`Prefer: resolution=merge .. code-tab:: bash Curl - curl "http://localhost:3000OST /employees" \ - -X POST -H "Content-Type: application/json" + curl "http://localhost:3000/employees" \ + -X POST -H "Content-Type: application/json" \ -H "Prefer: resolution=merge-duplicates" \ -d @- << EOF [ @@ -1639,7 +1628,7 @@ By specifying the ``on_conflict`` query parameter, you can make UPSERT work on a .. code-tab:: bash Curl curl "http://localhost:3000/employees?on_conflict=name" \ - -X POST -H "Content-Type: application/json" + -X POST -H "Content-Type: application/json" \ -H "Prefer: resolution=merge-duplicates" \ -d @- << EOF [ @@ -2042,7 +2031,7 @@ Repeating also works in POST requests with ``Content-Type: application/x-www-for .. code-tab:: bash Curl curl "http://localhost:3000/rpc/plus_one" \ - -X POST -H "Content-Type: application/x-www-form-urlencoded" + -X POST -H "Content-Type: application/x-www-form-urlencoded" \ -d 'v=1&v=2&v=3&v=4' Scalar functions diff --git a/releases/upcoming.rst b/releases/upcoming.rst index 9cbba9fe33..b62c2d63fa 100644 --- a/releases/upcoming.rst +++ b/releases/upcoming.rst @@ -52,3 +52,9 @@ Fixed * Fix using single double quotes (``"``) and backslashes (``/``) as values on the "in" operator |br| -- `@steve-chavez `_ + +Changed +------- + +* Partitions (created using ``PARTITION OF``) are no longer included in the :ref:`schema_cache`. + |br| -- `@laurenceisla `_ From 35d9b98bff9f177179c7d8911f1c6a80557192f0 Mon Sep 17 00:00:00 2001 From: Laurence Isla Date: Tue, 23 Nov 2021 22:12:29 -0500 Subject: [PATCH 452/711] Remove the db-embed-default-join config --- api.rst | 61 +++++++++++++++++++++++++++++++------------ configuration.rst | 16 ------------ releases/upcoming.rst | 8 ++---- 3 files changed, 46 insertions(+), 39 deletions(-) diff --git a/api.rst b/api.rst index a58d4356a7..3529b3e194 100644 --- a/api.rst +++ b/api.rst @@ -475,9 +475,15 @@ If the value filtered by the ``in`` operator has a double quote (``"``), you can Here ``Quote:"`` and ``Backslash:\`` are percent-encoded values. Note that ``%5C`` is the percent-encoded backslash. -.. code-block:: http +.. tabs:: + + .. code-tab:: http + + GET /marks?name=in.(%22Quote:%5C%22%22,%22Backslash:%5C%5C%22) HTTP/1.1 - GET /marks?name=in.(%22Quote:%5C%22%22,%22Backslash:%5C%5C%22) HTTP/1.1 + .. code-tab:: bash Curl + + curl "http://localhost:3000/marks?name=in.(%22Quote:%5C%22%22,%22Backslash:%5C%5C%22)" .. note:: @@ -992,9 +998,15 @@ Top Level Filtering By default, embedded filters don't change the top level resource rows at all: -.. code-block:: http +.. tabs:: + + .. code-tab:: http + + GET /films?select=title,actors(first_name,last_name)&actors.first_name=eq.Jehanne HTTP/1.1 - GET /films?select=title,actors(first_name,last_name)&actors.first_name=eq.Jehanne HTTP/1.1 + .. code-tab:: bash Curl + + curl "http://localhost:3000/films?select=title,actors(first_name,last_name)&actors.first_name=eq.Jehanne .. code-block:: json @@ -1020,9 +1032,15 @@ By default, embedded filters don't change the top level resource rows at all: In order to filter the top level rows you need to add ``!inner`` to the embedded resource. For instance, to get **only** the films that have an actor named ``Jehanne``: -.. code-block:: http +.. tabs:: + + .. code-tab:: http + + GET /films?select=title,actors!inner(first_name,last_name)&actors.first_name=eq.Jehanne HTTP/1.1 + + .. code-tab:: bash Curl - GET /films?select=title,actors!inner(first_name,last_name)&actors.first_name=eq.Jehanne HTTP/1.1 + curl "http://localhost:3000/films?select=title,actors!inner(first_name,last_name)&actors.first_name=eq.Jehanne" .. code-block:: json @@ -1038,12 +1056,6 @@ In order to filter the top level rows you need to add ``!inner`` to the embedded } ] -If you prefer to work with top level filtering as a default embedding behavior for PostgREST, set the :ref:`db-embed-default-join` configuration parameter to ``"inner"``. This way, you don't need to specify ``!inner`` on every request and, if you need the previous behavior, add ``!left`` to the embedding resource. For instance, this will not filter the films in any way: - -.. code-block:: http - - GET /films?select=title,actors!left(first_name,last_name)&actors.first_name=eq.Jehanne HTTP/1.1 - .. _embedding_partitioned_tables: Embedding Partitioned Tables @@ -1380,9 +1392,15 @@ Similarly to the **target**, the **hint** can be a **table name**, **foreign key Hints also work alongside ``!inner`` if a top level filtering is needed. From the above example: -.. code-block:: http +.. tabs:: + + .. code-tab:: http + + GET /orders?select=*,central_addresses!billing_address!inner(*)¢ral_addresses.code=AB1000 HTTP/1.1 - GET /orders?select=*,central_addresses!billing_address!inner(*)¢ral_addresses.code="AB1000" HTTP/1.1 + .. code-tab:: bash Curl + + curl "http://localhost:3000/orders?select=*,central_addresses!billing_address!inner(*)¢ral_addresses.code=AB1000" .. _insert_update: @@ -1682,10 +1700,19 @@ To delete rows in a table, use the DELETE verb plus :ref:`h_filter`. For instanc Deletions also support :code:`Prefer: return=representation` plus :ref:`v_filter`. -.. code-block:: HTTP +.. tabs:: + + .. code-tab:: http + + DELETE /user?id=eq.1 HTTP/1.1 + Prefer: return=representation + + .. code-tab:: bash Curl - DELETE /user?id=eq.1 HTTP/1.1 - Prefer: return=representation + curl "http://localhost:3000/user?id=eq.1" -X DELETE \ + -H "Prefer: return=representation" + +.. code-block:: json {"id": 1, "email": "johndoe@email.com"} diff --git a/configuration.rst b/configuration.rst index c3a38301d1..2826e2d5d9 100644 --- a/configuration.rst +++ b/configuration.rst @@ -50,7 +50,6 @@ db-channel-enabled Boolean True db-prepared-statements Boolean True db-tx-end String commit db-config Boolean True -db-embed-default-join String left db-use-legacy-gucs Boolean True server-host String !4 server-port Int 3000 @@ -201,21 +200,6 @@ db-config Enables the in-database configuration. -.. _db-embed-default-join: - -db-embed-default-join ---------------------- - - Determines the default embedding type between tables or views when none is specified in the request. For more info, see :ref:`embedding_top_level_filter`. - - .. code:: bash - - # Embeds using LEFT JOIN - db-embed-default-join = "left" - - # Embeds using INNER JOIN - db-embed-default-join = "inner" - .. _db-use-legacy-gucs: db-use-legacy-gucs diff --git a/releases/upcoming.rst b/releases/upcoming.rst index b62c2d63fa..3f79dba41c 100644 --- a/releases/upcoming.rst +++ b/releases/upcoming.rst @@ -14,12 +14,8 @@ Added * Allow :ref:`embedding `, UPSERT, INSERT with Location response, OPTIONS request and OpenAPI support for partitioned tables. |br| -- `@laurenceisla `_ -* Allow filtering top-level resource based on embedded resources filters - - + This is enabled by adding ``!inner`` to the embedded resource. See :ref:`embedding_top_level_filter`. - + This behavior can be enabled by default by setting the :ref:`db-embed-default-join` to ``"inner"``. - - -- `@steve-chavez `_ +* Allow filtering top-level resource based on embedded resources filters. This is enabled by adding ``!inner`` to the embedded resource. See :ref:`embedding_top_level_filter`. + |br| -- `@steve-chavez `_ * Make GUC names for headers, cookies and jwt claims compatible with PostgreSQL v14. From 9eac683e5146b9dbc2c694cbc5444356ec238369 Mon Sep 17 00:00:00 2001 From: Wolfgang Walther Date: Wed, 24 Nov 2021 16:04:55 +0100 Subject: [PATCH 453/711] Drop support for PG 9.5. Related: https://github.com/PostgREST/postgrest/pull/2038 --- api.rst | 6 ------ auth.rst | 2 +- install.rst | 2 +- 3 files changed, 2 insertions(+), 8 deletions(-) diff --git a/api.rst b/api.rst index 3529b3e194..31fcbb906d 100644 --- a/api.rst +++ b/api.rst @@ -193,8 +193,6 @@ The :code:`fts` filter mentioned above has a number of options to support flexib curl "http://localhost:3000/tsearch?my_tsv=not.wfts(french).amusant" -Using phrase search mode requires PostgreSQL of version at least 9.6 and will raise an error in earlier versions of the database. - Using `websearch_to_tsquery` requires PostgreSQL of version at least 11.0 and will raise an error in earlier versions of the database. .. _v_filter: @@ -1677,10 +1675,6 @@ A single row UPSERT can be done by using :code:`PUT` and filtering the primary k All the columns must be specified in the request body, including the primary key columns. -.. note:: - - Upsert features are only available starting from PostgreSQL 9.5 since it uses the `ON CONFLICT clause `_. - .. _delete: Deletions diff --git a/auth.rst b/auth.rst index 8e3383cb0e..0c8c507268 100644 --- a/auth.rst +++ b/auth.rst @@ -65,7 +65,7 @@ You can use row-level security to flexibly restrict visibility and access for th We want to enforce a policy that ensures a user can see only those messages sent by him or intended for him. Also we want to prevent a user from forging the message_from column with another person's name. -PostgreSQL (9.5 and later) allows us to set this policy with row-level security: +PostgreSQL allows us to set this policy with row-level security: .. code-block:: postgres diff --git a/install.rst b/install.rst index 2d789ad083..0a454835de 100644 --- a/install.rst +++ b/install.rst @@ -106,7 +106,7 @@ For a complete reference of the configuration file, see :ref:`configuration`. PostgreSQL dependency --------------------- -To use PostgREST you will need an underlying database. We require PostgreSQL 9.5 or greater. You can use something like `Amazon RDS `_ but installing your own locally is cheaper and more convenient for development. You can also run PostgreSQL in a :ref:`docker container`. +To use PostgREST you will need an underlying database. We require PostgreSQL 9.6 or greater. You can use something like `Amazon RDS `_ but installing your own locally is cheaper and more convenient for development. You can also run PostgreSQL in a :ref:`docker container`. Docker ====== From c46c3b7a860939e60cbdfaa8ef49fdeb490fc8e8 Mon Sep 17 00:00:00 2001 From: Laurence Isla Date: Mon, 29 Nov 2021 03:27:38 -0500 Subject: [PATCH 454/711] Bump to PostgREST v9 (#468) * Add highlights and modify changelog structure * Rename upcoming page to v9.0.0 * Classify features, edit breaking changes and fixes * Highlight top-level filtering * Clarify PostgreSQL 14 breaking change * Add devops to doc improvements * Add curl snippets to doc improvements --- admin.rst | 2 +- api.rst | 23 ++++++-- ecosystem.rst | 6 +- index.rst | 11 +++- releases/upcoming.rst | 56 ------------------ releases/v9.0.0.rst | 130 ++++++++++++++++++++++++++++++++++++++++++ 6 files changed, 159 insertions(+), 69 deletions(-) delete mode 100644 releases/upcoming.rst create mode 100644 releases/v9.0.0.rst diff --git a/admin.rst b/admin.rst index d1352228a6..054a31a393 100644 --- a/admin.rst +++ b/admin.rst @@ -207,7 +207,7 @@ Automatic Connection Recovery When PostgREST loses the connection to the database, it retries the connection using capped exponential backoff, with 32 seconds being the maximum backoff time. -This retry behavior is triggered immediately after the connection is lost if :ref:`db-channel-enabled` is set to true (this is the default behavior), otherwise it will be activated once a request is made. +This retry behavior is triggered immediately after the connection is lost if :ref:`db-channel-enabled` is set to true(the default), otherwise it will be activated once a request is made. To notify the client when the next reconnection attempt will be, PostgREST responds with ``503 Service Unavailable`` and the ``Retry-After: x`` header, where ``x`` is the number of seconds programmed for the next retry. diff --git a/api.rst b/api.rst index 31fcbb906d..eb79826ab0 100644 --- a/api.rst +++ b/api.rst @@ -910,6 +910,8 @@ If you want to embed through join tables but need more control on the intermedia curl "http://localhost:3000/actors?select=roles(character,films(title,year))" +.. _embed_filters: + Embedded Filters ---------------- @@ -991,10 +993,10 @@ The result will show the nested actors named Tom and order them by last name. Al .. _embedding_top_level_filter: -Top Level Filtering -~~~~~~~~~~~~~~~~~~~ +Embedding with Top-level Filtering +---------------------------------- -By default, embedded filters don't change the top level resource rows at all: +By default, :ref:`embed_filters` don't change the top-level resource(``films``) rows at all: .. tabs:: @@ -1095,8 +1097,9 @@ Since it contains the ``films_id`` foreign key, it is possible to embed ``box_of curl "http://localhost:3000/box_office?select=bo_date,gross_revenue,films(title)&gross_revenue=gte.1000000" .. note:: + * Embedding on partitions is not allowed because it leads to ambiguity errors (see :ref:`embed_disamb`) between them and their parent partitioned table(more details at `#1783(comment) `_). :ref:`custom_queries` can be used if this is needed. + * Partitioned tables can reference other tables since PostgreSQL 11 but can only be referenced from any other table since PostgreSQL 12. - * Embedding on partitions is not allowed because it leads to ambiguity errors (see :ref:`embed_disamb`) between them and their parent partitioned table. :ref:`custom_queries` can be used if this is needed. .. _embedding_views: @@ -1255,6 +1258,8 @@ For doing resource embedding, PostgREST infers the relationship between two tabl However, in cases where there's more than one foreign key between two tables, it's not possible to infer the relationship unambiguously by just specifying the tables names. +.. _target_disamb: + Target Disambiguation ~~~~~~~~~~~~~~~~~~~~~ @@ -1281,6 +1286,8 @@ the request is ambiguous and PostgREST will respond with an error: HTTP/1.1 300 Multiple Choices + {..} + If this happens, you need to disambiguate the request by adding precision to the **target**. Instead of the **table name**, you can specify the **foreign key constraint name** or the **column name** that is part of the foreign key. @@ -1344,6 +1351,8 @@ the result more clear. } ] +.. _hint_disamb: + Hint Disambiguation ~~~~~~~~~~~~~~~~~~~ @@ -2430,8 +2439,10 @@ You can also select the schema for :ref:`s_procs` and :ref:`open-api`. These headers are based on the nascent "Content Negotiation by Profile" spec: https://www.w3.org/TR/dx-prof-conneg -HTTP Logic -========== +.. _http_context: + +HTTP Context +============ .. _guc_req_headers_cookies_claims: diff --git a/ecosystem.rst b/ecosystem.rst index 787a8b75d1..6d4aa68c1b 100644 --- a/ecosystem.rst +++ b/ecosystem.rst @@ -28,7 +28,6 @@ Example Apps ------------ * `chronicle `_ - tracking a tree of personal memories -* `cloudgov-demo-postgrest `_ - demo for a federally-compliant REST API on cloud.gov * `code-du-travail-backoffice `_ - data administration portal for the official French Labor Code and Agreements * `delibrium-postgrest `_ - example school API and front-end in Vue.js * `elm-workshop `_ - building a simple database query UI @@ -53,13 +52,14 @@ Example Apps * `PostGUI `_ - React Material UI admin panel * `prospector `_ - data warehouse and visualization platform -.. _dev_ops: +.. _devops: DevOps ------ -* `jbkarle/postgrest `_ - helm chart with a demo database for development and test purposes +* `cloudgov-demo-postgrest `_ - demo for a federally-compliant REST API on cloud.gov * `cloudstark/helm-charts `_ - helm chart to deploy PostgREST to a Kubernetes cluster via a Deployment and Service +* `jbkarle/postgrest `_ - helm chart with a demo database for development and test purposes .. _eco_external_notification: diff --git a/index.rst b/index.rst index eb891698bb..aa48aa9c99 100644 --- a/index.rst +++ b/index.rst @@ -94,12 +94,16 @@ The project has a friendly and growing community. Join our `chat room + releases/v8.0.0 + releases/v7.0.1 + releases/v7.0.0 + releases/v6.0.2 + releases/v5.2.0 Tutorials --------- @@ -212,7 +216,7 @@ PostgREST has a growing ecosystem of examples, libraries, and experiments. Here * :ref:`community_tutorials` * :ref:`templates` * :ref:`eco_example_apps` -* :ref:`dev_ops` +* :ref:`devops` * :ref:`eco_external_notification` * :ref:`eco_extensions` * :ref:`clientside_libraries` @@ -224,6 +228,7 @@ Release Notes Here we'll include the most relevant changes so you can migrate to newer versions easily. You can see the full changelog of each release in the `PostgREST repository `_. +- :doc:`releases/v9.0.0` - :doc:`releases/v8.0.0` - :doc:`releases/v7.0.0` - :doc:`releases/v6.0.2` diff --git a/releases/upcoming.rst b/releases/upcoming.rst deleted file mode 100644 index 3f79dba41c..0000000000 --- a/releases/upcoming.rst +++ /dev/null @@ -1,56 +0,0 @@ -.. |br| raw:: html - -
    - -Upcoming -======== - -These are changes yet unreleased. If you'd like to try them out before a new official release, access `the list of CI runs `_ -and select the newest commit, then download the build from the Artifacts section at the bottom of the page (you'll need a GitHub account to download it). - -Added ------ - -* Allow :ref:`embedding `, UPSERT, INSERT with Location response, OPTIONS request and OpenAPI support for partitioned tables. - |br| -- `@laurenceisla `_ - -* Allow filtering top-level resource based on embedded resources filters. This is enabled by adding ``!inner`` to the embedded resource. See :ref:`embedding_top_level_filter`. - |br| -- `@steve-chavez `_ - -* Make GUC names for headers, cookies and jwt claims compatible with PostgreSQL v14. - - + The GUC names on PostgreSQL 14 are changed to the ones :ref:`mentioned in this section `, while older versions still use the :ref:`guc_legacy_names`. - + PostgreSQL versions below 14 can opt in to the new JSON GUCs by setting the :ref:`db-use-legacy-gucs` config option to false (true by default). - + Managed to avoid a breaking change thanks to `@robertsosinski `_ who reported the bug that only one ``.`` character was allowed in GUC keys to the PostgreSQL team. See the `full discussion `_. - - -- `@laurenceisla `_ - -* Allow escaping inside double quotes with a backslash, e.g. ``?col=in.("Double\"Quote")``, ``?col=in.("Back\\slash")``. See :ref:`reserved-chars`. - |br| -- `@steve-chavez `_ - -* Add ``Retry-After`` header when recovering the connection. See :ref:`automatic_recovery`. - |br| -- `@gautam1168 `_ - -* Allow calling a function with a :ref:`single unnamed parameter ` to POST raw ``json/jsonb``, ``bytea`` or ``text``. - |br| -- `@steve-chavez `_ - -* Allow specifying ``unknown`` for the ``is`` :ref:`operator `. - |br| -- `@steve-chavez `_ - -* Documentation improvements - - + Added :ref:`nested_embedding` to the :ref:`resource_embedding` section. - + Added the :ref:`templates` section to the :doc:`Ecosystem `. - + Added the :ref:`logical_operators` section - -Fixed ------ - -* Fix using single double quotes (``"``) and backslashes (``/``) as values on the "in" operator - |br| -- `@steve-chavez `_ - -Changed -------- - -* Partitions (created using ``PARTITION OF``) are no longer included in the :ref:`schema_cache`. - |br| -- `@laurenceisla `_ diff --git a/releases/v9.0.0.rst b/releases/v9.0.0.rst new file mode 100644 index 0000000000..09187b46fe --- /dev/null +++ b/releases/v9.0.0.rst @@ -0,0 +1,130 @@ + +PostgREST 9.0.0 +=============== + +This major version is released with PostgreSQL 14 compatibility and is accompanied with new features and bug fixes. You can look at the detailed changelog and download the pre-compiled binaries on the `GitHub release page `_. + +Features +-------- + +PostgreSQL 14 compatibility +~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +PostgreSQL 14 Beta 1 tightened its GUC naming scheme making it impossible to use multiple dots (``.``) and dashes (``-``) on custom GUC parameters, this caused our `old HTTP Context `_ to fail across all requests. Thankfully, `@robertsosinski `_ got the PostgreSQL team to reconsider allowing multiple dots in the GUC name, allowing us to avoid a major breaking change. You can see the full discussion `here `_. + +Still, dashes cannot be used on PostgreSQL 14 custom GUC parameters, so we changed our HTTP Context :ref:`to namespace using a mix of dots and JSON `. On older PostgreSQL versions we still use the :ref:`guc_legacy_names`. If you wish to use the new JSON GUCs on these versions, set the :ref:`db-use-legacy-gucs` config option to false. + +Resource Embedding with Top-level Filtering +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Historically, Resource Embedding was always done with a query that included the equivalent of a ``LEFT JOIN``, which meant you could not +exclude any of the top-level resource rows. You can now use :ref:`embedding_top_level_filter` to do the equivalent of an ``INNER JOIN``, thus you can filter the top-level resource rows with any of the available operators. + +Partitioned Tables +~~~~~~~~~~~~~~~~~~ + +Partitioned tables now integrate with all the feature set. You can :ref:`embed partitioned tables `, UPSERT, INSERT(with a correctly generated Location header) and make OPTIONS requests on them. They're also included in the generated OpenAPI. + +Functions(RPC) +~~~~~~~~~~~~~~ + +* Functions with a :ref:`single unnamed parameter ` can now be used to POST raw ``bytea``, ``text`` or ``json/jsonb``. + +Horizontal Filtering +~~~~~~~~~~~~~~~~~~~~ + +* The ``unknown`` value for three-valued logic can now be used on the ``is`` :ref:`operator `. + +* Escaping double quotes(``"``) in double-quoted surrounded strings is now possible by using backslashes, e.g. ``?col=in.("Double\"Quote")``. Backslashes can be escaped with a preceding backslash, e.g. ``?col=in.("Back\\slash")``. See :ref:`reserved-chars`. + +Administration +~~~~~~~~~~~~~~ + +* A ``Retry-After`` header is now added when PostgREST is doing :ref:`automatic_recovery`. + +Error messages +~~~~~~~~~~~~~~ + +* :ref:`embed_disamb` now shows an improved error message that includes relevant hints for clearing out the ambiguous embedding. + +Documentation improvements +~~~~~~~~~~~~~~~~~~~~~~~~~~ + +* Added ``curl`` snippets to the :doc:`API <../api>` page. + +* Added the :ref:`automatic_recovery` section. + +* Added the :ref:`nested_embedding` section. + +* Added the :ref:`logical_operators` section. + +* Added the :ref:`templates` and :ref:`devops` sections to the :doc:`Ecosystem `. + +Bug fixes +--------- + +* Correct RPC return type handling for RETURNS TABLE with a single column (`#1930 `_). + +* Schema Cache query failing with ``standard_conforming_strings = off`` (`#1992 `_). + +* OpenAPI missing default values for String types (`#1871 `_). + +Breaking changes +---------------- + +* Dropped support for PostgreSQL 9.5 as it already reached its end-of-life according to `PostgreSQL versioning policy `_. + +* Partitions of a `partitioned table `_ are no longer included in the :ref:`schema_cache`. This is so errors are not generated when doing resource embedding on partitioned tables. + +* Dropped support for doing :ref:`hint_disamb` using dots instead of exclamation marks, e.g. doing ``select=*,projects.client_id(*)`` instead of ``select=*,projects!client_id(*)``). Using dots was undocumented and deprecated back in `v6.0.2 `_. + +Thanks +------ + +Big thanks from the `PostgREST team `_ to our sponsors! + +.. container:: image-container + + .. image:: ../_static/cybertec-new.png + :target: https://www.cybertec-postgresql.com/en/?utm_source=postgrest.org&utm_medium=referral&utm_campaign=postgrest + :width: 13em + + .. image:: ../_static/2ndquadrant.png + :target: https://www.2ndquadrant.com/en/?utm_campaign=External%20Websites&utm_source=PostgREST&utm_medium=Logo + :width: 13em + + .. image:: ../_static/retool.png + :target: https://retool.com/?utm_source=sponsor&utm_campaign=postgrest + :width: 13em + + .. image:: ../_static/gnuhost.png + :target: https://gnuhost.eu/?utm_source=sponsor&utm_campaign=postgrest + :width: 13em + + .. image:: ../_static/supabase.png + :target: https://supabase.io/?utm_source=postgrest%20backers&utm_medium=open%20source%20partner&utm_campaign=postgrest%20backers%20github&utm_term=homepage + :width: 13em + + .. image:: ../_static/oblivious.jpg + :target: https://oblivious.ai/?utm_source=sponsor&utm_campaign=postgrest + :width: 13em + +* Evans Fernandes +* `Jan Sommer `_ +* `Franz Gusenbauer `_ +* `Daniel Babiak `_ +* Tsingson Qin +* Michel Pelletier +* Jay Hannah +* Robert Stolarz +* Nicholas DiBiase +* Christopher Reid +* Nathan Bouscal +* Daniel Rafaj +* David Fenko +* Remo Rechkemmer +* Severin Ibarluzea +* Tom Saleeba +* Pawel Tyll + +If you like to join them please consider `supporting PostgREST development `_. From d5fb73bf9bfce9707befd5895d08f8c10eb5bc4a Mon Sep 17 00:00:00 2001 From: Laurence Isla Date: Tue, 30 Nov 2021 16:09:21 -0500 Subject: [PATCH 455/711] Fix GUC names using the old syntax --- api.rst | 2 +- auth.rst | 2 +- tutorials/tut1.rst | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/api.rst b/api.rst index eb79826ab0..f5d5f796d6 100644 --- a/api.rst +++ b/api.rst @@ -2523,7 +2523,7 @@ As an example, let's add some cache headers for all requests that come from an I create or replace function custom_headers() returns void as $$ declare - user_agent text := current_setting('request.header.user-agent', true); + user_agent text := current_setting('request.headers', true)::json->>'user-agent'; begin if user_agent similar to '%MSIE (6.0|7.0)%' then perform set_config('response.headers', diff --git a/auth.rst b/auth.rst index 0c8c507268..cb2928e8c4 100644 --- a/auth.rst +++ b/auth.rst @@ -95,7 +95,7 @@ SQL code can access claims through GUC variables set by PostgREST per request. F .. code:: sql - current_setting('request.jwt.claim.email', true) + current_setting('request.jwt.claims', true)::json->>'email'; This allows JWT generation services to include extra information and your database code to react to it. For instance the RLS example could be modified to use this current_setting rather than current_user. The second 'true' argument tells current_setting to return NULL if the setting is missing from the current configuration. diff --git a/tutorials/tut1.rst b/tutorials/tut1.rst index fa89591f34..ec288fc972 100644 --- a/tutorials/tut1.rst +++ b/tutorials/tut1.rst @@ -212,7 +212,7 @@ First make a new schema and add the function: language plpgsql as $$ begin - if current_setting('request.jwt.claim.email', true) = + if current_setting('request.jwt.claims', true)::json->>'email' = 'disgruntled@mycompany.com' then raise insufficient_privilege using hint = 'Nope, we are on to you'; From 1b24eb34ee6aaef5151c2dc8a84bc4d4a7bd2e93 Mon Sep 17 00:00:00 2001 From: Devin Stein Date: Fri, 10 Dec 2021 15:08:51 -0800 Subject: [PATCH 456/711] Add missing = in log-level docs --- configuration.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/configuration.rst b/configuration.rst index 2826e2d5d9..3b76ea7655 100644 --- a/configuration.rst +++ b/configuration.rst @@ -272,7 +272,7 @@ log-level log-level = "warn" # All the "warn" level events plus all requests (every status code) are logged - log-level "info" + log-level = "info" Because currently there's no buffering for logging, the levels with minimal logging(``crit/error``) will increase throughput. From 66e49f0ea20d645829fb4f7d4ac31fd625910a75 Mon Sep 17 00:00:00 2001 From: Laurence Isla Date: Thu, 23 Dec 2021 16:54:08 -0500 Subject: [PATCH 457/711] Update config.py version/release --- conf.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/conf.py b/conf.py index be38720aa5..f0390613d5 100644 --- a/conf.py +++ b/conf.py @@ -57,9 +57,9 @@ # built documents. # # The short X.Y version. -version = u'8.0' +version = u'9.0' # The full version, including alpha/beta/rc tags. -release = u'8.0.0' +release = u'9.0.0' # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. From 04e7020ae3c4be128a89f605d116978c09110836 Mon Sep 17 00:00:00 2001 From: Wolfgang Walther Date: Fri, 24 Dec 2021 12:06:34 +0100 Subject: [PATCH 458/711] fix database-configuration ALTER ROLE example, resolves #481 --- configuration.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/configuration.rst b/configuration.rst index 3b76ea7655..4bccf0d8c0 100644 --- a/configuration.rst +++ b/configuration.rst @@ -440,8 +440,8 @@ For example, you can configure :ref:`db-schema` and :ref:`jwt-secret` like this: .. code:: postgresql - ALTER ROLE authenticator SET pgrst.db_schema = "tenant1, tenant2, tenant3" - ALTER ROLE authenticator SET pgrst.jwt_secret = "REALLYREALLYREALLYREALLYVERYSAFE" + ALTER ROLE authenticator IN DATABASE SET pgrst.db_schema = "tenant1, tenant2, tenant3" + ALTER ROLE authenticator IN DATABASE SET pgrst.jwt_secret = "REALLYREALLYREALLYREALLYVERYSAFE" Note that underscores(``_``) need to be used instead of dashes(``-``) for the in-database config options. From cfde95b0aad909d03183749d80e3a78206412dd6 Mon Sep 17 00:00:00 2001 From: Wolfgang Walther Date: Sat, 1 Jan 2022 15:13:57 +0100 Subject: [PATCH 459/711] remove reference to heroku app.json in main repo --- install.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install.rst b/install.rst index 0a454835de..6c410455e4 100644 --- a/install.rst +++ b/install.rst @@ -259,7 +259,7 @@ Assuming you're making modifications locally and then pushing to GitHub, it's ea 1. Create a new app on Heroku 2. In Settings add the following buildpack :code:`https://github.com/PostgREST/postgrest-heroku` -3. Add the require Config Vars in Heroku (see https://github.com/PostgREST/postgrest/blob/main/app.json for more details) +3. Add the require Config Vars in Heroku 4. Modify your ``postgrest.conf`` file as required to match your Config Vars in Heroku 5. Create your :code:`Procfile` and add :code:`./env-to-config ./postgrest postgrest.conf` 6. Push your changes to GitHub From 01874108822aff4501f8f233d00fbc59e6d9f338 Mon Sep 17 00:00:00 2001 From: Wolfgang Walther Date: Fri, 7 Jan 2022 20:30:25 +0100 Subject: [PATCH 460/711] remove dead link to v5 docs --- releases/v5.2.0.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/releases/v5.2.0.rst b/releases/v5.2.0.rst index 7cc90611b0..d32044526e 100644 --- a/releases/v5.2.0.rst +++ b/releases/v5.2.0.rst @@ -1,7 +1,7 @@ v5.2.0 ====== -* `Explicit qualification `_ introduced in ``v5.0`` is no longer necessary, this section will not be included from this version onwards. A :ref:`db-extra-search-path` configuration parameter was introduced to avoid the need to explictly qualify database objects. If you install PostgreSQL extensions on the ``public`` schema, they'll work normally from now on. +* Explicit qualification introduced in ``v5.0`` is no longer necessary, this section will not be included from this version onwards. A :ref:`db-extra-search-path` configuration parameter was introduced to avoid the need to explictly qualify database objects. If you install PostgreSQL extensions on the ``public`` schema, they'll work normally from now on. * Now you can filter :ref:`tabs-cols-w-spaces`. From 6c382c598511ba444506d4033ec03193898d6524 Mon Sep 17 00:00:00 2001 From: Wolfgang Walther Date: Fri, 7 Jan 2022 21:40:32 +0100 Subject: [PATCH 461/711] replace permanently redirected URIs --- auth.rst | 4 ++-- ecosystem.rst | 16 ++++++++-------- index.rst | 6 +++--- releases/v8.0.0.rst | 2 +- releases/v9.0.0.rst | 4 ++-- 5 files changed, 16 insertions(+), 16 deletions(-) diff --git a/auth.rst b/auth.rst index cb2928e8c4..9df91c78fa 100644 --- a/auth.rst +++ b/auth.rst @@ -215,11 +215,11 @@ JWT from Auth0 An external service like `Auth0 `_ can do the hard work transforming OAuth from Github, Twitter, Google etc into a JWT suitable for PostgREST. Auth0 can also handle email signup and password reset flows. -To use Auth0, create `an application `_ for your app and `an API `_ for your PostgREST server. Auth0 supports both HS256 and RS256 scheme for the issued tokens for APIs. For simplicity, you may first try HS256 scheme while creating your API on Auth0. Your application should use your PostgREST API's `API identifier `_ by setting it with the `audience parameter `_ during the authorization request. This will ensure that Auth0 will issue an access token for your PostgREST API. For PostgREST to verify the access token, you will need to set ``jwt-secret`` on PostgREST config file with your API's signing secret. +To use Auth0, create `an application `_ for your app and `an API `_ for your PostgREST server. Auth0 supports both HS256 and RS256 scheme for the issued tokens for APIs. For simplicity, you may first try HS256 scheme while creating your API on Auth0. Your application should use your PostgREST API's `API identifier `_ by setting it with the `audience parameter `_ during the authorization request. This will ensure that Auth0 will issue an access token for your PostgREST API. For PostgREST to verify the access token, you will need to set ``jwt-secret`` on PostgREST config file with your API's signing secret. .. note:: - Our code requires a database role in the JWT. To add it you need to save the database role in Auth0 `app metadata `_. Then, you will need to write `a rule `_ that will extract the role from the user's app_metadata and set it as a `custom claim `_ in the access token. Note that, you may use Auth0's `core authorization feature `_ for more complex use cases. Metadata solution is mentioned here for simplicity. + Our code requires a database role in the JWT. To add it you need to save the database role in Auth0 `app metadata `_. Then, you will need to write `a rule `_ that will extract the role from the user's app_metadata and set it as a `custom claim `_ in the access token. Note that, you may use Auth0's `core authorization feature `_ for more complex use cases. Metadata solution is mentioned here for simplicity. .. code:: javascript diff --git a/ecosystem.rst b/ecosystem.rst index 6d4aa68c1b..883db8bc04 100644 --- a/ecosystem.rst +++ b/ecosystem.rst @@ -105,20 +105,20 @@ Client-Side Libraries * `mithril-postgrest `_ - JS, Mithril * `ng-postgrest `_ - Angular app for browsing, editing data exposed over PostgREST. * `postgrest-client `_ - JS -* `postgrest-csharp `_ - C# -* `postgrest-dart `_ - Dart +* `postgrest-csharp `_ - C# +* `postgrest-dart `_ - Dart * `postgrest-ex `_ - Elixir -* `postgrest-go `_ - Go +* `postgrest-go `_ - Go * `postgrest-js `_ - TypeScript/JavaScript -* `postgrest-kt `_ - Kotlin -* `postgrest-py `_ - Python +* `postgrest-kt `_ - Kotlin +* `postgrest-py `_ - Python * `postgrest-request `_ - JS, SuperAgent -* `postgrest-rs `_ - Rust +* `postgrest-rs `_ - Rust * `postgrest-sharp-client `_ (needs maintainer) - C#, RestSharp -* `postgrest-swift `_ - Swift +* `postgrest-swift `_ - Swift * `postgrest-url `_ - JS, just for generating query URLs * `postgrest_python_requests_client `_ - Python -* `postgrester `_ - JS + Typescript +* `postgrester `_ - JS + Typescript * `postgrestR `_ - R * `py-postgrest `_ - Python * `redux-postgrest `_ - TypeScript/JS, client integrated with (React) Redux. diff --git a/index.rst b/index.rst index aa48aa9c99..3d522585d7 100644 --- a/index.rst +++ b/index.rst @@ -51,7 +51,7 @@ Sponsors :width: 13em .. image:: _static/supabase.png - :target: https://supabase.io/?utm_source=postgrest%20backers&utm_medium=open%20source%20partner&utm_campaign=postgrest%20backers%20github&utm_term=homepage + :target: https://supabase.com/?utm_source=postgrest%20backers&utm_medium=open%20source%20partner&utm_campaign=postgrest%20backers%20github&utm_term=homepage :width: 13em .. image:: _static/oblivious.jpg @@ -243,7 +243,7 @@ Here are some companies that use PostgREST in production. * `Datrium `_ * `Drip Depot `_ * `Image-charts `_ -* `Moat `_ +* `Moat `_ * `MotionDynamic - Fast highly dynamic video generation at scale `_ * `Netwo `_ * `Nimbus `_ @@ -251,7 +251,7 @@ Here are some companies that use PostgREST in production. * `OpenBooking `_ * `Redsmin `_ * `Sompani `_ -* `Supabase `_ +* `Supabase `_ .. Certs are failing * `eGull `_ diff --git a/releases/v8.0.0.rst b/releases/v8.0.0.rst index a02a20f697..7cdc36c58b 100644 --- a/releases/v8.0.0.rst +++ b/releases/v8.0.0.rst @@ -163,7 +163,7 @@ Big thanks from the `PostgREST team `_ :width: 13em .. image:: ../_static/supabase.png - :target: https://supabase.io/?utm_source=postgrest%20backers&utm_medium=open%20source%20partner&utm_campaign=postgrest%20backers%20github&utm_term=homepage + :target: https://supabase.com/?utm_source=postgrest%20backers&utm_medium=open%20source%20partner&utm_campaign=postgrest%20backers%20github&utm_term=homepage :width: 13em .. image:: ../_static/oblivious.jpg diff --git a/releases/v9.0.0.rst b/releases/v9.0.0.rst index 09187b46fe..7843f24030 100644 --- a/releases/v9.0.0.rst +++ b/releases/v9.0.0.rst @@ -63,7 +63,7 @@ Documentation improvements Bug fixes --------- -* Correct RPC return type handling for RETURNS TABLE with a single column (`#1930 `_). +* Correct RPC return type handling for RETURNS TABLE with a single column (`#1930 `_). * Schema Cache query failing with ``standard_conforming_strings = off`` (`#1992 `_). @@ -102,7 +102,7 @@ Big thanks from the `PostgREST team `_ :width: 13em .. image:: ../_static/supabase.png - :target: https://supabase.io/?utm_source=postgrest%20backers&utm_medium=open%20source%20partner&utm_campaign=postgrest%20backers%20github&utm_term=homepage + :target: https://supabase.com/?utm_source=postgrest%20backers&utm_medium=open%20source%20partner&utm_campaign=postgrest%20backers%20github&utm_term=homepage :width: 13em .. image:: ../_static/oblivious.jpg From 62726ddcfdd4835745d798ffcf082e2a3dca4364 Mon Sep 17 00:00:00 2001 From: Wolfgang Walther Date: Fri, 7 Jan 2022 21:45:48 +0100 Subject: [PATCH 462/711] force colored output in build and linkcheck tools --- default.nix | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/default.nix b/default.nix index 40db658258..651046e369 100644 --- a/default.nix +++ b/default.nix @@ -31,7 +31,7 @@ in # clean previous build, otherwise some errors might be supressed rm -rf _build - ${python}/bin/sphinx-build -W -b html -a -n . _build + ${python}/bin/sphinx-build --color -W -b html -a -n . _build ''; serve = @@ -81,6 +81,6 @@ in '' set -euo pipefail - ${python}/bin/sphinx-build -b linkcheck . _build + ${python}/bin/sphinx-build --color -b linkcheck . _build ''; } From 540ef4ad9f5f5242c86ddafa4b5f7e837636a9be Mon Sep 17 00:00:00 2001 From: Wolfgang Walther Date: Fri, 7 Jan 2022 20:17:18 +0100 Subject: [PATCH 463/711] Update configuration page --- admin.rst | 2 +- api.rst | 14 +- auth.rst | 6 +- configuration.rst | 579 +++++++++++------- .../embedding-table-from-another-schema.rst | 2 +- postgrest.dict | 1 + releases/v7.0.0.rst | 2 +- tutorials/tut0.rst | 2 +- tutorials/tut1.rst | 2 +- 9 files changed, 377 insertions(+), 233 deletions(-) diff --git a/admin.rst b/admin.rst index 054a31a393..6f906363f0 100644 --- a/admin.rst +++ b/admin.rst @@ -266,7 +266,7 @@ First, create postgrest configuration in ``/etc/postgrest/config`` .. code-block:: ini db-uri = "postgres://:@localhost:5432/" - db-schema = "" + db-schemas = "" db-anon-role = "" db-pool = 10 diff --git a/api.rst b/api.rst index f5d5f796d6..2e39e01786 100644 --- a/api.rst +++ b/api.rst @@ -396,7 +396,7 @@ As mentioned, computed columns do not appear in the output by default. However y .. important:: - Computed columns must be created under the :ref:`exposed schema ` to be used in this way. + Computed columns must be created under the :ref:`exposed schema ` to be used in this way. Unicode support --------------- @@ -666,9 +666,9 @@ In general, when having smaller row-counts, the estimated count should be as clo To help with these cases, PostgREST can get the exact count up until a threshold and get the planned count when that threshold is surpassed. To use this behavior, you can specify the ``Prefer: count=estimated`` header. The **threshold** is -defined by :ref:`max-rows`. +defined by :ref:`db-max-rows`. -Here's an example. Suppose we set ``max-rows=1000`` and ``smalltable`` has 321 rows, then we'll get the exact count: +Here's an example. Suppose we set ``db-max-rows=1000`` and ``smalltable`` has 321 rows, then we'll get the exact count: .. tabs:: @@ -1156,7 +1156,7 @@ It's also possible to embed `Materialized Views ` using environment variables. They are capitalized, have a ``PGRST_`` prefix, and use underscores. For example: ``PGRST_DB_URI`` corresponds to ``db-uri`` and ``PGRST_APP_SETTINGS_*`` to ``app.settings.*``. + +.. _config_reloading: + +Configuration Reloading +======================= + +To reload the configuration without restarting the PostgREST server, send a SIGUSR2 signal to the server process. + +.. code:: bash + + killall -SIGUSR2 postgrest + +This method does not reload :ref:`env_variables_config` and it will not work for reloading a Docker container configuration. In these cases, you need to restart the PostgREST server or use the :ref:`in_db_config` as an alternative. + +.. important:: + + The following settings will not be reread when reloading the configuration. You will need to restart PostgREST in that case. + + * :ref:`db-uri` + * :ref:`db-pool` + * :ref:`db-pool-timeout` + * :ref:`server-host` + * :ref:`server-port` + * :ref:`server-unix-socket` + * :ref:`server-unix-socket-mode` + +.. _in_db_config: + +In-Database Configuration +========================= + +By adding settings to the **authenticator** role (see :ref:`roles`), you can make the database the single source of truth for PostgREST's configuration. +This is enabled by :ref:`db-config`. + +For example, you can configure :ref:`db-schemas` and :ref:`jwt-secret` like this: + +.. code:: postgresql + + ALTER ROLE authenticator IN DATABASE SET pgrst.db_schemas = "tenant1, tenant2, tenant3" + ALTER ROLE authenticator IN DATABASE SET pgrst.jwt_secret = "REALLYREALLYREALLYREALLYVERYSAFE" + +Note that underscores(``_``) need to be used instead of dashes(``-``) for the in-database config parameters. + +.. important:: + + For altering a role in this way, you need a SUPERUSER. You might not be able to use this configuration mode on cloud-hosted databases. + +When using both the configuration file and the in-database configuration, the latter takes precedence. + +.. danger:: + + If direct connections to the database are allowed, then it's not safe to use the in-db configuration for storing the :ref:`jwt-secret`. + The settings of every role are PUBLIC - they can be viewed by any user that queries the ``pg_catalog.pg_db_role_setting`` table. + In this case you should keep the :ref:`jwt-secret` in the configuration file or as environment variables. + +.. _in_db_config_reloading: + +In-database configuration reloading +----------------------------------- + +To reload the in-database configuration from within the database, you can use a NOTIFY command. + +.. code:: postgresql + + NOTIFY pgrst, 'reload config' + +The ``"pgrst"`` notification channel is enabled by default. For configuring the channel, see :ref:`db-channel` and :ref:`db-channel-enabled`. + +.. _config_full_list: + +List of parameters +================== + +======================== ======= ================= ======== ========== +Name Type Default Required Reloadable +======================== ======= ================= ======== ========== +app.settings.* String Y +db-anon-role String Y Y +db-channel String pgrst Y +db-channel-enabled Boolean True Y +db-config Boolean True Y +db-extra-search-path String public Y +db-max-rows Int ∞ Y db-pool Int 10 db-pool-timeout Int 10 -db-extra-search-path String public -db-channel String pgrst -db-channel-enabled Boolean True -db-prepared-statements Boolean True -db-tx-end String commit -db-config Boolean True -db-use-legacy-gucs Boolean True +db-pre-request String Y +db-prepared-statements Boolean True Y +db-schemas String Y Y +db-tx-end String commit Y +db-uri String Y +db-use-legacy-gucs Boolean True Y +jwt-aud String Y +jwt-role-claim-key String .role Y +jwt-secret String Y +jwt-secret-is-base64 Boolean False Y +log-level String error Y +openapi-mode String follow-privileges Y +openapi-server-proxy-uri String Y +raw-media-types String Y server-host String !4 server-port Int 3000 server-unix-socket String server-unix-socket-mode String 660 -log-level String error -openapi-mode String follow-privileges -openapi-server-proxy-uri String -jwt-secret String -jwt-aud String -secret-is-base64 Boolean False -max-rows Int ∞ -pre-request String -app.settings.* String -role-claim-key String .role -raw-media-types String -======================== ======= ================= ======== +======================== ======= ================= ======== ========== -.. _db-uri: +.. _app.settings.*: -db-uri ------- +app.settings.* +-------------- - The standard connection PostgreSQL `URI format `_. Symbols and unusual characters in the password or other fields should be percent encoded to avoid a parse error. If enforcing an SSL connection to the database is required you can use `sslmode `_ in the URI, for example ``postgres://user:pass@host:5432/dbname?sslmode=require``. + =============== ==================== + **Environment** PGRST_APP_SETTINGS_* + **In-Database** pgrst.app_settings_* + =============== ==================== - When running PostgREST on the same machine as PostgreSQL, it is also possible to connect to the database using a `Unix socket `_ and the `Peer Authentication method `_ as an alternative to TCP/IP communication and authentication with a password, this also grants higher performance. To do this you can omit the host and the password, e.g. ``postgres://user@/dbname``, see the `libpq connection string `_ documentation for more details. + Arbitrary settings that can be used to pass in secret keys directly as strings, or via OS environment variables. For instance: :code:`app.settings.jwt_secret = "$(MYAPP_JWT_SECRET)"` will take :code:`MYAPP_JWT_SECRET` from the environment and make it available to postgresql functions as :code:`current_setting('app.settings.jwt_secret')`. - On older systems like Centos 6, with older versions of libpq, a different db-uri syntax has to be used. In this case the URI is a string of space separated key-value pairs (key=value), so the example above would be :code:`"host=host user=user port=5432 dbname=dbname password=pass"`. +.. _db-anon-role: - Choosing a value for this parameter beginning with the at sign such as ``@filename`` (e.g. ``@./configs/my-config``) loads the secret out of an external file. +db-anon-role +------------ + =============== ================== + **Environment** PGRST_DB_ANON_ROLE + **In-Database** `n/a` + =============== ================== -.. _db-schema: + The database role to use when executing commands on behalf of unauthenticated clients. For more information, see :ref:`roles`. -db-schema ---------- +.. _db-channel: - The database schema to expose to REST clients. Tables, views and stored procedures in this schema will get API endpoints. +db-channel +---------- - .. code:: bash + =============== ================ + **Environment** PGRST_DB_CHANNEL + **In-Database** `n/a` + =============== ================ - db-schema = "api" + The name of the notification channel that PostgREST uses for :ref:`schema_reloading` and configuration reloading. - This schema gets added to the `search_path `_ of every request. +.. _db-channel-enabled: -List of schemas -~~~~~~~~~~~~~~~ +db-channel-enabled +------------------ - You can also specify a list of schemas that can be used for **schema-based multitenancy** and **api versioning** by :ref:`multiple-schemas`. Example: + =============== ======================== + **Environment** PGRST_DB_CHANNEL_ENABLED + **In-Database** `n/a` + =============== ======================== - .. code:: bash + When this is set to :code:`true`, the notification channel specified in :ref:`db-channel` is enabled. - db-schema = "tenant1, tenant2" + You should set this to ``false`` when using PostgresSQL behind an external connection pooler such as PgBouncer working in transaction pooling mode. See :ref:`this section ` for more information. - If you don't :ref:`Switch Schemas `, the first schema in the list(``tenant1`` in this case) is chosen as the default schema. +.. _db-config: - *Only the chosen schema* gets added to the `search_path `_ of every request. +db-config +--------- - .. warning:: + =============== =============== + **Environment** PGRST_DB_CONFIG + **In-Database** `n/a` + =============== =============== - Never expose private schemas in this way. See :ref:`schema_isolation`. + Enables the in-database configuration. -.. _db-anon-role: +.. _db-extra-search-path: -db-anon-role ------------- +db-extra-search-path +-------------------- - The database role to use when executing commands on behalf of unauthenticated clients. For more information, see :ref:`roles`. + =============== ========================== + **Environment** PGRST_DB_EXTRA_SEARCH_PATH + **In-Database** pgrst.db_extra_search_path + =============== ========================== + + Extra schemas to add to the `search_path `_ of every request. These schemas tables, views and stored procedures **don't get API endpoints**, they can only be referred from the database objects inside your :ref:`db-schemas`. + + This parameter was meant to make it easier to use **PostgreSQL extensions** (like PostGIS) that are outside of the :ref:`db-schemas`. + + Multiple schemas can be added in a comma-separated string, e.g. ``public, extensions``. + +.. _db-max-rows: + +db-max-rows +----------- + + *For backwards compatibility, this config parameter is also available without prefix as "max-rows".* + + =============== ================= + **Environment** PGRST_DB_MAX_ROWS + **In-Database** pgrst.db_max_rows + =============== ================= + + A hard limit to the number of rows PostgREST will fetch from a view, table, or stored procedure. Limits payload size for accidental or malicious requests. .. _db-pool: db-pool ------- + =============== ================= + **Environment** PGRST_DB_POOL + **In-Database** `n/a` + =============== ================= + Number of connections to keep open in PostgREST's database pool. Having enough here for the maximum expected simultaneous client connections can improve performance. Note it's pointless to set this higher than the :code:`max_connections` GUC in your database. .. _db-pool-timeout: @@ -131,52 +252,91 @@ db-pool db-pool-timeout --------------- + =============== ================= + **Environment** PGRST_DB_POOL_TIMEOUT + **In-Database** `n/a` + =============== ================= + Time to live, in seconds, for an idle database pool connection. If the timeout is reached the connection will be closed. Once a new request arrives a new connection will be started. -.. _db-extra-search-path: +.. _db-pre-request: -db-extra-search-path --------------------- +db-pre-request +-------------- - Extra schemas to add to the `search_path `_ of every request. These schemas tables, views and stored procedures **don't get API endpoints**, they can only be referred from the database objects inside your :ref:`db-schema`. + *For backwards compatibility, this config parameter is also available without prefix as "pre-request".* - This parameter was meant to make it easier to use **PostgreSQL extensions** (like PostGIS) that are outside of the :ref:`db-schema`. + =============== ================= + **Environment** PGRST_DB_PRE_REQUEST + **In-Database** pgrst.db_pre_request + =============== ================= - Multiple schemas can be added in a comma-separated string, e.g. ``public, extensions``. + A schema-qualified stored procedure name to call right after switching roles for a client request. This provides an opportunity to modify SQL variables or raise an exception to prevent the request from completing. -.. _db-channel: +.. _db-prepared-statements: -db-channel +db-prepared-statements +---------------------- + + =============== ================= + **Environment** PGRST_DB_PREPARED_STATEMENTS + **In-Database** pgrst.db_prepared_statements + =============== ================= + + Enables or disables prepared statements. + + When disabled, the generated queries will be parameterized (invulnerable to SQL injection) but they will not be prepared (cached in the database session). Not using prepared statements will noticeably decrease performance, so it's recommended to always have this setting enabled. + + You should only set this to ``false`` when using PostgresSQL behind an external connection pooler such as PgBouncer working in transaction pooling mode. See :ref:`this section ` for more information. + +.. _db-schemas: + +db-schemas ---------- - The name of the notification channel that PostgREST uses for :ref:`schema_reloading` and configuration reloading. + *For backwards compatibility, this config parameter is also available in singular as "db-schema".* -.. _db-channel-enabled: + =============== ================= + **Environment** PGRST_DB_SCHEMAS + **In-Database** pgrst.db_schemas + =============== ================= -db-channel-enabled ------------------- + The database schema to expose to REST clients. Tables, views and stored procedures in this schema will get API endpoints. - When this is set to :code:`true`, the notification channel specified in :ref:`db-channel` is enabled. + .. code:: bash - You should set this to ``false`` when using PostgresSQL behind an external connection pooler such as PgBouncer working in transaction pooling mode. See :ref:`this section ` for more information. + db-schemas = "api" -.. _db-prepared-statements: + This schema gets added to the `search_path `_ of every request. -db-prepared-statements ----------------------- +List of schemas +~~~~~~~~~~~~~~~ - Enables or disables prepared statements. + You can also specify a list of schemas that can be used for **schema-based multitenancy** and **api versioning** by :ref:`multiple-schemas`. Example: - When disabled, the generated queries will be parameterized (invulnerable to SQL injection) but they will not be prepared (cached in the database session). Not using prepared statements will noticeably decrease performance, so it's recommended to always have this setting enabled. + .. code:: bash - You should only set this to ``false`` when using PostgresSQL behind an external connection pooler such as PgBouncer working in transaction pooling mode. See :ref:`this section ` for more information. + db-schemas = "tenant1, tenant2" + + If you don't :ref:`Switch Schemas `, the first schema in the list(``tenant1`` in this case) is chosen as the default schema. + + *Only the chosen schema* gets added to the `search_path `_ of every request. + + .. warning:: + + Never expose private schemas in this way. See :ref:`schema_isolation`. .. _db-tx-end: db-tx-end --------- + =============== ================= + **Environment** PGRST_DB_TX_END + **In-Database** pgrst.db_tx_end + =============== ================= + Specifies how to terminate the database transactions. .. code:: bash @@ -193,71 +353,108 @@ db-tx-end # The transaction is rolled back unless a "Prefer: tx=commit" header is sent db-tx-end = "rollback-allow-override" -.. _db-config: +.. _db-uri: -db-config ---------- +db-uri +------ - Enables the in-database configuration. + =============== ================= + **Environment** PGRST_DB_URI + **In-Database** `n/a` + =============== ================= + + The standard connection PostgreSQL `URI format `_. Symbols and unusual characters in the password or other fields should be percent encoded to avoid a parse error. If enforcing an SSL connection to the database is required you can use `sslmode `_ in the URI, for example ``postgres://user:pass@host:5432/dbname?sslmode=require``. + + When running PostgREST on the same machine as PostgreSQL, it is also possible to connect to the database using a `Unix socket `_ and the `Peer Authentication method `_ as an alternative to TCP/IP communication and authentication with a password, this also grants higher performance. To do this you can omit the host and the password, e.g. ``postgres://user@/dbname``, see the `libpq connection string `_ documentation for more details. + + On older systems like Centos 6, with older versions of libpq, a different db-uri syntax has to be used. In this case the URI is a string of space separated key-value pairs (key=value), so the example above would be :code:`"host=host user=user port=5432 dbname=dbname password=pass"`. + + Choosing a value for this parameter beginning with the at sign such as ``@filename`` (e.g. ``@./configs/my-config``) loads the secret out of an external file. .. _db-use-legacy-gucs: db-use-legacy-gucs ------------------ + =============== ================= + **Environment** PGRST_DB_USE_LEGACY_GUCS + **In-Database** pgrst.db_use_legacy_gucs + =============== ================= + Determine if GUC request settings for headers, cookies and jwt claims use the `legacy names `_ (string with dashes, invalid starting from PostgreSQL v14) with text values instead of the :ref:`new names ` (string without dashes, valid on all PostgreSQL versions) with json values. On PostgreSQL versions 14 and above, this parameter is ignored. -.. _server-host: - -server-host ------------ +.. _jwt-aud: - Where to bind the PostgREST web server. In addition to the usual address options, PostgREST interprets these reserved addresses with special meanings: +jwt-aud +------- - * :code:`*` - any IPv4 or IPv6 hostname - * :code:`*4` - any IPv4 or IPv6 hostname, IPv4 preferred - * :code:`!4` - any IPv4 hostname - * :code:`*6` - any IPv4 or IPv6 hostname, IPv6 preferred - * :code:`!6` - any IPv6 hostname + =============== ================= + **Environment** PGRST_JWT_AUD + **In-Database** pgrst.jwt_aud + =============== ================= -.. _server-port: + Specifies the `JWT audience claim `_. If this claim is present in the client provided JWT then you must set this to the same value as in the JWT, otherwise verifying the JWT will fail. -server-port ------------ +.. _jwt-role-claim-key: - The TCP port to bind the web server. +jwt-role-claim-key +------------------ -.. _server-unix-socket: + *For backwards compatibility, this config parameter is also available without prefix as "role-claim-key".* -server-unix-socket ------------------- + =============== ================= + **Environment** PGRST_JWT_ROLE_CLAIM_KEY + **In-Database** pgrst.jwt_role_claim_key + =============== ================= - `Unix domain socket `_ where to bind the PostgREST web server. - If specified, this takes precedence over :ref:`server-port`. Example: + A JSPath DSL that specifies the location of the :code:`role` key in the JWT claims. This can be used to consume a JWT provided by a third party service like Auth0, Okta or Keycloak. Usage examples: .. code:: bash - server-unix-socket = "/tmp/pgrst.sock" + # {"postgrest":{"roles": ["other", "author"]}} + # the DSL accepts characters that are alphanumerical or one of "_$@" as keys + jwt-role-claim-key = ".postgrest.roles[1]" -.. _server-unix-socket-mode: + # {"https://www.example.com/role": { "key": "author }} + # non-alphanumerical characters can go inside quotes(escaped in the config value) + jwt-role-claim-key = ".\"https://www.example.com/role\".key" -server-unix-socket-mode ------------------------ +.. _jwt-secret: - `Unix file mode `_ to be set for the socket specified in :ref:`server-unix-socket` - Needs to be a valid octal between 600 and 777. +jwt-secret +---------- - .. code:: bash + =============== ================= + **Environment** PGRST_JWT_SECRET + **In-Database** pgrst.jwt_secret + =============== ================= - server-unix-socket-mode = "660" + The secret or `JSON Web Key (JWK) (or set) `_ used to decode JWT tokens clients provide for authentication. For security the key must be **at least 32 characters long**. If this parameter is not specified then PostgREST refuses authentication requests. Choosing a value for this parameter beginning with the at sign such as :code:`@filename` loads the secret out of an external file. This is useful for automating deployments. Note that any binary secrets must be base64 encoded. Both symmetric and asymmetric cryptography are supported. For more info see :ref:`asym_keys`. + +.. _jwt-secret-is-base64: + +jwt-secret-is-base64 +-------------------- + + =============== ================= + **Environment** PGRST_JWT_SECRET_IS_BASE64 + **In-Database** pgrst.jwt_secret_is_base64 + =============== ================= + + When this is set to :code:`true`, the value derived from :code:`jwt-secret` will be treated as a base64 encoded secret. .. _log-level: log-level --------- + =============== ================= + **Environment** PGRST_LOG_LEVEL + **In-Database** `n/a` + =============== ================= + Specifies the level of information to be logged while running PostgREST. .. code:: bash @@ -282,6 +479,11 @@ log-level openapi-mode ------------ + =============== ================= + **Environment** PGRST_OPENAPI_MODE + **In-Database** pgrst.openapi_mode + =============== ================= + Specifies how the OpenAPI output should be displayed. .. code:: bash @@ -303,6 +505,11 @@ openapi-mode openapi-server-proxy-uri ------------------------ + =============== ================= + **Environment** PGRST_OPENAPI_SERVER_PROXY_URI + **In-Database** pgrst.openapi_server_proxy_uri + =============== ================= + Overrides the base URL used within the OpenAPI self-documentation hosted at the API root path. Use a complete URI syntax :code:`scheme:[//[user:password@]host[:port]][/]path[?query][#fragment]`. Ex. :code:`https://postgrest.com` .. code:: json @@ -321,70 +528,16 @@ openapi-server-proxy-uri ] } -.. _jwt-secret: - -jwt-secret ----------- - - The secret or `JSON Web Key (JWK) (or set) `_ used to decode JWT tokens clients provide for authentication. For security the key must be **at least 32 characters long**. If this parameter is not specified then PostgREST refuses authentication requests. Choosing a value for this parameter beginning with the at sign such as :code:`@filename` loads the secret out of an external file. This is useful for automating deployments. Note that any binary secrets must be base64 encoded. Both symmetric and asymmetric cryptography are supported. For more info see :ref:`asym_keys`. - -.. _jwt-aud: - -jwt-aud -------- - - Specifies the `JWT audience claim `_. If this claim is present in the client provided JWT then you must set this to the same value as in the JWT, otherwise verifying the JWT will fail. - -.. _secret-is-base64: - -secret-is-base64 ----------------- - - When this is set to :code:`true`, the value derived from :code:`jwt-secret` will be treated as a base64 encoded secret. - -.. _max-rows: - -max-rows --------- - - A hard limit to the number of rows PostgREST will fetch from a view, table, or stored procedure. Limits payload size for accidental or malicious requests. - -.. _pre-request: - -pre-request ------------ - - A schema-qualified stored procedure name to call right after switching roles for a client request. This provides an opportunity to modify SQL variables or raise an exception to prevent the request from completing. - -.. _app.settings.*: - -app.settings.* --------------- - - Arbitrary settings that can be used to pass in secret keys directly as strings, or via OS environment variables. For instance: :code:`app.settings.jwt_secret = "$(MYAPP_JWT_SECRET)"` will take :code:`MYAPP_JWT_SECRET` from the environment and make it available to postgresql functions as :code:`current_setting('app.settings.jwt_secret')`. - -.. _role-claim-key: - -role-claim-key --------------- - - A JSPath DSL that specifies the location of the :code:`role` key in the JWT claims. This can be used to consume a JWT provided by a third party service like Auth0, Okta or Keycloak. Usage examples: - - .. code:: bash - - # {"postgrest":{"roles": ["other", "author"]}} - # the DSL accepts characters that are alphanumerical or one of "_$@" as keys - role-claim-key = ".postgrest.roles[1]" - - # {"https://www.example.com/role": { "key": "author }} - # non-alphanumerical characters can go inside quotes(escaped in the config value) - role-claim-key = ".\"https://www.example.com/role\".key" - .. _raw-media-types: raw-media-types --------------- + =============== ================= + **Environment** PGRST_RAW_MEDIA_TYPES + **In-Database** pgrst.raw_media_types + =============== ================= + This serves to extend the `Media Types `_ that PostgREST currently accepts through an ``Accept`` header. These media types can be requested by following the same rules as the ones defined in :ref:`binary_output`. @@ -396,76 +549,66 @@ raw-media-types raw-media-types="image/png, text/xml" -.. _env_variables_config: - -Environment Variables -===================== - -You can also set these :ref:`configuration parameters ` using environment variables. They are capitalized, have a ``PGRST_`` prefix, and use underscores. For example: ``PGRST_DB_URI`` corresponds to ``db-uri`` and ``PGRST_APP_SETTINGS_*`` to ``app.settings.*``. - -.. _config_reloading: - -Configuration Reloading -======================= - -To reload the configuration without restarting the PostgREST server, send a SIGUSR2 signal to the server process. - -.. code:: bash - - killall -SIGUSR2 postgrest - -This method does not reload :ref:`env_variables_config` and it will not work for reloading a Docker container configuration. In these cases, you need to restart the PostgREST server or use the :ref:`in_db_config` as an alternative. +.. _server-host: -.. important:: +server-host +----------- - The following settings will not be reread when reloading the configuration. You will need to restart PostgREST in that case. + =============== ================= + **Environment** PGRST_SERVER_HOST + **In-Database** pgrst.server_host + =============== ================= - * :ref:`db-uri` - * :ref:`db-pool` - * :ref:`db-pool-timeout` - * :ref:`server-host` - * :ref:`server-port` - * :ref:`server-unix-socket` - * :ref:`server-unix-socket-mode` - -.. _in_db_config: + Where to bind the PostgREST web server. In addition to the usual address options, PostgREST interprets these reserved addresses with special meanings: -In-Database Configuration -========================= + * :code:`*` - any IPv4 or IPv6 hostname + * :code:`*4` - any IPv4 or IPv6 hostname, IPv4 preferred + * :code:`!4` - any IPv4 hostname + * :code:`*6` - any IPv4 or IPv6 hostname, IPv6 preferred + * :code:`!6` - any IPv6 hostname -By adding settings to the **authenticator** role (see :ref:`roles`), you can make the database the single source of truth for PostgREST's configuration. -This is enabled by :ref:`db-config`. +.. _server-port: -For example, you can configure :ref:`db-schema` and :ref:`jwt-secret` like this: +server-port +----------- -.. code:: postgresql + =============== ================= + **Environment** PGRST_SERVER_PORT + **In-Database** pgrst.server_port + =============== ================= - ALTER ROLE authenticator IN DATABASE SET pgrst.db_schema = "tenant1, tenant2, tenant3" - ALTER ROLE authenticator IN DATABASE SET pgrst.jwt_secret = "REALLYREALLYREALLYREALLYVERYSAFE" + The TCP port to bind the web server. -Note that underscores(``_``) need to be used instead of dashes(``-``) for the in-database config options. +.. _server-unix-socket: -.. important:: +server-unix-socket +------------------ - For altering a role in this way, you need a SUPERUSER. You might not be able to use this configuration mode on cloud-hosted databases. + =============== ================= + **Environment** PGRST_SERVER_UNIX_SOCKET + **In-Database** pgrst.server_unix_socket + =============== ================= -When using both the configuration file and the in-database configuration, the latter takes precedence. + `Unix domain socket `_ where to bind the PostgREST web server. + If specified, this takes precedence over :ref:`server-port`. Example: -.. danger:: + .. code:: bash - If direct connections to the database are allowed, then it's not safe to use the in-db configuration for storing the :ref:`jwt-secret`. - The settings of every role are PUBLIC - they can be viewed by any user that queries the ``pg_catalog.pg_db_role_setting`` table. - In this case you should keep the :ref:`jwt-secret` in the configuration file or as environment variables. + server-unix-socket = "/tmp/pgrst.sock" -.. _in_db_config_reloading: +.. _server-unix-socket-mode: -In-database configuration reloading ------------------------------------ +server-unix-socket-mode +----------------------- -To reload the in-database configuration from within the database, you can use a NOTIFY command. + =============== ================= + **Environment** PGRST_SERVER_UNIX_SOCKET_MODE + **In-Database** pgrst.server_unix_socket_mode + =============== ================= -.. code:: postgresql + `Unix file mode `_ to be set for the socket specified in :ref:`server-unix-socket` + Needs to be a valid octal between 600 and 777. - NOTIFY pgrst, 'reload config' + .. code:: bash -The ``"pgrst"`` notification channel is enabled by default. For configuring the channel, see :ref:`db-channel` and :ref:`db-channel-enabled`. + server-unix-socket-mode = "660" diff --git a/how-tos/embedding-table-from-another-schema.rst b/how-tos/embedding-table-from-another-schema.rst index 118d630d17..6631982de6 100644 --- a/how-tos/embedding-table-from-another-schema.rst +++ b/how-tos/embedding-table-from-another-schema.rst @@ -3,7 +3,7 @@ Embedding a table from another schema :author: `steve-chavez `_ -Suppose you have a **people** table in the ``public`` schema and this schema is exposed through PostgREST's :ref:`db-schema`. +Suppose you have a **people** table in the ``public`` schema and this schema is exposed through PostgREST's :ref:`db-schemas`. .. code-block:: postgres diff --git a/postgrest.dict b/postgrest.dict index fba460fd99..16a91dd584 100644 --- a/postgrest.dict +++ b/postgrest.dict @@ -125,6 +125,7 @@ Rechkemmer reconnection Redux refactor +Reloadable Remo requester's RESTful diff --git a/releases/v7.0.0.rst b/releases/v7.0.0.rst index 34e5d46db6..3c2c0ef58a 100644 --- a/releases/v7.0.0.rst +++ b/releases/v7.0.0.rst @@ -10,7 +10,7 @@ You can download this release at the `PostgREST v7.0.0 release page ` defined in :ref:`db-schema`. +* Support for :ref:`Switching to a schema ` defined in :ref:`db-schemas`. |br| -- `@steve-chavez `_, `@mahmoudkassem `_ * Support for :ref:`planned_count` and :ref:`estimated_count`. diff --git a/tutorials/tut0.rst b/tutorials/tut0.rst index 04e6420a30..27e9cb44df 100644 --- a/tutorials/tut0.rst +++ b/tutorials/tut0.rst @@ -162,7 +162,7 @@ PostgREST uses a configuration file to tell it how to connect to the database. C .. code-block:: ini db-uri = "postgres://authenticator:mysecretpassword@localhost:5433/postgres" - db-schema = "api" + db-schemas = "api" db-anon-role = "web_anon" The configuration file has other :ref:`options `, but this is all we need. diff --git a/tutorials/tut1.rst b/tutorials/tut1.rst index ec288fc972..cb307dc4b1 100644 --- a/tutorials/tut1.rst +++ b/tutorials/tut1.rst @@ -226,7 +226,7 @@ Next update :code:`tutorial.conf` and specify the new function: # add this line to tutorial.conf - pre-request = "auth.check_token" + db-pre-request = "auth.check_token" Restart PostgREST for the change to take effect. Next try making a request with our original token and then with the revoked one. From 4bd090ba13ade70b9f87714dad3d2031f72082ff Mon Sep 17 00:00:00 2001 From: Wolfgang Walther Date: Fri, 7 Jan 2022 18:53:25 +0100 Subject: [PATCH 464/711] add user to logging example --- admin.rst | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/admin.rst b/admin.rst index 6f906363f0..20404d21d4 100644 --- a/admin.rst +++ b/admin.rst @@ -158,12 +158,12 @@ When debugging a problem it's important to verify the PostgREST version. At any Logging ------- -PostgREST logs basic request information to ``stdout``, including the requesting IP address and user agent, the URL requested, and HTTP response status. +PostgREST logs basic request information to ``stdout``, including the authenticated user if available, the requesting IP address and user agent, the URL requested, and HTTP response status. .. code:: - 127.0.0.1 - - [26/Jul/2021:01:56:38 -0500] "GET /clients HTTP/1.1" 200 - "" "curl/7.64.0" - 127.0.0.1 - - [26/Jul/2021:01:56:48 -0500] "GET /unexistent HTTP/1.1" 404 - "" "curl/7.64.0" + 127.0.0.1 - user [26/Jul/2021:01:56:38 -0500] "GET /clients HTTP/1.1" 200 - "" "curl/7.64.0" + 127.0.0.1 - anonymous [26/Jul/2021:01:56:48 -0500] "GET /unexistent HTTP/1.1" 404 - "" "curl/7.64.0" For diagnostic information about the server itself, PostgREST logs to ``stderr``. From 737ad76dfdc1188bd463bbcefb280318f2d4bcf2 Mon Sep 17 00:00:00 2001 From: Wolfgang Walther Date: Sat, 8 Jan 2022 11:35:51 +0100 Subject: [PATCH 465/711] Clarify in-database configuration example regarding IN DATABASE --- configuration.rst | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/configuration.rst b/configuration.rst index 1215d9a3d8..50f8ce7ee5 100644 --- a/configuration.rst +++ b/configuration.rst @@ -76,9 +76,11 @@ For example, you can configure :ref:`db-schemas` and :ref:`jwt-secret` like this .. code:: postgresql - ALTER ROLE authenticator IN DATABASE SET pgrst.db_schemas = "tenant1, tenant2, tenant3" + ALTER ROLE authenticator SET pgrst.db_schemas = "tenant1, tenant2, tenant3" ALTER ROLE authenticator IN DATABASE SET pgrst.jwt_secret = "REALLYREALLYREALLYREALLYVERYSAFE" +You can use both database-specific settings with `IN DATABASE` and cluster-wide settings without it. Database-specific settings will override cluster-wide settings if both are used for the same parameter. + Note that underscores(``_``) need to be used instead of dashes(``-``) for the in-database config parameters. .. important:: From 9d23cfde9dceb906e736c55bc77a1f4f9b2eb7e1 Mon Sep 17 00:00:00 2001 From: Steve Chavez Date: Wed, 12 Jan 2022 12:52:34 -0500 Subject: [PATCH 466/711] Add finer-grained event trigger (#489) --- schema_cache.rst | 70 +++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 69 insertions(+), 1 deletion(-) diff --git a/schema_cache.rst b/schema_cache.rst index 1e708876df..11d0f95105 100644 --- a/schema_cache.rst +++ b/schema_cache.rst @@ -160,4 +160,72 @@ To disable auto reloading, drop the trigger: .. code-block:: postgresql - DROP EVENT TRIGGER pgrst_watch \ No newline at end of file + DROP EVENT TRIGGER pgrst_watch + +Finer-Grained Event Trigger +~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +You can refine the previous event trigger and only react to the events relevant to the schema cache. This also prevents unnecessary +reloading when creating temporary tables(``CREATE TEMP TABLE``) inside functions. + +.. code-block:: postgresql + + -- watch create and alter + CREATE OR REPLACE FUNCTION pgrst_ddl_watch() RETURNS event_trigger AS $$ + DECLARE + cmd record; + BEGIN + FOR cmd IN SELECT * FROM pg_event_trigger_ddl_commands() + LOOP + IF cmd.command_tag IN ( + 'CREATE SCHEMA', 'ALTER SCHEMA' + , 'CREATE TABLE', 'CREATE TABLE AS', 'SELECT INTO', 'ALTER TABLE' + , 'CREATE FOREIGN TABLE', 'ALTER FOREIGN TABLE' + , 'CREATE VIEW', 'ALTER VIEW' + , 'CREATE MATERIALIZED VIEW', 'ALTER MATERIALIZED VIEW' + , 'CREATE FUNCTION', 'ALTER FUNCTION' + , 'CREATE TRIGGER' + , 'CREATE TYPE' + , 'CREATE RULE' + , 'COMMENT' + ) + -- don't notify in case of CREATE TEMP table or other objects created on pg_temp + AND cmd.schema_name is distinct from 'pg_temp' + THEN + NOTIFY pgrst, 'reload schema'; + END IF; + END LOOP; + END; $$ LANGUAGE plpgsql; + + -- watch drop + CREATE OR REPLACE FUNCTION pgrst_drop_watch() RETURNS event_trigger AS $$ + DECLARE + obj record; + BEGIN + FOR obj IN SELECT * FROM pg_event_trigger_dropped_objects() + LOOP + IF obj.object_type IN ( + 'schema' + , 'table' + , 'foreign table' + , 'view' + , 'materialized view' + , 'function' + , 'trigger' + , 'type' + , 'rule' + ) + AND obj.is_temporary IS false -- no pg_temp objects + THEN + NOTIFY pgrst, 'reload schema'; + END IF; + END LOOP; + END; $$ LANGUAGE plpgsql; + + CREATE EVENT TRIGGER pgrst_ddl_watch + ON ddl_command_end + EXECUTE PROCEDURE pgrst_ddl_watch(); + + CREATE EVENT TRIGGER pgrst_drop_watch + ON sql_drop + EXECUTE PROCEDURE pgrst_drop_watch(); From 5187eadd0bcbbee91d054fa7e2f29794a0521099 Mon Sep 17 00:00:00 2001 From: Wolfgang Walther Date: Sun, 23 Jan 2022 11:04:35 +0100 Subject: [PATCH 467/711] Restructure configuration reloading section --- configuration.rst | 65 +++++++++++++++++++++++++-------------------- releases/v8.0.0.rst | 2 +- 2 files changed, 37 insertions(+), 30 deletions(-) diff --git a/configuration.rst b/configuration.rst index 50f8ce7ee5..ff6784c265 100644 --- a/configuration.rst +++ b/configuration.rst @@ -39,31 +39,6 @@ Environment Variables You can also set these :ref:`configuration parameters ` using environment variables. They are capitalized, have a ``PGRST_`` prefix, and use underscores. For example: ``PGRST_DB_URI`` corresponds to ``db-uri`` and ``PGRST_APP_SETTINGS_*`` to ``app.settings.*``. -.. _config_reloading: - -Configuration Reloading -======================= - -To reload the configuration without restarting the PostgREST server, send a SIGUSR2 signal to the server process. - -.. code:: bash - - killall -SIGUSR2 postgrest - -This method does not reload :ref:`env_variables_config` and it will not work for reloading a Docker container configuration. In these cases, you need to restart the PostgREST server or use the :ref:`in_db_config` as an alternative. - -.. important:: - - The following settings will not be reread when reloading the configuration. You will need to restart PostgREST in that case. - - * :ref:`db-uri` - * :ref:`db-pool` - * :ref:`db-pool-timeout` - * :ref:`server-host` - * :ref:`server-port` - * :ref:`server-unix-socket` - * :ref:`server-unix-socket-mode` - .. _in_db_config: In-Database Configuration @@ -95,12 +70,44 @@ When using both the configuration file and the in-database configuration, the la The settings of every role are PUBLIC - they can be viewed by any user that queries the ``pg_catalog.pg_db_role_setting`` table. In this case you should keep the :ref:`jwt-secret` in the configuration file or as environment variables. -.. _in_db_config_reloading: +.. _config_reloading: -In-database configuration reloading ------------------------------------ +Configuration Reloading +======================= + +It's possible to reload PostgREST's configuration without restarting the server. You can do this :ref:`via signal ` or :ref:`via notification `. + +It's not possible to change :ref:`env_variables_config` for a running process and reloading a Docker container configuration will not work. In these cases, you need to restart the PostgREST server or use :ref:`in_db_config` as an alternative. + +.. important:: + + The following settings will not be reloaded. You will need to restart PostgREST to change those. + + * :ref:`db-uri` + * :ref:`db-pool` + * :ref:`db-pool-timeout` + * :ref:`server-host` + * :ref:`server-port` + * :ref:`server-unix-socket` + * :ref:`server-unix-socket-mode` + +.. _config_reloading_signal: + +Reload with signal +------------------ + +To reload the configuration via signal, send a SIGUSR2 signal to the server process. + +.. code:: bash + + killall -SIGUSR2 postgrest + +.. _config_reloading_notify: + +Reload with NOTIFY +------------------ -To reload the in-database configuration from within the database, you can use a NOTIFY command. +To reload the configuration from within the database, you can use a NOTIFY command. .. code:: postgresql diff --git a/releases/v8.0.0.rst b/releases/v8.0.0.rst index 7cdc36c58b..9df17821ef 100644 --- a/releases/v8.0.0.rst +++ b/releases/v8.0.0.rst @@ -37,7 +37,7 @@ Added * Allow ``Bearer`` with and without capitalization as authentication schema. See :ref:`client_auth`. |br| -- `@wolfgangwalther `_ -* :ref:`in_db_config` that can be :ref:`reloaded with NOTIFY `. +* :ref:`in_db_config` that can be :ref:`reloaded with NOTIFY `. |br| -- `@steve-chavez `_ * Allow OPTIONS to generate HTTP methods based on views triggers. See :ref:`OPTIONS requests `. From 5f938dbe1a05df6ee978e236bc9e63a043ea6d1f Mon Sep 17 00:00:00 2001 From: Wolfgang Walther Date: Sat, 22 Jan 2022 15:54:13 +0100 Subject: [PATCH 468/711] Run PostgREST with zero config. Related to https://github.com/PostgREST/postgrest/pull/2112 --- admin.rst | 5 --- auth.rst | 2 +- configuration.rst | 92 +++++++++++++++++++++++++++------------------- tutorials/tut0.rst | 4 +- 4 files changed, 58 insertions(+), 45 deletions(-) diff --git a/admin.rst b/admin.rst index 20404d21d4..c319c29c47 100644 --- a/admin.rst +++ b/admin.rst @@ -268,11 +268,6 @@ First, create postgrest configuration in ``/etc/postgrest/config`` db-uri = "postgres://:@localhost:5432/" db-schemas = "" db-anon-role = "" - db-pool = 10 - - server-host = "127.0.0.1" - server-port = 3000 - jwt-secret = "" Then create the systemd service file in ``/etc/systemd/system/postgrest.service`` diff --git a/auth.rst b/auth.rst index 892f73f774..867339cbc9 100644 --- a/auth.rst +++ b/auth.rst @@ -63,7 +63,7 @@ You can use row-level security to flexibly restrict visibility and access for th ALTER TABLE chat ENABLE ROW LEVEL SECURITY; -We want to enforce a policy that ensures a user can see only those messages sent by him or intended for him. Also we want to prevent a user from forging the message_from column with another person's name. +We want to enforce a policy that ensures a user can see only those messages sent by them or intended for them. Also we want to prevent a user from forging the message_from column with another person's name. PostgreSQL allows us to set this policy with row-level security: diff --git a/configuration.rst b/configuration.rst index ff6784c265..59501140ce 100644 --- a/configuration.rst +++ b/configuration.rst @@ -3,7 +3,18 @@ Configuration ============= -PostgREST reads a configuration file to determine information about the database and how to serve client requests. There is no predefined location for this file, you must specify the file path as the one and only argument to the server: +Without configuration, PostgREST won't be able to serve requests. At the minimum it needs either :ref:`a role to serve anonymous requests with ` - or :ref:`a secret to use for JWT authentication `. Config parameters can be provided via :ref:`file_config`, via :ref:`env_variables_config` or through :ref:`in_db_config`. + +To connect to a database it uses a `libpq connection string `_. The connection string can be set in the configuration file or via environment variable or can be read from an external file. See :ref:`db-uri` for details. Any parameter that is not set in the connection string is read from `libpq environment variables `_. The default connection string is ``postgresql://``, which reads **all** parameters from the environment. + +The user with whom PostgREST connects to the database is also known as the authenticator role. For more information about the anonymous vs authenticator roles see :ref:`roles`. + +.. _file_config: + +Config File +----------- + +PostgREST can read a config file. There is no predefined location for this file, you must specify the file path as the one and only argument to the server: .. code:: bash @@ -13,7 +24,7 @@ PostgREST reads a configuration file to determine information about the database Configuration can be reloaded without restarting the server. See :ref:`config_reloading`. -The configuration file must contain a set of key value pairs. At minimum you must include these keys: +The configuration file must contain a set of key value pairs: .. code:: @@ -23,26 +34,31 @@ The configuration file must contain a set of key value pairs. At minimum you mus # https://www.postgresql.org/docs/current/libpq-connect.html#LIBPQ-CONNSTRING db-uri = "postgres://user:pass@host:5432/dbname" - # The name of which database schema to expose to REST clients - db-schemas = "api" - # The database role to use when no client authentication is provided. - # Can (and should) differ from user in db-uri + # Should differ from authenticator db-anon-role = "anon" -The user specified in the db-uri is also known as the authenticator role. For more information about the anonymous vs authenticator roles see the :ref:`roles`. + # The secret to verify the JWT for authenticated requests with. + # Needs to be 32 characters minimum. + jwt-secret = "reallyreallyreallyreallyverysafe" + jwt-secret-is-base64 = False + + # Port the postgrest process is listening on for http requests + server-port = 80 + +You can run ``postgrest --example`` to display all possible configuration parameters and how to use them in a configuration file. .. _env_variables_config: Environment Variables -===================== +--------------------- You can also set these :ref:`configuration parameters ` using environment variables. They are capitalized, have a ``PGRST_`` prefix, and use underscores. For example: ``PGRST_DB_URI`` corresponds to ``db-uri`` and ``PGRST_APP_SETTINGS_*`` to ``app.settings.*``. .. _in_db_config: In-Database Configuration -========================= +------------------------- By adding settings to the **authenticator** role (see :ref:`roles`), you can make the database the single source of truth for PostgREST's configuration. This is enabled by :ref:`db-config`. @@ -120,37 +136,37 @@ The ``"pgrst"`` notification channel is enabled by default. For configuring the List of parameters ================== -======================== ======= ================= ======== ========== -Name Type Default Required Reloadable -======================== ======= ================= ======== ========== -app.settings.* String Y -db-anon-role String Y Y -db-channel String pgrst Y -db-channel-enabled Boolean True Y -db-config Boolean True Y -db-extra-search-path String public Y -db-max-rows Int ∞ Y +======================== ======= ================= ========== +Name Type Default Reloadable +======================== ======= ================= ========== +app.settings.* String Y +db-anon-role String Y +db-channel String pgrst Y +db-channel-enabled Boolean True Y +db-config Boolean True Y +db-extra-search-path String public Y +db-max-rows Int ∞ Y db-pool Int 10 db-pool-timeout Int 10 -db-pre-request String Y -db-prepared-statements Boolean True Y -db-schemas String Y Y -db-tx-end String commit Y -db-uri String Y -db-use-legacy-gucs Boolean True Y -jwt-aud String Y -jwt-role-claim-key String .role Y -jwt-secret String Y -jwt-secret-is-base64 Boolean False Y -log-level String error Y -openapi-mode String follow-privileges Y -openapi-server-proxy-uri String Y -raw-media-types String Y +db-pre-request String Y +db-prepared-statements Boolean True Y +db-schemas String public Y +db-tx-end String commit +db-uri String postgresql:// +db-use-legacy-gucs Boolean True Y +jwt-aud String Y +jwt-role-claim-key String .role Y +jwt-secret String Y +jwt-secret-is-base64 Boolean False Y +log-level String error Y +openapi-mode String follow-privileges Y +openapi-server-proxy-uri String Y +raw-media-types String Y server-host String !4 server-port Int 3000 server-unix-socket String server-unix-socket-mode String 660 -======================== ======= ================= ======== ========== +======================== ======= ================= ========== .. _app.settings.*: @@ -176,6 +192,8 @@ db-anon-role The database role to use when executing commands on behalf of unauthenticated clients. For more information, see :ref:`roles`. + When unset anonymous access will be blocked. + .. _db-channel: db-channel @@ -376,9 +394,7 @@ db-uri When running PostgREST on the same machine as PostgreSQL, it is also possible to connect to the database using a `Unix socket `_ and the `Peer Authentication method `_ as an alternative to TCP/IP communication and authentication with a password, this also grants higher performance. To do this you can omit the host and the password, e.g. ``postgres://user@/dbname``, see the `libpq connection string `_ documentation for more details. - On older systems like Centos 6, with older versions of libpq, a different db-uri syntax has to be used. In this case the URI is a string of space separated key-value pairs (key=value), so the example above would be :code:`"host=host user=user port=5432 dbname=dbname password=pass"`. - - Choosing a value for this parameter beginning with the at sign such as ``@filename`` (e.g. ``@./configs/my-config``) loads the secret out of an external file. + Choosing a value for this parameter beginning with the at sign such as ``@filename`` (e.g. ``@./configs/my-config``) loads the connection string out of an external file. .. _db-use-legacy-gucs: @@ -442,6 +458,8 @@ jwt-secret The secret or `JSON Web Key (JWK) (or set) `_ used to decode JWT tokens clients provide for authentication. For security the key must be **at least 32 characters long**. If this parameter is not specified then PostgREST refuses authentication requests. Choosing a value for this parameter beginning with the at sign such as :code:`@filename` loads the secret out of an external file. This is useful for automating deployments. Note that any binary secrets must be base64 encoded. Both symmetric and asymmetric cryptography are supported. For more info see :ref:`asym_keys`. + Choosing a value for this parameter beginning with the at sign such as ``@filename`` (e.g. ``@./configs/my-config``) loads the secret out of an external file. + .. _jwt-secret-is-base64: jwt-secret-is-base64 diff --git a/tutorials/tut0.rst b/tutorials/tut0.rst index 27e9cb44df..d17b32b7c5 100644 --- a/tutorials/tut0.rst +++ b/tutorials/tut0.rst @@ -140,7 +140,7 @@ Next make a role to use for anonymous web requests. When a request comes in, Pos The :code:`web_anon` role has permission to access things in the :code:`api` schema, and to read rows in the :code:`todos` table. -It's a good practice to create a dedicated role for connecting to the database, instead of using the highly privileged ``postgres`` role. So we'll do that, name the role ``authenticator`` and also grant him the ability to switch to the ``web_anon`` role : +It's a good practice to create a dedicated role for connecting to the database, instead of using the highly privileged ``postgres`` role. So we'll do that, name the role ``authenticator`` and also grant it the ability to switch to the ``web_anon`` role : .. code-block:: postgres @@ -157,7 +157,7 @@ Now quit out of psql; it's time to start the API! Step 5. Run PostgREST --------------------- -PostgREST uses a configuration file to tell it how to connect to the database. Create a file :code:`tutorial.conf` with this inside: +PostgREST can use a configuration file to tell it how to connect to the database. Create a file :code:`tutorial.conf` with this inside: .. code-block:: ini From 0824139069043ad963d33f2fb901696d7ace24ee Mon Sep 17 00:00:00 2001 From: Wolfgang Walther Date: Sun, 23 Jan 2022 12:12:32 +0100 Subject: [PATCH 469/711] Add order of precedence for config parameters --- configuration.rst | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/configuration.rst b/configuration.rst index 59501140ce..422093d36c 100644 --- a/configuration.rst +++ b/configuration.rst @@ -9,6 +9,12 @@ To connect to a database it uses a `libpq connection string Date: Fri, 28 Jan 2022 00:27:19 +0000 Subject: [PATCH 470/711] Improving docs for setting response headers like content-type (#494) --- api.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/api.rst b/api.rst index 2e39e01786..6367d4a3b5 100644 --- a/api.rst +++ b/api.rst @@ -2509,7 +2509,7 @@ Notice that the variable should be set to an *array* of single-key objects rathe .. note:: - PostgREST provided headers such as ``Content-Type``, ``Location``, etc. can be overriden this way. + PostgREST provided headers such as ``Content-Type``, ``Location``, etc. can be overriden this way. Note that irrespective of overridden ``Content-Type`` response header, the content will still be converted to JSON, unless you also set :ref:`raw-media-types` to something like ``text/html``. .. _pre_req_headers: From 0ae86b7e7490ce986ab47f84c98c5278e09ca83e Mon Sep 17 00:00:00 2001 From: Wolfgang Walther Date: Sun, 30 Jan 2022 13:24:29 +0100 Subject: [PATCH 471/711] Fix references to full documents instead of first section Resolves #492 Signed-off-by: Wolfgang Walther --- how-tos/providing-images-for-img.rst | 2 +- releases/v7.0.0.rst | 2 +- releases/v8.0.0.rst | 4 ++-- releases/v9.0.0.rst | 2 +- tutorials/tut0.rst | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/how-tos/providing-images-for-img.rst b/how-tos/providing-images-for-img.rst index 5a1463d5ec..989e197494 100644 --- a/how-tos/providing-images-for-img.rst +++ b/how-tos/providing-images-for-img.rst @@ -38,7 +38,7 @@ We can retrieve this image in binary format from our PostgREST API by requesting Unfortunately, putting the URL into the :code:`src` of an :code:`` tag will not work. That's because browsers do not send the required header. -Luckily, we can configure our :ref:`Nginx reverse proxy ` to fix this problem for us. +Luckily, we can configure our :doc:`Nginx reverse proxy <../admin>` to fix this problem for us. We assume that PostgREST is running on port 3000. We provide a new location :code:`/files/` that redirects requests to our endpoint with the :code:`Accept` header set to :code:`application/octet-stream`. diff --git a/releases/v7.0.0.rst b/releases/v7.0.0.rst index 3c2c0ef58a..241f0e9010 100644 --- a/releases/v7.0.0.rst +++ b/releases/v7.0.0.rst @@ -35,7 +35,7 @@ Added * Documentation improvements - + Explanation for :ref:`Schema Structure `. + + Explanation for :doc:`Schema Structure <../schema_structure>`. + Reference for :ref:`s_proc_embed`. + Reference for :ref:`mutation_embed`. + Reference for filters on :ref:`json_columns`. diff --git a/releases/v8.0.0.rst b/releases/v8.0.0.rst index 9df17821ef..b99bd695f3 100644 --- a/releases/v8.0.0.rst +++ b/releases/v8.0.0.rst @@ -60,8 +60,8 @@ Added * Documentation improvements - + Added the :ref:`schema_cache` page. - + Moved the :ref:`schema_reloading` reference from :ref:`admin` to :ref:`schema_cache` + + Added the :doc:`../schema_cache` page. + + Moved the :ref:`schema_reloading` reference from :doc:`../admin` to :doc:`../schema_cache` Changed ------- diff --git a/releases/v9.0.0.rst b/releases/v9.0.0.rst index 7843f24030..d451bba7eb 100644 --- a/releases/v9.0.0.rst +++ b/releases/v9.0.0.rst @@ -74,7 +74,7 @@ Breaking changes * Dropped support for PostgreSQL 9.5 as it already reached its end-of-life according to `PostgreSQL versioning policy `_. -* Partitions of a `partitioned table `_ are no longer included in the :ref:`schema_cache`. This is so errors are not generated when doing resource embedding on partitioned tables. +* Partitions of a `partitioned table `_ are no longer included in the :doc:`../schema_cache`. This is so errors are not generated when doing resource embedding on partitioned tables. * Dropped support for doing :ref:`hint_disamb` using dots instead of exclamation marks, e.g. doing ``select=*,projects.client_id(*)`` instead of ``select=*,projects!client_id(*)``). Using dots was undocumented and deprecated back in `v6.0.2 `_. diff --git a/tutorials/tut0.rst b/tutorials/tut0.rst index d17b32b7c5..a0ffb936c3 100644 --- a/tutorials/tut0.rst +++ b/tutorials/tut0.rst @@ -165,7 +165,7 @@ PostgREST can use a configuration file to tell it how to connect to the database db-schemas = "api" db-anon-role = "web_anon" -The configuration file has other :ref:`options `, but this is all we need. +The configuration file has other :doc:`options <../configuration>`, but this is all we need. If you are not using Docker, make sure that your port number is correct and replace `postgres` with the name of the database where you added the todos table. Now run the server: From a85dfe955832ca306df369765694e85c00273faf Mon Sep 17 00:00:00 2001 From: Wolfgang Walther Date: Sun, 30 Jan 2022 10:54:36 +0100 Subject: [PATCH 472/711] chore: Move *.rst files to docs/ folder Signed-off-by: Wolfgang Walther --- .readthedocs.yaml | 6 ++++++ default.nix | 8 ++++---- diagrams/README.md | 4 ++-- {_static => docs/_static}/2ndquadrant.png | Bin {_static => docs/_static}/css/custom.css | 0 {_static => docs/_static}/cybertec-new.png | Bin {_static => docs/_static}/cybertec.png | Bin {_static => docs/_static}/db.png | Bin {_static => docs/_static}/empty.png | Bin {_static => docs/_static}/favicon.ico | Bin {_static => docs/_static}/film.png | Bin {_static => docs/_static}/gnuhost.png | Bin {_static => docs/_static}/logo.png | Bin {_static => docs/_static}/oblivious.jpg | Bin {_static => docs/_static}/orders.png | Bin {_static => docs/_static}/retool.png | Bin {_static => docs/_static}/security-anon-choice.png | Bin {_static => docs/_static}/security-roles.png | Bin {_static => docs/_static}/supabase.png | Bin {_static => docs/_static}/timescaledb.png | Bin .../_static}/tuts/tut0-request-flow.png | Bin {_static => docs/_static}/tuts/tut1-jwt-io.png | Bin {_static => docs/_static}/win-err-dialog.png | Bin admin.rst => docs/admin.rst | 0 api.rst => docs/api.rst | 0 auth.rst => docs/auth.rst | 0 conf.py => docs/conf.py | 0 configuration.rst => docs/configuration.rst | 0 ecosystem.rst => docs/ecosystem.rst | 0 .../how-tos}/casting-type-to-custom-json.rst | 0 .../embedding-table-from-another-schema.rst | 0 .../how-tos}/providing-images-for-img.rst | 0 index.rst => docs/index.rst | 0 install.rst => docs/install.rst | 0 {releases => docs/releases}/v5.2.0.rst | 0 {releases => docs/releases}/v6.0.2.rst | 0 {releases => docs/releases}/v7.0.0.rst | 0 {releases => docs/releases}/v7.0.1.rst | 0 {releases => docs/releases}/v8.0.0.rst | 0 {releases => docs/releases}/v9.0.0.rst | 0 schema_cache.rst => docs/schema_cache.rst | 0 schema_structure.rst => docs/schema_structure.rst | 0 {tutorials => docs/tutorials}/tut0.rst | 0 {tutorials => docs/tutorials}/tut1.rst | 0 livereload_docs.py | 10 +++++----- 45 files changed, 17 insertions(+), 11 deletions(-) create mode 100644 .readthedocs.yaml rename {_static => docs/_static}/2ndquadrant.png (100%) rename {_static => docs/_static}/css/custom.css (100%) rename {_static => docs/_static}/cybertec-new.png (100%) rename {_static => docs/_static}/cybertec.png (100%) rename {_static => docs/_static}/db.png (100%) rename {_static => docs/_static}/empty.png (100%) rename {_static => docs/_static}/favicon.ico (100%) rename {_static => docs/_static}/film.png (100%) rename {_static => docs/_static}/gnuhost.png (100%) rename {_static => docs/_static}/logo.png (100%) rename {_static => docs/_static}/oblivious.jpg (100%) rename {_static => docs/_static}/orders.png (100%) rename {_static => docs/_static}/retool.png (100%) rename {_static => docs/_static}/security-anon-choice.png (100%) rename {_static => docs/_static}/security-roles.png (100%) rename {_static => docs/_static}/supabase.png (100%) rename {_static => docs/_static}/timescaledb.png (100%) rename {_static => docs/_static}/tuts/tut0-request-flow.png (100%) rename {_static => docs/_static}/tuts/tut1-jwt-io.png (100%) rename {_static => docs/_static}/win-err-dialog.png (100%) rename admin.rst => docs/admin.rst (100%) rename api.rst => docs/api.rst (100%) rename auth.rst => docs/auth.rst (100%) rename conf.py => docs/conf.py (100%) rename configuration.rst => docs/configuration.rst (100%) rename ecosystem.rst => docs/ecosystem.rst (100%) rename {how-tos => docs/how-tos}/casting-type-to-custom-json.rst (100%) rename {how-tos => docs/how-tos}/embedding-table-from-another-schema.rst (100%) rename {how-tos => docs/how-tos}/providing-images-for-img.rst (100%) rename index.rst => docs/index.rst (100%) rename install.rst => docs/install.rst (100%) rename {releases => docs/releases}/v5.2.0.rst (100%) rename {releases => docs/releases}/v6.0.2.rst (100%) rename {releases => docs/releases}/v7.0.0.rst (100%) rename {releases => docs/releases}/v7.0.1.rst (100%) rename {releases => docs/releases}/v8.0.0.rst (100%) rename {releases => docs/releases}/v9.0.0.rst (100%) rename schema_cache.rst => docs/schema_cache.rst (100%) rename schema_structure.rst => docs/schema_structure.rst (100%) rename {tutorials => docs/tutorials}/tut0.rst (100%) rename {tutorials => docs/tutorials}/tut1.rst (100%) diff --git a/.readthedocs.yaml b/.readthedocs.yaml new file mode 100644 index 0000000000..3bce02afa5 --- /dev/null +++ b/.readthedocs.yaml @@ -0,0 +1,6 @@ +version: 2 +sphinx: + configuration: docs/conf.py +python: + install: + - requirements: requirements.txt diff --git a/default.nix b/default.nix index 651046e369..5dffe887ac 100644 --- a/default.nix +++ b/default.nix @@ -31,7 +31,7 @@ in # clean previous build, otherwise some errors might be supressed rm -rf _build - ${python}/bin/sphinx-build --color -W -b html -a -n . _build + ${python}/bin/sphinx-build --color -W -b html -a -n docs _build ''; serve = @@ -50,7 +50,7 @@ in '' set -euo pipefail - FILES=$(find . -type f -iname '*.rst' | tr '\n' ' ') + FILES=$(find docs -type f -iname '*.rst' | tr '\n' ' ') cat $FILES \ | grep -v '^\(\.\.\| \)' \ @@ -67,7 +67,7 @@ in '' set -euo pipefail - FILES=$(find . -type f -iname '*.rst' | tr '\n' ' ') + FILES=$(find docs -type f -iname '*.rst' | tr '\n' ' ') cat postgrest.dict \ | tail -n+2 \ @@ -81,6 +81,6 @@ in '' set -euo pipefail - ${python}/bin/sphinx-build --color -b linkcheck . _build + ${python}/bin/sphinx-build --color -b linkcheck docs _build ''; } diff --git a/diagrams/README.md b/diagrams/README.md index 36fd9911d0..67009dc31c 100644 --- a/diagrams/README.md +++ b/diagrams/README.md @@ -5,7 +5,7 @@ The ER diagrams were created with https://github.com/BurntSushi/erd/. You can go download erd from https://github.com/BurntSushi/erd/releases and then do: ```bash -./erd_static-x86-64 -i diagrams/film.er -o _static/film.png +./erd_static-x86-64 -i diagrams/film.er -o docs/_static/film.png ``` ## LaTeX @@ -18,7 +18,7 @@ Then use this command to generate the png file. pdflatex --shell-escape -halt-on-error db.tex ## and move it to the static folder(it's not easy to do it in one go with the pdflatex) -mv db.png ../_static/ +mv db.png ../docs/_static/ ``` LaTeX is used because it's a tweakable plain text format. diff --git a/_static/2ndquadrant.png b/docs/_static/2ndquadrant.png similarity index 100% rename from _static/2ndquadrant.png rename to docs/_static/2ndquadrant.png diff --git a/_static/css/custom.css b/docs/_static/css/custom.css similarity index 100% rename from _static/css/custom.css rename to docs/_static/css/custom.css diff --git a/_static/cybertec-new.png b/docs/_static/cybertec-new.png similarity index 100% rename from _static/cybertec-new.png rename to docs/_static/cybertec-new.png diff --git a/_static/cybertec.png b/docs/_static/cybertec.png similarity index 100% rename from _static/cybertec.png rename to docs/_static/cybertec.png diff --git a/_static/db.png b/docs/_static/db.png similarity index 100% rename from _static/db.png rename to docs/_static/db.png diff --git a/_static/empty.png b/docs/_static/empty.png similarity index 100% rename from _static/empty.png rename to docs/_static/empty.png diff --git a/_static/favicon.ico b/docs/_static/favicon.ico similarity index 100% rename from _static/favicon.ico rename to docs/_static/favicon.ico diff --git a/_static/film.png b/docs/_static/film.png similarity index 100% rename from _static/film.png rename to docs/_static/film.png diff --git a/_static/gnuhost.png b/docs/_static/gnuhost.png similarity index 100% rename from _static/gnuhost.png rename to docs/_static/gnuhost.png diff --git a/_static/logo.png b/docs/_static/logo.png similarity index 100% rename from _static/logo.png rename to docs/_static/logo.png diff --git a/_static/oblivious.jpg b/docs/_static/oblivious.jpg similarity index 100% rename from _static/oblivious.jpg rename to docs/_static/oblivious.jpg diff --git a/_static/orders.png b/docs/_static/orders.png similarity index 100% rename from _static/orders.png rename to docs/_static/orders.png diff --git a/_static/retool.png b/docs/_static/retool.png similarity index 100% rename from _static/retool.png rename to docs/_static/retool.png diff --git a/_static/security-anon-choice.png b/docs/_static/security-anon-choice.png similarity index 100% rename from _static/security-anon-choice.png rename to docs/_static/security-anon-choice.png diff --git a/_static/security-roles.png b/docs/_static/security-roles.png similarity index 100% rename from _static/security-roles.png rename to docs/_static/security-roles.png diff --git a/_static/supabase.png b/docs/_static/supabase.png similarity index 100% rename from _static/supabase.png rename to docs/_static/supabase.png diff --git a/_static/timescaledb.png b/docs/_static/timescaledb.png similarity index 100% rename from _static/timescaledb.png rename to docs/_static/timescaledb.png diff --git a/_static/tuts/tut0-request-flow.png b/docs/_static/tuts/tut0-request-flow.png similarity index 100% rename from _static/tuts/tut0-request-flow.png rename to docs/_static/tuts/tut0-request-flow.png diff --git a/_static/tuts/tut1-jwt-io.png b/docs/_static/tuts/tut1-jwt-io.png similarity index 100% rename from _static/tuts/tut1-jwt-io.png rename to docs/_static/tuts/tut1-jwt-io.png diff --git a/_static/win-err-dialog.png b/docs/_static/win-err-dialog.png similarity index 100% rename from _static/win-err-dialog.png rename to docs/_static/win-err-dialog.png diff --git a/admin.rst b/docs/admin.rst similarity index 100% rename from admin.rst rename to docs/admin.rst diff --git a/api.rst b/docs/api.rst similarity index 100% rename from api.rst rename to docs/api.rst diff --git a/auth.rst b/docs/auth.rst similarity index 100% rename from auth.rst rename to docs/auth.rst diff --git a/conf.py b/docs/conf.py similarity index 100% rename from conf.py rename to docs/conf.py diff --git a/configuration.rst b/docs/configuration.rst similarity index 100% rename from configuration.rst rename to docs/configuration.rst diff --git a/ecosystem.rst b/docs/ecosystem.rst similarity index 100% rename from ecosystem.rst rename to docs/ecosystem.rst diff --git a/how-tos/casting-type-to-custom-json.rst b/docs/how-tos/casting-type-to-custom-json.rst similarity index 100% rename from how-tos/casting-type-to-custom-json.rst rename to docs/how-tos/casting-type-to-custom-json.rst diff --git a/how-tos/embedding-table-from-another-schema.rst b/docs/how-tos/embedding-table-from-another-schema.rst similarity index 100% rename from how-tos/embedding-table-from-another-schema.rst rename to docs/how-tos/embedding-table-from-another-schema.rst diff --git a/how-tos/providing-images-for-img.rst b/docs/how-tos/providing-images-for-img.rst similarity index 100% rename from how-tos/providing-images-for-img.rst rename to docs/how-tos/providing-images-for-img.rst diff --git a/index.rst b/docs/index.rst similarity index 100% rename from index.rst rename to docs/index.rst diff --git a/install.rst b/docs/install.rst similarity index 100% rename from install.rst rename to docs/install.rst diff --git a/releases/v5.2.0.rst b/docs/releases/v5.2.0.rst similarity index 100% rename from releases/v5.2.0.rst rename to docs/releases/v5.2.0.rst diff --git a/releases/v6.0.2.rst b/docs/releases/v6.0.2.rst similarity index 100% rename from releases/v6.0.2.rst rename to docs/releases/v6.0.2.rst diff --git a/releases/v7.0.0.rst b/docs/releases/v7.0.0.rst similarity index 100% rename from releases/v7.0.0.rst rename to docs/releases/v7.0.0.rst diff --git a/releases/v7.0.1.rst b/docs/releases/v7.0.1.rst similarity index 100% rename from releases/v7.0.1.rst rename to docs/releases/v7.0.1.rst diff --git a/releases/v8.0.0.rst b/docs/releases/v8.0.0.rst similarity index 100% rename from releases/v8.0.0.rst rename to docs/releases/v8.0.0.rst diff --git a/releases/v9.0.0.rst b/docs/releases/v9.0.0.rst similarity index 100% rename from releases/v9.0.0.rst rename to docs/releases/v9.0.0.rst diff --git a/schema_cache.rst b/docs/schema_cache.rst similarity index 100% rename from schema_cache.rst rename to docs/schema_cache.rst diff --git a/schema_structure.rst b/docs/schema_structure.rst similarity index 100% rename from schema_structure.rst rename to docs/schema_structure.rst diff --git a/tutorials/tut0.rst b/docs/tutorials/tut0.rst similarity index 100% rename from tutorials/tut0.rst rename to docs/tutorials/tut0.rst diff --git a/tutorials/tut1.rst b/docs/tutorials/tut1.rst similarity index 100% rename from tutorials/tut1.rst rename to docs/tutorials/tut1.rst diff --git a/livereload_docs.py b/livereload_docs.py index 7674d11d38..5d0f5db2eb 100755 --- a/livereload_docs.py +++ b/livereload_docs.py @@ -2,12 +2,12 @@ from livereload import Server, shell from subprocess import call ## Build docs at startup -call(['sphinx-build', '-b', 'html', '-a', '-n', '.', '_build']) +call(['sphinx-build', '-b', 'html', '-a', '-n', 'docs', '_build']) server = Server() -server.watch('*.rst', shell('sphinx-build -b html -a -n . _build')) -server.watch('tutorials/*.rst', shell('sphinx-build -b html -a -n . _build')) -server.watch('how-tos/*.rst', shell('sphinx-build -b html -a -n . _build')) -server.watch('releases/*.rst', shell('sphinx-build -b html -a -n . _build')) +server.watch('*.rst', shell('sphinx-build -b html -a -n docs _build')) +server.watch('tutorials/*.rst', shell('sphinx-build -b html -a -n docs _build')) +server.watch('how-tos/*.rst', shell('sphinx-build -b html -a -n docs _build')) +server.watch('releases/*.rst', shell('sphinx-build -b html -a -n docs _build')) # For custom port and host # server.serve(root='_build/', host='192.168.1.2') server.serve(root='_build/') From a4db05aebab3cca4f2d7264c9ec505cabdc70fa9 Mon Sep 17 00:00:00 2001 From: Wolfgang Walther Date: Sun, 30 Jan 2022 14:19:07 +0100 Subject: [PATCH 473/711] Improve docker install examples Removes the PGRST_DB_SCHEMA variable which is public by default now. Removes the PGRST_DB_ANON_ROLE variable, because using the authenticator role or even a superuser is very bad practice. Replaces the postgres superuser with app_user, because using a superuser to connect to postgres is very bad practice. Signed-off-by: Wolfgang Walther --- docs/install.rst | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/docs/install.rst b/docs/install.rst index 6c410455e4..290596b0f2 100644 --- a/docs/install.rst +++ b/docs/install.rst @@ -130,9 +130,7 @@ The first way to run PostgREST in Docker is to connect it to an existing native # Run the server docker run --rm --net=host -p 3000:3000 \ - -e PGRST_DB_URI="postgres://postgres@localhost/postgres" \ - -e PGRST_DB_SCHEMA="public" \ - -e PGRST_DB_ANON_ROLE="postgres" \ + -e PGRST_DB_URI="postgres://app_user:password@localhost/postgres" \ postgrest/postgrest The database connection string above is just an example. Adjust the role and password as necessary. You may need to edit PostgreSQL's :code:`pg_hba.conf` to grant the user local login access. @@ -176,8 +174,6 @@ To avoid having to install the database at all, you can run both it and the serv - "3000:3000" environment: PGRST_DB_URI: postgres://app_user:password@db:5432/app_db - PGRST_DB_SCHEMA: public - PGRST_DB_ANON_ROLE: app_user #In production this role should not be the same as the one used for the connection PGRST_OPENAPI_SERVER_PROXY_URI: http://127.0.0.1:3000 depends_on: - db From 91f1580f954e99f3cdecfe611c676b035de4e683 Mon Sep 17 00:00:00 2001 From: Wolfgang Walther Date: Sun, 30 Jan 2022 14:19:58 +0100 Subject: [PATCH 474/711] Fix warning when using docker host network Resolves #491 Signed-off-by: Wolfgang Walther --- docs/install.rst | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/docs/install.rst b/docs/install.rst index 290596b0f2..eebeeb33a3 100644 --- a/docs/install.rst +++ b/docs/install.rst @@ -129,7 +129,7 @@ The first way to run PostgREST in Docker is to connect it to an existing native .. code-block:: bash # Run the server - docker run --rm --net=host -p 3000:3000 \ + docker run --rm --net=host \ -e PGRST_DB_URI="postgres://app_user:password@localhost/postgres" \ postgrest/postgrest @@ -155,6 +155,15 @@ The database connection string above is just an example. Adjust the role and pas host all all 10.0.0.10/32 trust + The docker command will then look like this: + + .. code-block:: bash + + # Run the server + docker run --rm -p 3000:3000 \ + -e PGRST_DB_URI="postgres://app_user:password@10.0.0.10/postgres" \ + postgrest/postgrest + .. _pg-in-docker: Containerized PostgREST *and* db with docker-compose From e7e102bc4281fc654f98f384c7d0b374b6ba22b2 Mon Sep 17 00:00:00 2001 From: Wolfgang Walther Date: Sun, 30 Jan 2022 11:09:41 +0100 Subject: [PATCH 475/711] ci: switch to GitHub Actions Signed-off-by: Wolfgang Walther --- .circleci/config.yml | 45 --------------------------------------- .github/dependabot.yml | 6 ++++++ .github/workflows/ci.yaml | 40 ++++++++++++++++++++++++++++++++++ 3 files changed, 46 insertions(+), 45 deletions(-) delete mode 100644 .circleci/config.yml create mode 100644 .github/dependabot.yml create mode 100644 .github/workflows/ci.yaml diff --git a/.circleci/config.yml b/.circleci/config.yml deleted file mode 100644 index 36c6ba737f..0000000000 --- a/.circleci/config.yml +++ /dev/null @@ -1,45 +0,0 @@ -version: 2.1 - -jobs: - build: - docker: - - image: nixos/nix:2.3 - steps: - - checkout - - run: - name: Install build script - command: nix-env -f default.nix -iA build - - run: - name: Build docs - command: postgrest-docs-build - - spellcheck: - docker: - - image: nixos/nix:2.3 - steps: - - checkout - - run: - name: Install spellcheck script - command: nix-env -f default.nix -iA spellcheck - - run: - name: Run spellcheck - command: postgrest-docs-spellcheck - - linkcheck: - docker: - - image: nixos/nix:2.3 - steps: - - checkout - - run: - name: Install linkcheck script - command: nix-env -f default.nix -iA linkcheck - - run: - name: Run linkcheck - command: postgrest-docs-linkcheck - -workflows: - check: - jobs: - - build - - spellcheck - - linkcheck diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 0000000000..e2347a8c76 --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,6 @@ +version: 2 +updates: +- package-ecosystem: github-actions + directory: / + schedule: + interval: weekly diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml new file mode 100644 index 0000000000..4f4c763493 --- /dev/null +++ b/.github/workflows/ci.yaml @@ -0,0 +1,40 @@ +name: CI + +on: + push: + branches: + - main + - v* + pull_request: + branches: + - main + - v* + +jobs: + build: + name: Build docs + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2.4.0 + - uses: cachix/install-nix-action@v16 + - run: nix-env -f default.nix -iA build + - run: postgrest-docs-build + + spellcheck: + name: Run spellcheck + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2.4.0 + - uses: cachix/install-nix-action@v16 + - run: nix-env -f default.nix -iA spellcheck + - run: postgrest-docs-spellcheck + + linkcheck: + name: Run linkcheck + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2.4.0 + - uses: cachix/install-nix-action@v16 + - run: nix-env -f default.nix -iA linkcheck + - run: postgrest-docs-linkcheck + From 43a92d4e6b78f18650fbaf111f9b2c28472b4ae2 Mon Sep 17 00:00:00 2001 From: Wolfgang Walther Date: Sun, 30 Jan 2022 13:57:32 +0100 Subject: [PATCH 476/711] ci: Only run linkcheck in pull requests to main branch Avoids running linkcheck on back branches, where links are outdated anyway. Signed-off-by: Wolfgang Walther --- .github/workflows/ci.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 4f4c763493..b03dadad10 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -31,6 +31,7 @@ jobs: linkcheck: name: Run linkcheck + if: github.base_ref == 'main' runs-on: ubuntu-latest steps: - uses: actions/checkout@v2.4.0 From 71dd891d2f8309c6c58a1f6ed88d1f32bac8f203 Mon Sep 17 00:00:00 2001 From: Wolfgang Walther Date: Thu, 3 Feb 2022 07:49:49 +0100 Subject: [PATCH 477/711] fix postgrest-serve after move to docs/ folder Signed-off-by: Wolfgang Walther --- livereload_docs.py | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/livereload_docs.py b/livereload_docs.py index 5d0f5db2eb..8dae165774 100755 --- a/livereload_docs.py +++ b/livereload_docs.py @@ -4,10 +4,7 @@ ## Build docs at startup call(['sphinx-build', '-b', 'html', '-a', '-n', 'docs', '_build']) server = Server() -server.watch('*.rst', shell('sphinx-build -b html -a -n docs _build')) -server.watch('tutorials/*.rst', shell('sphinx-build -b html -a -n docs _build')) -server.watch('how-tos/*.rst', shell('sphinx-build -b html -a -n docs _build')) -server.watch('releases/*.rst', shell('sphinx-build -b html -a -n docs _build')) +server.watch('docs/**/*.rst', shell('sphinx-build -b html -a -n docs _build')) # For custom port and host # server.serve(root='_build/', host='192.168.1.2') server.serve(root='_build/') From 9c0db849ce6f46cd618555c5bd7b2375c724745c Mon Sep 17 00:00:00 2001 From: Wolfgang Walther Date: Thu, 3 Feb 2022 07:50:55 +0100 Subject: [PATCH 478/711] Move JSON Columns and Computed Columns sections one level up Both of those are about select and filters - so do not belong into "Vertical Filtering" only. Signed-off-by: Wolfgang Walther --- docs/api.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/api.rst b/docs/api.rst index 6367d4a3b5..92dd04fbe6 100644 --- a/docs/api.rst +++ b/docs/api.rst @@ -270,7 +270,7 @@ Casting the columns is possible by suffixing them with the double colon ``::`` p .. _json_columns: JSON Columns -~~~~~~~~~~~~ +------------ You can specify a path for a ``json`` or ``jsonb`` column using the arrow operators(``->`` or ``->>``) as per the `PostgreSQL docs `_. @@ -351,7 +351,7 @@ Note that ``->>`` is used to compare ``blood_type`` as ``text``. To compare with .. _computed_cols: Computed Columns -~~~~~~~~~~~~~~~~ +---------------- Filters may be applied to computed columns(**a.k.a. virtual columns**) as well as actual table/view columns, even though the computed columns will not appear in the output. For example, to search first and last names at once we can create a computed column that will not appear in the output but can be used in a filter: From 4d6909a08f654628458855776e17b5f1c28037fa Mon Sep 17 00:00:00 2001 From: Wolfgang Walther Date: Thu, 3 Feb 2022 08:05:01 +0100 Subject: [PATCH 479/711] Mention computed columns can be on the extra search path. Signed-off-by: Wolfgang Walther --- docs/api.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/api.rst b/docs/api.rst index 92dd04fbe6..a95f1118c8 100644 --- a/docs/api.rst +++ b/docs/api.rst @@ -396,7 +396,7 @@ As mentioned, computed columns do not appear in the output by default. However y .. important:: - Computed columns must be created under the :ref:`exposed schema ` to be used in this way. + Computed columns must be created in the :ref:`exposed schema ` or in a schema in the :ref:`extra search path ` to be used in this way. Unicode support --------------- From 6aeb5065f8f901888e325400fca93a31e70fa023 Mon Sep 17 00:00:00 2001 From: Wolfgang Walther Date: Thu, 3 Feb 2022 08:06:01 +0100 Subject: [PATCH 480/711] Add docs about accessing array items and fields of composite types with JSON operators. Added in https://github.com/PostgREST/postgrest/pull/2145 Signed-off-by: Wolfgang Walther --- docs/api.rst | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/docs/api.rst b/docs/api.rst index a95f1118c8..2cac9c2a22 100644 --- a/docs/api.rst +++ b/docs/api.rst @@ -269,10 +269,10 @@ Casting the columns is possible by suffixing them with the double colon ``::`` p .. _json_columns: -JSON Columns ------------- +Array / Composite / JSON Columns +-------------------------------- -You can specify a path for a ``json`` or ``jsonb`` column using the arrow operators(``->`` or ``->>``) as per the `PostgreSQL docs `_. +You can specify a path for a ``json`` or ``jsonb`` column using the arrow operators(``->`` or ``->>``) as per the `PostgreSQL docs `_. This also works for array items and fields of composite types. .. tabs:: @@ -348,10 +348,19 @@ Note that ``->>`` is used to compare ``blood_type`` as ``text``. To compare with { "id": 15, "age": 35 } ] + +.. important:: + + When using the ``->`` and ``->>`` operators, PostgREST uses a query like ``to_jsonb()->'field'``. To make filtering and ordering on those nested fields use an index, the index needs to be created on the same expression, including the ``to_jsonb(...)`` call: + + .. code-block:: postgres + + CREATE INDEX ON mytable ((to_jsonb(data) -> 'identification' ->> 'registration_number')); + .. _computed_cols: -Computed Columns ----------------- +Computed / Virtual Columns +-------------------------- Filters may be applied to computed columns(**a.k.a. virtual columns**) as well as actual table/view columns, even though the computed columns will not appear in the output. For example, to search first and last names at once we can create a computed column that will not appear in the output but can be used in a filter: @@ -537,7 +546,7 @@ If you care where nulls are sorted, add ``nullsfirst`` or ``nullslast``: curl "http://localhost:3000/people?order=age.desc.nullslast" -You can also use :ref:`computed_cols` to order the results, even though the computed columns will not appear in the output. +You can also use :ref:`computed_cols` to order the results, even though the computed columns will not appear in the output. You can sort by nested fields of :ref:`json_columns` with the JSON operators. .. _limits: From 9049ed1f7139e231142aae48eeb14ceec34b4373 Mon Sep 17 00:00:00 2001 From: Electronoob Date: Tue, 8 Feb 2022 01:28:16 +0000 Subject: [PATCH 481/711] updated the example config switch replacing postgrest 2 with postgrest -e --- docs/install.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/install.rst b/docs/install.rst index eebeeb33a3..5ab43ba111 100644 --- a/docs/install.rst +++ b/docs/install.rst @@ -86,7 +86,7 @@ The PostgREST server reads a configuration file as its only argument: postgrest /path/to/postgrest.conf # You can also generate a sample config file with - # postgrest 2> postgrest.conf + # postgrest -e > postgrest.conf # You'll need to edit this file and remove the usage parts for postgrest to read it For a complete reference of the configuration file, see :ref:`configuration`. From b209731ff326b050e4491ab571bce8dff01bfc7c Mon Sep 17 00:00:00 2001 From: Steve Chavez Date: Wed, 9 Feb 2022 14:17:22 -0500 Subject: [PATCH 482/711] Add admin section on file descriptors (#504) --- docs/admin.rst | 12 ++++++++++++ postgrest.dict | 1 + 2 files changed, 13 insertions(+) diff --git a/docs/admin.rst b/docs/admin.rst index c319c29c47..d487062ed5 100644 --- a/docs/admin.rst +++ b/docs/admin.rst @@ -256,6 +256,7 @@ Schema Reloading Changing the schema while the server is running can lead to errors due to a stale schema cache. To learn how to refresh the cache see :ref:`schema_reloading`. + Daemonizing =========== @@ -295,6 +296,17 @@ After that, you can enable the service at boot time and start it with: ## For reloading the service ## systemctl restart postgrest +File Descriptors +---------------- + +File descriptors are kernel resources that are used by HTTP connections (among others). File descriptors are limited per process. The kernel default limit is 1024, which is increased in some Linux distributions. +When under heavy traffic, PostgREST can reach this limit and start showing ``No file descriptors available`` errors. To clear these errors, you can increase the process' file descriptor limit. + +.. code-block:: ini + + [Service] + LimitNOFILE=10000 + Alternate URL Structure ======================= diff --git a/postgrest.dict b/postgrest.dict index 16a91dd584..60c7055c13 100644 --- a/postgrest.dict +++ b/postgrest.dict @@ -51,6 +51,7 @@ Haskell Heroku HMAC Homebrew +HTTP HTTPS HV Ibarluzea From abe0daa3dcd9398da6a3a7cd2e25b94766dc78c3 Mon Sep 17 00:00:00 2001 From: Laurence Isla Date: Tue, 15 Feb 2022 14:20:12 -0500 Subject: [PATCH 483/711] Add example for array and composite type columns --- docs/api.rst | 44 +++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 43 insertions(+), 1 deletion(-) diff --git a/docs/api.rst b/docs/api.rst index 2cac9c2a22..6856e6e811 100644 --- a/docs/api.rst +++ b/docs/api.rst @@ -272,7 +272,14 @@ Casting the columns is possible by suffixing them with the double colon ``::`` p Array / Composite / JSON Columns -------------------------------- -You can specify a path for a ``json`` or ``jsonb`` column using the arrow operators(``->`` or ``->>``) as per the `PostgreSQL docs `_. This also works for array items and fields of composite types. +You can specify a path for a ``json`` or ``jsonb`` column using the arrow operators(``->`` or ``->>``) as per the `PostgreSQL docs `_. + +.. code-block:: postgres + + CREATE TABLE people ( + id int, + json_data json + ); .. tabs:: @@ -348,6 +355,41 @@ Note that ``->>`` is used to compare ``blood_type`` as ``text``. To compare with { "id": 15, "age": 35 } ] +The arrow operators are also used for array and composite type columns. + +.. code-block:: postgres + + CREATE TYPE coordinates ( + lat decimal(8,6), + long decimal(9,6) + ); + + CREATE TABLE countries ( + id int, + location coordinates, + languages text[] + ); + +.. tabs:: + + .. code-tab:: http + + GET /countries?select=id,location->>lat,location->>long,primary_language:languages->0&location->lat=gte.19 HTTP/1.1 + + .. code-tab:: bash Curl + + curl "http://localhost:3000/countries?select=id,location->>lat,location->>long,primary_language:languages->0&location->lat=gte.19" + +.. code-block:: json + + [ + { + "id": 5, + "lat": "19.741755", + "long": "-155.844437", + "primary_language": "en" + } + ] .. important:: From fbe317b2444ef0ae0a0b550906b27537bc2394c1 Mon Sep 17 00:00:00 2001 From: Adam Kliment <79609+netmilk@users.noreply.github.com> Date: Tue, 22 Feb 2022 17:48:22 +0100 Subject: [PATCH 484/711] Update auth.rst (#507) --- docs/auth.rst | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/docs/auth.rst b/docs/auth.rst index 867339cbc9..94e449db58 100644 --- a/docs/auth.rst +++ b/docs/auth.rst @@ -93,9 +93,18 @@ Alternately database roles can represent groups instead of (or in addition to) i SQL code can access claims through GUC variables set by PostgREST per request. For instance to get the email claim, call this function: +For PostgreSQL server version >= 14 + .. code:: sql current_setting('request.jwt.claims', true)::json->>'email'; + + +For PostgreSQL server version < 14 + +.. code:: sql + + current_setting('request.jwt.claim.email', true); This allows JWT generation services to include extra information and your database code to react to it. For instance the RLS example could be modified to use this current_setting rather than current_user. The second 'true' argument tells current_setting to return NULL if the setting is missing from the current configuration. From 4aff0caa59b88b3c828fb12bcdfc13e0f797f532 Mon Sep 17 00:00:00 2001 From: Laurence Isla Date: Wed, 23 Feb 2022 17:25:07 -0500 Subject: [PATCH 485/711] Add documentation on the minimal health check --- docs/admin.rst | 29 +++++++++++++++++++++++++++++ docs/configuration.rst | 22 ++++++++++++++++++---- 2 files changed, 47 insertions(+), 4 deletions(-) diff --git a/docs/admin.rst b/docs/admin.rst index d487062ed5..f2f0ad8f80 100644 --- a/docs/admin.rst +++ b/docs/admin.rst @@ -256,6 +256,35 @@ Schema Reloading Changing the schema while the server is running can lead to errors due to a stale schema cache. To learn how to refresh the cache see :ref:`schema_reloading`. +.. _health_check: + +Health Check +------------ + +You can enable a minimal health check to verify if PostgREST is available for client requests and to check the status of its internal state. + +To do this, set the configuration variable :ref:`admin-server-port` to the port number of your preference. Two endpoints ``live`` and ``ready`` will then be available. + +The ``live`` endpoint verifies if PostgREST is running on its configured port. A request will return ``200 OK`` if PostgREST is alive or ``503`` otherwise. + +The ``ready`` endpoint also checks the state of both the Database Connection and the :ref:`schema_cache`. A request will return ``200 OK`` if it is ready or ``503`` if not. + +For instance, to verify if PostgREST is running at ``localhost:3000`` while the ``admin-server-port`` is set to ``3001``: + +.. tabs:: + + .. code-tab:: http + + GET localhost:3001/live HTTP/1.1 + + .. code-tab:: bash Curl + + curl -I "http://localhost:3001/live" + +.. code-block:: http + + HTTP/1.1 200 OK + Daemonizing =========== diff --git a/docs/configuration.rst b/docs/configuration.rst index 422093d36c..57c22199b5 100644 --- a/docs/configuration.rst +++ b/docs/configuration.rst @@ -105,6 +105,7 @@ It's not possible to change :ref:`env_variables_config` for a running process an The following settings will not be reloaded. You will need to restart PostgREST to change those. + * :ref:`admin-server-port` * :ref:`db-uri` * :ref:`db-pool` * :ref:`db-pool-timeout` @@ -145,6 +146,7 @@ List of parameters ======================== ======= ================= ========== Name Type Default Reloadable ======================== ======= ================= ========== +admin-server-port Int app.settings.* String Y db-anon-role String Y db-channel String pgrst Y @@ -174,6 +176,18 @@ server-unix-socket String server-unix-socket-mode String 660 ======================== ======= ================= ========== +.. _admin-server-port: + +admin-server-port +----------------- + + =============== ======================= + **Environment** PGRST_ADMIN_SERVER_PORT + **In-Database** `n/a` + =============== ======================= + +Specifies the port for the :ref:`health_check` endpoints. + .. _app.settings.*: app.settings.* @@ -589,7 +603,7 @@ server-host =============== ================= **Environment** PGRST_SERVER_HOST - **In-Database** pgrst.server_host + **In-Database** `n/a` =============== ================= Where to bind the PostgREST web server. In addition to the usual address options, PostgREST interprets these reserved addresses with special meanings: @@ -607,7 +621,7 @@ server-port =============== ================= **Environment** PGRST_SERVER_PORT - **In-Database** pgrst.server_port + **In-Database** `n/a` =============== ================= The TCP port to bind the web server. @@ -619,7 +633,7 @@ server-unix-socket =============== ================= **Environment** PGRST_SERVER_UNIX_SOCKET - **In-Database** pgrst.server_unix_socket + **In-Database** `n/a` =============== ================= `Unix domain socket `_ where to bind the PostgREST web server. @@ -636,7 +650,7 @@ server-unix-socket-mode =============== ================= **Environment** PGRST_SERVER_UNIX_SOCKET_MODE - **In-Database** pgrst.server_unix_socket_mode + **In-Database** `n/a` =============== ================= `Unix file mode `_ to be set for the socket specified in :ref:`server-unix-socket` From e9ef876433348a76e32320857ad4edf0de207041 Mon Sep 17 00:00:00 2001 From: Wolfgang Walther Date: Tue, 8 Feb 2022 09:07:02 +0100 Subject: [PATCH 486/711] Add hint on how to prevent exposing computed columns as RPCs Signed-off-by: Wolfgang Walther --- docs/api.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/api.rst b/docs/api.rst index 6856e6e811..ab4f997fbe 100644 --- a/docs/api.rst +++ b/docs/api.rst @@ -447,7 +447,7 @@ As mentioned, computed columns do not appear in the output by default. However y .. important:: - Computed columns must be created in the :ref:`exposed schema ` or in a schema in the :ref:`extra search path ` to be used in this way. + Computed columns must be created in the :ref:`exposed schema ` or in a schema in the :ref:`extra search path ` to be used in this way. When placing the computed column in the :ref:`exposed schema ` you can use an **unnamed** argument, as in the example above, to prevent it from being exposed as an :ref:`RPC ` under ``/rpc``. Unicode support --------------- From 98976e4d57b862e4b177438763aae351c02ecdab Mon Sep 17 00:00:00 2001 From: Laurence Isla Date: Fri, 4 Mar 2022 20:04:49 -0500 Subject: [PATCH 487/711] Add how-to for working with PostgreSQL data types --- .../working-with-postgresql-data-types.rst | 80 +++++++++++++++++++ docs/index.rst | 1 + postgrest.dict | 1 + 3 files changed, 82 insertions(+) create mode 100644 docs/how-tos/working-with-postgresql-data-types.rst diff --git a/docs/how-tos/working-with-postgresql-data-types.rst b/docs/how-tos/working-with-postgresql-data-types.rst new file mode 100644 index 0000000000..7cba0a979d --- /dev/null +++ b/docs/how-tos/working-with-postgresql-data-types.rst @@ -0,0 +1,80 @@ +.. _working_with_types: + +Working with PostgreSQL data types +================================== + +PostgREST makes use of PostgreSQL string representations to work with data types. Thanks to this, you can use special values, such as ``now`` for timestamps, ``yes`` for booleans or time values including the time zones. This page describes how you can take advantage of these string representations to perform operations on different PostgreSQL data types. + +Timestamps +---------- + +You can use the **time zone** to filter or send data if needed. Let's use this table as an example: + +.. code-block:: postgres + + create table reports ( + id int primary key + , due_date timestamptz + ); + +Suppose you are located in Sydney and want create a report with the date in the local time zone. Your request should look like this: + +.. tabs:: + + .. code-tab:: http + + POST /reports HTTP/1.1 + Content-Type: application/json + + [{ "id": 1, "due_date": "2022-02-24 11:10:15 Australia/Sydney" }, + { "id": 2, "due_date": "2022-02-27 22:00:00 Australia/Sydney" }] + + .. code-tab:: bash Curl + + curl "http://localhost:3000/reports" \ + -X POST -H "Content-Type: application/json" \ + -d '[{ "id": 1, "due_date": "2022-02-24 11:10:15 Australia/Sydney" },{ "id": 2, "due_date": "2022-02-27 22:00:00 Australia/Sydney" }]' + +Someone located in Cairo can retrieve the data using their local time, too: + +.. tabs:: + + .. code-tab:: http + + GET /reports?due_date=eq.2022-02-24+02:10:15+Africa/Cairo HTTP/1.1 + + .. code-tab:: bash Curl + + curl "http://localhost:3000/reports?due_date=eq.2022-02-24+02:10:15+Africa/Cairo" + +.. code-block:: json + + [ + { + "id": 1, + "due_date": "2022-02-23T19:10:15-05:00" + } + ] + +The response has the date in the time zone configured by the server: ``UTC -05:00``. + +You can use other comparative filters and also `PostgreSQL special date/time input values `_. For instance, to get the reports that are due after today you would do: + +.. tabs:: + + .. code-tab:: http + + GET /reports?due_date=gt.today HTTP/1.1 + + .. code-tab:: bash Curl + + curl "http://localhost:3000/reports?due_date=gt.today" + +.. code-block:: json + + [ + { + "id": 2, + "due_date": "2022-02-27T06:00:00-05:00" + } + ] diff --git a/docs/index.rst b/docs/index.rst index 3d522585d7..8fa7b04f76 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -201,6 +201,7 @@ These are recipes that'll help you address specific use-cases. - :doc:`how-tos/embedding-table-from-another-schema` - :doc:`how-tos/providing-images-for-img` - `How PostgreSQL triggers work when called with a PostgREST PATCH HTTP request `_ +- :doc:`how-tos/working-with-postgresql-data-types` Ecosystem --------- diff --git a/postgrest.dict b/postgrest.dict index 60c7055c13..1ac2dd9766 100644 --- a/postgrest.dict +++ b/postgrest.dict @@ -11,6 +11,7 @@ authenticator backoff balancer Beles +booleans Bouscal buildpack Cardano From ea58095e92bac0ad5f5af826aec2145d67fd82db Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 8 Mar 2022 01:56:21 +0100 Subject: [PATCH 488/711] Bump actions/checkout from 2.4.0 to 3 (#512) --- .github/workflows/ci.yaml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index b03dadad10..fb815e2ccf 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -15,7 +15,7 @@ jobs: name: Build docs runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2.4.0 + - uses: actions/checkout@v3 - uses: cachix/install-nix-action@v16 - run: nix-env -f default.nix -iA build - run: postgrest-docs-build @@ -24,7 +24,7 @@ jobs: name: Run spellcheck runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2.4.0 + - uses: actions/checkout@v3 - uses: cachix/install-nix-action@v16 - run: nix-env -f default.nix -iA spellcheck - run: postgrest-docs-spellcheck @@ -34,7 +34,7 @@ jobs: if: github.base_ref == 'main' runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2.4.0 + - uses: actions/checkout@v3 - uses: cachix/install-nix-action@v16 - run: nix-env -f default.nix -iA linkcheck - run: postgrest-docs-linkcheck From 1489fc84b8a28d61936b2d2c8ed0ca7f68147159 Mon Sep 17 00:00:00 2001 From: Laurence Isla Date: Mon, 14 Mar 2022 14:56:34 -0500 Subject: [PATCH 489/711] Recommend specifying host names for health check (#514) In case of multiple network interfaces --- docs/admin.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/admin.rst b/docs/admin.rst index f2f0ad8f80..acdfc29a1b 100644 --- a/docs/admin.rst +++ b/docs/admin.rst @@ -285,6 +285,7 @@ For instance, to verify if PostgREST is running at ``localhost:3000`` while the HTTP/1.1 200 OK +If you have a machine with multiple network interfaces and multiple PostgREST instances in the same port, you need to specify a unique :ref:`hostname ` in the configuration of each PostgREST instance for the health check to work correctly. Don't use the special values(``!4``, ``*``, etc) in this case because the health check could report a false positive. Daemonizing =========== From 8f989480783ab05067e66fe623be7974b83950d1 Mon Sep 17 00:00:00 2001 From: Laurence Isla Date: Mon, 14 Mar 2022 15:03:01 -0500 Subject: [PATCH 490/711] Add Errors reference (#430) * Adds PostgREST' error codes * Move error information to a dedicated reference page * Organize errors into tables --- docs/_static/css/custom.css | 8 + docs/admin.rst | 5 + docs/api.rst | 89 ++--------- docs/errors.rst | 301 ++++++++++++++++++++++++++++++++++++ docs/index.rst | 7 + docs/schema_cache.rst | 12 +- docs/tutorials/tut0.rst | 2 +- docs/tutorials/tut1.rst | 7 +- postgrest.dict | 2 + 9 files changed, 356 insertions(+), 77 deletions(-) create mode 100644 docs/errors.rst diff --git a/docs/_static/css/custom.css b/docs/_static/css/custom.css index 6015b6d486..fc7f2edb68 100644 --- a/docs/_static/css/custom.css +++ b/docs/_static/css/custom.css @@ -57,3 +57,11 @@ div.line-block { margin-right: auto; margin-bottom: 24px; } + +.wy-table-responsive table td { + white-space: normal !important; +} + +.wy-table-responsive { + overflow: visible !important; +} diff --git a/docs/admin.rst b/docs/admin.rst index acdfc29a1b..e7a7448f98 100644 --- a/docs/admin.rst +++ b/docs/admin.rst @@ -153,6 +153,11 @@ Server Version When debugging a problem it's important to verify the PostgREST version. At any time you can make a request to the running server and determine exactly which version is deployed. Look for the :code:`Server` HTTP response header, which contains the version number. +Errors +------ + +See the :doc:`Errors ` reference page for detailed information on the errors that PostgREST returns. + .. _pgrst_logging: Logging diff --git a/docs/api.rst b/docs/api.rst index ab4f997fbe..7acaafa366 100644 --- a/docs/api.rst +++ b/docs/api.rst @@ -539,6 +539,8 @@ Here ``Quote:"`` and ``Backslash:\`` are percent-encoded values. Note that ``%5C Some HTTP libraries might encode URLs automatically(e.g. :code:`axios`). In these cases you should use double quotes :code:`""` directly instead of :code:`%22`. +.. _ordering: + Ordering -------- @@ -827,7 +829,9 @@ When a singular response is requested but no entries are found, the server respo { "message": "JSON object requested, multiple (or no) rows returned", - "details": "Results contain 0 rows, application/vnd.pgrst.object+json requires 1 row" + "details": "Results contain 0 rows, application/vnd.pgrst.object+json requires 1 row", + "hint": null, + "code": "PGRST505" } .. note:: @@ -1714,6 +1718,8 @@ By specifying the ``on_conflict`` query parameter, you can make UPSERT work on a ] EOF +.. _upsert_put: + PUT ~~~ @@ -2636,8 +2642,10 @@ You can set the ``response.status`` GUC to override the default status code Post HTTP/1.1 418 I'm a teapot - {"message" : "The requested entity body is short and stout.", - "hint" : "Tip it over and pour it out."} + { + "message" : "The requested entity body is short and stout.", + "hint" : "Tip it over and pour it out." + } If the status code is standard, PostgREST will complete the status message(**I'm a teapot** in this example). @@ -2693,72 +2701,9 @@ Returns: HTTP/1.1 402 Payment Required Content-Type: application/json; charset=utf-8 - {"hint":"Upgrade your plan","details":"Quota exceeded"} - -.. _status_codes: - -HTTP Status Codes ------------------ - -PostgREST translates `PostgreSQL error codes `_ into HTTP status as follows: - -+--------------------------+-------------------------+---------------------------------+ -| PostgreSQL error code(s) | HTTP status | Error description | -+==========================+=========================+=================================+ -| 08* | 503 | pg connection err | -+--------------------------+-------------------------+---------------------------------+ -| 09* | 500 | triggered action exception | -+--------------------------+-------------------------+---------------------------------+ -| 0L* | 403 | invalid grantor | -+--------------------------+-------------------------+---------------------------------+ -| 0P* | 403 | invalid role specification | -+--------------------------+-------------------------+---------------------------------+ -| 23503 | 409 | foreign key violation | -+--------------------------+-------------------------+---------------------------------+ -| 23505 | 409 | uniqueness violation | -+--------------------------+-------------------------+---------------------------------+ -| 25006 | 405 | read only sql transaction | -+--------------------------+-------------------------+---------------------------------+ -| 25* | 500 | invalid transaction state | -+--------------------------+-------------------------+---------------------------------+ -| 28* | 403 | invalid auth specification | -+--------------------------+-------------------------+---------------------------------+ -| 2D* | 500 | invalid transaction termination | -+--------------------------+-------------------------+---------------------------------+ -| 38* | 500 | external routine exception | -+--------------------------+-------------------------+---------------------------------+ -| 39* | 500 | external routine invocation | -+--------------------------+-------------------------+---------------------------------+ -| 3B* | 500 | savepoint exception | -+--------------------------+-------------------------+---------------------------------+ -| 40* | 500 | transaction rollback | -+--------------------------+-------------------------+---------------------------------+ -| 53* | 503 | insufficient resources | -+--------------------------+-------------------------+---------------------------------+ -| 54* | 413 | too complex | -+--------------------------+-------------------------+---------------------------------+ -| 55* | 500 | obj not in prerequisite state | -+--------------------------+-------------------------+---------------------------------+ -| 57* | 500 | operator intervention | -+--------------------------+-------------------------+---------------------------------+ -| 58* | 500 | system error | -+--------------------------+-------------------------+---------------------------------+ -| F0* | 500 | config file error | -+--------------------------+-------------------------+---------------------------------+ -| HV* | 500 | foreign data wrapper error | -+--------------------------+-------------------------+---------------------------------+ -| P0001 | 400 | default code for "raise" | -+--------------------------+-------------------------+---------------------------------+ -| P0* | 500 | PL/pgSQL error | -+--------------------------+-------------------------+---------------------------------+ -| XX* | 500 | internal error | -+--------------------------+-------------------------+---------------------------------+ -| 42883 | 404 | undefined function | -+--------------------------+-------------------------+---------------------------------+ -| 42P01 | 404 | undefined table | -+--------------------------+-------------------------+---------------------------------+ -| 42501 | | if authenticated 403, | insufficient privileges | -| | | else 401 | | -+--------------------------+-------------------------+---------------------------------+ -| other | 400 | | -+--------------------------+-------------------------+---------------------------------+ + { + "message": "Payment Required", + "details": "Quota exceeded", + "hint": "Upgrade your plan", + "code": "PT402" + } diff --git a/docs/errors.rst b/docs/errors.rst new file mode 100644 index 0000000000..39fa807a43 --- /dev/null +++ b/docs/errors.rst @@ -0,0 +1,301 @@ +.. _error_source: + +Error Source +============ + +For the most part, error messages will come directly from the database with the same `format that PostgreSQL uses `_, in other words, PostgREST will convert the ``MESSAGE``, ``DETAIL``, ``HINT`` and ``ERRCODE`` from the PostgreSQL error to JSON format and add an HTTP status code to the response (see :ref:`status_codes`). For instance, this is the error you will get when querying a nonexistent table: + +.. code-block:: http + + GET /nonexistent_table?id=eq.1 HTTP/1.1 + +.. code-block:: json + + { + "hint": null, + "details": null, + "code": "42P01", + "message": "relation \"api.nonexistent_table\" does not exist" + } + +However, some errors do come from PostgREST itself (such as those related to the :ref:`schema_cache`). These have the same structure as the PostgreSQL errors (message, details, hint and code) but are differentiated by the ``PGRST`` prefix in the ``code`` field (see :ref:`pgrst_errors`). For instance, when querying a function that does not exist, the error will be: + +.. code-block:: http + + POST /rpc/nonexistent_function HTTP/1.1 + +.. code-block:: json + + { + "hint": "If a new function was created in the database with this name and parameters, try reloading the schema cache.", + "details": null + "code": "PGRST202", + "message": "Could not find the api.nonexistent_function() function in the schema cache" + } + +.. _status_codes: + +HTTP Status Codes +================= + +PostgREST translates `PostgreSQL error codes `_ into HTTP status as follows: + ++--------------------------+-------------------------+---------------------------------+ +| PostgreSQL error code(s) | HTTP status | Error description | ++==========================+=========================+=================================+ +| 08* | 503 | pg connection err | ++--------------------------+-------------------------+---------------------------------+ +| 09* | 500 | triggered action exception | ++--------------------------+-------------------------+---------------------------------+ +| 0L* | 403 | invalid grantor | ++--------------------------+-------------------------+---------------------------------+ +| 0P* | 403 | invalid role specification | ++--------------------------+-------------------------+---------------------------------+ +| 23503 | 409 | foreign key violation | ++--------------------------+-------------------------+---------------------------------+ +| 23505 | 409 | uniqueness violation | ++--------------------------+-------------------------+---------------------------------+ +| 25006 | 405 | read only sql transaction | ++--------------------------+-------------------------+---------------------------------+ +| 25* | 500 | invalid transaction state | ++--------------------------+-------------------------+---------------------------------+ +| 28* | 403 | invalid auth specification | ++--------------------------+-------------------------+---------------------------------+ +| 2D* | 500 | invalid transaction termination | ++--------------------------+-------------------------+---------------------------------+ +| 38* | 500 | external routine exception | ++--------------------------+-------------------------+---------------------------------+ +| 39* | 500 | external routine invocation | ++--------------------------+-------------------------+---------------------------------+ +| 3B* | 500 | savepoint exception | ++--------------------------+-------------------------+---------------------------------+ +| 40* | 500 | transaction rollback | ++--------------------------+-------------------------+---------------------------------+ +| 53* | 503 | insufficient resources | ++--------------------------+-------------------------+---------------------------------+ +| 54* | 413 | too complex | ++--------------------------+-------------------------+---------------------------------+ +| 55* | 500 | obj not in prerequisite state | ++--------------------------+-------------------------+---------------------------------+ +| 57* | 500 | operator intervention | ++--------------------------+-------------------------+---------------------------------+ +| 58* | 500 | system error | ++--------------------------+-------------------------+---------------------------------+ +| F0* | 500 | config file error | ++--------------------------+-------------------------+---------------------------------+ +| HV* | 500 | foreign data wrapper error | ++--------------------------+-------------------------+---------------------------------+ +| P0001 | 400 | default code for "raise" | ++--------------------------+-------------------------+---------------------------------+ +| P0* | 500 | PL/pgSQL error | ++--------------------------+-------------------------+---------------------------------+ +| XX* | 500 | internal error | ++--------------------------+-------------------------+---------------------------------+ +| 42883 | 404 | undefined function | ++--------------------------+-------------------------+---------------------------------+ +| 42P01 | 404 | undefined table | ++--------------------------+-------------------------+---------------------------------+ +| 42501 | | if authenticated 403, | insufficient privileges | +| | | else 401 | | ++--------------------------+-------------------------+---------------------------------+ +| other | 400 | | ++--------------------------+-------------------------+---------------------------------+ + +.. _pgrst_errors: + +PostgREST Error Codes +===================== + +PostgREST error codes have the form ``PGRSTgxx``, where ``PGRST`` is the prefix that differentiates the error from a PostgreSQL error, ``g`` is the group where the error belongs and ``xx`` is the number that identifies the error in the group. + +.. _pgrst0**: + +Group 0 - Connection +-------------------- + +Related to the connection with the database. + ++---------------+-------------------------------------------------------------+ +| Code | Description | ++===============+=============================================================+ +| .. _pgrst000: | Could not connect with the database due to an incorrect | +| | :ref:`db-uri` or due to the PostgreSQL service not running. | +| PGRST000 | | ++---------------+-------------------------------------------------------------+ +| .. _pgrst001: | Could not connect with the database due to an internal | +| | error. | +| PGRST001 | | ++---------------+-------------------------------------------------------------+ +| .. _pgrst002: | Could not connect with the database when building the | +| | :ref:`schema_cache` due to the PostgreSQL service not | +| PGRST002 | running. | ++---------------+-------------------------------------------------------------+ + +.. _pgrst1**: + +Group 1 - Api Request +--------------------- + +Related to the HTTP request elements. + ++---------------+-------------------------------------------------------------+ +| Code | Description | ++===============+=============================================================+ +| .. _pgrst100: | Parsing error in the query string parameter. | +| | See :ref:`h_filter`, :ref:`operators` and :ref:`ordering`. | +| PGRST100 | | ++---------------+-------------------------------------------------------------+ +| .. _pgrst101: | For :ref:`functions `, only ``GET`` and ``POST`` | +| | verbs are allowed. Any other verb will throw this error. | +| PGRST101 | | ++---------------+-------------------------------------------------------------+ +| .. _pgrst102: | Related to the request body structure. | +| | See :ref:`insert_update`. | +| PGRST102 | | ++---------------+-------------------------------------------------------------+ +| .. _pgrst103: | Related to :ref:`limits`. | +| | | +| PGRST103 | | ++---------------+-------------------------------------------------------------+ +| .. _pgrst104: | Either the :ref:`filter operator ` is missing | +| | or it doesn't exist. | +| PGRST104 | | ++---------------+-------------------------------------------------------------+ +| .. _pgrst105: | Related to an :ref:`UPSERT using PUT `. | +| | | +| PGRST105 | | ++---------------+-------------------------------------------------------------+ +| .. _pgrst106: | The schema specified when | +| | :ref:`switching schemas ` is not present | +| PGRST106 | in the :ref:`db-schemas` configuration variable. | ++---------------+-------------------------------------------------------------+ +| .. _pgrst107: | The ``Content-Type`` sent in the request is invalid. | +| | | +| PGRST107 | | ++---------------+-------------------------------------------------------------+ +| .. _pgrst108: | The filter is applied to a embedded resource that is not | +| | specified in the ``select`` part of the query string. | +| PGRST108 | See :ref:`embed_filters`. | ++---------------+-------------------------------------------------------------+ + +.. _pgrst2**: + +Group 2 - Schema Cache +---------------------- + +Related to a :ref:`stale schema cache `. Most of the time, these errors are solved by :ref:`reloading the schema cache `. + ++---------------+-------------------------------------------------------------+ +| Code | Description | ++===============+=============================================================+ +| .. _pgrst200: | Caused by :ref:`stale_fk_relationships`, otherwise any of | +| | the embedding resources or the relationship itself may not | +| PGRST200 | exist in the database. | ++---------------+-------------------------------------------------------------+ +| .. _pgrst201: | Related to :ref:`embed_disamb`. | +| | | +| PGRST201 | | ++---------------+-------------------------------------------------------------+ +| .. _pgrst202: | Caused by a :ref:`stale_function_signature`, otherwise | +| | the function may not exist in the database. | +| PGRST202 | | ++---------------+-------------------------------------------------------------+ +| .. _pgrst203: | Caused by requesting overloaded functions with the same | +| | argument names but different types, or by using a ``POST`` | +| PGRST203 | verb to request overloaded functions with a ``JSON`` or | +| | ``JSONB`` type unnamed parameter. The solution is to rename | +| | the function or add/modify the names of the arguments. | ++---------------+-------------------------------------------------------------+ + +.. _pgrst3**: + +Group 3 - JWT errors +-------------------- + +Related to the authentication process using JWT. You can follow the :ref:`tut1` for an example on how to implement authentication and the :doc:`Authentication page ` for more information on this process. + ++---------------+-------------------------------------------------------------+ +| Code | Description | ++===============+=============================================================+ +| .. _pgrst300: | A :ref:`JWT secret ` is missing from the | +| | configuration. | +| PGRST300 | | ++---------------+-------------------------------------------------------------+ +| .. _pgrst301: | Any error related to the verification of the JWT, | +| | which means that the JWT provided is invalid in some way. | +| PGRST301 | | ++---------------+-------------------------------------------------------------+ +| .. _pgrst302: | Attempted to do a request without | +| | :ref:`authentication ` when the anonymous role | +| PGRST302 | is disabled by not setting it in :ref:`db-anon-role`. | ++---------------+-------------------------------------------------------------+ + +.. _pgrst4**: + +Group 4 - Hasql +--------------- + +Related to `the library `_ that PostgREST uses to connect to the database. If you encounter any of these errors, you may have stumbled on a PostgREST bug, please `open an issue `_ and we'll be glad to fix it. + ++---------------+-------------------------------------------------------------+ +| Code | Description | ++===============+=============================================================+ +| .. _pgrst400: | Internal error: Unexpected Result. | +| | | +| PGRST400 | | ++---------------+-------------------------------------------------------------+ +| .. _pgrst401: | Internal error: Attempted to parse more columns than | +| | there are in the result. | +| PGRST401 | | ++---------------+-------------------------------------------------------------+ +| .. _pgrst402: | Internal error: Attempted to parse a NULL as some value. | +| | | +| PGRST402 | | ++---------------+-------------------------------------------------------------+ +| .. _pgrst403: | Internal error: Wrong value parser used. | +| | | +| PGRST403 | | ++---------------+-------------------------------------------------------------+ +| .. _pgrst404: | Internal error: Unexpected amount of rows. | +| | | +| PGRST404 | | ++---------------+-------------------------------------------------------------+ + +.. _pgrst5**: + +Group 5 - General +----------------- + +These are uncategorized errors. + ++---------------+-------------------------------------------------------------+ +| Code | Description | ++===============+=============================================================+ +| .. _pgrst500: | Related to :ref:`guc_resp_hdrs`. | +| | | +| PGRST500 | | ++---------------+-------------------------------------------------------------+ +| .. _pgrst501: | The status code must be a positive integer. | +| | See :ref:`guc_resp_status`. | +| PGRST501 | | ++---------------+-------------------------------------------------------------+ +| .. _pgrst502: | Related to :ref:`binary_output`. See :ref:`providing_img` | +| | for an example on requesting images. | +| PGRST502 | | ++---------------+-------------------------------------------------------------+ +| .. _pgrst503: | For an :ref:`UPSERT using PUT `, when | +| | :ref:`limits and offsets ` are used. | +| PGRST503 | | ++---------------+-------------------------------------------------------------+ +| .. _pgrst504: | For an :ref:`UPSERT using PUT `, when the | +| | primary key in the query string and the body are different. | +| PGRST504 | | ++---------------+-------------------------------------------------------------+ +| .. _pgrst505: | More than 1 or no items where returned when requesting | +| | a singular response. See :ref:`singular_plural`. | +| PGRST505 | | ++---------------+-------------------------------------------------------------+ +| .. _pgrst506: | The HTTP verb used in the request in not supported. | +| | | +| PGRST506 | | ++---------------+-------------------------------------------------------------+ diff --git a/docs/index.rst b/docs/index.rst index 8fa7b04f76..ea08aa3ade 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -145,9 +145,16 @@ Technical references for PostgREST's functionality. schema_cache.rst +.. toctree:: + :caption: Errors + :hidden: + + errors.rst + - :doc:`API ` - :doc:`configuration` - :doc:`Schema Cache ` +- :doc:`Errors ` Topic guides ------------ diff --git a/docs/schema_cache.rst b/docs/schema_cache.rst index 11d0f95105..4b59c79887 100644 --- a/docs/schema_cache.rst +++ b/docs/schema_cache.rst @@ -27,6 +27,8 @@ in order to avoid repeating this work, PostgREST uses a schema cache. | | Function signature | +--------------------------------------------+-------------------------------------------------------------------------------+ +.. _stale_schema: + The Stale Schema Cache ---------------------- @@ -56,8 +58,10 @@ The result will be an error: .. code-block:: json { - "hint": "If a new foreign key between these entities was created in the database, try reloading the schema cache.", - "message": "Could not find a relationship between cities and countries in the schema cache" + "hint": "Verify that 'cities' and 'countries' exist in the schema 'api' and that there is a foreign key relationship between them. If a new relationship was created, try reloading the schema cache.", + "details": null, + "code": "PGRST200", + "message": "Could not find a relationship between 'cities' and 'countries' in the schema cache" } As you can see, PostgREST couldn't find the newly created foreign key in the schema cache. See :ref:`schema_reloading` and :ref:`auto_schema_reloading` to solve this issue. @@ -89,7 +93,9 @@ The same issue will occur on newly created functions on a running PostgREST. .. code-block:: json { - "hint": "If a new function was created in the database with this name and arguments, try reloading the schema cache.", + "hint": "If a new function was created in the database with this name and parameters, try reloading the schema cache.", + "details": null, + "code": "PGRST202", "message": "Could not find the api.plus_one(num) function in the schema cache" } diff --git a/docs/tutorials/tut0.rst b/docs/tutorials/tut0.rst index a0ffb936c3..5a2ed16047 100644 --- a/docs/tutorials/tut0.rst +++ b/docs/tutorials/tut0.rst @@ -223,7 +223,7 @@ Response is 401 Unauthorized: "hint": null, "details": null, "code": "42501", - "message": "permission denied for relation todos" + "message": "permission denied for table todos" } There we have it, a basic API on top of the database! In the next tutorials we will see how to extend the example with more sophisticated user access controls, and more tables and queries. diff --git a/docs/tutorials/tut1.rst b/docs/tutorials/tut1.rst index cb307dc4b1..33ef764e73 100644 --- a/docs/tutorials/tut1.rst +++ b/docs/tutorials/tut1.rst @@ -175,7 +175,12 @@ After expiration, the API returns HTTP 401 Unauthorized: .. code-block:: json - {"message":"JWT expired"} + { + "hint": null, + "details": null, + "code": "PGRST301", + "message": "JWT expired" + } Bonus Topic: Immediate Revocation --------------------------------- diff --git a/postgrest.dict b/postgrest.dict index 1ac2dd9766..2b15bd67b0 100644 --- a/postgrest.dict +++ b/postgrest.dict @@ -49,6 +49,7 @@ GUC gucs Gumbs Haskell +Hasql Heroku HMAC Homebrew @@ -170,6 +171,7 @@ Tyll TypeScript UI ui +uncategorized unicode unix updatable From f56373313ee076c5df652cd9afef584f1d51b91d Mon Sep 17 00:00:00 2001 From: Steve Chavez Date: Tue, 22 Mar 2022 10:57:04 +0100 Subject: [PATCH 491/711] Fix not reloading on ALTER TYPE (#517) --- docs/schema_cache.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/schema_cache.rst b/docs/schema_cache.rst index 4b59c79887..9aa1f3a13a 100644 --- a/docs/schema_cache.rst +++ b/docs/schema_cache.rst @@ -191,7 +191,7 @@ reloading when creating temporary tables(``CREATE TEMP TABLE``) inside functions , 'CREATE MATERIALIZED VIEW', 'ALTER MATERIALIZED VIEW' , 'CREATE FUNCTION', 'ALTER FUNCTION' , 'CREATE TRIGGER' - , 'CREATE TYPE' + , 'CREATE TYPE', 'ALTER TYPE' , 'CREATE RULE' , 'COMMENT' ) From a8034df2bf7a5d07b57e760b664ec2efc1b77f24 Mon Sep 17 00:00:00 2001 From: Laurence Isla Date: Tue, 22 Mar 2022 05:30:45 -0500 Subject: [PATCH 492/711] Add how to on PostGIS and hstore data types (#516) --- .../working-with-postgresql-data-types.rst | 214 ++++++++++++++++++ postgrest.dict | 1 + 2 files changed, 215 insertions(+) diff --git a/docs/how-tos/working-with-postgresql-data-types.rst b/docs/how-tos/working-with-postgresql-data-types.rst index 7cba0a979d..921be2ba53 100644 --- a/docs/how-tos/working-with-postgresql-data-types.rst +++ b/docs/how-tos/working-with-postgresql-data-types.rst @@ -78,3 +78,217 @@ You can use other comparative filters and also `PostgreSQL special date/time inp "due_date": "2022-02-27T06:00:00-05:00" } ] + +hstore +------ + +You can work with data types belonging to additional supplied modules such as `hstore `_. Let's use the following table: + +.. code-block:: postgres + + -- Activate the hstore module in the current database + create extension if not exists hstore; + + create table countries ( + id int primary key, + name hstore unique + ); + +The ``name`` column will have the name of the country in different formats. You can insert values using the string representation for that data type, for instance: + +.. tabs:: + + .. code-tab:: http + + POST /countries HTTP/1.1 + Content-Type: application/json + + [ + { "id": 1, "name": "common => Egypt, official => \"Arab Republic of Egypt\", native => مصر" }, + { "id": 2, "name": "common => Germany, official => \"Federal Republic of Germany\", native => Deutschland" } + ] + + .. code-tab:: bash Curl + + curl "http://localhost:3000/countries" \ + -X POST -H "Content-Type: application/json" \ + -d @- << EOF + [ + { "id": 1, "name": "common => Egypt, official => \"Arab Republic of Egypt\", native => مصر" }, + { "id": 2, "name": "common => Germany, official => \"Federal Republic of Germany\", native => Deutschland" } + ] + EOF + +Notice that the use of ``"`` in the value of the ``name`` column needs to be escaped using a backslash ``\``. + +You can also query and filter the value of a ``hstore`` column using the arrow operators, as you would do for a :ref:`JSON column`. For example, if you want to get the native name of Egypt, the query would be: + +.. tabs:: + + .. code-tab:: http + + GET /countries?select=name->>native&name->>common=like.Egypt HTTP/1.1 + + .. code-tab:: bash Curl + + curl "http://localhost:3000/countries?select=name->>native&name->>common=like.Egypt" + +.. code-block:: json + + [{ "native": "مصر" }] + +PostGIS +------------------ + +You can use the string representation for `PostGIS `_ data types such as ``geometry`` or ``geography``. As an example, let's create a table using the ``geometry`` type (you need to `install PostGIS `_ first). + +.. code-block:: postgres + + -- Activate the postgis module in the current database + create extension if not exists postgis; + + create table coverage ( + id int primary key, + name text unique, + area geometry + ); + +Say you want to add areas in polygon format. The request using string representation would look like: + +.. tabs:: + + .. code-tab:: http + + POST /coverage HTTP/1.1 + Content-Type: application/json + + [ + { "id": 1, "name": "small", "area": "SRID=4326;POLYGON((0 0, 1 0, 1 1, 0 1, 0 0))" }, + { "id": 2, "name": "big", "area": "SRID=4326;POLYGON((0 0, 10 0, 10 10, 0 10, 0 0))" } + ] + + .. code-tab:: bash Curl + + curl "http://localhost:3000/coverage" \ + -X POST -H "Content-Type: application/json" \ + -d @- << EOF + [ + { "id": 1, "name": "small", "area": "SRID=4326;POLYGON((0 0, 1 0, 1 1, 0 1, 0 0))" }, + { "id": 2, "name": "big", "area": "SRID=4326;POLYGON((0 0, 10 0, 10 10, 0 10, 0 0))" } + ] + EOF + +Now, when you request the information, PostgREST will automatically cast the ``area`` column to ``JSON`` format. Although this output is useful, you will want to use the PostGIS functions to have more control on filters or casts. For these cases, creating a ``view`` is your best option. For example, let's use some of the functions to get the data in `GeoJSON format `_ and to calculate the area in square units: + +.. code-block:: postgres + + create or replace view coverage_geo as + select name, + -- Get the Geometry Object + st_AsGeoJSON(c.area)::json as geo_geometry, + -- Get the Feature Object + st_AsGeoJSON(c.*)::json as geo_feature, + -- Calculate the area in square units + st_area(c.area) as square_units + from coverage c; + + -- Create another view for the FeatureCollection Object + -- for the sake of making the examples clearer + create or replace view coverage_geo_collection as + select + json_build_object( + 'type', 'FeatureCollection', + 'features', json_agg(st_AsGeoJSON(c.*)::json) + ) + as geo_feature_collection + from coverage c; + +Now the query will return the information as you expected: + +.. tabs:: + + .. code-tab:: http + + GET /coverage_geo?name=eq.big HTTP/1.1 + + .. code-tab:: bash Curl + + curl "http://localhost:3000/coverage_geo?name=eq.big" + +.. code-block:: json + + [ + { + "name": "big", + "geo_geometry": { + "type": "Polygon", + "coordinates": [ + [[0,0],[10,0],[10,10],[0,10],[0,0]] + ] + }, + "geo_feature": { + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [[0,0],[10,0],[10,10],[0,10],[0,0]] + ] + }, + "properties": { + "id": 2, + "name": "big" + } + }, + "square_units": 100 + } + ] + +And for the Feature Collection format: + +.. tabs:: + + .. code-tab:: http + + GET /coverage_geo_collection HTTP/1.1 + + .. code-tab:: bash Curl + + curl "http://localhost:3000/coverage_geo_collection" + +.. code-block:: json + + [ + { + "geo_feature_collection": { + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [[0,0],[1,0],[1,1],[0,1],[0,0]] + ] + }, + "properties": { + "id": 1, + "name": "small" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [[0,0],[10,0],[10,10],[0,10],[0,0]] + ] + }, + "properties": { + "id": 2, + "name": "big" + } + } + ] + } + } + ] diff --git a/postgrest.dict b/postgrest.dict index 2b15bd67b0..a20158ba4d 100644 --- a/postgrest.dict +++ b/postgrest.dict @@ -53,6 +53,7 @@ Hasql Heroku HMAC Homebrew +hstore HTTP HTTPS HV From 5688bc1521f992b00dd37662d3510d08d3ecec44 Mon Sep 17 00:00:00 2001 From: Laurence Isla Date: Thu, 24 Mar 2022 17:48:43 -0500 Subject: [PATCH 493/711] Add JSON, Composite and Ranges types to the working with types how-to --- docs/ecosystem.rst | 2 + docs/how-tos/casting-type-to-custom-json.rst | 97 ------- .../embedding-table-from-another-schema.rst | 81 ------ .../working-with-postgresql-data-types.rst | 253 ++++++++++++++++++ docs/index.rst | 3 - 5 files changed, 255 insertions(+), 181 deletions(-) delete mode 100644 docs/how-tos/casting-type-to-custom-json.rst delete mode 100644 docs/how-tos/embedding-table-from-another-schema.rst diff --git a/docs/ecosystem.rst b/docs/ecosystem.rst index 883db8bc04..10923ab158 100644 --- a/docs/ecosystem.rst +++ b/docs/ecosystem.rst @@ -14,6 +14,8 @@ Community Tutorials * `"CodeLess" backend using postgres, postgrest and oauth2 authentication with keycloak `_ - A step-by-step tutorial for using PostgREST with KeyCloak(hosted on a managed service). +* `How PostgreSQL triggers work when called with a PostgREST PATCH HTTP request `_ - A tutorial to see how the old and new values are set or not when doing a PATCH request to PostgREST. + .. _templates: Templates diff --git a/docs/how-tos/casting-type-to-custom-json.rst b/docs/how-tos/casting-type-to-custom-json.rst deleted file mode 100644 index b4687bad2f..0000000000 --- a/docs/how-tos/casting-type-to-custom-json.rst +++ /dev/null @@ -1,97 +0,0 @@ -Casting a type to a custom JSON object -====================================== - -:author: `steve-chavez `_ - -While using PostgREST you might have noticed that certain PostgreSQL types translate to JSON strings when you would -have expected a JSON object or array. For example, let's see the case of `range types `_. - -.. code-block:: postgres - - -- example taken from https://www.postgresql.org/docs/current/rangetypes.html#RANGETYPES-EXAMPLES - create table reservations ( - room int - , during tsrange - ); - - insert into - reservations - values - (1108, tsrange('2010-01-01 14:30', '2010-01-01 15:30')); - -Here we have a column named **during** as a ``tsrange`` type, we would like to get it as JSON through PostgREST. - -.. code-block:: bash - - curl "http://localhost:3000/reservations" - -Result: - -.. code-block:: json - - [ - { - "room":1108, - "during":"[\"2010-01-01 14:30:00\",\"2010-01-01 15:30:00\")" - } - ] - -The **during** value is probably not the in the format you want. We get a JSON string because by default PostgreSQL casts -the type to JSON by using its ``text`` representation. We can change this representation to a custom JSON object by `creating a CAST `_ . - -To do this, first we'll define the function that will do the conversion from ``tsrange`` to ``json``. - -.. code-block:: postgres - - create or replace function tsrange_to_json(tsrange) returns json as $$ - select json_build_object( - 'lower', lower($1) - , 'upper', upper($1) - , 'lower_inc', lower_inc($1) - , 'upper_inc', upper_inc($1) - ); - $$ language sql; - -Using this function we'll create the CAST. - -.. code-block:: postgres - - create cast (tsrange as json) with function tsrange_to_json(tsrange) as assignment; - -And we'll do the request and :ref:`cast the column `. - -.. code-block:: bash - - curl "http://localhost:3000/reservations?select=room,during::json" - -The result now is: - -.. code-block:: json - - [ - { - "room":1108, - "during":{ - "lower" : "2010-01-01T14:30:00", - "upper" : "2010-01-01T15:30:00", - "lower_inc" : true, - "upper_inc" : false - } - } - ] - -You can use the same idea for creating custom casts for different types. - -.. note:: - - If you don't want to modify casts for built-in types, an option would be to `create a custom type `_ - for your own ``tsrange`` and add its own cast. - - .. code-block:: postgres - - create type mytsrange as range (subtype = timestamp, subtype_diff = tsrange_subdiff); - - -- define column types and casting function analoguously to the above example - -- ... - - create cast (mytsrange as json) with function mytsrange_to_json(mytsrange) as assignment; diff --git a/docs/how-tos/embedding-table-from-another-schema.rst b/docs/how-tos/embedding-table-from-another-schema.rst deleted file mode 100644 index 6631982de6..0000000000 --- a/docs/how-tos/embedding-table-from-another-schema.rst +++ /dev/null @@ -1,81 +0,0 @@ -Embedding a table from another schema -===================================== - -:author: `steve-chavez `_ - -Suppose you have a **people** table in the ``public`` schema and this schema is exposed through PostgREST's :ref:`db-schemas`. - -.. code-block:: postgres - - create table public.people( - id int primary key - , full_name text - ); - -And you want to :ref:`embed ` the **people** table with a **details** table that's in another schema named ``private``. - -.. code-block:: postgres - - create schema if not exists private; - - -- For simplicity's sake the table is devoid of constraints/domains on email, phone, etc. - create table private.details( - id int primary key references public.people - , email text - , phone text - , birthday date - , occupation text - , company text - ); - - -- other database objects in this schema - -- ... - -- ... - -To solve this, you can create a view of **details** in the ``public`` schema. We'll call it **public_details**. - -.. code-block:: postgres - - create view public.public_details as - select - id - , occupation - , company - from - private.details; - -Since PostgREST supports :ref:`embedding_views`, you can embed **people** with **public_details**. - -Let's insert some data to test this: - -.. code-block:: postgres - - insert into - public.people - values - (1, 'John Doe'), (2, 'Jane Doe'); - - insert into - private.details - values - (1, 'jhon@fake.com', '772-323-5433', '1990-02-01', 'Transportation attendant', 'Body Fate'), - (2, 'jane@fake.com', '480-474-6571', '1980-04-21', 'Geotechnical engineer', 'Earthworks Garden Kare'); - -.. important:: - - Make sure PostgREST's schema cache is up-to-date. See :ref:`schema_reloading`. - -Now, make the following request: - -.. code-block:: bash - - curl "http://localhost:3000/people?select=full_name,public_details(occupation,company)" - -The result should be: - -.. code-block:: json - - [ - {"full_name":"John Doe","public_details":[{"occupation":"Transportation attendant","company":"Body Fate"}]}, - {"full_name":"Jane Doe","public_details":[{"occupation":"Geotechnical engineer","company":"Earthworks Garden Kare"}]} - ] diff --git a/docs/how-tos/working-with-postgresql-data-types.rst b/docs/how-tos/working-with-postgresql-data-types.rst index 921be2ba53..06276f6c79 100644 --- a/docs/how-tos/working-with-postgresql-data-types.rst +++ b/docs/how-tos/working-with-postgresql-data-types.rst @@ -79,6 +79,259 @@ You can use other comparative filters and also `PostgreSQL special date/time inp } ] +JSON +---- + +To work with a ``json`` type column, you can handle the value as a JSON object. For instance, let's use this table: + +.. code-block:: postgres + + create table products ( + id int primary key, + name text unique, + extra_info json + ); + +Now, you can insert a new product using a JSON object for the ``extra_info`` column: + +.. tabs:: + + .. code-tab:: http + + POST /products HTTP/1.1 + Content-Type: application/json + + { + "id": 1, + "name": "Canned fish", + "extra_info": { + "expiry_date": "2025-12-31", + "exportable": true + } + } + + .. code-tab:: bash Curl + + curl "http://localhost:3000/products" \ + -X POST -H "Content-Type: application/json" \ + -d @- << EOF + { + "id": 1, + "name": "Canned fish", + "extra_info": { + "expiry_date": "2025-12-31", + "exportable": true + } + } + EOF + +To query and filter the data see :ref:`json_columns` for a complete reference. + +Composite Types +--------------- + +With PostgREST, you have two options to handle `composite type columns `_. On one hand you can use string representation and on the other you can handle it as you would a JSON column. Let's create a type and a table for this example: + +.. code-block:: postgres + + create type dimension as ( + length decimal(6,2), + width decimal (6,2), + height decimal (6,2), + unit text + ); + + create table products ( + id int primary key, + size dimension + ); + + insert into products (id, size) + values (1, '(5.0,5.0,10.0,"cm")'); + +Now, you could insert values using string representation as seen in the example above. + +.. tabs:: + + .. code-tab:: http + + POST /products HTTP/1.1 + Content-Type: application/json + + { "id": 2, "size": "(0.7,0.5,1.8,\"m\")" } + + .. code-tab:: bash Curl + + curl "http://localhost:3000/products" \ + -X POST -H "Content-Type: application/json" \ + -d @- << EOF + { "id": 2, "size": "(0.7,0.5,1.8,\"m\")" } + EOF + +Or, you could insert the data in JSON format. The following request is equivalent to the previous one: + +.. tabs:: + + .. code-tab:: http + + POST /products HTTP/1.1 + Content-Type: application/json + + { + "id": 2, + "size": { + "length": 0.7, + "width": 0.5, + "height": 1.8, + "unit": "m" + } + } + + .. code-tab:: bash Curl + + curl "http://localhost:3000/products" \ + -X POST -H "Content-Type: application/json" \ + -d @- << EOF + { + "id": 2, + "size": { + "length": 0.7, + "width": 0.5, + "height": 1.8, + "unit": "m" + } + } + EOF + +You can also query data using the arrow operators as you would for :ref:`JSON columns `. + +Ranges +------ + +To illustrate how to work with `ranges `_, let's use the following table as an example: + +.. code-block:: postgres + + create table events ( + id int primary key, + name text unique, + duration tsrange + ); + +Now, to insert a new event, specify the ``duration`` value as a string representation of the ``tsrange`` type, for example: + +.. tabs:: + + .. code-tab:: http + + POST /events HTTP/1.1 + Content-Type: application/json + + { + "id": 1, + "name": "New Year's Party", + "duration": "['2022-12-31 11:00','2023-01-01 06:00']" + } + + .. code-tab:: bash Curl + + curl "http://localhost:3000/events" \ + -X POST -H "Content-Type: application/json" \ + -d @- << EOF + { + "id": 1, + "name": "New Year's Party", + "duration": "['2022-12-31 11:00','2023-01-01 06:00']" + } + EOF + +You can use range :ref:`operators ` to filter the data. But what if you need get the events for the New Year 2023? Doing this filter ``events?duration=cs.2023-01-01`` will return an error because PostgreSQL needs an explicit cast to timestamp of the string value. A workaround would be to use a range starting and ending in the same date, like this: + +.. tabs:: + + .. code-tab:: http + + GET /events?duration=cs.[2023-01-01,2023-01-01] HTTP/1.1 + + .. code-tab:: bash Curl + + curl "http://localhost:3000/events?duration=cs.\[2023-01-01,2023-01-01\]" + +.. code-block:: json + + [ + { + "id": 1, + "name": "New Year's Party", + "duration": "[\"2022-12-31 11:00:00\",\"2023-01-01 06:00:00\"]" + } + ] + +.. _casting_range_to_json: + +Casting a Range to a JSON Object +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +As you may have noticed, the ``tsrange`` value is returned as a string literal. To return it as a JSON value, first you need to create a function that will do the conversion from a ``tsrange`` type: + +.. code-block:: postgres + + create or replace function tsrange_to_json(tsrange) returns json as $$ + select json_build_object( + 'lower', lower($1) + , 'upper', upper($1) + , 'lower_inc', lower_inc($1) + , 'upper_inc', upper_inc($1) + ); + $$ language sql; + +Then, create the cast using this function: + +.. code-block:: postgres + + create cast (tsrange as json) with function tsrange_to_json(tsrange) as assignment; + +Finally, do the request :ref:`casting the range column `: + +.. tabs:: + + .. code-tab:: http + + GET /events?select=id,name,duration::json HTTP/1.1 + + .. code-tab:: bash Curl + + curl "http://localhost:3000/events?select=id,name,duration::json" + +.. code-block:: json + + [ + { + "id": 1, + "name": "New Year's Party", + "duration": { + "lower": "2022-12-31T11:00:00", + "upper": "2023-01-01T06:00:00", + "lower_inc": true, + "upper_inc": true + } + } + ] + +.. note:: + + If you don't want to modify casts for built-in types, an option would be to `create a custom type `_ + for your own ``tsrange`` and add its own cast. + + .. code-block:: postgres + + create type mytsrange as range (subtype = timestamp, subtype_diff = tsrange_subdiff); + + -- define column types and casting function analogously to the above example + -- ... + + create cast (mytsrange as json) with function mytsrange_to_json(mytsrange) as assignment; + hstore ------ diff --git a/docs/index.rst b/docs/index.rst index ea08aa3ade..9448cd0890 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -204,10 +204,7 @@ These are recipes that'll help you address specific use-cases. how-tos/* -- :doc:`how-tos/casting-type-to-custom-json` -- :doc:`how-tos/embedding-table-from-another-schema` - :doc:`how-tos/providing-images-for-img` -- `How PostgreSQL triggers work when called with a PostgREST PATCH HTTP request `_ - :doc:`how-tos/working-with-postgresql-data-types` Ecosystem From eb4c428da618263367bb14c4fc5bfd39bb0f7fdc Mon Sep 17 00:00:00 2001 From: Laurence Isla Date: Fri, 25 Mar 2022 00:14:18 -0500 Subject: [PATCH 494/711] Fix unordered list styles --- requirements.txt | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/requirements.txt b/requirements.txt index 5a5a51b65a..57ed0b59fe 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,3 +1,5 @@ -docutils<0.18 -sphinx-tabs -sphinx-copybutton \ No newline at end of file +docutils==0.16 +sphinx>=4.3.0 +sphinx-copybutton +sphinx-rtd-theme>=0.5.1 +sphinx-tabs \ No newline at end of file From e1c987dc5fe5e0993b250158bf690b0380149134 Mon Sep 17 00:00:00 2001 From: Laurence Isla Date: Sun, 27 Mar 2022 10:54:48 -0500 Subject: [PATCH 495/711] Add latest page (#521) * better highlight for composite/array reference --- docs/admin.rst | 2 + docs/api.rst | 12 ++- docs/errors.rst | 2 +- docs/index.rst | 7 +- docs/releases/latest.rst | 158 +++++++++++++++++++++++++++++++++++++++ postgrest.dict | 1 + 6 files changed, 172 insertions(+), 10 deletions(-) create mode 100644 docs/releases/latest.rst diff --git a/docs/admin.rst b/docs/admin.rst index e7a7448f98..36b9e5e6f2 100644 --- a/docs/admin.rst +++ b/docs/admin.rst @@ -331,6 +331,8 @@ After that, you can enable the service at boot time and start it with: ## For reloading the service ## systemctl restart postgrest +.. _file_descriptors: + File Descriptors ---------------- diff --git a/docs/api.rst b/docs/api.rst index 7acaafa366..d1503fd424 100644 --- a/docs/api.rst +++ b/docs/api.rst @@ -269,8 +269,8 @@ Casting the columns is possible by suffixing them with the double colon ``::`` p .. _json_columns: -Array / Composite / JSON Columns --------------------------------- +JSON Columns +------------ You can specify a path for a ``json`` or ``jsonb`` column using the arrow operators(``->`` or ``->>``) as per the `PostgreSQL docs `_. @@ -354,8 +354,12 @@ Note that ``->>`` is used to compare ``blood_type`` as ``text``. To compare with { "id": 12, "age": 30 }, { "id": 15, "age": 35 } ] +.. _composite_array_columns: -The arrow operators are also used for array and composite type columns. +Composite / Array Columns +------------------------- + +The arrow operators(``->``, ``->>``) can also be used for accessing composite fields and array elements. .. code-block:: postgres @@ -396,7 +400,7 @@ The arrow operators are also used for array and composite type columns. When using the ``->`` and ``->>`` operators, PostgREST uses a query like ``to_jsonb()->'field'``. To make filtering and ordering on those nested fields use an index, the index needs to be created on the same expression, including the ``to_jsonb(...)`` call: .. code-block:: postgres - + CREATE INDEX ON mytable ((to_jsonb(data) -> 'identification' ->> 'registration_number')); .. _computed_cols: diff --git a/docs/errors.rst b/docs/errors.rst index 39fa807a43..8024c1109e 100644 --- a/docs/errors.rst +++ b/docs/errors.rst @@ -3,7 +3,7 @@ Error Source ============ -For the most part, error messages will come directly from the database with the same `format that PostgreSQL uses `_, in other words, PostgREST will convert the ``MESSAGE``, ``DETAIL``, ``HINT`` and ``ERRCODE`` from the PostgreSQL error to JSON format and add an HTTP status code to the response (see :ref:`status_codes`). For instance, this is the error you will get when querying a nonexistent table: +For the most part, error messages will come directly from the database with the same `structure that PostgreSQL uses `_, PostgREST will convert the ``MESSAGE``, ``DETAIL``, ``HINT`` and ``ERRCODE`` from the PostgreSQL error to JSON format and add an HTTP status code to the response (see :ref:`status_codes`). For instance, this is the error you will get when querying a nonexistent table: .. code-block:: http diff --git a/docs/index.rst b/docs/index.rst index 9448cd0890..e2caa80962 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -98,6 +98,7 @@ The project has a friendly and growing community. Join our `chat room v9.0.0 releases/v8.0.0 releases/v7.0.1 @@ -230,14 +231,10 @@ PostgREST has a growing ecosystem of examples, libraries, and experiments. Here Release Notes ------------- -Here we'll include the most relevant changes so you can migrate to newer versions easily. -You can see the full changelog of each release in the `PostgREST repository `_. +Changes among versions. - :doc:`releases/v9.0.0` - :doc:`releases/v8.0.0` -- :doc:`releases/v7.0.0` -- :doc:`releases/v6.0.2` -- :doc:`releases/v5.2.0` In Production ------------- diff --git a/docs/releases/latest.rst b/docs/releases/latest.rst new file mode 100644 index 0000000000..101d8fd773 --- /dev/null +++ b/docs/releases/latest.rst @@ -0,0 +1,158 @@ + +Latest +====== + +These are features/bugfixes not yet on a stable version. You can try them by downloading the latest pre-releases `on the GitHub release page `_. + +Features +-------- + +API +~~~ + +Access Composite Type fields and Array elements +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +You can now :ref:`access fields of a Composite type or elements of an Array type ` with the arrow operators(``->``, ``->>``) in the same way you would access the JSON type fields. + +Improved Error Messages +^^^^^^^^^^^^^^^^^^^^^^^ + +To increase consistency, all the errors messages are now normalized. The ``hint``, ``details``, ``code`` and ``message`` fields will always be present in the body, each one defaulting to a +``null`` value. In the same way, the :ref:`errors that were raised ` with ``SQLSTATE`` now include the ``message`` and ``code`` in the body. + +In addition to these changes and to further clarify the source of an error, PostgREST now adds a ``PGRST`` prefix to the error code of all the errors that are PostgREST-specific and don't come from the database. These errors have a unique code that identifies them and are documented in the :ref:`pgrst_errors` section. + +Alongside these changes, there is now a dedicated reference page for :doc:`Error documentation `. + +Administration +~~~~~~~~~~~~~~ + +Health checks +^^^^^^^^^^^^^ + +Admins can now benefit from two :ref:`health check endpoints ` exposed in a different port than the main app. When activated, the ``live`` and ``ready`` endpoints are available to verify if PostgREST is alive and running or if the database connection and the :ref:`schema cache ` are ready for querying. + +Logging users +^^^^^^^^^^^^^ + +You can now verify the current authenticated database user in the :ref:`request log ` on stdout. + +Run without configuration +^^^^^^^^^^^^^^^^^^^^^^^^^ + +It is now possible to execute PostgREST without specifying any configuration variable, even without the three that were mandatory + + - If :ref:`db-uri` is not set, PostgREST will use the `libpq environment variables `_ for the database connection. + - If :ref:`db-schemas` is not set, it will use the database ``public`` schema. + - If :ref:`db-anon-role` is not set, it will not allow anonymous requests. + +Documentation improvements +~~~~~~~~~~~~~~~~~~~~~~~~~~ + +* Added a :doc:`/how-tos/working-with-postgresql-data-types` how-to, which contains explanations and examples on how to work with different PostgreSQL data types such as timestamps, ranges or PostGIS types, among others. + +* Added in-database and environment variable settings for each :ref:`configuration variable `. + +* Added the :ref:`file_descriptors` subsection. + +* Moved the :ref:`error_source` and the :ref:`status_codes` sections to the :doc:`errors reference page `. + +* Moved the *Casting type to custom JSON* how-to to the :ref:`casting_range_to_json` subsection. + +* Removed direct links for PostgREST versions older than 8.0 from the versions menu. + +* Removed the deprecated *Embedding table from another schema* how-to. + +Bug fixes +--------- + +* Execute deferred constraint triggers when using ``Prefer: tx=rollback`` (`#2020 `_) + +* Return ``204 No Content`` without ``Content-Type`` for ``PUT`` (`#2058 `_) + +* Fix ``is`` not working with upper or mixed case values like ``NULL, TrUe, FaLsE`` (`#2077 `_) + +* Fix schema cache loading when views with ``XMLTABLE`` and ``DEFAULT`` are present (`#2024 `_) + +* Fix wrong CORS header Authentication -> Authorization (`#1724 `_) + +* Clarify error for failed schema cache load. (`#2107 `_) + + - From ``Database connection lost. Retrying the connection`` to ``Could not query the database for the schema cache. Retrying.`` + +* Fix reading database configuration properly when ``=`` is present in its value (`#2120 `_) + +* Fix silently ignoring filter on a non-existent embedded resource (`#1771 `_) + +* Remove trigger functions from schema cache and OpenAPI output, because they can't be called directly anyway. (`#2135 `_) + +* Remove aggregates, procedures and window functions from the schema cache and OpenAPI output. (`#2101 `_) + +* Remove functions, which are not callable due to unnamed arguments, from schema cache and OpenAPI output. (`#2152 `_) + +* Fix accessing JSON array fields with ``->`` and ``->>`` in ``?select=`` and ``?order=``. (`#2145 `_) + +* Fix ``--dump-schema`` running with a wrong PG version. (`#2153 `_) + +* Keep working when ``EMFILE (Too many open files)`` is reached. (`#2042 `_) + +* Ignore ``Content-Type`` headers for ``GET`` requests when calling RPCs. Previously, ``GET`` without parameters, but with ``Content-Type: text/plain`` or ``Content-Type: application/octet-stream`` would fail with ``404 Not Found``, even if a function without arguments was available. (`#2147 `_) + +Breaking changes +---------------- + +* Return ``204 No Content`` without ``Content-Type`` for RPCs returning ``VOID`` (`#2001 `_) + + - Previously, those RPCs would return ``null`` as a body with ``Content-Type: application/json``. + +Thanks +------ + +Big thanks from the `PostgREST team `_ to our sponsors! + +.. container:: image-container + + .. image:: ../_static/cybertec-new.png + :target: https://www.cybertec-postgresql.com/en/?utm_source=postgrest.org&utm_medium=referral&utm_campaign=postgrest + :width: 13em + + .. image:: ../_static/2ndquadrant.png + :target: https://www.2ndquadrant.com/en/?utm_campaign=External%20Websites&utm_source=PostgREST&utm_medium=Logo + :width: 13em + + .. image:: ../_static/retool.png + :target: https://retool.com/?utm_source=sponsor&utm_campaign=postgrest + :width: 13em + + .. image:: ../_static/gnuhost.png + :target: https://gnuhost.eu/?utm_source=sponsor&utm_campaign=postgrest + :width: 13em + + .. image:: ../_static/supabase.png + :target: https://supabase.com/?utm_source=postgrest%20backers&utm_medium=open%20source%20partner&utm_campaign=postgrest%20backers%20github&utm_term=homepage + :width: 13em + + .. image:: ../_static/oblivious.jpg + :target: https://oblivious.ai/?utm_source=sponsor&utm_campaign=postgrest + :width: 13em + +* Evans Fernandes +* `Jan Sommer `_ +* `Franz Gusenbauer `_ +* `Daniel Babiak `_ +* Tsingson Qin +* Michel Pelletier +* Jay Hannah +* Robert Stolarz +* Nicholas DiBiase +* Christopher Reid +* Nathan Bouscal +* Daniel Rafaj +* David Fenko +* Remo Rechkemmer +* Severin Ibarluzea +* Tom Saleeba +* Pawel Tyll + +If you like to join them please consider `supporting PostgREST development `_. diff --git a/postgrest.dict b/postgrest.dict index a20158ba4d..f9cc140fc9 100644 --- a/postgrest.dict +++ b/postgrest.dict @@ -14,6 +14,7 @@ Beles booleans Bouscal buildpack +bugfixes Cardano cd centric From 06156eb79796249e5f425cd9ff055d2a71fece64 Mon Sep 17 00:00:00 2001 From: Christopher Ahlers <11285058+FooBar1969@users.noreply.github.com> Date: Mon, 4 Apr 2022 14:48:29 -0700 Subject: [PATCH 496/711] Update ecosystem.rst Fixed incorrect link for the swift library in Client-Side Libraries section. It now links properly to: https://github.com/supabase-community/postgrest-swift --- docs/ecosystem.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/ecosystem.rst b/docs/ecosystem.rst index 10923ab158..6ae4e1c9f4 100644 --- a/docs/ecosystem.rst +++ b/docs/ecosystem.rst @@ -117,7 +117,7 @@ Client-Side Libraries * `postgrest-request `_ - JS, SuperAgent * `postgrest-rs `_ - Rust * `postgrest-sharp-client `_ (needs maintainer) - C#, RestSharp -* `postgrest-swift `_ - Swift +* `postgrest-swift `_ - Swift * `postgrest-url `_ - JS, just for generating query URLs * `postgrest_python_requests_client `_ - Python * `postgrester `_ - JS + Typescript From 6f79b41bc12814f75ebc19956eb930fbc50e88b5 Mon Sep 17 00:00:00 2001 From: Michael Kane Juncker Date: Tue, 5 Apr 2022 19:03:35 +0200 Subject: [PATCH 497/711] feat(api): add match/imatch operators for regular expression support - refs PostgREST/postgrest#2236 --- docs/api.rst | 13 ++++++++++++- postgrest.dict | 1 + 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/docs/api.rst b/docs/api.rst index d1503fd424..7ae36a41a3 100644 --- a/docs/api.rst +++ b/docs/api.rst @@ -69,6 +69,8 @@ lte :code:`<=` less than or equal neq :code:`<>` or :code:`!=` not equal like :code:`LIKE` LIKE operator (use * in place of %) ilike :code:`ILIKE` ILIKE operator (use * in place of %) +match :code:`~` ~ operator, see :ref:`pattern_matching` +imatch :code:`~*` ~* operator, see :ref:`pattern_matching` in :code:`IN` one of a list of values, e.g. :code:`?a=in.(1,2,3)` – also supports commas in quoted strings like :code:`?a=in.("hi,there","yes,you")` @@ -146,6 +148,15 @@ You can also apply complex logic to the conditions: curl "http://localhost:3000/people?grade=gte.90&student=is.true&or=(age.eq.14,not.and(age.gte.11,age.lte.17))" +.. _pattern_matching: + +Pattern Matching +~~~~~~~~~~~~~~~~ + +The pattern-matching operators (:code:`like`, :code:`ilike`, :code:`match`, :code:`imatch`) exist to support filtering data using patterns instead of concrete strings, as described in the `PostgreSQL docs `__. + +To ensure best performance on larger data sets, an `appropriate index `__ should be used and even then, it depends on the pattern value and actual data statistics whether an existing index will be used by the query planner or not. + .. _fts: Full-Text Search @@ -272,7 +283,7 @@ Casting the columns is possible by suffixing them with the double colon ``::`` p JSON Columns ------------ -You can specify a path for a ``json`` or ``jsonb`` column using the arrow operators(``->`` or ``->>``) as per the `PostgreSQL docs `_. +You can specify a path for a ``json`` or ``jsonb`` column using the arrow operators(``->`` or ``->>``) as per the `PostgreSQL docs `__. .. code-block:: postgres diff --git a/postgrest.dict b/postgrest.dict index f9cc140fc9..f9861cce23 100644 --- a/postgrest.dict +++ b/postgrest.dict @@ -60,6 +60,7 @@ HTTPS HV Ibarluzea ilike +imatch io IP JS From f6c68ddafb83ccd4ff33b47973081f6de647be43 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 11 Apr 2022 12:34:22 +0000 Subject: [PATCH 498/711] Bump cachix/install-nix-action from 16 to 17 Bumps [cachix/install-nix-action](https://github.com/cachix/install-nix-action) from 16 to 17. - [Release notes](https://github.com/cachix/install-nix-action/releases) - [Commits](https://github.com/cachix/install-nix-action/compare/v16...v17) --- updated-dependencies: - dependency-name: cachix/install-nix-action dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- .github/workflows/ci.yaml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index fb815e2ccf..865683ba16 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -16,7 +16,7 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - - uses: cachix/install-nix-action@v16 + - uses: cachix/install-nix-action@v17 - run: nix-env -f default.nix -iA build - run: postgrest-docs-build @@ -25,7 +25,7 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - - uses: cachix/install-nix-action@v16 + - uses: cachix/install-nix-action@v17 - run: nix-env -f default.nix -iA spellcheck - run: postgrest-docs-spellcheck @@ -35,7 +35,7 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - - uses: cachix/install-nix-action@v16 + - uses: cachix/install-nix-action@v17 - run: nix-env -f default.nix -iA linkcheck - run: postgrest-docs-linkcheck From 72bffddbf18eac309216323a524f8d56ef458d04 Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Thu, 24 Mar 2022 18:21:13 +0100 Subject: [PATCH 499/711] Add limited updates/deletions Also move updates to its own section --- docs/api.rst | 101 ++++++++++++++++++++++++++++++++++++--------------- 1 file changed, 71 insertions(+), 30 deletions(-) diff --git a/docs/api.rst b/docs/api.rst index 7ae36a41a3..1b886af09d 100644 --- a/docs/api.rst +++ b/docs/api.rst @@ -1479,10 +1479,10 @@ Hints also work alongside ``!inner`` if a top level filtering is needed. From th curl "http://localhost:3000/orders?select=*,central_addresses!billing_address!inner(*)¢ral_addresses.code=AB1000" -.. _insert_update: +.. _insert: -Insertions / Updates -==================== +Insertions +========== All tables and `auto-updatable views `_ can be modified through the API, subject to permissions of the requester's database role. @@ -1537,28 +1537,6 @@ URL encoded payloads can be posted with ``Content-Type: application/x-www-form-u Some JavaScript libraries will post the data incorrectly if you're not careful. For best results try one of the :ref:`clientside_libraries` built for PostgREST. -To update a row or rows in a table, use the PATCH verb. Use :ref:`h_filter` to specify which record(s) to update. Here is an example query setting the :code:`category` column to child for all people below a certain age. - -.. tabs:: - - .. code-tab:: http - - PATCH /people?age=lt.13 HTTP/1.1 - - { "category": "child" } - - .. code-tab:: bash Curl - - curl "http://localhost:3000/people?age=lt.13" \ - -X PATCH -H "Content-Type: application/json" \ - -d '{ "category": "child" }' - -Updates also support :code:`Prefer: return=representation` plus :ref:`v_filter`. - -.. warning:: - - Beware of accidentally updating every row in a table. To learn to prevent that see :ref:`block_fulltable`. - .. _bulk_insert: Bulk Insert @@ -1621,8 +1599,7 @@ To bulk insert JSON post an array of objects having all-matching keys Specifying Columns ------------------ -By using the :code:`columns` query parameter it's possible to specify the payload keys that will be inserted/updated -and ignore the rest of the payload. +By using the :code:`columns` query parameter it's possible to specify the payload keys that will be inserted and ignore the rest of the payload. .. tabs:: @@ -1662,10 +1639,37 @@ In this case, only **source**, **publication_date** and **figure** will be inser Using this also has the side-effect of being more efficient for :ref:`bulk_insert` since PostgREST will not process the JSON and it'll send it directly to PostgreSQL. +.. _update: + +Updates +======= + +To update a row or rows in a table, use the PATCH verb. Use :ref:`h_filter` to specify which record(s) to update. Here is an example query setting the :code:`category` column to child for all people below a certain age. + +.. tabs:: + + .. code-tab:: http + + PATCH /people?age=lt.13 HTTP/1.1 + + { "category": "child" } + + .. code-tab:: bash Curl + + curl "http://localhost:3000/people?age=lt.13" \ + -X PATCH -H "Content-Type: application/json" \ + -d '{ "category": "child" }' + +Updates also support :code:`Prefer: return=representation` plus :ref:`v_filter`. + +.. warning:: + + Beware of accidentally updating every row in a table. To learn to prevent that see :ref:`block_fulltable`. + .. _upsert: UPSERT ------- +====== You can make an UPSERT with :code:`POST` and the :code:`Prefer: resolution=merge-duplicates` header: @@ -1703,7 +1707,7 @@ By default, UPSERT operates based on the primary key columns, you must specify a .. _on_conflict: On Conflict -~~~~~~~~~~~ +----------- By specifying the ``on_conflict`` query parameter, you can make UPSERT work on a column(s) that has a UNIQUE constraint. @@ -1736,7 +1740,7 @@ By specifying the ``on_conflict`` query parameter, you can make UPSERT work on a .. _upsert_put: PUT -~~~ +--- A single row UPSERT can be done by using :code:`PUT` and filtering the primary key columns with :code:`eq`: @@ -1795,6 +1799,43 @@ Deletions also support :code:`Prefer: return=representation` plus :ref:`v_filter Beware of accidentally deleting all rows in a table. To learn to prevent that see :ref:`block_fulltable`. +Limited Updates/Deletions +========================= + +You can limit the amount of affected rows by :ref:`update` or :ref:`delete` with the ``limit`` query parameter. For this, you must add an explicit ``order`` on a unique column(s). + +.. tabs:: + + .. code-tab:: http + + PATCH /users?limit=10&order=id&last_login=lt.2017-01-01 HTTP/1.1 + + { "status": "inactive" } + + .. code-tab:: bash Curl + + curl -X PATCH "/users?limit=10&order=id&last_login=lt.2020-01-01" \ + -H "Content-Type: application/json" \ + -d '{ "status": "inactive" }' + +.. tabs:: + + .. code-tab:: http + + DELETE /users?limit=10&order=id&status=eq.inactive HTTP/1.1 + + .. code-tab:: bash Curl + + curl -X DELETE "http://localhost:3000/users?limit=10&order=id&status=eq.inactive" + +If your table has no unique columns, you can use the `ctid `_ system column. + +Using ``offset`` to target a different subset of rows is also possible. + +.. note:: + + There is no native ``UPDATE...LIMIT`` or ``DELETE...LIMIT`` support in PostgreSQL; the generated query simulates that behavior and is based on `this Crunchy Data blog post `_. + .. _custom_queries: Custom Queries From 5f3284eed0682116d3c8e4e06ff115585902cccd Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Thu, 24 Mar 2022 18:41:11 +0100 Subject: [PATCH 500/711] fix broken links --- docs/api.rst | 2 +- docs/ecosystem.rst | 2 +- docs/errors.rst | 2 +- docs/install.rst | 2 +- docs/releases/v8.0.0.rst | 4 ++-- docs/schema_cache.rst | 2 +- 6 files changed, 7 insertions(+), 7 deletions(-) diff --git a/docs/api.rst b/docs/api.rst index 1b886af09d..727a2d315f 100644 --- a/docs/api.rst +++ b/docs/api.rst @@ -1271,7 +1271,7 @@ A request with ``directors`` embedded: Embedding after Insertions/Updates/Deletions -------------------------------------------- -You can embed related resources after doing :ref:`insert_update` or :ref:`delete`. +You can embed related resources after doing :ref:`insert`, :ref:`update` or :ref:`delete`. Say you want to insert a **film** and then get some of its attributes plus embed its **director**. diff --git a/docs/ecosystem.rst b/docs/ecosystem.rst index 6ae4e1c9f4..8283d6c698 100644 --- a/docs/ecosystem.rst +++ b/docs/ecosystem.rst @@ -22,7 +22,7 @@ Templates --------- * `compose-postgrest `_ - docker-compose setup with Nginx and HTML example -* `svelte-postgrest-template `_ - Svelte/SvelteKit, PostgREST, EveryLayout and social auth - `blog post `_ +* `svelte-postgrest-template `_ - Svelte/SvelteKit, PostgREST, EveryLayout and social auth .. _eco_example_apps: diff --git a/docs/errors.rst b/docs/errors.rst index 8024c1109e..950c9a9fa2 100644 --- a/docs/errors.rst +++ b/docs/errors.rst @@ -150,7 +150,7 @@ Related to the HTTP request elements. | PGRST101 | | +---------------+-------------------------------------------------------------+ | .. _pgrst102: | Related to the request body structure. | -| | See :ref:`insert_update`. | +| | See :ref:`insert` and :ref:`update`. | | PGRST102 | | +---------------+-------------------------------------------------------------+ | .. _pgrst103: | Related to :ref:`limits`. | diff --git a/docs/install.rst b/docs/install.rst index 5ab43ba111..c68ae15863 100644 --- a/docs/install.rst +++ b/docs/install.rst @@ -48,7 +48,7 @@ You can also use your OS package manager. .. group-tab:: Windows - You can install PostgREST using `Chocolatey `_ or `Scoop `_. + You can install PostgREST using `Chocolatey `_ or `Scoop `_. .. code:: bash diff --git a/docs/releases/v8.0.0.rst b/docs/releases/v8.0.0.rst index b99bd695f3..bdaea49162 100644 --- a/docs/releases/v8.0.0.rst +++ b/docs/releases/v8.0.0.rst @@ -25,7 +25,7 @@ Added * Allow schema cache reloading using PostgreSQL :ref:`NOTIFY ` command. This enables :ref:`auto_schema_reloading`. |br| -- `@steve-chavez `_ -* Allow sending the header ``Prefer: headers-only`` to get a response with a ``Location`` header. See :ref:`insert_update`. +* Allow sending the header ``Prefer: headers-only`` to get a response with a ``Location`` header. See :ref:`insert`. |br| -- `@laurenceisla `_ * Allow :ref:`external_connection_poolers` such as PgBouncer in transaction pooling mode. @@ -78,7 +78,7 @@ Changed |br| -- `@steve-chavez `_ * POST requests for insertions no longer include a ``Location`` header in the response by default and behave the same way as having a - ``Prefer: return=minimal`` header in the request. This prevents permissions errors when having a write-only table. See :ref:`insert_update`. + ``Prefer: return=minimal`` header in the request. This prevents permissions errors when having a write-only table. See :ref:`insert`. |br| -- `@laurenceisla `_ * Modified the default logging level from ``info`` to ``error``. See :ref:`log-level`. diff --git a/docs/schema_cache.rst b/docs/schema_cache.rst index 9aa1f3a13a..5e5fce3a6a 100644 --- a/docs/schema_cache.rst +++ b/docs/schema_cache.rst @@ -16,7 +16,7 @@ in order to avoid repeating this work, PostgREST uses a schema cache. +--------------------------------------------+-------------------------------------------------------------------------------+ | :ref:`Upserts ` | Primary keys | +--------------------------------------------+-------------------------------------------------------------------------------+ -| :ref:`Insertions ` | Primary keys (optional: only if the Location header is requested) | +| :ref:`Insertions ` | Primary keys (optional: only if the Location header is requested) | +--------------------------------------------+-------------------------------------------------------------------------------+ | :ref:`OPTIONS requests ` | View INSTEAD OF TRIGGERS and primary keys | +--------------------------------------------+-------------------------------------------------------------------------------+ From 9c23ac2f39b3d4f0699f09fdbe51500c892a8ebb Mon Sep 17 00:00:00 2001 From: Laurence Isla Date: Mon, 2 May 2022 23:14:24 -0500 Subject: [PATCH 501/711] Reorganize error groups --- docs/api.rst | 2 + docs/errors.rst | 109 ++++++++++++++++++++---------------------------- postgrest.dict | 4 +- 3 files changed, 50 insertions(+), 65 deletions(-) diff --git a/docs/api.rst b/docs/api.rst index 727a2d315f..2eb7e7cd97 100644 --- a/docs/api.rst +++ b/docs/api.rst @@ -1799,6 +1799,8 @@ Deletions also support :code:`Prefer: return=representation` plus :ref:`v_filter Beware of accidentally deleting all rows in a table. To learn to prevent that see :ref:`block_fulltable`. +.. _limited_update_delete: + Limited Updates/Deletions ========================= diff --git a/docs/errors.rst b/docs/errors.rst index 950c9a9fa2..248051f98c 100644 --- a/docs/errors.rst +++ b/docs/errors.rst @@ -177,6 +177,42 @@ Related to the HTTP request elements. | | specified in the ``select`` part of the query string. | | PGRST108 | See :ref:`embed_filters`. | +---------------+-------------------------------------------------------------+ +| .. _pgrst109: | Restricting a Deletion or an Update using limits must | +| | include the ordering of a unique column. | +| PGRST109 | See :ref:`limited_update_delete`. | ++---------------+-------------------------------------------------------------+ +| .. _pgrst110: | When restricting a Deletion or an Update using limits | +| | modifies more rows than the maximum specified in the limit. | +| PGRST110 | See :ref:`limited_update_delete`. | ++---------------+-------------------------------------------------------------+ +| .. _pgrst111: | Related to :ref:`guc_resp_hdrs`. | +| | | +| PGRST111 | | ++---------------+-------------------------------------------------------------+ +| .. _pgrst112: | The status code must be a positive integer. | +| | See :ref:`guc_resp_status`. | +| PGRST112 | | ++---------------+-------------------------------------------------------------+ +| .. _pgrst113: | Related to :ref:`binary_output`. See :ref:`providing_img` | +| | for an example on requesting images. | +| PGRST113 | | ++---------------+-------------------------------------------------------------+ +| .. _pgrst114: | For an :ref:`UPSERT using PUT `, when | +| | :ref:`limits and offsets ` are used. | +| PGRST114 | | ++---------------+-------------------------------------------------------------+ +| .. _pgrst115: | For an :ref:`UPSERT using PUT `, when the | +| | primary key in the query string and the body are different. | +| PGRST115 | | ++---------------+-------------------------------------------------------------+ +| .. _pgrst116: | More than 1 or no items where returned when requesting | +| | a singular response. See :ref:`singular_plural`. | +| PGRST116 | | ++---------------+-------------------------------------------------------------+ +| .. _pgrst117: | The HTTP verb used in the request in not supported. | +| | | +| PGRST117 | | ++---------------+-------------------------------------------------------------+ .. _pgrst2**: @@ -209,8 +245,8 @@ Related to a :ref:`stale schema cache `. Most of the time, these e .. _pgrst3**: -Group 3 - JWT errors --------------------- +Group 3 - JWT +------------- Related to the authentication process using JWT. You can follow the :ref:`tut1` for an example on how to implement authentication and the :doc:`Authentication page ` for more information on this process. @@ -230,72 +266,19 @@ Related to the authentication process using JWT. You can follow the :ref:`tut1` | PGRST302 | is disabled by not setting it in :ref:`db-anon-role`. | +---------------+-------------------------------------------------------------+ -.. _pgrst4**: +.. The Internal Errors Group X** is always at the end -Group 4 - Hasql ---------------- +.. _pgrst_X**: -Related to `the library `_ that PostgREST uses to connect to the database. If you encounter any of these errors, you may have stumbled on a PostgREST bug, please `open an issue `_ and we'll be glad to fix it. +Group X - Internal +------------------ -+---------------+-------------------------------------------------------------+ -| Code | Description | -+===============+=============================================================+ -| .. _pgrst400: | Internal error: Unexpected Result. | -| | | -| PGRST400 | | -+---------------+-------------------------------------------------------------+ -| .. _pgrst401: | Internal error: Attempted to parse more columns than | -| | there are in the result. | -| PGRST401 | | -+---------------+-------------------------------------------------------------+ -| .. _pgrst402: | Internal error: Attempted to parse a NULL as some value. | -| | | -| PGRST402 | | -+---------------+-------------------------------------------------------------+ -| .. _pgrst403: | Internal error: Wrong value parser used. | -| | | -| PGRST403 | | -+---------------+-------------------------------------------------------------+ -| .. _pgrst404: | Internal error: Unexpected amount of rows. | -| | | -| PGRST404 | | -+---------------+-------------------------------------------------------------+ - -.. _pgrst5**: - -Group 5 - General ------------------ - -These are uncategorized errors. +Internal errors mostly related to `the library `_ that PostgREST uses to connect to the database. If you encounter any of these errors, you may have stumbled on a PostgREST bug, please `open an issue `_ and we'll be glad to fix it. +---------------+-------------------------------------------------------------+ | Code | Description | +===============+=============================================================+ -| .. _pgrst500: | Related to :ref:`guc_resp_hdrs`. | -| | | -| PGRST500 | | -+---------------+-------------------------------------------------------------+ -| .. _pgrst501: | The status code must be a positive integer. | -| | See :ref:`guc_resp_status`. | -| PGRST501 | | -+---------------+-------------------------------------------------------------+ -| .. _pgrst502: | Related to :ref:`binary_output`. See :ref:`providing_img` | -| | for an example on requesting images. | -| PGRST502 | | -+---------------+-------------------------------------------------------------+ -| .. _pgrst503: | For an :ref:`UPSERT using PUT `, when | -| | :ref:`limits and offsets ` are used. | -| PGRST503 | | -+---------------+-------------------------------------------------------------+ -| .. _pgrst504: | For an :ref:`UPSERT using PUT `, when the | -| | primary key in the query string and the body are different. | -| PGRST504 | | -+---------------+-------------------------------------------------------------+ -| .. _pgrst505: | More than 1 or no items where returned when requesting | -| | a singular response. See :ref:`singular_plural`. | -| PGRST505 | | -+---------------+-------------------------------------------------------------+ -| .. _pgrst506: | The HTTP verb used in the request in not supported. | -| | | -| PGRST506 | | +| .. _pgrstX00: | Internal errors related to the library that connects to the | +| | database. | +| PGRSTX00 | | +---------------+-------------------------------------------------------------+ diff --git a/postgrest.dict b/postgrest.dict index f9861cce23..5a3f172710 100644 --- a/postgrest.dict +++ b/postgrest.dict @@ -50,7 +50,6 @@ GUC gucs Gumbs Haskell -Hasql Heroku HMAC Homebrew @@ -108,6 +107,8 @@ PgBouncer pgcrypto pgjwt pgrst +pgrstX +PGRSTX pgSQL phfts phraseto @@ -174,7 +175,6 @@ Tyll TypeScript UI ui -uncategorized unicode unix updatable From 6e24e23b4b99ed1232aa82869933e0211428db20 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Franz-Josef=20F=C3=A4rber?= Date: Thu, 28 Apr 2022 10:31:32 +0200 Subject: [PATCH 502/711] Allow returning XML --- docs/api.rst | 84 +++++++++++++++++++--------------------- docs/configuration.rst | 6 +-- docs/errors.rst | 5 ++- docs/releases/v6.0.2.rst | 2 +- 4 files changed, 46 insertions(+), 51 deletions(-) diff --git a/docs/api.rst b/docs/api.rst index 2eb7e7cd97..3f95f1dcad 100644 --- a/docs/api.rst +++ b/docs/api.rst @@ -801,7 +801,13 @@ The current possibilities are: * ``text/csv`` * ``application/json`` * ``application/openapi+json`` + +and in the special case of a single-column select the following additional three formats; +also see the section :ref:`scalar_return_formats`: + * ``application/octet-stream`` +* ``text/plain`` +* ``text/xml`` The server will default to JSON for API endpoints and OpenAPI on the root. @@ -2216,6 +2222,9 @@ PostgREST will detect if the function is scalar or table-valued and will shape t { "title": "Blade Runner 2049", "rating": 8.1} ] +To manually choose a return format such as binary, plain text or XML, see the section :ref:`scalar_return_formats`. + + .. _bulk_call: Bulk Call @@ -2319,12 +2328,25 @@ You can call overloaded functions with different number of arguments. Overloaded functions with the same argument names but different types are not supported. -.. _binary_output: +.. _scalar_return_formats: + +Response Formats For Scalar Responses +===================================== + +For scalar return values such as + +* single-column selects on tables or +* scalar functions, -Binary Output -============= +you can set the additional content types -If you want to return raw binary data from a :code:`bytea` column, you must specify :code:`application/octet-stream` as part of the :code:`Accept` header +* ``application/octet-stream`` +* ``text/plain`` +* ``text/xml`` + +as part of the :code:`Accept` header. + +Example 1: If you want to return raw binary data from a :code:`bytea` column, you must specify :code:`application/octet-stream` as part of the :code:`Accept` header and select a single column :code:`?select=bin_data`. .. tabs:: @@ -2339,74 +2361,46 @@ and select a single column :code:`?select=bin_data`. curl "http://localhost:3000/items?select=bin_data&id=eq.1" \ -H "Accept: application/octet-stream" -You can also request binary output when calling `Stored Procedures`_ and since they can return a scalar value you are not forced to use :code:`select` -for this case. +Example 2: You can request XML output when calling `Stored Procedures`_ that return a scalar value of type ``text/xml``. You are not forced to use select for this case. .. code-block:: postgres - CREATE FUNCTION closest_point(..) RETURNS bytea .. + CREATE FUNCTION generate_xml_content(..) RETURNS xml .. .. tabs:: .. code-tab:: http - POST /rpc/closest_point HTTP/1.1 - Accept: application/octet-stream + POST /rpc/generate_xml_content HTTP/1.1 + Accept: text/xml .. code-tab:: bash Curl - curl "http://localhost:3000/rpc/closest_point" \ - -X POST -H "Accept: application/octet-stream" + curl "http://localhost:3000/rpc/generate_xml_content" \ + -X POST -H "Accept: text/xml" -If the stored procedure returns non-scalar values, you need to do a :code:`select` in the same way as for GET binary output. +Example 3: If the stored procedure returns non-scalar values, you need to do a :code:`select` in the same way as for GET binary output. .. code-block:: sql - CREATE FUNCTION overlapping_regions(..) RETURNS SETOF TABLE(geom_twkb bytea, ..) .. + CREATE FUNCTION get_descriptions(..) RETURNS SETOF TABLE(id int, description text) .. .. tabs:: .. code-tab:: http - POST /rpc/overlapping_regions?select=geom_twkb HTTP/1.1 - Accept: application/octet-stream - - .. code-tab:: bash Curl - - curl "http://localhost:3000/rpc/overlapping_regions?select=geom_twkb" \ - -X POST -H "Accept: application/octet-stream" - -.. note:: - - If more than one row would be returned the binary results will be concatenated with no delimiter. - -.. _plain_text_output: - -Plain Text Output ------------------ - -You can get raw output from a ``text`` column by using ``Accept: text/plain``. - -.. tabs:: - - .. code-tab:: http - - GET /workers?select=custom_psv_format HTTP/1.1 + POST /rpc/get_descriptions?select=description HTTP/1.1 Accept: text/plain .. code-tab:: bash Curl - curl "http://localhost:3000/workers?select=custom_psv_format" \ - -H "Accept: text/plain" + curl "http://localhost:3000/rpc/get_descriptions?select=description" \ + -X POST -H "Accept: text/plain" -.. code-block:: text +.. note:: - 09310817|JOHN|DOE|15/04/88| - 42152780|FRED|BLOGGS|20/02/85| - 43006541|OTTO|NORMALVERBRAUCHER|01/07/90| - 02452492|ERIKA|MUSTERMANN|11/01/80| + If more than one row would be returned the binary/plain-text/xml results will be concatenated with no delimiter. -This follows the same rules as :ref:`binary_output`. .. _open-api: diff --git a/docs/configuration.rst b/docs/configuration.rst index 57c22199b5..9d2a336197 100644 --- a/docs/configuration.rst +++ b/docs/configuration.rst @@ -587,14 +587,14 @@ raw-media-types This serves to extend the `Media Types `_ that PostgREST currently accepts through an ``Accept`` header. - These media types can be requested by following the same rules as the ones defined in :ref:`binary_output`. + These media types can be requested by following the same rules as the ones defined in :ref:`scalar_return_formats`. As an example, the below config would allow you to request an **image** and a **XML** file by doing a request with ``Accept: image/png`` - or ``Accept: text/xml``, respectively. + or ``Accept: font/woff2``, respectively. .. code:: bash - raw-media-types="image/png, text/xml" + raw-media-types="image/png, font/woff2" .. _server-host: diff --git a/docs/errors.rst b/docs/errors.rst index 248051f98c..08782f4ecc 100644 --- a/docs/errors.rst +++ b/docs/errors.rst @@ -193,8 +193,9 @@ Related to the HTTP request elements. | | See :ref:`guc_resp_status`. | | PGRST112 | | +---------------+-------------------------------------------------------------+ -| .. _pgrst113: | Related to :ref:`binary_output`. See :ref:`providing_img` | -| | for an example on requesting images. | +| .. _pgrst113: | Related to :ref:`scalar_return_formats`. | +| | See :ref:`providing_img` for an example on requesting | +| | images. | | PGRST113 | | +---------------+-------------------------------------------------------------+ | .. _pgrst114: | For an :ref:`UPSERT using PUT `, when | diff --git a/docs/releases/v6.0.2.rst b/docs/releases/v6.0.2.rst index 88a73ee5c8..f96550515c 100644 --- a/docs/releases/v6.0.2.rst +++ b/docs/releases/v6.0.2.rst @@ -23,7 +23,7 @@ Added * Bulk calling an RPC is now allowed. See :ref:`bulk_call`. |br| -- `@steve-chavez `_ -* It's now possible to request a ``text/plain`` output. See :ref:`plain_text_output`. +* It's now possible to request a ``text/plain`` output. See :ref:`scalar_return_formats`. |br| -- `@steve-chavez `_ * Config option for specifying PostgREST database pool timeout. See :ref:`db-pool-timeout`. From 496a1734eca3163f20ccdfa4336462c51ccbda62 Mon Sep 17 00:00:00 2001 From: Laurence Isla Date: Wed, 18 May 2022 20:50:06 -0500 Subject: [PATCH 503/711] Add documentation on embedding views containing joins --- docs/api.rst | 52 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) diff --git a/docs/api.rst b/docs/api.rst index 3f95f1dcad..cedbd4aa27 100644 --- a/docs/api.rst +++ b/docs/api.rst @@ -1227,6 +1227,58 @@ It's also possible to embed `Materialized Views Date: Thu, 19 May 2022 16:44:31 -0500 Subject: [PATCH 504/711] Fix main explanation on views with joins (#537) * Fix indentation and example view * Change films.id to just id --- docs/api.rst | 38 ++++++++++++++++++-------------------- 1 file changed, 18 insertions(+), 20 deletions(-) diff --git a/docs/api.rst b/docs/api.rst index cedbd4aa27..5b30e6bd11 100644 --- a/docs/api.rst +++ b/docs/api.rst @@ -1230,54 +1230,52 @@ It's also possible to embed `Materialized Views Date: Thu, 19 May 2022 20:37:27 -0500 Subject: [PATCH 505/711] Add how to work with array columns (#538) --- .../working-with-postgresql-data-types.rst | 133 +++++++++++++++++- 1 file changed, 131 insertions(+), 2 deletions(-) diff --git a/docs/how-tos/working-with-postgresql-data-types.rst b/docs/how-tos/working-with-postgresql-data-types.rst index 06276f6c79..c5095bd9f6 100644 --- a/docs/how-tos/working-with-postgresql-data-types.rst +++ b/docs/how-tos/working-with-postgresql-data-types.rst @@ -127,6 +127,135 @@ Now, you can insert a new product using a JSON object for the ``extra_info`` col To query and filter the data see :ref:`json_columns` for a complete reference. +Arrays +------ + +To handle `array types `_ you can use string representation or JSON array format. For instance, let's create the following table: + +.. code-block:: postgres + + create table movies ( + id int primary key, + title text not null, + tags text[], + performance_times time[] + ); + +To insert a new value you can use string representation. + +.. tabs:: + + .. code-tab:: http + + POST /movies HTTP/1.1 + Content-Type: application/json + + { + "id": 1, + "title": "Paddington", + "tags": "{family,comedy,not streamable}", + "performance_times": "{12:40,15:00,20:00}" + } + + .. code-tab:: bash Curl + + curl "http://localhost:3000/movies" \ + -X POST -H "Content-Type: application/json" \ + -d @- << EOF + { + "id": 1, + "title": "Paddington", + "tags": "{family,comedy,not streamable}", + "performance_times": "{12:40,15:00,20:00}" + } + EOF + +Or you could send the data using a JSON array format. The following request sends the same data as the example above: + +.. tabs:: + + .. code-tab:: http + + POST /movies HTTP/1.1 + Content-Type: application/json + + { + "id": 1, + "title": "Paddington", + "tags": ["family", "comedy", "not streamable"], + "performance_times": ["12:40", "15:00", "20:00"] + } + + .. code-tab:: bash Curl + + curl "http://localhost:3000/movies" \ + -X POST -H "Content-Type: application/json" \ + -d @- << EOF + { + "id": 1, + "title": "Paddington", + "tags": ["family", "comedy", "not streamable"], + "performance_times": ["12:40", "15:00", "20:00"] + } + EOF + +To query the data you can use the arrow operators. See :ref:`composite_array_columns`. + +Multidimensional Arrays +~~~~~~~~~~~~~~~~~~~~~~~ + +Handling multidimensional arrays is no different than handling one-dimensional ones: both the string representation and the JSON array format are allowed. For example, let's add a new column to the table: + +.. code-block:: postgres + + -- The column stores the cinema, floor and auditorium numbers in that order + alter table movies + add column cinema_floor_auditorium int[][][]; + +Now, let's update the row we inserted before using JSON array format: + +.. tabs:: + + .. code-tab:: http + + PATCH /movies?id=eq.1 HTTP/1.1 + Content-Type: application/json + + { + "cinema_floor_auditorium": [ [ [1,2], [6,7] ], [ [3,5], [8,9] ] ] + } + + .. code-tab:: bash Curl + + curl "http://localhost:3000/movies?id=eq.1" \ + -X PATCH -H "Content-Type: application/json" \ + -d @- << EOF + { + "cinema_floor_auditorium": [ [ [1,2], [6,7] ], [ [3,5], [8,9] ] ] + } + EOF + +Now, for example, to query the auditoriums that are located in the first cinema (position 0 in the array) and on the second floor (position 1 in the next inner array), we can use the arrow operators this way: + +.. tabs:: + + .. code-tab:: http + + GET /movies?select=title,auditorium:cinema_floor_auditorium->0->1&id=eq.1 HTTP/1.1 + + .. code-tab:: bash Curl + + curl "http://localhost:3000/movies?select=title,auditorium:cinema_floor_auditorium->0->1&id=eq.1" + +.. code-block:: json + + [ + { + "title": "Paddington", + "auditorium": [6,7] + } + ] + Composite Types --------------- @@ -203,7 +332,7 @@ Or, you could insert the data in JSON format. The following request is equivalen } EOF -You can also query data using the arrow operators as you would for :ref:`JSON columns `. +You can also query data using the arrow operators. See :ref:`composite_array_columns`. Ranges ------ @@ -391,7 +520,7 @@ You can also query and filter the value of a ``hstore`` column using the arrow o [{ "native": "مصر" }] PostGIS ------------------- +------- You can use the string representation for `PostGIS `_ data types such as ``geometry`` or ``geography``. As an example, let's create a table using the ``geometry`` type (you need to `install PostGIS `_ first). From 06956c1994264d7c1b7c23d0d55ca04d95d612c5 Mon Sep 17 00:00:00 2001 From: Laurence Isla Date: Tue, 24 May 2022 20:36:17 -0500 Subject: [PATCH 506/711] Add explicit use of special timestamp values --- docs/how-tos/working-with-postgresql-data-types.rst | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/how-tos/working-with-postgresql-data-types.rst b/docs/how-tos/working-with-postgresql-data-types.rst index c5095bd9f6..c439301d04 100644 --- a/docs/how-tos/working-with-postgresql-data-types.rst +++ b/docs/how-tos/working-with-postgresql-data-types.rst @@ -58,17 +58,17 @@ Someone located in Cairo can retrieve the data using their local time, too: The response has the date in the time zone configured by the server: ``UTC -05:00``. -You can use other comparative filters and also `PostgreSQL special date/time input values `_. For instance, to get the reports that are due after today you would do: +You can use other comparative filters and also all the `PostgreSQL special date/time input values `_ as illustrated in this example: .. tabs:: .. code-tab:: http - GET /reports?due_date=gt.today HTTP/1.1 + GET /reports?or=(and(due_date.gte.today,due_date.lte.tomorrow),and(due_date.gt.-infinity,due_date.lte.epoch)) HTTP/1.1 .. code-tab:: bash Curl - curl "http://localhost:3000/reports?due_date=gt.today" + curl "http://localhost:3000/reports?or=(and(due_date.gte.today,due_date.lte.tomorrow),and(due_date.gt.-infinity,due_date.lte.epoch))" .. code-block:: json From 209b70cbfca8b23f7cf0f0b8b9d5822079e6aeff Mon Sep 17 00:00:00 2001 From: Laurence Isla Date: Wed, 25 May 2022 17:29:52 -0500 Subject: [PATCH 507/711] Add disclaimer on $ usage in jwt-secret values (#543) --- docs/configuration.rst | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docs/configuration.rst b/docs/configuration.rst index 9d2a336197..66061904b4 100644 --- a/docs/configuration.rst +++ b/docs/configuration.rst @@ -480,6 +480,10 @@ jwt-secret Choosing a value for this parameter beginning with the at sign such as ``@filename`` (e.g. ``@./configs/my-config``) loads the secret out of an external file. + .. warning:: + + Only when using the :ref:`file_config`, if the ``jwt-secret`` contains a ``$`` character by itself it will give errors. In this case, use ``$$`` and PostgREST will interpret it as a single ``$`` character. + .. _jwt-secret-is-base64: jwt-secret-is-base64 From 96c169e593b5ef75a461da5a15a0e6e3fac68602 Mon Sep 17 00:00:00 2001 From: Laurence Isla Date: Fri, 27 May 2022 17:12:47 -0500 Subject: [PATCH 508/711] Add bytea to working with types and improve img example (#542) --- docs/how-tos/providing-images-for-img.rst | 82 ++++++------------- .../working-with-postgresql-data-types.rst | 78 ++++++++++++++++++ docs/index.rst | 3 +- postgrest.dict | 1 + 4 files changed, 106 insertions(+), 58 deletions(-) diff --git a/docs/how-tos/providing-images-for-img.rst b/docs/how-tos/providing-images-for-img.rst index 989e197494..f1d892e0d6 100644 --- a/docs/how-tos/providing-images-for-img.rst +++ b/docs/how-tos/providing-images-for-img.rst @@ -5,25 +5,18 @@ Providing images for ```` :author: `pkel `_ -In this how-to, you will learn how to create an endpoint for providing images to HTML :code:`` tags without client side JavaScript. -The resulting HTML might look like this: +In this how-to, you will learn how to create an endpoint for providing images to HTML :code:`` tags without client side JavaScript. In fact, the presented technique is suitable for providing not only images, but arbitrary files. -.. code-block:: html - - Cute Kittens +We will start with a minimal example that highlights the general concept. +Afterwards we present a more detailed solution that fixes a few shortcomings of the first approach. -In fact, the presented technique is suitable for providing not only images, but arbitrary files. +.. warning:: -We will start with a minimal example that highlights the general concept. -Afterwards we present are more detailed solution that fixes a few shortcomings of the first approach. + Be careful when saving binaries in the database, having a separate storage service for these is preferable in most cases. See `Storing Binary files in the Database `_. Minimal Example --------------- -PostgREST returns binary data on requests that set the :code:`Accept: application/octet-stream` header. -The general idea is to configure the reverse proxy in front of the API to set this header for all requests to :code:`/files/`. -We will show how to achieve this using Nginx. - First, we need a public table for storing the files. .. code-block:: postgres @@ -36,64 +29,40 @@ First, we need a public table for storing the files. Let's assume this table contains an image of two cute kittens with id 42. We can retrieve this image in binary format from our PostgREST API by requesting :code:`/files?select=blob&id=eq.42` with the :code:`Accept: application/octet-stream` header. Unfortunately, putting the URL into the :code:`src` of an :code:`` tag will not work. -That's because browsers do not send the required header. - -Luckily, we can configure our :doc:`Nginx reverse proxy <../admin>` to fix this problem for us. -We assume that PostgREST is running on port 3000. -We provide a new location :code:`/files/` that redirects requests to our endpoint with the :code:`Accept` header set to :code:`application/octet-stream`. - -.. code-block:: nginx - - server { - # rest of reverse proxy and web server configuration - ... - - location /files/ { - # /files//* ---> /files?select=blob&id=eq. - rewrite /files/([^/]+).* /files?select=blob&id=eq.$1 break; - # if id is missing - return 404; - # request binary output - proxy_set_header Accept application/octet-stream; - # usual proxy setup - proxy_hide_header Content-Location; - add_header Content-Location /api/$upstream_http_content_location; - proxy_set_header Connection ""; - proxy_http_version 1.1; - proxy_pass http://localhost:3000/; - } - -With this setup, we can request the cat image at :code:`localhost/files/42/cats.jpeg` without setting any headers. -In fact, you can replace :code:`cats.jpeg` with any other filename or simply omit it. -Putting the URL into the :code:`src` of an :code:`` tag should now work as expected. +That's because browsers do not send the required :code:`Accept: application/octet-stream` header. + +Luckily we can specify the accepted media types in the :ref:`raw-media-types` configuration variable. +In this case, the :code:`Accept: image/webp` header is sent by many web browsers by default, so let's add it to the configuration variable, like this: :code:`raw-media-types="image/webp"`. +Now, the image will be displayed in the HTML page: + +.. code-block:: html + + Cute Kittens Improved Version ---------------- The basic solution has some shortcomings: -1. The response :code:`Content-Type` header is set to :code:`application/octet-stream`. - This might confuse clients and users. -2. Download requests (e.g. Right Click -> Save Image As) to :code:`files/42` will propose :code:`42` as filename. +1. The response :code:`Content-Type` header is set to :code:`image/webp`. + This might be a problem if you want to specify a different format for the file. +2. Download requests (e.g. Right Click -> Save Image As) to :code:`/files?select=blob&id=eq.42` will propose :code:`files` as filename. This might confuse users. 3. Requests to the binary endpoint are not cached. This will cause unnecessary load on the database. The following improved version addresses these problems. -First, we store the media types and names of our files in the database. +First, in addition to the minimal example, we need to store the media types and names of our files in the database. .. code-block:: postgres - create table files( - id int primary key - , type text - , name text - , blob bytea - ); + alter table files + add column type text, + add column name text; Next, we set up an RPC endpoint that sets the content type and filename. We use this opportunity to configure some basic, client-side caching. -For production, you probably want to configure additional caches, e.g. on the reverse proxy. +For production, you probably want to configure additional caches, e.g. on the :ref:`reverse proxy `. .. code-block:: postgres @@ -120,9 +89,8 @@ For production, you probably want to configure additional caches, e.g. on the re end $$ language plpgsql; -With this, we can obtain the cat image from :code:`/rpc/file?id=42`. -Consequently, we have to replace our previous rewrite rule in the Nginx recipe with the following. +With this, we can obtain the cat image from :code:`/rpc/file?id=42`. Thus, the resulting HTML will be: -.. code-block:: nginx +.. code-block:: html - rewrite /files/([^/]+).* /rpc/file?id=$1 break; + Cute Kittens diff --git a/docs/how-tos/working-with-postgresql-data-types.rst b/docs/how-tos/working-with-postgresql-data-types.rst index c439301d04..9cfcf52794 100644 --- a/docs/how-tos/working-with-postgresql-data-types.rst +++ b/docs/how-tos/working-with-postgresql-data-types.rst @@ -5,6 +5,10 @@ Working with PostgreSQL data types PostgREST makes use of PostgreSQL string representations to work with data types. Thanks to this, you can use special values, such as ``now`` for timestamps, ``yes`` for booleans or time values including the time zones. This page describes how you can take advantage of these string representations to perform operations on different PostgreSQL data types. +.. contents:: + :local: + :depth: 1 + Timestamps ---------- @@ -461,6 +465,80 @@ Finally, do the request :ref:`casting the range column `: create cast (mytsrange as json) with function mytsrange_to_json(mytsrange) as assignment; +Bytea +----- + +To send raw binary to PostgREST you need a function with a single unnamed parameter of `bytea type `_. For example, let's create a table that will save some files and a function that inserts data to that table: + +.. code-block:: postgres + + create table files ( + id int primary key generated always as identity, + file bytea + ); + + create function upload_binary(bytea) returns void as $$ + insert into files (file) values ($1); + $$ language sql; + +Next, let's use the PostgREST logo for our test. + +.. code-block:: bash + + curl "https://postgrest.org/en/latest/_images/logo.png" -o postgrest-logo.png + +Now, to send the file ``postgrest-logo.png`` we need to set the ``Content-Type: application/octet-stream`` header in the request: + +.. tabs:: + + .. code-tab:: http + + POST /rpc/upload_binary HTTP/1.1 + Content-Type: application/octet-stream + + postgrest-logo.png + + .. code-tab:: bash Curl + + curl "http://localhost:3000/rpc/upload_binary" \ + -X POST -H "Content-Type: application/octet-stream" \ + --data-binary "@postgrest-logo.png" + +To get the image from the database, you will need to set the ``Accept: application/octet-stream`` header in the request and select only the +``bytea`` column. + +.. tabs:: + + .. code-tab:: http + + GET /files?select=file&id=eq.1 HTTP/1.1 + Accept: application/octet-stream + + .. code-tab:: bash Curl + + curl "http://localhost:3000/files?select=file&id=eq.1" \ + -H "Accept: application/octet-stream" + +You can also use more accurate headers depending on the type of the files by using the :ref:`raw-media-types` configuration. For example, adding the ``raw-media-types="image/png"`` setting to the configuration file will allow you to use the ``Accept: image/png`` header: + +.. tabs:: + + .. code-tab:: http + + GET /files?select=file&id=eq.1 HTTP/1.1 + Accept: image/png + + .. code-tab:: bash Curl + + curl "http://localhost:3000/files?select=file&id=eq.1" \ + -H "Accept: image/png" + +See :ref:`providing_img` for a step-by-step example on how to handle images in HTML. + +.. warning:: + + Be careful when saving binaries in the database, having a separate storage service for these is preferable in most cases. See `Storing Binary files in the Database `_. + hstore ------ diff --git a/docs/index.rst b/docs/index.rst index e2caa80962..c26e2477af 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -203,7 +203,8 @@ These are recipes that'll help you address specific use-cases. :caption: How-to guides :hidden: - how-tos/* + how-tos/working-with-postgresql-data-types + how-tos/providing-images-for-img - :doc:`how-tos/providing-images-for-img` - :doc:`how-tos/working-with-postgresql-data-types` diff --git a/postgrest.dict b/postgrest.dict index 5a3f172710..fe4bf205a8 100644 --- a/postgrest.dict +++ b/postgrest.dict @@ -15,6 +15,7 @@ booleans Bouscal buildpack bugfixes +Bytea Cardano cd centric From 48783087de6307bbeae39abd3c938cb41b1beca4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Franz-Josef=20F=C3=A4rber?= Date: Thu, 2 Jun 2022 12:07:35 +0200 Subject: [PATCH 509/711] RPC POST for function w/single unnamed XML param, postgrest-PR #2300 --- docs/api.rst | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/docs/api.rst b/docs/api.rst index 5b30e6bd11..886b465785 100644 --- a/docs/api.rst +++ b/docs/api.rst @@ -2043,7 +2043,7 @@ You can also call a function that takes a single parameter of type JSON by sendi Calling functions with a single unnamed parameter ------------------------------------------------- -You can make a POST request to a function with a single unnamed parameter to send raw ``json/jsonb``, ``bytea`` or ``text`` data. +You can make a POST request to a function with a single unnamed parameter to send raw ``json/jsonb``, ``bytea``, ``text`` or ``xml`` data. To send raw JSON, the function must have a single unnamed ``json`` or ``jsonb`` parameter and the header ``Content-Type: application/json`` must be included in the request. @@ -2076,6 +2076,8 @@ To send raw JSON, the function must have a single unnamed ``json`` or ``jsonb`` If an overloaded function has a single ``json`` or ``jsonb`` unnamed parameter, PostgREST will call this function as a fallback provided that no other overloaded function is found with the parameters sent in the POST request. +To send raw XML, the parameter type must be ``xml`` and the header ``Content-Type: text/xml`` must be included in the request. + To send raw binary, the parameter type must be ``bytea`` and the header ``Content-Type: application/octet-stream`` must be included in the request. .. code-block:: plpgsql From 580184532b8d39d077fd71ddad060c46e84a8e02 Mon Sep 17 00:00:00 2001 From: Laurence Isla Date: Tue, 14 Jun 2022 10:40:10 -0500 Subject: [PATCH 510/711] Add 9.0.1 changelog --- docs/index.rst | 1 + docs/releases/latest.rst | 20 --------- docs/releases/v9.0.1.rst | 89 ++++++++++++++++++++++++++++++++++++++++ postgrest.dict | 2 + 4 files changed, 92 insertions(+), 20 deletions(-) create mode 100644 docs/releases/v9.0.1.rst diff --git a/docs/index.rst b/docs/index.rst index c26e2477af..db3a181d50 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -99,6 +99,7 @@ The project has a friendly and growing community. Join our `chat room + v9.0.1 v9.0.0 releases/v8.0.0 releases/v7.0.1 diff --git a/docs/releases/latest.rst b/docs/releases/latest.rst index 101d8fd773..e09ccb247b 100644 --- a/docs/releases/latest.rst +++ b/docs/releases/latest.rst @@ -67,38 +67,18 @@ Documentation improvements Bug fixes --------- -* Execute deferred constraint triggers when using ``Prefer: tx=rollback`` (`#2020 `_) - * Return ``204 No Content`` without ``Content-Type`` for ``PUT`` (`#2058 `_) -* Fix ``is`` not working with upper or mixed case values like ``NULL, TrUe, FaLsE`` (`#2077 `_) - -* Fix schema cache loading when views with ``XMLTABLE`` and ``DEFAULT`` are present (`#2024 `_) - -* Fix wrong CORS header Authentication -> Authorization (`#1724 `_) - * Clarify error for failed schema cache load. (`#2107 `_) - From ``Database connection lost. Retrying the connection`` to ``Could not query the database for the schema cache. Retrying.`` -* Fix reading database configuration properly when ``=`` is present in its value (`#2120 `_) - * Fix silently ignoring filter on a non-existent embedded resource (`#1771 `_) -* Remove trigger functions from schema cache and OpenAPI output, because they can't be called directly anyway. (`#2135 `_) - -* Remove aggregates, procedures and window functions from the schema cache and OpenAPI output. (`#2101 `_) - * Remove functions, which are not callable due to unnamed arguments, from schema cache and OpenAPI output. (`#2152 `_) * Fix accessing JSON array fields with ``->`` and ``->>`` in ``?select=`` and ``?order=``. (`#2145 `_) -* Fix ``--dump-schema`` running with a wrong PG version. (`#2153 `_) - -* Keep working when ``EMFILE (Too many open files)`` is reached. (`#2042 `_) - -* Ignore ``Content-Type`` headers for ``GET`` requests when calling RPCs. Previously, ``GET`` without parameters, but with ``Content-Type: text/plain`` or ``Content-Type: application/octet-stream`` would fail with ``404 Not Found``, even if a function without arguments was available. (`#2147 `_) - Breaking changes ---------------- diff --git a/docs/releases/v9.0.1.rst b/docs/releases/v9.0.1.rst new file mode 100644 index 0000000000..ffec1ee2ad --- /dev/null +++ b/docs/releases/v9.0.1.rst @@ -0,0 +1,89 @@ + +PostgREST 9.0.1 +=============== + +This version includes important fixes for production environments and other miscellaneous fixes. You can download the pre-compiled binaries on the `GitHub release page `_. + +Bug Fixes +--------- + +* Keep working when ``EMFILE (Too many open files)`` is reached. (`#2042 `_) + +* Disable parallel GC for better performance on higher core CPUs (`#2294 `_). Thanks to `NoRedInk for their blog post `_ that lead us to this fix. + +* Fix using CPU while idle. (`#1076 `_) + +* Fix reading database configuration properly when ``=`` is present in the value. (`#2120 `_) + +* Fix ``is`` not working with upper or mixed case values like ``NULL``, ``TrUe``, ``FaLsE``. (`#2077 `_) + +* Execute deferred constraint triggers when using ``Prefer: tx=rollback``. (`#2020 `_) + +* Ignore ``Content-Type`` headers for ``GET`` requests when calling RPCs. (`#2147 `_) + + * Previously, ``GET`` without parameters, but with ``Content-Type: text/plain`` or ``Content-Type: application/octet-stream`` would fail with ``404 Not Found``, even if a function without arguments was available. + +* Fix wrong CORS header from ``Authentication`` to ``Authorization``. (`#1724 `_) + +* Fix ``json`` and ``jsonb`` columns showing a type in OpenAPI spec. (`#2165 `_) + +* Remove trigger functions from the schema cache and OpenAPI output, because they can't be called directly anyway. (`#2135 `_) + +* Remove aggregates, procedures and window functions from the schema cache and OpenAPI output. (`#2101 `_) + +* Fix schema cache loading when views with ``XMLTABLE`` and ``DEFAULT`` are present. (`#2024 `_) + +* Fix ``--dump-schema`` running with a wrong PG version. (`#2153 `_) + +* Fix misleading disambiguation error where the content of the ``relationship`` key looks like valid syntax. (`#2239 `_) + +Thanks +------ + +Big thanks from the `PostgREST team `_ to our sponsors! + +.. container:: image-container + + .. image:: ../_static/cybertec-new.png + :target: https://www.cybertec-postgresql.com/en/?utm_source=postgrest.org&utm_medium=referral&utm_campaign=postgrest + :width: 13em + + .. image:: ../_static/2ndquadrant.png + :target: https://www.2ndquadrant.com/en/?utm_campaign=External%20Websites&utm_source=PostgREST&utm_medium=Logo + :width: 13em + + .. image:: ../_static/retool.png + :target: https://retool.com/?utm_source=sponsor&utm_campaign=postgrest + :width: 13em + + .. image:: ../_static/gnuhost.png + :target: https://gnuhost.eu/?utm_source=sponsor&utm_campaign=postgrest + :width: 13em + + .. image:: ../_static/supabase.png + :target: https://supabase.com/?utm_source=postgrest%20backers&utm_medium=open%20source%20partner&utm_campaign=postgrest%20backers%20github&utm_term=homepage + :width: 13em + + .. image:: ../_static/oblivious.jpg + :target: https://oblivious.ai/?utm_source=sponsor&utm_campaign=postgrest + :width: 13em + +* Evans Fernandes +* `Jan Sommer `_ +* `Franz Gusenbauer `_ +* `Daniel Babiak `_ +* Tsingson Qin +* Michel Pelletier +* Jay Hannah +* Robert Stolarz +* Nicholas DiBiase +* Christopher Reid +* Nathan Bouscal +* Daniel Rafaj +* David Fenko +* Remo Rechkemmer +* Severin Ibarluzea +* Tom Saleeba +* Pawel Tyll + +If you like to join them please consider `supporting PostgREST development `_. diff --git a/postgrest.dict b/postgrest.dict index fe4bf205a8..2262fe9bc9 100644 --- a/postgrest.dict +++ b/postgrest.dict @@ -24,6 +24,7 @@ ClojureScript cloudfared config CORS +CPUs cryptographically CSV Daemonizing @@ -41,6 +42,7 @@ Fernandes filename FreeBSD fts +GC GHC Github Google From a9baa5bc9f73009d19b87fb24b252eaea3206ef1 Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Wed, 15 Jun 2022 23:11:42 -0500 Subject: [PATCH 511/711] lowercase upsert --- docs/api.rst | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/docs/api.rst b/docs/api.rst index 886b465785..e41e7513ab 100644 --- a/docs/api.rst +++ b/docs/api.rst @@ -1724,10 +1724,10 @@ Updates also support :code:`Prefer: return=representation` plus :ref:`v_filter`. .. _upsert: -UPSERT +Upsert ====== -You can make an UPSERT with :code:`POST` and the :code:`Prefer: resolution=merge-duplicates` header: +You can make an upsert with :code:`POST` and the :code:`Prefer: resolution=merge-duplicates` header: .. tabs:: @@ -1755,17 +1755,17 @@ You can make an UPSERT with :code:`POST` and the :code:`Prefer: resolution=merge ] EOF -By default, UPSERT operates based on the primary key columns, you must specify all of them. You can also choose to ignore the duplicates with :code:`Prefer: resolution=ignore-duplicates`. This works best when the primary key is natural, but it's also possible to use it if the primary key is surrogate (example: "id serial primary key"). For more details read `this issue `_. +By default, upsert operates based on the primary key columns, you must specify all of them. You can also choose to ignore the duplicates with :code:`Prefer: resolution=ignore-duplicates`. This works best when the primary key is natural, but it's also possible to use it if the primary key is surrogate (example: "id serial primary key"). For more details read `this issue `_. .. important:: - After creating a table or changing its primary key, you must refresh PostgREST schema cache for UPSERT to work properly. To learn how to refresh the cache see :ref:`schema_reloading`. + After creating a table or changing its primary key, you must refresh PostgREST schema cache for upsert to work properly. To learn how to refresh the cache see :ref:`schema_reloading`. .. _on_conflict: On Conflict ----------- -By specifying the ``on_conflict`` query parameter, you can make UPSERT work on a column(s) that has a UNIQUE constraint. +By specifying the ``on_conflict`` query parameter, you can make upsert work on a column(s) that has a UNIQUE constraint. .. tabs:: @@ -1798,7 +1798,7 @@ By specifying the ``on_conflict`` query parameter, you can make UPSERT work on a PUT --- -A single row UPSERT can be done by using :code:`PUT` and filtering the primary key columns with :code:`eq`: +A single row upsert can be done by using :code:`PUT` and filtering the primary key columns with :code:`eq`: .. tabs:: @@ -2385,7 +2385,7 @@ You can call overloaded functions with different number of arguments. Response Formats For Scalar Responses ===================================== -For scalar return values such as +For scalar return values such as * single-column selects on tables or * scalar functions, From 5305998a952b0a84c76ed7d6a3935ca7a9d3e2d8 Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Wed, 15 Jun 2022 23:32:53 -0500 Subject: [PATCH 512/711] disallowed full table update --- docs/api.rst | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/docs/api.rst b/docs/api.rst index e41e7513ab..54426024e2 100644 --- a/docs/api.rst +++ b/docs/api.rst @@ -1716,11 +1716,9 @@ To update a row or rows in a table, use the PATCH verb. Use :ref:`h_filter` to s -X PATCH -H "Content-Type: application/json" \ -d '{ "category": "child" }' -Updates also support :code:`Prefer: return=representation` plus :ref:`v_filter`. - -.. warning:: +Doing a full table update without filters is not allowed and will result in 0 updated rows. To make a an update without filters, you must limit the rows affected. See :ref:`limited_update_delete`. - Beware of accidentally updating every row in a table. To learn to prevent that see :ref:`block_fulltable`. +Updates also support :code:`Prefer: return=representation` plus :ref:`v_filter`. .. _upsert: From 13ce0f33548c741fabd1800f2ffa3c313a00b4f7 Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Wed, 15 Jun 2022 23:51:04 -0500 Subject: [PATCH 513/711] add bulk update --- docs/api.rst | 33 +++++++++++++++++++++++++++++++++ docs/releases/latest.rst | 5 +++++ postgrest.dict | 2 ++ 3 files changed, 40 insertions(+) diff --git a/docs/api.rst b/docs/api.rst index 54426024e2..5d34ecf776 100644 --- a/docs/api.rst +++ b/docs/api.rst @@ -1720,6 +1720,39 @@ Doing a full table update without filters is not allowed and will result in 0 up Updates also support :code:`Prefer: return=representation` plus :ref:`v_filter`. +.. _bulk_update: + +Bulk Update +----------- + +You can update rows with different data by providing a JSON array of objects having uniform keys, the rows will be chosen based on the primary key column(s) values. + +.. tabs:: + + .. code-tab:: http + + PATCH /employees HTTP/1.1 + + [ + { "id": 1, "name": "Renamed employee 1", "salary": 40000 }, + { "id": 2, "name": "Renamed employee 2", "salary": 52000 }, + { "id": 3, "name": "Renamed employee 3", "salary": 60000 } + ] + + .. code-tab:: bash Curl + + curl "http://localhost:3000/employees" \ + -X PATCH -H "Content-Type: application/json" \ + -d @- << EOF + [ + { "id": 1, "name": "Renamed employee 1", "salary": 40000 }, + { "id": 2, "name": "Renamed employee 2", "salary": 52000 }, + { "id": 3, "name": "Renamed employee 3", "salary": 60000 } + ] + EOF + +You must not include any filters for this to work. If you provide filters, only the values of the first object in the array will be used for the update. + .. _upsert: Upsert diff --git a/docs/releases/latest.rst b/docs/releases/latest.rst index e09ccb247b..3b7eaaf97a 100644 --- a/docs/releases/latest.rst +++ b/docs/releases/latest.rst @@ -10,6 +10,11 @@ Features API ~~~ +Bulk Update +^^^^^^^^^^^ + +See :ref:`bulk_update`. + Access Composite Type fields and Array elements ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/postgrest.dict b/postgrest.dict index 2262fe9bc9..d1430e1f6d 100644 --- a/postgrest.dict +++ b/postgrest.dict @@ -182,6 +182,8 @@ unicode unix updatable UPSERT +Upsert +upsert uri url urls From 360cfa3fbd0e6a6f4b3f39a488f56e838c3fc8b2 Mon Sep 17 00:00:00 2001 From: Steve Chavez Date: Mon, 20 Jun 2022 13:50:47 -0500 Subject: [PATCH 514/711] clarify errors (#550) --- docs/errors.rst | 42 ++++++++++++++++++++++++++---------------- 1 file changed, 26 insertions(+), 16 deletions(-) diff --git a/docs/errors.rst b/docs/errors.rst index 08782f4ecc..e3473e4878 100644 --- a/docs/errors.rst +++ b/docs/errors.rst @@ -3,12 +3,17 @@ Error Source ============ -For the most part, error messages will come directly from the database with the same `structure that PostgreSQL uses `_, PostgREST will convert the ``MESSAGE``, ``DETAIL``, ``HINT`` and ``ERRCODE`` from the PostgreSQL error to JSON format and add an HTTP status code to the response (see :ref:`status_codes`). For instance, this is the error you will get when querying a nonexistent table: +For the most part, error messages will come directly from the database with the same `structure that PostgreSQL uses `_. PostgREST will convert the ``MESSAGE``, ``DETAIL``, ``HINT`` and ``ERRCODE`` from the PostgreSQL error to JSON format and add an HTTP status code to the response (see :ref:`status_codes`). For instance, this is the error you will get when querying a nonexistent table: .. code-block:: http GET /nonexistent_table?id=eq.1 HTTP/1.1 +.. code-block:: http + + HTTP/1.1 404 Not Found + Content-Type: application/json; charset=utf-8 + .. code-block:: json { @@ -18,12 +23,17 @@ For the most part, error messages will come directly from the database with the "message": "relation \"api.nonexistent_table\" does not exist" } -However, some errors do come from PostgREST itself (such as those related to the :ref:`schema_cache`). These have the same structure as the PostgreSQL errors (message, details, hint and code) but are differentiated by the ``PGRST`` prefix in the ``code`` field (see :ref:`pgrst_errors`). For instance, when querying a function that does not exist, the error will be: +However, some errors do come from PostgREST itself (such as those related to the :ref:`schema_cache`). These have the same structure as the PostgreSQL errors but are differentiated by the ``PGRST`` prefix in the ``code`` field (see :ref:`pgrst_errors`). For instance, when querying a function that does not exist, the error will be: .. code-block:: http POST /rpc/nonexistent_function HTTP/1.1 +.. code-block:: http + + HTTP/1.1 404 Not Found + Content-Type: application/json; charset=utf-8 + .. code-block:: json { @@ -149,11 +159,11 @@ Related to the HTTP request elements. | | verbs are allowed. Any other verb will throw this error. | | PGRST101 | | +---------------+-------------------------------------------------------------+ -| .. _pgrst102: | Related to the request body structure. | -| | See :ref:`insert` and :ref:`update`. | +| .. _pgrst102: | An invalid request body was sent(e.g. an empty body or | +| | malformed JSON). | | PGRST102 | | +---------------+-------------------------------------------------------------+ -| .. _pgrst103: | Related to :ref:`limits`. | +| .. _pgrst103: | An invalid range was specified for :ref:`limits`. | | | | | PGRST103 | | +---------------+-------------------------------------------------------------+ @@ -161,7 +171,7 @@ Related to the HTTP request elements. | | or it doesn't exist. | | PGRST104 | | +---------------+-------------------------------------------------------------+ -| .. _pgrst105: | Related to an :ref:`UPSERT using PUT `. | +| .. _pgrst105: | An invalid :ref:`PUT ` request was done | | | | | PGRST105 | | +---------------+-------------------------------------------------------------+ @@ -185,17 +195,17 @@ Related to the HTTP request elements. | | modifies more rows than the maximum specified in the limit. | | PGRST110 | See :ref:`limited_update_delete`. | +---------------+-------------------------------------------------------------+ -| .. _pgrst111: | Related to :ref:`guc_resp_hdrs`. | -| | | +| .. _pgrst111: | An invalid ``response.headers`` was set. | +| | See :ref:`guc_resp_hdrs`. | | PGRST111 | | +---------------+-------------------------------------------------------------+ | .. _pgrst112: | The status code must be a positive integer. | | | See :ref:`guc_resp_status`. | | PGRST112 | | +---------------+-------------------------------------------------------------+ -| .. _pgrst113: | Related to :ref:`scalar_return_formats`. | -| | See :ref:`providing_img` for an example on requesting | -| | images. | +| .. _pgrst113: | More than one column was returned for a scalar result. | +| | See :ref:`scalar_return_formats`. | +| | | | PGRST113 | | +---------------+-------------------------------------------------------------+ | .. _pgrst114: | For an :ref:`UPSERT using PUT `, when | @@ -229,8 +239,8 @@ Related to a :ref:`stale schema cache `. Most of the time, these e | | the embedding resources or the relationship itself may not | | PGRST200 | exist in the database. | +---------------+-------------------------------------------------------------+ -| .. _pgrst201: | Related to :ref:`embed_disamb`. | -| | | +| .. _pgrst201: | An ambiguous embedding request was made. | +| | See :ref:`embed_disamb`. | | PGRST201 | | +---------------+-------------------------------------------------------------+ | .. _pgrst202: | Caused by a :ref:`stale_function_signature`, otherwise | @@ -274,12 +284,12 @@ Related to the authentication process using JWT. You can follow the :ref:`tut1` Group X - Internal ------------------ -Internal errors mostly related to `the library `_ that PostgREST uses to connect to the database. If you encounter any of these errors, you may have stumbled on a PostgREST bug, please `open an issue `_ and we'll be glad to fix it. +Internal errors. If you encounter any of these, you may have stumbled on a PostgREST bug, please `open an issue `_ and we'll be glad to fix it. +---------------+-------------------------------------------------------------+ | Code | Description | +===============+=============================================================+ -| .. _pgrstX00: | Internal errors related to the library that connects to the | -| | database. | +| .. _pgrstX00: | Internal errors related to the library used for connecting | +| | to the database. | | PGRSTX00 | | +---------------+-------------------------------------------------------------+ From 65c2754719c38d26f7ab10e97f648193e59e5ce1 Mon Sep 17 00:00:00 2001 From: Laurence Isla Date: Tue, 21 Jun 2022 17:38:29 -0500 Subject: [PATCH 515/711] Modify GeoJSON examples from views to functions (#551) --- .../working-with-postgresql-data-types.rst | 140 +++++++++--------- 1 file changed, 71 insertions(+), 69 deletions(-) diff --git a/docs/how-tos/working-with-postgresql-data-types.rst b/docs/how-tos/working-with-postgresql-data-types.rst index 9cfcf52794..9ad0c934da 100644 --- a/docs/how-tos/working-with-postgresql-data-types.rst +++ b/docs/how-tos/working-with-postgresql-data-types.rst @@ -638,23 +638,28 @@ Say you want to add areas in polygon format. The request using string representa ] EOF -Now, when you request the information, PostgREST will automatically cast the ``area`` column to ``JSON`` format. Although this output is useful, you will want to use the PostGIS functions to have more control on filters or casts. For these cases, creating a ``view`` is your best option. For example, let's use some of the functions to get the data in `GeoJSON format `_ and to calculate the area in square units: +Now, when you request the information, PostgREST will automatically cast the ``area`` column to ``JSON`` format. Although this output is useful, you will want to use the PostGIS functions to have more control on filters or casts. For these cases, creating a ``function`` is your best option. For example, let's use some of the functions to get the data in `GeoJSON format `_ and to calculate the area in square units: .. code-block:: postgres - create or replace view coverage_geo as - select name, - -- Get the Geometry Object - st_AsGeoJSON(c.area)::json as geo_geometry, - -- Get the Feature Object - st_AsGeoJSON(c.*)::json as geo_feature, - -- Calculate the area in square units - st_area(c.area) as square_units - from coverage c; - - -- Create another view for the FeatureCollection Object + create or replace function coverage_geo(filter text) returns json as $$ + select + json_build_object( + 'name', c.name, + -- Get the Geometry Object + 'geo_geometry', st_AsGeoJSON(c.area)::json, + -- Get the Feature Object + 'geo_feature', st_AsGeoJSON(c.*)::json, + -- Calculate the area in square units + 'square_units', st_area(c.area) + ) + from coverage c + where c.name = filter; + $$ language sql; + + -- Create another function for the FeatureCollection Object -- for the sake of making the examples clearer - create or replace view coverage_geo_collection as + create or replace function coverage_geo_collection() returns json as $$ select json_build_object( 'type', 'FeatureCollection', @@ -662,6 +667,7 @@ Now, when you request the information, PostgREST will automatically cast the ``a ) as geo_feature_collection from coverage c; + $$ language sql; Now the query will return the information as you expected: @@ -669,39 +675,37 @@ Now the query will return the information as you expected: .. code-tab:: http - GET /coverage_geo?name=eq.big HTTP/1.1 + GET /rpc/coverage_geo?filter=big HTTP/1.1 .. code-tab:: bash Curl - curl "http://localhost:3000/coverage_geo?name=eq.big" + curl "http://localhost:3000/rpc/coverage_geo?filter=big" .. code-block:: json - [ - { - "name": "big", - "geo_geometry": { + { + "name": "big", + "geo_geometry": { + "type": "Polygon", + "coordinates": [ + [[0,0],[10,0],[10,10],[0,10],[0,0]] + ] + }, + "geo_feature": { + "type": "Feature", + "geometry": { "type": "Polygon", "coordinates": [ [[0,0],[10,0],[10,10],[0,10],[0,0]] ] }, - "geo_feature": { - "type": "Feature", - "geometry": { - "type": "Polygon", - "coordinates": [ - [[0,0],[10,0],[10,10],[0,10],[0,0]] - ] - }, - "properties": { - "id": 2, - "name": "big" - } - }, - "square_units": 100 - } - ] + "properties": { + "id": 2, + "name": "big" + } + }, + "square_units": 100 + } And for the Feature Collection format: @@ -709,46 +713,44 @@ And for the Feature Collection format: .. code-tab:: http - GET /coverage_geo_collection HTTP/1.1 + GET /rpc/coverage_geo_collection HTTP/1.1 .. code-tab:: bash Curl - curl "http://localhost:3000/coverage_geo_collection" + curl "http://localhost:3000/rpc/coverage_geo_collection" .. code-block:: json - [ - { - "geo_feature_collection": { - "type": "FeatureCollection", - "features": [ - { - "type": "Feature", - "geometry": { - "type": "Polygon", - "coordinates": [ - [[0,0],[1,0],[1,1],[0,1],[0,0]] - ] - }, - "properties": { - "id": 1, - "name": "small" - } + { + "geo_feature_collection": { + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [[0,0],[1,0],[1,1],[0,1],[0,0]] + ] }, - { - "type": "Feature", - "geometry": { - "type": "Polygon", - "coordinates": [ - [[0,0],[10,0],[10,10],[0,10],[0,0]] - ] - }, - "properties": { - "id": 2, - "name": "big" - } + "properties": { + "id": 1, + "name": "small" } - ] - } + }, + { + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [[0,0],[10,0],[10,10],[0,10],[0,0]] + ] + }, + "properties": { + "id": 2, + "name": "big" + } + } + ] } - ] + } From 06ece64cb0b2b490d986e1b1033fea9c42174e3a Mon Sep 17 00:00:00 2001 From: fjf2002 Date: Wed, 29 Jun 2022 17:11:15 +0200 Subject: [PATCH 516/711] HOW-TO for SOAP (#554) --- docs/how-tos/create-soap-endpoint.rst | 222 ++++++++++++++++++++++++++ docs/index.rst | 2 + 2 files changed, 224 insertions(+) create mode 100644 docs/how-tos/create-soap-endpoint.rst diff --git a/docs/how-tos/create-soap-endpoint.rst b/docs/how-tos/create-soap-endpoint.rst new file mode 100644 index 0000000000..62f0d0412b --- /dev/null +++ b/docs/how-tos/create-soap-endpoint.rst @@ -0,0 +1,222 @@ +.. _create_soap_endpoint: + +Create a SOAP endpoint +====================== + +:author: `fjf2002 `_ + +PostgREST now has XML support. With a bit of work, SOAP endpoints become possible. + +Please note that PostgREST supports just ``text/xml`` MIME type in request/response headers ``Content-Type`` and ``Accept``. +If you have to use other MIME types such as ``application/soap+xml``, you could manipulate the headers in your reverse proxy. + + + +Minimal Example +--------------- +This example will simply return the request body, inside a tag ``therequestbodywas``. + +Add the following function to your PostgreSQL database: + +.. code-block:: postgres + + CREATE OR REPLACE FUNCTION my_soap_endpoint(xml) RETURNS xml AS $$ + DECLARE + nsarray CONSTANT text[][] := ARRAY[ + ARRAY['soapenv', 'http://schemas.xmlsoap.org/soap/envelope/'] + ]; + BEGIN + RETURN xmlelement( + NAME "soapenv:Envelope", + XMLATTRIBUTES('http://schemas.xmlsoap.org/soap/envelope/' AS "xmlns:soapenv"), + xmlelement(NAME "soapenv:Header"), + xmlelement( + NAME "soapenv:Body", + xmlelement( + NAME theRequestBodyWas, + (xpath('/soapenv:Envelope/soapenv:Body', $1, nsarray))[1] + ) + ) + ); + END; + $$ LANGUAGE plpgsql; + +Do not forget to refresh the :ref:`PostgREST schema cache `. + +Use ``curl`` for a first test: + +.. code-block:: bash + + curl http://localhost:3000/rpc/my_soap_endpoint \ + --header 'Content-Type: text/xml' \ + --header 'Accept: text/xml' \ + --data-binary @- < + + + + My SOAP Content + + + + XML + +The output should contain the original request body within the ``therequestbodywas`` entity, +and should roughly look like: + +.. code-block:: xml + + + + + + + + My SOAP Content + + + + + + +Unfortunately the ``Accept: text/xml`` header is currently mandatory concerning PostgREST, otherwise it will respond +with a ``Content-Type: application/json`` header and enclose the response with quotes. +(You can check the returned headers by adding ``-v`` to the curl call.) + +If your SOAP clients do not send the ``Accept: text/xml`` header, you can fix that in your nginx reverse proxy +by adding something like ... + +.. code-block:: nginx + + set $accept $http_accept; + if ($contentType ~ "^text/xml($|;)") { + set $accept "text/xml"; + } + proxy_set_header Accept $accept; + +to your ``location`` nginx configuration. +(The given example sets the ``Accept`` header for each request of Content-Type ``text/xml``.) + + +A more elaborate example +------------------------ + +Here we have a SOAP service that converts a fraction to a decimal value, +with pass-through of PostgreSQL errors to the SOAP response. +Please note that in production you probably should not pass through plain database errors +potentially disclosing internals to the client, but instead handle the errors directly. + + +.. code-block:: postgres + + -- helper function + CREATE OR REPLACE FUNCTION _soap_envelope(body xml) + RETURNS xml + LANGUAGE sql + AS $function$ + SELECT xmlelement( + NAME "soapenv:Envelope", + XMLATTRIBUTES('http://schemas.xmlsoap.org/soap/envelope/' AS "xmlns:soapenv"), + xmlelement(NAME "soapenv:Header"), + xmlelement(NAME "soapenv:Body", body) + ); + $function$; + + -- helper function + CREATE OR REPLACE FUNCTION _soap_exception( + faultcode text, + faultstring text + ) + RETURNS xml + LANGUAGE sql + AS $function$ + SELECT _soap_envelope( + xmlelement(NAME "soapenv:Fault", + xmlelement(NAME "faultcode", faultcode), + xmlelement(NAME "faultstring", faultstring) + ) + ); + $function$; + + CREATE OR REPLACE FUNCTION fraction_to_decimal(xml) + RETURNS xml + LANGUAGE plpgsql + AS $function$ + DECLARE + nsarray CONSTANT text[][] := ARRAY[ + ARRAY['soapenv', 'http://schemas.xmlsoap.org/soap/envelope/'] + ]; + exc_msg text; + exc_detail text; + exc_hint text; + exc_sqlstate text; + BEGIN + -- simulating a statement that results in an exception: + RETURN _soap_envelope(xmlelement( + NAME "decimalValue", + ( + (xpath('/soapenv:Envelope/soapenv:Body/fraction/numerator/text()', $1, nsarray))[1]::text::int + / + (xpath('/soapenv:Envelope/soapenv:Body/fraction/denominator/text()', $1, nsarray))[1]::text::int + )::text::xml + )); + EXCEPTION WHEN OTHERS THEN + GET STACKED DIAGNOSTICS + exc_msg := MESSAGE_TEXT, + exc_detail := PG_EXCEPTION_DETAIL, + exc_hint := PG_EXCEPTION_HINT, + exc_sqlstate := RETURNED_SQLSTATE; + RAISE WARNING USING + MESSAGE = exc_msg, + DETAIL = exc_detail, + HINT = exc_hint; + RETURN _soap_exception(faultcode => exc_sqlstate, faultstring => concat(exc_msg, ', DETAIL: ', exc_detail, ', HINT: ', exc_hint)); + END + $function$; + +Let's test the ``fraction_to_decimal`` service with illegal values: + +.. code-block:: bash + + curl http://localhost:3000/rpc/fraction_to_decimal \ + --header 'Content-Type: text/xml' \ + --header 'Accept: text/xml' \ + --data-binary @- < + + + + 42 + 0 + + + + XML + +The output should roughly look like: + +.. code-block:: xml + + + + + + 22012 + division by zero, DETAIL: , HINT: + + + + + +References +---------- +For more information concerning PostgREST, cf. + +- :ref:`s_proc_single_unnamed` +- :ref:`scalar_return_formats` +- :ref:`Nginx reverse proxy ` + +For SOAP reference, visit + +- the specification at https://www.w3.org/TR/soap/ +- shorter more practical advice is available at https://www.w3schools.com/xml/xml_soap.asp diff --git a/docs/index.rst b/docs/index.rst index db3a181d50..989c55f169 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -206,9 +206,11 @@ These are recipes that'll help you address specific use-cases. how-tos/working-with-postgresql-data-types how-tos/providing-images-for-img + how-tos/create-soap-endpoint - :doc:`how-tos/providing-images-for-img` - :doc:`how-tos/working-with-postgresql-data-types` +- :doc:`how-tos/create-soap-endpoint` Ecosystem --------- From b37bacb19a5da5b9834ba09a7865840119d5851e Mon Sep 17 00:00:00 2001 From: Laurence Isla Date: Fri, 8 Jul 2022 12:27:14 -0500 Subject: [PATCH 517/711] Add Limezest/postgrest-cloud-run to ecosystem --- docs/ecosystem.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/ecosystem.rst b/docs/ecosystem.rst index 8283d6c698..3d177848c7 100644 --- a/docs/ecosystem.rst +++ b/docs/ecosystem.rst @@ -62,6 +62,7 @@ DevOps * `cloudgov-demo-postgrest `_ - demo for a federally-compliant REST API on cloud.gov * `cloudstark/helm-charts `_ - helm chart to deploy PostgREST to a Kubernetes cluster via a Deployment and Service * `jbkarle/postgrest `_ - helm chart with a demo database for development and test purposes +* `Limezest/postgrest-cloud-run `_ - expose a PostgreSQL database on Cloud SQL using Cloud Run .. _eco_external_notification: From bba960d4c631a79837215785911b22cea9de8b3a Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Mon, 11 Jul 2022 23:55:56 -0500 Subject: [PATCH 518/711] new m2m relationship detection --- docs/api.rst | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/docs/api.rst b/docs/api.rst index 5d34ecf776..d28ca24758 100644 --- a/docs/api.rst +++ b/docs/api.rst @@ -957,7 +957,29 @@ this: Embedding through join tables ----------------------------- -PostgREST can also detect relationships going through join tables. Thus you can request the Actors for Films (which in this case finds the information through Roles). +PostgREST can also detect many-to-many relationships going through join tables. For this, the join table must contain foreign keys to the tables in +the many-to-many relationship and its primary key must include these foreign key columns. + +.. code-block:: postgresql + + create table "Roles"( + film_id int references "Films"(id) + , actor_id int references "Actors"(id) + , primary key(film_id, actor_id) + ) + + -- the many-to-many relationship can also be detected if the join table has a surrogate key, + -- as long as the foreign key columns are also part of the primary key + + create table "Roles"( + id int generated always as identity, + , film_id int references "Films"(id) + , actor_id int references "Actors"(id) + , primary key(id, film_id, actor_id) + ) + + +Then you can request the Actors for Films (which in this case finds the information through Roles). .. tabs:: From 2592639d1b37078fd3df7537b60a5e46e4df116d Mon Sep 17 00:00:00 2001 From: Laurence Isla Date: Tue, 19 Jul 2022 10:51:36 -0500 Subject: [PATCH 519/711] Reword and clarify embedding on views --- docs/api.rst | 75 ++++++++++------------------------------------------ 1 file changed, 14 insertions(+), 61 deletions(-) diff --git a/docs/api.rst b/docs/api.rst index d28ca24758..4e7c4813f8 100644 --- a/docs/api.rst +++ b/docs/api.rst @@ -1204,31 +1204,34 @@ Since it contains the ``films_id`` foreign key, it is possible to embed ``box_of Embedding Views --------------- -Embedding a view is possible if the view contains columns that have **foreign keys** defined in their source tables. +PostgREST will infer the relationships of a view based on its source tables. Source tables are the ones referenced in the ``FROM`` and ``JOIN`` clauses of the view definition. The foreign keys of the relationships must be present in the top ``SELECT`` clause of the view for this to work. -As an example, let's create a view called ``nominations_view`` based on the *nominations* table. +For instance, the following view has ``nominations``, ``films`` and ``competitions`` as source tables: .. code-block:: postgres CREATE VIEW nominations_view AS - SELECT - rank - , competition_id - , film_id - FROM - nominations; + SELECT + films.title as film_title + , competitions.name as competition_name + , nominations.rank + , nominations.film_id as nominations_film_id + , films.id as film_id + FROM nominations + JOIN films ON films.id = nominations.film_id + JOIN competitions ON competitions.id = nominations.competition_id; -Since it contains ``competition_id`` and ``film_id`` — and each one has a **foreign key** defined in its source table — we can embed *competitions* and *films*: +Since this view contains ``nominations.film_id``, which has a **foreign key** relationship to ``films``, then we can embed the ``films`` table. Similarly, because the view contains ``films.id``, then we can also embed the ``roles`` and the ``actors`` tables (the last one in a many-to-many relationship): .. tabs:: .. code-tab:: http - GET /nominations_view?select=rank,competitions(name,year),films(title)&rank=eq.5 HTTP/1.1 + GET /nominations_view?select=film_title,films(language),roles(character),actors(last_name,first_name)&rank=eq.5 HTTP/1.1 .. code-tab:: bash Curl - curl "http://localhost:3000/nominations_view?select=rank,competitions(name,year),films(title)&rank=eq.5" + curl "http://localhost:3000/nominations_view?select=film_title,films(language),roles(character),actors(last_name,first_name)&rank=eq.5" It's also possible to embed `Materialized Views `_. @@ -1249,56 +1252,6 @@ It's also possible to embed `Materialized Views Date: Fri, 5 Aug 2022 18:36:25 -0500 Subject: [PATCH 520/711] clarify * as an alias of % for LIKE --- docs/api.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/api.rst b/docs/api.rst index 4e7c4813f8..31f627bb90 100644 --- a/docs/api.rst +++ b/docs/api.rst @@ -67,8 +67,8 @@ gte :code:`>=` greater than or equal lt :code:`<` less than lte :code:`<=` less than or equal neq :code:`<>` or :code:`!=` not equal -like :code:`LIKE` LIKE operator (use * in place of %) -ilike :code:`ILIKE` ILIKE operator (use * in place of %) +like :code:`LIKE` LIKE operator (to avoid `URL encoding `_ you can use ``*`` as an alias of the percent sign ``%`` for the pattern) +ilike :code:`ILIKE` ILIKE operator (to avoid `URL encoding `_ you can use ``*`` as an alias of the percent sign ``%`` for the pattern) match :code:`~` ~ operator, see :ref:`pattern_matching` imatch :code:`~*` ~* operator, see :ref:`pattern_matching` in :code:`IN` one of a list of values, e.g. :code:`?a=in.(1,2,3)` From a0c463b99824eb8e7cfc68a3bc2bfb36919a4bbe Mon Sep 17 00:00:00 2001 From: Laurence Isla Date: Tue, 23 Aug 2022 21:59:48 -0500 Subject: [PATCH 521/711] Add missing changes/fixes/features for v10 --- docs/api.rst | 286 +++++++++++---- docs/configuration.rst | 28 +- .../working-with-postgresql-data-types.rst | 171 ++++----- docs/index.rst | 2 +- docs/install.rst | 2 +- docs/releases/latest.rst | 143 -------- docs/releases/v10.0.0.rst | 337 ++++++++++++++++++ postgrest.dict | 5 + 8 files changed, 674 insertions(+), 300 deletions(-) delete mode 100644 docs/releases/latest.rst create mode 100644 docs/releases/v10.0.0.rst diff --git a/docs/api.rst b/docs/api.rst index 31f627bb90..50d78aec41 100644 --- a/docs/api.rst +++ b/docs/api.rst @@ -801,6 +801,7 @@ The current possibilities are: * ``text/csv`` * ``application/json`` * ``application/openapi+json`` +* ``application/geo+json`` and in the special case of a single-column select the following additional three formats; also see the section :ref:`scalar_return_formats`: @@ -870,35 +871,56 @@ In addition to providing RESTful routes for each table and view, PostgREST allow API call. This reduces the need for multiple API requests. The server uses **foreign keys** to determine which tables and views can be returned together. For example, consider a database of films and their awards: +.. image:: _static/film.png + .. important:: - PostgREST needs `FOREIGN KEY constraints `_ to be able to do Resource Embedding. + * PostgREST needs `FOREIGN KEY constraints `_ to be able to do Resource Embedding. + * Whenever FOREIGN KEY constraints change in the database schema you must refresh PostgREST's schema cache for Resource Embedding to work properly. See the section :ref:`schema_reloading`. -.. image:: _static/film.png +.. _one-to-many: + +One-to-many relationships +------------------------- -As seen above in :ref:`v_filter` we can request the titles of all films like this: +When a one-to-many relationship is detected, the embedded resource is returned as a JSON array. For example, we can request the Directors and the Films they directed because there is a foreign key constraint between them, like this: .. tabs:: .. code-tab:: http - GET /films?select=title HTTP/1.1 + GET /directors?select=last_name,films(title) HTTP/1.1 .. code-tab:: bash Curl - curl "http://localhost:3000/films?select=title" - -This might return something like + curl "http://localhost:3000/directors?select=last_name,films(title)" .. code-block:: json [ - { "title": "Workers Leaving The Lumière Factory In Lyon" }, - { "title": "The Dickson Experimental Sound Film" }, - { "title": "The Haunted Castle" } + { "last_name": "Lumière", + "films": [ + {"title": "Workers Leaving The Lumière Factory In Lyon"} + ] + }, + { "last_name": "Dickson", + "films": [ + {"title": "The Dickson Experimental Sound Film"} + ] + }, + { "last_name": "Méliès", + "films": [ + {"title": "The Haunted Castle"} + ] + } ] -However because a foreign key constraint exists between Films and Directors, we can request this information be included: +.. _many-to-one: + +Many-to-one relationships +------------------------- + +When a many-to-one relationship is detected, the embedded resource is returned as a JSON object. For example, we can request all the Films and the Director for each film like this: .. tabs:: @@ -910,8 +932,6 @@ However because a foreign key constraint exists between Films and Directors, we curl "http://localhost:3000/films?select=title,directors(id,last_name)" -Which would return - .. code-block:: json [ @@ -935,10 +955,7 @@ Which would return } ] -In this example, since the relationship is a forward relationship, there is -only one director associated with a film. As the table name is plural it might -be preferable for it to be singular instead. An table name alias can accomplish -this: +However, the table name is in plural, which is not accurate since a Film is directed by only one Director. Using a table name alias can solve this: .. tabs:: @@ -950,34 +967,31 @@ this: curl "http://localhost:3000/films?select=title,director:directors(id,last_name)" -.. important:: - - Whenever FOREIGN KEY constraints change in the database schema you must refresh PostgREST's schema cache for Resource Embedding to work properly. See the section :ref:`schema_reloading`. +.. _many-to-many: -Embedding through join tables ------------------------------ +Many-to-many relationships +-------------------------- PostgREST can also detect many-to-many relationships going through join tables. For this, the join table must contain foreign keys to the tables in -the many-to-many relationship and its primary key must include these foreign key columns. +the many-to-many relationship and its composite primary key must include these foreign key columns. .. code-block:: postgresql - create table "Roles"( - film_id int references "Films"(id) - , actor_id int references "Actors"(id) + create table roles( + film_id int references films(id) + , actor_id int references actors(id) , primary key(film_id, actor_id) - ) + ); -- the many-to-many relationship can also be detected if the join table has a surrogate key, -- as long as the foreign key columns are also part of the primary key - create table "Roles"( + create table roles( id int generated always as identity, - , film_id int references "Films"(id) - , actor_id int references "Actors"(id) + , film_id int references films(id) + , actor_id int references actors(id) , primary key(id, film_id, actor_id) - ) - + ); Then you can request the Actors for Films (which in this case finds the information through Roles). @@ -991,6 +1005,84 @@ Then you can request the Actors for Films (which in this case finds the informat curl "http://localhost:3000/actors?select=films(title,year)" +.. _one-to-one: + +One-to-one relationships +------------------------ + +PostgREST detects one-to-one relationships when a foreign key is also the primary key of the table or when the foreign key has a ``UNIQUE`` constraint. + +.. code-block:: postgresql + + -- references Films using the primary key as a foreign key + CREATE TABLE technical_specs( + film_id INT PRIMARY KEY REFERENCES films, + runtime TIME, + camera TEXT, + sound TEXT + ); + + -- references Films using a foreign key with unique constraint + CREATE TABLE technical_specs( + film_id INT REFERENCES films UNIQUE, + runtime TIME, + camera TEXT, + sound TEXT + ); + +Now, the embedding between Films and Technical_Specs is returned as a JSON object no matter the order. + +.. tabs:: + + .. code-tab:: http + + GET /films?select=title,technical_specs(*) HTTP/1.1 + + .. code-tab:: bash Curl + + curl "http://localhost:3000/films?select=title,technical_specs(*)" + +.. _computed_relationships: + +Computed Relationships +---------------------- + +You can customize how PostgREST detects relationships between two tables. To do this, you need to create a function that has one of the tables as a single parameter and the other as its return type. For instance: + +.. code-block:: postgres + + CREATE FUNCTION director_competition(directors) RETURNS SETOF competitions AS $$ + SELECT c.* + FROM competitions c + JOIN nominations n ON c.id = n.competition_id + JOIN films f ON n.film_id = f.id + WHERE f.director_id = $1.id + $$ STABLE LANGUAGE sql; + +The above function allows a direct relationship between ``directors`` and ``competitions``: + +.. tabs:: + + .. code-tab:: http + + GET /directors?select=*,competitions:director_competition(name) HTTP/1.1 + + .. code-tab:: bash Curl + + curl "http://localhost:3000/directors?select=*,competitions:director_competition(name)" + +Take into consideration that the opposite relationship will not be detected, so you need to create another function for that. + +Computed relationships also allow you to override the ones that are detected by default. For example, this function can change the ``/films?select=directors(*)`` embedding: + +.. code-block:: postgres + + CREATE FUNCTION directors(films) RETURNS SETOF directors ROW 1 AS $$ + -- Override the relationship here + $$ STABLE LANGUAGE sql; + +Note that if ``ROW 1`` is added, PostgREST will detect a :ref:`many-to-one relationship ` and return a JSON object instead of an array embedding. + .. _nested_embedding: Nested Embedding @@ -1460,25 +1552,24 @@ Hint Disambiguation If specifying the **target** is not enough for unambiguous embedding, you can add a **hint**. For example, let's assume we create two views of ``addresses``: ``central_addresses`` and ``eastern_addresses``. -Since PostgREST supports :ref:`embedding_views` by detecting **source foreign keys** in the views, embedding with the foreign key -as the **target** will not be enough for an unambiguous embed: +PostgREST cannot detect a view as an embedded resource by using a column name or foreign key name as targets, that is why we need to use the view name ``central_addresses`` instead. But, still, this is not enough for an unambiguous embed. .. tabs:: .. code-tab:: http - GET /orders?select=*,billing_address(*) HTTP/1.1 + GET /orders?select=*,central_addresses(*) HTTP/1.1 .. code-tab:: bash Curl - curl "http://localhost:3000/orders?select=*,billing_address(*)" -i + curl "http://localhost:3000/orders?select=*,central_addresses(*)" -i .. code-block:: http HTTP/1.1 300 Multiple Choices For solving this case, in addition to the **target**, we can add a **hint**. -Here we specify ``central_addresses`` as the **target** and the ``billing_address`` foreign key as the **hint**: +Here, we still specify ``central_addresses`` as the **target** and use the ``billing_address`` foreign key as the **hint**: .. tabs:: @@ -1510,6 +1601,10 @@ Hints also work alongside ``!inner`` if a top level filtering is needed. From th curl "http://localhost:3000/orders?select=*,central_addresses!billing_address!inner(*)¢ral_addresses.code=AB1000" +.. note:: + + If the relationship is so complex that hint disambiguation does not solve it, then using :ref:`computed_relationships` is the best alternative. + .. _insert: Insertions @@ -1695,39 +1790,6 @@ Doing a full table update without filters is not allowed and will result in 0 up Updates also support :code:`Prefer: return=representation` plus :ref:`v_filter`. -.. _bulk_update: - -Bulk Update ------------ - -You can update rows with different data by providing a JSON array of objects having uniform keys, the rows will be chosen based on the primary key column(s) values. - -.. tabs:: - - .. code-tab:: http - - PATCH /employees HTTP/1.1 - - [ - { "id": 1, "name": "Renamed employee 1", "salary": 40000 }, - { "id": 2, "name": "Renamed employee 2", "salary": 52000 }, - { "id": 3, "name": "Renamed employee 3", "salary": 60000 } - ] - - .. code-tab:: bash Curl - - curl "http://localhost:3000/employees" \ - -X PATCH -H "Content-Type: application/json" \ - -d @- << EOF - [ - { "id": 1, "name": "Renamed employee 1", "salary": 40000 }, - { "id": 2, "name": "Renamed employee 2", "salary": 52000 }, - { "id": 3, "name": "Renamed employee 3", "salary": 60000 } - ] - EOF - -You must not include any filters for this to work. If you provide filters, only the values of the first object in the array will be used for the update. - .. _upsert: Upsert @@ -2497,6 +2559,8 @@ Also if you wish to generate a ``summary`` field you can do it by having a multi spans multiple lines$$; +If you need to include the ``security`` and ``securityDefinitions`` options, set the :ref:`openapi-security-active` configuration to ``true``. + You can use a tool like `Swagger UI `_ to create beautiful documentation from the description and to host an interactive web-based dashboard. The dashboard allows developers to make requests against a live PostgREST server, and provides guidance with request headers and example request bodies. .. important:: @@ -2550,7 +2614,7 @@ For a view, the methods are determined by the presence of INSTEAD OF TRIGGERS. | `auto-updatable views `_ | +--------------------+-------------------------------------------------------------------------------------------------+ -For functions, OPTIONS requests are not supported. +For functions, the methods depend on their volatility. ``VOLATILE`` functions allow only ``OPTIONS,POST``, whereas the rest also permit ``GET,HEAD``. .. important:: @@ -2817,3 +2881,83 @@ Returns: "hint": "Upgrade your plan", "code": "PT402" } + +.. _explain_plan: + +Execution plan +-------------- + +You can get the execution plan of a request by adding the ``Accept: application/vnd.pgrst.plan`` header after setting the :ref:`db-plan-enabled` configuration to ``true``. It is useful to verify why a certain operation might be expensive as a result of using `EXPLAIN `_ on the generated query for the request. + +The output of the plan is generated in ``text`` format by default: + +.. tabs:: + + .. code-tab:: http + + GET /users?select=name&order=id HTTP/1.1 + Accept: application/vnd.pgrst.plan + + .. code-tab:: bash Curl + + curl "http://localhost:3000/users?select=name&order=id" \ + -H "Accept: application/vnd.pgrst.plan" + +.. code-block:: psql + + Aggregate (cost=73.65..73.68 rows=1 width=112) + -> Index Scan using users_pkey on users (cost=0.15..60.90 rows=850 width=36) + +The same execution can be returned in ``json`` format by using the ``Accept: application/vnd.pgrst.plan+json`` header instead: + +.. tabs:: + + .. code-tab:: http + + GET /users?select=name&order=id HTTP/1.1 + Accept: application/vnd.pgrst.plan+json + + .. code-tab:: bash Curl + + curl "http://localhost:3000/users?select=name&order=id" \ + -H "Accept: application/vnd.pgrst.plan+json" + +.. code-block:: json + + [ + { + "Plan": { + "Node Type": "Aggregate", + "Strategy": "Plain", + "Partial Mode": "Simple", + "Parallel Aware": false, + "Async Capable": false, + "Startup Cost": 73.65, + "Total Cost": 73.68, + "Plan Rows": 1, + "Plan Width": 112, + "Plans": [ + { + "Node Type": "Index Scan", + "Parent Relationship": "Outer", + "Parallel Aware": false, + "Async Capable": false, + "Scan Direction": "Forward", + "Index Name": "users_pkey", + "Relation Name": "users", + "Alias": "users", + "Startup Cost": 0.15, + "Total Cost": 60.90, + "Plan Rows": 850, + "Plan Width": 36 + } + ] + } + } + ] + +You can also get the result plan of the different media types that PostgREST supports by adding them to the header using ``for``. For instance, to obtain the plan for a :ref:`text/xml ` media type in json format, you need to add the ``Accept: application/vnd.pgrst.plan; for=text/xml`` header. + +Additionally, the deactivated parameters of the ``EXPLAIN`` command can be enabled by adding them to the header using ``options``. The available parameters are ``analyze``, ``verbose``, ``settings``, ``buffers`` and ``wal``, while the remaining ones are active by default. For example, to add the ``analyze`` and ``wal`` parameters, add the ``Accept: application/vnd.pgrst.plan; options=analyze|wal`` header. + +Note that any changes done will be committed when activating the ``analyze`` option. To avoid this, set the :ref:`db-tx-end` configuration in a way that allows to rollback the changes according to your preference. diff --git a/docs/configuration.rst b/docs/configuration.rst index 66061904b4..1e45e10651 100644 --- a/docs/configuration.rst +++ b/docs/configuration.rst @@ -154,8 +154,9 @@ db-channel-enabled Boolean True Y db-config Boolean True Y db-extra-search-path String public Y db-max-rows Int ∞ Y +db-plan-enabled Boolean False Y db-pool Int 10 -db-pool-timeout Int 10 +db-pool-timeout Int 3600 db-pre-request String Y db-prepared-statements Boolean True Y db-schemas String public Y @@ -168,6 +169,7 @@ jwt-secret String Y jwt-secret-is-base64 Boolean False Y log-level String error Y openapi-mode String follow-privileges Y +openapi-security-active Boolean False Y openapi-server-proxy-uri String Y raw-media-types String Y server-host String !4 @@ -282,6 +284,18 @@ db-max-rows A hard limit to the number of rows PostgREST will fetch from a view, table, or stored procedure. Limits payload size for accidental or malicious requests. +.. _db-plan-enabled: + +db-plan-enabled +--------------- + + =============== ===================== + **Environment** PGRST_DB_PLAN_ENABLED + **In-Database** pgrst.db_plan_enabled + =============== ===================== + + When this is set to :code:`true`, the execution plan of a request can be retrieved by using the :code:`Accept: application/vnd.pgrst.plan` header. See :ref:`explain_plan`. + .. _db-pool: db-pool @@ -551,6 +565,18 @@ openapi-mode # Throws a `404 Not Found` error when accessing the API root path openapi-mode = "disabled" +.. _openapi-security-active: + +openapi-security-active +----------------------- + + =============== ============================= + **Environment** PGRST_OPENAPI_SECURITY_ACTIVE + **In-Database** pgrst.openapi_security_active + =============== ============================= + +When this is set to :code:`true`, security options are included in the :ref:`OpenAPI output `. + .. _openapi-server-proxy-uri: openapi-server-proxy-uri diff --git a/docs/how-tos/working-with-postgresql-data-types.rst b/docs/how-tos/working-with-postgresql-data-types.rst index 9ad0c934da..fb317c97e9 100644 --- a/docs/how-tos/working-with-postgresql-data-types.rst +++ b/docs/how-tos/working-with-postgresql-data-types.rst @@ -597,6 +597,8 @@ You can also query and filter the value of a ``hstore`` column using the arrow o [{ "native": "مصر" }] +.. _ww_postgis: + PostGIS ------- @@ -638,76 +640,81 @@ Say you want to add areas in polygon format. The request using string representa ] EOF -Now, when you request the information, PostgREST will automatically cast the ``area`` column to ``JSON`` format. Although this output is useful, you will want to use the PostGIS functions to have more control on filters or casts. For these cases, creating a ``function`` is your best option. For example, let's use some of the functions to get the data in `GeoJSON format `_ and to calculate the area in square units: - -.. code-block:: postgres - - create or replace function coverage_geo(filter text) returns json as $$ - select - json_build_object( - 'name', c.name, - -- Get the Geometry Object - 'geo_geometry', st_AsGeoJSON(c.area)::json, - -- Get the Feature Object - 'geo_feature', st_AsGeoJSON(c.*)::json, - -- Calculate the area in square units - 'square_units', st_area(c.area) - ) - from coverage c - where c.name = filter; - $$ language sql; - - -- Create another function for the FeatureCollection Object - -- for the sake of making the examples clearer - create or replace function coverage_geo_collection() returns json as $$ - select - json_build_object( - 'type', 'FeatureCollection', - 'features', json_agg(st_AsGeoJSON(c.*)::json) - ) - as geo_feature_collection - from coverage c; - $$ language sql; - -Now the query will return the information as you expected: +Now, when you request the information, PostgREST will automatically cast the ``area`` column into a ``Polygon`` geometry type. Although this is useful, you may need the whole output to be in `GeoJSON `_ format out of the box, which can be done by including the ``Accept: application/geo+json`` in the request. This will work for PostGIS versions 3.0.0 and up and will return the output as a `FeatureCollection Object `_: .. tabs:: .. code-tab:: http - GET /rpc/coverage_geo?filter=big HTTP/1.1 + GET /coverage HTTP/1.1 + Accept: application/geo+json .. code-tab:: bash Curl - curl "http://localhost:3000/rpc/coverage_geo?filter=big" + curl "http://localhost:3000/coverage" \ + -H "Accept: application/geo+json" .. code-block:: json { - "name": "big", - "geo_geometry": { - "type": "Polygon", - "coordinates": [ - [[0,0],[10,0],[10,10],[0,10],[0,0]] - ] - }, - "geo_feature": { - "type": "Feature", - "geometry": { - "type": "Polygon", - "coordinates": [ - [[0,0],[10,0],[10,10],[0,10],[0,0]] - ] + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [[0,0],[1,0],[1,1],[0,1],[0,0]] + ] + }, + "properties": { + "id": 1, + "name": "small" + } }, - "properties": { - "id": 2, - "name": "big" + { + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [[0,0],[10,0],[10,10],[0,10],[0,0]] + ] + }, + "properties": { + "id": 2, + "name": "big" + } } - }, - "square_units": 100 + ] } -And for the Feature Collection format: +If you need to add an extra property, like the area in square units by using ``st_area(area)``, you could add a generated column to the table and it will appear in the ``properties`` key of each ``Feature``. + +.. code-block:: postgres + + alter table coverage + add square_units double precision generated always as ( st_area(area) ) stored; + +In the case that you are using older PostGIS versions, then creating a function is your best option. For example: + +.. code-block:: postgres + + create or replace function coverage_geo_collection() returns json as $$ + select + json_build_object( + 'type', 'FeatureCollection', + 'features', json_agg( + json_build_object( + 'type', 'Feature', + 'geometry', st_AsGeoJSON(c.area)::json, + 'properties', json_build_object('id', c.id, 'name', c.name) + ) + ) + ) + from coverage c; + $$ language sql; + +Now this query will return the same results: .. tabs:: @@ -722,35 +729,33 @@ And for the Feature Collection format: .. code-block:: json { - "geo_feature_collection": { - "type": "FeatureCollection", - "features": [ - { - "type": "Feature", - "geometry": { - "type": "Polygon", - "coordinates": [ - [[0,0],[1,0],[1,1],[0,1],[0,0]] - ] - }, - "properties": { - "id": 1, - "name": "small" - } + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [[0,0],[1,0],[1,1],[0,1],[0,0]] + ] }, - { - "type": "Feature", - "geometry": { - "type": "Polygon", - "coordinates": [ - [[0,0],[10,0],[10,10],[0,10],[0,0]] - ] - }, - "properties": { - "id": 2, - "name": "big" - } + "properties": { + "id": 1, + "name": "small" } - ] - } + }, + { + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [[0,0],[10,0],[10,10],[0,10],[0,0]] + ] + }, + "properties": { + "id": 2, + "name": "big" + } + } + ] } diff --git a/docs/index.rst b/docs/index.rst index 989c55f169..dcb1089fd9 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -98,7 +98,7 @@ The project has a friendly and growing community. Join our `chat room + v10.0.0 v9.0.1 v9.0.0 releases/v8.0.0 diff --git a/docs/install.rst b/docs/install.rst index c68ae15863..ec3c97721b 100644 --- a/docs/install.rst +++ b/docs/install.rst @@ -228,7 +228,7 @@ When a pre-built binary does not exist for your system you can build the project You can build PostgREST from source with `Stack `_. It will install any necessary Haskell dependencies on your system. -* `Install Stack `_ for your platform +* `Install Stack `_ for your platform * Install Library Dependencies ===================== ======================================= diff --git a/docs/releases/latest.rst b/docs/releases/latest.rst deleted file mode 100644 index 3b7eaaf97a..0000000000 --- a/docs/releases/latest.rst +++ /dev/null @@ -1,143 +0,0 @@ - -Latest -====== - -These are features/bugfixes not yet on a stable version. You can try them by downloading the latest pre-releases `on the GitHub release page `_. - -Features --------- - -API -~~~ - -Bulk Update -^^^^^^^^^^^ - -See :ref:`bulk_update`. - -Access Composite Type fields and Array elements -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -You can now :ref:`access fields of a Composite type or elements of an Array type ` with the arrow operators(``->``, ``->>``) in the same way you would access the JSON type fields. - -Improved Error Messages -^^^^^^^^^^^^^^^^^^^^^^^ - -To increase consistency, all the errors messages are now normalized. The ``hint``, ``details``, ``code`` and ``message`` fields will always be present in the body, each one defaulting to a -``null`` value. In the same way, the :ref:`errors that were raised ` with ``SQLSTATE`` now include the ``message`` and ``code`` in the body. - -In addition to these changes and to further clarify the source of an error, PostgREST now adds a ``PGRST`` prefix to the error code of all the errors that are PostgREST-specific and don't come from the database. These errors have a unique code that identifies them and are documented in the :ref:`pgrst_errors` section. - -Alongside these changes, there is now a dedicated reference page for :doc:`Error documentation `. - -Administration -~~~~~~~~~~~~~~ - -Health checks -^^^^^^^^^^^^^ - -Admins can now benefit from two :ref:`health check endpoints ` exposed in a different port than the main app. When activated, the ``live`` and ``ready`` endpoints are available to verify if PostgREST is alive and running or if the database connection and the :ref:`schema cache ` are ready for querying. - -Logging users -^^^^^^^^^^^^^ - -You can now verify the current authenticated database user in the :ref:`request log ` on stdout. - -Run without configuration -^^^^^^^^^^^^^^^^^^^^^^^^^ - -It is now possible to execute PostgREST without specifying any configuration variable, even without the three that were mandatory - - - If :ref:`db-uri` is not set, PostgREST will use the `libpq environment variables `_ for the database connection. - - If :ref:`db-schemas` is not set, it will use the database ``public`` schema. - - If :ref:`db-anon-role` is not set, it will not allow anonymous requests. - -Documentation improvements -~~~~~~~~~~~~~~~~~~~~~~~~~~ - -* Added a :doc:`/how-tos/working-with-postgresql-data-types` how-to, which contains explanations and examples on how to work with different PostgreSQL data types such as timestamps, ranges or PostGIS types, among others. - -* Added in-database and environment variable settings for each :ref:`configuration variable `. - -* Added the :ref:`file_descriptors` subsection. - -* Moved the :ref:`error_source` and the :ref:`status_codes` sections to the :doc:`errors reference page `. - -* Moved the *Casting type to custom JSON* how-to to the :ref:`casting_range_to_json` subsection. - -* Removed direct links for PostgREST versions older than 8.0 from the versions menu. - -* Removed the deprecated *Embedding table from another schema* how-to. - -Bug fixes ---------- - -* Return ``204 No Content`` without ``Content-Type`` for ``PUT`` (`#2058 `_) - -* Clarify error for failed schema cache load. (`#2107 `_) - - - From ``Database connection lost. Retrying the connection`` to ``Could not query the database for the schema cache. Retrying.`` - -* Fix silently ignoring filter on a non-existent embedded resource (`#1771 `_) - -* Remove functions, which are not callable due to unnamed arguments, from schema cache and OpenAPI output. (`#2152 `_) - -* Fix accessing JSON array fields with ``->`` and ``->>`` in ``?select=`` and ``?order=``. (`#2145 `_) - -Breaking changes ----------------- - -* Return ``204 No Content`` without ``Content-Type`` for RPCs returning ``VOID`` (`#2001 `_) - - - Previously, those RPCs would return ``null`` as a body with ``Content-Type: application/json``. - -Thanks ------- - -Big thanks from the `PostgREST team `_ to our sponsors! - -.. container:: image-container - - .. image:: ../_static/cybertec-new.png - :target: https://www.cybertec-postgresql.com/en/?utm_source=postgrest.org&utm_medium=referral&utm_campaign=postgrest - :width: 13em - - .. image:: ../_static/2ndquadrant.png - :target: https://www.2ndquadrant.com/en/?utm_campaign=External%20Websites&utm_source=PostgREST&utm_medium=Logo - :width: 13em - - .. image:: ../_static/retool.png - :target: https://retool.com/?utm_source=sponsor&utm_campaign=postgrest - :width: 13em - - .. image:: ../_static/gnuhost.png - :target: https://gnuhost.eu/?utm_source=sponsor&utm_campaign=postgrest - :width: 13em - - .. image:: ../_static/supabase.png - :target: https://supabase.com/?utm_source=postgrest%20backers&utm_medium=open%20source%20partner&utm_campaign=postgrest%20backers%20github&utm_term=homepage - :width: 13em - - .. image:: ../_static/oblivious.jpg - :target: https://oblivious.ai/?utm_source=sponsor&utm_campaign=postgrest - :width: 13em - -* Evans Fernandes -* `Jan Sommer `_ -* `Franz Gusenbauer `_ -* `Daniel Babiak `_ -* Tsingson Qin -* Michel Pelletier -* Jay Hannah -* Robert Stolarz -* Nicholas DiBiase -* Christopher Reid -* Nathan Bouscal -* Daniel Rafaj -* David Fenko -* Remo Rechkemmer -* Severin Ibarluzea -* Tom Saleeba -* Pawel Tyll - -If you like to join them please consider `supporting PostgREST development `_. diff --git a/docs/releases/v10.0.0.rst b/docs/releases/v10.0.0.rst new file mode 100644 index 0000000000..4d2a6aea89 --- /dev/null +++ b/docs/releases/v10.0.0.rst @@ -0,0 +1,337 @@ + +PostgREST 10.0.0 +================ + +Features +-------- + +API +~~~ + +XML/SOAP support for RPC +^^^^^^^^^^^^^^^^^^^^^^^^ + +RPC now understands the ``text/xml`` media type, allowing SQL functions to send XML output(``Accept: text/xml``) and receive XML input(``Content-Type: text/xml``). This makes SOAP endpoints possible, check the :ref:`create_soap_endpoint` how-to for more details. + +GeoJSON support +^^^^^^^^^^^^^^^ + +GeoJSON is supported across the board(reads, writes, RPC) with the ``Accept: application/geo+json`` header, this depends on PostGIS from the versions 3.0.0 and up. The :ref:`working with PostGIS section ` has an example to get you started. + +One-to-one relationships +^^^^^^^^^^^^^^^^^^^^^^^^ + +A :ref:`one-to-one relationship ` is now detected when a table's foreign key is also its primary key or when the foreign key has a ``UNIQUE`` constraint. + +Customizable Relationships for Resource Embedding +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Using :ref:`computed_relationships`, you can add custom relationships or override automatically detected ones. This makes :ref:`resource_embedding` possible on Foreign Data Wrappers and complex SQL views. + +EXPLAIN Execution Plan +^^^^^^^^^^^^^^^^^^^^^^ + +The :ref:`EXPLAIN execution plan of a request ` is now obtainable with the ``Accept: application/vnd.pgrst.plan`` header. The result can be in ``text`` or ``json`` formats and is compatible with EXPLAIN vizualizers like `explain.depesz.com `_ or `explain.dalibo.com `_. + +POSIX Regular Expressions +^^^^^^^^^^^^^^^^^^^^^^^^^ + +You can now use two :ref:`pattern matching ` operators for `POSIX regular expressions `_: ``match`` and ``imatch``, equivalent in PostgreSQL to ``~`` and ``~*`` respectively. + +Access composite type fields and array elements +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +:ref:`Accessing fields of a Composite type or elements of an Array type ` is now possible with the arrow operators(``->``, ``->>``) in the same way you would access a JSON type fields. + +Authorize button for SwaggerUI +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +You can now activate the "Authorize" button in SwaggerUI by enabling the :ref:`openapi-security-active` configuration. Add your JWT token prepending :code:`Bearer` to it and you'll be able to request protected resources. + +Improved error messages +^^^^^^^^^^^^^^^^^^^^^^^ + +To increase consistency, all the errors messages are now normalized. The ``hint``, ``details``, ``code`` and ``message`` fields will always be present in the body, each one defaulting to a +``null`` value. In the same way, the :ref:`errors that were raised ` with ``SQLSTATE`` now include the ``message`` and ``code`` in the body. + +To further clarify the source of an error, we now add a ``PGRST`` prefix to the error code of all the errors that are PostgREST-specific and don't come from the database. These errors have unique codes that identifies them and are documented in the :ref:`pgrst_errors` section. + +Administration +~~~~~~~~~~~~~~ + +Health checks +^^^^^^^^^^^^^ + +Admins can now benefit from two :ref:`health check endpoints ` exposed in a different port than the main app. When activated, the ``live`` and ``ready`` endpoints are available to verify if PostgREST is alive and running or if the database connection and the :ref:`schema cache ` are ready for querying. + +Logging users +^^^^^^^^^^^^^ + +You can now see the :ref:`request database user in the logs `. + +Run without configuration +^^^^^^^^^^^^^^^^^^^^^^^^^ + +It is now possible to execute PostgREST without specifying any configuration variable. The three that were mandatory on the previous versions, are no longer so. + + - If :ref:`db-uri` is not set, PostgREST will use the `libpq environment variables `_ for the database connection. + - If :ref:`db-schemas` is not set, it will use the database ``public`` schema. + - If :ref:`db-anon-role` is not set, it will not allow anonymous requests. + +Documentation improvements +~~~~~~~~~~~~~~~~~~~~~~~~~~ + +* Added a :doc:`/how-tos/working-with-postgresql-data-types` how-to, which contains explanations and examples on how to work with different PostgreSQL data types such as timestamps, ranges or PostGIS types, among others. + +* Added in-database and environment variable settings for each :ref:`configuration variable `. + +* Added the :ref:`file_descriptors` subsection. + +* Added a reference page for :doc:`Error documentation `. + +* Moved the :ref:`error_source` and the :ref:`status_codes` sections to the :doc:`errors reference page `. + +* Moved the *Casting type to custom JSON* how-to to the :ref:`casting_range_to_json` subsection. + +* Removed direct links for PostgREST versions older than 8.0 from the versions menu. + +* Removed the deprecated *Embedding table from another schema* how-to. + +* Restructured the :ref:`resource_embedding` section: + + - Added a :ref:`one-to-many` and :ref:`many-to-one` subsections. + + - Renamed the *Embedding through join tables* subsection to :ref:`many-to-many`. + +Bug fixes +--------- + +* Return ``204 No Content`` without ``Content-Type`` for ``PUT`` (`#2058 `_) + +* Clarify error for failed schema cache load. (`#2107 `_) + + - From ``Database connection lost. Retrying the connection`` to ``Could not query the database for the schema cache. Retrying.`` + +* Fix silently ignoring filter on a non-existent embedded resource (`#1771 `_) + +* Remove functions, which are not callable due to unnamed arguments, from schema cache and OpenAPI output. (`#2152 `_) + +* Fix accessing JSON array fields with ``->`` and ``->>`` in ``?select=`` and ``?order=``. (`#2145 `_) + +* Ignore ``max-rows`` on ``POST``, ``PATCH``, ``PUT`` and ``DELETE`` (`#2155 `_) + +* Fix inferring a foreign key column as a primary key column on views (`#2254 `_) + +* Restrict generated many-to-many relationships (`#2070 `_) + + - Only adds many-to-many relationships when a table has foreign keys to two other tables and these foreign key columns are part of the table's primary key columns. + +* Allow casting to types with underscores and numbers (e.g. ``select=oid_array::_int4``) (`#2278 `_) + +* Prevent views from breaking one-to-many/many-to-one embeds when using column or foreign key as target (`#2277 `_, `#2238 `_, `#1643 `_) + + - When using a column or foreign key as target for embedding (``/tbl?select=*,col-or-fk(*)``), only tables are now detected and views are not. + + - You can still use a column or an inferred foreign key on a view to embed a table (``/view?select=*,col-or-fk(*)``) + +* Increase the ``db-pool-timeout`` to 1 hour to prevent frequent high connection latency (`#2317 `_) + +* The search path now correctly identifies schemas with uppercase and special characters in their names (regression) (`#2341 `_) + +* "404 Not Found" on nested routes and "405 Method Not Allowed" errors no longer start an empty database transaction (`#2364 `_) + +* Fix inaccurate result count when an inner embed was selected after a normal embed in the query string (`#2342 `_) + +* ``OPTIONS`` requests no longer start an empty database transaction (`#2376 `_) + +* Allow using columns with dollar sign ($) without double quoting in filters and ``select`` (`#2395 `_) + +* Fix loop crash error on startup in PostgreSQL 15 beta 3. ``Log: "UNION types \"char\" and text cannot be matched."`` (`#2410 `_) + +* Fix race conditions managing database connection helper (`#2397 `_) + +* Allow ``limit=0`` in the request query to return an empty array (`#2269 `_) + +Breaking changes +---------------- + +* Return ``204 No Content`` without ``Content-Type`` for RPCs returning ``VOID`` (`#2001 `_) + + - Previously, those RPCs would return ``null`` as a body with ``Content-Type: application/json``. + +* ``limit/offset`` now limits the affected rows on ``UPDATE``/``DELETE`` (`#2156 `_) + + - Previously, ``limit``/``offset`` only limited the returned rows but not the actual updated rows + +* ``max-rows`` is no longer applied on ``POST``, ``PATCH``, ``PUT`` and ``DELETE`` returned rows (`#2155 `_) + + - This was misleading because the affected rows were not really affected by ``max-rows``, only the returned rows were limited + +* Restrict generated many-to-many relationships (`#2070 `_) + + - A primary key that contains the foreign key columns is now needed for generating many-to-many relationships. + +* Views now are not detected when embedding using the column or foreign key as target (``/view?select=*,column(*)``) (`#2277 `_) + + - This embedding form was easily made ambiguous whenever a new view was added. + + - For migrating, clients must be updated to the embedding form of ``/view?select=*,other_view!column(*)``. + +* Using ``Prefer: return=representation`` no longer returns a ``Location`` header (`#2312 `_) + +Migration Guide +~~~~~~~~~~~~~~~ + +Many-to-may relationships +^^^^^^^^^^^^^^^^^^^^^^^^^ + +The way PostgREST infers many-to-many relationships is now restricted. Before this change, a table could work as an intermediate join between two tables just by having foreign keys referencing each one of them. Consider the following: + +.. code-block:: postgresql + + CREATE TABLE users ( + id INT PRIMARY KEY, + name TEXT + ); + + CREATE TABLE permissions ( + id INT PRIMARY KEY, + name TEXT + ); + + CREATE TABLE permission_user ( + id INT PRIMARY KEY, + user_id INT REFERENCES users(id), + permission_id INT REFERENCES permissions(id) + ); + +Before, PostgREST could infer a relationship between ``users`` and ``permissions`` through ``permission_user``. + +.. tabs:: + + .. code-tab:: http + + GET /users?select=permissions(*) HTTP/1.1 + + .. code-tab:: bash Curl + + curl "http://localhost:3000/users?select=permissions(*)" + +But now this is not allowed. In order for it to work, the intermediate table must also have the foreign keys included in its primary key. So, in this case we need to do the following: + +.. code-block:: postgresql + + -- This table has a pk defined already so we drop it first + alter table permission_user + drop constraint permission_user_pkey; + + -- Then we add all the foreign keys to the primary key + alter table permission_user + add primary key (id, user_id, permission_id); + +With this, PostgREST 10 will infer successfully a relationship between ``users`` and ``permissions``. + +If you want an alternative to the previous method or need a more customized relationship, you could use :ref:`computed_relationships` to get a similar result. + +Embedding views +^^^^^^^^^^^^^^^ + +Using column names or foreign key constraint names as :ref:`embedding targets ` will not detect views anymore. Consider this as an example: + +.. code-block:: postgresql + + CREATE TABLE users ( + id INT PRIMARY KEY, + name TEXT, + is_active BOOL + ); + + CREATE TABLE messages ( + id INT PRIMARY KEY, + body TEXT, + user_id INT REFERENCES users(id) + ); + + CREATE VIEW active_users AS + SELECT * + FROM users + WHERE is_active; + +Previously, the following request returned a ``300 Multiple Choices`` error, because the ``active_users`` view was also detected: + +.. tabs:: + + .. code-tab:: http + + GET /messages?select=body,user_id(name) HTTP/1.1 + + .. code-tab:: bash Curl + + curl "http://localhost:3000/messages?select=body,user_id(name)" + +But in this version, this will not fail and will embed the table ``users`` instead. You need to use the view name as target in order to embed it, like this: + +.. tabs:: + + .. code-tab:: http + + GET /messages?select=body,active_users(name) HTTP/1.1 + + .. code-tab:: bash Curl + + curl "http://localhost:3000messages?select=body,active_users(name)" + +For other cases, adding a column or foreign key as :ref:`hint ` may be needed. + +You could also use :ref:`computed_relationships` to get a similar result or if you want a more customized relationship. + +Thanks +------ + +Big thanks from the `PostgREST team `_ to our sponsors! + +.. container:: image-container + + .. image:: ../_static/cybertec-new.png + :target: https://www.cybertec-postgresql.com/en/?utm_source=postgrest.org&utm_medium=referral&utm_campaign=postgrest + :width: 13em + + .. image:: ../_static/2ndquadrant.png + :target: https://www.2ndquadrant.com/en/?utm_campaign=External%20Websites&utm_source=PostgREST&utm_medium=Logo + :width: 13em + + .. image:: ../_static/retool.png + :target: https://retool.com/?utm_source=sponsor&utm_campaign=postgrest + :width: 13em + + .. image:: ../_static/gnuhost.png + :target: https://gnuhost.eu/?utm_source=sponsor&utm_campaign=postgrest + :width: 13em + + .. image:: ../_static/supabase.png + :target: https://supabase.com/?utm_source=postgrest%20backers&utm_medium=open%20source%20partner&utm_campaign=postgrest%20backers%20github&utm_term=homepage + :width: 13em + + .. image:: ../_static/oblivious.jpg + :target: https://oblivious.ai/?utm_source=sponsor&utm_campaign=postgrest + :width: 13em + +* Evans Fernandes +* `Jan Sommer `_ +* `Franz Gusenbauer `_ +* `Daniel Babiak `_ +* Tsingson Qin +* Michel Pelletier +* Jay Hannah +* Robert Stolarz +* Nicholas DiBiase +* Christopher Reid +* Nathan Bouscal +* Daniel Rafaj +* David Fenko +* Remo Rechkemmer +* Severin Ibarluzea +* Tom Saleeba +* Pawel Tyll + +If you like to join them please consider `supporting PostgREST development `_. diff --git a/postgrest.dict b/postgrest.dict index d1430e1f6d..2105b58390 100644 --- a/postgrest.dict +++ b/postgrest.dict @@ -43,6 +43,7 @@ filename FreeBSD fts GC +GeoJSON GHC Github Google @@ -118,6 +119,7 @@ phraseto plainto plfts poolers +POSIX PostGIS PostgreSQL PostgreSQL's @@ -165,6 +167,7 @@ Stolarz subselect SuperAgent SvelteKit +SwaggerUI syslog systemd Tcl @@ -200,3 +203,5 @@ Websockets webuser wfts ZeroMQ +Customizable +customizable From 9128c8602ae5b2ff3ecea50eee1f3ecaedce0d85 Mon Sep 17 00:00:00 2001 From: Steve Chavez Date: Fri, 26 Aug 2022 16:08:08 -0500 Subject: [PATCH 522/711] Refine docs for v10 * shorten release page * shorten explain docs * add limited update/delete to release page * refine relationships * refine disambiguation * refine release page * remove migration guide * add author to WWT how-to --- docs/api.rst | 272 +++++++++++------- .../working-with-postgresql-data-types.rst | 2 + docs/releases/v10.0.0.rst | 244 +++++----------- 3 files changed, 244 insertions(+), 274 deletions(-) diff --git a/docs/api.rst b/docs/api.rst index 50d78aec41..bc95ea3372 100644 --- a/docs/api.rst +++ b/docs/api.rst @@ -875,52 +875,15 @@ returned together. For example, consider a database of films and their awards: .. important:: - * PostgREST needs `FOREIGN KEY constraints `_ to be able to do Resource Embedding. - * Whenever FOREIGN KEY constraints change in the database schema you must refresh PostgREST's schema cache for Resource Embedding to work properly. See the section :ref:`schema_reloading`. - -.. _one-to-many: - -One-to-many relationships -------------------------- - -When a one-to-many relationship is detected, the embedded resource is returned as a JSON array. For example, we can request the Directors and the Films they directed because there is a foreign key constraint between them, like this: - -.. tabs:: - - .. code-tab:: http - - GET /directors?select=last_name,films(title) HTTP/1.1 - - .. code-tab:: bash Curl - - curl "http://localhost:3000/directors?select=last_name,films(title)" - -.. code-block:: json - - [ - { "last_name": "Lumière", - "films": [ - {"title": "Workers Leaving The Lumière Factory In Lyon"} - ] - }, - { "last_name": "Dickson", - "films": [ - {"title": "The Dickson Experimental Sound Film"} - ] - }, - { "last_name": "Méliès", - "films": [ - {"title": "The Haunted Castle"} - ] - } - ] + Whenever FOREIGN KEY constraints change in the database schema you must refresh PostgREST's schema cache for Resource Embedding to work properly. See the section :ref:`schema_reloading`. .. _many-to-one: Many-to-one relationships ------------------------- -When a many-to-one relationship is detected, the embedded resource is returned as a JSON object. For example, we can request all the Films and the Director for each film like this: +Since ``films`` has a **foreign key** referencing ``directors``, this establishes a many-to-one relationship between them. Because of this, we're able +to request all the films and the director for each film. .. tabs:: @@ -955,7 +918,9 @@ When a many-to-one relationship is detected, the embedded resource is returned a } ] -However, the table name is in plural, which is not accurate since a Film is directed by only one Director. Using a table name alias can solve this: +Note that the embedded ``directors`` is returned as a JSON object because of the "to-one" end. + +Since the table name is plural, we can be more accurate by making it singular with an alias. .. tabs:: @@ -967,13 +932,64 @@ However, the table name is in plural, which is not accurate since a Film is dire curl "http://localhost:3000/films?select=title,director:directors(id,last_name)" +.. code-block:: json + + [ + { "title": "Workers Leaving The Lumière Factory In Lyon", + "director": { + "id": 2, + "last_name": "Lumière" + } + }, + ".." + ] + +.. _one-to-many: + +One-to-many relationships +------------------------- + +The inverse one-to-many relationship between ``directors`` and ``films`` is detected based on the **foreign key** reference. In this case, the embedded ``films`` are returned as a JSON array because of the "to-many" end. + +.. tabs:: + + .. code-tab:: http + + GET /directors?select=last_name,films(title) HTTP/1.1 + + .. code-tab:: bash Curl + + curl "http://localhost:3000/directors?select=last_name,films(title)" + +.. code-block:: json + + [ + { "last_name": "Lumière", + "films": [ + {"title": "Workers Leaving The Lumière Factory In Lyon"} + ] + }, + { "last_name": "Dickson", + "films": [ + {"title": "The Dickson Experimental Sound Film"} + ] + }, + { "last_name": "Méliès", + "films": [ + {"title": "The Haunted Castle"} + ] + } + ] + .. _many-to-many: Many-to-many relationships -------------------------- -PostgREST can also detect many-to-many relationships going through join tables. For this, the join table must contain foreign keys to the tables in -the many-to-many relationship and its composite primary key must include these foreign key columns. +Many-to-many relationships are detected based on the join table. The join table must contain foreign keys to other two tables +and they must be part of its composite key. + +For the many-to-many relationship between ``films`` and ``actors``, the join table ``roles`` would be: .. code-block:: postgresql @@ -983,8 +999,7 @@ the many-to-many relationship and its composite primary key must include these f , primary key(film_id, actor_id) ); - -- the many-to-many relationship can also be detected if the join table has a surrogate key, - -- as long as the foreign key columns are also part of the primary key + -- the join table can also be detected if the composite key has additional columns create table roles( id int generated always as identity, @@ -993,95 +1008,167 @@ the many-to-many relationship and its composite primary key must include these f , primary key(id, film_id, actor_id) ); -Then you can request the Actors for Films (which in this case finds the information through Roles). - .. tabs:: .. code-tab:: http - GET /actors?select=films(title,year) HTTP/1.1 + GET /actors?select=first_name,last_name,films(title) HTTP/1.1 .. code-tab:: bash Curl - curl "http://localhost:3000/actors?select=films(title,year)" + curl "http://localhost:3000/actors?select=first_name,last_name,films(title)" + +.. code-block:: json + + [ + { "first_name": "Willem", + "last_name": "Dafoe", + "films": [ + {"title": "The Lighthouse"} + ] + }, + ".." + ] .. _one-to-one: One-to-one relationships ------------------------ -PostgREST detects one-to-one relationships when a foreign key is also the primary key of the table or when the foreign key has a ``UNIQUE`` constraint. +one-to-one relationships are detected if there's an unique constraint on a foreign key. .. code-block:: postgresql - -- references Films using the primary key as a foreign key CREATE TABLE technical_specs( - film_id INT PRIMARY KEY REFERENCES films, + film_id INT REFERENCES films UNIQUE, runtime TIME, camera TEXT, sound TEXT ); - -- references Films using a foreign key with unique constraint +Or if the foreign key is also a primary key. + +.. code-block:: postgresql + + -- references Films using the primary key as a foreign key CREATE TABLE technical_specs( - film_id INT REFERENCES films UNIQUE, + film_id INT PRIMARY KEY REFERENCES films, runtime TIME, camera TEXT, sound TEXT ); -Now, the embedding between Films and Technical_Specs is returned as a JSON object no matter the order. - .. tabs:: .. code-tab:: http - GET /films?select=title,technical_specs(*) HTTP/1.1 + GET /films?select=title,technical_specs(runtime) HTTP/1.1 .. code-tab:: bash Curl - curl "http://localhost:3000/films?select=title,technical_specs(*)" + curl "http://localhost:3000/films?select=title,technical_specs(runtime)" + +.. code-block:: json + + [ + { + "title": "Pulp Fiction", + "technical_specs": {"camera": "Arriflex 35-III"} + }, + ".." + ] .. _computed_relationships: -Computed Relationships +Computed relationships ---------------------- -You can customize how PostgREST detects relationships between two tables. To do this, you need to create a function that has one of the tables as a single parameter and the other as its return type. For instance: +You can manually define relationships between resources. This is useful for database objects that can't define foreign keys, like `Foreign Data Wrappers `_. +To do this, you can create functions similar to :ref:`computed_cols`. + +Assuming there's a foreign table ``premieres`` that we want to relate to ``films``. .. code-block:: postgres - CREATE FUNCTION director_competition(directors) RETURNS SETOF competitions AS $$ - SELECT c.* - FROM competitions c - JOIN nominations n ON c.id = n.competition_id - JOIN films f ON n.film_id = f.id - WHERE f.director_id = $1.id - $$ STABLE LANGUAGE sql; + create foreign table premieres ( + id integer, + location text, + "date" date, + film_id integer + ) server import_csv options ( filename '/tmp/directors.csv', format 'csv'); -The above function allows a direct relationship between ``directors`` and ``competitions``: + create function film(premieres) returns setof films rows 1 as $$ + select * from films where id = $1.film_id + $$ stable language sql; + +The above function defines a relationship between ``premieres`` (the parameter) and ``films`` (the return type) and since there's a ``rows 1``, this defines a many-to-one relationship. +The name of the function ``film`` is arbitrary and can be used to do the embedding: + +.. tabs:: + + .. code-tab:: http + + GET /premieres?select=location,film(name) HTTP/1.1 + + .. code-tab:: bash Curl + + curl "http://localhost:3000/premieres?select=location,film(name)" + +.. code-block:: json + + [ + { + "location": "Cannes Film Festival", + "film": {"name": "Pulp Fiction"} + }, + ".." + ] + +Now let's define the opposite one-to-many relationship with another function. + +.. code-block:: postgres + + create function premieres(films) returns setof premieres as $$ + select * from premieres where film_id = $1.director_id + $$ stable language sql; + +Similarly, this function defines a relationship between the parameter ``films`` and the return type ``premieres``. +In this case there's an implicit ``ROWS 1000`` defined by PostgreSQL(`search "result_rows" on this PostgreSQL doc `_), +we consider any value greater than 1 as "many" so this defines a one-to-many relationship. .. tabs:: .. code-tab:: http - GET /directors?select=*,competitions:director_competition(name) HTTP/1.1 + GET /films?select=name,premieres(name) HTTP/1.1 .. code-tab:: bash Curl - curl "http://localhost:3000/directors?select=*,competitions:director_competition(name)" + curl "http://localhost:3000/films?select=name,premieres(name)" + +.. code-block:: json + + [ + { + "name": "Pulp Ficiton", + "premieres": [{"location": "Cannes Festival"}] + }, + ".." + ] -Take into consideration that the opposite relationship will not be detected, so you need to create another function for that. +Computed relationships also allow you to override the ones that are automatically detected by PostgREST. -Computed relationships also allow you to override the ones that are detected by default. For example, this function can change the ``/films?select=directors(*)`` embedding: +For example, to override the :ref:`many-to-one relationship ` between ``films`` and ``directors``. .. code-block:: postgres - CREATE FUNCTION directors(films) RETURNS SETOF directors ROW 1 AS $$ - -- Override the relationship here - $$ STABLE LANGUAGE sql; + create function directors(films) returns setof directors rows 1 as $$ + select * from directors where id = $1.director_id + $$ stable language sql; + +Taking advantage of overloaded functions, you can use the same function name for different parameters and thus define relationships from other tables/views to ``directors``. -Note that if ``ROW 1`` is added, PostgREST will detect a :ref:`many-to-one relationship ` and return a JSON object instead of an array embedding. +Computed relationships have good performance as they follow the `Inlining conditions for table functions `_. .. _nested_embedding: @@ -1327,22 +1414,15 @@ Since this view contains ``nominations.film_id``, which has a **foreign key** re It's also possible to embed `Materialized Views `_. -.. warning:: - - It's not guaranteed that all kinds of views will be embeddable. In particular, views that contain - UNIONs will not be made embeddable. - - Why? PostgREST detects source table foreign keys in the view by querying and parsing `pg_rewrite `_. - This may fail depending on the complexity of the view. - - `Report an issue `_ if your view is not made embeddable so we can - keep continue improving foreign key detection. +.. important:: - In the future we'll include a way to manually specify views source foreign keys to address this limitation. + - It's not guaranteed that all kinds of views will be embeddable. In particular, views that contain UNIONs will not be made embeddable. -.. important:: + + Why? PostgREST detects source table foreign keys in the view by querying and parsing `pg_rewrite `_. + This may fail depending on the complexity of the view. + + As a workaround, you can use :ref:`computed_relationships` to define manual relationships for views. - If view definitions change you must refresh PostgREST's schema cache for this to work properly. See the section :ref:`schema_reloading`. + - If view definitions change you must refresh PostgREST's schema cache for this to work properly. See the section :ref:`schema_reloading`. .. _embedding_view_chains: @@ -1603,7 +1683,7 @@ Hints also work alongside ``!inner`` if a top level filtering is needed. From th .. note:: - If the relationship is so complex that hint disambiguation does not solve it, then using :ref:`computed_relationships` is the best alternative. + If the relationship is so complex that hint disambiguation does not solve it, you can use :ref:`computed_relationships`. .. _insert: @@ -2887,9 +2967,7 @@ Returns: Execution plan -------------- -You can get the execution plan of a request by adding the ``Accept: application/vnd.pgrst.plan`` header after setting the :ref:`db-plan-enabled` configuration to ``true``. It is useful to verify why a certain operation might be expensive as a result of using `EXPLAIN `_ on the generated query for the request. - -The output of the plan is generated in ``text`` format by default: +You can get the `EXPLAIN execution plan `_ of a request by adding the ``Accept: application/vnd.pgrst.plan`` header when :ref:`db-plan-enabled` is set to ``true``. .. tabs:: @@ -2908,7 +2986,7 @@ The output of the plan is generated in ``text`` format by default: Aggregate (cost=73.65..73.68 rows=1 width=112) -> Index Scan using users_pkey on users (cost=0.15..60.90 rows=850 width=36) -The same execution can be returned in ``json`` format by using the ``Accept: application/vnd.pgrst.plan+json`` header instead: +The output of the plan is generated in ``text`` format by default but you can change it to JSON by using the ``+json`` suffix. .. tabs:: @@ -2956,8 +3034,8 @@ The same execution can be returned in ``json`` format by using the ``Accept: app } ] -You can also get the result plan of the different media types that PostgREST supports by adding them to the header using ``for``. For instance, to obtain the plan for a :ref:`text/xml ` media type in json format, you need to add the ``Accept: application/vnd.pgrst.plan; for=text/xml`` header. +By default the plan is assumed to generate the JSON representation of a resource(``application/json``), but you can obtain the plan for the :ref:`different representations that PostgREST supports ` by adding them to the ``for`` parameter. For instance, to obtain the plan for a ``text/xml``, you would use ``Accept: application/vnd.pgrst.plan; for="text/xml``. -Additionally, the deactivated parameters of the ``EXPLAIN`` command can be enabled by adding them to the header using ``options``. The available parameters are ``analyze``, ``verbose``, ``settings``, ``buffers`` and ``wal``, while the remaining ones are active by default. For example, to add the ``analyze`` and ``wal`` parameters, add the ``Accept: application/vnd.pgrst.plan; options=analyze|wal`` header. +The other available parameters are ``analyze``, ``verbose``, ``settings``, ``buffers`` and ``wal``, which correspond to the `EXPLAIN command options `_. To use the ``analyze`` and ``wal`` parameters for example, you would add them like ``Accept: application/vnd.pgrst.plan; options=analyze|wal``. -Note that any changes done will be committed when activating the ``analyze`` option. To avoid this, set the :ref:`db-tx-end` configuration in a way that allows to rollback the changes according to your preference. +Note that akin to the EXPLAIN command, the changes will be committed when using the ``analyze`` option. To avoid this, you can use the :ref:`db-tx-end` and the ``Prefer: tx=rollback`` header. diff --git a/docs/how-tos/working-with-postgresql-data-types.rst b/docs/how-tos/working-with-postgresql-data-types.rst index fb317c97e9..68a50fa24d 100644 --- a/docs/how-tos/working-with-postgresql-data-types.rst +++ b/docs/how-tos/working-with-postgresql-data-types.rst @@ -3,6 +3,8 @@ Working with PostgreSQL data types ================================== +:author: `Laurence Isla `_ + PostgREST makes use of PostgreSQL string representations to work with data types. Thanks to this, you can use special values, such as ``now`` for timestamps, ``yes`` for booleans or time values including the time zones. This page describes how you can take advantage of these string representations to perform operations on different PostgreSQL data types. .. contents:: diff --git a/docs/releases/v10.0.0.rst b/docs/releases/v10.0.0.rst index 4d2a6aea89..7dc46fedae 100644 --- a/docs/releases/v10.0.0.rst +++ b/docs/releases/v10.0.0.rst @@ -5,79 +5,65 @@ PostgREST 10.0.0 Features -------- -API -~~~ - XML/SOAP support for RPC -^^^^^^^^^^^^^^^^^^^^^^^^ +~~~~~~~~~~~~~~~~~~~~~~~~ -RPC now understands the ``text/xml`` media type, allowing SQL functions to send XML output(``Accept: text/xml``) and receive XML input(``Content-Type: text/xml``). This makes SOAP endpoints possible, check the :ref:`create_soap_endpoint` how-to for more details. +RPC now understands the ``text/xml`` media type, allowing SQL functions to send XML output(``Accept: text/xml``) and receive XML input(``Content-Type: text/xml``). This makes SOAP endpoints possible, check the :ref:`create_soap_endpoint` how-to and the :ref:`scalar_return_formats` reference for more details. GeoJSON support -^^^^^^^^^^^^^^^ +~~~~~~~~~~~~~~~ GeoJSON is supported across the board(reads, writes, RPC) with the ``Accept: application/geo+json`` header, this depends on PostGIS from the versions 3.0.0 and up. The :ref:`working with PostGIS section ` has an example to get you started. -One-to-one relationships -^^^^^^^^^^^^^^^^^^^^^^^^ +Execution Plan +~~~~~~~~~~~~~~ -A :ref:`one-to-one relationship ` is now detected when a table's foreign key is also its primary key or when the foreign key has a ``UNIQUE`` constraint. +The :ref:`execution plan ` of a request is now obtainable with the ``Accept: application/vnd.pgrst.plan`` header. The result can be in ``text`` or ``json`` formats and is compatible with EXPLAIN vizualizers like `explain.depesz.com `_ or `explain.dalibo.com `_. -Customizable Relationships for Resource Embedding -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Resource Embedding +~~~~~~~~~~~~~~~~~~ -Using :ref:`computed_relationships`, you can add custom relationships or override automatically detected ones. This makes :ref:`resource_embedding` possible on Foreign Data Wrappers and complex SQL views. +- A :ref:`one-to-one relationship ` is now detected when a foreign key is unique. -EXPLAIN Execution Plan -^^^^^^^^^^^^^^^^^^^^^^ +- Using :ref:`computed_relationships`, you can add custom relationships or override automatically detected ones. This makes :ref:`resource_embedding` possible on Foreign Data Wrappers and complex SQL views. -The :ref:`EXPLAIN execution plan of a request ` is now obtainable with the ``Accept: application/vnd.pgrst.plan`` header. The result can be in ``text`` or ``json`` formats and is compatible with EXPLAIN vizualizers like `explain.depesz.com `_ or `explain.dalibo.com `_. +Horizontal/Vertical Filtering +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -POSIX Regular Expressions -^^^^^^^^^^^^^^^^^^^^^^^^^ +- :ref:`Accessing fields of a Composite type or elements of an Array type ` is now possible with the arrow operators(``->``, ``->>``) in the same way you would access a JSON type fields. -You can now use two :ref:`pattern matching ` operators for `POSIX regular expressions `_: ``match`` and ``imatch``, equivalent in PostgreSQL to ``~`` and ``~*`` respectively. +- :ref:`pattern_matching` operators for `POSIX regular expressions `_ are now available: ``match`` and ``imatch``, equivalent in PostgreSQL to ``~`` and ``~*`` respectively. -Access composite type fields and array elements -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Insertions/Updates +~~~~~~~~~~~~~~~~~~ -:ref:`Accessing fields of a Composite type or elements of an Array type ` is now possible with the arrow operators(``->``, ``->>``) in the same way you would access a JSON type fields. +- ``limit`` can now affect the number of updated/deleted rows. See :ref:`limited_update_delete`. -Authorize button for SwaggerUI -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +OpenAPI +~~~~~~~ You can now activate the "Authorize" button in SwaggerUI by enabling the :ref:`openapi-security-active` configuration. Add your JWT token prepending :code:`Bearer` to it and you'll be able to request protected resources. -Improved error messages -^^^^^^^^^^^^^^^^^^^^^^^ - -To increase consistency, all the errors messages are now normalized. The ``hint``, ``details``, ``code`` and ``message`` fields will always be present in the body, each one defaulting to a -``null`` value. In the same way, the :ref:`errors that were raised ` with ``SQLSTATE`` now include the ``message`` and ``code`` in the body. - -To further clarify the source of an error, we now add a ``PGRST`` prefix to the error code of all the errors that are PostgREST-specific and don't come from the database. These errors have unique codes that identifies them and are documented in the :ref:`pgrst_errors` section. - Administration ~~~~~~~~~~~~~~ -Health checks -^^^^^^^^^^^^^ +- Two :ref:`health check endpoints ` are now exposed in a secondary port. -Admins can now benefit from two :ref:`health check endpoints ` exposed in a different port than the main app. When activated, the ``live`` and ``ready`` endpoints are available to verify if PostgREST is alive and running or if the database connection and the :ref:`schema cache ` are ready for querying. +- :ref:`pgrst_logging` now shows the database user. -Logging users -^^^^^^^^^^^^^ - -You can now see the :ref:`request database user in the logs `. - -Run without configuration -^^^^^^^^^^^^^^^^^^^^^^^^^ - -It is now possible to execute PostgREST without specifying any configuration variable. The three that were mandatory on the previous versions, are no longer so. +- It is now possible to execute PostgREST without specifying any configuration variable. The three that were mandatory on the previous versions, are no longer so. - If :ref:`db-uri` is not set, PostgREST will use the `libpq environment variables `_ for the database connection. - If :ref:`db-schemas` is not set, it will use the database ``public`` schema. - If :ref:`db-anon-role` is not set, it will not allow anonymous requests. +Error messages +~~~~~~~~~~~~~~ + +- To increase consistency, all the errors messages are now normalized. The ``hint``, ``details``, ``code`` and ``message`` fields will always be present in the body, each one defaulting to a ``null`` value. In the same way, the :ref:`errors that were raised ` with ``SQLSTATE`` now include the ``message`` and ``code`` in the body. + +- To further clarify the source of an error, we now add a ``PGRST`` prefix to the error code of all the errors that are PostgREST-specific and don't come from the database. These errors have unique codes that identify them and are documented in the :ref:`pgrst_errors` section. + Documentation improvements ~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -95,7 +81,7 @@ Documentation improvements * Removed direct links for PostgREST versions older than 8.0 from the versions menu. -* Removed the deprecated *Embedding table from another schema* how-to. +* Removed the *Embedding table from another schema* how-to. * Restructured the :ref:`resource_embedding` section: @@ -103,6 +89,43 @@ Documentation improvements - Renamed the *Embedding through join tables* subsection to :ref:`many-to-many`. +* Split up the *Insertions/Updates* section into :ref:`insert` and :ref:`update`. + +Breaking changes +---------------- + +* Many-to-many relationships now require that foreign key columns be part of the join table composite key + + - This was needed to reduce :ref:`embed_disamb` errors in complex schemas(`#2070 `_). + + - For migrating to this version, the less invasive method is to use :ref:`computed_relationships` to replace the previous many-to-many relationships. + + - Otherwise you can change your join table primary key. For example with ``alter table permission_user drop constraint permission_user_pkey, add primary key (id, user_id, permission_id);`` + +* Views now are not detected when embedding using :ref:`target_disamb`. + + - This embedding form was easily made ambiguous whenever a new view was added(`#2277 `_). + + - For migrating to this version, you can use :ref:`computed_relationships` to replace the previous view relationships. + + - :ref:`hint_disamb` works as usual on views. + +* ``limit/offset`` now limits the affected rows on ``UPDATE``/``DELETE`` + + - Previously, ``limit``/``offset`` only limited the returned rows but not the actual updated rows(`#2156 `_) + +* ``max-rows`` is no longer applied on ``POST``, ``PATCH``, ``PUT`` and ``DELETE`` returned rows + + - This was misleading because the affected rows were not really affected by ``max-rows``, only the returned rows were limited(`#2155 `_) + +* Return ``204 No Content`` without ``Content-Type`` for RPCs returning ``VOID`` + + - Previously, those RPCs would return ``null`` as a body with ``Content-Type: application/json`` (`#2001 `_). + +* Using ``Prefer: return=representation`` no longer returns a ``Location`` header + + - This reduces unnecessary computing for all insertions (`#2312 `_) + Bug fixes --------- @@ -152,139 +175,6 @@ Bug fixes * Allow ``limit=0`` in the request query to return an empty array (`#2269 `_) -Breaking changes ----------------- - -* Return ``204 No Content`` without ``Content-Type`` for RPCs returning ``VOID`` (`#2001 `_) - - - Previously, those RPCs would return ``null`` as a body with ``Content-Type: application/json``. - -* ``limit/offset`` now limits the affected rows on ``UPDATE``/``DELETE`` (`#2156 `_) - - - Previously, ``limit``/``offset`` only limited the returned rows but not the actual updated rows - -* ``max-rows`` is no longer applied on ``POST``, ``PATCH``, ``PUT`` and ``DELETE`` returned rows (`#2155 `_) - - - This was misleading because the affected rows were not really affected by ``max-rows``, only the returned rows were limited - -* Restrict generated many-to-many relationships (`#2070 `_) - - - A primary key that contains the foreign key columns is now needed for generating many-to-many relationships. - -* Views now are not detected when embedding using the column or foreign key as target (``/view?select=*,column(*)``) (`#2277 `_) - - - This embedding form was easily made ambiguous whenever a new view was added. - - - For migrating, clients must be updated to the embedding form of ``/view?select=*,other_view!column(*)``. - -* Using ``Prefer: return=representation`` no longer returns a ``Location`` header (`#2312 `_) - -Migration Guide -~~~~~~~~~~~~~~~ - -Many-to-may relationships -^^^^^^^^^^^^^^^^^^^^^^^^^ - -The way PostgREST infers many-to-many relationships is now restricted. Before this change, a table could work as an intermediate join between two tables just by having foreign keys referencing each one of them. Consider the following: - -.. code-block:: postgresql - - CREATE TABLE users ( - id INT PRIMARY KEY, - name TEXT - ); - - CREATE TABLE permissions ( - id INT PRIMARY KEY, - name TEXT - ); - - CREATE TABLE permission_user ( - id INT PRIMARY KEY, - user_id INT REFERENCES users(id), - permission_id INT REFERENCES permissions(id) - ); - -Before, PostgREST could infer a relationship between ``users`` and ``permissions`` through ``permission_user``. - -.. tabs:: - - .. code-tab:: http - - GET /users?select=permissions(*) HTTP/1.1 - - .. code-tab:: bash Curl - - curl "http://localhost:3000/users?select=permissions(*)" - -But now this is not allowed. In order for it to work, the intermediate table must also have the foreign keys included in its primary key. So, in this case we need to do the following: - -.. code-block:: postgresql - - -- This table has a pk defined already so we drop it first - alter table permission_user - drop constraint permission_user_pkey; - - -- Then we add all the foreign keys to the primary key - alter table permission_user - add primary key (id, user_id, permission_id); - -With this, PostgREST 10 will infer successfully a relationship between ``users`` and ``permissions``. - -If you want an alternative to the previous method or need a more customized relationship, you could use :ref:`computed_relationships` to get a similar result. - -Embedding views -^^^^^^^^^^^^^^^ - -Using column names or foreign key constraint names as :ref:`embedding targets ` will not detect views anymore. Consider this as an example: - -.. code-block:: postgresql - - CREATE TABLE users ( - id INT PRIMARY KEY, - name TEXT, - is_active BOOL - ); - - CREATE TABLE messages ( - id INT PRIMARY KEY, - body TEXT, - user_id INT REFERENCES users(id) - ); - - CREATE VIEW active_users AS - SELECT * - FROM users - WHERE is_active; - -Previously, the following request returned a ``300 Multiple Choices`` error, because the ``active_users`` view was also detected: - -.. tabs:: - - .. code-tab:: http - - GET /messages?select=body,user_id(name) HTTP/1.1 - - .. code-tab:: bash Curl - - curl "http://localhost:3000/messages?select=body,user_id(name)" - -But in this version, this will not fail and will embed the table ``users`` instead. You need to use the view name as target in order to embed it, like this: - -.. tabs:: - - .. code-tab:: http - - GET /messages?select=body,active_users(name) HTTP/1.1 - - .. code-tab:: bash Curl - - curl "http://localhost:3000messages?select=body,active_users(name)" - -For other cases, adding a column or foreign key as :ref:`hint ` may be needed. - -You could also use :ref:`computed_relationships` to get a similar result or if you want a more customized relationship. - Thanks ------ From 022101ae3c8b23760c107b23a5a6b21d0c575a4b Mon Sep 17 00:00:00 2001 From: mdr1384 <32360633+mdr1384@users.noreply.github.com> Date: Thu, 15 Sep 2022 09:32:24 -0400 Subject: [PATCH 523/711] Fix example code in computed relationships Looks like a copy-paste error - the `films.id` column should be associated with the `premieres.film_id` column. --- docs/api.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/api.rst b/docs/api.rst index bc95ea3372..89a48524ca 100644 --- a/docs/api.rst +++ b/docs/api.rst @@ -1129,7 +1129,7 @@ Now let's define the opposite one-to-many relationship with another function. .. code-block:: postgres create function premieres(films) returns setof premieres as $$ - select * from premieres where film_id = $1.director_id + select * from premieres where film_id = $1.id $$ stable language sql; Similarly, this function defines a relationship between the parameter ``films`` and the return type ``premieres``. From d507f2f0f4f8e8eddf2ebbd367c6a4c03cc1f39e Mon Sep 17 00:00:00 2001 From: Laurence Isla Date: Mon, 19 Sep 2022 21:09:32 -0500 Subject: [PATCH 524/711] Shorten explanations for the working with types section --- .../working-with-postgresql-data-types.rst | 58 +++++++++---------- 1 file changed, 29 insertions(+), 29 deletions(-) diff --git a/docs/how-tos/working-with-postgresql-data-types.rst b/docs/how-tos/working-with-postgresql-data-types.rst index 68a50fa24d..04e6562de1 100644 --- a/docs/how-tos/working-with-postgresql-data-types.rst +++ b/docs/how-tos/working-with-postgresql-data-types.rst @@ -14,7 +14,7 @@ PostgREST makes use of PostgreSQL string representations to work with data types Timestamps ---------- -You can use the **time zone** to filter or send data if needed. Let's use this table as an example: +You can use the **time zone** to filter or send data if needed. .. code-block:: postgres @@ -88,7 +88,7 @@ You can use other comparative filters and also all the `PostgreSQL special date/ JSON ---- -To work with a ``json`` type column, you can handle the value as a JSON object. For instance, let's use this table: +To work with a ``json`` type column, you can handle the value as a JSON object. .. code-block:: postgres @@ -98,7 +98,7 @@ To work with a ``json`` type column, you can handle the value as a JSON object. extra_info json ); -Now, you can insert a new product using a JSON object for the ``extra_info`` column: +You can insert a new product using a JSON object for the ``extra_info`` column: .. tabs:: @@ -136,7 +136,7 @@ To query and filter the data see :ref:`json_columns` for a complete reference. Arrays ------ -To handle `array types `_ you can use string representation or JSON array format. For instance, let's create the following table: +To handle `array types `_ you can use string representation or JSON array format. .. code-block:: postgres @@ -147,7 +147,7 @@ To handle `array types `_ y performance_times time[] ); -To insert a new value you can use string representation. +You can insert a new value using string representation. .. tabs:: @@ -176,7 +176,7 @@ To insert a new value you can use string representation. } EOF -Or you could send the data using a JSON array format. The following request sends the same data as the example above: +Or you could send the same data using JSON array format: .. tabs:: @@ -205,20 +205,20 @@ Or you could send the data using a JSON array format. The following request send } EOF -To query the data you can use the arrow operators. See :ref:`composite_array_columns`. +To query the data you can use arrow operators. See :ref:`composite_array_columns`. Multidimensional Arrays ~~~~~~~~~~~~~~~~~~~~~~~ -Handling multidimensional arrays is no different than handling one-dimensional ones: both the string representation and the JSON array format are allowed. For example, let's add a new column to the table: +Similarly to one-dimensional arrays, both the string representation and JSON array format are allowed. .. code-block:: postgres - -- The column stores the cinema, floor and auditorium numbers in that order + -- This new column stores the cinema, floor and auditorium numbers in that order alter table movies add column cinema_floor_auditorium int[][][]; -Now, let's update the row we inserted before using JSON array format: +You can now update the item using JSON array format: .. tabs:: @@ -241,7 +241,7 @@ Now, let's update the row we inserted before using JSON array format: } EOF -Now, for example, to query the auditoriums that are located in the first cinema (position 0 in the array) and on the second floor (position 1 in the next inner array), we can use the arrow operators this way: +Then, for example, to query the auditoriums that are located in the first cinema (position 0 in the array) and on the second floor (position 1 in the next inner array), we can use the arrow operators this way: .. tabs:: @@ -265,7 +265,7 @@ Now, for example, to query the auditoriums that are located in the first cinema Composite Types --------------- -With PostgREST, you have two options to handle `composite type columns `_. On one hand you can use string representation and on the other you can handle it as you would a JSON column. Let's create a type and a table for this example: +With PostgREST, you have two options to handle `composite type columns `_. .. code-block:: postgres @@ -284,7 +284,7 @@ With PostgREST, you have two options to handle `composite type columns `_, let's use the following table as an example: +PostgREST allows you to handle `ranges `_. .. code-block:: postgres @@ -353,7 +353,7 @@ To illustrate how to work with `ranges ` to filter the data. But what if you need get the events for the New Year 2023? Doing this filter ``events?duration=cs.2023-01-01`` will return an error because PostgreSQL needs an explicit cast to timestamp of the string value. A workaround would be to use a range starting and ending in the same date, like this: +You can use range :ref:`operators ` to filter the data. But, in this case, requesting a filter like ``events?duration=cs.2023-01-01`` will return an error, because PostgreSQL needs an explicit cast from string to timestamp. A workaround is to use a range starting and ending in the same date: .. tabs:: @@ -470,7 +470,7 @@ Finally, do the request :ref:`casting the range column `: Bytea ----- -To send raw binary to PostgREST you need a function with a single unnamed parameter of `bytea type `_. For example, let's create a table that will save some files and a function that inserts data to that table: +To send raw binary to PostgREST you need a function with a single unnamed parameter of `bytea type `_. .. code-block:: postgres @@ -483,7 +483,7 @@ To send raw binary to PostgREST you need a function with a single unnamed parame insert into files (file) values ($1); $$ language sql; -Next, let's use the PostgREST logo for our test. +Let's download the PostgREST logo for our test. .. code-block:: bash @@ -506,8 +506,8 @@ Now, to send the file ``postgrest-logo.png`` we need to set the ``Content-Type: -X POST -H "Content-Type: application/octet-stream" \ --data-binary "@postgrest-logo.png" -To get the image from the database, you will need to set the ``Accept: application/octet-stream`` header in the request and select only the -``bytea`` column. +To get the image from the database, set the ``Accept: application/octet-stream`` header and select only the +``bytea`` type column. .. tabs:: @@ -521,7 +521,7 @@ To get the image from the database, you will need to set the ``Accept: applicati curl "http://localhost:3000/files?select=file&id=eq.1" \ -H "Accept: application/octet-stream" -You can also use more accurate headers depending on the type of the files by using the :ref:`raw-media-types` configuration. For example, adding the ``raw-media-types="image/png"`` setting to the configuration file will allow you to use the ``Accept: image/png`` header: +Use more accurate headers according to the type of the files by using the :ref:`raw-media-types` configuration. For example, adding the ``raw-media-types="image/png"`` setting to the configuration file will allow you to use the ``Accept: image/png`` header: .. tabs:: @@ -544,7 +544,7 @@ See :ref:`providing_img` for a step-by-step example on how to handle images in H hstore ------ -You can work with data types belonging to additional supplied modules such as `hstore `_. Let's use the following table: +You can work with data types belonging to additional supplied modules such as `hstore `_. .. code-block:: postgres @@ -556,7 +556,7 @@ You can work with data types belonging to additional supplied modules such as `h name hstore unique ); -The ``name`` column will have the name of the country in different formats. You can insert values using the string representation for that data type, for instance: +The ``name`` column will have the name of the country in different formats. You can insert values using the string representation for that data type: .. tabs:: @@ -583,7 +583,7 @@ The ``name`` column will have the name of the country in different formats. You Notice that the use of ``"`` in the value of the ``name`` column needs to be escaped using a backslash ``\``. -You can also query and filter the value of a ``hstore`` column using the arrow operators, as you would do for a :ref:`JSON column`. For example, if you want to get the native name of Egypt, the query would be: +You can also query and filter the value of a ``hstore`` column using the arrow operators, as you would do for a :ref:`JSON column`. For example, if you want to get the native name of Egypt: .. tabs:: @@ -604,7 +604,7 @@ You can also query and filter the value of a ``hstore`` column using the arrow o PostGIS ------- -You can use the string representation for `PostGIS `_ data types such as ``geometry`` or ``geography``. As an example, let's create a table using the ``geometry`` type (you need to `install PostGIS `_ first). +You can use the string representation for `PostGIS `_ data types such as ``geometry`` or ``geography`` (you need to `install PostGIS `_ first). .. code-block:: postgres @@ -617,7 +617,7 @@ You can use the string representation for `PostGIS `_ data area geometry ); -Say you want to add areas in polygon format. The request using string representation would look like: +To add areas in polygon format, you can use string representation: .. tabs:: @@ -697,7 +697,7 @@ If you need to add an extra property, like the area in square units by using ``s alter table coverage add square_units double precision generated always as ( st_area(area) ) stored; -In the case that you are using older PostGIS versions, then creating a function is your best option. For example: +In the case that you are using older PostGIS versions, then creating a function is your best option: .. code-block:: postgres From fdb975c87c9e85b1ed4e6d1a4d81956c3c6cf623 Mon Sep 17 00:00:00 2001 From: Laurence Isla Date: Wed, 21 Sep 2022 19:09:50 -0500 Subject: [PATCH 525/711] Add information on preflight requests in CORS subsection --- docs/api.rst | 30 ++++++++++++++++++++++++++++++ postgrest.dict | 1 + 2 files changed, 31 insertions(+) diff --git a/docs/api.rst b/docs/api.rst index 89a48524ca..8638445b7c 100644 --- a/docs/api.rst +++ b/docs/api.rst @@ -2705,6 +2705,36 @@ CORS PostgREST sets highly permissive cross origin resource sharing, that is why it accepts Ajax requests from any domain. +It also handles `preflight requests `_ done by the browser, which are cached using the returned ``Access-Control-Max-Age: 86400`` header (86400 seconds = 24 hours). This is useful to reduce the latency of the subsequent requests. + +A ``POST`` preflight request would look like this: + +.. tabs:: + + .. code-tab:: http + + OPTIONS /items HTTP/1.1 + Origin: http://example.com + Access-Control-Allow-Method: POST + Access-Control-Allow-Headers: Content-Type + + .. code-tab:: bash Curl + + curl -i "http://localhost:3000/items" \ + -X OPTIONS \ + -H "Origin: http://example.com" \ + -H "Access-Control-Request-Method: POST" \ + -H "Access-Control-Request-Headers: Content-Type" + +.. code-block:: http + + HTTP/1.1 200 OK + Access-Control-Allow-Origin: http://example.com + Access-Control-Allow-Credentials: true + Access-Control-Allow-Methods: GET, POST, PATCH, PUT, DELETE, OPTIONS, HEAD + Access-Control-Allow-Headers: Authorization, Content-Type, Accept, Accept-Language, Content-Language + Access-Control-Max-Age: 86400 + .. _multiple-schemas: Switching Schemas diff --git a/postgrest.dict b/postgrest.dict index 2105b58390..39588be676 100644 --- a/postgrest.dict +++ b/postgrest.dict @@ -127,6 +127,7 @@ PostgREST postgrest PostgREST's pre +preflight psql Qin RabbitMQ From 73f759ef3a0b519c64ebe3a2d4e203a311c0a668 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 17 Oct 2022 12:23:52 +0000 Subject: [PATCH 526/711] Bump cachix/install-nix-action from 17 to 18 Bumps [cachix/install-nix-action](https://github.com/cachix/install-nix-action) from 17 to 18. - [Release notes](https://github.com/cachix/install-nix-action/releases) - [Commits](https://github.com/cachix/install-nix-action/compare/v17...v18) --- updated-dependencies: - dependency-name: cachix/install-nix-action dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- .github/workflows/ci.yaml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 865683ba16..18290bff2f 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -16,7 +16,7 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - - uses: cachix/install-nix-action@v17 + - uses: cachix/install-nix-action@v18 - run: nix-env -f default.nix -iA build - run: postgrest-docs-build @@ -25,7 +25,7 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - - uses: cachix/install-nix-action@v17 + - uses: cachix/install-nix-action@v18 - run: nix-env -f default.nix -iA spellcheck - run: postgrest-docs-spellcheck @@ -35,7 +35,7 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - - uses: cachix/install-nix-action@v17 + - uses: cachix/install-nix-action@v18 - run: nix-env -f default.nix -iA linkcheck - run: postgrest-docs-linkcheck From 8a98b4ed2671a89f444cafb37d0d780266a90777 Mon Sep 17 00:00:00 2001 From: Andrea Bernicchia <51401007+abernicchia-heroku@users.noreply.github.com> Date: Thu, 27 Oct 2022 17:58:17 +0200 Subject: [PATCH 527/711] Update heroku installation docs * Heroku installation docs aligned with https://github.com/PostgREST/postgrest-heroku/pull/40 * Update install.rst --- docs/install.rst | 123 ++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 115 insertions(+), 8 deletions(-) diff --git a/docs/install.rst b/docs/install.rst index ec3c97721b..39de4f0630 100644 --- a/docs/install.rst +++ b/docs/install.rst @@ -260,13 +260,120 @@ You can build PostgREST from source with `Stack `_: -1. Create a new app on Heroku -2. In Settings add the following buildpack :code:`https://github.com/PostgREST/postgrest-heroku` -3. Add the require Config Vars in Heroku -4. Modify your ``postgrest.conf`` file as required to match your Config Vars in Heroku -5. Create your :code:`Procfile` and add :code:`./env-to-config ./postgrest postgrest.conf` -6. Push your changes to GitHub -7. Set Heroku to automatically deploy from Main and then manually deploy the branch for the first build + .. code-block:: bash + + # If you have multiple Heroku accounts, use flag '--interactive' to switch between them + heroku login --interactive + + +2. Create a new Heroku app using the PostgREST buildpack: + + .. code-block:: bash + + mkdir ${YOUR_APP_NAME} + cd ${YOUR_APP_NAME} + git init . + + heroku apps:create ${YOUR_APP_NAME} --buildpack https://github.com/PostgREST/postgrest-heroku.git + heroku git:remote -a ${YOUR_APP_NAME} + +3. Create a new Heroku PostgreSQL add-on attached to the app and keep notes of the assigned add-on name (e.g. :code:`postgresql-curly-58902`) referred later as ${HEROKU_PG_DB_NAME} + + .. code-block:: bash + + heroku addons:create heroku-postgresql:standard-0 -a ${YOUR_APP_NAME} + # wait until the add-on is available + heroku pg:wait -a ${YOUR_APP_NAME} + +4. Create the necessary user roles according to the + `PostgREST documentation `_: + + .. code-block:: bash + + heroku pg:credentials:create --name api_user -a ${YOUR_APP_NAME} + # use the following command to ensure the new credential state is active before attaching it + heroku pg:credentials -a ${YOUR_APP_NAME} + + heroku addons:attach ${HEROKU_PG_DB_NAME} --credential api_user -a ${YOUR_APP_NAME} + +5. Connect to the PostgreSQL database and create some sample data: + + .. code-block:: bash + + heroku psql -a ${YOUR_APP_NAME} + + .. code-block:: postgres + + # from the psql command prompt execute the following commands: + create schema api; + + create table api.todos ( + id serial primary key, + done boolean not null default false, + task text not null, + due timestamptz + ); + + insert into api.todos (task) values + ('finish tutorial 0'), ('pat self on back'); + + grant usage on schema api to api_user; + grant select on api.todos to api_user; + +6. Create the :code:`Procfile`: + + .. code-block:: bash + + web: PGRST_SERVER_HOST=0.0.0.0 PGRST_SERVER_PORT=${PORT} PGRST_DB_URI=${PGRST_DB_URI:-${DATABASE_URL}} ./postgrest-${POSTGREST_VER} + .. + + Set the following environment variables on Heroku: + + .. code-block:: bash + + heroku config:set POSTGREST_VER=10.0.0 + heroku config:set PGRST_DB_SCHEMA=api + heroku config:set PGRST_DB_ANON_ROLE=api_user + .. + + PGRST_DB_URI can be set if an external database is used or if it's different from the default Heroku DATABASE_URL. This latter is used if nothing is provided. + POSTGREST_VER is mandatory to select and build the required PostgREST release. + + See https://postgrest.org/en/stable/configuration.html#environment-variables for the full list of environment variables. + +7. Build and deploy your app: + + .. code-block:: bash + + git add Procfile + git commit -m "PostgREST on Heroku" + git push heroku master + .. + + Your Heroku app should be live at :code:`${YOUR_APP_NAME}.herokuapp.com` + +8. Test your app + + From a terminal display the application logs: + + .. code-block:: bash + + heroku logs -t + .. + + From a different terminal retrieve with curl the records previously created: + + .. code-block:: bash + + curl https://${YOUR_APP_NAME}.herokuapp.com/todos + .. + + and test that any attempt to modify the table via a read-only user is not allowed: + + .. code-block:: bash + curl https://${YOUR_APP_NAME}.herokuapp.com/todos -X POST \ + -H "Content-Type: application/json" \ + -d '{"task": "do bad thing"}' From 50eb42bf462c4552d60144b7da948adbbae2b349 Mon Sep 17 00:00:00 2001 From: Andrea Bernicchia <51401007+abernicchia-heroku@users.noreply.github.com> Date: Wed, 2 Nov 2022 18:23:35 +0100 Subject: [PATCH 528/711] LICENSE file added (#579) --- LICENSE | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 LICENSE diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000000..4d0857d540 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +Copyright (c) 2014 Joe Nelson +Copyright (c) 2019 Steve Chavez + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. From a6af266ab7810cc45f32d74cbf97f9ab90e37ef6 Mon Sep 17 00:00:00 2001 From: Laurence Isla Date: Mon, 14 Nov 2022 19:11:43 -0500 Subject: [PATCH 529/711] Fix step 3 of the tutorial 0 --- docs/tutorials/tut0.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/tutorials/tut0.rst b/docs/tutorials/tut0.rst index 5a2ed16047..7b2ce647c3 100644 --- a/docs/tutorials/tut0.rst +++ b/docs/tutorials/tut0.rst @@ -52,9 +52,9 @@ The result will be a file named simply :code:`postgrest` (or :code:`postgrest.ex .. code-block:: bash - ./postgrest + ./postgrest -h -If everything is working correctly it will print out its version and information about configuration. You can continue to run this binary from where you downloaded it, or copy it to a system directory like :code:`/usr/local/bin` on Linux so that you will be able to run it from any directory. +If everything is working correctly it will print out its version and the available options. You can continue to run this binary from where you downloaded it, or copy it to a system directory like :code:`/usr/local/bin` on Linux so that you will be able to run it from any directory. .. note:: From 485e4db4d79cb2431cafca6d7f68891cf0c96ea3 Mon Sep 17 00:00:00 2001 From: Laurence Isla Date: Mon, 14 Nov 2022 19:16:42 -0500 Subject: [PATCH 530/711] Fix auth page due to anonymous requests not allowed when db-anon-role is not set --- docs/auth.rst | 50 ++++++++++++++++++++++++++++---------------------- 1 file changed, 28 insertions(+), 22 deletions(-) diff --git a/docs/auth.rst b/docs/auth.rst index 94e449db58..5a3d129d37 100644 --- a/docs/auth.rst +++ b/docs/auth.rst @@ -12,7 +12,7 @@ There are three types of roles used by PostgREST, the **authenticator**, **anony .. image:: _static/security-roles.png -The authenticator should be created :code:`NOINHERIT` and configured in the database to have very limited access. It is a chameleon whose job is to "become" other users to service authenticated HTTP requests. The picture below shows how the server handles authentication. If auth succeeds, it switches into the user role specified by the request, otherwise it switches into the anonymous role. +The authenticator should be created :code:`NOINHERIT` and configured in the database to have very limited access. It is a chameleon whose job is to "become" other users to service authenticated HTTP requests. The picture below shows how the server handles authentication. If auth succeeds, it switches into the user role specified by the request, otherwise it switches into the anonymous role (if it's set in :ref:`db-anon-role`). .. image:: _static/security-anon-choice.png @@ -399,6 +399,27 @@ Public User Interface In the previous section we created an internal table to store user information. Here we create a login function which takes an email address and password and returns JWT if the credentials match a user in the internal table. +Permissions +~~~~~~~~~~~ + +Your database roles need access to the schema, tables, views and functions in order to service HTTP requests. +Recall from the `Overview of Role System`_ that PostgREST uses special roles to process requests, namely the authenticator and +anonymous roles. Below is an example of permissions that allow anonymous users to create accounts and attempt to log in. + +.. code-block:: postgres + + -- the names "anon" and "authenticator" are configurable and not + -- sacred, we simply choose them for clarity + create role anon noinherit; + create role authenticator noinherit; + grant anon to authenticator; + +Then, add ``db-anon-role`` to the configuration file to allow anonymous requests. + +.. code:: ini + + db-anon-role = "anon" + Logins ~~~~~~ @@ -436,6 +457,12 @@ As described in `JWT from SQL`_, we'll create a JWT inside our login function. N end; $$ language plpgsql security definer; + grant execute on function login(text,text) to anon; + +Since the above :code:`login` function is defined as `security definer `_, +the anonymous user :code:`anon` doesn't need permission to read the :code:`basic_auth.users` table. It doesn't even need permission to access the :code:`basic_auth` schema. +:code:`grant execute on function` is included for clarity but it might not be needed, see :ref:`func_privs` for more details. + An API request to call this function would look like: .. tabs:: @@ -459,24 +486,3 @@ The response would look like the snippet below. Try decoding the token at `jwt.i { "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJlbWFpbCI6ImZvb0BiYXIuY29tIiwicGFzcyI6ImZvb2JhciJ9.37066TTRlh-1hXhnA9oO9Pj6lgL6zFuJU0iCHhuCFno" } - -Permissions -~~~~~~~~~~~ - -Your database roles need access to the schema, tables, views and functions in order to service HTTP requests. -Recall from the `Overview of Role System`_ that PostgREST uses special roles to process requests, namely the authenticator and -anonymous roles. Below is an example of permissions that allow anonymous users to create accounts and attempt to log in. - -.. code-block:: postgres - - -- the names "anon" and "authenticator" are configurable and not - -- sacred, we simply choose them for clarity - create role anon noinherit; - create role authenticator noinherit; - grant anon to authenticator; - - grant execute on function login(text,text) to anon; - -Since the above :code:`login` function is defined as `security definer `_, -the anonymous user :code:`anon` doesn't need permission to read the :code:`basic_auth.users` table. It doesn't even need permission to access the :code:`basic_auth` schema. -:code:`grant execute on function` is included for clarity but it might not be needed, see :ref:`func_privs` for more details. From f3831427e573d770d08efcecd90307f9dad4bbc6 Mon Sep 17 00:00:00 2001 From: Laurence Isla Date: Mon, 14 Nov 2022 19:33:25 -0500 Subject: [PATCH 531/711] Fix broken links and dictcheck --- docs/api.rst | 2 +- docs/ecosystem.rst | 2 +- postgrest.dict | 3 --- 3 files changed, 2 insertions(+), 5 deletions(-) diff --git a/docs/api.rst b/docs/api.rst index 8638445b7c..c40b747dd1 100644 --- a/docs/api.rst +++ b/docs/api.rst @@ -155,7 +155,7 @@ Pattern Matching The pattern-matching operators (:code:`like`, :code:`ilike`, :code:`match`, :code:`imatch`) exist to support filtering data using patterns instead of concrete strings, as described in the `PostgreSQL docs `__. -To ensure best performance on larger data sets, an `appropriate index `__ should be used and even then, it depends on the pattern value and actual data statistics whether an existing index will be used by the query planner or not. +To ensure best performance on larger data sets, an `appropriate index `__ should be used and even then, it depends on the pattern value and actual data statistics whether an existing index will be used by the query planner or not. .. _fts: diff --git a/docs/ecosystem.rst b/docs/ecosystem.rst index 3d177848c7..69f9eb350a 100644 --- a/docs/ecosystem.rst +++ b/docs/ecosystem.rst @@ -38,7 +38,7 @@ Example Apps * `ext-postgrest-crud `_ - browser-based spreadsheet * `general `_ - example auth back-end * `goodfilm `_ - example film API -* `guild-operators `_ - example queries and functions that the Cardano Community uses for their Guild Operators' Repository +* `guild-operators `_ - example queries and functions that the Cardano Community uses for their Guild Operators' Repository * `handsontable-postgrest `_ - an excel-like database table editor * `heritage-near-me `_ - Elm and PostgREST with PostGIS * `ng-admin-postgrest `_ - automatic database admin panel diff --git a/postgrest.dict b/postgrest.dict index 39588be676..96eade670d 100644 --- a/postgrest.dict +++ b/postgrest.dict @@ -14,7 +14,6 @@ Beles booleans Bouscal buildpack -bugfixes Bytea Cardano cd @@ -204,5 +203,3 @@ Websockets webuser wfts ZeroMQ -Customizable -customizable From f6e3b77643a22c6f7611cd25435cf504d516e1f7 Mon Sep 17 00:00:00 2001 From: fjf2002 Date: Wed, 16 Nov 2022 23:10:18 +0100 Subject: [PATCH 532/711] =?UTF-8?q?how-to:=20SQL=20User=20Management=20usi?= =?UTF-8?q?ng=20postgres=E2=80=99=20users=20and=20passwords=20(#581)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/auth.rst | 8 + ...ent-using-postgres-users-and-passwords.rst | 342 ++++++++++++++++++ docs/index.rst | 2 + postgrest.dict | 4 + 4 files changed, 356 insertions(+) create mode 100644 docs/how-tos/sql-user-management-using-postgres-users-and-passwords.rst diff --git a/docs/auth.rst b/docs/auth.rst index 5a3d129d37..fb9db9999c 100644 --- a/docs/auth.rst +++ b/docs/auth.rst @@ -305,6 +305,8 @@ Schema Isolation You can isolate your api schema from internal implementation details, as explained in :ref:`schema_isolation`. For an example of wrapping a private table with a public view see the :ref:`public_ui` section below. +.. _sql_user_management: + SQL User Management =================== @@ -486,3 +488,9 @@ The response would look like the snippet below. Try decoding the token at `jwt.i { "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJlbWFpbCI6ImZvb0BiYXIuY29tIiwicGFzcyI6ImZvb2JhciJ9.37066TTRlh-1hXhnA9oO9Pj6lgL6zFuJU0iCHhuCFno" } + + +Alternatives +~~~~~~~~~~~~ + +See the how-to :ref:`sql-user-management-using-postgres-users-and-passwords` for a similar way that completely avoids the table :code:`basic_auth.users`. diff --git a/docs/how-tos/sql-user-management-using-postgres-users-and-passwords.rst b/docs/how-tos/sql-user-management-using-postgres-users-and-passwords.rst new file mode 100644 index 0000000000..ea53a5d32d --- /dev/null +++ b/docs/how-tos/sql-user-management-using-postgres-users-and-passwords.rst @@ -0,0 +1,342 @@ +.. _sql-user-management-using-postgres-users-and-passwords: + +SQL User Management using postgres' users and passwords +======================================================= + +:author: `fjf2002 `_ + + +This is an alternative to :ref:`sql_user_management`, solely using the built-in table `pg_catalog.pg_authid `_ for user management. This means + +- no dedicated user table (aside from :code:`pg_authid`) is required + +- postgres' users and passwords (i. e. the stuff in :code:`pg_authid`) are also used at the postgrest level. + +.. note:: + Only postgres users with SCRAM-SHA-256 password hashes (the default since PostgreSQL v14) are supported. + +.. warning:: + + This is experimental. We can't give you any guarantees, especially concerning security. Use at your own risk. + + + +Working with pg_authid and SCRAM-SHA-256 hashes +----------------------------------------------- + +As in :ref:`sql_user_management`, we create a :code:`basic_auth` schema: + +.. code-block:: postgres + + -- We put things inside the basic_auth schema to hide + -- them from public view. Certain public procs/views will + -- refer to helpers and tables inside. + CREATE SCHEMA IF NOT EXISTS basic_auth; + + +As in :ref:`sql_user_management`, we create the :code:`pgcrypto` and :code:`pgjwt` extensions. Here we prefer to put the extensions in its own schemas: + +.. code-block:: postgres + + CREATE SCHEMA ext_pgcrypto; + ALTER SCHEMA ext_pgcrypto OWNER TO postgres; + CREATE EXTENSION IF NOT EXISTS pgcrypto WITH SCHEMA ext_pgcrypto; + + +Concerning the `pgjwt extension `_, please cf. to :ref:`client_auth`. + +.. code-block:: postgres + + CREATE SCHEMA ext_pgjwt; + ALTER SCHEMA ext_pgjwt OWNER TO postgres; + CREATE EXTENSION IF NOT EXISTS pgjwt WITH SCHEMA ext_pgjwt; + + +In order to be able to work with postgres' SCRAM-SHA-256 password hashes, we also need the PBKDF2 key derivation function. Luckily there is `a PL/pgSQL implementation on stackoverflow `_: + +.. code-block:: plpgsql + + CREATE FUNCTION basic_auth.pbkdf2(salt bytea, pw text, count integer, desired_length integer, algorithm text) RETURNS bytea + LANGUAGE plpgsql IMMUTABLE + AS $$ + DECLARE + hash_length integer; + block_count integer; + output bytea; + the_last bytea; + xorsum bytea; + i_as_int32 bytea; + i integer; + j integer; + k integer; + BEGIN + algorithm := lower(algorithm); + CASE algorithm + WHEN 'md5' then + hash_length := 16; + WHEN 'sha1' then + hash_length = 20; + WHEN 'sha256' then + hash_length = 32; + WHEN 'sha512' then + hash_length = 64; + ELSE + RAISE EXCEPTION 'Unknown algorithm "%"', algorithm; + END CASE; + -- + block_count := ceil(desired_length::real / hash_length::real); + -- + FOR i in 1 .. block_count LOOP + i_as_int32 := E'\\000\\000\\000'::bytea || chr(i)::bytea; + i_as_int32 := substring(i_as_int32, length(i_as_int32) - 3); + -- + the_last := salt::bytea || i_as_int32; + -- + xorsum := ext_pgcrypto.HMAC(the_last, pw::bytea, algorithm); + the_last := xorsum; + -- + FOR j IN 2 .. count LOOP + the_last := ext_pgcrypto.HMAC(the_last, pw::bytea, algorithm); + + -- + -- xor the two + -- + FOR k IN 1 .. length(xorsum) LOOP + xorsum := set_byte(xorsum, k - 1, get_byte(xorsum, k - 1) # get_byte(the_last, k - 1)); + END LOOP; + END LOOP; + -- + IF output IS NULL THEN + output := xorsum; + ELSE + output := output || xorsum; + END IF; + END LOOP; + -- + RETURN substring(output FROM 1 FOR desired_length); + END $$; + + ALTER FUNCTION basic_auth.pbkdf2(salt bytea, pw text, count integer, desired_length integer, algorithm text) OWNER TO postgres; + + +Analogous to :ref:`sql_user_management` creates the function :code:`basic_auth.user_role`, we create a helper function to check the user's password, here with another name and signature (since we want the username, not an email address). +But contrary to :ref:`sql_user_management`, this function does not use a dedicated :code:`users` table with passwords, but instead utilizes the built-in table `pg_catalog.pg_authid `_: + +.. code-block:: plpgsql + + CREATE FUNCTION basic_auth.check_user_pass(username text, password text) RETURNS name + LANGUAGE sql + AS + $$ + SELECT rolname AS username + FROM pg_authid + -- regexp-split scram hash: + CROSS JOIN LATERAL regexp_match(rolpassword, '^SCRAM-SHA-256\$(.*):(.*)\$(.*):(.*)$') AS rm + -- identify regexp groups with sane names: + CROSS JOIN LATERAL (SELECT rm[1]::integer AS iteration_count, decode(rm[2], 'base64') as salt, decode(rm[3], 'base64') AS stored_key, decode(rm[4], 'base64') AS server_key, 32 AS digest_length) AS stored_password_part + -- calculate pbkdf2-digest: + CROSS JOIN LATERAL (SELECT basic_auth.pbkdf2(salt, check_user_pass.password, iteration_count, digest_length, 'sha256')) AS digest_key(digest_key) + -- based on that, calculate hashed passwort part: + CROSS JOIN LATERAL (SELECT ext_pgcrypto.digest(ext_pgcrypto.hmac('Client Key', digest_key, 'sha256'), 'sha256') AS stored_key, ext_pgcrypto.hmac('Server Key', digest_key, 'sha256') AS server_key) AS check_password_part + WHERE rolpassword IS NOT NULL + AND pg_authid.rolname = check_user_pass.username + -- verify password: + AND check_password_part.stored_key = stored_password_part.stored_key + AND check_password_part.server_key = stored_password_part.server_key; + $$; + + ALTER FUNCTION basic_auth.check_user_pass(username text, password text) OWNER TO postgres; + + + +Public User Interface +--------------------- + +Analogous to :ref:`sql_user_management`, we create a login function which takes a username and password and returns JWT if the credentials match a user in the internal table. +Here we use the username instead of the email address to identify a user. + + +Logins +~~~~~~ + +As described in :ref:`client_auth`, we'll create a JWT token inside our login function. Note that you'll need to adjust the secret key which is hard-coded in this example to a secure (at least thirty-two character) secret of your choosing. + + +.. code-block:: plpgsql + + CREATE TYPE basic_auth.jwt_token AS ( + token text + ); + + -- if you are not using psql, you need to replace :dbname with the current database's name. + ALTER DATABASE :DBNAME SET "app.jwt_secret" to 'reallyreallyreallyreallyverysafe'; + + + CREATE FUNCTION public.login(username text, password text) RETURNS basic_auth.jwt_token + LANGUAGE plpgsql security definer + AS $$ + DECLARE + _role name; + result basic_auth.jwt_token; + BEGIN + -- check email and password + SELECT basic_auth.check_user_pass(username, password) INTO _role; + IF _role IS NULL THEN + RAISE invalid_password USING message = 'invalid user or password'; + END IF; + -- + SELECT ext_pgjwt.sign( + row_to_json(r), current_setting('app.jwt_secret') + ) AS token + FROM ( + SELECT login.username as role, + extract(epoch FROM now())::integer + 60*60 AS exp + ) r + INTO result; + RETURN result; + END; + $$; + + ALTER FUNCTION public.login(username text, password text) OWNER TO postgres; + + + +Permissions +~~~~~~~~~~~ + +Analogous to :ref:`sql_user_management`: +Your database roles need access to the schema, tables, views and functions in order to service HTTP requests. +Recall from the :ref:`roles` that PostgREST uses special roles to process requests, namely the authenticator and +anonymous roles. Below is an example of permissions that allow anonymous users to attempt to log in. + + +.. code-block:: postgres + + -- the names "anon" and "authenticator" are configurable and not + -- sacred, we simply choose them for clarity + CREATE ROLE anon NOINHERIT; + CREATE role authenticator NOINHERIT LOGIN PASSWORD 'secret'; + GRANT anon TO authenticator; + + GRANT EXECUTE ON FUNCTION public.login(username text, password text) TO anon; + + +Since the above :code:`login` function is defined as `security definer `_, +the anonymous user :code:`anon` doesn't need permission to access the table :code:`pg_catalog.pg_authid` . +:code:`grant execute on function` is included for clarity but it might not be needed, see :ref:`func_privs` for more details. + +Choose a secure password for role :code:`authenticator`. +Do not forget to configure PostgREST to use the :code:`authenticator` user to connect, and to use the :code:`anon` user as anonymous user. + + +Testing +------- + +Let us create a sample user: + +.. code-block:: postgres + + CREATE ROLE foo PASSWORD 'bar'; + + +Test at the SQL level +~~~~~~~~~~~~~~~~~~~~~ + +Execute: + +.. code-block:: postgres + + SELECT * FROM public.login('foo', 'bar'); + + +This should return a single scalar field like: + +:: + + token + ----------------------------------------------------------------------------------------------------------------------------- + eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJyb2xlIjoiZm9vIiwiZXhwIjoxNjY4MTg4ODQ3fQ.idBBHuDiQuN_S7JJ2v3pBOr9QypCliYQtCgwYOzAqEk + (1 row) + + +Test at the REST level +~~~~~~~~~~~~~~~~~~~~~~ +An API request to call this function would look like: + +.. tabs:: + + .. code-tab:: http + + POST /rpc/login HTTP/1.1 + + { "username": "foo", "password": "bar" } + + .. code-tab:: bash Curl + + curl "http://localhost:3000/rpc/login" \ + -X POST -H "Content-Type: application/json" \ + -d '{ "username": "foo", "password": "bar" }' + +The response would look like the snippet below. Try decoding the token at `jwt.io `_. (It was encoded with a secret of :code:`reallyreallyreallyreallyverysafe` as specified in the SQL code above. You'll want to change this secret in your app!) + +.. code:: json + + { + "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJyb2xlIjoic2VwcCIsImV4cCI6MTY2ODE4ODQzN30.WSytcouNMQe44ZzOQit2AQsqTKFD5mIvT3z2uHwdoYY" + } + + + +A more sophisticated test at the REST level +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +Let us configure the :code:`foo` user correctly and add a table for him/her: + +.. code-block:: postgres + + CREATE TABLE public.foobar(foo int, bar text, baz float); + ALTER TABLE public.foobar owner TO postgres; + + +Now try to get the table's contents with: + +.. tabs:: + + .. code-tab:: http + + GET /foobar HTTP/1.1 + + .. code-tab:: bash Curl + + curl "http://localhost:3000/foobar" + + +This should fail --- of course, we haven't specified the user, thus PostgREST falls back to the :code:`anon` user and denies access. +Add an :code:`Authorization` header. Please use the token value from the login function call above instead of the one provided below. + +.. tabs:: + + .. code-tab:: http + + GET /foobar HTTP/1.1 + Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJyb2xlIjoiZm9vIiwiZXhwIjoxNjY4MTkyMjAyfQ.zzdHCBjfkqDQLQ8D7CHO3cIALF6KBCsfPTWgwhCiHCY + + .. code-tab:: bash Curl + + curl "http://localhost:3000/foobar" \ + -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJyb2xlIjoiZm9vIiwiZXhwIjoxNjY4MTkyMjAyfQ.zzdHCBjfkqDQLQ8D7CHO3cIALF6KBCsfPTWgwhCiHCY" + + +This will fail again --- we get :code:`Permission denied to set role`. We forgot to allow the authenticator role to switch into this user by executing: + +.. code-block:: postgres + + GRANT foo TO authenticator; + + +Re-execute the last REST request. We fail again --- we also forgot to grant permissions for :code:`foo` on the table. Execute: + +.. code-block:: postgres + + GRANT SELECT ON TABLE public.foobar TO foo; + +Now the REST request should succeed. An empty JSON array :code:`[]` is returned. diff --git a/docs/index.rst b/docs/index.rst index dcb1089fd9..d5311d4acb 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -207,10 +207,12 @@ These are recipes that'll help you address specific use-cases. how-tos/working-with-postgresql-data-types how-tos/providing-images-for-img how-tos/create-soap-endpoint + how-tos/sql-user-management-using-postgres-users-and-passwords - :doc:`how-tos/providing-images-for-img` - :doc:`how-tos/working-with-postgresql-data-types` - :doc:`how-tos/create-soap-endpoint` +- :doc:`how-tos/sql-user-management-using-postgres-users-and-passwords` Ecosystem --------- diff --git a/postgrest.dict b/postgrest.dict index 96eade670d..671c299117 100644 --- a/postgrest.dict +++ b/postgrest.dict @@ -104,6 +104,7 @@ ORM ov passphrase Pawel +PBKDF Pelletier Petr PgBouncer @@ -113,6 +114,7 @@ pgrst pgrstX PGRSTX pgSQL +authid phfts phraseto plainto @@ -123,6 +125,8 @@ PostGIS PostgreSQL PostgreSQL's PostgREST +postgres +postgres's postgrest PostgREST's pre From 8be87ed4ac1a0ebd672dab66616cfc635cbdd4fc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Franz-Josef=20F=C3=A4rber?= Date: Tue, 3 Jan 2023 16:03:06 +0100 Subject: [PATCH 533/711] Minor improvements to sql-user-management-using-postgres-users-and-passwords.rst --- ...ement-using-postgres-users-and-passwords.rst | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/docs/how-tos/sql-user-management-using-postgres-users-and-passwords.rst b/docs/how-tos/sql-user-management-using-postgres-users-and-passwords.rst index ea53a5d32d..4dec8ed1fa 100644 --- a/docs/how-tos/sql-user-management-using-postgres-users-and-passwords.rst +++ b/docs/how-tos/sql-user-management-using-postgres-users-and-passwords.rst @@ -6,14 +6,14 @@ SQL User Management using postgres' users and passwords :author: `fjf2002 `_ -This is an alternative to :ref:`sql_user_management`, solely using the built-in table `pg_catalog.pg_authid `_ for user management. This means +This is an alternative to chapter :ref:`sql_user_management`, solely using the PostgreSQL built-in table `pg_catalog.pg_authid `_ for user management. This means - no dedicated user table (aside from :code:`pg_authid`) is required -- postgres' users and passwords (i. e. the stuff in :code:`pg_authid`) are also used at the postgrest level. +- PostgreSQL's users and passwords (i. e. the stuff in :code:`pg_authid`) are also used at the PostgREST level. .. note:: - Only postgres users with SCRAM-SHA-256 password hashes (the default since PostgreSQL v14) are supported. + Only PostgreSQL users with SCRAM-SHA-256 password hashes (the default since PostgreSQL v14) are supported. .. warning:: @@ -98,9 +98,7 @@ In order to be able to work with postgres' SCRAM-SHA-256 password hashes, we als FOR j IN 2 .. count LOOP the_last := ext_pgcrypto.HMAC(the_last, pw::bytea, algorithm); - -- -- xor the two - -- FOR k IN 1 .. length(xorsum) LOOP xorsum := set_byte(xorsum, k - 1, get_byte(xorsum, k - 1) # get_byte(the_last, k - 1)); END LOOP; @@ -140,7 +138,7 @@ But contrary to :ref:`sql_user_management`, this function does not use a dedicat CROSS JOIN LATERAL (SELECT ext_pgcrypto.digest(ext_pgcrypto.hmac('Client Key', digest_key, 'sha256'), 'sha256') AS stored_key, ext_pgcrypto.hmac('Server Key', digest_key, 'sha256') AS server_key) AS check_password_part WHERE rolpassword IS NOT NULL AND pg_authid.rolname = check_user_pass.username - -- verify password: + -- verify password: AND check_password_part.stored_key = stored_password_part.stored_key AND check_password_part.server_key = stored_password_part.server_key; $$; @@ -152,7 +150,7 @@ But contrary to :ref:`sql_user_management`, this function does not use a dedicat Public User Interface --------------------- -Analogous to :ref:`sql_user_management`, we create a login function which takes a username and password and returns JWT if the credentials match a user in the internal table. +Analogous to :ref:`sql_user_management`, we create a login function which takes a username and password and returns a JWT if the credentials match a user in the internal table. Here we use the username instead of the email address to identify a user. @@ -168,7 +166,7 @@ As described in :ref:`client_auth`, we'll create a JWT token inside our login fu token text ); - -- if you are not using psql, you need to replace :dbname with the current database's name. + -- if you are not using psql, you need to replace :DBNAME with the current database's name. ALTER DATABASE :DBNAME SET "app.jwt_secret" to 'reallyreallyreallyreallyverysafe'; @@ -289,7 +287,8 @@ The response would look like the snippet below. Try decoding the token at `jwt.i A more sophisticated test at the REST level ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -Let us configure the :code:`foo` user correctly and add a table for him/her: +Let's add a table, intended for the :code:`foo` user: + .. code-block:: postgres From 082b4183341010f526bb7c0d32ebc331f628191e Mon Sep 17 00:00:00 2001 From: Steve Chavez Date: Sat, 28 Jan 2023 20:20:48 -0500 Subject: [PATCH 534/711] Add db-plan-enabled recommendation (#588) * fix broken links --- docs/auth.rst | 4 ++-- docs/configuration.rst | 26 +++++++++++++++++++++++++- docs/ecosystem.rst | 1 - 3 files changed, 27 insertions(+), 4 deletions(-) diff --git a/docs/auth.rst b/docs/auth.rst index fb9db9999c..eeb55c0b05 100644 --- a/docs/auth.rst +++ b/docs/auth.rst @@ -98,7 +98,7 @@ For PostgreSQL server version >= 14 .. code:: sql current_setting('request.jwt.claims', true)::json->>'email'; - + For PostgreSQL server version < 14 @@ -292,7 +292,7 @@ JWT security There are at least three types of common critiques against using JWT: 1) against the standard itself, 2) against using libraries with known security vulnerabilities, and 3) against using JWT for web sessions. We'll briefly explain each critique, how PostgREST deals with it, and give recommendations for appropriate user action. -The critique against the `JWT standard `_ is voiced in detail `elsewhere on the web `_. The most relevant part for PostgREST is the so-called :code:`alg=none` issue. Some servers implementing JWT allow clients to choose the algorithm used to sign the JWT. In this case, an attacker could set the algorithm to :code:`none`, remove the need for any signature at all and gain unauthorized access. The current implementation of PostgREST, however, does not allow clients to set the signature algorithm in the HTTP request, making this attack irrelevant. The critique against the standard is that it requires the implementation of the :code:`alg=none` at all. +The critique against the `JWT standard `_ is voiced in detail `elsewhere on the web `_. The most relevant part for PostgREST is the so-called :code:`alg=none` issue. Some servers implementing JWT allow clients to choose the algorithm used to sign the JWT. In this case, an attacker could set the algorithm to :code:`none`, remove the need for any signature at all and gain unauthorized access. The current implementation of PostgREST, however, does not allow clients to set the signature algorithm in the HTTP request, making this attack irrelevant. The critique against the standard is that it requires the implementation of the :code:`alg=none` at all. Critiques against JWT libraries are only relevant to PostgREST via the library it uses. As mentioned above, not allowing clients to choose the signature algorithm in HTTP requests removes the greatest risk. Another more subtle attack is possible where servers use asymmetric algorithms like RSA for signatures. Once again this is not relevant to PostgREST since it is not supported. Curious readers can find more information in `this article `_. Recommendations about high quality libraries for usage in API clients can be found on `jwt.io `_. diff --git a/docs/configuration.rst b/docs/configuration.rst index 1e45e10651..988eae8c9a 100644 --- a/docs/configuration.rst +++ b/docs/configuration.rst @@ -160,7 +160,7 @@ db-pool-timeout Int 3600 db-pre-request String Y db-prepared-statements Boolean True Y db-schemas String public Y -db-tx-end String commit +db-tx-end String commit db-uri String postgresql:// db-use-legacy-gucs Boolean True Y jwt-aud String Y @@ -296,6 +296,30 @@ db-plan-enabled When this is set to :code:`true`, the execution plan of a request can be retrieved by using the :code:`Accept: application/vnd.pgrst.plan` header. See :ref:`explain_plan`. + It's recommended to use this in testing environments only since it reveals internal database details. + However, if you choose to use it in production you can add a :ref:`db-pre-request` to filter the requests that can use this feature. + + For example, to only allow requests from an IP address to get the execution plans: + + .. code-block:: postgresql + + -- Assuming a proxy(Nginx, Cloudflare, etc) passes an "X-Forwarded-For" header(https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Forwarded-For) + create or replace function filter_plan_requests() + returns void as $$ + declare + headers json := current_setting('request.headers', true)::json; + client_ip text := coalesce(headers->>'x-forwarded-for', ''); + accept text := coalesce(headers->>'accept', ''); + begin + if accept like 'application/vnd.pgrst.plan%' and client_ip != '144.96.121.73' then + raise insufficient_privilege using + message = 'Not allowed to use application/vnd.pgrst.plan'; + end if; + end; $$ language plpgsql; + + -- set this function on your postgrest.conf + -- db-pre-request = filter_plan_requests + .. _db-pool: db-pool diff --git a/docs/ecosystem.rst b/docs/ecosystem.rst index 69f9eb350a..2fe80a94e7 100644 --- a/docs/ecosystem.rst +++ b/docs/ecosystem.rst @@ -89,7 +89,6 @@ Extensions * `aiodata `_ - Python, event-based proxy and caching client. * `pg-safeupdate `_ - prevent full-table updates or deletes * `postgrest-auth (criles25) `_ - email based auth/signup -* `postgrest-auth (svmotn) `_ - OAuth2-inspired external auth server * `postgrest-node `_ - Run a PostgREST server in Node.js via npm module * `postgrest-oauth `_ - OAuth2 WAI middleware * `postgrest-oauth/api `_ - OAuth2 server From 378a225a9b364f60175744f003b8c0a9a04c8ffb Mon Sep 17 00:00:00 2001 From: Laurence Isla Date: Thu, 9 Feb 2023 14:56:38 -0500 Subject: [PATCH 535/711] Add db-pool-acquisition-timeout configuration parameter --- docs/configuration.rst | 81 ++++++++++++++++++++-------------------- docs/releases/v6.0.2.rst | 2 +- 2 files changed, 41 insertions(+), 42 deletions(-) diff --git a/docs/configuration.rst b/docs/configuration.rst index 988eae8c9a..b479e5a56a 100644 --- a/docs/configuration.rst +++ b/docs/configuration.rst @@ -108,7 +108,7 @@ It's not possible to change :ref:`env_variables_config` for a running process an * :ref:`admin-server-port` * :ref:`db-uri` * :ref:`db-pool` - * :ref:`db-pool-timeout` + * :ref:`db-pool-acquisition-timeout` * :ref:`server-host` * :ref:`server-port` * :ref:`server-unix-socket` @@ -143,40 +143,40 @@ The ``"pgrst"`` notification channel is enabled by default. For configuring the List of parameters ================== -======================== ======= ================= ========== -Name Type Default Reloadable -======================== ======= ================= ========== -admin-server-port Int -app.settings.* String Y -db-anon-role String Y -db-channel String pgrst Y -db-channel-enabled Boolean True Y -db-config Boolean True Y -db-extra-search-path String public Y -db-max-rows Int ∞ Y -db-plan-enabled Boolean False Y -db-pool Int 10 -db-pool-timeout Int 3600 -db-pre-request String Y -db-prepared-statements Boolean True Y -db-schemas String public Y -db-tx-end String commit -db-uri String postgresql:// -db-use-legacy-gucs Boolean True Y -jwt-aud String Y -jwt-role-claim-key String .role Y -jwt-secret String Y -jwt-secret-is-base64 Boolean False Y -log-level String error Y -openapi-mode String follow-privileges Y -openapi-security-active Boolean False Y -openapi-server-proxy-uri String Y -raw-media-types String Y -server-host String !4 -server-port Int 3000 -server-unix-socket String -server-unix-socket-mode String 660 -======================== ======= ================= ========== +=========================== ======= ================= ========== +Name Type Default Reloadable +=========================== ======= ================= ========== +admin-server-port Int +app.settings.* String Y +db-anon-role String Y +db-channel String pgrst Y +db-channel-enabled Boolean True Y +db-config Boolean True Y +db-extra-search-path String public Y +db-max-rows Int ∞ Y +db-plan-enabled Boolean False Y +db-pool Int 10 +db-pool-acquisition-timeout Int ∞ +db-pre-request String Y +db-prepared-statements Boolean True Y +db-schemas String public Y +db-tx-end String commit +db-uri String postgresql:// +db-use-legacy-gucs Boolean True Y +jwt-aud String Y +jwt-role-claim-key String .role Y +jwt-secret String Y +jwt-secret-is-base64 Boolean False Y +log-level String error Y +openapi-mode String follow-privileges Y +openapi-security-active Boolean False Y +openapi-server-proxy-uri String Y +raw-media-types String Y +server-host String !4 +server-port Int 3000 +server-unix-socket String +server-unix-socket-mode String 660 +=========================== ======= ================= ========== .. _admin-server-port: @@ -332,18 +332,17 @@ db-pool Number of connections to keep open in PostgREST's database pool. Having enough here for the maximum expected simultaneous client connections can improve performance. Note it's pointless to set this higher than the :code:`max_connections` GUC in your database. -.. _db-pool-timeout: +.. _db-pool-acquisition-timeout: -db-pool-timeout ---------------- +db-pool-acquisition-timeout +--------------------------- =============== ================= - **Environment** PGRST_DB_POOL_TIMEOUT + **Environment** PGRST_DB_POOL_ACQUISITION_TIMEOUT **In-Database** `n/a` =============== ================= - Time to live, in seconds, for an idle database pool connection. If the timeout is reached the connection will be closed. - Once a new request arrives a new connection will be started. + Specifies the maximum time in seconds that the request will wait for the pool to free up a connection slot to the database. If it times out without acquiring a connection, then the request is aborted and a ``504`` error is returned. .. _db-pre-request: diff --git a/docs/releases/v6.0.2.rst b/docs/releases/v6.0.2.rst index f96550515c..47f870e443 100644 --- a/docs/releases/v6.0.2.rst +++ b/docs/releases/v6.0.2.rst @@ -26,7 +26,7 @@ Added * It's now possible to request a ``text/plain`` output. See :ref:`scalar_return_formats`. |br| -- `@steve-chavez `_ -* Config option for specifying PostgREST database pool timeout. See :ref:`db-pool-timeout`. +* Config option for specifying PostgREST database pool timeout ``db-pool-timeout``. |br| -- `@Qu4tro `_ * Config option for binding the PostgREST web server to an unix socket. See :ref:`server-unix-socket`. From 6b65a5b15187db359a670793085b0a8d4ff31c5c Mon Sep 17 00:00:00 2001 From: Laurence Isla Date: Thu, 9 Feb 2023 16:48:17 -0500 Subject: [PATCH 536/711] Add HTTP status codes to PGRST errors (#590) --- docs/errors.rst | 283 +++++++++++++++++++++++++----------------------- postgrest.dict | 1 - 2 files changed, 149 insertions(+), 135 deletions(-) diff --git a/docs/errors.rst b/docs/errors.rst index e3473e4878..affeb12b2c 100644 --- a/docs/errors.rst +++ b/docs/errors.rst @@ -125,21 +125,25 @@ Group 0 - Connection Related to the connection with the database. -+---------------+-------------------------------------------------------------+ -| Code | Description | -+===============+=============================================================+ -| .. _pgrst000: | Could not connect with the database due to an incorrect | -| | :ref:`db-uri` or due to the PostgreSQL service not running. | -| PGRST000 | | -+---------------+-------------------------------------------------------------+ -| .. _pgrst001: | Could not connect with the database due to an internal | -| | error. | -| PGRST001 | | -+---------------+-------------------------------------------------------------+ -| .. _pgrst002: | Could not connect with the database when building the | -| | :ref:`schema_cache` due to the PostgreSQL service not | -| PGRST002 | running. | -+---------------+-------------------------------------------------------------+ ++---------------+-------------+-------------------------------------------------------------+ +| Code | HTTP status | Description | ++===============+=============+=============================================================+ +| .. _pgrst000: | 503 | Could not connect with the database due to an incorrect | +| | | :ref:`db-uri` or due to the PostgreSQL service not running. | +| PGRST000 | | | ++---------------+-------------+-------------------------------------------------------------+ +| .. _pgrst001: | 503 | Could not connect with the database due to an internal | +| | | error. | +| PGRST001 | | | ++---------------+-------------+-------------------------------------------------------------+ +| .. _pgrst002: | 503 | Could not connect with the database when building the | +| | | :ref:`schema_cache` due to the PostgreSQL service not | +| PGRST002 | | running. | ++---------------+-------------+-------------------------------------------------------------+ +| .. _pgrst003: | 503 | The request time exceeded the timeout specified in | +| | | :ref:`db-pool-acquisition-timeout`. | +| PGRST003 | | | ++---------------+-------------+-------------------------------------------------------------+ .. _pgrst1**: @@ -148,82 +152,89 @@ Group 1 - Api Request Related to the HTTP request elements. -+---------------+-------------------------------------------------------------+ -| Code | Description | -+===============+=============================================================+ -| .. _pgrst100: | Parsing error in the query string parameter. | -| | See :ref:`h_filter`, :ref:`operators` and :ref:`ordering`. | -| PGRST100 | | -+---------------+-------------------------------------------------------------+ -| .. _pgrst101: | For :ref:`functions `, only ``GET`` and ``POST`` | -| | verbs are allowed. Any other verb will throw this error. | -| PGRST101 | | -+---------------+-------------------------------------------------------------+ -| .. _pgrst102: | An invalid request body was sent(e.g. an empty body or | -| | malformed JSON). | -| PGRST102 | | -+---------------+-------------------------------------------------------------+ -| .. _pgrst103: | An invalid range was specified for :ref:`limits`. | -| | | -| PGRST103 | | -+---------------+-------------------------------------------------------------+ -| .. _pgrst104: | Either the :ref:`filter operator ` is missing | -| | or it doesn't exist. | -| PGRST104 | | -+---------------+-------------------------------------------------------------+ -| .. _pgrst105: | An invalid :ref:`PUT ` request was done | -| | | -| PGRST105 | | -+---------------+-------------------------------------------------------------+ -| .. _pgrst106: | The schema specified when | -| | :ref:`switching schemas ` is not present | -| PGRST106 | in the :ref:`db-schemas` configuration variable. | -+---------------+-------------------------------------------------------------+ -| .. _pgrst107: | The ``Content-Type`` sent in the request is invalid. | -| | | -| PGRST107 | | -+---------------+-------------------------------------------------------------+ -| .. _pgrst108: | The filter is applied to a embedded resource that is not | -| | specified in the ``select`` part of the query string. | -| PGRST108 | See :ref:`embed_filters`. | -+---------------+-------------------------------------------------------------+ -| .. _pgrst109: | Restricting a Deletion or an Update using limits must | -| | include the ordering of a unique column. | -| PGRST109 | See :ref:`limited_update_delete`. | -+---------------+-------------------------------------------------------------+ -| .. _pgrst110: | When restricting a Deletion or an Update using limits | -| | modifies more rows than the maximum specified in the limit. | -| PGRST110 | See :ref:`limited_update_delete`. | -+---------------+-------------------------------------------------------------+ -| .. _pgrst111: | An invalid ``response.headers`` was set. | -| | See :ref:`guc_resp_hdrs`. | -| PGRST111 | | -+---------------+-------------------------------------------------------------+ -| .. _pgrst112: | The status code must be a positive integer. | -| | See :ref:`guc_resp_status`. | -| PGRST112 | | -+---------------+-------------------------------------------------------------+ -| .. _pgrst113: | More than one column was returned for a scalar result. | -| | See :ref:`scalar_return_formats`. | -| | | -| PGRST113 | | -+---------------+-------------------------------------------------------------+ -| .. _pgrst114: | For an :ref:`UPSERT using PUT `, when | -| | :ref:`limits and offsets ` are used. | -| PGRST114 | | -+---------------+-------------------------------------------------------------+ -| .. _pgrst115: | For an :ref:`UPSERT using PUT `, when the | -| | primary key in the query string and the body are different. | -| PGRST115 | | -+---------------+-------------------------------------------------------------+ -| .. _pgrst116: | More than 1 or no items where returned when requesting | -| | a singular response. See :ref:`singular_plural`. | -| PGRST116 | | -+---------------+-------------------------------------------------------------+ -| .. _pgrst117: | The HTTP verb used in the request in not supported. | -| | | -| PGRST117 | | -+---------------+-------------------------------------------------------------+ ++---------------+-------------+-------------------------------------------------------------+ +| Code | HTTP status | Description | ++===============+=============+=============================================================+ +| .. _pgrst100: | 400 | Parsing error in the query string parameter. | +| | | See :ref:`h_filter`, :ref:`operators` and :ref:`ordering`. | +| PGRST100 | | | ++---------------+-------------+-------------------------------------------------------------+ +| .. _pgrst101: | 405 | For :ref:`functions `, only ``GET`` and ``POST`` | +| | | verbs are allowed. Any other verb will throw this error. | +| PGRST101 | | | ++---------------+-------------+-------------------------------------------------------------+ +| .. _pgrst102: | 400 | An invalid request body was sent(e.g. an empty body or | +| | | malformed JSON). | +| PGRST102 | | | ++---------------+-------------+-------------------------------------------------------------+ +| .. _pgrst103: | 416 | An invalid range was specified for :ref:`limits`. | +| | | | +| PGRST103 | | | ++---------------+-------------+-------------------------------------------------------------+ +| .. _pgrst105: | 405 | An invalid :ref:`PUT ` request was done | +| | | | +| PGRST105 | | | ++---------------+-------------+-------------------------------------------------------------+ +| .. _pgrst106: | 406 | The schema specified when | +| | | :ref:`switching schemas ` is not present | +| PGRST106 | | in the :ref:`db-schemas` configuration variable. | ++---------------+-------------+-------------------------------------------------------------+ +| .. _pgrst107: | 415 | The ``Content-Type`` sent in the request is invalid. | +| | | | +| PGRST107 | | | ++---------------+-------------+-------------------------------------------------------------+ +| .. _pgrst108: | 400 | The filter is applied to a embedded resource that is not | +| | | specified in the ``select`` part of the query string. | +| PGRST108 | | See :ref:`embed_filters`. | ++---------------+-------------+-------------------------------------------------------------+ +| .. _pgrst109: | 400 | Restricting a Deletion or an Update using limits must | +| | | include the ordering of a unique column. | +| PGRST109 | | See :ref:`limited_update_delete`. | ++---------------+-------------+-------------------------------------------------------------+ +| .. _pgrst110: | 400 | When restricting a Deletion or an Update using limits | +| | | modifies more rows than the maximum specified in the limit. | +| PGRST110 | | See :ref:`limited_update_delete`. | ++---------------+-------------+-------------------------------------------------------------+ +| .. _pgrst111: | 500 | An invalid ``response.headers`` was set. | +| | | See :ref:`guc_resp_hdrs`. | +| PGRST111 | | | ++---------------+-------------+-------------------------------------------------------------+ +| .. _pgrst112: | 500 | The status code must be a positive integer. | +| | | See :ref:`guc_resp_status`. | +| PGRST112 | | | ++---------------+-------------+-------------------------------------------------------------+ +| .. _pgrst113: | 406 | More than one column was returned for a scalar result. | +| | | See :ref:`scalar_return_formats`. | +| PGRST113 | | | ++---------------+-------------+-------------------------------------------------------------+ +| .. _pgrst114: | 400 | For an :ref:`UPSERT using PUT `, when | +| | | :ref:`limits and offsets ` are used. | +| PGRST114 | | | ++---------------+-------------+-------------------------------------------------------------+ +| .. _pgrst115: | 400 | For an :ref:`UPSERT using PUT `, when the | +| | | primary key in the query string and the body are different. | +| PGRST115 | | | ++---------------+-------------+-------------------------------------------------------------+ +| .. _pgrst116: | 406 | More than 1 or no items where returned when requesting | +| | | a singular response. See :ref:`singular_plural`. | +| PGRST116 | | | ++---------------+-------------+-------------------------------------------------------------+ +| .. _pgrst117: | 405 | The HTTP verb used in the request in not supported. | +| | | | +| PGRST117 | | | ++---------------+-------------+-------------------------------------------------------------+ +| .. _pgrst118: | 400 | Could not order the result using the related table because | +| | | there is no many-to-one or one-to-one relationship between | +| PGRST118 | | them. | ++---------------+-------------+-------------------------------------------------------------+ +| .. _pgrst119: | 400 | Could not use the spread operator on the related table | +| | | because there is no many-to-one or one-to-one relationship | +| PGRST119 | | between them. | ++---------------+-------------+-------------------------------------------------------------+ +| .. _pgrst120: | 400 | An embedded resource can only be filtered using the | +| | | ``is.null`` or ``not.is.null`` :ref:`operators `.| +| PGRST120 | | | ++---------------+-------------+-------------------------------------------------------------+ .. _pgrst2**: @@ -232,27 +243,31 @@ Group 2 - Schema Cache Related to a :ref:`stale schema cache `. Most of the time, these errors are solved by :ref:`reloading the schema cache `. -+---------------+-------------------------------------------------------------+ -| Code | Description | -+===============+=============================================================+ -| .. _pgrst200: | Caused by :ref:`stale_fk_relationships`, otherwise any of | -| | the embedding resources or the relationship itself may not | -| PGRST200 | exist in the database. | -+---------------+-------------------------------------------------------------+ -| .. _pgrst201: | An ambiguous embedding request was made. | -| | See :ref:`embed_disamb`. | -| PGRST201 | | -+---------------+-------------------------------------------------------------+ -| .. _pgrst202: | Caused by a :ref:`stale_function_signature`, otherwise | -| | the function may not exist in the database. | -| PGRST202 | | -+---------------+-------------------------------------------------------------+ -| .. _pgrst203: | Caused by requesting overloaded functions with the same | -| | argument names but different types, or by using a ``POST`` | -| PGRST203 | verb to request overloaded functions with a ``JSON`` or | -| | ``JSONB`` type unnamed parameter. The solution is to rename | -| | the function or add/modify the names of the arguments. | -+---------------+-------------------------------------------------------------+ ++---------------+-------------+-------------------------------------------------------------+ +| Code | HTTP status | Description | ++===============+=============+=============================================================+ +| .. _pgrst200: | 400 | Caused by :ref:`stale_fk_relationships`, otherwise any of | +| | | the embedding resources or the relationship itself may not | +| PGRST200 | | exist in the database. | ++---------------+-------------+-------------------------------------------------------------+ +| .. _pgrst201: | 300 | An ambiguous embedding request was made. | +| | | See :ref:`embed_disamb`. | +| PGRST201 | | | ++---------------+-------------+-------------------------------------------------------------+ +| .. _pgrst202: | 404 | Caused by a :ref:`stale_function_signature`, otherwise | +| | | the function may not exist in the database. | +| PGRST202 | | | ++---------------+-------------+-------------------------------------------------------------+ +| .. _pgrst203: | 300 | Caused by requesting overloaded functions with the same | +| | | argument names but different types, or by using a ``POST`` | +| PGRST203 | | verb to request overloaded functions with a ``JSON`` or | +| | | ``JSONB`` type unnamed parameter. The solution is to rename | +| | | the function or add/modify the names of the arguments. | ++---------------+-------------+-------------------------------------------------------------+ +| .. _pgrst204: | 400 | Caused when the :ref:`column specified ` | +| | | in the ``columns`` query parameter is not found. | +| PGRST204 | | | ++---------------+-------------+-------------------------------------------------------------+ .. _pgrst3**: @@ -261,21 +276,21 @@ Group 3 - JWT Related to the authentication process using JWT. You can follow the :ref:`tut1` for an example on how to implement authentication and the :doc:`Authentication page ` for more information on this process. -+---------------+-------------------------------------------------------------+ -| Code | Description | -+===============+=============================================================+ -| .. _pgrst300: | A :ref:`JWT secret ` is missing from the | -| | configuration. | -| PGRST300 | | -+---------------+-------------------------------------------------------------+ -| .. _pgrst301: | Any error related to the verification of the JWT, | -| | which means that the JWT provided is invalid in some way. | -| PGRST301 | | -+---------------+-------------------------------------------------------------+ -| .. _pgrst302: | Attempted to do a request without | -| | :ref:`authentication ` when the anonymous role | -| PGRST302 | is disabled by not setting it in :ref:`db-anon-role`. | -+---------------+-------------------------------------------------------------+ ++---------------+-------------+-------------------------------------------------------------+ +| Code | HTTP status | Description | ++===============+=============+=============================================================+ +| .. _pgrst300: | 500 | A :ref:`JWT secret ` is missing from the | +| | | configuration. | +| PGRST300 | | | ++---------------+-------------+-------------------------------------------------------------+ +| .. _pgrst301: | 401 | Any error related to the verification of the JWT, | +| | | which means that the JWT provided is invalid in some way. | +| PGRST301 | | | ++---------------+-------------+-------------------------------------------------------------+ +| .. _pgrst302: | 401 | Attempted to do a request without | +| | | :ref:`authentication ` when the anonymous role | +| PGRST302 | | is disabled by not setting it in :ref:`db-anon-role`. | ++---------------+-------------+-------------------------------------------------------------+ .. The Internal Errors Group X** is always at the end @@ -286,10 +301,10 @@ Group X - Internal Internal errors. If you encounter any of these, you may have stumbled on a PostgREST bug, please `open an issue `_ and we'll be glad to fix it. -+---------------+-------------------------------------------------------------+ -| Code | Description | -+===============+=============================================================+ -| .. _pgrstX00: | Internal errors related to the library used for connecting | -| | to the database. | -| PGRSTX00 | | -+---------------+-------------------------------------------------------------+ ++---------------+-------------+-------------------------------------------------------------+ +| Code | HTTP status | Description | ++===============+=============+=============================================================+ +| .. _pgrstX00: | 500 | Internal errors related to the library used for connecting | +| | | to the database. | +| PGRSTX00 | | | ++---------------+-------------+-------------------------------------------------------------+ diff --git a/postgrest.dict b/postgrest.dict index 671c299117..789cdcdf4c 100644 --- a/postgrest.dict +++ b/postgrest.dict @@ -126,7 +126,6 @@ PostgreSQL PostgreSQL's PostgREST postgres -postgres's postgrest PostgREST's pre From 6089a462356fbc21c9849cebcd305b057d12a88c Mon Sep 17 00:00:00 2001 From: Ian Eyberg Date: Thu, 9 Feb 2023 15:43:11 -0800 Subject: [PATCH 537/711] adding link to ops unikernel package (#586) --- docs/ecosystem.rst | 1 + postgrest.dict | 2 ++ 2 files changed, 3 insertions(+) diff --git a/docs/ecosystem.rst b/docs/ecosystem.rst index 2fe80a94e7..f9fadfb57e 100644 --- a/docs/ecosystem.rst +++ b/docs/ecosystem.rst @@ -63,6 +63,7 @@ DevOps * `cloudstark/helm-charts `_ - helm chart to deploy PostgREST to a Kubernetes cluster via a Deployment and Service * `jbkarle/postgrest `_ - helm chart with a demo database for development and test purposes * `Limezest/postgrest-cloud-run `_ - expose a PostgreSQL database on Cloud SQL using Cloud Run +* `eyberg/postgrest `_ - run PostgREST as a Nanos unikernel .. _eco_external_notification: diff --git a/postgrest.dict b/postgrest.dict index 789cdcdf4c..102642e313 100644 --- a/postgrest.dict +++ b/postgrest.dict @@ -89,6 +89,7 @@ multi MVCC namespace namespaced +Nanos neq nginx ngrep @@ -185,6 +186,7 @@ TypeScript UI ui unicode +unikernel unix updatable UPSERT From 87b383316d25932412dae20485f172430c9bb931 Mon Sep 17 00:00:00 2001 From: Steve Chavez Date: Mon, 13 Feb 2023 11:06:22 -0500 Subject: [PATCH 538/711] fix: PGRST003 status code to 504 (#594) --- docs/errors.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/errors.rst b/docs/errors.rst index affeb12b2c..2d13faa985 100644 --- a/docs/errors.rst +++ b/docs/errors.rst @@ -140,8 +140,8 @@ Related to the connection with the database. | | | :ref:`schema_cache` due to the PostgreSQL service not | | PGRST002 | | running. | +---------------+-------------+-------------------------------------------------------------+ -| .. _pgrst003: | 503 | The request time exceeded the timeout specified in | -| | | :ref:`db-pool-acquisition-timeout`. | +| .. _pgrst003: | 504 | The request timed out waiting for a pool connection | +| | | to be available. See :ref:`db-pool-acquisition-timeout`. | | PGRST003 | | | +---------------+-------------+-------------------------------------------------------------+ From adeb622d31697ce11d9b15e3c614d6f159c3e662 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 13 Feb 2023 12:34:33 -0500 Subject: [PATCH 539/711] Bump cachix/install-nix-action from 18 to 19 (#593) Bumps [cachix/install-nix-action](https://github.com/cachix/install-nix-action) from 18 to 19. - [Release notes](https://github.com/cachix/install-nix-action/releases) - [Commits](https://github.com/cachix/install-nix-action/compare/v18...v19) --- updated-dependencies: - dependency-name: cachix/install-nix-action dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/ci.yaml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 18290bff2f..ac19ad0812 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -16,7 +16,7 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - - uses: cachix/install-nix-action@v18 + - uses: cachix/install-nix-action@v19 - run: nix-env -f default.nix -iA build - run: postgrest-docs-build @@ -25,7 +25,7 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - - uses: cachix/install-nix-action@v18 + - uses: cachix/install-nix-action@v19 - run: nix-env -f default.nix -iA spellcheck - run: postgrest-docs-spellcheck @@ -35,7 +35,7 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - - uses: cachix/install-nix-action@v18 + - uses: cachix/install-nix-action@v19 - run: nix-env -f default.nix -iA linkcheck - run: postgrest-docs-linkcheck From cf8ced10146c005105853b87b60198114cbd43a1 Mon Sep 17 00:00:00 2001 From: Steve Chavez Date: Mon, 13 Feb 2023 22:29:38 -0500 Subject: [PATCH 540/711] remove wrong claim about CSV being faster (#595) --- docs/api.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/api.rst b/docs/api.rst index c40b747dd1..dbd38c6f2e 100644 --- a/docs/api.rst +++ b/docs/api.rst @@ -1748,7 +1748,7 @@ URL encoded payloads can be posted with ``Content-Type: application/x-www-form-u Bulk Insert ----------- -Bulk insert works exactly like single row insert except that you provide either a JSON array of objects having uniform keys, or lines in CSV format. This not only minimizes the HTTP requests required but uses a single INSERT statement on the back-end for efficiency. Note that using CSV requires less parsing on the server and is much faster. +Bulk insert works exactly like single row insert except that you provide either a JSON array of objects having uniform keys, or lines in CSV format. This not only minimizes the HTTP requests required but uses a single INSERT statement on the back-end for efficiency. To bulk insert CSV simply post to a table route with :code:`Content-Type: text/csv` and include the names of the columns as the first row. For instance From 6da204d5545055db8877c9b3c9de86d52c920e47 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 6 Mar 2023 11:17:46 -0500 Subject: [PATCH 541/711] Bump cachix/install-nix-action from 19 to 20 (#597) Bumps [cachix/install-nix-action](https://github.com/cachix/install-nix-action) from 19 to 20. - [Release notes](https://github.com/cachix/install-nix-action/releases) - [Commits](https://github.com/cachix/install-nix-action/compare/v19...v20) --- updated-dependencies: - dependency-name: cachix/install-nix-action dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/ci.yaml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index ac19ad0812..c3bc418294 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -16,7 +16,7 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - - uses: cachix/install-nix-action@v19 + - uses: cachix/install-nix-action@v20 - run: nix-env -f default.nix -iA build - run: postgrest-docs-build @@ -25,7 +25,7 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - - uses: cachix/install-nix-action@v19 + - uses: cachix/install-nix-action@v20 - run: nix-env -f default.nix -iA spellcheck - run: postgrest-docs-spellcheck @@ -35,7 +35,7 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - - uses: cachix/install-nix-action@v19 + - uses: cachix/install-nix-action@v20 - run: nix-env -f default.nix -iA linkcheck - run: postgrest-docs-linkcheck From f588bb6daf791bfc307c8f73f03c112a6294cfbb Mon Sep 17 00:00:00 2001 From: Laurence Isla Date: Thu, 13 Apr 2023 18:38:07 -0500 Subject: [PATCH 542/711] Fix info on updates without filters --- docs/api.rst | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/docs/api.rst b/docs/api.rst index dbd38c6f2e..caaefa5c96 100644 --- a/docs/api.rst +++ b/docs/api.rst @@ -1866,10 +1866,12 @@ To update a row or rows in a table, use the PATCH verb. Use :ref:`h_filter` to s -X PATCH -H "Content-Type: application/json" \ -d '{ "category": "child" }' -Doing a full table update without filters is not allowed and will result in 0 updated rows. To make a an update without filters, you must limit the rows affected. See :ref:`limited_update_delete`. - Updates also support :code:`Prefer: return=representation` plus :ref:`v_filter`. +.. warning:: + + Beware of accidentally updating every row in a table. To learn to prevent that see :ref:`block_fulltable`. + .. _upsert: Upsert From 3ff9b81c7d8273e2b3d03029b67d58c721245f17 Mon Sep 17 00:00:00 2001 From: Steve Chavez Date: Tue, 18 Apr 2023 12:43:15 -0500 Subject: [PATCH 543/711] Remove public from schema cache event trigger --- docs/schema_cache.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/schema_cache.rst b/docs/schema_cache.rst index 5e5fce3a6a..c966a39907 100644 --- a/docs/schema_cache.rst +++ b/docs/schema_cache.rst @@ -147,7 +147,7 @@ You can do automatic schema cache reloading in a pure SQL way and forget about s .. code-block:: postgresql -- Create an event trigger function - CREATE OR REPLACE FUNCTION public.pgrst_watch() RETURNS event_trigger + CREATE OR REPLACE FUNCTION pgrst_watch() RETURNS event_trigger LANGUAGE plpgsql AS $$ BEGIN @@ -158,7 +158,7 @@ You can do automatic schema cache reloading in a pure SQL way and forget about s -- This event trigger will fire after every ddl_command_end event CREATE EVENT TRIGGER pgrst_watch ON ddl_command_end - EXECUTE PROCEDURE public.pgrst_watch(); + EXECUTE PROCEDURE pgrst_watch(); Now, whenever the ``pgrst_watch`` trigger is fired in the database, PostgREST will automatically reload the schema cache. From 516a4daacf3e86d5a4a9364eebbc6c3b37a4cfda Mon Sep 17 00:00:00 2001 From: Steve Chavez Date: Tue, 18 Apr 2023 17:13:40 -0500 Subject: [PATCH 544/711] snippet for computed rel overload --- docs/api.rst | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/docs/api.rst b/docs/api.rst index caaefa5c96..1e5e10c463 100644 --- a/docs/api.rst +++ b/docs/api.rst @@ -1168,6 +1168,12 @@ For example, to override the :ref:`many-to-one relationship ` betwe Taking advantage of overloaded functions, you can use the same function name for different parameters and thus define relationships from other tables/views to ``directors``. +.. code-block:: postgres + + create function directors(film_schools) returns setof directors as $$ + select * from directors where film_school_id = $1.id + $$ stable language sql; + Computed relationships have good performance as they follow the `Inlining conditions for table functions `_. .. _nested_embedding: From f55ced0306c7018a930c81fb635ba1aa4829b202 Mon Sep 17 00:00:00 2001 From: Laurence Isla Date: Fri, 21 Apr 2023 17:04:31 -0500 Subject: [PATCH 545/711] Add a warning when working with computed relationships --- docs/api.rst | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/docs/api.rst b/docs/api.rst index 1e5e10c463..a9483635e7 100644 --- a/docs/api.rst +++ b/docs/api.rst @@ -1174,7 +1174,13 @@ Taking advantage of overloaded functions, you can use the same function name for select * from directors where film_school_id = $1.id $$ stable language sql; -Computed relationships have good performance as they follow the `Inlining conditions for table functions `_. +Computed relationships have good performance as their intended design follow the `Inlining conditions for table functions `_. + +.. warning:: + + - Always use ``SETOF`` when creating computed relationships. Functions can return a table without using ``SETOF``, but bear in mind that they will not be inlined. + + - Make sure to correctly label the ``to-one`` part of the relationship. When using the ``ROWS 1`` estimation, PostgREST will expect a single row to be returned. If that is not the case, then it will unnest the embedding and return repeated values for the top level resource. .. _nested_embedding: From 424eac4b3ea22cd2c4e8fa47988cb8485b04e92f Mon Sep 17 00:00:00 2001 From: Laurence Isla Date: Fri, 21 Apr 2023 11:29:05 -0500 Subject: [PATCH 546/711] Add documentation for v10.2.0 Co-authored-by: Steve Chavez --- docs/configuration.rst | 16 +++- docs/index.rst | 1 + docs/install.rst | 2 + docs/releases/v10.2.0.rst | 153 ++++++++++++++++++++++++++++++++++++++ 4 files changed, 171 insertions(+), 1 deletion(-) create mode 100644 docs/releases/v10.2.0.rst diff --git a/docs/configuration.rst b/docs/configuration.rst index b479e5a56a..a2b41a303d 100644 --- a/docs/configuration.rst +++ b/docs/configuration.rst @@ -109,6 +109,7 @@ It's not possible to change :ref:`env_variables_config` for a running process an * :ref:`db-uri` * :ref:`db-pool` * :ref:`db-pool-acquisition-timeout` + * :ref:`db-pool-max-lifetime` * :ref:`server-host` * :ref:`server-port` * :ref:`server-unix-socket` @@ -156,7 +157,8 @@ db-extra-search-path String public Y db-max-rows Int ∞ Y db-plan-enabled Boolean False Y db-pool Int 10 -db-pool-acquisition-timeout Int ∞ +db-pool-acquisition-timeout Int 10 +db-pool-max-lifetime Int 1800 db-pre-request String Y db-prepared-statements Boolean True Y db-schemas String public Y @@ -344,6 +346,18 @@ db-pool-acquisition-timeout Specifies the maximum time in seconds that the request will wait for the pool to free up a connection slot to the database. If it times out without acquiring a connection, then the request is aborted and a ``504`` error is returned. +.. _db-pool-max-lifetime: + +db-pool-max-lifetime +-------------------- + + =============== ================= + **Environment** PGRST_DB_POOL_MAX_LIFETIME + **In-Database** `n/a` + =============== ================= + + Specifies the maximum time in seconds of an existing connection in the pool. When this lifetime is reached, then the connection will be closed and returned to the pool. + .. _db-pre-request: db-pre-request diff --git a/docs/index.rst b/docs/index.rst index d5311d4acb..f138876d81 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -98,6 +98,7 @@ The project has a friendly and growing community. Join our `chat room v10.0.0 v9.0.1 v9.0.0 diff --git a/docs/install.rst b/docs/install.rst index 39de4f0630..8ba9f56d4d 100644 --- a/docs/install.rst +++ b/docs/install.rst @@ -257,6 +257,8 @@ You can build PostgREST from source with `Stack `_, `10.1.1 `_ and `10.1.2 `_. You can look at the detailed changelog and download the pre-compiled binaries on the `GitHub release page `_. + +Features +-------- + +Connection Lifetime +~~~~~~~~~~~~~~~~~~~ + +To prevent memory leaks caused by long-lived connections, PostgREST limits their lifetime in the pool through :ref:`db-pool-max-lifetime`. + +Connection Timeout +~~~~~~~~~~~~~~~~~~ + +There is now a time limit to wait for new connections in the pool, that is, if a new request cannot get a connection in the time specified in :ref:`db-pool-acquisition-timeout` then a response with ``504`` status is returned + +Documentation improvements +~~~~~~~~~~~~~~~~~~~~~~~~~~ + +* Added HTTP status codes to the :ref:`pgrst_errors`. + +* Added a how-to on :ref:`sql-user-management-using-postgres-users-and-passwords`. + +* Updated the :ref:`Heroku installation page `. + +Changes +------- + +* Removed ``db-pool-timeout`` option because it was removed in the ``hasql-pool`` library that PostgREST uses for SQL connections. (`#2444 `_) + +Deprecated +---------- + +* Deprecate bulk-calls when including the ``Prefer: params=multiple-objects`` in the request. It is preferable to use a function with an :ref:`array ` or JSON parameter for a better performance. (`#1385 `_) + +Bug fixes +--------- + +* Reduce allocations communication with PostgreSQL, particularly for request bodies. (`#2261 `_, `#2349 `_, `#2467 `_) + +* Fix ``SIGUSR1`` to fully flush the connection pool. (`#2401 `_, `#2444 `_) + +* Fix opening an empty transaction on failed resource embedding. (`#2428 `_) + +* Fix embedding the same table multiple times. (`#2455 `_) + +* Fix a regression when embedding views where base tables have a different column order for foreign key columns (`#2518 `_) + +* Fix a regression with the ``Location`` header when :ref:`inserting ` into views with primary keys from multiple tables (`#2458 `_) + +* Fix a regression in OpenAPI output with mode ``follow-privileges`` (`#2356 `_) + +* Fix infinite recursion when loading schema cache with self-referencing view (`#2283 `_) + +* Return status code ``200`` instead of ``404`` for ``PATCH`` requests which don't affect any rows (`#2343 `_) + +* Treat the :ref:`computed relationships ` that do not return ``SETOF`` as M2O/O2O relationship (`#2481 `_) + +* Fix embedding a computed relationship with a normal relationship (`#2534 `_) + +* Fix error message when ``[]`` is used inside ``select`` (`#2362 `_) + +* Disallow ``!inner`` on computed columns (`#2475 `_) + +* Ignore leading and trailing spaces in column names when parsing the query string (`#2285 `_) + +* Fix ``UPSERT`` with PostgreSQL 15 (`#2545 `_) + +* Fix embedding views with multiple references to the same base column (`#2459 `_) + +* Fix regression when embedding views with partial references to multi column foreign keys (`#2548 `_) + +* Fix regression when requesting ``limit=0`` and ``db-max-row`` is set (`#2558 `_) + +* Return a clear error without hitting the database when trying to update or insert an unknown column with ``?columns`` (`#2542 `_) + +* Fix bad M2M embedding on RPC (`#2565 `_) + +* Replace misleading error message when no function is found with a hint containing functions/parameters names suggestions (`#2575 `_) + +* Move explanation about "single parameters" from the ``message`` to the ``details`` in the error output (`#2582 `_) + +* Replace misleading error message when no relationship is found with a hint containing parent/child names suggestions (`#2569 `_) + +* Add the required OpenAPI items object when the parameter is an array (`#1405 `_) + +* Add upsert headers for ``POST`` requests to the OpenAPI output (`#2592 `_) + +* Fix foreign keys pointing to ``VIEW`` instead of ``TABLE`` in OpenAPI output (`#2623 `_) + +* Consider any PostgreSQL authentication failure as fatal and exit immediately (`#2622 `_) + +* Fix ``NOTIFY pgrst`` not reloading the db connections catalog cache (`#2620 `_) + +* Fix ``db-pool-acquisition-timeout`` not logging to stderr when the timeout is reached (`#2667 `_) + +* Fix PostgreSQL resource leak with long-lived connections through the :ref:`db-pool-max-lifetime` configuration (`#2638 `_) + +* There is now a stricter parsing of the query string. Instead of silently ignoring, the parser now returns a :ref:`PostgREST error ` on invalid syntax. (`#2537 `_) + +Thanks +------ + +Big thanks from the `PostgREST team `_ to our sponsors! + +.. container:: image-container + + .. image:: ../_static/cybertec-new.png + :target: https://www.cybertec-postgresql.com/en/?utm_source=postgrest.org&utm_medium=referral&utm_campaign=postgrest + :width: 13em + + .. image:: ../_static/2ndquadrant.png + :target: https://www.2ndquadrant.com/en/?utm_campaign=External%20Websites&utm_source=PostgREST&utm_medium=Logo + :width: 13em + + .. image:: ../_static/retool.png + :target: https://retool.com/?utm_source=sponsor&utm_campaign=postgrest + :width: 13em + + .. image:: ../_static/gnuhost.png + :target: https://gnuhost.eu/?utm_source=sponsor&utm_campaign=postgrest + :width: 13em + + .. image:: ../_static/supabase.png + :target: https://supabase.com/?utm_source=postgrest%20backers&utm_medium=open%20source%20partner&utm_campaign=postgrest%20backers%20github&utm_term=homepage + :width: 13em + + .. image:: ../_static/oblivious.jpg + :target: https://oblivious.ai/?utm_source=sponsor&utm_campaign=postgrest + :width: 13em + +* Evans Fernandes +* `Jan Sommer `_ +* `Franz Gusenbauer `_ +* `Daniel Babiak `_ +* Tsingson Qin +* Michel Pelletier +* Jay Hannah +* Robert Stolarz +* Nicholas DiBiase +* Christopher Reid +* Nathan Bouscal +* Daniel Rafaj +* David Fenko +* Remo Rechkemmer +* Severin Ibarluzea +* Tom Saleeba +* Pawel Tyll + +If you like to join them please consider `supporting PostgREST development `_. From 4e49310d6e5cf7a2b6b77a071a02a5b6bc8104be Mon Sep 17 00:00:00 2001 From: Steve Chavez Date: Fri, 21 Apr 2023 19:20:46 -0500 Subject: [PATCH 547/711] Clarify pool connection features --- docs/releases/v10.2.0.rst | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/releases/v10.2.0.rst b/docs/releases/v10.2.0.rst index 5d1e1cebf9..3011e470e2 100644 --- a/docs/releases/v10.2.0.rst +++ b/docs/releases/v10.2.0.rst @@ -7,15 +7,15 @@ This minor version adds bug fixes and some features that provide stability to v1 Features -------- -Connection Lifetime -~~~~~~~~~~~~~~~~~~~ +Pool Connection Lifetime +~~~~~~~~~~~~~~~~~~~~~~~~ To prevent memory leaks caused by long-lived connections, PostgREST limits their lifetime in the pool through :ref:`db-pool-max-lifetime`. -Connection Timeout -~~~~~~~~~~~~~~~~~~ +Pool Connection Acquisition Timeout +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -There is now a time limit to wait for new connections in the pool, that is, if a new request cannot get a connection in the time specified in :ref:`db-pool-acquisition-timeout` then a response with ``504`` status is returned +There is now a time limit to wait for pool connections to be acquired. If a new request cannot get a connection in the time specified in :ref:`db-pool-acquisition-timeout` then a response with a ``504`` status is returned. Documentation improvements ~~~~~~~~~~~~~~~~~~~~~~~~~~ From 55cc616a5ec8ae47e4b02f1449b83a3372ff38f6 Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Mon, 1 May 2023 01:01:32 -0300 Subject: [PATCH 548/711] Authentication as a reference * Creates a Database Authorization topic * Moves JWT from Auth0 into Ecosystem * Moves SQL User Management to a how-to --- docs/auth.rst | 428 +++--------------- docs/configuration.rst | 4 +- docs/db_authz.rst | 89 ++++ docs/ecosystem.rst | 31 ++ ...ent-using-postgres-users-and-passwords.rst | 8 +- docs/how-tos/sql-user-management.rst | 228 ++++++++++ docs/index.rst | 21 +- 7 files changed, 428 insertions(+), 381 deletions(-) create mode 100644 docs/db_authz.rst create mode 100644 docs/how-tos/sql-user-management.rst diff --git a/docs/auth.rst b/docs/auth.rst index eeb55c0b05..90df4c086d 100644 --- a/docs/auth.rst +++ b/docs/auth.rst @@ -1,161 +1,81 @@ -.. _roles: +.. raw:: html -Overview of Role System -======================= +

    Authentication

    PostgREST is designed to keep the database at the center of API security. All authorization happens through database roles and permissions. It is PostgREST's job to **authenticate** requests -- i.e. verify that a client is who they say they are -- and then let the database **authorize** client actions. -Authentication Sequence +.. _roles: + +Overview of role system ----------------------- There are three types of roles used by PostgREST, the **authenticator**, **anonymous** and **user** roles. The database administrator creates these roles and configures PostgREST to use them. .. image:: _static/security-roles.png -The authenticator should be created :code:`NOINHERIT` and configured in the database to have very limited access. It is a chameleon whose job is to "become" other users to service authenticated HTTP requests. The picture below shows how the server handles authentication. If auth succeeds, it switches into the user role specified by the request, otherwise it switches into the anonymous role (if it's set in :ref:`db-anon-role`). - -.. image:: _static/security-anon-choice.png - -Here are the technical details. We use `JSON Web Tokens `_ to authenticate API requests. As you'll recall a JWT contains a list of cryptographically signed claims. All claims are allowed but PostgREST cares specifically about a claim called role. +The authenticator role is used for connecting to the database and should be configured to have very limited access. It is a chameleon whose job is to "become" other users to service authenticated HTTP requests. -.. code:: json - - { - "role": "user123" - } - -When a request contains a valid JWT with a role claim PostgREST will switch to the database role with that name for the duration of the HTTP request. .. code:: sql - SET LOCAL ROLE user123; -Note that the database administrator must allow the authenticator role to switch into this user by previously executing - -.. code:: sql - - GRANT user123 TO authenticator; + CREATE ROLE authenticator LOGIN NOINHERIT NOCREATEDB NOCREATEROLE NOSUPERUSER; -If the client included no JWT (or one without a role claim) then PostgREST switches into the anonymous role whose actual database-specific name, like that of with the authenticator role, is specified in the PostgREST server configuration file. The database administrator must set anonymous role permissions correctly to prevent anonymous users from seeing or changing things they shouldn't. - -Users and Groups ----------------- - -PostgreSQL manages database access permissions using the concept of roles. A role can be thought of as either a database user, or a group of database users, depending on how the role is set up. - -Roles for Each Web User -~~~~~~~~~~~~~~~~~~~~~~~ - -PostgREST can accommodate either viewpoint. If you treat a role as a single user then the JWT-based role switching described above does most of what you need. When an authenticated user makes a request PostgREST will switch into the role for that user, which in addition to restricting queries, is available to SQL through the :code:`current_user` variable. - -You can use row-level security to flexibly restrict visibility and access for the current user. Here is an `example `_ from Tomas Vondra, a chat table storing messages sent between users. Users can insert rows into it to send messages to other users, and query it to see messages sent to them by other users. - -.. code-block:: postgres - - CREATE TABLE chat ( - message_uuid UUID PRIMARY KEY DEFAULT uuid_generate_v4(), - message_time TIMESTAMP NOT NULL DEFAULT now(), - message_from NAME NOT NULL DEFAULT current_user, - message_to NAME NOT NULL, - message_subject VARCHAR(64) NOT NULL, - message_body TEXT - ); - - ALTER TABLE chat ENABLE ROW LEVEL SECURITY; +.. note:: -We want to enforce a policy that ensures a user can see only those messages sent by them or intended for them. Also we want to prevent a user from forging the message_from column with another person's name. + The names "authenticator" and "anon" names are configurable and not sacred, we simply choose them for clarity. See :ref:`db-uri` and :ref:`db-anon-role`. -PostgreSQL allows us to set this policy with row-level security: +.. _user_impersonation: -.. code-block:: postgres +User Impersonation +------------------ - CREATE POLICY chat_policy ON chat - USING ((message_to = current_user) OR (message_from = current_user)) - WITH CHECK (message_from = current_user) +The picture below shows how the server handles authentication. If auth succeeds, it switches into the user role specified by the request, otherwise it switches into the anonymous role (if it's set in :ref:`db-anon-role`). -Anyone accessing the generated API endpoint for the chat table will see exactly the rows they should, without our needing custom imperative server-side coding. +.. image:: _static/security-anon-choice.png -.. warning:: +This role switching mechanism is called **user impersonation**. In PostgreSQL it's done with the ``SET ROLE`` statement. - Roles are namespaced per-cluster rather than per-database so they may be prone to collision. +.. _jwt_impersonation: -Web Users Sharing Role -~~~~~~~~~~~~~~~~~~~~~~ +JWT-Based User Impersonation +---------------------------- -Alternately database roles can represent groups instead of (or in addition to) individual users. You may choose that all signed-in users for a web app share the role webuser. You can distinguish individual users by including extra claims in the JWT such as email. +We use `JSON Web Tokens `_ to authenticate API requests. As you'll recall a JWT contains a list of cryptographically signed claims. All claims are allowed but PostgREST cares specifically about a claim called role. .. code:: json { - "role": "webuser", - "email": "john@doe.com" + "role": "user123" } -SQL code can access claims through GUC variables set by PostgREST per request. For instance to get the email claim, call this function: - -For PostgreSQL server version >= 14 +When a request contains a valid JWT with a role claim PostgREST will switch to the database role with that name for the duration of the HTTP request. .. code:: sql - current_setting('request.jwt.claims', true)::json->>'email'; - + SET LOCAL ROLE user123; -For PostgreSQL server version < 14 +Note that the database administrator must allow the authenticator role to switch into this user by previously executing .. code:: sql - current_setting('request.jwt.claim.email', true); - -This allows JWT generation services to include extra information and your database code to react to it. For instance the RLS example could be modified to use this current_setting rather than current_user. The second 'true' argument tells current_setting to return NULL if the setting is missing from the current configuration. - -Hybrid User-Group Roles -~~~~~~~~~~~~~~~~~~~~~~~ - -You can mix the group and individual role policies. For instance we could still have a webuser role and individual users which inherit from it: - -.. code-block:: postgres - - CREATE ROLE webuser NOLOGIN; - -- grant this role access to certain tables etc - - CREATE ROLE user000 NOLOGIN; - GRANT webuser TO user000; - -- now user000 can do whatever webuser can - - GRANT user000 TO authenticator; - -- allow authenticator to switch into user000 role - -- (the role itself has nologin) - -.. _custom_validation: - -Custom Validation ------------------ - -PostgREST honors the :code:`exp` claim for token expiration, rejecting expired tokens. However it does not enforce any extra constraints. An example of an extra constraint would be to immediately revoke access for a certain user. The configuration file parameter :code:`db-pre-request` specifies a stored procedure to call immediately after the authenticator switches into a new role and before the main query itself runs. - -Here's an example. In the config file specify a stored procedure: + GRANT user123 TO authenticator; + -- similarly for the anonymous role + -- GRANT anonymous TO authenticator; -.. code:: ini +If the client included no JWT (or one without a role claim) then PostgREST switches into the anonymous role. The database administrator must set the anonymous role permissions correctly to prevent anonymous users from seeing or changing things they shouldn't. - db-pre-request = "public.check_user" +.. _jwt_generation: -In the function you can run arbitrary code to check the request and raise an exception to block it if desired. - -.. code-block:: postgres +JWT Generation +~~~~~~~~~~~~~~ - CREATE OR REPLACE FUNCTION check_user() RETURNS void AS $$ - BEGIN - IF current_user = 'evil_user' THEN - RAISE EXCEPTION 'No, you are evil' - USING HINT = 'Stop being so evil and maybe you can log in'; - END IF; - END - $$ LANGUAGE plpgsql; +You can create a valid JWT either from inside your database(see :ref:`sql_user_management`) or via an external service(see :ref:`external_jwt`). .. _client_auth: Client Auth -=========== +~~~~~~~~~~~ To make an authenticated request the client must include an :code:`Authorization` HTTP header with the value :code:`Bearer `. For instance: @@ -173,84 +93,20 @@ To make an authenticated request the client must include an :code:`Authorization The ``Bearer`` header value can be used with or without capitalization(``bearer``). -JWT Generation --------------- - -You can create a valid JWT either from inside your database or via an external service. Each token is cryptographically signed with a secret key. In the case of symmetric cryptography the signer and verifier share the same secret passphrase. In asymmetric cryptography the signer uses the private key and the verifier the public key. PostgREST supports both symmetric and asymmetric cryptography. - -JWT from SQL -~~~~~~~~~~~~ - -You can create JWT tokens in SQL using the `pgjwt extension `_. It's simple and requires only pgcrypto. If you're on an environment like Amazon RDS which doesn't support installing new extensions, you can still manually run the `SQL inside pgjwt `_ (you'll need to replace ``@extschema@`` with another schema or just delete it) which creates the functions you will need. - -Next write a stored procedure that returns the token. The one below returns a token with a hard-coded role, which expires five minutes after it was issued. Note this function has a hard-coded secret as well. - -.. code-block:: postgres - - CREATE TYPE jwt_token AS ( - token text - ); - - CREATE FUNCTION jwt_test() RETURNS public.jwt_token AS $$ - SELECT public.sign( - row_to_json(r), 'reallyreallyreallyreallyverysafe' - ) AS token - FROM ( - SELECT - 'my_role'::text as role, - extract(epoch from now())::integer + 300 AS exp - ) r; - $$ LANGUAGE sql; - -PostgREST exposes this function to clients via a POST request to ``/rpc/jwt_test``. - -.. note:: - - To avoid hard-coding the secret in stored procedures, save it as a property of the database. - - .. code-block:: postgres - - -- run this once - ALTER DATABASE mydb SET "app.jwt_secret" TO 'reallyreallyreallyreallyverysafe'; - - -- then all functions can refer to app.jwt_secret - SELECT sign( - row_to_json(r), current_setting('app.jwt_secret') - ) AS token - FROM ... - -JWT from Auth0 +Symmetric Keys ~~~~~~~~~~~~~~ -An external service like `Auth0 `_ can do the hard work transforming OAuth from Github, Twitter, Google etc into a JWT suitable for PostgREST. Auth0 can also handle email signup and password reset flows. - -To use Auth0, create `an application `_ for your app and `an API `_ for your PostgREST server. Auth0 supports both HS256 and RS256 scheme for the issued tokens for APIs. For simplicity, you may first try HS256 scheme while creating your API on Auth0. Your application should use your PostgREST API's `API identifier `_ by setting it with the `audience parameter `_ during the authorization request. This will ensure that Auth0 will issue an access token for your PostgREST API. For PostgREST to verify the access token, you will need to set ``jwt-secret`` on PostgREST config file with your API's signing secret. - -.. note:: - - Our code requires a database role in the JWT. To add it you need to save the database role in Auth0 `app metadata `_. Then, you will need to write `a rule `_ that will extract the role from the user's app_metadata and set it as a `custom claim `_ in the access token. Note that, you may use Auth0's `core authorization feature `_ for more complex use cases. Metadata solution is mentioned here for simplicity. - - .. code:: javascript - - function (user, context, callback) { - - // Follow the documentations at - // https://postgrest.org/en/latest/configuration.html#db-role-claim-key - // to set a custom role claim on PostgREST - // and use it as custom claim attribute in this rule - const myRoleClaim = 'https://myapp.com/role'; - - user.app_metadata = user.app_metadata || {}; - context.accessToken[myRoleClaim] = user.app_metadata.role; - callback(null, user, context); - } +Each token is cryptographically signed with a secret key. In the case of symmetric cryptography the signer and verifier share the same secret passphrase, which can be configured with :ref:`jwt-secret`. +If it is set to a simple string value like “reallyreallyreallyreallyverysafe” then PostgREST interprets it as an HMAC-SHA256 passphrase. .. _asym_keys: Asymmetric Keys ~~~~~~~~~~~~~~~ -As described in the :ref:`configuration` section, PostgREST accepts a ``jwt-secret`` config file parameter. If it is set to a simple string value like "reallyreallyreallyreallyverysafe" then PostgREST interprets it as an HMAC-SHA256 passphrase. However you can also specify a literal JSON Web Key (JWK) or set. For example, you can use an RSA-256 public key encoded as a JWK: +In asymmetric cryptography the signer uses the private key and the verifier the public key. + +As described in the :ref:`configuration` section, PostgREST accepts a ``jwt-secret`` config file parameter. However you can also specify a literal JSON Web Key (JWK) or set. For example, you can use an RSA-256 public key encoded as a JWK: .. code-block:: json @@ -287,7 +143,14 @@ You can specify the literal value as we saw earlier, or reference a filename to jwt-secret = "@rsa.jwk.pub" -JWT security +.. _jwt_validation: + +JWT Validation +~~~~~~~~~~~~~~ + +PostgREST honors the :code:`exp` claim for token expiration, rejecting expired tokens. + +JWT Security ~~~~~~~~~~~~ There are at least three types of common critiques against using JWT: 1) against the standard itself, 2) against using libraries with known security vulnerabilities, and 3) against using JWT for web sessions. We'll briefly explain each critique, how PostgREST deals with it, and give recommendations for appropriate user action. @@ -300,197 +163,26 @@ The last type of critique focuses on the misuse of JWT for maintaining web sessi PostgREST uses JWT mainly for authentication and authorization purposes and encourages users to do the same. For web sessions, using cookies over HTTPS is good enough and well catered for by standard web frameworks. -Schema Isolation -================ - -You can isolate your api schema from internal implementation details, as explained in :ref:`schema_isolation`. For an example of wrapping a private table with a public view see the :ref:`public_ui` section below. - -.. _sql_user_management: - -SQL User Management -=================== - -Storing Users and Passwords ---------------------------- - -As mentioned, an external service can provide user management and coordinate with the PostgREST server using JWT. It's also possible to support logins entirely through SQL. It's a fair bit of work, so get ready. - -The following table, functions, and triggers will live in a :code:`basic_auth` schema that you shouldn't expose publicly in the API. The public views and functions will live in a different schema which internally references this internal information. - -First we'll need a table to keep track of our users: - -.. code:: sql - - -- We put things inside the basic_auth schema to hide - -- them from public view. Certain public procs/views will - -- refer to helpers and tables inside. - create schema if not exists basic_auth; - - create table if not exists - basic_auth.users ( - email text primary key check ( email ~* '^.+@.+\..+$' ), - pass text not null check (length(pass) < 512), - role name not null check (length(role) < 512) - ); - -We would like the role to be a foreign key to actual database roles, however PostgreSQL does not support these constraints against the :code:`pg_roles` table. We'll use a trigger to manually enforce it. - -.. code-block:: plpgsql - - create or replace function - basic_auth.check_role_exists() returns trigger as $$ - begin - if not exists (select 1 from pg_roles as r where r.rolname = new.role) then - raise foreign_key_violation using message = - 'unknown database role: ' || new.role; - return null; - end if; - return new; - end - $$ language plpgsql; - - drop trigger if exists ensure_user_role_exists on basic_auth.users; - create constraint trigger ensure_user_role_exists - after insert or update on basic_auth.users - for each row - execute procedure basic_auth.check_role_exists(); - -Next we'll use the pgcrypto extension and a trigger to keep passwords safe in the :code:`users` table. - -.. code-block:: plpgsql - - create extension if not exists pgcrypto; - - create or replace function - basic_auth.encrypt_pass() returns trigger as $$ - begin - if tg_op = 'INSERT' or new.pass <> old.pass then - new.pass = crypt(new.pass, gen_salt('bf')); - end if; - return new; - end - $$ language plpgsql; - - drop trigger if exists encrypt_pass on basic_auth.users; - create trigger encrypt_pass - before insert or update on basic_auth.users - for each row - execute procedure basic_auth.encrypt_pass(); - -With the table in place we can make a helper to check a password against the encrypted column. It returns the database role for a user if the email and password are correct. - -.. code-block:: plpgsql - - create or replace function - basic_auth.user_role(email text, pass text) returns name - language plpgsql - as $$ - begin - return ( - select role from basic_auth.users - where users.email = user_role.email - and users.pass = crypt(user_role.pass, users.pass) - ); - end; - $$; - -.. _public_ui: - -Public User Interface ---------------------- - -In the previous section we created an internal table to store user information. Here we create a login function which takes an email address and password and returns JWT if the credentials match a user in the internal table. - -Permissions -~~~~~~~~~~~ - -Your database roles need access to the schema, tables, views and functions in order to service HTTP requests. -Recall from the `Overview of Role System`_ that PostgREST uses special roles to process requests, namely the authenticator and -anonymous roles. Below is an example of permissions that allow anonymous users to create accounts and attempt to log in. - -.. code-block:: postgres +.. _custom_validation: - -- the names "anon" and "authenticator" are configurable and not - -- sacred, we simply choose them for clarity - create role anon noinherit; - create role authenticator noinherit; - grant anon to authenticator; +Custom Validation +----------------- -Then, add ``db-anon-role`` to the configuration file to allow anonymous requests. +PostgREST does not enforce any extra constraints besides :ref:`jwt_validation`. An example of an extra constraint would be to immediately revoke access for a certain user. Using :ref:`db-pre-request` you can specify a stored procedure to call immediately after :ref:`user_impersonation` and before the main query itself runs. .. code:: ini - db-anon-role = "anon" - -Logins -~~~~~~ + db-pre-request = "public.check_user" -As described in `JWT from SQL`_, we'll create a JWT inside our login function. Note that you'll need to adjust the secret key which is hard-coded in this example to a secure (at least thirty-two character) secret of your choosing. +In the function you can run arbitrary code to check the request and raise an exception to block it if desired. .. code-block:: postgres - -- add type - CREATE TYPE basic_auth.jwt_token AS ( - token text - ); - - -- login should be on your exposed schema - create or replace function - login(email text, pass text) returns basic_auth.jwt_token as $$ - declare - _role name; - result basic_auth.jwt_token; - begin - -- check email and password - select basic_auth.user_role(email, pass) into _role; - if _role is null then - raise invalid_password using message = 'invalid user or password'; - end if; - - select sign( - row_to_json(r), 'reallyreallyreallyreallyverysafe' - ) as token - from ( - select _role as role, login.email as email, - extract(epoch from now())::integer + 60*60 as exp - ) r - into result; - return result; - end; - $$ language plpgsql security definer; - - grant execute on function login(text,text) to anon; - -Since the above :code:`login` function is defined as `security definer `_, -the anonymous user :code:`anon` doesn't need permission to read the :code:`basic_auth.users` table. It doesn't even need permission to access the :code:`basic_auth` schema. -:code:`grant execute on function` is included for clarity but it might not be needed, see :ref:`func_privs` for more details. - -An API request to call this function would look like: - -.. tabs:: - - .. code-tab:: http - - POST /rpc/login HTTP/1.1 - - { "email": "foo@bar.com", "pass": "foobar" } - - .. code-tab:: bash Curl - - curl "http://localhost:3000/rpc/login" \ - -X POST -H "Content-Type: application/json" \ - -d '{ "email": "foo@bar.com", "pass": "foobar" }' - -The response would look like the snippet below. Try decoding the token at `jwt.io `_. (It was encoded with a secret of :code:`reallyreallyreallyreallyverysafe` as specified in the SQL code above. You'll want to change this secret in your app!) - -.. code:: json - - { - "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJlbWFpbCI6ImZvb0BiYXIuY29tIiwicGFzcyI6ImZvb2JhciJ9.37066TTRlh-1hXhnA9oO9Pj6lgL6zFuJU0iCHhuCFno" - } - - -Alternatives -~~~~~~~~~~~~ - -See the how-to :ref:`sql-user-management-using-postgres-users-and-passwords` for a similar way that completely avoids the table :code:`basic_auth.users`. + CREATE OR REPLACE FUNCTION check_user() RETURNS void AS $$ + BEGIN + IF current_user = 'evil_user' THEN + RAISE EXCEPTION 'No, you are evil' + USING HINT = 'Stop being so evil and maybe you can log in'; + END IF; + END + $$ LANGUAGE plpgsql; diff --git a/docs/configuration.rst b/docs/configuration.rst index a2b41a303d..cf4e6c8b2d 100644 --- a/docs/configuration.rst +++ b/docs/configuration.rst @@ -7,8 +7,6 @@ Without configuration, PostgREST won't be able to serve requests. At the minimum To connect to a database it uses a `libpq connection string `_. The connection string can be set in the configuration file or via environment variable or can be read from an external file. See :ref:`db-uri` for details. Any parameter that is not set in the connection string is read from `libpq environment variables `_. The default connection string is ``postgresql://``, which reads **all** parameters from the environment. -The user with whom PostgREST connects to the database is also known as the authenticator role. For more information about the anonymous vs authenticator roles see :ref:`roles`. - Config parameters are read in the following order: 1. From the config file. @@ -463,6 +461,8 @@ db-uri The standard connection PostgreSQL `URI format `_. Symbols and unusual characters in the password or other fields should be percent encoded to avoid a parse error. If enforcing an SSL connection to the database is required you can use `sslmode `_ in the URI, for example ``postgres://user:pass@host:5432/dbname?sslmode=require``. + The user with whom PostgREST connects to the database is also known as the ``authenticator`` role. For more information see :ref:`roles`. + When running PostgREST on the same machine as PostgreSQL, it is also possible to connect to the database using a `Unix socket `_ and the `Peer Authentication method `_ as an alternative to TCP/IP communication and authentication with a password, this also grants higher performance. To do this you can omit the host and the password, e.g. ``postgres://user@/dbname``, see the `libpq connection string `_ documentation for more details. Choosing a value for this parameter beginning with the at sign such as ``@filename`` (e.g. ``@./configs/my-config``) loads the connection string out of an external file. diff --git a/docs/db_authz.rst b/docs/db_authz.rst new file mode 100644 index 0000000000..8225a9a4c0 --- /dev/null +++ b/docs/db_authz.rst @@ -0,0 +1,89 @@ +.. raw:: html + +

    Database Authorization

    + +Database authorization is the process of granting and verifying database access permissions. PostgreSQL manages permissions using the concept of roles. A role can be thought of as either a database user, or a group of database users, depending on how the role is set up. + +Roles for Each Web User +----------------------- + +PostgREST can accommodate either viewpoint. If you treat a role as a single user then the :ref:`jwt_impersonation` does most of what you need. When an authenticated user makes a request PostgREST will switch into the database role for that user, which in addition to restricting queries, is available to SQL through the :code:`current_user` variable. + +You can use row-level security to flexibly restrict visibility and access for the current user. Here is an `example `_ from Tomas Vondra, a chat table storing messages sent between users. Users can insert rows into it to send messages to other users, and query it to see messages sent to them by other users. + +.. code-block:: postgres + + CREATE TABLE chat ( + message_uuid UUID PRIMARY KEY DEFAULT uuid_generate_v4(), + message_time TIMESTAMP NOT NULL DEFAULT now(), + message_from NAME NOT NULL DEFAULT current_user, + message_to NAME NOT NULL, + message_subject VARCHAR(64) NOT NULL, + message_body TEXT + ); + + ALTER TABLE chat ENABLE ROW LEVEL SECURITY; + +We want to enforce a policy that ensures a user can see only those messages sent by them or intended for them. Also we want to prevent a user from forging the ``message_from`` column with another person's name. + +PostgreSQL allows us to set this policy with row-level security: + +.. code-block:: postgres + + CREATE POLICY chat_policy ON chat + USING ((message_to = current_user) OR (message_from = current_user)) + WITH CHECK (message_from = current_user) + +Anyone accessing the generated API endpoint for the chat table will see exactly the rows they should, without our needing custom imperative server-side coding. + +.. warning:: + + Roles are namespaced per-cluster rather than per-database so they may be prone to collision. + +Web Users Sharing Role +---------------------- + +Alternately database roles can represent groups instead of (or in addition to) individual users. You may choose that all signed-in users for a web app share the role ``webuser``. You can distinguish individual users by including extra claims in the JWT such as email. + +.. code:: json + + { + "role": "webuser", + "email": "john@doe.com" + } + +SQL code can access claims through GUC variables set by PostgREST per request. For instance to get the email claim, call this function: + +For PostgreSQL server version >= 14 + +.. code:: sql + + current_setting('request.jwt.claims', true)::json->>'email'; + + +For PostgreSQL server version < 14 + +.. code:: sql + + current_setting('request.jwt.claim.email', true); + +This allows JWT generation services to include extra information and your database code to react to it. For instance the RLS example could be modified to use this ``current_setting`` rather than ``current_user``. The second ``'true'`` argument tells ``current_setting`` to return NULL if the setting is missing from the current configuration. + +Hybrid User-Group Roles +----------------------- + +You can mix the group and individual role policies. For instance we could still have a webuser role and individual users which inherit from it: + +.. code-block:: postgres + + CREATE ROLE webuser NOLOGIN; + -- grant this role access to certain tables etc + + CREATE ROLE user000 NOLOGIN; + GRANT webuser TO user000; + -- now user000 can do whatever webuser can + + GRANT user000 TO authenticator; + -- allow authenticator to switch into user000 role + -- (the role itself has nologin) + diff --git a/docs/ecosystem.rst b/docs/ecosystem.rst index f9fadfb57e..ba6292bd60 100644 --- a/docs/ecosystem.rst +++ b/docs/ecosystem.rst @@ -1,3 +1,34 @@ +.. _external_jwt: + +External JWT Generation +----------------------- + +JWT from Auth0 +~~~~~~~~~~~~~~ + +An external service like `Auth0 `_ can do the hard work transforming OAuth from Github, Twitter, Google etc into a JWT suitable for PostgREST. Auth0 can also handle email signup and password reset flows. + +To use Auth0, create `an application `_ for your app and `an API `_ for your PostgREST server. Auth0 supports both HS256 and RS256 scheme for the issued tokens for APIs. For simplicity, you may first try HS256 scheme while creating your API on Auth0. Your application should use your PostgREST API's `API identifier `_ by setting it with the `audience parameter `_ during the authorization request. This will ensure that Auth0 will issue an access token for your PostgREST API. For PostgREST to verify the access token, you will need to set ``jwt-secret`` on PostgREST config file with your API's signing secret. + +.. note:: + + Our code requires a database role in the JWT. To add it you need to save the database role in Auth0 `app metadata `_. Then, you will need to write `a rule `_ that will extract the role from the user's app_metadata and set it as a `custom claim `_ in the access token. Note that, you may use Auth0's `core authorization feature `_ for more complex use cases. Metadata solution is mentioned here for simplicity. + + .. code:: javascript + + function (user, context, callback) { + + // Follow the documentations at + // https://postgrest.org/en/latest/configuration.html#db-role-claim-key + // to set a custom role claim on PostgREST + // and use it as custom claim attribute in this rule + const myRoleClaim = 'https://myapp.com/role'; + + user.app_metadata = user.app_metadata || {}; + context.accessToken[myRoleClaim] = user.app_metadata.role; + callback(null, user, context); + } + .. _community_tutorials: Community Tutorials diff --git a/docs/how-tos/sql-user-management-using-postgres-users-and-passwords.rst b/docs/how-tos/sql-user-management-using-postgres-users-and-passwords.rst index 4dec8ed1fa..108959ab7f 100644 --- a/docs/how-tos/sql-user-management-using-postgres-users-and-passwords.rst +++ b/docs/how-tos/sql-user-management-using-postgres-users-and-passwords.rst @@ -59,7 +59,7 @@ In order to be able to work with postgres' SCRAM-SHA-256 password hashes, we als CREATE FUNCTION basic_auth.pbkdf2(salt bytea, pw text, count integer, desired_length integer, algorithm text) RETURNS bytea LANGUAGE plpgsql IMMUTABLE AS $$ - DECLARE + DECLARE hash_length integer; block_count integer; output bytea; @@ -97,7 +97,7 @@ In order to be able to work with postgres' SCRAM-SHA-256 password hashes, we als -- FOR j IN 2 .. count LOOP the_last := ext_pgcrypto.HMAC(the_last, pw::bytea, algorithm); - + -- xor the two FOR k IN 1 .. length(xorsum) LOOP xorsum := set_byte(xorsum, k - 1, get_byte(xorsum, k - 1) # get_byte(the_last, k - 1)); @@ -210,8 +210,6 @@ anonymous roles. Below is an example of permissions that allow anonymous users t .. code-block:: postgres - -- the names "anon" and "authenticator" are configurable and not - -- sacred, we simply choose them for clarity CREATE ROLE anon NOINHERIT; CREATE role authenticator NOINHERIT LOGIN PASSWORD 'secret'; GRANT anon TO authenticator; @@ -299,7 +297,7 @@ Let's add a table, intended for the :code:`foo` user: Now try to get the table's contents with: .. tabs:: - + .. code-tab:: http GET /foobar HTTP/1.1 diff --git a/docs/how-tos/sql-user-management.rst b/docs/how-tos/sql-user-management.rst new file mode 100644 index 0000000000..1f8716e869 --- /dev/null +++ b/docs/how-tos/sql-user-management.rst @@ -0,0 +1,228 @@ +.. _sql_user_management: + +SQL User Management +=================== + +As mentioned on :ref:`jwt_generation`, an external service can provide user management and coordinate with the PostgREST server using JWT. It’s also possible to support logins entirely through SQL. It’s a fair bit of work, so get ready. + +Storing Users and Passwords +--------------------------- + +The following table, functions, and triggers will live in a :code:`basic_auth` schema that you shouldn't expose publicly in the API. The public views and functions will live in a different schema which internally references this internal information. + +First we'll need a table to keep track of our users: + +.. code:: sql + + -- We put things inside the basic_auth schema to hide + -- them from public view. Certain public procs/views will + -- refer to helpers and tables inside. + create schema if not exists basic_auth; + + create table if not exists + basic_auth.users ( + email text primary key check ( email ~* '^.+@.+\..+$' ), + pass text not null check (length(pass) < 512), + role name not null check (length(role) < 512) + ); + +We would like the role to be a foreign key to actual database roles, however PostgreSQL does not support these constraints against the :code:`pg_roles` table. We'll use a trigger to manually enforce it. + +.. code-block:: plpgsql + + create or replace function + basic_auth.check_role_exists() returns trigger as $$ + begin + if not exists (select 1 from pg_roles as r where r.rolname = new.role) then + raise foreign_key_violation using message = + 'unknown database role: ' || new.role; + return null; + end if; + return new; + end + $$ language plpgsql; + + drop trigger if exists ensure_user_role_exists on basic_auth.users; + create constraint trigger ensure_user_role_exists + after insert or update on basic_auth.users + for each row + execute procedure basic_auth.check_role_exists(); + +Next we'll use the pgcrypto extension and a trigger to keep passwords safe in the :code:`users` table. + +.. code-block:: plpgsql + + create extension if not exists pgcrypto; + + create or replace function + basic_auth.encrypt_pass() returns trigger as $$ + begin + if tg_op = 'INSERT' or new.pass <> old.pass then + new.pass = crypt(new.pass, gen_salt('bf')); + end if; + return new; + end + $$ language plpgsql; + + drop trigger if exists encrypt_pass on basic_auth.users; + create trigger encrypt_pass + before insert or update on basic_auth.users + for each row + execute procedure basic_auth.encrypt_pass(); + +With the table in place we can make a helper to check a password against the encrypted column. It returns the database role for a user if the email and password are correct. + +.. code-block:: plpgsql + + create or replace function + basic_auth.user_role(email text, pass text) returns name + language plpgsql + as $$ + begin + return ( + select role from basic_auth.users + where users.email = user_role.email + and users.pass = crypt(user_role.pass, users.pass) + ); + end; + $$; + +.. _public_ui: + +Public User Interface +--------------------- + +In the previous section we created an internal table to store user information. Here we create a login function which takes an email address and password and returns JWT if the credentials match a user in the internal table. + +Permissions +~~~~~~~~~~~ + +Your database roles need access to the schema, tables, views and functions in order to service HTTP requests. +Recall from the :ref:`roles` that PostgREST uses special roles to process requests, namely the authenticator and +anonymous roles. Below is an example of permissions that allow anonymous users to create accounts and attempt to log in. + +.. code-block:: postgres + + create role anon noinherit; + create role authenticator noinherit; + grant anon to authenticator; + +Then, add ``db-anon-role`` to the configuration file to allow anonymous requests. + +.. code:: ini + + db-anon-role = "anon" + +JWT from SQL +~~~~~~~~~~~~ + +You can create JWT tokens in SQL using the `pgjwt extension `_. It's simple and requires only pgcrypto. If you're on an environment like Amazon RDS which doesn't support installing new extensions, you can still manually run the `SQL inside pgjwt `_ (you'll need to replace ``@extschema@`` with another schema or just delete it) which creates the functions you will need. + +Next write a stored procedure that returns the token. The one below returns a token with a hard-coded role, which expires five minutes after it was issued. Note this function has a hard-coded secret as well. + +.. code-block:: postgres + + CREATE TYPE jwt_token AS ( + token text + ); + + CREATE FUNCTION jwt_test() RETURNS public.jwt_token AS $$ + SELECT public.sign( + row_to_json(r), 'reallyreallyreallyreallyverysafe' + ) AS token + FROM ( + SELECT + 'my_role'::text as role, + extract(epoch from now())::integer + 300 AS exp + ) r; + $$ LANGUAGE sql; + +PostgREST exposes this function to clients via a POST request to ``/rpc/jwt_test``. + +.. note:: + + To avoid hard-coding the secret in stored procedures, save it as a property of the database. + + .. code-block:: postgres + + -- run this once + ALTER DATABASE mydb SET "app.jwt_secret" TO 'reallyreallyreallyreallyverysafe'; + + -- then all functions can refer to app.jwt_secret + SELECT sign( + row_to_json(r), current_setting('app.jwt_secret') + ) AS token + FROM ... + +Logins +~~~~~~ + +As described in `JWT from SQL`_, we'll create a JWT inside our login function. Note that you'll need to adjust the secret key which is hard-coded in this example to a secure (at least thirty-two character) secret of your choosing. + +.. code-block:: postgres + + -- add type + CREATE TYPE basic_auth.jwt_token AS ( + token text + ); + + -- login should be on your exposed schema + create or replace function + login(email text, pass text) returns basic_auth.jwt_token as $$ + declare + _role name; + result basic_auth.jwt_token; + begin + -- check email and password + select basic_auth.user_role(email, pass) into _role; + if _role is null then + raise invalid_password using message = 'invalid user or password'; + end if; + + select sign( + row_to_json(r), 'reallyreallyreallyreallyverysafe' + ) as token + from ( + select _role as role, login.email as email, + extract(epoch from now())::integer + 60*60 as exp + ) r + into result; + return result; + end; + $$ language plpgsql security definer; + + grant execute on function login(text,text) to anon; + +Since the above :code:`login` function is defined as `security definer `_, +the anonymous user :code:`anon` doesn't need permission to read the :code:`basic_auth.users` table. It doesn't even need permission to access the :code:`basic_auth` schema. +:code:`grant execute on function` is included for clarity but it might not be needed, see :ref:`func_privs` for more details. + +An API request to call this function would look like: + +.. tabs:: + + .. code-tab:: http + + POST /rpc/login HTTP/1.1 + + { "email": "foo@bar.com", "pass": "foobar" } + + .. code-tab:: bash Curl + + curl "http://localhost:3000/rpc/login" \ + -X POST -H "Content-Type: application/json" \ + -d '{ "email": "foo@bar.com", "pass": "foobar" }' + +The response would look like the snippet below. Try decoding the token at `jwt.io `_. (It was encoded with a secret of :code:`reallyreallyreallyreallyverysafe` as specified in the SQL code above. You'll want to change this secret in your app!) + +.. code:: json + + { + "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJlbWFpbCI6ImZvb0BiYXIuY29tIiwicGFzcyI6ImZvb2JhciJ9.37066TTRlh-1hXhnA9oO9Pj6lgL6zFuJU0iCHhuCFno" + } + + +Alternatives +~~~~~~~~~~~~ + +See the how-to :ref:`sql-user-management-using-postgres-users-and-passwords` for a similar way that completely avoids the table :code:`basic_auth.users`. diff --git a/docs/index.rst b/docs/index.rst index f138876d81..e5d90de2f3 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -130,6 +130,12 @@ Reference guides Technical references for PostgREST's functionality. +.. toctree:: + :caption: Authentication + :hidden: + + auth.rst + .. toctree:: :caption: API :hidden: @@ -154,6 +160,7 @@ Technical references for PostgREST's functionality. errors.rst +- :doc:`Authentication ` - :doc:`API ` - :doc:`configuration` - :doc:`Schema Cache ` @@ -165,10 +172,10 @@ Topic guides Explanations of some key concepts in PostgREST. .. toctree:: - :caption: Authentication + :caption: Database Authorization :hidden: - auth.rst + db_authz.rst .. toctree:: :caption: Schema Structure @@ -188,7 +195,7 @@ Explanations of some key concepts in PostgREST. install.rst -- :doc:`Authentication ` +- :doc:`Database Authorization ` - :doc:`Schema Structure ` - :doc:`Administration ` - :doc:`Installation ` @@ -205,15 +212,17 @@ These are recipes that'll help you address specific use-cases. :caption: How-to guides :hidden: + how-tos/sql-user-management how-tos/working-with-postgresql-data-types + how-tos/sql-user-management-using-postgres-users-and-passwords how-tos/providing-images-for-img how-tos/create-soap-endpoint - how-tos/sql-user-management-using-postgres-users-and-passwords -- :doc:`how-tos/providing-images-for-img` +- :doc:`how-tos/sql-user-management` - :doc:`how-tos/working-with-postgresql-data-types` -- :doc:`how-tos/create-soap-endpoint` - :doc:`how-tos/sql-user-management-using-postgres-users-and-passwords` +- :doc:`how-tos/providing-images-for-img` +- :doc:`how-tos/create-soap-endpoint` Ecosystem --------- From 638aa8369dc6332a7da1555ed1fd2b364ffd88fa Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Mon, 1 May 2023 01:14:33 -0300 Subject: [PATCH 549/711] fix broken link --- docs/releases/v10.0.0.rst | 2 +- docs/releases/v10.2.0.rst | 2 +- docs/releases/v7.0.0.rst | 2 +- docs/releases/v7.0.1.rst | 2 +- docs/releases/v8.0.0.rst | 2 +- docs/releases/v9.0.0.rst | 2 +- docs/releases/v9.0.1.rst | 2 +- postgrest.dict | 1 + 8 files changed, 8 insertions(+), 7 deletions(-) diff --git a/docs/releases/v10.0.0.rst b/docs/releases/v10.0.0.rst index 7dc46fedae..9177fcfbca 100644 --- a/docs/releases/v10.0.0.rst +++ b/docs/releases/v10.0.0.rst @@ -207,7 +207,7 @@ Big thanks from the `PostgREST team `_ :width: 13em * Evans Fernandes -* `Jan Sommer `_ +* Jan Sommer * `Franz Gusenbauer `_ * `Daniel Babiak `_ * Tsingson Qin diff --git a/docs/releases/v10.2.0.rst b/docs/releases/v10.2.0.rst index 3011e470e2..ff7dc61ea5 100644 --- a/docs/releases/v10.2.0.rst +++ b/docs/releases/v10.2.0.rst @@ -133,7 +133,7 @@ Big thanks from the `PostgREST team `_ :width: 13em * Evans Fernandes -* `Jan Sommer `_ +* Jan Sommer * `Franz Gusenbauer `_ * `Daniel Babiak `_ * Tsingson Qin diff --git a/docs/releases/v7.0.0.rst b/docs/releases/v7.0.0.rst index 241f0e9010..03aaa3a42a 100644 --- a/docs/releases/v7.0.0.rst +++ b/docs/releases/v7.0.0.rst @@ -90,7 +90,7 @@ This release was made possible thanks to: * `Daniel Babiak `_ * Evans Fernandes -* `Jan Sommer `_ +* Jan Sommer * Tsingson Qin * Michel Pelletier * Jay Hannah diff --git a/docs/releases/v7.0.1.rst b/docs/releases/v7.0.1.rst index 5186216e5d..541c462459 100644 --- a/docs/releases/v7.0.1.rst +++ b/docs/releases/v7.0.1.rst @@ -53,7 +53,7 @@ This release was made possible thanks to: * `Daniel Babiak `_ * Evans Fernandes -* `Jan Sommer `_ +* Jan Sommer * Tsingson Qin * Michel Pelletier * Jay Hannah diff --git a/docs/releases/v8.0.0.rst b/docs/releases/v8.0.0.rst index bdaea49162..22b77a736c 100644 --- a/docs/releases/v8.0.0.rst +++ b/docs/releases/v8.0.0.rst @@ -171,7 +171,7 @@ Big thanks from the `PostgREST team `_ :width: 13em * Evans Fernandes -* `Jan Sommer `_ +* Jan Sommer * `Franz Gusenbauer `_ * `Daniel Babiak `_ * Tsingson Qin diff --git a/docs/releases/v9.0.0.rst b/docs/releases/v9.0.0.rst index d451bba7eb..236ebf0e37 100644 --- a/docs/releases/v9.0.0.rst +++ b/docs/releases/v9.0.0.rst @@ -110,7 +110,7 @@ Big thanks from the `PostgREST team `_ :width: 13em * Evans Fernandes -* `Jan Sommer `_ +* Jan Sommer * `Franz Gusenbauer `_ * `Daniel Babiak `_ * Tsingson Qin diff --git a/docs/releases/v9.0.1.rst b/docs/releases/v9.0.1.rst index ffec1ee2ad..dfbaa57357 100644 --- a/docs/releases/v9.0.1.rst +++ b/docs/releases/v9.0.1.rst @@ -69,7 +69,7 @@ Big thanks from the `PostgREST team `_ :width: 13em * Evans Fernandes -* `Jan Sommer `_ +* Jan Sommer * `Franz Gusenbauer `_ * `Daniel Babiak `_ * Tsingson Qin diff --git a/postgrest.dict b/postgrest.dict index 102642e313..d99c43b302 100644 --- a/postgrest.dict +++ b/postgrest.dict @@ -156,6 +156,7 @@ Sencha Serverless Severin SHA +Sommer signup SIGUSR sl From 473035575cd29811cbb71e414290a84ac42fd863 Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Tue, 2 May 2023 19:29:01 -0300 Subject: [PATCH 550/711] database as single source of truth philosophy make it clear at the index --- docs/index.rst | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/index.rst b/docs/index.rst index e5d90de2f3..81ae15fbf3 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -67,15 +67,15 @@ Sponsors | -Motivation ----------- +Database as Single Source of Truth +---------------------------------- -Using PostgREST is an alternative to manual CRUD programming. Custom API servers suffer problems. Writing business logic often duplicates, ignores or hobbles database structure. Object-relational mapping is a leaky abstraction leading to slow imperative code. The PostgREST philosophy establishes a single declarative source of truth: the data itself. +Using PostgREST is an alternative to manual CRUD programming. Custom API servers suffer problems. Writing business logic often duplicates, ignores or hobbles database structure. Object-relational mapping is a leaky abstraction leading to slow imperative code. The PostgREST philosophy establishes a single declarative source of truth: the database itself. Declarative Programming ----------------------- -It's easier to ask PostgreSQL to join data for you and let its query planner figure out the details than to loop through rows yourself. It's easier to assign permissions to db objects than to add guards in controllers. (This is especially true for cascading permissions in data dependencies.) It's easier to set constraints than to litter code with sanity checks. +It's easier to ask PostgreSQL to join data for you and let its query planner figure out the details than to loop through rows yourself. It's easier to assign permissions to database objects than to add guards in controllers. (This is especially true for cascading permissions in data dependencies.) It's easier to set constraints than to litter code with sanity checks. Leak-proof Abstraction ---------------------- From 764f0a035293da68df3b652fd0f23b3ade334783 Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Wed, 3 May 2023 00:38:23 -0300 Subject: [PATCH 551/711] link authn to db authz --- docs/auth.rst | 2 +- docs/db_authz.rst | 13 +++++++++---- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/docs/auth.rst b/docs/auth.rst index 90df4c086d..81360d31e0 100644 --- a/docs/auth.rst +++ b/docs/auth.rst @@ -2,7 +2,7 @@

    Authentication

    -PostgREST is designed to keep the database at the center of API security. All authorization happens through database roles and permissions. It is PostgREST's job to **authenticate** requests -- i.e. verify that a client is who they say they are -- and then let the database **authorize** client actions. +PostgREST is designed to keep the database at the center of API security. All :doc:`authorization happens in the database ` . It is PostgREST's job to **authenticate** requests -- i.e. verify that a client is who they say they are -- and then let the database **authorize** client actions. .. _roles: diff --git a/docs/db_authz.rst b/docs/db_authz.rst index 8225a9a4c0..abb8e59c88 100644 --- a/docs/db_authz.rst +++ b/docs/db_authz.rst @@ -2,10 +2,15 @@

    Database Authorization

    -Database authorization is the process of granting and verifying database access permissions. PostgreSQL manages permissions using the concept of roles. A role can be thought of as either a database user, or a group of database users, depending on how the role is set up. +Database authorization is the process of granting and verifying database access permissions. PostgreSQL manages permissions using the concept of roles. + +Users and Groups +---------------- + +A role can be thought of as either a database user, or a group of database users, depending on how the role is set up. Roles for Each Web User ------------------------ +~~~~~~~~~~~~~~~~~~~~~~~ PostgREST can accommodate either viewpoint. If you treat a role as a single user then the :ref:`jwt_impersonation` does most of what you need. When an authenticated user makes a request PostgREST will switch into the database role for that user, which in addition to restricting queries, is available to SQL through the :code:`current_user` variable. @@ -41,7 +46,7 @@ Anyone accessing the generated API endpoint for the chat table will see exactly Roles are namespaced per-cluster rather than per-database so they may be prone to collision. Web Users Sharing Role ----------------------- +~~~~~~~~~~~~~~~~~~~~~~ Alternately database roles can represent groups instead of (or in addition to) individual users. You may choose that all signed-in users for a web app share the role ``webuser``. You can distinguish individual users by including extra claims in the JWT such as email. @@ -70,7 +75,7 @@ For PostgreSQL server version < 14 This allows JWT generation services to include extra information and your database code to react to it. For instance the RLS example could be modified to use this ``current_setting`` rather than ``current_user``. The second ``'true'`` argument tells ``current_setting`` to return NULL if the setting is missing from the current configuration. Hybrid User-Group Roles ------------------------ +~~~~~~~~~~~~~~~~~~~~~~~ You can mix the group and individual role policies. For instance we could still have a webuser role and individual users which inherit from it: From 4f4ae27a2d285cbb5110bcc313c3eb85f65ddc81 Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Wed, 3 May 2023 08:45:05 -0300 Subject: [PATCH 552/711] clarify custom validation --- docs/auth.rst | 15 ++++++++------- docs/index.rst | 2 +- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/docs/auth.rst b/docs/auth.rst index 81360d31e0..ea80deae58 100644 --- a/docs/auth.rst +++ b/docs/auth.rst @@ -143,10 +143,8 @@ You can specify the literal value as we saw earlier, or reference a filename to jwt-secret = "@rsa.jwk.pub" -.. _jwt_validation: - -JWT Validation -~~~~~~~~~~~~~~ +JWT Claims Validation +~~~~~~~~~~~~~~~~~~~~~ PostgREST honors the :code:`exp` claim for token expiration, rejecting expired tokens. @@ -168,19 +166,22 @@ PostgREST uses JWT mainly for authentication and authorization purposes and enco Custom Validation ----------------- -PostgREST does not enforce any extra constraints besides :ref:`jwt_validation`. An example of an extra constraint would be to immediately revoke access for a certain user. Using :ref:`db-pre-request` you can specify a stored procedure to call immediately after :ref:`user_impersonation` and before the main query itself runs. +PostgREST does not enforce any extra constraints besides JWT validation. An example of an extra constraint would be to immediately revoke access for a certain user. Using :ref:`db-pre-request` you can specify a stored procedure to call immediately after :ref:`user_impersonation` and before the main query itself runs. .. code:: ini db-pre-request = "public.check_user" -In the function you can run arbitrary code to check the request and raise an exception to block it if desired. +In the function you can run arbitrary code to check the request and raise an exception(see :ref:`raise_error`) to block it if desired. You can take advantage of :ref:`guc_req_headers_cookies_claims` for +doing custom logic based on the web user info. .. code-block:: postgres CREATE OR REPLACE FUNCTION check_user() RETURNS void AS $$ + DECLARE + email text := current_setting('request.jwt.claims', true)::json->>'email'; BEGIN - IF current_user = 'evil_user' THEN + IF email = 'evil.user@malicious.com' THEN RAISE EXCEPTION 'No, you are evil' USING HINT = 'Stop being so evil and maybe you can log in'; END IF; diff --git a/docs/index.rst b/docs/index.rst index 81ae15fbf3..5034f843a8 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -70,7 +70,7 @@ Sponsors Database as Single Source of Truth ---------------------------------- -Using PostgREST is an alternative to manual CRUD programming. Custom API servers suffer problems. Writing business logic often duplicates, ignores or hobbles database structure. Object-relational mapping is a leaky abstraction leading to slow imperative code. The PostgREST philosophy establishes a single declarative source of truth: the database itself. +Using PostgREST is an alternative to manual CRUD programming. Custom API servers suffer problems. Writing business logic often duplicates, ignores or hobbles database structure. Object-relational mapping is a leaky abstraction leading to slow imperative code. The PostgREST philosophy establishes a single declarative source of truth: the data itself. Declarative Programming ----------------------- From d1d159d1e0bc576add273b07ae91d4b746ae0189 Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Wed, 3 May 2023 16:39:43 -0300 Subject: [PATCH 553/711] join schema structure with db authz --- docs/auth.rst | 2 +- docs/db_authz.rst | 105 ++++++++++++++++++++++++++++++++++++-- docs/index.rst | 7 --- docs/releases/v7.0.0.rst | 2 +- docs/schema_structure.rst | 96 ---------------------------------- 5 files changed, 103 insertions(+), 109 deletions(-) delete mode 100644 docs/schema_structure.rst diff --git a/docs/auth.rst b/docs/auth.rst index ea80deae58..31eb5e31ee 100644 --- a/docs/auth.rst +++ b/docs/auth.rst @@ -172,7 +172,7 @@ PostgREST does not enforce any extra constraints besides JWT validation. An exam db-pre-request = "public.check_user" -In the function you can run arbitrary code to check the request and raise an exception(see :ref:`raise_error`) to block it if desired. You can take advantage of :ref:`guc_req_headers_cookies_claims` for +In the function you can run arbitrary code to check the request and raise an exception(see :ref:`raise_error`) to block it if desired. Here you can take advantage of :ref:`guc_req_headers_cookies_claims` for doing custom logic based on the web user info. .. code-block:: postgres diff --git a/docs/db_authz.rst b/docs/db_authz.rst index abb8e59c88..73e8146b95 100644 --- a/docs/db_authz.rst +++ b/docs/db_authz.rst @@ -5,12 +5,12 @@ Database authorization is the process of granting and verifying database access permissions. PostgreSQL manages permissions using the concept of roles. Users and Groups ----------------- +================ A role can be thought of as either a database user, or a group of database users, depending on how the role is set up. Roles for Each Web User -~~~~~~~~~~~~~~~~~~~~~~~ +----------------------- PostgREST can accommodate either viewpoint. If you treat a role as a single user then the :ref:`jwt_impersonation` does most of what you need. When an authenticated user makes a request PostgREST will switch into the database role for that user, which in addition to restricting queries, is available to SQL through the :code:`current_user` variable. @@ -46,7 +46,7 @@ Anyone accessing the generated API endpoint for the chat table will see exactly Roles are namespaced per-cluster rather than per-database so they may be prone to collision. Web Users Sharing Role -~~~~~~~~~~~~~~~~~~~~~~ +---------------------- Alternately database roles can represent groups instead of (or in addition to) individual users. You may choose that all signed-in users for a web app share the role ``webuser``. You can distinguish individual users by including extra claims in the JWT such as email. @@ -75,7 +75,7 @@ For PostgreSQL server version < 14 This allows JWT generation services to include extra information and your database code to react to it. For instance the RLS example could be modified to use this ``current_setting`` rather than ``current_user``. The second ``'true'`` argument tells ``current_setting`` to return NULL if the setting is missing from the current configuration. Hybrid User-Group Roles -~~~~~~~~~~~~~~~~~~~~~~~ +----------------------- You can mix the group and individual role policies. For instance we could still have a webuser role and individual users which inherit from it: @@ -92,3 +92,100 @@ You can mix the group and individual role policies. For instance we could still -- allow authenticator to switch into user000 role -- (the role itself has nologin) +.. _schema_isolation: + +Schemas +======= + +A PostgREST instance exposes all the tables, views, and stored procedures of the schemas configured in :ref:`db-schemas`. This means private data or implementation details can go inside private schemas and be invisible to HTTP clients. + +It is recommended that you don't expose tables on the schemas you expose, instead expose views and stored procedures which insulate the internal details from the outside world. +This allows you to change the internals of your schema and maintain backwards compatibility. It also keeps your code easier to refactor, and provides a natural way to do API versioning. + +.. image:: _static/db.png + +Note that you must explicitly allow roles to access the exposed schemas: + +.. code-block:: postgres + + GRANT USAGE ON SCHEMA api TO webuser; + +.. _func_privs: + +Functions +========= + +By default, when a function is created, the privilege to execute it is not restricted by role. The function access is ``PUBLIC`` — executable by all roles (more details at `PostgreSQL Privileges page `_). This is not ideal for an API schema. To disable this behavior, you can run the following SQL statement: + +.. code-block:: postgres + + ALTER DEFAULT PRIVILEGES REVOKE EXECUTE ON FUNCTIONS FROM PUBLIC; + +This will change the privileges for all functions created in the future in all schemas. Currently there is no way to limit it to a single schema. In our opinion it's a good practice anyway. + +.. note:: + + It is however possible to limit the effect of this clause only to functions you define. You can put the above statement at the beginning of the API schema definition, and then at the end reverse it with: + + .. code-block:: postgres + + ALTER DEFAULT PRIVILEGES GRANT EXECUTE ON FUNCTIONS TO PUBLIC; + + This will work because the :code:`alter default privileges` statement has effect on function created *after* it is executed. See `PostgreSQL alter default privileges `_ for more details. + +After that, you'll need to grant EXECUTE privileges on functions explicitly: + +.. code-block:: postgres + + GRANT EXECUTE ON FUNCTION login TO anonymous; + GRANT EXECUTE ON FUNCTION signup TO anonymous; + +You can also grant execute on all functions in a schema to a higher privileged role: + +.. code-block:: postgres + + GRANT EXECUTE ON ALL FUNCTIONS IN SCHEMA api TO web_user; + +Security definer +---------------- + +A function is executed with the privileges of the user who calls it. This means that the user has to have all permissions to do the operations the procedure performs. +If the function accesses private database objects, your :ref:`API roles ` won't be able to successfully execute the function. + +Another option is to define the function with the :code:`SECURITY DEFINER` option. Then only one permission check will take place, the permission to call the function, and the operations in the function will have the authority of the user who owns the function itself. + +.. code-block:: postgres + + -- login as a user wich has privileges on the private schemas + + -- create a sample function + create or replace function login(email text, pass text) returns jwt_token as $$ + begin + -- access to a private schema called 'auth' + select auth.user_role(email, pass) into _role; + -- other operations + -- ... + end; + $$ language plpgsql security definer; + +Note the ``SECURITY DEFINER`` keywords at the end of the function. See `PostgreSQL documentation `_ for more details. + +Views +===== + +Views are invoked with the privileges of the view owner, much like stored procedures with the ``SECURITY DEFINER`` option. When created by a SUPERUSER role, all `row-level security `_ will be bypassed unless a different, non-SUPERUSER owner is specified. + +For changing this, we can create a non-SUPERUSER role and make this role the view's owner. + +.. code-block:: postgres + + CREATE ROLE api_views_owner NOINHERIT; + ALTER VIEW sample_view OWNER TO api_views_owner; + +Rules +----- + +Insertion on views with complex `rules `_ might not work out of the box with PostgREST. +It's recommended that you `use triggers instead of rules `_. +If you want to keep using rules, a workaround is to wrap the view insertion in a stored procedure and call it through the :ref:`s_procs` interface. +For more details, see this `github issue `_. diff --git a/docs/index.rst b/docs/index.rst index 5034f843a8..c3e18938ea 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -177,12 +177,6 @@ Explanations of some key concepts in PostgREST. db_authz.rst -.. toctree:: - :caption: Schema Structure - :hidden: - - schema_structure.rst - .. toctree:: :caption: Administration :hidden: @@ -196,7 +190,6 @@ Explanations of some key concepts in PostgREST. install.rst - :doc:`Database Authorization ` -- :doc:`Schema Structure ` - :doc:`Administration ` - :doc:`Installation ` diff --git a/docs/releases/v7.0.0.rst b/docs/releases/v7.0.0.rst index 03aaa3a42a..67357c9b25 100644 --- a/docs/releases/v7.0.0.rst +++ b/docs/releases/v7.0.0.rst @@ -35,7 +35,7 @@ Added * Documentation improvements - + Explanation for :doc:`Schema Structure <../schema_structure>`. + + Explanation for :doc:`Schema Structure <../db_authz>`. + Reference for :ref:`s_proc_embed`. + Reference for :ref:`mutation_embed`. + Reference for filters on :ref:`json_columns`. diff --git a/docs/schema_structure.rst b/docs/schema_structure.rst deleted file mode 100644 index d21b9332ef..0000000000 --- a/docs/schema_structure.rst +++ /dev/null @@ -1,96 +0,0 @@ - -.. note:: - - This page is a work in progress. - -.. _schema_isolation: - -Schema Isolation -================ - -A PostgREST instance exposes all the tables, views, and stored procedures of a single `PostgreSQL schema `_ (a namespace of database objects). This means private data or implementation details can go inside different private schemas and be invisible to HTTP clients. - -It is recommended that you don't expose tables on your API schema. Instead expose views and stored procedures which insulate the internal details from the outside world. -This allows you to change the internals of your schema and maintain backwards compatibility. It also keeps your code easier to refactor, and provides a natural way to do API versioning. - -.. image:: _static/db.png - -.. _func_privs: - -Functions -========= - -By default, when a function is created, the privilege to execute it is not restricted by role. The function access is ``PUBLIC`` — executable by all roles (more details at `PostgreSQL Privileges page `_). This is not ideal for an API schema. To disable this behavior, you can run the following SQL statement: - -.. code-block:: postgres - - ALTER DEFAULT PRIVILEGES REVOKE EXECUTE ON FUNCTIONS FROM PUBLIC; - -This will change the privileges for all functions created in the future in all schemas. Currently there is no way to limit it to a single schema. In our opinion it's a good practice anyway. - -.. note:: - - It is however possible to limit the effect of this clause only to functions you define. You can put the above statement at the beginning of the API schema definition, and then at the end reverse it with: - - .. code-block:: postgres - - ALTER DEFAULT PRIVILEGES GRANT EXECUTE ON FUNCTIONS TO PUBLIC; - - This will work because the :code:`alter default privileges` statement has effect on function created *after* it is executed. See `PostgreSQL alter default privileges `_ for more details. - -After that, you'll need to grant EXECUTE privileges on functions explicitly: - -.. code-block:: postgres - - GRANT EXECUTE ON FUNCTION login TO anonymous; - GRANT EXECUTE ON FUNCTION signup TO anonymous; - -You can also grant execute on all functions in a schema to a higher privileged role: - -.. code-block:: postgres - - GRANT EXECUTE ON ALL FUNCTIONS IN SCHEMA api TO web_user; - -Security definer ----------------- - -A function is executed with the privileges of the user who calls it. This means that the user has to have all permissions to do the operations the procedure performs. -If the function accesses private database objects, your :ref:`API roles ` won't be able to successfully execute the function. - -Another option is to define the function with the :code:`SECURITY DEFINER` option. Then only one permission check will take place, the permission to call the function, and the operations in the function will have the authority of the user who owns the function itself. - -.. code-block:: postgres - - -- login as a user wich has privileges on the private schemas - - -- create a sample function - create or replace function login(email text, pass text) returns jwt_token as $$ - begin - -- access to a private schema called 'auth' - select auth.user_role(email, pass) into _role; - -- other operations - -- ... - end; - $$ language plpgsql security definer; - -Note the ``SECURITY DEFINER`` keywords at the end of the function. See `PostgreSQL documentation `_ for more details. - -Views -===== - -Views are invoked with the privileges of the view owner, much like stored procedures with the ``SECURITY DEFINER`` option. When created by a SUPERUSER role, all `row-level security `_ will be bypassed unless a different, non-SUPERUSER owner is specified. - -For changing this, we can create a non-SUPERUSER role and make this role the view's owner. - -.. code-block:: postgres - - CREATE ROLE api_views_owner NOINHERIT; - ALTER VIEW sample_view OWNER TO api_views_owner; - -Rules ------ - -Insertion on views with complex `rules `_ might not work out of the box with PostgREST. -It's recommended that you `use triggers instead of rules `_. -If you want to keep using rules, a workaround is to wrap the view insertion in a stored procedure and call it through the :ref:`s_procs` interface. -For more details, see this `github issue `_. From 8ec925c33eca90225a7b81c22511ef8297494559 Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Wed, 3 May 2023 16:57:17 -0300 Subject: [PATCH 554/711] clarify view security invoker feature Move RULEs limitation to Insertions --- docs/api.rst | 7 +++++++ docs/db_authz.rst | 20 ++++++++++---------- 2 files changed, 17 insertions(+), 10 deletions(-) diff --git a/docs/api.rst b/docs/api.rst index a9483635e7..e693c5a866 100644 --- a/docs/api.rst +++ b/docs/api.rst @@ -1755,6 +1755,13 @@ URL encoded payloads can be posted with ``Content-Type: application/x-www-form-u Some JavaScript libraries will post the data incorrectly if you're not careful. For best results try one of the :ref:`clientside_libraries` built for PostgREST. +.. important:: + + It's recommended that you `use triggers instead of rules `_. + Insertion on views with complex `rules `_ might not work out of the box with PostgREST due to its usage of CTEs. + If you want to keep using rules, a workaround is to wrap the view insertion in a stored procedure and call it through the :ref:`s_procs` interface. + For more details, see this `github issue `_. + .. _bulk_insert: Bulk Insert diff --git a/docs/db_authz.rst b/docs/db_authz.rst index 73e8146b95..0659c18871 100644 --- a/docs/db_authz.rst +++ b/docs/db_authz.rst @@ -173,19 +173,19 @@ Note the ``SECURITY DEFINER`` keywords at the end of the function. See `PostgreS Views ===== -Views are invoked with the privileges of the view owner, much like stored procedures with the ``SECURITY DEFINER`` option. When created by a SUPERUSER role, all `row-level security `_ will be bypassed unless a different, non-SUPERUSER owner is specified. +Views are invoked with the privileges of the view owner, much like stored procedures with the ``SECURITY DEFINER`` option. When created by a SUPERUSER role, all `row-level security `_ policies will be bypassed. This is an unsuitable behavior for an API schema. -For changing this, we can create a non-SUPERUSER role and make this role the view's owner. +If you're on PostgreSQL >= 15, this behavior can be changed by specifying the ``security_invoker`` option. .. code-block:: postgres - CREATE ROLE api_views_owner NOINHERIT; - ALTER VIEW sample_view OWNER TO api_views_owner; + CREATE VIEW sample_view WITH (security_invoker = true) AS + SELECT * FROM sample_table; + +On PostgreSQL < 15, you can create a non-SUPERUSER role and make this role the view's owner. -Rules ------ +.. code-block:: postgres + + CREATE ROLE api_views_owner NOSUPERUSER NOBYPASSRLS; + ALTER VIEW sample_view OWNER TO api_views_owner; -Insertion on views with complex `rules `_ might not work out of the box with PostgREST. -It's recommended that you `use triggers instead of rules `_. -If you want to keep using rules, a workaround is to wrap the view insertion in a stored procedure and call it through the :ref:`s_procs` interface. -For more details, see this `github issue `_. From 4fb13ebae6ce50cd830dd40661c1c958585f0534 Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Wed, 3 May 2023 17:22:20 -0300 Subject: [PATCH 555/711] add tables to db authz --- docs/db_authz.rst | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/docs/db_authz.rst b/docs/db_authz.rst index 0659c18871..5e622b1926 100644 --- a/docs/db_authz.rst +++ b/docs/db_authz.rst @@ -104,12 +104,28 @@ This allows you to change the internals of your schema and maintain backwards co .. image:: _static/db.png -Note that you must explicitly allow roles to access the exposed schemas: +You must explicitly allow roles to access the exposed schemas: .. code-block:: postgres GRANT USAGE ON SCHEMA api TO webuser; +Tables +====== + +To let web users access tables you must grant them privileges for the operations you want them to do. + +.. code-block:: postgres + + GRANT + SELECT + , INSERT + , UPDATE(message_body) + , DELETE + ON chat TO webuser; + +You can also choose on which table columns the operation is valid. In the above example, the web user can only update the ``message_body`` column. + .. _func_privs: Functions @@ -173,7 +189,7 @@ Note the ``SECURITY DEFINER`` keywords at the end of the function. See `PostgreS Views ===== -Views are invoked with the privileges of the view owner, much like stored procedures with the ``SECURITY DEFINER`` option. When created by a SUPERUSER role, all `row-level security `_ policies will be bypassed. This is an unsuitable behavior for an API schema. +Views are invoked with the privileges of the view owner, much like stored procedures with the ``SECURITY DEFINER`` option. When created by a SUPERUSER role, all `row-level security `_ policies will be bypassed. If you're on PostgreSQL >= 15, this behavior can be changed by specifying the ``security_invoker`` option. From 837df8b0450ab5921b7eacc72fffb9a58a34b4c3 Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Wed, 3 May 2023 17:32:36 -0300 Subject: [PATCH 556/711] schema cache title is redundant on navbar Use a raw html title for correcting this --- docs/admin.rst | 2 +- docs/errors.rst | 6 +++--- docs/schema_cache.rst | 5 +++-- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/docs/admin.rst b/docs/admin.rst index 36b9e5e6f2..3f427feacc 100644 --- a/docs/admin.rst +++ b/docs/admin.rst @@ -272,7 +272,7 @@ To do this, set the configuration variable :ref:`admin-server-port` to the port The ``live`` endpoint verifies if PostgREST is running on its configured port. A request will return ``200 OK`` if PostgREST is alive or ``503`` otherwise. -The ``ready`` endpoint also checks the state of both the Database Connection and the :ref:`schema_cache`. A request will return ``200 OK`` if it is ready or ``503`` if not. +The ``ready`` endpoint also checks the state of both the Database Connection and the :doc:`Schema Cache `. A request will return ``200 OK`` if it is ready or ``503`` if not. For instance, to verify if PostgREST is running at ``localhost:3000`` while the ``admin-server-port`` is set to ``3001``: diff --git a/docs/errors.rst b/docs/errors.rst index 2d13faa985..e4bc890001 100644 --- a/docs/errors.rst +++ b/docs/errors.rst @@ -23,7 +23,7 @@ For the most part, error messages will come directly from the database with the "message": "relation \"api.nonexistent_table\" does not exist" } -However, some errors do come from PostgREST itself (such as those related to the :ref:`schema_cache`). These have the same structure as the PostgreSQL errors but are differentiated by the ``PGRST`` prefix in the ``code`` field (see :ref:`pgrst_errors`). For instance, when querying a function that does not exist, the error will be: +However, some errors do come from PostgREST itself (such as those related to the :doc:`Schema Cache `). These have the same structure as the PostgreSQL errors but are differentiated by the ``PGRST`` prefix in the ``code`` field (see :ref:`pgrst_errors`). For instance, when querying a function that does not exist, the error will be: .. code-block:: http @@ -137,8 +137,8 @@ Related to the connection with the database. | PGRST001 | | | +---------------+-------------+-------------------------------------------------------------+ | .. _pgrst002: | 503 | Could not connect with the database when building the | -| | | :ref:`schema_cache` due to the PostgreSQL service not | -| PGRST002 | | running. | +| | | :doc:`Schema Cache ` | +| PGRST002 | | due to the PostgreSQL service not running. | +---------------+-------------+-------------------------------------------------------------+ | .. _pgrst003: | 504 | The request timed out waiting for a pool connection | | | | to be available. See :ref:`db-pool-acquisition-timeout`. | diff --git a/docs/schema_cache.rst b/docs/schema_cache.rst index c966a39907..9751e4d51e 100644 --- a/docs/schema_cache.rst +++ b/docs/schema_cache.rst @@ -1,7 +1,8 @@ .. _schema_cache: -Schema Cache -============ +.. raw:: html + +

    Schema Cache

    Certain PostgREST features require metadata from the database schema. Getting this metadata requires executing expensive queries, so in order to avoid repeating this work, PostgREST uses a schema cache. From 9de94274cf3ca5959bff863064b545eccf942dfa Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Wed, 3 May 2023 17:44:36 -0300 Subject: [PATCH 557/711] shorten some paragraphs in errors page --- docs/errors.rst | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/docs/errors.rst b/docs/errors.rst index e4bc890001..2a5831c21d 100644 --- a/docs/errors.rst +++ b/docs/errors.rst @@ -3,7 +3,7 @@ Error Source ============ -For the most part, error messages will come directly from the database with the same `structure that PostgreSQL uses `_. PostgREST will convert the ``MESSAGE``, ``DETAIL``, ``HINT`` and ``ERRCODE`` from the PostgreSQL error to JSON format and add an HTTP status code to the response (see :ref:`status_codes`). For instance, this is the error you will get when querying a nonexistent table: +For the most part, error messages will come directly from the database with the same `structure that PostgreSQL uses `_. PostgREST will convert the ``MESSAGE``, ``DETAIL``, ``HINT`` and ``ERRCODE`` from the PostgreSQL error to JSON and add an HTTP status code to the response. For instance, when querying a nonexistent table: .. code-block:: http @@ -23,7 +23,7 @@ For the most part, error messages will come directly from the database with the "message": "relation \"api.nonexistent_table\" does not exist" } -However, some errors do come from PostgREST itself (such as those related to the :doc:`Schema Cache `). These have the same structure as the PostgreSQL errors but are differentiated by the ``PGRST`` prefix in the ``code`` field (see :ref:`pgrst_errors`). For instance, when querying a function that does not exist, the error will be: +However, some errors do come from PostgREST itself (such as those related to the :doc:`Schema Cache `). These have the same structure as the PostgreSQL errors but are differentiated by the ``PGRST`` prefix in the ``code`` field. For instance, when querying a function that does not exist: .. code-block:: http @@ -116,7 +116,11 @@ PostgREST translates `PostgreSQL error codes ` | -| PGRST002 | | due to the PostgreSQL service not running. | +| PGRST002 | | due to the PostgreSQL service not running. | +---------------+-------------+-------------------------------------------------------------+ | .. _pgrst003: | 504 | The request timed out waiting for a pool connection | | | | to be available. See :ref:`db-pool-acquisition-timeout`. | From 560ec79a9021a61a84b193df54e1037ecb4eb233 Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Thu, 4 May 2023 16:08:47 -0300 Subject: [PATCH 558/711] clarify schema cache and errors page --- docs/errors.rst | 20 +++++--- docs/releases/v8.0.0.rst | 4 +- docs/schema_cache.rst | 100 +++++++-------------------------------- 3 files changed, 34 insertions(+), 90 deletions(-) diff --git a/docs/errors.rst b/docs/errors.rst index 2a5831c21d..5fe83b14d7 100644 --- a/docs/errors.rst +++ b/docs/errors.rst @@ -1,9 +1,14 @@ .. _error_source: -Error Source +Error Format ============ -For the most part, error messages will come directly from the database with the same `structure that PostgreSQL uses `_. PostgREST will convert the ``MESSAGE``, ``DETAIL``, ``HINT`` and ``ERRCODE`` from the PostgreSQL error to JSON and add an HTTP status code to the response. For instance, when querying a nonexistent table: +PostgREST error messages follow the PostgreSQL error structure. It includes ``MESSAGE``, ``DETAIL``, ``HINT``, ``ERRCODE`` and will add an HTTP status code to the response. + +Errors from PostgreSQL +---------------------- + +PostgREST will forward errors coming from PostgreSQL. For instance, when querying a nonexistent table: .. code-block:: http @@ -23,7 +28,10 @@ For the most part, error messages will come directly from the database with the "message": "relation \"api.nonexistent_table\" does not exist" } -However, some errors do come from PostgREST itself (such as those related to the :doc:`Schema Cache `). These have the same structure as the PostgreSQL errors but are differentiated by the ``PGRST`` prefix in the ``code`` field. For instance, when querying a function that does not exist: +Errors from PostgREST +--------------------- + +Errors that come from PostgREST itself maintain the same structure. But differ in the ``PGRST`` prefix in the ``code`` field. For instance, when querying a function that does not exist in the :doc:`schema cache `: .. code-block:: http @@ -37,7 +45,7 @@ However, some errors do come from PostgREST itself (such as those related to the .. code-block:: json { - "hint": "If a new function was created in the database with this name and parameters, try reloading the schema cache.", + "hint": "...", "details": null "code": "PGRST202", "message": "Could not find the api.nonexistent_function() function in the schema cache" @@ -250,7 +258,7 @@ Related to a :ref:`stale schema cache `. Most of the time, these e +---------------+-------------+-------------------------------------------------------------+ | Code | HTTP status | Description | +===============+=============+=============================================================+ -| .. _pgrst200: | 400 | Caused by :ref:`stale_fk_relationships`, otherwise any of | +| .. _pgrst200: | 400 | Caused by stale foreign key relationships, otherwise any of | | | | the embedding resources or the relationship itself may not | | PGRST200 | | exist in the database. | +---------------+-------------+-------------------------------------------------------------+ @@ -258,7 +266,7 @@ Related to a :ref:`stale schema cache `. Most of the time, these e | | | See :ref:`embed_disamb`. | | PGRST201 | | | +---------------+-------------+-------------------------------------------------------------+ -| .. _pgrst202: | 404 | Caused by a :ref:`stale_function_signature`, otherwise | +| .. _pgrst202: | 404 | Caused by a stale function signature, otherwise | | | | the function may not exist in the database. | | PGRST202 | | | +---------------+-------------+-------------------------------------------------------------+ diff --git a/docs/releases/v8.0.0.rst b/docs/releases/v8.0.0.rst index 22b77a736c..69fb70bd2b 100644 --- a/docs/releases/v8.0.0.rst +++ b/docs/releases/v8.0.0.rst @@ -84,11 +84,11 @@ Changed * Modified the default logging level from ``info`` to ``error``. See :ref:`log-level`. |br| -- `@steve-chavez `_ -* Changed the error message for a not found RPC on a stale schema (see :ref:`stale_function_signature`) and for the unsupported case of +* Changed the error message for a not found RPC on a stale schema (see :ref:`stale_schema`) and for the unsupported case of overloaded functions with the same argument names but different types. |br| -- `@laurenceisla `_ -* Changed the error message for the no relationship found error. See :ref:`stale_fk_relationships`. +* Changed the error message for the no relationship found error. See :ref:`stale_schema`. |br| -- `@laurenceisla `_ Fixed diff --git a/docs/schema_cache.rst b/docs/schema_cache.rst index 9751e4d51e..cfd9f0bb21 100644 --- a/docs/schema_cache.rst +++ b/docs/schema_cache.rst @@ -4,8 +4,7 @@

    Schema Cache

    -Certain PostgREST features require metadata from the database schema. Getting this metadata requires executing expensive queries, so -in order to avoid repeating this work, PostgREST uses a schema cache. +Some PostgREST features need metadata from the database schema. Getting this metadata requires expensive queries. To avoid repeating this work, PostgREST uses a schema cache. +--------------------------------------------+-------------------------------------------------------------------------------+ | Feature | Required Metadata | @@ -30,84 +29,19 @@ in order to avoid repeating this work, PostgREST uses a schema cache. .. _stale_schema: -The Stale Schema Cache ----------------------- - -When you make changes on the metadata mentioned above, the schema cache will turn stale on a running PostgREST. Future requests that use the above features will need the :ref:`schema cache to be reloaded `; otherwise, you'll get an error instead of the expected result. - -For instance, let's see what would happen if you have a stale schema cache for foreign key relationships and function signatures. - -.. _stale_fk_relationships: - -Stale Foreign Key Relationships -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -Suppose you add a ``cities`` table to your database and define a foreign key that references an existing ``countries`` table. Then, you make a request to get the ``cities`` and their belonging ``countries``. - -.. tabs:: - - .. code-tab:: http - - GET /cities?select=name,country:countries(id,name) HTTP/1.1 - - .. code-tab:: bash Curl - - curl "http://localhost:3000/cities?select=name,country:countries(id,name)" - -The result will be an error: - -.. code-block:: json - - { - "hint": "Verify that 'cities' and 'countries' exist in the schema 'api' and that there is a foreign key relationship between them. If a new relationship was created, try reloading the schema cache.", - "details": null, - "code": "PGRST200", - "message": "Could not find a relationship between 'cities' and 'countries' in the schema cache" - } +Stale Schema Cache +------------------ -As you can see, PostgREST couldn't find the newly created foreign key in the schema cache. See :ref:`schema_reloading` and :ref:`auto_schema_reloading` to solve this issue. +One operational problem that comes a cache is that it can go stale. This can happen for PostgREST when you make changes to the metadata before mentioned. Requests that depend on the metadata will fail. -.. _stale_function_signature: - -Stale Function Signature -~~~~~~~~~~~~~~~~~~~~~~~~ - -The same issue will occur on newly created functions on a running PostgREST. - -.. code-block:: plpgsql - - CREATE FUNCTION plus_one(num integer) - RETURNS integer AS $$ - SELECT num + 1; - $$ LANGUAGE SQL IMMUTABLE; - -.. tabs:: - - .. code-tab:: http - - GET /rpc/plus_one?num=1 HTTP/1.1 - - .. code-tab:: bash Curl - - curl "http://localhost:3000/rpc/plus_one?num=1" - -.. code-block:: json - - { - "hint": "If a new function was created in the database with this name and parameters, try reloading the schema cache.", - "details": null, - "code": "PGRST202", - "message": "Could not find the api.plus_one(num) function in the schema cache" - } - -Here, PostgREST tries to find the function on the stale schema to no avail. See :ref:`schema_reloading` and :ref:`auto_schema_reloading` to solve this issue. +You can solve this by reloading the cache manually or automatically. .. _schema_reloading: Schema Cache Reloading ---------------------- -To reload the cache without restarting the PostgREST server, send a SIGUSR1 signal to the server process. +To manually reload the cache without restarting the PostgREST server, send a SIGUSR1 signal to the server process. .. code:: bash @@ -123,27 +57,29 @@ For docker you can do: # or in docker-compose docker-compose kill -s SIGUSR1 -There's no downtime when reloading the schema cache. The reloading will happen on a background thread while requests keep being served. +There’s no downtime when reloading the schema cache. The reloading will happen on a background thread while serving requests. .. _schema_reloading_notify: Reloading with NOTIFY ~~~~~~~~~~~~~~~~~~~~~ -There are environments where you can't send the SIGUSR1 Unix Signal (like on managed containers in cloud services or on Windows systems). For this reason, PostgREST also allows you to reload its schema cache through PostgreSQL `NOTIFY `_ as follows: +PostgREST also allows you to reload its schema cache through PostgreSQL `NOTIFY `_. .. code-block:: postgresql NOTIFY pgrst, 'reload schema' -The ``"pgrst"`` notification channel is enabled by default. For configuring the channel, see :ref:`db-channel` and :ref:`db-channel-enabled`. +This is useful in environments where you can’t send the SIGUSR1 Unix Signal. Like on cloud managed containers or on Windows systems. + +The ``pgrst`` notification channel is enabled by default. For configuring the channel, see :ref:`db-channel` and :ref:`db-channel-enabled`. .. _auto_schema_reloading: Automatic Schema Cache Reloading -------------------------------- -You can do automatic schema cache reloading in a pure SQL way and forget about stale schema cache errors with an `event trigger `_ and ``NOTIFY``. +You can do automatic schema cache reloading in a pure SQL way and forget about stale schema cache errors. For this use an `event trigger `_ and ``NOTIFY``. .. code-block:: postgresql @@ -161,9 +97,9 @@ You can do automatic schema cache reloading in a pure SQL way and forget about s ON ddl_command_end EXECUTE PROCEDURE pgrst_watch(); -Now, whenever the ``pgrst_watch`` trigger is fired in the database, PostgREST will automatically reload the schema cache. +Now, whenever the ``pgrst_watch`` trigger fires, PostgREST will auto-reload the schema cache. -To disable auto reloading, drop the trigger: +To disable auto reloading, drop the trigger. .. code-block:: postgresql @@ -172,12 +108,12 @@ To disable auto reloading, drop the trigger: Finer-Grained Event Trigger ~~~~~~~~~~~~~~~~~~~~~~~~~~~ -You can refine the previous event trigger and only react to the events relevant to the schema cache. This also prevents unnecessary -reloading when creating temporary tables(``CREATE TEMP TABLE``) inside functions. +You can refine the previous event trigger to only react to the events relevant to the schema cache. This also prevents unnecessary +reloading when creating temporary tables inside functions. .. code-block:: postgresql - -- watch create and alter + -- watch CREATE and ALTER CREATE OR REPLACE FUNCTION pgrst_ddl_watch() RETURNS event_trigger AS $$ DECLARE cmd record; @@ -204,7 +140,7 @@ reloading when creating temporary tables(``CREATE TEMP TABLE``) inside functions END LOOP; END; $$ LANGUAGE plpgsql; - -- watch drop + -- watch DROP CREATE OR REPLACE FUNCTION pgrst_drop_watch() RETURNS event_trigger AS $$ DECLARE obj record; From 9a3973be351c972208814e36b7d3063789726b67 Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Fri, 5 May 2023 00:09:30 -0300 Subject: [PATCH 559/711] add transactions reference --- docs/api.rst | 264 ++------------------------------ docs/configuration.rst | 2 +- docs/db_authz.rst | 11 +- docs/index.rst | 17 ++- docs/releases/v9.0.0.rst | 2 +- docs/transactions.rst | 320 +++++++++++++++++++++++++++++++++++++++ 6 files changed, 354 insertions(+), 262 deletions(-) create mode 100644 docs/transactions.rst diff --git a/docs/api.rst b/docs/api.rst index e693c5a866..e2b163ecc8 100644 --- a/docs/api.rst +++ b/docs/api.rst @@ -1,6 +1,8 @@ .. role:: sql(code) :language: sql +.. _tables_views: + Tables and Views ================ @@ -2079,21 +2081,18 @@ The PostgREST URL grammar limits the kinds of queries clients can perform. It pr Stored Procedures ================= -Every stored procedure in the API-exposed database schema is accessible under the :code:`/rpc` prefix. The API endpoint supports POST (and in some cases GET) to execute the function. - -.. tabs:: - - .. code-tab:: http +*"A single resource can be the equivalent of a database stored procedure, with the power to abstract state changes over any number of storage items"* -- `Roy T. Fielding `_ - POST /rpc/function_name HTTP/1.1 +Every stored procedure in the exposed database schema is accessible under the :code:`/rpc` prefix. Procedures can perform any operations allowed by PostgreSQL (read data, modify data, and even DDL operations). - .. code-tab:: bash Curl +.. note:: - curl "http://localhost:3000/rpc/function_name" -X POST + The ``/rpc`` prefix is used to avoid name collisions between views and procedures. -Such functions can perform any operations allowed by PostgreSQL (read data, modify data, and even DDL operations). +POST on Stored Procedures +------------------------- -To supply arguments in an API call, include a JSON object in the request payload and each key/value of the object will become an argument. +To supply arguments in an API call, include a JSON object in the request payload. Each key/value of the object will become an argument. For instance, assume we have created this function in the database. @@ -2128,39 +2127,18 @@ The client can call it by posting an object like 3 - -Procedures must be declared with named parameters. Procedures declared like - -.. code-block:: plpgsql - - CREATE FUNCTION non_named_args(integer, text, integer) ... - -cannot be called with PostgREST, since we use `named notation `_ internally. - -Note that PostgreSQL converts identifier names to lowercase unless you quote them like: - -.. code-block:: postgres - - CREATE FUNCTION "someFunc"("someParam" text) ... - -PostgreSQL has four procedural languages that are part of the core distribution: PL/pgSQL, PL/Tcl, PL/Perl, and PL/Python. There are many other procedural languages distributed as additional extensions. Also, plain SQL can be used to write functions (as shown in the example above). - .. note:: - Why the ``/rpc`` prefix? One reason is to avoid name collisions between views and procedures. It also helps emphasize to API consumers that these functions are not normal restful things. The functions can have arbitrary and surprising behavior, not the standard "post creates a resource" thing that users expect from the other routes. - -Immutable and stable functions ------------------------------- - -PostgREST executes POST requests in a read/write transaction except for functions marked as ``IMMUTABLE`` or ``STABLE``. Those must not modify the database and are executed in a read-only transaction compatible for read-replicas. + PostgreSQL converts identifier names to lowercase unless you quote them like: -Procedures that do not modify the database can be called with the HTTP GET verb as well, if desired. PostgREST executes all GET requests in a read-only transaction. Modifying the database inside read-only transactions is not possible and calling volatile functions with GET will fail. + .. code-block:: postgres -.. note:: + CREATE FUNCTION "someFunc"("someParam" text) ... - The `volatility marker `_ is a promise about the behavior of the function. PostgreSQL will let you mark a function that modifies the database as ``IMMUTABLE`` or ``STABLE`` without failure. However, because of the read-only transaction this would still fail with PostgREST. +GET on Stored Procedures +------------------------ -Because ``add_them`` is ``IMMUTABLE``, we can alternately call the function with a GET request: +If the function doesn't modify the database, it will also run under the GET method(see :ref:`access_mode`). .. tabs:: @@ -2801,218 +2779,6 @@ You can also select the schema for :ref:`s_procs` and :ref:`open-api`. These headers are based on the nascent "Content Negotiation by Profile" spec: https://www.w3.org/TR/dx-prof-conneg -.. _http_context: - -HTTP Context -============ - -.. _guc_req_headers_cookies_claims: - -Accessing Request Headers, Cookies and JWT claims -------------------------------------------------- - -You can access request headers, cookies and JWT claims by reading GUC variables set by PostgREST per request. They are named :code:`request.headers`, :code:`request.cookies` and :code:`request.jwt.claims`. - -.. code-block:: postgresql - - -- To read the value of the User-Agent request header: - SELECT current_setting('request.headers', true)::json->>'user-agent'; - - -- To read the value of sessionId in a cookie: - SELECT current_setting('request.cookies', true)::json->>'sessionId'; - - -- To read the value of the email claim in a jwt: - SELECT current_setting('request.jwt.claims', true)::json->>'email'; - - -- To get all the headers sent in the request - SELECT current_setting('request.headers', true)::json; - -.. note:: - - The ``role`` in ``request.jwt.claims`` defaults to the value of :ref:`db-anon-role`. - -.. _guc_legacy_names: - -Legacy GUC variable names -~~~~~~~~~~~~~~~~~~~~~~~~~ - -For PostgreSQL versions below 14, PostgREST will take into consideration the :ref:`db-use-legacy-gucs` config, which is set to true by default. This means that the interface for accessing these GUCs is `the same as in older versions `_. You can opt in to use the JSON GUCs mentioned above by setting the ``db-use-legacy-gucs`` to false. - -.. _guc_req_path_method: - -Accessing Request Path and Method ---------------------------------- - -You can also access the request path and method with :code:`request.path` and :code:`request.method`. - -.. code-block:: postgresql - - -- You can get the path of the request with - SELECT current_setting('request.path', true); - - -- You can get the method of the request with - SELECT current_setting('request.method', true); - -.. _guc_resp_hdrs: - -Setting Response Headers ------------------------- - -PostgREST reads the ``response.headers`` SQL variable to add extra headers to the HTTP response. Stored procedures can modify this variable. For instance, this statement would add caching headers to the response: - -.. code-block:: sql - - -- tell client to cache response for two days - - SELECT set_config('response.headers', - '[{"Cache-Control": "public"}, {"Cache-Control": "max-age=259200"}]', true); - -Notice that the variable should be set to an *array* of single-key objects rather than a single multiple-key object. This is because headers such as ``Cache-Control`` or ``Set-Cookie`` need to be repeated when setting multiple values and an object would not allow the repeated key. - -.. note:: - - PostgREST provided headers such as ``Content-Type``, ``Location``, etc. can be overriden this way. Note that irrespective of overridden ``Content-Type`` response header, the content will still be converted to JSON, unless you also set :ref:`raw-media-types` to something like ``text/html``. - -.. _pre_req_headers: - -Setting headers via pre-request -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -By using a :ref:`db-pre-request` function, you can add headers to GET/POST/PATCH/PUT/DELETE responses. -As an example, let's add some cache headers for all requests that come from an Internet Explorer(6 or 7) browser. - -.. code-block:: postgresql - - create or replace function custom_headers() returns void as $$ - declare - user_agent text := current_setting('request.headers', true)::json->>'user-agent'; - begin - if user_agent similar to '%MSIE (6.0|7.0)%' then - perform set_config('response.headers', - '[{"Cache-Control": "no-cache, no-store, must-revalidate"}]', false); - end if; - end; $$ language plpgsql; - - -- set this function on postgrest.conf - -- db-pre-request = custom_headers - -Now when you make a GET request to a table or view, you'll get the cache headers. - -.. tabs:: - - .. code-tab:: http - - GET /people HTTP/1.1 - User-Agent: Mozilla/4.01 (compatible; MSIE 6.0; Windows NT 5.1) - - .. code-tab:: bash Curl - - curl "http://localhost:3000/people" -i \ - -H "User-Agent: Mozilla/4.01 (compatible; MSIE 6.0; Windows NT 5.1)" - -.. code-block:: http - - HTTP/1.1 200 OK - Content-Type: application/json; charset=utf-8 - Cache-Control: no-cache, no-store, must-revalidate - -.. _guc_resp_status: - -Setting Response Status Code ----------------------------- - -You can set the ``response.status`` GUC to override the default status code PostgREST provides. For instance, the following function would replace the default ``200`` status code. - -.. code-block:: postgres - - create or replace function teapot() returns json as $$ - begin - perform set_config('response.status', '418', true); - return json_build_object('message', 'The requested entity body is short and stout.', - 'hint', 'Tip it over and pour it out.'); - end; - $$ language plpgsql; - -.. tabs:: - - .. code-tab:: http - - GET /rpc/teapot HTTP/1.1 - - .. code-tab:: bash Curl - - curl "http://localhost:3000/rpc/teapot" -i - -.. code-block:: http - - HTTP/1.1 418 I'm a teapot - - { - "message" : "The requested entity body is short and stout.", - "hint" : "Tip it over and pour it out." - } - -If the status code is standard, PostgREST will complete the status message(**I'm a teapot** in this example). - -.. _raise_error: - -Raise errors with HTTP Status Codes ------------------------------------ - -Stored procedures can return non-200 HTTP status codes by raising SQL exceptions. For instance, here's a saucy function that always responds with an error: - -.. code-block:: postgresql - - CREATE OR REPLACE FUNCTION just_fail() RETURNS void - LANGUAGE plpgsql - AS $$ - BEGIN - RAISE EXCEPTION 'I refuse!' - USING DETAIL = 'Pretty simple', - HINT = 'There is nothing you can do.'; - END - $$; - -Calling the function returns HTTP 400 with the body - -.. code-block:: json - - { - "message":"I refuse!", - "details":"Pretty simple", - "hint":"There is nothing you can do.", - "code":"P0001" - } - -.. note:: - - Keep in mind that ``RAISE EXCEPTION`` will abort the transaction and rollback all changes. If you don't want this, you can instead use the :ref:`response.status GUC `. - -One way to customize the HTTP status code is by raising particular exceptions according to the PostgREST :ref:`error to status code mapping `. For example, :code:`RAISE insufficient_privilege` will respond with HTTP 401/403 as appropriate. - -For even greater control of the HTTP status code, raise an exception of the ``PTxyz`` type. For instance to respond with HTTP 402, raise 'PT402': - -.. code-block:: sql - - RAISE sqlstate 'PT402' using - message = 'Payment Required', - detail = 'Quota exceeded', - hint = 'Upgrade your plan'; - -Returns: - -.. code-block:: http - - HTTP/1.1 402 Payment Required - Content-Type: application/json; charset=utf-8 - - { - "message": "Payment Required", - "details": "Quota exceeded", - "hint": "Upgrade your plan", - "code": "PT402" - } - .. _explain_plan: Execution plan diff --git a/docs/configuration.rst b/docs/configuration.rst index cf4e6c8b2d..e43f2d003c 100644 --- a/docs/configuration.rst +++ b/docs/configuration.rst @@ -368,7 +368,7 @@ db-pre-request **In-Database** pgrst.db_pre_request =============== ================= - A schema-qualified stored procedure name to call right after switching roles for a client request. This provides an opportunity to modify SQL variables or raise an exception to prevent the request from completing. + A schema-qualified stored procedure name to call right after the :ref:`tx_settings` are set. See :ref:`pre-request`. .. _db-prepared-statements: diff --git a/docs/db_authz.rst b/docs/db_authz.rst index 5e622b1926..6e3748aad4 100644 --- a/docs/db_authz.rst +++ b/docs/db_authz.rst @@ -57,20 +57,19 @@ Alternately database roles can represent groups instead of (or in addition to) i "email": "john@doe.com" } -SQL code can access claims through GUC variables set by PostgREST per request. For instance to get the email claim, call this function: - -For PostgreSQL server version >= 14 +SQL code can access claims through PostgREST :ref:`tx_settings`. For instance to get the email claim, call this function: .. code:: sql current_setting('request.jwt.claims', true)::json->>'email'; +.. note:: -For PostgreSQL server version < 14 + For PostgreSQL < 14 -.. code:: sql + .. code:: sql - current_setting('request.jwt.claim.email', true); + current_setting('request.jwt.claim.email', true); This allows JWT generation services to include extra information and your database code to react to it. For instance the RLS example could be modified to use this ``current_setting`` rather than ``current_user``. The second ``'true'`` argument tells ``current_setting`` to return NULL if the setting is missing from the current configuration. diff --git a/docs/index.rst b/docs/index.rst index c3e18938ea..fa98bb6b5f 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -125,8 +125,8 @@ Are you new to PostgREST? This is the place to start! Also have a look at :doc:`Installation ` and :ref:`community_tutorials`. -Reference guides ----------------- +References +---------- Technical references for PostgREST's functionality. @@ -142,6 +142,12 @@ Technical references for PostgREST's functionality. api.rst +.. toctree:: + :caption: Transactions + :hidden: + + transactions.rst + .. toctree:: :caption: Configuration :hidden: @@ -162,14 +168,15 @@ Technical references for PostgREST's functionality. - :doc:`Authentication ` - :doc:`API ` +- :doc:`Transactions ` - :doc:`configuration` - :doc:`Schema Cache ` - :doc:`Errors ` -Topic guides +Explanations ------------ -Explanations of some key concepts in PostgREST. +Key concepts in PostgREST. .. toctree:: :caption: Database Authorization @@ -198,7 +205,7 @@ Explanations of some key concepts in PostgREST. How-to guides ------------- -These are recipes that'll help you address specific use-cases. +Recipes that'll help you address specific use-cases. .. toctree:: :glob: diff --git a/docs/releases/v9.0.0.rst b/docs/releases/v9.0.0.rst index 236ebf0e37..5963e82377 100644 --- a/docs/releases/v9.0.0.rst +++ b/docs/releases/v9.0.0.rst @@ -12,7 +12,7 @@ PostgreSQL 14 compatibility PostgreSQL 14 Beta 1 tightened its GUC naming scheme making it impossible to use multiple dots (``.``) and dashes (``-``) on custom GUC parameters, this caused our `old HTTP Context `_ to fail across all requests. Thankfully, `@robertsosinski `_ got the PostgreSQL team to reconsider allowing multiple dots in the GUC name, allowing us to avoid a major breaking change. You can see the full discussion `here `_. -Still, dashes cannot be used on PostgreSQL 14 custom GUC parameters, so we changed our HTTP Context :ref:`to namespace using a mix of dots and JSON `. On older PostgreSQL versions we still use the :ref:`guc_legacy_names`. If you wish to use the new JSON GUCs on these versions, set the :ref:`db-use-legacy-gucs` config option to false. +Still, dashes cannot be used on PostgreSQL 14 custom GUC parameters, so we changed our HTTP Context :ref:`to namespace using a mix of dots and JSON `. On older PostgreSQL versions we still use the settings legacy names. If you wish to use the new JSON GUCs on these versions, set the :ref:`db-use-legacy-gucs` config option to false. Resource Embedding with Top-level Filtering ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ diff --git a/docs/transactions.rst b/docs/transactions.rst new file mode 100644 index 0000000000..d86ea9818d --- /dev/null +++ b/docs/transactions.rst @@ -0,0 +1,320 @@ +.. raw:: html + +

    Transactions

    + +Every :doc:`authenticated ` request to an :doc:`API resource ` runs inside a transaction. The sequence of the transaction is as follows: + +.. code-block:: postgresql + + BEGIN; -- + -- + --
    ; + END; + +.. _access_mode: + +Access Mode +=========== + +The access mode on :ref:`tables_views` is determined by the HTTP method. + +.. list-table:: + :header-rows: 1 + + * - HTTP Method + - Access Method + * - GET, HEAD + - READ ONLY + * - POST, PATCH, PUT, DELETE + - READ WRITE + +:ref:`s_procs` additionally depend on the function `volatility `_. + +.. list-table:: + :header-rows: 2 + + * - + - Access Method + - + - + * - HTTP Method + - VOLATILE + - STABLE + - IMMUTABLE + * - GET, HEAD + - READ ONLY + - READ ONLY + - READ ONLY + * - POST + - READ WRITE + - READ ONLY + - READ ONLY + +Modifying the database inside READ ONLY transactions is not possible. PostgREST uses this fact to enforce HTTP semantics in GET and HEAD requests. + +.. note:: + + The volatility marker is a promise about the behavior of the function. PostgreSQL will let you mark a function that modifies the database as ``IMMUTABLE`` or ``STABLE`` without failure. But, because of the READ ONLY transaction the function will fail under PostgREST. + +The :ref:`options_requests` method doesn't start a transaction, so it's not relevant here. + +Isolation Level +=============== + +Every transaction uses the PostgreSQL default isolation level: READ COMMITTED. + +.. _tx_settings: + +Transaction-Scoped Settings +=========================== + +PostgREST uses settings tied to the transaction lifetime. These can be used to get data about the HTTP request. Or to modify the HTTP response. + +You can get these with ``current_setting`` + +.. code-block:: postgresql + + -- request settings use the ``request.`` prefix. + SELECT + current_setting('request.', true); + +And you can set them with ``set_config`` + +.. code-block:: postgresql + + -- response settings use the ``response.`` prefix. + SELECT + set_config('response.setting1', 'value1' ,true); + +Request Role and Search Path +----------------------------- + +Because of :ref:`user_impersonation`, PostgREST sets the standard ``role``. You can get this in different ways: + +.. code-block:: postgresql + + SELECT current_role; + + SELECT current_user; + + SELECT current_setting('role', true); + +Additionally it also sets the ``search_path`` based on :ref:`db-schemas` and :ref:`db-extra-search-path`. + + +.. _guc_req_headers_cookies_claims: + +Request Headers, Cookies and JWT claims +--------------------------------------- + +PostgREST stores the headers, cookies and headers as JSON. To get them: + +.. code-block:: postgresql + + -- To get all the headers sent in the request + SELECT current_setting('request.headers', true)::json; + + -- To get a single header, you can use JSON arrow operators + SELECT current_setting('request.headers', true)::json->>'user-agent'; + + -- value of sessionId in a cookie + SELECT current_setting('request.cookies', true)::json->>'sessionId'; + + -- value of the email claim in a jwt + SELECT current_setting('request.jwt.claims', true)::json->>'email'; + +.. note:: + + The ``role`` in ``request.jwt.claims`` defaults to the value of :ref:`db-anon-role`. + +.. _guc_req_path_method: + +Request Path and Method +----------------------- + +The path and method are stored as ``text``. + +.. code-block:: postgresql + + SELECT current_setting('request.path', true); + + SELECT current_setting('request.method', true); + +.. _guc_resp_hdrs: + +Response Headers +---------------- + +You can set ``response.headers`` to add headers to the HTTP response. For instance, this statement would add caching headers to the response: + +.. code-block:: sql + + -- tell client to cache response for two days + + SELECT set_config('response.headers', + '[{"Cache-Control": "public"}, {"Cache-Control": "max-age=259200"}]', true); + +.. code-block:: http + + HTTP/1.1 200 OK + Content-Type: application/json; charset=utf-8 + Cache-Control: no-cache, no-store, must-revalidate + +Notice that the ``response.headers`` should be set to an *array* of single-key objects rather than a single multiple-key object. This is because headers such as ``Cache-Control`` or ``Set-Cookie`` need repeating when setting many values. An object would not allow the repeated key. + +.. note:: + + PostgREST provided headers such as ``Content-Type``, ``Location``, etc. can be overriden this way. Note that irrespective of overridden ``Content-Type`` response header, the content will still be converted to JSON, unless you also set :ref:`raw-media-types` to something like ``text/html``. + +.. _guc_resp_status: + +Response Status Code +-------------------- + +You can set the ``response.status`` to override the default status code PostgREST provides. For instance, the following function would replace the default ``200`` status code. + +.. code-block:: postgres + + create or replace function teapot() returns json as $$ + begin + perform set_config('response.status', '418', true); + return json_build_object('message', 'The requested entity body is short and stout.', + 'hint', 'Tip it over and pour it out.'); + end; + $$ language plpgsql; + +.. tabs:: + + .. code-tab:: http + + GET /rpc/teapot HTTP/1.1 + + .. code-tab:: bash Curl + + curl "http://localhost:3000/rpc/teapot" -i + +.. code-block:: http + + HTTP/1.1 418 I'm a teapot + + { + "message" : "The requested entity body is short and stout.", + "hint" : "Tip it over and pour it out." + } + +If the status code is standard, PostgREST will complete the status message(**I'm a teapot** in this example). + +Main query +========== + +The main query is produced by requesting the :doc:`API resources `. + +Transaction End +=============== + +If the transaction doesn't fail, it will always end in a COMMIT. Unless :ref:`db-tx-end` is configured to ROLLBACK in any case or conditionally with ``Prefer: tx=rollback``. This can be used for testing purposes. + +Aborting transactions +===================== + +Any database failure(like a failed constraint) will result in a rollback of the transaction. You can also do a RAISE inside a function to cause a rollback. + +.. _raise_error: + +Raise errors with HTTP Status Codes +----------------------------------- + +You can return non-200 HTTP status codes by raising SQL exceptions. For instance, here's a saucy function that always responds with an error: + +.. code-block:: postgresql + + CREATE OR REPLACE FUNCTION just_fail() RETURNS void + LANGUAGE plpgsql + AS $$ + BEGIN + RAISE EXCEPTION 'I refuse!' + USING DETAIL = 'Pretty simple', + HINT = 'There is nothing you can do.'; + END + $$; + +Calling the function returns HTTP 400 with the body + +.. code-block:: json + + { + "message":"I refuse!", + "details":"Pretty simple", + "hint":"There is nothing you can do.", + "code":"P0001" + } + +One way to customize the HTTP status code is by raising particular exceptions according to the PostgREST :ref:`error to status code mapping `. For example, :code:`RAISE insufficient_privilege` will respond with HTTP 401/403 as appropriate. + +For even greater control of the HTTP status code, raise an exception of the ``PTxyz`` type. For instance to respond with HTTP 402, raise 'PT402': + +.. code-block:: sql + + RAISE sqlstate 'PT402' using + message = 'Payment Required', + detail = 'Quota exceeded', + hint = 'Upgrade your plan'; + +Returns: + +.. code-block:: http + + HTTP/1.1 402 Payment Required + Content-Type: application/json; charset=utf-8 + + { + "message": "Payment Required", + "details": "Quota exceeded", + "hint": "Upgrade your plan", + "code": "PT402" + } + +.. _pre-request: + +Pre-Request +=========== + +The pre-request is a function that can run after the :ref:`tx_settings` are set and before the main query. It's enabled with :ref:`db-pre-request`. + +This provides an opportunity to modify settings or raise an exception to prevent the request from completing. + +.. _pre_req_headers: + +Setting headers via pre-request +------------------------------- + +As an example, let's add some cache headers for all requests that come from an Internet Explorer(6 or 7) browser. + +.. code-block:: postgresql + + create or replace function custom_headers() returns void as $$ + declare + user_agent text := current_setting('request.headers', true)::json->>'user-agent'; + begin + if user_agent similar to '%MSIE (6.0|7.0)%' then + perform set_config('response.headers', + '[{"Cache-Control": "no-cache, no-store, must-revalidate"}]', false); + end if; + end; $$ language plpgsql; + + -- set this function on postgrest.conf + -- db-pre-request = custom_headers + +Now when you make a GET request to a table or view, you'll get the cache headers. + +.. tabs:: + + .. code-tab:: http + + GET /people HTTP/1.1 + User-Agent: Mozilla/4.01 (compatible; MSIE 6.0; Windows NT 5.1) + + .. code-tab:: bash Curl + + curl "http://localhost:3000/people" -i \ + -H "User-Agent: Mozilla/4.01 (compatible; MSIE 6.0; Windows NT 5.1)" From 2e1dc0738a27e0d41a73ce0cc634a2c7a4f635d7 Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Fri, 5 May 2023 10:00:49 -0300 Subject: [PATCH 560/711] readthedocs doesn't build anymore Pin the python version to solve it. --- .readthedocs.yaml | 4 ++++ requirements.txt | 3 ++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/.readthedocs.yaml b/.readthedocs.yaml index 3bce02afa5..4690fde9d5 100644 --- a/.readthedocs.yaml +++ b/.readthedocs.yaml @@ -4,3 +4,7 @@ sphinx: python: install: - requirements: requirements.txt +build: + os: ubuntu-22.04 + tools: + python: "3.11" diff --git a/requirements.txt b/requirements.txt index 57ed0b59fe..4f76b0480b 100644 --- a/requirements.txt +++ b/requirements.txt @@ -2,4 +2,5 @@ docutils==0.16 sphinx>=4.3.0 sphinx-copybutton sphinx-rtd-theme>=0.5.1 -sphinx-tabs \ No newline at end of file +sphinx-tabs +urllib3==2.0.2 From 082e9b14e9f02ca6c30984edff3059a0ab007f2f Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Fri, 5 May 2023 11:22:32 -0300 Subject: [PATCH 561/711] transactions reference doesn't consider anon reqs Change authenticated to user impersonation. --- docs/transactions.rst | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/docs/transactions.rst b/docs/transactions.rst index d86ea9818d..7a73131c03 100644 --- a/docs/transactions.rst +++ b/docs/transactions.rst @@ -2,7 +2,7 @@

    Transactions

    -Every :doc:`authenticated ` request to an :doc:`API resource ` runs inside a transaction. The sequence of the transaction is as follows: +After :ref:`user_impersonation`, every request to an :doc:`API resource ` runs inside a transaction. The sequence of the transaction is as follows: .. code-block:: postgresql @@ -84,7 +84,7 @@ And you can set them with ``set_config`` -- response settings use the ``response.`` prefix. SELECT - set_config('response.setting1', 'value1' ,true); + set_config('response.', 'value1' ,true); Request Role and Search Path ----------------------------- @@ -204,6 +204,8 @@ You can set the ``response.status`` to override the default status code PostgRES If the status code is standard, PostgREST will complete the status message(**I'm a teapot** in this example). +.. _main_query: + Main query ========== @@ -279,7 +281,7 @@ Returns: Pre-Request =========== -The pre-request is a function that can run after the :ref:`tx_settings` are set and before the main query. It's enabled with :ref:`db-pre-request`. +The pre-request is a function that can run after the :ref:`tx_settings` are set and before the :ref:`main_query`. It's enabled with :ref:`db-pre-request`. This provides an opportunity to modify settings or raise an exception to prevent the request from completing. @@ -292,7 +294,8 @@ As an example, let's add some cache headers for all requests that come from an I .. code-block:: postgresql - create or replace function custom_headers() returns void as $$ + create or replace function custom_headers() + returns void as $$ declare user_agent text := current_setting('request.headers', true)::json->>'user-agent'; begin From 36300da16dbd0237d853639539930589d518901e Mon Sep 17 00:00:00 2001 From: Steve Chavez Date: Sun, 7 May 2023 12:25:12 -0300 Subject: [PATCH 562/711] connection pool reference (#616) * add link in index to external jwt * change pgrst errors location for better reading --- docs/admin.rst | 24 ------------ docs/configuration.rst | 6 +-- docs/connection_pool.rst | 83 ++++++++++++++++++++++++++++++++++++++++ docs/errors.rst | 47 ++++++++++++----------- docs/index.rst | 8 ++++ docs/install.rst | 12 +++--- 6 files changed, 124 insertions(+), 56 deletions(-) create mode 100644 docs/connection_pool.rst diff --git a/docs/admin.rst b/docs/admin.rst index 3f427feacc..ecd7972d12 100644 --- a/docs/admin.rst +++ b/docs/admin.rst @@ -132,19 +132,6 @@ The burst argument tells Nginx to start dropping requests if more than five queu Nginx rate limiting is general and indiscriminate. To rate limit each authenticated request individually you will need to add logic in a :ref:`Custom Validation ` function. -.. _external_connection_poolers: - -Using External Connection Poolers ---------------------------------- - -PostgREST manages its :ref:`own pool of connections ` and uses prepared statements by default in order to increase performance. However, this setting is incompatible with external connection poolers such as PgBouncer working in transaction pooling mode. In this case, you need to set the :ref:`db-prepared-statements` config option to ``false``. On the other hand, session pooling is fully compatible with PostgREST, while statement pooling is not compatible at all. - -.. note:: - - If prepared statements are enabled, PostgREST will quit after detecting that transaction or statement pooling is being used. - -You should also set the :ref:`db-channel-enabled` config option to ``false``, due to the ``LISTEN`` command not being compatible with transaction pooling, although it should not give any errors if it's left enabled by default. - Debugging ========= @@ -205,17 +192,6 @@ A great way to inspect incoming HTTP requests including headers and query parame The options to ngrep vary depending on the address and host on which you've bound the server. The binding is described in the :ref:`configuration` section. The ngrep output isn't particularly pretty, but it's legible. -.. _automatic_recovery: - -Automatic Connection Recovery ------------------------------ - -When PostgREST loses the connection to the database, it retries the connection using capped exponential backoff, with 32 seconds being the maximum backoff time. - -This retry behavior is triggered immediately after the connection is lost if :ref:`db-channel-enabled` is set to true(the default), otherwise it will be activated once a request is made. - -To notify the client when the next reconnection attempt will be, PostgREST responds with ``503 Service Unavailable`` and the ``Retry-After: x`` header, where ``x`` is the number of seconds programmed for the next retry. - Database Logs ------------- diff --git a/docs/configuration.rst b/docs/configuration.rst index e43f2d003c..25d8e9282d 100644 --- a/docs/configuration.rst +++ b/docs/configuration.rst @@ -330,7 +330,7 @@ db-pool **In-Database** `n/a` =============== ================= - Number of connections to keep open in PostgREST's database pool. Having enough here for the maximum expected simultaneous client connections can improve performance. Note it's pointless to set this higher than the :code:`max_connections` GUC in your database. + Number of maximum connections to keep open in PostgREST's database pool. .. _db-pool-acquisition-timeout: @@ -342,7 +342,7 @@ db-pool-acquisition-timeout **In-Database** `n/a` =============== ================= - Specifies the maximum time in seconds that the request will wait for the pool to free up a connection slot to the database. If it times out without acquiring a connection, then the request is aborted and a ``504`` error is returned. + Specifies the maximum time in seconds that the request will wait for the pool to free up a connection slot to the database. .. _db-pool-max-lifetime: @@ -354,7 +354,7 @@ db-pool-max-lifetime **In-Database** `n/a` =============== ================= - Specifies the maximum time in seconds of an existing connection in the pool. When this lifetime is reached, then the connection will be closed and returned to the pool. + Specifies the maximum time in seconds of an existing connection in the pool. .. _db-pre-request: diff --git a/docs/connection_pool.rst b/docs/connection_pool.rst new file mode 100644 index 0000000000..9bb38c3c67 --- /dev/null +++ b/docs/connection_pool.rst @@ -0,0 +1,83 @@ +Connection Pool +--------------- + +Every request to an :doc:`API resource ` borrows a connection from the connection pool to start a :doc:`transaction `. + +A connection pool is a cache of reusable database connections. It allows serving many HTTP requests using few database connections. + +Minimizing connections it’s paramount to performance. Each PostgreSQL connection creates a process, having too many can exhaust available resources. + +.. _pool_growth_limit: + +Growth Limit +------------ + +If all the connections are being used, a new connection is added to the pool. The pool can grow until it reaches the :ref:`db-pool` size. + +Note it’s pointless to set this higher than the ``max_connections`` setting in your database. + +Connection lifetime +------------------- + +After a period of time, connections from the pool will be released and news ones will be created. This time is specified by :ref:`db-pool-max-lifetime`. + +The lifetime doesn't affect running requests. Only unused connections will be released. + +For knowing why a connection lifetime is necessary, see the following discussion: +https://www.postgresql.org/message-id/flat/CA%2Bmi_8bnvpxHZtb6EgHSHY-xn29W8VJMzjPU3fiCOv1bfjrNuA%40mail.gmail.com. + +Acquisition Timeout +------------------- + +If all the available connections in the pool are busy, an HTTP request will wait until reaching a timeout. You can configure this timeout with :ref:`db-pool-acquisition-timeout`. + +If the request reaches the timeout, it will be aborted with the following response: + +.. code-block:: http + + HTTP/1.1 504 Gateway Timeout + + {"code":"PGRST003", + "details":null, + "hint":null, + "message":"Timed out acquiring connection from connection pool."} + +Getting this error message is an indicator of a performance issue. To solve it, you can: + +- Reduce your queries execution time. + + - Check the request :ref:`explain_plan` to tune your query, this usually means adding indexes. + +- Reduce the amount of requests. + + - Reduce write requests. Do :ref:`bulk_insert` (or :ref:`upsert`) instead of inserting rows one by one. + - Reduce read requests. Use :ref:`resource_embedding`. Combine unrelated data into a single request using custom database views or functions. + - Use :ref:`s_procs` for combining read and write logic into a single request. + +- Increase the :ref:`pool growth limit `. + + - Not a panacea since connections can't grow infinitely. Try the previous recommendations before this. + +.. _automatic_recovery: + +Automatic Recovery +------------------ + +If the pool loses the connection to the database, it will retry reconnecting using exponential backoff. With 32 seconds being the maximum backoff time between retries. + +The retries happen immediately after a connection loss, if :ref:`db-channel-enabled` is set to true(the default). Otherwise they'll happen once a request arrives. + +To notify the client of the next retry, the server sends a ``503 Service Unavailable`` status with the ``Retry-After: x`` header. Where ``x`` is the number of seconds programmed for the next retry. + +.. _external_connection_poolers: + +Using External Connection Poolers +--------------------------------- + +It's possible to use external connection poolers, such as PgBouncer. Session pooling is compatible, while transaction pooling requires :ref:`db-prepared-statements` set to ``false``. Statement pooling is not compatible with PostgREST. + +Also set :ref:`db-channel-enabled` to ``false`` since ``LISTEN`` is not compatible with transaction pooling. Although it should not give any errors if left enabled. + +.. note:: + + It’s not recommended to use an external connection pooler. `Our benchmarks `_ indicate it provides much lower performance than PostgREST built-in pool. diff --git a/docs/errors.rst b/docs/errors.rst index 5fe83b14d7..74c4a3f84a 100644 --- a/docs/errors.rst +++ b/docs/errors.rst @@ -28,29 +28,6 @@ PostgREST will forward errors coming from PostgreSQL. For instance, when queryin "message": "relation \"api.nonexistent_table\" does not exist" } -Errors from PostgREST ---------------------- - -Errors that come from PostgREST itself maintain the same structure. But differ in the ``PGRST`` prefix in the ``code`` field. For instance, when querying a function that does not exist in the :doc:`schema cache `: - -.. code-block:: http - - POST /rpc/nonexistent_function HTTP/1.1 - -.. code-block:: http - - HTTP/1.1 404 Not Found - Content-Type: application/json; charset=utf-8 - -.. code-block:: json - - { - "hint": "...", - "details": null - "code": "PGRST202", - "message": "Could not find the api.nonexistent_function() function in the schema cache" - } - .. _status_codes: HTTP Status Codes @@ -119,6 +96,30 @@ PostgREST translates `PostgreSQL error codes `: + +.. code-block:: http + + POST /rpc/nonexistent_function HTTP/1.1 + +.. code-block:: http + + HTTP/1.1 404 Not Found + Content-Type: application/json; charset=utf-8 + +.. code-block:: json + + { + "hint": "...", + "details": null + "code": "PGRST202", + "message": "Could not find the api.nonexistent_function() function in the schema cache" + } + + .. _pgrst_errors: PostgREST Error Codes diff --git a/docs/index.rst b/docs/index.rst index fa98bb6b5f..24ff6547bd 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -148,6 +148,12 @@ Technical references for PostgREST's functionality. transactions.rst +.. toctree:: + :caption: Connection Pool + :hidden: + + connection_pool.rst + .. toctree:: :caption: Configuration :hidden: @@ -169,6 +175,7 @@ Technical references for PostgREST's functionality. - :doc:`Authentication ` - :doc:`API ` - :doc:`Transactions ` +- :doc:`Connection pool ` - :doc:`configuration` - :doc:`Schema Cache ` - :doc:`Errors ` @@ -235,6 +242,7 @@ PostgREST has a growing ecosystem of examples, libraries, and experiments. Here ecosystem.rst +* :ref:`external_jwt` * :ref:`community_tutorials` * :ref:`templates` * :ref:`eco_example_apps` diff --git a/docs/install.rst b/docs/install.rst index 8ba9f56d4d..508f830b03 100644 --- a/docs/install.rst +++ b/docs/install.rst @@ -289,7 +289,7 @@ Deploying to Heroku # wait until the add-on is available heroku pg:wait -a ${YOUR_APP_NAME} -4. Create the necessary user roles according to the +4. Create the necessary user roles according to the `PostgREST documentation `_: .. code-block:: bash @@ -330,7 +330,7 @@ Deploying to Heroku web: PGRST_SERVER_HOST=0.0.0.0 PGRST_SERVER_PORT=${PORT} PGRST_DB_URI=${PGRST_DB_URI:-${DATABASE_URL}} ./postgrest-${POSTGREST_VER} .. - + Set the following environment variables on Heroku: .. code-block:: bash @@ -340,7 +340,7 @@ Deploying to Heroku heroku config:set PGRST_DB_ANON_ROLE=api_user .. - PGRST_DB_URI can be set if an external database is used or if it's different from the default Heroku DATABASE_URL. This latter is used if nothing is provided. + PGRST_DB_URI can be set if an external database is used or if it's different from the default Heroku DATABASE_URL. This latter is used if nothing is provided. POSTGREST_VER is mandatory to select and build the required PostgREST release. See https://postgrest.org/en/stable/configuration.html#environment-variables for the full list of environment variables. @@ -368,9 +368,9 @@ Deploying to Heroku From a different terminal retrieve with curl the records previously created: .. code-block:: bash - + curl https://${YOUR_APP_NAME}.herokuapp.com/todos - .. + .. and test that any attempt to modify the table via a read-only user is not allowed: @@ -378,4 +378,4 @@ Deploying to Heroku curl https://${YOUR_APP_NAME}.herokuapp.com/todos -X POST \ -H "Content-Type: application/json" \ - -d '{"task": "do bad thing"}' + -d '{"task": "do bad thing"}' From 79620396edc776ed8ebf969ae05c5af9afb99277 Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Sun, 7 May 2023 13:03:58 -0300 Subject: [PATCH 563/711] remove manual inclusion of pages on index * drop unavailable doc pages from release notes * rename releases pages so they order in TOC --- docs/_static/css/custom.css | 20 +++ docs/{ => explanations}/admin.rst | 10 +- docs/{ => explanations}/db_authz.rst | 7 +- docs/{ => explanations}/install.rst | 4 +- docs/index.rst | 141 +++------------- docs/{ => references}/api.rst | 9 +- docs/{ => references}/auth.rst | 11 +- docs/{ => references}/configuration.rst | 8 +- docs/{ => references}/connection_pool.rst | 2 +- docs/{ => references}/errors.rst | 22 +-- docs/{ => references}/schema_cache.rst | 5 +- docs/{ => references}/transactions.rst | 33 ++-- docs/releases/{v9.0.0.rst => v09.0.0.rst} | 8 +- docs/releases/{v9.0.1.rst => v09.0.1.rst} | 4 +- docs/releases/v10.0.0.rst | 8 +- docs/releases/v10.2.0.rst | 4 +- docs/releases/v5.2.0.rst | 26 --- docs/releases/v6.0.2.rst | 79 --------- docs/releases/v7.0.0.rst | 106 ------------ docs/releases/v7.0.1.rst | 69 -------- docs/releases/v8.0.0.rst | 191 ---------------------- docs/tutorials/tut0.rst | 2 +- postgrest.dict | 1 + 23 files changed, 113 insertions(+), 657 deletions(-) rename docs/{ => explanations}/admin.rst (98%) rename docs/{ => explanations}/db_authz.rst (98%) rename docs/{ => explanations}/install.rst (99%) rename docs/{ => references}/api.rst (99%) rename docs/{ => references}/auth.rst (98%) rename docs/{ => references}/configuration.rst (99%) rename docs/{ => references}/connection_pool.rst (99%) rename docs/{ => references}/errors.rst (99%) rename docs/{ => references}/schema_cache.rst (99%) rename docs/{ => references}/transactions.rst (96%) rename docs/releases/{v9.0.0.rst => v09.0.0.rst} (96%) rename docs/releases/{v9.0.1.rst => v09.0.1.rst} (99%) delete mode 100644 docs/releases/v5.2.0.rst delete mode 100644 docs/releases/v6.0.2.rst delete mode 100644 docs/releases/v7.0.0.rst delete mode 100644 docs/releases/v7.0.1.rst delete mode 100644 docs/releases/v8.0.0.rst diff --git a/docs/_static/css/custom.css b/docs/_static/css/custom.css index fc7f2edb68..7000d0fce1 100644 --- a/docs/_static/css/custom.css +++ b/docs/_static/css/custom.css @@ -65,3 +65,23 @@ div.line-block { .wy-table-responsive { overflow: visible !important; } + +#tutorials span.caption-text { + display: none; +} + +#references span.caption-text { + display: none; +} + +#explanations span.caption-text { + display: none; +} + +#how-tos span.caption-text { + display: none; +} + +#ecosystem span.caption-text { + display: none; +} diff --git a/docs/admin.rst b/docs/explanations/admin.rst similarity index 98% rename from docs/admin.rst rename to docs/explanations/admin.rst index ecd7972d12..1315ae14ab 100644 --- a/docs/admin.rst +++ b/docs/explanations/admin.rst @@ -1,5 +1,8 @@ .. _admin: +Admin +##### + Hardening PostgREST =================== @@ -140,11 +143,6 @@ Server Version When debugging a problem it's important to verify the PostgREST version. At any time you can make a request to the running server and determine exactly which version is deployed. Look for the :code:`Server` HTTP response header, which contains the version number. -Errors ------- - -See the :doc:`Errors ` reference page for detailed information on the errors that PostgREST returns. - .. _pgrst_logging: Logging @@ -248,7 +246,7 @@ To do this, set the configuration variable :ref:`admin-server-port` to the port The ``live`` endpoint verifies if PostgREST is running on its configured port. A request will return ``200 OK`` if PostgREST is alive or ``503`` otherwise. -The ``ready`` endpoint also checks the state of both the Database Connection and the :doc:`Schema Cache `. A request will return ``200 OK`` if it is ready or ``503`` if not. +The ``ready`` endpoint also checks the state of both the Database Connection and the :ref:`schema_cache`. A request will return ``200 OK`` if it is ready or ``503`` if not. For instance, to verify if PostgREST is running at ``localhost:3000`` while the ``admin-server-port`` is set to ``3001``: diff --git a/docs/db_authz.rst b/docs/explanations/db_authz.rst similarity index 98% rename from docs/db_authz.rst rename to docs/explanations/db_authz.rst index 6e3748aad4..eb6b3041bc 100644 --- a/docs/db_authz.rst +++ b/docs/explanations/db_authz.rst @@ -1,6 +1,7 @@ -.. raw:: html +.. _db_authz: -

    Database Authorization

    +Database Authorization +###################### Database authorization is the process of granting and verifying database access permissions. PostgreSQL manages permissions using the concept of roles. @@ -101,7 +102,7 @@ A PostgREST instance exposes all the tables, views, and stored procedures of the It is recommended that you don't expose tables on the schemas you expose, instead expose views and stored procedures which insulate the internal details from the outside world. This allows you to change the internals of your schema and maintain backwards compatibility. It also keeps your code easier to refactor, and provides a natural way to do API versioning. -.. image:: _static/db.png +.. image:: ../_static/db.png You must explicitly allow roles to access the exposed schemas: diff --git a/docs/install.rst b/docs/explanations/install.rst similarity index 99% rename from docs/install.rst rename to docs/explanations/install.rst index 508f830b03..8d3a6455a5 100644 --- a/docs/install.rst +++ b/docs/explanations/install.rst @@ -1,7 +1,7 @@ .. _install: Installation -============ +############ The release page has `pre-compiled binaries for Mac OS X, Windows, Linux and FreeBSD `_ . The Linux binary is a static executable that can be run on any Linux distribution. @@ -95,7 +95,7 @@ For a complete reference of the configuration file, see :ref:`configuration`. If you see a dialog box like this on Windows, it may be that the :code:`pg_config` program is not in your system path. - .. image:: _static/win-err-dialog.png + .. image:: ../_static/win-err-dialog.png It usually lives in :code:`C:\Program Files\PostgreSQL\\bin`. See this `article `_ about how to modify the system path. diff --git a/docs/index.rst b/docs/index.rst index 24ff6547bd..e0931674cd 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -95,18 +95,10 @@ The project has a friendly and growing community. Join our `chat room - v10.0.0 - v9.0.1 - v9.0.0 - releases/v8.0.0 - releases/v7.0.1 - releases/v7.0.0 - releases/v6.0.2 - releases/v5.2.0 + :reversed: + :maxdepth: 1 + + releases/* Tutorials --------- @@ -116,14 +108,11 @@ Are you new to PostgREST? This is the place to start! .. toctree:: :glob: :caption: Tutorials - :hidden: + :maxdepth: 1 tutorials/* -- :doc:`tutorials/tut0` -- :doc:`tutorials/tut1` - -Also have a look at :doc:`Installation ` and :ref:`community_tutorials`. +Also have a look at :ref:`install` and :ref:`community_tutorials`. References ---------- @@ -131,54 +120,12 @@ References Technical references for PostgREST's functionality. .. toctree:: - :caption: Authentication - :hidden: - - auth.rst - -.. toctree:: - :caption: API - :hidden: - - api.rst - -.. toctree:: - :caption: Transactions - :hidden: - - transactions.rst - -.. toctree:: - :caption: Connection Pool - :hidden: - - connection_pool.rst - -.. toctree:: - :caption: Configuration - :hidden: - - configuration.rst - -.. toctree:: - :caption: Schema Cache - :hidden: - - schema_cache.rst - -.. toctree:: - :caption: Errors - :hidden: - - errors.rst + :glob: + :caption: References + :name: references + :maxdepth: 1 -- :doc:`Authentication ` -- :doc:`API ` -- :doc:`Transactions ` -- :doc:`Connection pool ` -- :doc:`configuration` -- :doc:`Schema Cache ` -- :doc:`Errors ` + references/* Explanations ------------ @@ -186,50 +133,25 @@ Explanations Key concepts in PostgREST. .. toctree:: - :caption: Database Authorization - :hidden: - - db_authz.rst - -.. toctree:: - :caption: Administration - :hidden: - - admin.rst - -.. toctree:: - :caption: Installation - :hidden: - - install.rst - -- :doc:`Database Authorization ` -- :doc:`Administration ` -- :doc:`Installation ` + :glob: + :caption: Explanations + :name: explanations + :maxdepth: 1 -.. _how_tos: + explanations/* -How-to guides -------------- +How-tos +------- Recipes that'll help you address specific use-cases. .. toctree:: :glob: :caption: How-to guides - :hidden: - - how-tos/sql-user-management - how-tos/working-with-postgresql-data-types - how-tos/sql-user-management-using-postgres-users-and-passwords - how-tos/providing-images-for-img - how-tos/create-soap-endpoint + :name: how-tos + :maxdepth: 1 -- :doc:`how-tos/sql-user-management` -- :doc:`how-tos/working-with-postgresql-data-types` -- :doc:`how-tos/sql-user-management-using-postgres-users-and-passwords` -- :doc:`how-tos/providing-images-for-img` -- :doc:`how-tos/create-soap-endpoint` + how-tos/* Ecosystem --------- @@ -238,28 +160,11 @@ PostgREST has a growing ecosystem of examples, libraries, and experiments. Here .. toctree:: :caption: Ecosystem - :hidden: + :name: ecosystem + :maxdepth: 1 ecosystem.rst -* :ref:`external_jwt` -* :ref:`community_tutorials` -* :ref:`templates` -* :ref:`eco_example_apps` -* :ref:`devops` -* :ref:`eco_external_notification` -* :ref:`eco_extensions` -* :ref:`clientside_libraries` - - -Release Notes -------------- - -Changes among versions. - -- :doc:`releases/v9.0.0` -- :doc:`releases/v8.0.0` - In Production ------------- diff --git a/docs/api.rst b/docs/references/api.rst similarity index 99% rename from docs/api.rst rename to docs/references/api.rst index e2b163ecc8..0dd517fc22 100644 --- a/docs/api.rst +++ b/docs/references/api.rst @@ -1,3 +1,8 @@ +.. _api: + +API +### + .. role:: sql(code) :language: sql @@ -873,7 +878,7 @@ In addition to providing RESTful routes for each table and view, PostgREST allow API call. This reduces the need for multiple API requests. The server uses **foreign keys** to determine which tables and views can be returned together. For example, consider a database of films and their awards: -.. image:: _static/film.png +.. image:: ../_static/film.png .. important:: @@ -1552,7 +1557,7 @@ Target Disambiguation For example, suppose you have the following ``orders`` and ``addresses`` tables: -.. image:: _static/orders.png +.. image:: ../_static/orders.png And you try to embed ``orders`` with ``addresses`` (this is the **target**): diff --git a/docs/auth.rst b/docs/references/auth.rst similarity index 98% rename from docs/auth.rst rename to docs/references/auth.rst index 31eb5e31ee..2501c3536a 100644 --- a/docs/auth.rst +++ b/docs/references/auth.rst @@ -1,8 +1,7 @@ -.. raw:: html +Authentication +============== -

    Authentication

    - -PostgREST is designed to keep the database at the center of API security. All :doc:`authorization happens in the database ` . It is PostgREST's job to **authenticate** requests -- i.e. verify that a client is who they say they are -- and then let the database **authorize** client actions. +PostgREST is designed to keep the database at the center of API security. All :ref:`authorization happens in the database ` . It is PostgREST's job to **authenticate** requests -- i.e. verify that a client is who they say they are -- and then let the database **authorize** client actions. .. _roles: @@ -11,7 +10,7 @@ Overview of role system There are three types of roles used by PostgREST, the **authenticator**, **anonymous** and **user** roles. The database administrator creates these roles and configures PostgREST to use them. -.. image:: _static/security-roles.png +.. image:: ../_static/security-roles.png The authenticator role is used for connecting to the database and should be configured to have very limited access. It is a chameleon whose job is to "become" other users to service authenticated HTTP requests. @@ -32,7 +31,7 @@ User Impersonation The picture below shows how the server handles authentication. If auth succeeds, it switches into the user role specified by the request, otherwise it switches into the anonymous role (if it's set in :ref:`db-anon-role`). -.. image:: _static/security-anon-choice.png +.. image:: ../_static/security-anon-choice.png This role switching mechanism is called **user impersonation**. In PostgreSQL it's done with the ``SET ROLE`` statement. diff --git a/docs/configuration.rst b/docs/references/configuration.rst similarity index 99% rename from docs/configuration.rst rename to docs/references/configuration.rst index 25d8e9282d..d27eb0bcbe 100644 --- a/docs/configuration.rst +++ b/docs/references/configuration.rst @@ -1,7 +1,7 @@ .. _configuration: Configuration -============= +############# Without configuration, PostgREST won't be able to serve requests. At the minimum it needs either :ref:`a role to serve anonymous requests with ` - or :ref:`a secret to use for JWT authentication `. Config parameters can be provided via :ref:`file_config`, via :ref:`env_variables_config` or through :ref:`in_db_config`. @@ -16,7 +16,7 @@ Config parameters are read in the following order: .. _file_config: Config File ------------ +=========== PostgREST can read a config file. There is no predefined location for this file, you must specify the file path as the one and only argument to the server: @@ -55,14 +55,14 @@ You can run ``postgrest --example`` to display all possible configuration parame .. _env_variables_config: Environment Variables ---------------------- +===================== You can also set these :ref:`configuration parameters ` using environment variables. They are capitalized, have a ``PGRST_`` prefix, and use underscores. For example: ``PGRST_DB_URI`` corresponds to ``db-uri`` and ``PGRST_APP_SETTINGS_*`` to ``app.settings.*``. .. _in_db_config: In-Database Configuration -------------------------- +========================= By adding settings to the **authenticator** role (see :ref:`roles`), you can make the database the single source of truth for PostgREST's configuration. This is enabled by :ref:`db-config`. diff --git a/docs/connection_pool.rst b/docs/references/connection_pool.rst similarity index 99% rename from docs/connection_pool.rst rename to docs/references/connection_pool.rst index 9bb38c3c67..c7f6d7ed05 100644 --- a/docs/connection_pool.rst +++ b/docs/references/connection_pool.rst @@ -1,5 +1,5 @@ Connection Pool ---------------- +=============== Every request to an :doc:`API resource ` borrows a connection from the connection pool to start a :doc:`transaction `. diff --git a/docs/errors.rst b/docs/references/errors.rst similarity index 99% rename from docs/errors.rst rename to docs/references/errors.rst index 74c4a3f84a..e481a70fd0 100644 --- a/docs/errors.rst +++ b/docs/references/errors.rst @@ -1,12 +1,12 @@ .. _error_source: -Error Format -============ +Errors +###### PostgREST error messages follow the PostgreSQL error structure. It includes ``MESSAGE``, ``DETAIL``, ``HINT``, ``ERRCODE`` and will add an HTTP status code to the response. Errors from PostgreSQL ----------------------- +====================== PostgREST will forward errors coming from PostgreSQL. For instance, when querying a nonexistent table: @@ -31,7 +31,7 @@ PostgREST will forward errors coming from PostgreSQL. For instance, when queryin .. _status_codes: HTTP Status Codes -================= +----------------- PostgREST translates `PostgreSQL error codes `_ into HTTP status as follows: @@ -97,7 +97,7 @@ PostgREST translates `PostgreSQL error codes `: @@ -123,7 +123,7 @@ Errors that come from PostgREST itself maintain the same structure. But differ i .. _pgrst_errors: PostgREST Error Codes -===================== +--------------------- PostgREST error codes have the form ``PGRSTgxx`` @@ -134,7 +134,7 @@ PostgREST error codes have the form ``PGRSTgxx`` .. _pgrst0**: Group 0 - Connection --------------------- +~~~~~~~~~~~~~~~~~~~~ Related to the connection with the database. @@ -161,7 +161,7 @@ Related to the connection with the database. .. _pgrst1**: Group 1 - Api Request ---------------------- +~~~~~~~~~~~~~~~~~~~~~ Related to the HTTP request elements. @@ -252,7 +252,7 @@ Related to the HTTP request elements. .. _pgrst2**: Group 2 - Schema Cache ----------------------- +~~~~~~~~~~~~~~~~~~~~~~ Related to a :ref:`stale schema cache `. Most of the time, these errors are solved by :ref:`reloading the schema cache `. @@ -285,7 +285,7 @@ Related to a :ref:`stale schema cache `. Most of the time, these e .. _pgrst3**: Group 3 - JWT -------------- +~~~~~~~~~~~~~ Related to the authentication process using JWT. You can follow the :ref:`tut1` for an example on how to implement authentication and the :doc:`Authentication page ` for more information on this process. @@ -310,7 +310,7 @@ Related to the authentication process using JWT. You can follow the :ref:`tut1` .. _pgrst_X**: Group X - Internal ------------------- +~~~~~~~~~~~~~~~~~~ Internal errors. If you encounter any of these, you may have stumbled on a PostgREST bug, please `open an issue `_ and we'll be glad to fix it. diff --git a/docs/schema_cache.rst b/docs/references/schema_cache.rst similarity index 99% rename from docs/schema_cache.rst rename to docs/references/schema_cache.rst index cfd9f0bb21..44d9fd2d2d 100644 --- a/docs/schema_cache.rst +++ b/docs/references/schema_cache.rst @@ -1,8 +1,7 @@ .. _schema_cache: -.. raw:: html - -

    Schema Cache

    +Schema Cache +============ Some PostgREST features need metadata from the database schema. Getting this metadata requires expensive queries. To avoid repeating this work, PostgREST uses a schema cache. diff --git a/docs/transactions.rst b/docs/references/transactions.rst similarity index 96% rename from docs/transactions.rst rename to docs/references/transactions.rst index 7a73131c03..565a2e6d06 100644 --- a/docs/transactions.rst +++ b/docs/references/transactions.rst @@ -1,6 +1,5 @@ -.. raw:: html - -

    Transactions

    +Transactions +============ After :ref:`user_impersonation`, every request to an :doc:`API resource ` runs inside a transaction. The sequence of the transaction is as follows: @@ -14,7 +13,7 @@ After :ref:`user_impersonation`, every request to an :doc:`API resource ` r .. _access_mode: Access Mode -=========== +----------- The access mode on :ref:`tables_views` is determined by the HTTP method. @@ -59,14 +58,14 @@ Modifying the database inside READ ONLY transactions is not possible. PostgREST The :ref:`options_requests` method doesn't start a transaction, so it's not relevant here. Isolation Level -=============== +--------------- Every transaction uses the PostgreSQL default isolation level: READ COMMITTED. .. _tx_settings: Transaction-Scoped Settings -=========================== +--------------------------- PostgREST uses settings tied to the transaction lifetime. These can be used to get data about the HTTP request. Or to modify the HTTP response. @@ -87,7 +86,7 @@ And you can set them with ``set_config`` set_config('response.', 'value1' ,true); Request Role and Search Path ------------------------------ +~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Because of :ref:`user_impersonation`, PostgREST sets the standard ``role``. You can get this in different ways: @@ -105,7 +104,7 @@ Additionally it also sets the ``search_path`` based on :ref:`db-schemas` and :re .. _guc_req_headers_cookies_claims: Request Headers, Cookies and JWT claims ---------------------------------------- +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ PostgREST stores the headers, cookies and headers as JSON. To get them: @@ -130,7 +129,7 @@ PostgREST stores the headers, cookies and headers as JSON. To get them: .. _guc_req_path_method: Request Path and Method ------------------------ +~~~~~~~~~~~~~~~~~~~~~~~ The path and method are stored as ``text``. @@ -143,7 +142,7 @@ The path and method are stored as ``text``. .. _guc_resp_hdrs: Response Headers ----------------- +~~~~~~~~~~~~~~~~ You can set ``response.headers`` to add headers to the HTTP response. For instance, this statement would add caching headers to the response: @@ -169,7 +168,7 @@ Notice that the ``response.headers`` should be set to an *array* of single-key o .. _guc_resp_status: Response Status Code --------------------- +~~~~~~~~~~~~~~~~~~~~ You can set the ``response.status`` to override the default status code PostgREST provides. For instance, the following function would replace the default ``200`` status code. @@ -207,24 +206,24 @@ If the status code is standard, PostgREST will complete the status message(**I'm .. _main_query: Main query -========== +---------- The main query is produced by requesting the :doc:`API resources `. Transaction End -=============== +--------------- If the transaction doesn't fail, it will always end in a COMMIT. Unless :ref:`db-tx-end` is configured to ROLLBACK in any case or conditionally with ``Prefer: tx=rollback``. This can be used for testing purposes. Aborting transactions -===================== +--------------------- Any database failure(like a failed constraint) will result in a rollback of the transaction. You can also do a RAISE inside a function to cause a rollback. .. _raise_error: Raise errors with HTTP Status Codes ------------------------------------ +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ You can return non-200 HTTP status codes by raising SQL exceptions. For instance, here's a saucy function that always responds with an error: @@ -279,7 +278,7 @@ Returns: .. _pre-request: Pre-Request -=========== +----------- The pre-request is a function that can run after the :ref:`tx_settings` are set and before the :ref:`main_query`. It's enabled with :ref:`db-pre-request`. @@ -288,7 +287,7 @@ This provides an opportunity to modify settings or raise an exception to prevent .. _pre_req_headers: Setting headers via pre-request -------------------------------- +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ As an example, let's add some cache headers for all requests that come from an Internet Explorer(6 or 7) browser. diff --git a/docs/releases/v9.0.0.rst b/docs/releases/v09.0.0.rst similarity index 96% rename from docs/releases/v9.0.0.rst rename to docs/releases/v09.0.0.rst index 5963e82377..5827f542a4 100644 --- a/docs/releases/v9.0.0.rst +++ b/docs/releases/v09.0.0.rst @@ -1,6 +1,6 @@ -PostgREST 9.0.0 -=============== +9.0.0 +===== This major version is released with PostgreSQL 14 compatibility and is accompanied with new features and bug fixes. You can look at the detailed changelog and download the pre-compiled binaries on the `GitHub release page `_. @@ -50,7 +50,7 @@ Error messages Documentation improvements ~~~~~~~~~~~~~~~~~~~~~~~~~~ -* Added ``curl`` snippets to the :doc:`API <../api>` page. +* Added ``curl`` snippets to the :ref:`api` page. * Added the :ref:`automatic_recovery` section. @@ -74,7 +74,7 @@ Breaking changes * Dropped support for PostgreSQL 9.5 as it already reached its end-of-life according to `PostgreSQL versioning policy `_. -* Partitions of a `partitioned table `_ are no longer included in the :doc:`../schema_cache`. This is so errors are not generated when doing resource embedding on partitioned tables. +* Partitions of a `partitioned table `_ are no longer included in the :ref:`schema_cache`. This is so errors are not generated when doing resource embedding on partitioned tables. * Dropped support for doing :ref:`hint_disamb` using dots instead of exclamation marks, e.g. doing ``select=*,projects.client_id(*)`` instead of ``select=*,projects!client_id(*)``). Using dots was undocumented and deprecated back in `v6.0.2 `_. diff --git a/docs/releases/v9.0.1.rst b/docs/releases/v09.0.1.rst similarity index 99% rename from docs/releases/v9.0.1.rst rename to docs/releases/v09.0.1.rst index dfbaa57357..bac8795b15 100644 --- a/docs/releases/v9.0.1.rst +++ b/docs/releases/v09.0.1.rst @@ -1,6 +1,6 @@ -PostgREST 9.0.1 -=============== +9.0.1 +===== This version includes important fixes for production environments and other miscellaneous fixes. You can download the pre-compiled binaries on the `GitHub release page `_. diff --git a/docs/releases/v10.0.0.rst b/docs/releases/v10.0.0.rst index 9177fcfbca..e703324a43 100644 --- a/docs/releases/v10.0.0.rst +++ b/docs/releases/v10.0.0.rst @@ -1,6 +1,6 @@ -PostgREST 10.0.0 -================ +10.0.0 +====== Features -------- @@ -73,9 +73,9 @@ Documentation improvements * Added the :ref:`file_descriptors` subsection. -* Added a reference page for :doc:`Error documentation
    `. +* Added a reference page for :ref:`error_source`. -* Moved the :ref:`error_source` and the :ref:`status_codes` sections to the :doc:`errors reference page
    `. +* Moved the :ref:`error_source` and the :ref:`status_codes` sections to the :ref:`errors reference page `. * Moved the *Casting type to custom JSON* how-to to the :ref:`casting_range_to_json` subsection. diff --git a/docs/releases/v10.2.0.rst b/docs/releases/v10.2.0.rst index ff7dc61ea5..96121b4106 100644 --- a/docs/releases/v10.2.0.rst +++ b/docs/releases/v10.2.0.rst @@ -1,6 +1,6 @@ -PostgREST 10.2.0 -================ +10.2.0 +====== This minor version adds bug fixes and some features that provide stability to v10.0.0. These release notes include the changes added in versions `10.1.0 `_, `10.1.1 `_ and `10.1.2 `_. You can look at the detailed changelog and download the pre-compiled binaries on the `GitHub release page `_. diff --git a/docs/releases/v5.2.0.rst b/docs/releases/v5.2.0.rst deleted file mode 100644 index d32044526e..0000000000 --- a/docs/releases/v5.2.0.rst +++ /dev/null @@ -1,26 +0,0 @@ -v5.2.0 -====== - -* Explicit qualification introduced in ``v5.0`` is no longer necessary, this section will not be included from this version onwards. A :ref:`db-extra-search-path` configuration parameter was introduced to avoid the need to explictly qualify database objects. If you install PostgreSQL extensions on the ``public`` schema, they'll work normally from now on. - -* Now you can filter :ref:`tabs-cols-w-spaces`. - -* Included the ability to quote columns that have :ref:`reserved-chars`. - -* Thanks to `Zhou Feng `_, now is possible to reference an external file in :ref:`db-uri`. - -* Thanks to `Russell Davies `_, Json Web Key Sets are now accepted by :ref:`jwt-secret`. - -Thanks ------- - -This release was made possible thanks to: - -* `Daniel Babiak `_ -* `Michel Pelletier `_ -* Tsingson Qin -* Jay Hannah -* Victor Adossi -* Petr Beles - -If you like to join them please consider `supporting PostgREST development `_. diff --git a/docs/releases/v6.0.2.rst b/docs/releases/v6.0.2.rst deleted file mode 100644 index 47f870e443..0000000000 --- a/docs/releases/v6.0.2.rst +++ /dev/null @@ -1,79 +0,0 @@ -.. |br| raw:: html - -
    - -v6.0.2 -====== - -Full changelog is available at `PostgREST releases page `_. - -Added ------ - -* Ignoring payload keys for insert/update can be now done with the ``?columns`` query parameter. See :ref:`specify_columns`. - |br| -- `@steve-chavez `_ - -* `websearch_to_tsquery `_ can now be used - through the ``wfts`` operator. See :ref:`fts`. - |br| -- `@herulume `_ - -* Resource Embedding on materialized views is now possible. See :ref:`embedding_views`. - |br| -- `@vitorbaptista `_ - -* Bulk calling an RPC is now allowed. See :ref:`bulk_call`. - |br| -- `@steve-chavez `_ - -* It's now possible to request a ``text/plain`` output. See :ref:`scalar_return_formats`. - |br| -- `@steve-chavez `_ - -* Config option for specifying PostgREST database pool timeout ``db-pool-timeout``. - |br| -- `@Qu4tro `_ - -* Config option for binding the PostgREST web server to an unix socket. See :ref:`server-unix-socket`. - |br| -- `@Dansvidania `_ - -* Config option for extending the supported media types. See :ref:`raw-media-types`. - |br| -- `@Dansvidania `_ - -* We now offer an statically linked binary for Linux. Look for **postgrest--linux-x64-static.tar.xz** on the - `releases page `_. - |br| -- `@clojurians-org `_ - -* A :ref:`how_tos` section was added to the documentation. - -Changed -------- - -* ``SIGHUP`` support was removed. You should use ``SIGUSR1`` instead. See :ref:`schema_reloading`. - -* server-host default of ``127.0.0.1`` was changed to ``!4``. See :ref:`server-host`. - -Thanks ------- - -This release is sponsored by: - -.. image:: ../_static/cybertec.png - :target: https://www.cybertec-postgresql.com/en/ - :width: 13em - -.. image:: ../_static/2ndquadrant.png - :target: https://www.2ndquadrant.com/en/?utm_campaign=External%20Websites&utm_source=PostgREST&utm_medium=Logo - :width: 13em - -.. image:: ../_static/retool.png - :target: https://retool.com/?utm_source=sponsor&utm_campaign=postgrest - :width: 13em - -* `Daniel Babiak `_ -* Evans Fernandes -* Tsingson Qin -* Michel Pelletier -* Jay Hannah -* Robert Stolarz -* Kofi Gumbs -* Nicholas DiBiase -* Christopher Reid -* Nathan Bouscal - -If you like to join them please consider `supporting PostgREST development `_. diff --git a/docs/releases/v7.0.0.rst b/docs/releases/v7.0.0.rst deleted file mode 100644 index 67357c9b25..0000000000 --- a/docs/releases/v7.0.0.rst +++ /dev/null @@ -1,106 +0,0 @@ -.. |br| raw:: html - -
    - -v7.0.0 -====== - -You can download this release at the `PostgREST v7.0.0 release page `_. - -Added ------ - -* Support for :ref:`Switching to a schema ` defined in :ref:`db-schemas`. - |br| -- `@steve-chavez `_, `@mahmoudkassem `_ - -* Support for :ref:`planned_count` and :ref:`estimated_count`. - |br| -- `@steve-chavez `_, `@LorenzHenk `_ - -* Support for the :ref:`on_conflict ` query parameter to UPSERT based on a unique constraint. - |br| -- `@ykst `_ - -* Support for :ref:`Resource Embedding Disambiguation `. - |br| -- `@steve-chavez `_ - -* Support for user defined socket permission via :ref:`server-unix-socket-mode` config option - |br| -- `@Dansvidania `_ - -* HTTP logic improvements -- `@steve-chavez `_ - - + Support for HTTP HEAD requests. - + GUCs for :ref:`guc_req_path_method`. - + Support for :ref:`pre_req_headers`. - + Allow overriding provided headers(Content-Type, Location, etc) by :ref:`guc_resp_hdrs` - + Access to the ``Authorization`` header value through ``request.header.authorization`` - -* Documentation improvements - - + Explanation for :doc:`Schema Structure <../db_authz>`. - + Reference for :ref:`s_proc_embed`. - + Reference for :ref:`mutation_embed`. - + Reference for filters on :ref:`json_columns`. - + How-to for :ref:`providing_img`. - + Added :ref:`community_tutorials` section. - -Fixed ------ - -* Allow embedding a view when its source table foreign key is UNIQUE - |br| -- `@bwbroersma `_ - -* ``Accept: application/vnd.pgrst.object+json`` behavior is now enforced for POST/PATCH/DELETE regardless of ``Prefer: return=minimal`` - |br| -- `@dwagin `_ - -* Fix self join resource embedding on PATCH - |br| -- `@herulume `_, `@steve-chavez `_ - -* Allow PATCH/DELETE without ``Prefer: return=minimal`` on tables with no SELECT privileges - |br| -- `@steve-chavez `_ - -* Fix many to many resource embedding for RPC/PATCH - |br| -- `@steve-chavez `_ - -Changed -------- - -* :ref:`bulk_call` should now be done by specifying a ``Prefer: params=multiple-objects`` header. This fixes a performance regression when calling stored procedures. - -* Resource Embedding now outputs an error when multiple relationships between two tables are found, see :ref:`embed_disamb`. - -* ``server-proxy-uri`` config option has been renamed to :ref:`openapi-server-proxy-uri`. - -* Default Unix Socket file mode from 755 to 660 - -Thanks ------- - -This release was made possible thanks to: - -.. image:: ../_static/cybertec.png - :target: https://www.cybertec-postgresql.com/en/ - :width: 13em - -.. image:: ../_static/2ndquadrant.png - :target: https://www.2ndquadrant.com/en/?utm_campaign=External%20Websites&utm_source=PostgREST&utm_medium=Logo - :width: 13em - -.. image:: ../_static/retool.png - :target: https://retool.com/?utm_source=sponsor&utm_campaign=postgrest - :width: 13em - -* `Daniel Babiak `_ -* Evans Fernandes -* Jan Sommer -* Tsingson Qin -* Michel Pelletier -* Jay Hannah -* Robert Stolarz -* Kofi Gumbs -* Nicholas DiBiase -* Christopher Reid -* Nathan Bouscal -* Daniel Rafaj -* David Fenko - - -If you like to join them please consider `supporting PostgREST development `_. diff --git a/docs/releases/v7.0.1.rst b/docs/releases/v7.0.1.rst deleted file mode 100644 index 541c462459..0000000000 --- a/docs/releases/v7.0.1.rst +++ /dev/null @@ -1,69 +0,0 @@ -.. |br| raw:: html - -
    - -v7.0.1 -====== - -You can see the full changelog at `PostgREST v7.0.1 release page `_. - -Fixed ------ - -* Fix overloaded computed columns on RPC - |br| -- `@wolfgangwalther `_ - -* Fix POST, PATCH, DELETE with ``?select=`` and ``Prefer: return=minimal`` and PATCH with empty body - |br| -- `@wolfgangwalther `_ - -* Fix missing ``openapi-server-proxy-uri`` config option - |br| -- `@steve-chavez `_ - -* Fix ``Content-Profile`` not working for POST RPC - |br| -- `@steve-chavez `_ - -* Fix PUT restriction for including all columns in payload - |br| -- `@steve-chavez `_ - -* Documentation improvements - - + Added package managers to :ref:`install`. - -Changed -------- - -* From this version onwards, the release page will include a single Linux static executable that can be run on any Linux distribution. - -Thanks ------- - -This release was made possible thanks to: - -.. image:: ../_static/cybertec.png - :target: https://www.cybertec-postgresql.com/en/ - :width: 13em - -.. image:: ../_static/2ndquadrant.png - :target: https://www.2ndquadrant.com/en/?utm_campaign=External%20Websites&utm_source=PostgREST&utm_medium=Logo - :width: 13em - -.. image:: ../_static/retool.png - :target: https://retool.com/?utm_source=sponsor&utm_campaign=postgrest - :width: 13em - -* `Daniel Babiak `_ -* Evans Fernandes -* Jan Sommer -* Tsingson Qin -* Michel Pelletier -* Jay Hannah -* Robert Stolarz -* Kofi Gumbs -* Nicholas DiBiase -* Christopher Reid -* Nathan Bouscal -* Daniel Rafaj -* David Fenko - - -If you'd like to join them, consider `supporting PostgREST development `_. diff --git a/docs/releases/v8.0.0.rst b/docs/releases/v8.0.0.rst deleted file mode 100644 index 69fb70bd2b..0000000000 --- a/docs/releases/v8.0.0.rst +++ /dev/null @@ -1,191 +0,0 @@ -.. |br| raw:: html - -
    - -v8.0.0 -====== - -You can download this release at the `PostgREST v8.0.0 release page `_. - -Added ------ - -* Allow HTTP status override through the :ref:`response.status ` GUC. - |br| -- `@steve-chavez `_ - -* Allow :ref:`s_procs_variadic`. - |br| -- `@wolfgangwalther `_ - -* Allow :ref:`embedding_view_chains` recursively to any depth. - |br| -- `@wolfgangwalther `_ - -* No downtime when reloading the schema cache. See :ref:`schema_reloading`. - |br| -- `@steve-chavez `_ - -* Allow schema cache reloading using PostgreSQL :ref:`NOTIFY ` command. This enables :ref:`auto_schema_reloading`. - |br| -- `@steve-chavez `_ - -* Allow sending the header ``Prefer: headers-only`` to get a response with a ``Location`` header. See :ref:`insert`. - |br| -- `@laurenceisla `_ - -* Allow :ref:`external_connection_poolers` such as PgBouncer in transaction pooling mode. - |br| -- `@laurenceisla `_ - -* Allow :ref:`config_reloading` by sending a SIGUSR2 signal. - |br| -- `@steve-chavez `_ - -* Allow ``Bearer`` with and without capitalization as authentication schema. See :ref:`client_auth`. - |br| -- `@wolfgangwalther `_ - -* :ref:`in_db_config` that can be :ref:`reloaded with NOTIFY `. - |br| -- `@steve-chavez `_ - -* Allow OPTIONS to generate HTTP methods based on views triggers. See :ref:`OPTIONS requests `. - |br| -- `@laurenceisla `_ - -* Show timestamps for server diagnostic information. See :ref:`pgrst_logging`. - |br| -- `@steve-chavez `_ - -* Config options for showing a full OpenAPI output regardless of the JWT role privileges and for disabling it altogether. See :ref:`openapi-mode`. - |br| -- `@steve-chavez `_ - -* Config option for logging level. See :ref:`log-level`. - |br| -- `@steve-chavez `_ - -* Config option for enabling or disabling prepared statements. See :ref:`db-prepared-statements`. - |br| -- `@steve-chavez `_ - -* Config option for specifying how to terminate the transactions (allowing rollbacks, useful for testing). See :ref:`db-tx-end`. - |br| -- `@wolfgangwalther `_ - -* Documentation improvements - - + Added the :doc:`../schema_cache` page. - + Moved the :ref:`schema_reloading` reference from :doc:`../admin` to :doc:`../schema_cache` - -Changed -------- - -* Docker images are now optimized to be built from the scratch image. This reduces the compressed image size from over 30 MB to about 4 MB. - For more details, see `Docker image built with Nix `_. - |br| -- `@monacoremo `_ - -* The Docker image no longer has an internal ``/etc/postgrest.conf`` file, you must use :ref:`env_variables_config` to configure it. - |br| -- `@wolfgangwalther `_ - -* The ``pg_listen`` `utility `_ is no longer needed to automatically reload the schema cache - and it's replaced entirely by database notifications. See :ref:`auto_schema_reloading`. - |br| -- `@steve-chavez `_ - -* POST requests for insertions no longer include a ``Location`` header in the response by default and behave the same way as having a - ``Prefer: return=minimal`` header in the request. This prevents permissions errors when having a write-only table. See :ref:`insert`. - |br| -- `@laurenceisla `_ - -* Modified the default logging level from ``info`` to ``error``. See :ref:`log-level`. - |br| -- `@steve-chavez `_ - -* Changed the error message for a not found RPC on a stale schema (see :ref:`stale_schema`) and for the unsupported case of - overloaded functions with the same argument names but different types. - |br| -- `@laurenceisla `_ - -* Changed the error message for the no relationship found error. See :ref:`stale_schema`. - |br| -- `@laurenceisla `_ - -Fixed ------ - -* Fix showing UNKNOWN on ``postgrest --help`` invocation. - |br| -- `@monacoremo `_ - -* Removed single column restriction to allow composite foreign keys in join tables. - |br| -- `@goteguru `_ - -* Fix expired JWTs starting an empty transaction on the db. - |br| -- `@steve-chavez `_ - -* Fix location header for POST request with ``select=`` without PK. - |br| -- `@wolfgangwalther `_ - -* Fix error messages on connection failure for localized PostgreSQL on Windows. - |br| -- `@wolfgangwalther `_ - -* Fix ``application/octet-stream`` appending ``charset=utf-8``. - |br| -- `@steve-chavez `_ - -* Fix overloading of functions with unnamed arguments. - |br| -- `@wolfgangwalther `_ - -* Return ``405 Method not Allowed`` for GET of volatile RPC instead of 500. - |br| -- `@wolfgangwalther `_ - -* Fix RPC return type handling and embedding for domains with composite base type. - |br| -- `@wolfgangwalther `_ - -* Fix embedding through views that have COALESCE with subselect. - |br| -- `@wolfgangwalther `_ - -* Fix parsing of boolean config values for Docker environment variables, now it accepts double quoted truth values ``("true", "false")`` and numbers ``("1", "0")``. - |br| -- `@wolfgangwalther `_ - -* Fix using ``app.settings.xxx`` config options in Docker, now they can be used as ``PGRST_APP_SETTINGS_xxx``. - |br| -- `@wolfgangwalther `_ - -* Fix panic when attempting to run with unix socket on non-unix host and properly close unix domain socket on exit. - |br| -- `@monacoremo `_ - -* Disregard internal junction (in non-exposed schema) when embedding. - |br| -- `@steve-chavez `_ - -* Fix requests for overloaded functions from HTML forms to no longer hang. - |br| -- `@laurenceisla `_ - -Thanks ------- - -Big thanks from the `PostgREST team `_ to our sponsors! - -.. container:: image-container - - .. image:: ../_static/cybertec-new.png - :target: https://www.cybertec-postgresql.com/en/?utm_source=postgrest.org&utm_medium=referral&utm_campaign=postgrest - :width: 13em - - .. image:: ../_static/2ndquadrant.png - :target: https://www.2ndquadrant.com/en/?utm_campaign=External%20Websites&utm_source=PostgREST&utm_medium=Logo - :width: 13em - - .. image:: ../_static/retool.png - :target: https://retool.com/?utm_source=sponsor&utm_campaign=postgrest - :width: 13em - - .. image:: ../_static/gnuhost.png - :target: https://gnuhost.eu/?utm_source=sponsor&utm_campaign=postgrest - :width: 13em - - .. image:: ../_static/supabase.png - :target: https://supabase.com/?utm_source=postgrest%20backers&utm_medium=open%20source%20partner&utm_campaign=postgrest%20backers%20github&utm_term=homepage - :width: 13em - - .. image:: ../_static/oblivious.jpg - :target: https://oblivious.ai/?utm_source=sponsor&utm_campaign=postgrest - :width: 13em - -* Evans Fernandes -* Jan Sommer -* `Franz Gusenbauer `_ -* `Daniel Babiak `_ -* Tsingson Qin -* Michel Pelletier -* Jay Hannah -* Robert Stolarz -* Nicholas DiBiase -* Christopher Reid -* Nathan Bouscal -* Daniel Rafaj -* David Fenko -* Remo Rechkemmer -* Severin Ibarluzea -* Tom Saleeba -* Pawel Tyll - -If you like to join them please consider `supporting PostgREST development `_. diff --git a/docs/tutorials/tut0.rst b/docs/tutorials/tut0.rst index 7b2ce647c3..2d86c871f9 100644 --- a/docs/tutorials/tut0.rst +++ b/docs/tutorials/tut0.rst @@ -165,7 +165,7 @@ PostgREST can use a configuration file to tell it how to connect to the database db-schemas = "api" db-anon-role = "web_anon" -The configuration file has other :doc:`options <../configuration>`, but this is all we need. +The configuration file has other :ref:`options `, but this is all we need. If you are not using Docker, make sure that your port number is correct and replace `postgres` with the name of the database where you added the todos table. Now run the server: diff --git a/postgrest.dict b/postgrest.dict index d99c43b302..7fed84b229 100644 --- a/postgrest.dict +++ b/postgrest.dict @@ -179,6 +179,7 @@ Tcl tmuxp todo todos +tos Tsingson tsquery tx From 637a6e281d2be8d18f1de040641424199ed8fe40 Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Mon, 8 May 2023 11:55:46 -0300 Subject: [PATCH 564/711] Move part of admin to references - Add integrations section with Nginx and SystemD - Move Nginx and SystemD sections from admin on integrations --- docs/_static/css/custom.css | 4 + docs/explanations/admin.rst | 359 ---------------------------------- docs/index.rst | 11 ++ docs/integrations/nginx.rst | 147 ++++++++++++++ docs/integrations/systemd.rst | 51 +++++ docs/references/admin.rst | 121 ++++++++++++ postgrest.dict | 1 + 7 files changed, 335 insertions(+), 359 deletions(-) delete mode 100644 docs/explanations/admin.rst create mode 100644 docs/integrations/nginx.rst create mode 100644 docs/integrations/systemd.rst create mode 100644 docs/references/admin.rst diff --git a/docs/_static/css/custom.css b/docs/_static/css/custom.css index 7000d0fce1..a1bd351fec 100644 --- a/docs/_static/css/custom.css +++ b/docs/_static/css/custom.css @@ -85,3 +85,7 @@ div.line-block { #ecosystem span.caption-text { display: none; } + +#integrations span.caption-text { + display: none; +} diff --git a/docs/explanations/admin.rst b/docs/explanations/admin.rst deleted file mode 100644 index 1315ae14ab..0000000000 --- a/docs/explanations/admin.rst +++ /dev/null @@ -1,359 +0,0 @@ -.. _admin: - -Admin -##### - -Hardening PostgREST -=================== - -PostgREST is a fast way to construct a RESTful API. Its default behavior is great for scaffolding in development. When it's time to go to production it works great too, as long as you take precautions. PostgREST is a small sharp tool that focuses on performing the API-to-database mapping. We rely on a reverse proxy like Nginx for additional safeguards. - -The first step is to create an Nginx configuration file that proxies requests to an underlying PostgREST server. - -.. code-block:: nginx - - http { - # ... - # upstream configuration - upstream postgrest { - server localhost:3000; - } - # ... - server { - # ... - # expose to the outside world - location /api/ { - default_type application/json; - proxy_hide_header Content-Location; - add_header Content-Location /api/$upstream_http_content_location; - proxy_set_header Connection ""; - proxy_http_version 1.1; - proxy_pass http://postgrest/; - } - # ... - } - } - -.. note:: - - For ubuntu, if you already installed nginx through :code:`apt` you can add this to the config file in - :code:`/etc/nginx/sites-enabled/default`. - -.. _block_fulltable: - -Block Full-Table Operations ---------------------------- - -Each table in the admin-selected schema gets exposed as a top level route. Client requests are executed by certain database roles depending on their authentication. All HTTP verbs are supported that correspond to actions permitted to the role. For instance if the active role can drop rows of the table then the DELETE verb is allowed for clients. Here's an API request to delete old rows from a hypothetical logs table: - -.. tabs:: - - .. code-tab:: http - - DELETE /logs?time=lt.1991-08-06 HTTP/1.1 - - .. code-tab:: bash Curl - - curl "http://localhost:3000/logs?time=lt.1991-08-06" -X DELETE - -However it's very easy to delete the **entire table** by omitting the query parameter! - -.. tabs:: - - .. code-tab:: http - - DELETE /logs HTTP/1.1 - - .. code-tab:: bash Curl - - curl "http://localhost:3000/logs" -X DELETE - -This can happen accidentally such as by switching a request from a GET to a DELETE. To protect against accidental operations use the `pg-safeupdate `_ PostgreSQL extension. It raises an error if UPDATE or DELETE are executed without specifying conditions. To install it you can use the `PGXN `_ network: - -.. code-block:: bash - - sudo -E pgxn install safeupdate - - # then add this to postgresql.conf: - # shared_preload_libraries='safeupdate'; - -This does not protect against malicious actions, since someone can add a url parameter that does not affect the result set. To prevent this you must turn to database permissions, forbidding the wrong people from deleting rows, and using `row-level security `_ if finer access control is required. - -Count-Header DoS ----------------- - -For convenience to client-side pagination controls PostgREST supports counting and reporting total table size in its response. As described in :ref:`limits`, responses ordinarily include a range but leave the total unspecified like - -.. code-block:: http - - HTTP/1.1 200 OK - Range-Unit: items - Content-Range: 0-14/* - -However including the request header :code:`Prefer: count=exact` calculates and includes the full count: - -.. code-block:: http - - HTTP/1.1 206 Partial Content - Range-Unit: items - Content-Range: 0-14/3573458 - -This is fine in small tables, but count performance degrades in big tables due to the MVCC architecture of PostgreSQL. For very large tables it can take a very long time to retrieve the results which allows a denial of service attack. The solution is to strip this header from all requests: - -.. code-block:: postgres - - -- Pending nginx config: Remove any prefer header which contains the word count - -.. _https: - -HTTPS ------ - -PostgREST aims to do one thing well: add an HTTP interface to a PostgreSQL database. To keep the code small and focused we do not implement HTTPS. Use a reverse proxy such as NGINX to add this, `here's how `_. Note that some Platforms as a Service like Heroku also add SSL automatically in their load balancer. - -Rate Limiting -------------- - -Nginx supports "leaky bucket" rate limiting (see `official docs `_). Using standard Nginx configuration, routes can be grouped into *request zones* for rate limiting. For instance we can define a zone for login attempts: - -.. code-block:: nginx - - limit_req_zone $binary_remote_addr zone=login:10m rate=1r/s; - -This creates a shared memory zone called "login" to store a log of IP addresses that access the rate limited urls. The space reserved, 10 MB (:code:`10m`) will give us enough space to store a history of 160k requests. We have chosen to allow only allow one request per second (:code:`1r/s`). - -Next we apply the zone to certain routes, like a hypothetical stored procedure called :code:`login`. - -.. code-block:: nginx - - location /rpc/login/ { - # apply rate limiting - limit_req zone=login burst=5; - } - -The burst argument tells Nginx to start dropping requests if more than five queue up from a specific IP. - -Nginx rate limiting is general and indiscriminate. To rate limit each authenticated request individually you will need to add logic in a :ref:`Custom Validation ` function. - -Debugging -========= - -Server Version --------------- - -When debugging a problem it's important to verify the PostgREST version. At any time you can make a request to the running server and determine exactly which version is deployed. Look for the :code:`Server` HTTP response header, which contains the version number. - -.. _pgrst_logging: - -Logging -------- - -PostgREST logs basic request information to ``stdout``, including the authenticated user if available, the requesting IP address and user agent, the URL requested, and HTTP response status. - -.. code:: - - 127.0.0.1 - user [26/Jul/2021:01:56:38 -0500] "GET /clients HTTP/1.1" 200 - "" "curl/7.64.0" - 127.0.0.1 - anonymous [26/Jul/2021:01:56:48 -0500] "GET /unexistent HTTP/1.1" 404 - "" "curl/7.64.0" - -For diagnostic information about the server itself, PostgREST logs to ``stderr``. - -.. code:: - - 12/Jun/2021:17:47:39 -0500: Attempting to connect to the database... - 12/Jun/2021:17:47:39 -0500: Listening on port 3000 - 12/Jun/2021:17:47:39 -0500: Connection successful - 12/Jun/2021:17:47:39 -0500: Config re-loaded - 12/Jun/2021:17:47:40 -0500: Schema cache loaded - -.. note:: - - When running it in an SSH session you must detach it from stdout or it will be terminated when the session closes. The easiest technique is redirecting the output to a log file or to the syslog: - - .. code-block:: bash - - ssh foo@example.com \ - 'postgrest foo.conf /var/log/postgrest.log 2>&1 &' - - # another option is to pipe the output into "logger -t postgrest" - -PostgREST logging provides limited information for debugging server errors. It's helpful to get full information about both client requests and the corresponding SQL commands executed against the underlying database. - -HTTP Requests -------------- - -A great way to inspect incoming HTTP requests including headers and query parameters is to sniff the network traffic on the port where PostgREST is running. For instance on a development server bound to port 3000 on localhost, run this: - -.. code:: bash - - # sudo access is necessary for watching the network - sudo ngrep -d lo0 port 3000 - -The options to ngrep vary depending on the address and host on which you've bound the server. The binding is described in the :ref:`configuration` section. The ngrep output isn't particularly pretty, but it's legible. - -Database Logs -------------- - -Once you've verified that requests are as you expect, you can get more information about the server operations by watching the database logs. By default PostgreSQL does not keep these logs, so you'll need to make the configuration changes below. Find :code:`postgresql.conf` inside your PostgreSQL data directory (to find that, issue the command :code:`show data_directory;`). Either find the settings scattered throughout the file and change them to the following values, or append this block of code to the end of the configuration file. - -.. code:: sql - - # send logs where the collector can access them - log_destination = "stderr" - - # collect stderr output to log files - logging_collector = on - - # save logs in pg_log/ under the pg data directory - log_directory = "pg_log" - - # (optional) new log file per day - log_filename = "postgresql-%Y-%m-%d.log" - - # log every kind of SQL statement - log_statement = "all" - -Restart the database and watch the log file in real-time to understand how HTTP requests are being translated into SQL commands. - -.. note:: - - On Docker you can enable the logs by using a custom ``init.sh``: - - .. code:: bash - - #!/bin/sh - echo "log_statement = 'all'" >> /var/lib/postgresql/data/postgresql.conf - - After that you can start the container and check the logs with ``docker logs``. - - .. code:: bash - - docker run -v "$(pwd)/init.sh":"/docker-entrypoint-initdb.d/init.sh" -d postgres - docker logs -f - -Schema Reloading ----------------- - -Changing the schema while the server is running can lead to errors due to a stale schema cache. To learn how to refresh the cache see :ref:`schema_reloading`. - -.. _health_check: - -Health Check ------------- - -You can enable a minimal health check to verify if PostgREST is available for client requests and to check the status of its internal state. - -To do this, set the configuration variable :ref:`admin-server-port` to the port number of your preference. Two endpoints ``live`` and ``ready`` will then be available. - -The ``live`` endpoint verifies if PostgREST is running on its configured port. A request will return ``200 OK`` if PostgREST is alive or ``503`` otherwise. - -The ``ready`` endpoint also checks the state of both the Database Connection and the :ref:`schema_cache`. A request will return ``200 OK`` if it is ready or ``503`` if not. - -For instance, to verify if PostgREST is running at ``localhost:3000`` while the ``admin-server-port`` is set to ``3001``: - -.. tabs:: - - .. code-tab:: http - - GET localhost:3001/live HTTP/1.1 - - .. code-tab:: bash Curl - - curl -I "http://localhost:3001/live" - -.. code-block:: http - - HTTP/1.1 200 OK - -If you have a machine with multiple network interfaces and multiple PostgREST instances in the same port, you need to specify a unique :ref:`hostname ` in the configuration of each PostgREST instance for the health check to work correctly. Don't use the special values(``!4``, ``*``, etc) in this case because the health check could report a false positive. - -Daemonizing -=========== - -For Linux distributions that use **systemd** (Ubuntu, Debian, Archlinux) you can create a daemon in the following way. - -First, create postgrest configuration in ``/etc/postgrest/config`` - -.. code-block:: ini - - db-uri = "postgres://:@localhost:5432/" - db-schemas = "" - db-anon-role = "" - jwt-secret = "" - -Then create the systemd service file in ``/etc/systemd/system/postgrest.service`` - -.. code-block:: ini - - [Unit] - Description=REST API for any PostgreSQL database - After=postgresql.service - - [Service] - ExecStart=/bin/postgrest /etc/postgrest/config - ExecReload=/bin/kill -SIGUSR1 $MAINPID - - [Install] - WantedBy=multi-user.target - -After that, you can enable the service at boot time and start it with: - -.. code-block:: bash - - systemctl enable postgrest - systemctl start postgrest - - ## For reloading the service - ## systemctl restart postgrest - -.. _file_descriptors: - -File Descriptors ----------------- - -File descriptors are kernel resources that are used by HTTP connections (among others). File descriptors are limited per process. The kernel default limit is 1024, which is increased in some Linux distributions. -When under heavy traffic, PostgREST can reach this limit and start showing ``No file descriptors available`` errors. To clear these errors, you can increase the process' file descriptor limit. - -.. code-block:: ini - - [Service] - LimitNOFILE=10000 - -Alternate URL Structure -======================= - -As discussed in :ref:`singular_plural`, there are no special URL forms for singular resources in PostgREST, only operators for filtering. Thus there are no URLs like :code:`/people/1`. It would be specified instead as - -.. tabs:: - - .. code-tab:: http - - GET /people?id=eq.1 HTTP/1.1 - Accept: application/vnd.pgrst.object+json - - .. code-tab:: bash Curl - - curl "http://localhost:3000/people?id=eq.1" \ - -H "Accept: application/vnd.pgrst.object+json" - -This allows compound primary keys and makes the intent for singular response independent of a URL convention. - -Nginx rewrite rules allow you to simulate the familiar URL convention. The following example adds a rewrite rule for all table endpoints, but you'll want to restrict it to those tables that have a numeric simple primary key named "id." - -.. code-block:: nginx - - # support /endpoint/:id url style - location ~ ^/([a-z_]+)/([0-9]+) { - - # make the response singular - proxy_set_header Accept 'application/vnd.pgrst.object+json'; - - # assuming an upstream named "postgrest" - proxy_pass http://postgrest/$1?id=eq.$2; - - } - -.. TODO -.. Administration -.. API Versioning -.. HTTP Caching -.. Upgrading diff --git a/docs/index.rst b/docs/index.rst index e0931674cd..a90ece3402 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -153,6 +153,17 @@ Recipes that'll help you address specific use-cases. how-tos/* +Integrations +------------ + +.. toctree:: + :glob: + :caption: Integrations + :name: integrations + :maxdepth: 1 + + integrations/* + Ecosystem --------- diff --git a/docs/integrations/nginx.rst b/docs/integrations/nginx.rst new file mode 100644 index 0000000000..25ce6ca98a --- /dev/null +++ b/docs/integrations/nginx.rst @@ -0,0 +1,147 @@ +Nginx +===== + +PostgREST is a fast way to construct a RESTful API. Its default behavior is great for scaffolding in development. When it's time to go to production it works great too, as long as you take precautions. +PostgREST is a small sharp tool that focuses on performing the API-to-database mapping. We rely on a reverse proxy like Nginx for additional safeguards. + +The first step is to create an Nginx configuration file that proxies requests to an underlying PostgREST server. + +.. code-block:: nginx + + http { + # ... + # upstream configuration + upstream postgrest { + server localhost:3000; + } + # ... + server { + # ... + # expose to the outside world + location /api/ { + default_type application/json; + proxy_hide_header Content-Location; + add_header Content-Location /api/$upstream_http_content_location; + proxy_set_header Connection ""; + proxy_http_version 1.1; + proxy_pass http://postgrest/; + } + # ... + } + } + +.. note:: + + For ubuntu, if you already installed nginx through :code:`apt` you can add this to the config file in + :code:`/etc/nginx/sites-enabled/default`. + +.. _block_fulltable: + +Block Full-Table Operations +--------------------------- + +Each table in the admin-selected schema gets exposed as a top level route. Client requests are executed by certain database roles depending on their authentication. All HTTP verbs are supported that correspond to actions permitted to the role. For instance if the active role can drop rows of the table then the DELETE verb is allowed for clients. Here's an API request to delete old rows from a hypothetical logs table: + +.. tabs:: + + .. code-tab:: http + + DELETE /logs?time=lt.1991-08-06 HTTP/1.1 + + .. code-tab:: bash Curl + + curl "http://localhost:3000/logs?time=lt.1991-08-06" -X DELETE + +However it's very easy to delete the **entire table** by omitting the query parameter! + +.. tabs:: + + .. code-tab:: http + + DELETE /logs HTTP/1.1 + + .. code-tab:: bash Curl + + curl "http://localhost:3000/logs" -X DELETE + +This can happen accidentally such as by switching a request from a GET to a DELETE. To protect against accidental operations use the `pg-safeupdate `_ PostgreSQL extension. It raises an error if UPDATE or DELETE are executed without specifying conditions. To install it you can use the `PGXN `_ network: + +.. code-block:: bash + + sudo -E pgxn install safeupdate + + # then add this to postgresql.conf: + # shared_preload_libraries='safeupdate'; + +This does not protect against malicious actions, since someone can add a url parameter that does not affect the result set. To prevent this you must turn to database permissions, forbidding the wrong people from deleting rows, and using `row-level security `_ if finer access control is required. + +.. _https: + +HTTPS +----- + +PostgREST aims to do one thing well: add an HTTP interface to a PostgreSQL database. To keep the code small and focused we do not implement HTTPS. Use a reverse proxy such as NGINX to add this, `here's how `_. Note that some Platforms as a Service like Heroku also add SSL automatically in their load balancer. + +Rate Limiting +------------- + +Nginx supports "leaky bucket" rate limiting (see `official docs `_). Using standard Nginx configuration, routes can be grouped into *request zones* for rate limiting. For instance we can define a zone for login attempts: + +.. code-block:: nginx + + limit_req_zone $binary_remote_addr zone=login:10m rate=1r/s; + +This creates a shared memory zone called "login" to store a log of IP addresses that access the rate limited urls. The space reserved, 10 MB (:code:`10m`) will give us enough space to store a history of 160k requests. We have chosen to allow only allow one request per second (:code:`1r/s`). + +Next we apply the zone to certain routes, like a hypothetical stored procedure called :code:`login`. + +.. code-block:: nginx + + location /rpc/login/ { + # apply rate limiting + limit_req zone=login burst=5; + } + +The burst argument tells Nginx to start dropping requests if more than five queue up from a specific IP. + +Nginx rate limiting is general and indiscriminate. To rate limit each authenticated request individually you will need to add logic in a :ref:`Custom Validation ` function. + +Alternate URL Structure +----------------------- + +As discussed in :ref:`singular_plural`, there are no special URL forms for singular resources in PostgREST, only operators for filtering. Thus there are no URLs like :code:`/people/1`. It would be specified instead as + +.. tabs:: + + .. code-tab:: http + + GET /people?id=eq.1 HTTP/1.1 + Accept: application/vnd.pgrst.object+json + + .. code-tab:: bash Curl + + curl "http://localhost:3000/people?id=eq.1" \ + -H "Accept: application/vnd.pgrst.object+json" + +This allows compound primary keys and makes the intent for singular response independent of a URL convention. + +Nginx rewrite rules allow you to simulate the familiar URL convention. The following example adds a rewrite rule for all table endpoints, but you'll want to restrict it to those tables that have a numeric simple primary key named "id." + +.. code-block:: nginx + + # support /endpoint/:id url style + location ~ ^/([a-z_]+)/([0-9]+) { + + # make the response singular + proxy_set_header Accept 'application/vnd.pgrst.object+json'; + + # assuming an upstream named "postgrest" + proxy_pass http://postgrest/$1?id=eq.$2; + + } + +.. TODO +.. Administration +.. API Versioning +.. HTTP Caching +.. Upgrading diff --git a/docs/integrations/systemd.rst b/docs/integrations/systemd.rst new file mode 100644 index 0000000000..55b7d6cf77 --- /dev/null +++ b/docs/integrations/systemd.rst @@ -0,0 +1,51 @@ +systemd +======= + +For Linux distributions that use **systemd** (Ubuntu, Debian, Archlinux) you can create a daemon in the following way. + +First, create postgrest configuration in ``/etc/postgrest/config`` + +.. code-block:: ini + + db-uri = "postgres://:@localhost:5432/" + db-schemas = "" + db-anon-role = "" + jwt-secret = "" + +Then create the systemd service file in ``/etc/systemd/system/postgrest.service`` + +.. code-block:: ini + + [Unit] + Description=REST API for any PostgreSQL database + After=postgresql.service + + [Service] + ExecStart=/bin/postgrest /etc/postgrest/config + ExecReload=/bin/kill -SIGUSR1 $MAINPID + + [Install] + WantedBy=multi-user.target + +After that, you can enable the service at boot time and start it with: + +.. code-block:: bash + + systemctl enable postgrest + systemctl start postgrest + + ## For reloading the service + ## systemctl restart postgrest + +.. _file_descriptors: + +File Descriptors +---------------- + +File descriptors are kernel resources that are used by HTTP connections (among others). File descriptors are limited per process. The kernel default limit is 1024, which is increased in some Linux distributions. +When under heavy traffic, PostgREST can reach this limit and start showing ``No file descriptors available`` errors. To clear these errors, you can increase the process' file descriptor limit. + +.. code-block:: ini + + [Service] + LimitNOFILE=10000 diff --git a/docs/references/admin.rst b/docs/references/admin.rst new file mode 100644 index 0000000000..31f86599b0 --- /dev/null +++ b/docs/references/admin.rst @@ -0,0 +1,121 @@ +.. _admin: + +Admin +##### + +.. _pgrst_logging: + +Logging +------- + +PostgREST logs basic request information to ``stdout``, including the authenticated user if available, the requesting IP address and user agent, the URL requested, and HTTP response status. + +.. code:: + + 127.0.0.1 - user [26/Jul/2021:01:56:38 -0500] "GET /clients HTTP/1.1" 200 - "" "curl/7.64.0" + 127.0.0.1 - anonymous [26/Jul/2021:01:56:48 -0500] "GET /unexistent HTTP/1.1" 404 - "" "curl/7.64.0" + +For diagnostic information about the server itself, PostgREST logs to ``stderr``. + +.. code:: + + 12/Jun/2021:17:47:39 -0500: Attempting to connect to the database... + 12/Jun/2021:17:47:39 -0500: Listening on port 3000 + 12/Jun/2021:17:47:39 -0500: Connection successful + 12/Jun/2021:17:47:39 -0500: Config re-loaded + 12/Jun/2021:17:47:40 -0500: Schema cache loaded + +.. note:: + + When running it in an SSH session you must detach it from stdout or it will be terminated when the session closes. The easiest technique is redirecting the output to a log file or to the syslog: + + .. code-block:: bash + + ssh foo@example.com \ + 'postgrest foo.conf /var/log/postgrest.log 2>&1 &' + + # another option is to pipe the output into "logger -t postgrest" + +Currently PostgREST doesn't log the SQL commands executed against the underlying database. + +Database Logs +~~~~~~~~~~~~~ + +To find the SQL operations, you can watch the database logs. By default PostgreSQL does not keep these logs, so you'll need to make the configuration changes below. + +Find :code:`postgresql.conf` inside your PostgreSQL data directory (to find that, issue the command :code:`show data_directory;`). Either find the settings scattered throughout the file and change them to the following values, or append this block of code to the end of the configuration file. + +.. code:: sql + + # send logs where the collector can access them + log_destination = "stderr" + + # collect stderr output to log files + logging_collector = on + + # save logs in pg_log/ under the pg data directory + log_directory = "pg_log" + + # (optional) new log file per day + log_filename = "postgresql-%Y-%m-%d.log" + + # log every kind of SQL statement + log_statement = "all" + +Restart the database and watch the log file in real-time to understand how HTTP requests are being translated into SQL commands. + +.. note:: + + On Docker you can enable the logs by using a custom ``init.sh``: + + .. code:: bash + + #!/bin/sh + echo "log_statement = 'all'" >> /var/lib/postgresql/data/postgresql.conf + + After that you can start the container and check the logs with ``docker logs``. + + .. code:: bash + + docker run -v "$(pwd)/init.sh":"/docker-entrypoint-initdb.d/init.sh" -d postgres + docker logs -f + +Server Version +-------------- + +When debugging a problem it's important to verify the PostgREST version. Look for the :code:`Server` HTTP response header, which contains the version number. + +.. code:: + + Server: postgrest/11.0.1 + +.. _health_check: + +Health Check +------------ + +You can enable a health check to verify if PostgREST is available for client requests. Also to check the status of its internal state. + +To do this, set the configuration variable :ref:`admin-server-port` to the port number of your preference. Two endpoints ``live`` and ``ready`` will then be available. + +The ``live`` endpoint verifies if PostgREST is running on its configured port. A request will return ``200 OK`` if PostgREST is alive or ``503`` otherwise. + +The ``ready`` endpoint also checks the state of both the Database Connection and the :ref:`schema_cache`. A request will return ``200 OK`` if it is ready or ``503`` if not. + +For instance, to verify if PostgREST is running at ``localhost:3000`` while the ``admin-server-port`` is set to ``3001``: + +.. tabs:: + + .. code-tab:: http + + GET localhost:3001/live HTTP/1.1 + + .. code-tab:: bash Curl + + curl -I "http://localhost:3001/live" + +.. code-block:: http + + HTTP/1.1 200 OK + +If you have a machine with multiple network interfaces and multiple PostgREST instances in the same port, you need to specify a unique :ref:`hostname ` in the configuration of each PostgREST instance for the health check to work correctly. Don't use the special values(``!4``, ``*``, etc) in this case because the health check could report a false positive. diff --git a/postgrest.dict b/postgrest.dict index 7fed84b229..4313956b8e 100644 --- a/postgrest.dict +++ b/postgrest.dict @@ -61,6 +61,7 @@ HTTP HTTPS HV Ibarluzea +Integrations ilike imatch io From a530030b714745fc6a2f43fad83e7203be48c448 Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Mon, 8 May 2023 13:57:23 -0300 Subject: [PATCH 565/711] add integrations * Move Nginx and systemd to integration * Move External JWT Generatio to integration * greenplum short notice --- docs/ecosystem.rst | 33 ++------------------------------- docs/integrations/greenplum.rst | 6 ++++++ docs/integrations/jwt_gen.rst | 31 +++++++++++++++++++++++++++++++ postgrest.dict | 1 + 4 files changed, 40 insertions(+), 31 deletions(-) create mode 100644 docs/integrations/greenplum.rst create mode 100644 docs/integrations/jwt_gen.rst diff --git a/docs/ecosystem.rst b/docs/ecosystem.rst index ba6292bd60..7774b3d1f8 100644 --- a/docs/ecosystem.rst +++ b/docs/ecosystem.rst @@ -1,34 +1,3 @@ -.. _external_jwt: - -External JWT Generation ------------------------ - -JWT from Auth0 -~~~~~~~~~~~~~~ - -An external service like `Auth0 `_ can do the hard work transforming OAuth from Github, Twitter, Google etc into a JWT suitable for PostgREST. Auth0 can also handle email signup and password reset flows. - -To use Auth0, create `an application `_ for your app and `an API `_ for your PostgREST server. Auth0 supports both HS256 and RS256 scheme for the issued tokens for APIs. For simplicity, you may first try HS256 scheme while creating your API on Auth0. Your application should use your PostgREST API's `API identifier `_ by setting it with the `audience parameter `_ during the authorization request. This will ensure that Auth0 will issue an access token for your PostgREST API. For PostgREST to verify the access token, you will need to set ``jwt-secret`` on PostgREST config file with your API's signing secret. - -.. note:: - - Our code requires a database role in the JWT. To add it you need to save the database role in Auth0 `app metadata `_. Then, you will need to write `a rule `_ that will extract the role from the user's app_metadata and set it as a `custom claim `_ in the access token. Note that, you may use Auth0's `core authorization feature `_ for more complex use cases. Metadata solution is mentioned here for simplicity. - - .. code:: javascript - - function (user, context, callback) { - - // Follow the documentations at - // https://postgrest.org/en/latest/configuration.html#db-role-claim-key - // to set a custom role claim on PostgREST - // and use it as custom claim attribute in this rule - const myRoleClaim = 'https://myapp.com/role'; - - user.app_metadata = user.app_metadata || {}; - context.accessToken[myRoleClaim] = user.app_metadata.role; - callback(null, user, context); - } - .. _community_tutorials: Community Tutorials @@ -47,6 +16,8 @@ Community Tutorials * `How PostgreSQL triggers work when called with a PostgREST PATCH HTTP request `_ - A tutorial to see how the old and new values are set or not when doing a PATCH request to PostgREST. +* `REST Data Service on YugabyteDB / PostgreSQL `_ + .. _templates: Templates diff --git a/docs/integrations/greenplum.rst b/docs/integrations/greenplum.rst new file mode 100644 index 0000000000..c8f02242e7 --- /dev/null +++ b/docs/integrations/greenplum.rst @@ -0,0 +1,6 @@ +Greenplum +######### + +`Greenplum `_ has been reported to work by adding ``LOGIN`` to the :ref:`anonymous and user roles `. + +For more details, see https://github.com/PostgREST/postgrest/issues/2021. diff --git a/docs/integrations/jwt_gen.rst b/docs/integrations/jwt_gen.rst new file mode 100644 index 0000000000..f2b80517ae --- /dev/null +++ b/docs/integrations/jwt_gen.rst @@ -0,0 +1,31 @@ +.. _external_jwt: + +External JWT Generation +----------------------- + +JWT from Auth0 +~~~~~~~~~~~~~~ + +An external service like `Auth0 `_ can do the hard work transforming OAuth from Github, Twitter, Google etc into a JWT suitable for PostgREST. Auth0 can also handle email signup and password reset flows. + +To use Auth0, create `an application `_ for your app and `an API `_ for your PostgREST server. Auth0 supports both HS256 and RS256 scheme for the issued tokens for APIs. For simplicity, you may first try HS256 scheme while creating your API on Auth0. Your application should use your PostgREST API's `API identifier `_ by setting it with the `audience parameter `_ during the authorization request. This will ensure that Auth0 will issue an access token for your PostgREST API. For PostgREST to verify the access token, you will need to set ``jwt-secret`` on PostgREST config file with your API's signing secret. + +.. note:: + + Our code requires a database role in the JWT. To add it you need to save the database role in Auth0 `app metadata `_. Then, you will need to write `a rule `_ that will extract the role from the user's app_metadata and set it as a `custom claim `_ in the access token. Note that, you may use Auth0's `core authorization feature `_ for more complex use cases. Metadata solution is mentioned here for simplicity. + + .. code:: javascript + + function (user, context, callback) { + + // Follow the documentations at + // https://postgrest.org/en/latest/configuration.html#db-role-claim-key + // to set a custom role claim on PostgREST + // and use it as custom claim attribute in this rule + const myRoleClaim = 'https://myapp.com/role'; + + user.app_metadata = user.app_metadata || {}; + context.accessToken[myRoleClaim] = user.app_metadata.role; + callback(null, user, context); + } + diff --git a/postgrest.dict b/postgrest.dict index 4313956b8e..6e1e1dd4c8 100644 --- a/postgrest.dict +++ b/postgrest.dict @@ -48,6 +48,7 @@ Github Google grantor GraphQL +Greenplum gte GUC gucs From c82b23940be4e5c489bd218eadabac5217eaf50b Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Wed, 10 May 2023 12:51:06 -0300 Subject: [PATCH 566/711] add missing mention to cache reload on recovery --- docs/references/connection_pool.rst | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/references/connection_pool.rst b/docs/references/connection_pool.rst index c7f6d7ed05..38dabeee13 100644 --- a/docs/references/connection_pool.rst +++ b/docs/references/connection_pool.rst @@ -67,6 +67,8 @@ If the pool loses the connection to the database, it will retry reconnecting usi The retries happen immediately after a connection loss, if :ref:`db-channel-enabled` is set to true(the default). Otherwise they'll happen once a request arrives. +The server reloads the :ref:`schema_cache` when recoverying. + To notify the client of the next retry, the server sends a ``503 Service Unavailable`` status with the ``Retry-After: x`` header. Where ``x`` is the number of seconds programmed for the next retry. .. _external_connection_poolers: From fc635d18ae869780bd523da3e2138e1b07250abd Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Tue, 9 May 2023 23:07:53 -0300 Subject: [PATCH 567/711] split the API reference --- docs/_static/css/custom.css | 4 + docs/index.rst | 7 + docs/references/admin.rst | 79 + docs/references/api.rst | 2871 +---------------- docs/references/api/cors.rst | 34 + docs/references/api/openapi.rst | 45 + docs/references/api/options.rst | 52 + docs/references/api/resource_embedding.rst | 836 +++++ .../api/resource_representation.rst | 150 + docs/references/api/schemas.rst | 107 + docs/references/api/stored_procedures.rst | 456 +++ docs/references/api/tables_views.rst | 1060 ++++++ docs/references/api/url_grammar.rst | 108 + docs/references/configuration.rst | 25 +- docs/references/connection_pool.rst | 2 +- postgrest.dict | 1 + 16 files changed, 2954 insertions(+), 2883 deletions(-) create mode 100644 docs/references/api/cors.rst create mode 100644 docs/references/api/openapi.rst create mode 100644 docs/references/api/options.rst create mode 100644 docs/references/api/resource_embedding.rst create mode 100644 docs/references/api/resource_representation.rst create mode 100644 docs/references/api/schemas.rst create mode 100644 docs/references/api/stored_procedures.rst create mode 100644 docs/references/api/tables_views.rst create mode 100644 docs/references/api/url_grammar.rst diff --git a/docs/_static/css/custom.css b/docs/_static/css/custom.css index a1bd351fec..602ef678fc 100644 --- a/docs/_static/css/custom.css +++ b/docs/_static/css/custom.css @@ -89,3 +89,7 @@ div.line-block { #integrations span.caption-text { display: none; } + +#api span.caption-text { + display: none; +} diff --git a/docs/index.rst b/docs/index.rst index a90ece3402..09529b4b59 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -125,6 +125,13 @@ Technical references for PostgREST's functionality. :name: references :maxdepth: 1 + references/auth.rst + references/api.rst + references/transactions.rst + references/connection_pool.rst + references/schema_cache.rst + references/errors.rst + references/configuration.rst references/* Explanations diff --git a/docs/references/admin.rst b/docs/references/admin.rst index 31f86599b0..ed83e8c9dd 100644 --- a/docs/references/admin.rst +++ b/docs/references/admin.rst @@ -89,6 +89,85 @@ When debugging a problem it's important to verify the PostgREST version. Look fo Server: postgrest/11.0.1 +.. _explain_plan: + +Execution plan +-------------- + +You can get the `EXPLAIN execution plan `_ of a request by adding the ``Accept: application/vnd.pgrst.plan`` header. +This is enabled by :ref:`db-plan-enabled` (false by default). + +.. tabs:: + + .. code-tab:: http + + GET /users?select=name&order=id HTTP/1.1 + Accept: application/vnd.pgrst.plan + + .. code-tab:: bash Curl + + curl "http://localhost:3000/users?select=name&order=id" \ + -H "Accept: application/vnd.pgrst.plan" + +.. code-block:: psql + + Aggregate (cost=73.65..73.68 rows=1 width=112) + -> Index Scan using users_pkey on users (cost=0.15..60.90 rows=850 width=36) + +The output of the plan is generated in ``text`` format by default but you can change it to JSON by using the ``+json`` suffix. + +.. tabs:: + + .. code-tab:: http + + GET /users?select=name&order=id HTTP/1.1 + Accept: application/vnd.pgrst.plan+json + + .. code-tab:: bash Curl + + curl "http://localhost:3000/users?select=name&order=id" \ + -H "Accept: application/vnd.pgrst.plan+json" + +.. code-block:: json + + [ + { + "Plan": { + "Node Type": "Aggregate", + "Strategy": "Plain", + "Partial Mode": "Simple", + "Parallel Aware": false, + "Async Capable": false, + "Startup Cost": 73.65, + "Total Cost": 73.68, + "Plan Rows": 1, + "Plan Width": 112, + "Plans": [ + { + "Node Type": "Index Scan", + "Parent Relationship": "Outer", + "Parallel Aware": false, + "Async Capable": false, + "Scan Direction": "Forward", + "Index Name": "users_pkey", + "Relation Name": "users", + "Alias": "users", + "Startup Cost": 0.15, + "Total Cost": 60.90, + "Plan Rows": 850, + "Plan Width": 36 + } + ] + } + } + ] + +By default the plan is assumed to generate the JSON representation of a resource(``application/json``), but you can obtain the plan for the :ref:`different representations that PostgREST supports ` by adding them to the ``for`` parameter. For instance, to obtain the plan for a ``text/xml``, you would use ``Accept: application/vnd.pgrst.plan; for="text/xml``. + +The other available parameters are ``analyze``, ``verbose``, ``settings``, ``buffers`` and ``wal``, which correspond to the `EXPLAIN command options `_. To use the ``analyze`` and ``wal`` parameters for example, you would add them like ``Accept: application/vnd.pgrst.plan; options=analyze|wal``. + +Note that akin to the EXPLAIN command, the changes will be committed when using the ``analyze`` option. To avoid this, you can use the :ref:`db-tx-end` and the ``Prefer: tx=rollback`` header. + .. _health_check: Health Check diff --git a/docs/references/api.rst b/docs/references/api.rst index 0dd517fc22..b83d24b94e 100644 --- a/docs/references/api.rst +++ b/docs/references/api.rst @@ -3,2861 +3,16 @@ API ### -.. role:: sql(code) - :language: sql - -.. _tables_views: - -Tables and Views -================ - -All views and tables in the exposed schema and accessible by the active database role for a request are available for querying. They are exposed in one-level deep routes. For instance the full contents of a table `people` is returned at - -.. tabs:: - - .. code-tab:: http - - GET /people HTTP/1.1 - - .. code-tab:: bash Curl - - curl "http://localhost:3000/people" - -There are no deeply/nested/routes. Each route provides OPTIONS, GET, HEAD, POST, PATCH, and DELETE verbs depending entirely on database permissions. - -.. note:: - - Why not provide nested routes? Many APIs allow nesting to retrieve related information, such as :code:`/films/1/director`. We offer a more flexible mechanism (inspired by GraphQL) to embed related information. It can handle one-to-many and many-to-many relationships. This is covered in the section about :ref:`resource_embedding`. - -.. _h_filter: - -Horizontal Filtering (Rows) ---------------------------- - -You can filter result rows by adding conditions on columns. For instance, to return people aged under 13 years old: - -.. tabs:: - - .. code-tab:: http - - GET /people?age=lt.13 HTTP/1.1 - - .. code-tab:: bash Curl - - curl "http://localhost:3000/people?age=lt.13" - -You can evaluate multiple conditions on columns by adding more query string parameters. For instance, to return people who are 18 or older **and** are students: - -.. tabs:: - - .. code-tab:: http - - GET /people?age=gte.18&student=is.true HTTP/1.1 - - .. code-tab:: bash Curl - - curl "http://localhost:3000/people?age=gte.18&student=is.true" - -.. _operators: - -Operators -~~~~~~~~~ - -These operators are available: - -============ ======================== ================================================================================== -Abbreviation In PostgreSQL Meaning -============ ======================== ================================================================================== -eq :code:`=` equals -gt :code:`>` greater than -gte :code:`>=` greater than or equal -lt :code:`<` less than -lte :code:`<=` less than or equal -neq :code:`<>` or :code:`!=` not equal -like :code:`LIKE` LIKE operator (to avoid `URL encoding `_ you can use ``*`` as an alias of the percent sign ``%`` for the pattern) -ilike :code:`ILIKE` ILIKE operator (to avoid `URL encoding `_ you can use ``*`` as an alias of the percent sign ``%`` for the pattern) -match :code:`~` ~ operator, see :ref:`pattern_matching` -imatch :code:`~*` ~* operator, see :ref:`pattern_matching` -in :code:`IN` one of a list of values, e.g. :code:`?a=in.(1,2,3)` - – also supports commas in quoted strings like - :code:`?a=in.("hi,there","yes,you")` -is :code:`IS` checking for exact equality (null,true,false,unknown) -fts :code:`@@` :ref:`fts` using to_tsquery -plfts :code:`@@` :ref:`fts` using plainto_tsquery -phfts :code:`@@` :ref:`fts` using phraseto_tsquery -wfts :code:`@@` :ref:`fts` using websearch_to_tsquery -cs :code:`@>` contains e.g. :code:`?tags=cs.{example, new}` -cd :code:`<@` contained in e.g. :code:`?values=cd.{1,2,3}` -ov :code:`&&` overlap (have points in common), e.g. :code:`?period=ov.[2017-01-01,2017-06-30]` – - also supports array types, use curly braces instead of square brackets e.g. - :code: `?arr=ov.{1,3}` -sl :code:`<<` strictly left of, e.g. :code:`?range=sl.(1,10)` -sr :code:`>>` strictly right of -nxr :code:`&<` does not extend to the right of, e.g. :code:`?range=nxr.(1,10)` -nxl :code:`&>` does not extend to the left of -adj :code:`-|-` is adjacent to, e.g. :code:`?range=adj.(1,10)` -not :code:`NOT` negates another operator, see :ref:`logical_operators` -or :code:`OR` logical :code:`OR`, see :ref:`logical_operators` -and :code:`AND` logical :code:`AND`, see :ref:`logical_operators` -============ ======================== ================================================================================== - -For more complicated filters you will have to create a new view in the database, or use a stored procedure. For instance, here's a view to show "today's stories" including possibly older pinned stories: - -.. code-block:: postgresql - - CREATE VIEW fresh_stories AS - SELECT * - FROM stories - WHERE pinned = true - OR published > now() - interval '1 day' - ORDER BY pinned DESC, published DESC; - -The view will provide a new endpoint: - -.. tabs:: - - .. code-tab:: http - - GET /fresh_stories HTTP/1.1 - - .. code-tab:: bash Curl - - curl "http://localhost:3000/fresh_stories" - -.. _logical_operators: - -Logical operators -~~~~~~~~~~~~~~~~~ - -Multiple conditions on columns are evaluated using ``AND`` by default, but you can combine them using ``OR`` with the ``or`` operator. For example, to return people under 18 **or** over 21: - -.. tabs:: - - .. code-tab:: http - - GET /people?or=(age.lt.18,age.gt.21) HTTP/1.1 - - .. code-tab:: bash Curl - - curl "http://localhost:3000/people?or=(age.lt.18,age.gt.21)" - -To **negate** any operator, you can prefix it with :code:`not` like :code:`?a=not.eq.2` or :code:`?not.and=(a.gte.0,a.lte.100)` . - -You can also apply complex logic to the conditions: - -.. tabs:: - - .. code-tab:: http - - GET /people?grade=gte.90&student=is.true&or=(age.eq.14,not.and(age.gte.11,age.lte.17)) HTTP/1.1 - - .. code-tab:: bash Curl - - curl "http://localhost:3000/people?grade=gte.90&student=is.true&or=(age.eq.14,not.and(age.gte.11,age.lte.17))" - -.. _pattern_matching: - -Pattern Matching -~~~~~~~~~~~~~~~~ - -The pattern-matching operators (:code:`like`, :code:`ilike`, :code:`match`, :code:`imatch`) exist to support filtering data using patterns instead of concrete strings, as described in the `PostgreSQL docs `__. - -To ensure best performance on larger data sets, an `appropriate index `__ should be used and even then, it depends on the pattern value and actual data statistics whether an existing index will be used by the query planner or not. - -.. _fts: - -Full-Text Search -~~~~~~~~~~~~~~~~ - -The :code:`fts` filter mentioned above has a number of options to support flexible textual queries, namely the choice of plain vs phrase search and the language used for stemming. Suppose that :code:`tsearch` is a table with column :code:`my_tsv`, of type `tsvector `_. The following examples illustrate the possibilities. - -.. tabs:: - - .. code-tab:: http - - GET /tsearch?my_tsv=fts(french).amusant HTTP/1.1 - - .. code-tab:: bash Curl - - curl "http://localhost:3000/tsearch?my_tsv=fts(french).amusant" - -.. tabs:: - - .. code-tab:: http - - GET /tsearch?my_tsv=plfts.The%20Fat%20Cats HTTP/1.1 - - .. code-tab:: bash Curl - - curl "http://localhost:3000/tsearch?my_tsv=plfts.The%20Fat%20Cats" - -.. tabs:: - - .. code-tab:: http - - GET /tsearch?my_tsv=not.phfts(english).The%20Fat%20Cats HTTP/1.1 - - .. code-tab:: bash Curl - - curl "http://localhost:3000/tsearch?my_tsv=not.phfts(english).The%20Fat%20Cats" - -.. tabs:: - - .. code-tab:: http - - GET /tsearch?my_tsv=not.wfts(french).amusant HTTP/1.1 - - .. code-tab:: bash Curl - - curl "http://localhost:3000/tsearch?my_tsv=not.wfts(french).amusant" - -Using `websearch_to_tsquery` requires PostgreSQL of version at least 11.0 and will raise an error in earlier versions of the database. - -.. _v_filter: - -Vertical Filtering (Columns) ----------------------------- - -When certain columns are wide (such as those holding binary data), it is more efficient for the server to withhold them in a response. The client can specify which columns are required using the :sql:`select` parameter. - -.. tabs:: - - .. code-tab:: http - - GET /people?select=first_name,age HTTP/1.1 - - .. code-tab:: bash Curl - - curl "http://localhost:3000/people?select=first_name,age" - -.. code-block:: json - - [ - {"first_name": "John", "age": 30}, - {"first_name": "Jane", "age": 20} - ] - -The default is :sql:`*`, meaning all columns. This value will become more important below in :ref:`resource_embedding`. - -Renaming Columns -~~~~~~~~~~~~~~~~ - -You can rename the columns by prefixing them with an alias followed by the colon ``:`` operator. - -.. tabs:: - - .. code-tab:: http - - GET /people?select=fullName:full_name,birthDate:birth_date HTTP/1.1 - - .. code-tab:: bash Curl - - curl "http://localhost:3000/people?select=fullName:full_name,birthDate:birth_date" - -.. code-block:: json - - [ - {"fullName": "John Doe", "birthDate": "04/25/1988"}, - {"fullName": "Jane Doe", "birthDate": "01/12/1998"} - ] - -.. _casting_columns: - -Casting Columns -~~~~~~~~~~~~~~~ - -Casting the columns is possible by suffixing them with the double colon ``::`` plus the desired type. - -.. tabs:: - - .. code-tab:: http - - GET /people?select=full_name,salary::text HTTP/1.1 - - .. code-tab:: bash Curl - - curl "http://localhost:3000/people?select=full_name,salary::text" - -.. code-block:: json - - [ - {"full_name": "John Doe", "salary": "90000.00"}, - {"full_name": "Jane Doe", "salary": "120000.00"} - ] - -.. _json_columns: - -JSON Columns ------------- - -You can specify a path for a ``json`` or ``jsonb`` column using the arrow operators(``->`` or ``->>``) as per the `PostgreSQL docs `__. - -.. code-block:: postgres - - CREATE TABLE people ( - id int, - json_data json - ); - -.. tabs:: - - .. code-tab:: http - - GET /people?select=id,json_data->>blood_type,json_data->phones HTTP/1.1 - - .. code-tab:: bash Curl - - curl "http://localhost:3000/people?select=id,json_data->>blood_type,json_data->phones" - -.. code-block:: json - - [ - { "id": 1, "blood_type": "A-", "phones": [{"country_code": "61", "number": "917-929-5745"}] }, - { "id": 2, "blood_type": "O+", "phones": [{"country_code": "43", "number": "512-446-4988"}, {"country_code": "43", "number": "213-891-5979"}] } - ] - -.. tabs:: - - .. code-tab:: http - - GET /people?select=id,json_data->phones->0->>number HTTP/1.1 - - .. code-tab:: bash Curl - - curl "http://localhost:3000/people?select=id,json_data->phones->0->>number" - -.. code-block:: json - - [ - { "id": 1, "number": "917-929-5745"}, - { "id": 2, "number": "512-446-4988"} - ] - -This also works with filters: - -.. tabs:: - - .. code-tab:: http - - GET /people?select=id,json_data->blood_type&json_data->>blood_type=eq.A- HTTP/1.1 - - .. code-tab:: bash Curl - - curl "http://localhost:3000/people?select=id,json_data->blood_type&json_data->>blood_type=eq.A-" - -.. code-block:: json - - [ - { "id": 1, "blood_type": "A-" }, - { "id": 3, "blood_type": "A-" }, - { "id": 7, "blood_type": "A-" } - ] - -Note that ``->>`` is used to compare ``blood_type`` as ``text``. To compare with an integer value use ``->``: - -.. tabs:: - - .. code-tab:: http - - GET /people?select=id,json_data->age&json_data->age=gt.20 HTTP/1.1 - - .. code-tab:: bash Curl - - curl "http://localhost:3000/people?select=id,json_data->age&json_data->age=gt.20" - -.. code-block:: json - - [ - { "id": 11, "age": 25 }, - { "id": 12, "age": 30 }, - { "id": 15, "age": 35 } - ] -.. _composite_array_columns: - -Composite / Array Columns -------------------------- - -The arrow operators(``->``, ``->>``) can also be used for accessing composite fields and array elements. - -.. code-block:: postgres - - CREATE TYPE coordinates ( - lat decimal(8,6), - long decimal(9,6) - ); - - CREATE TABLE countries ( - id int, - location coordinates, - languages text[] - ); - -.. tabs:: - - .. code-tab:: http - - GET /countries?select=id,location->>lat,location->>long,primary_language:languages->0&location->lat=gte.19 HTTP/1.1 - - .. code-tab:: bash Curl - - curl "http://localhost:3000/countries?select=id,location->>lat,location->>long,primary_language:languages->0&location->lat=gte.19" - -.. code-block:: json - - [ - { - "id": 5, - "lat": "19.741755", - "long": "-155.844437", - "primary_language": "en" - } - ] - -.. important:: - - When using the ``->`` and ``->>`` operators, PostgREST uses a query like ``to_jsonb()->'field'``. To make filtering and ordering on those nested fields use an index, the index needs to be created on the same expression, including the ``to_jsonb(...)`` call: - - .. code-block:: postgres - - CREATE INDEX ON mytable ((to_jsonb(data) -> 'identification' ->> 'registration_number')); - -.. _computed_cols: - -Computed / Virtual Columns --------------------------- - -Filters may be applied to computed columns(**a.k.a. virtual columns**) as well as actual table/view columns, even though the computed columns will not appear in the output. For example, to search first and last names at once we can create a computed column that will not appear in the output but can be used in a filter: - -.. code-block:: postgres - - CREATE TABLE people ( - fname text, - lname text - ); - - CREATE FUNCTION full_name(people) RETURNS text AS $$ - SELECT $1.fname || ' ' || $1.lname; - $$ LANGUAGE SQL; - - -- (optional) add an index to speed up anticipated query - CREATE INDEX people_full_name_idx ON people - USING GIN (to_tsvector('english', full_name(people))); - -A full-text search on the computed column: - -.. tabs:: - - .. code-tab:: http - - GET /people?full_name=fts.Beckett HTTP/1.1 - - .. code-tab:: bash Curl - - curl "http://localhost:3000/people?full_name=fts.Beckett" - -As mentioned, computed columns do not appear in the output by default. However you can include them by listing them in the vertical filtering :code:`select` parameter: - -.. tabs:: - - .. code-tab:: http - - GET /people?select=*,full_name HTTP/1.1 - - .. code-tab:: bash Curl - - curl "http://localhost:3000/people?select=*,full_name" - -.. important:: - - Computed columns must be created in the :ref:`exposed schema ` or in a schema in the :ref:`extra search path ` to be used in this way. When placing the computed column in the :ref:`exposed schema ` you can use an **unnamed** argument, as in the example above, to prevent it from being exposed as an :ref:`RPC ` under ``/rpc``. - -Unicode support ---------------- - -PostgREST supports unicode in schemas, tables, columns and values. To access a table with unicode name, use percent encoding. - -To request this: - -.. code-block:: http - - GET /موارد HTTP/1.1 - -Do this: - -.. tabs:: - - .. code-tab:: http - - GET /%D9%85%D9%88%D8%A7%D8%B1%D8%AF HTTP/1.1 - - .. code-tab:: bash Curl - - curl "http://localhost:3000/%D9%85%D9%88%D8%A7%D8%B1%D8%AF" - -.. _tabs-cols-w-spaces: - -Table / Columns with spaces -~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -You can request table/columns with spaces in them by percent encoding the spaces with ``%20``: - -.. tabs:: - - .. code-tab:: http - - GET /Order%20Items?Unit%20Price=lt.200 HTTP/1.1 - - .. code-tab:: bash Curl - - curl "http://localhost:3000/Order%20Items?Unit%20Price=lt.200" - -.. _reserved-chars: - -Reserved characters -~~~~~~~~~~~~~~~~~~~ - -If filters include PostgREST reserved characters(``,``, ``.``, ``:``, ``()``) you'll have to surround them in percent encoded double quotes ``%22`` for correct processing. - -Here ``Hebdon,John`` and ``Williams,Mary`` are values. - -.. tabs:: - - .. code-tab:: http - - GET /employees?name=in.(%22Hebdon,John%22,%22Williams,Mary%22) HTTP/1.1 - - .. code-tab:: bash Curl - - curl "http://localhost:3000/employees?name=in.(%22Hebdon,John%22,%22Williams,Mary%22)" - -Here ``information.cpe`` is a column name. - -.. tabs:: - - .. code-tab:: http - - GET /vulnerabilities?%22information.cpe%22=like.*MS* HTTP/1.1 - - .. code-tab:: bash Curl - - curl "http://localhost:3000/vulnerabilities?%22information.cpe%22=like.*MS*" - -If the value filtered by the ``in`` operator has a double quote (``"``), you can escape it using a backslash ``"\""``. A backslash itself can be used with a double backslash ``"\\"``. - -Here ``Quote:"`` and ``Backslash:\`` are percent-encoded values. Note that ``%5C`` is the percent-encoded backslash. - -.. tabs:: - - .. code-tab:: http - - GET /marks?name=in.(%22Quote:%5C%22%22,%22Backslash:%5C%5C%22) HTTP/1.1 - - .. code-tab:: bash Curl - - curl "http://localhost:3000/marks?name=in.(%22Quote:%5C%22%22,%22Backslash:%5C%5C%22)" - -.. note:: - - Some HTTP libraries might encode URLs automatically(e.g. :code:`axios`). In these cases you should use double quotes - :code:`""` directly instead of :code:`%22`. - -.. _ordering: - -Ordering --------- - -The reserved word :sql:`order` reorders the response rows. It uses a comma-separated list of columns and directions: - -.. tabs:: - - .. code-tab:: http - - GET /people?order=age.desc,height.asc HTTP/1.1 - - .. code-tab:: bash Curl - - curl "http://localhost:3000/people?order=age.desc,height.asc" - -If no direction is specified it defaults to ascending order: - -.. tabs:: - - .. code-tab:: http - - GET /people?order=age HTTP/1.1 - - .. code-tab:: bash Curl - - curl "http://localhost:3000/people?order=age" - -If you care where nulls are sorted, add ``nullsfirst`` or ``nullslast``: - -.. tabs:: - - .. code-tab:: http - - GET /people?order=age.nullsfirst HTTP/1.1 - - .. code-tab:: bash Curl - - curl "http://localhost:3000/people?order=age.nullsfirst" - -.. tabs:: - - .. code-tab:: http - - GET /people?order=age.desc.nullslast HTTP/1.1 - - .. code-tab:: bash Curl - - curl "http://localhost:3000/people?order=age.desc.nullslast" - -You can also use :ref:`computed_cols` to order the results, even though the computed columns will not appear in the output. You can sort by nested fields of :ref:`json_columns` with the JSON operators. - -.. _limits: - -Limits and Pagination ---------------------- - -PostgREST uses HTTP range headers to describe the size of results. Every response contains the current range and, if requested, the total number of results: - -.. code-block:: http - - HTTP/1.1 200 OK - Range-Unit: items - Content-Range: 0-14/* - -Here items zero through fourteen are returned. This information is available in every response and can help you render pagination controls on the client. This is an RFC7233-compliant solution that keeps the response JSON cleaner. - -There are two ways to apply a limit and offset rows: through request headers or query parameters. When using headers you specify the range of rows desired. This request gets the first twenty people. - -.. tabs:: - - .. code-tab:: http - - GET /people HTTP/1.1 - Range-Unit: items - Range: 0-19 - - .. code-tab:: bash Curl - - curl "http://localhost:3000/people" -i \ - -H "Range-Unit: items" \ - -H "Range: 0-19" - -Note that the server may respond with fewer if unable to meet your request: - -.. code-block:: http - - HTTP/1.1 200 OK - Range-Unit: items - Content-Range: 0-17/* - -You may also request open-ended ranges for an offset with no limit, e.g. :code:`Range: 10-`. - -The other way to request a limit or offset is with query parameters. For example - -.. tabs:: - - .. code-tab:: http - - GET /people?limit=15&offset=30 HTTP/1.1 - - .. code-tab:: bash Curl - - curl "http://localhost:3000/people?limit=15&offset=30" - -This method is also useful for embedded resources, which we will cover in another section. The server always responds with range headers even if you use query parameters to limit the query. - -.. _exact_count: - -Exact Count ------------ - -In order to obtain the total size of the table or view (such as when rendering the last page link in a pagination control), specify ``Prefer: count=exact`` as a request header: - -.. tabs:: - - .. code-tab:: http - - HEAD /bigtable HTTP/1.1 - Range-Unit: items - Range: 0-24 - Prefer: count=exact - - .. code-tab:: bash Curl - - curl "http://localhost:3000/bigtable" -I \ - -H "Range-Unit: items" \ - -H "Range: 0-24" \ - -H "Prefer: count=exact" - -Note that the larger the table the slower this query runs in the database. The server will respond with the selected range and total - -.. code-block:: http - - HTTP/1.1 206 Partial Content - Range-Unit: items - Content-Range: 0-24/3573458 - -.. _planned_count: - -Planned Count -------------- - -To avoid the shortcomings of :ref:`exact count `, PostgREST can leverage PostgreSQL statistics and get a fairly accurate and fast count. -To do this, specify the ``Prefer: count=planned`` header. - -.. tabs:: - - .. code-tab:: http - - HEAD /bigtable?limit=25 HTTP/1.1 - Prefer: count=planned - - .. code-tab:: bash Curl - - curl "http://localhost:3000/bigtable?limit=25" -I \ - -H "Prefer: count=planned" - -.. code-block:: http - - HTTP/1.1 206 Partial Content - Content-Range: 0-24/3572000 - -Note that the accuracy of this count depends on how up-to-date are the PostgreSQL statistics tables. -For example in this case, to increase the accuracy of the count you can do ``ANALYZE bigtable``. -See `ANALYZE `_ for more details. - -.. _estimated_count: - -Estimated Count ---------------- - -When you are interested in the count, the relative error is important. If you have a :ref:`planned count ` of 1000000 and the exact count is -1001000, the error is small enough to be ignored. But with a planned count of 7, an exact count of 28 would be a huge misprediction. - -In general, when having smaller row-counts, the estimated count should be as close to the exact count as possible. - -To help with these cases, PostgREST can get the exact count up until a threshold and get the planned count when -that threshold is surpassed. To use this behavior, you can specify the ``Prefer: count=estimated`` header. The **threshold** is -defined by :ref:`db-max-rows`. - -Here's an example. Suppose we set ``db-max-rows=1000`` and ``smalltable`` has 321 rows, then we'll get the exact count: - -.. tabs:: - - .. code-tab:: http - - HEAD /smalltable?limit=25 HTTP/1.1 - Prefer: count=estimated - - .. code-tab:: bash Curl - - curl "http://localhost:3000/smalltable?limit=25" -I \ - -H "Prefer: count=estimated" - -.. code-block:: http - - HTTP/1.1 206 Partial Content - Content-Range: 0-24/321 - -If we make a similar request on ``bigtable``, which has 3573458 rows, we would get the planned count: - -.. tabs:: - - .. code-tab:: http - - HEAD /bigtable?limit=25 HTTP/1.1 - Prefer: count=estimated - - .. code-tab:: bash Curl - - curl "http://localhost:3000/bigtable?limit=25" -I \ - -H "Prefer: count=estimated" - -.. code-block:: http - - HTTP/1.1 206 Partial Content - Content-Range: 0-24/3572000 - -.. _res_format: - -Response Format ---------------- - -PostgREST uses proper HTTP content negotiation (`RFC7231 `_) to deliver the desired representation of a resource. That is to say the same API endpoint can respond in different formats like JSON or CSV depending on the client request. - -Use the Accept request header to specify the acceptable format (or formats) for the response: - -.. tabs:: - - .. code-tab:: http - - GET /people HTTP/1.1 - Accept: application/json - - .. code-tab:: bash Curl - - curl "http://localhost:3000/people" \ - -H "Accept: application/json" - -The current possibilities are: - -* ``*/*`` -* ``text/csv`` -* ``application/json`` -* ``application/openapi+json`` -* ``application/geo+json`` - -and in the special case of a single-column select the following additional three formats; -also see the section :ref:`scalar_return_formats`: - -* ``application/octet-stream`` -* ``text/plain`` -* ``text/xml`` - -The server will default to JSON for API endpoints and OpenAPI on the root. - -.. _singular_plural: - -Singular or Plural ------------------- - -By default PostgREST returns all JSON results in an array, even when there is only one item. For example, requesting :code:`/items?id=eq.1` returns - -.. code:: json - - [ - { "id": 1 } - ] - -This can be inconvenient for client code. To return the first result as an object unenclosed by an array, specify :code:`vnd.pgrst.object` as part of the :code:`Accept` header - -.. tabs:: - - .. code-tab:: http - - GET /items?id=eq.1 HTTP/1.1 - Accept: application/vnd.pgrst.object+json - - .. code-tab:: bash Curl - - curl "http://localhost:3000/items?id=eq.1" \ - -H "Accept: application/vnd.pgrst.object+json" - -This returns - -.. code:: json - - { "id": 1 } - -When a singular response is requested but no entries are found, the server responds with an error message and 406 Not Acceptable status code rather than the usual empty array and 200 status: - -.. code-block:: json - - { - "message": "JSON object requested, multiple (or no) rows returned", - "details": "Results contain 0 rows, application/vnd.pgrst.object+json requires 1 row", - "hint": null, - "code": "PGRST505" - } - -.. note:: - - Many APIs distinguish plural and singular resources using a special nested URL convention e.g. `/stories` vs `/stories/1`. Why do we use `/stories?id=eq.1`? The answer is because a singular resource is (for us) a row determined by a primary key, and primary keys can be compound (meaning defined across more than one column). The more familiar nested urls consider only a degenerate case of simple and overwhelmingly numeric primary keys. These so-called artificial keys are often introduced automatically by Object Relational Mapping libraries. - - Admittedly PostgREST could detect when there is an equality condition holding on all columns constituting the primary key and automatically convert to singular. However this could lead to a surprising change of format that breaks unwary client code just by filtering on an extra column. Instead we allow manually specifying singular vs plural to decouple that choice from the URL format. - -.. _resource_embedding: - -Resource Embedding -================== - -In addition to providing RESTful routes for each table and view, PostgREST allows related resources to be included together in a single -API call. This reduces the need for multiple API requests. The server uses **foreign keys** to determine which tables and views can be -returned together. For example, consider a database of films and their awards: - -.. image:: ../_static/film.png - -.. important:: - - Whenever FOREIGN KEY constraints change in the database schema you must refresh PostgREST's schema cache for Resource Embedding to work properly. See the section :ref:`schema_reloading`. - -.. _many-to-one: - -Many-to-one relationships -------------------------- - -Since ``films`` has a **foreign key** referencing ``directors``, this establishes a many-to-one relationship between them. Because of this, we're able -to request all the films and the director for each film. - -.. tabs:: - - .. code-tab:: http - - GET /films?select=title,directors(id,last_name) HTTP/1.1 - - .. code-tab:: bash Curl - - curl "http://localhost:3000/films?select=title,directors(id,last_name)" - -.. code-block:: json - - [ - { "title": "Workers Leaving The Lumière Factory In Lyon", - "directors": { - "id": 2, - "last_name": "Lumière" - } - }, - { "title": "The Dickson Experimental Sound Film", - "directors": { - "id": 1, - "last_name": "Dickson" - } - }, - { "title": "The Haunted Castle", - "directors": { - "id": 3, - "last_name": "Méliès" - } - } - ] - -Note that the embedded ``directors`` is returned as a JSON object because of the "to-one" end. - -Since the table name is plural, we can be more accurate by making it singular with an alias. - -.. tabs:: - - .. code-tab:: http - - GET /films?select=title,director:directors(id,last_name) HTTP/1.1 - - .. code-tab:: bash Curl - - curl "http://localhost:3000/films?select=title,director:directors(id,last_name)" - -.. code-block:: json - - [ - { "title": "Workers Leaving The Lumière Factory In Lyon", - "director": { - "id": 2, - "last_name": "Lumière" - } - }, - ".." - ] - -.. _one-to-many: - -One-to-many relationships -------------------------- - -The inverse one-to-many relationship between ``directors`` and ``films`` is detected based on the **foreign key** reference. In this case, the embedded ``films`` are returned as a JSON array because of the "to-many" end. - -.. tabs:: - - .. code-tab:: http - - GET /directors?select=last_name,films(title) HTTP/1.1 - - .. code-tab:: bash Curl - - curl "http://localhost:3000/directors?select=last_name,films(title)" - -.. code-block:: json - - [ - { "last_name": "Lumière", - "films": [ - {"title": "Workers Leaving The Lumière Factory In Lyon"} - ] - }, - { "last_name": "Dickson", - "films": [ - {"title": "The Dickson Experimental Sound Film"} - ] - }, - { "last_name": "Méliès", - "films": [ - {"title": "The Haunted Castle"} - ] - } - ] - -.. _many-to-many: - -Many-to-many relationships --------------------------- - -Many-to-many relationships are detected based on the join table. The join table must contain foreign keys to other two tables -and they must be part of its composite key. - -For the many-to-many relationship between ``films`` and ``actors``, the join table ``roles`` would be: - -.. code-block:: postgresql - - create table roles( - film_id int references films(id) - , actor_id int references actors(id) - , primary key(film_id, actor_id) - ); - - -- the join table can also be detected if the composite key has additional columns - - create table roles( - id int generated always as identity, - , film_id int references films(id) - , actor_id int references actors(id) - , primary key(id, film_id, actor_id) - ); - -.. tabs:: - - .. code-tab:: http - - GET /actors?select=first_name,last_name,films(title) HTTP/1.1 - - .. code-tab:: bash Curl - - curl "http://localhost:3000/actors?select=first_name,last_name,films(title)" - -.. code-block:: json - - [ - { "first_name": "Willem", - "last_name": "Dafoe", - "films": [ - {"title": "The Lighthouse"} - ] - }, - ".." - ] - -.. _one-to-one: - -One-to-one relationships ------------------------- - -one-to-one relationships are detected if there's an unique constraint on a foreign key. - -.. code-block:: postgresql - - CREATE TABLE technical_specs( - film_id INT REFERENCES films UNIQUE, - runtime TIME, - camera TEXT, - sound TEXT - ); - -Or if the foreign key is also a primary key. - -.. code-block:: postgresql - - -- references Films using the primary key as a foreign key - CREATE TABLE technical_specs( - film_id INT PRIMARY KEY REFERENCES films, - runtime TIME, - camera TEXT, - sound TEXT - ); - -.. tabs:: - - .. code-tab:: http - - GET /films?select=title,technical_specs(runtime) HTTP/1.1 - - .. code-tab:: bash Curl - - curl "http://localhost:3000/films?select=title,technical_specs(runtime)" - -.. code-block:: json - - [ - { - "title": "Pulp Fiction", - "technical_specs": {"camera": "Arriflex 35-III"} - }, - ".." - ] - -.. _computed_relationships: - -Computed relationships ----------------------- - -You can manually define relationships between resources. This is useful for database objects that can't define foreign keys, like `Foreign Data Wrappers `_. -To do this, you can create functions similar to :ref:`computed_cols`. - -Assuming there's a foreign table ``premieres`` that we want to relate to ``films``. - -.. code-block:: postgres - - create foreign table premieres ( - id integer, - location text, - "date" date, - film_id integer - ) server import_csv options ( filename '/tmp/directors.csv', format 'csv'); - - create function film(premieres) returns setof films rows 1 as $$ - select * from films where id = $1.film_id - $$ stable language sql; - -The above function defines a relationship between ``premieres`` (the parameter) and ``films`` (the return type) and since there's a ``rows 1``, this defines a many-to-one relationship. -The name of the function ``film`` is arbitrary and can be used to do the embedding: - -.. tabs:: - - .. code-tab:: http - - GET /premieres?select=location,film(name) HTTP/1.1 - - .. code-tab:: bash Curl - - curl "http://localhost:3000/premieres?select=location,film(name)" - -.. code-block:: json - - [ - { - "location": "Cannes Film Festival", - "film": {"name": "Pulp Fiction"} - }, - ".." - ] - -Now let's define the opposite one-to-many relationship with another function. - -.. code-block:: postgres - - create function premieres(films) returns setof premieres as $$ - select * from premieres where film_id = $1.id - $$ stable language sql; - -Similarly, this function defines a relationship between the parameter ``films`` and the return type ``premieres``. -In this case there's an implicit ``ROWS 1000`` defined by PostgreSQL(`search "result_rows" on this PostgreSQL doc `_), -we consider any value greater than 1 as "many" so this defines a one-to-many relationship. - -.. tabs:: - - .. code-tab:: http - - GET /films?select=name,premieres(name) HTTP/1.1 - - .. code-tab:: bash Curl - - curl "http://localhost:3000/films?select=name,premieres(name)" - -.. code-block:: json - - [ - { - "name": "Pulp Ficiton", - "premieres": [{"location": "Cannes Festival"}] - }, - ".." - ] - -Computed relationships also allow you to override the ones that are automatically detected by PostgREST. - -For example, to override the :ref:`many-to-one relationship ` between ``films`` and ``directors``. - -.. code-block:: postgres - - create function directors(films) returns setof directors rows 1 as $$ - select * from directors where id = $1.director_id - $$ stable language sql; - -Taking advantage of overloaded functions, you can use the same function name for different parameters and thus define relationships from other tables/views to ``directors``. - -.. code-block:: postgres - - create function directors(film_schools) returns setof directors as $$ - select * from directors where film_school_id = $1.id - $$ stable language sql; - -Computed relationships have good performance as their intended design follow the `Inlining conditions for table functions `_. - -.. warning:: - - - Always use ``SETOF`` when creating computed relationships. Functions can return a table without using ``SETOF``, but bear in mind that they will not be inlined. - - - Make sure to correctly label the ``to-one`` part of the relationship. When using the ``ROWS 1`` estimation, PostgREST will expect a single row to be returned. If that is not the case, then it will unnest the embedding and return repeated values for the top level resource. - -.. _nested_embedding: - -Nested Embedding ----------------- - -If you want to embed through join tables but need more control on the intermediate resources, you can do nested embedding. For instance, you can request the Actors, their Roles and the Films for those Roles: - -.. tabs:: - - .. code-tab:: http - - GET /actors?select=roles(character,films(title,year)) HTTP/1.1 - - .. code-tab:: bash Curl - - curl "http://localhost:3000/actors?select=roles(character,films(title,year))" - -.. _embed_filters: - -Embedded Filters ----------------- - -Embedded resources can be shaped similarly to their top-level counterparts. To do so, prefix the query parameters with the name of the embedded resource. For instance, to order the actors in each film: - -.. tabs:: - - .. code-tab:: http - - GET /films?select=*,actors(*)&actors.order=last_name,first_name HTTP/1.1 - - .. code-tab:: bash Curl - - curl "http://localhost:3000/films?select=*,actors(*)&actors.order=last_name,first_name" - -This sorts the list of actors in each film but does *not* change the order of the films themselves. To filter the roles returned with each film: - -.. tabs:: - - .. code-tab:: http - - GET /films?select=*,roles(*)&roles.character=in.(Chico,Harpo,Groucho) HTTP/1.1 - - .. code-tab:: bash Curl - - curl "http://localhost:3000/films?select=*,roles(*)&roles.character=in.(Chico,Harpo,Groucho)" - -Once again, this restricts the roles included to certain characters but does not filter the films in any way. Films without any of those characters would be included along with empty character lists. - -An ``or`` filter can be used for a similar operation: - -.. tabs:: - - .. code-tab:: http - - GET /films?select=*,roles(*)&roles.or=(character.eq.Gummo,character.eq.Zeppo) HTTP/1.1 - - .. code-tab:: bash Curl - - curl "http://localhost:3000/films?select=*,roles(*)&roles.or=(character.eq.Gummo,character.eq.Zeppo)" - -Limit and offset operations are possible: - -.. tabs:: - - .. code-tab:: http - - GET /films?select=*,actors(*)&actors.limit=10&actors.offset=2 HTTP/1.1 - - .. code-tab:: bash Curl - - curl "http://localhost:3000/films?select=*,actors(*)&actors.limit=10&actors.offset=2" - -Embedded resources can be aliased and filters can be applied on these aliases: - -.. tabs:: - - .. code-tab:: http - - GET /films?select=*,90_comps:competitions(name),91_comps:competitions(name)&90_comps.year=eq.1990&91_comps.year=eq.1991 HTTP/1.1 - - .. code-tab:: bash Curl - - curl "http://localhost:3000/films?select=*,90_comps:competitions(name),91_comps:competitions(name)&90_comps.year=eq.1990&91_comps.year=eq.1991" - -Filters can also be applied on nested embedded resources: - -.. tabs:: - - .. code-tab:: http - - GET /films?select=*,roles(*,actors(*))&roles.actors.order=last_name&roles.actors.first_name=like.*Tom* HTTP/1.1 - - .. code-tab:: bash Curl - - curl "http://localhost:3000/films?select=*,roles(*,actors(*))&roles.actors.order=last_name&roles.actors.first_name=like.*Tom*" - -The result will show the nested actors named Tom and order them by last name. Aliases can also be used instead of the resource names to filter the nested tables. - -.. _embedding_top_level_filter: - -Embedding with Top-level Filtering ----------------------------------- - -By default, :ref:`embed_filters` don't change the top-level resource(``films``) rows at all: - -.. tabs:: - - .. code-tab:: http - - GET /films?select=title,actors(first_name,last_name)&actors.first_name=eq.Jehanne HTTP/1.1 - - .. code-tab:: bash Curl - - curl "http://localhost:3000/films?select=title,actors(first_name,last_name)&actors.first_name=eq.Jehanne - -.. code-block:: json - - [ - { - "title": "Workers Leaving The Lumière Factory In Lyon", - "actors": [] - }, - { - "title": "The Dickson Experimental Sound Film", - "actors": [] - }, - { - "title": "The Haunted Castle", - "actors": [ - { - "first_name": "Jehanne", - "last_name": "d'Alcy" - } - ] - } - ] - -In order to filter the top level rows you need to add ``!inner`` to the embedded resource. For instance, to get **only** the films that have an actor named ``Jehanne``: - -.. tabs:: - - .. code-tab:: http - - GET /films?select=title,actors!inner(first_name,last_name)&actors.first_name=eq.Jehanne HTTP/1.1 - - .. code-tab:: bash Curl - - curl "http://localhost:3000/films?select=title,actors!inner(first_name,last_name)&actors.first_name=eq.Jehanne" - -.. code-block:: json - - [ - { - "title": "The Haunted Castle", - "actors": [ - { - "first_name": "Jehanne", - "last_name": "d'Alcy" - } - ] - } - ] - -.. _embedding_partitioned_tables: - -Embedding Partitioned Tables ----------------------------- - -Embedding can also be done between `partitioned tables `_ and other tables. - -For example, let's create the ``box_office`` partitioned table that has the gross daily revenue of a film: - -.. code-block:: postgres - - CREATE TABLE box_office ( - bo_date DATE NOT NULL, - film_id INT REFERENCES test.films NOT NULL, - gross_revenue DECIMAL(12,2) NOT NULL, - PRIMARY KEY (bo_date, film_id) - ) PARTITION BY RANGE (bo_date); - - -- Let's also create partitions for each month of 2021 - - CREATE TABLE box_office_2021_01 PARTITION OF test.box_office - FOR VALUES FROM ('2021-01-01') TO ('2021-01-31'); - - CREATE TABLE box_office_2021_02 PARTITION OF test.box_office - FOR VALUES FROM ('2021-02-01') TO ('2021-02-28'); - - -- and so until december 2021 - -Since it contains the ``films_id`` foreign key, it is possible to embed ``box_office`` and ``films``: - -.. tabs:: - - .. code-tab:: http - - GET /box_office?select=bo_date,gross_revenue,films(title)&gross_revenue=gte.1000000 HTTP/1.1 - - .. code-tab:: bash Curl - - curl "http://localhost:3000/box_office?select=bo_date,gross_revenue,films(title)&gross_revenue=gte.1000000" - -.. note:: - * Embedding on partitions is not allowed because it leads to ambiguity errors (see :ref:`embed_disamb`) between them and their parent partitioned table(more details at `#1783(comment) `_). :ref:`custom_queries` can be used if this is needed. - - * Partitioned tables can reference other tables since PostgreSQL 11 but can only be referenced from any other table since PostgreSQL 12. - -.. _embedding_views: - -Embedding Views ---------------- - -PostgREST will infer the relationships of a view based on its source tables. Source tables are the ones referenced in the ``FROM`` and ``JOIN`` clauses of the view definition. The foreign keys of the relationships must be present in the top ``SELECT`` clause of the view for this to work. - -For instance, the following view has ``nominations``, ``films`` and ``competitions`` as source tables: - -.. code-block:: postgres - - CREATE VIEW nominations_view AS - SELECT - films.title as film_title - , competitions.name as competition_name - , nominations.rank - , nominations.film_id as nominations_film_id - , films.id as film_id - FROM nominations - JOIN films ON films.id = nominations.film_id - JOIN competitions ON competitions.id = nominations.competition_id; - -Since this view contains ``nominations.film_id``, which has a **foreign key** relationship to ``films``, then we can embed the ``films`` table. Similarly, because the view contains ``films.id``, then we can also embed the ``roles`` and the ``actors`` tables (the last one in a many-to-many relationship): - -.. tabs:: - - .. code-tab:: http - - GET /nominations_view?select=film_title,films(language),roles(character),actors(last_name,first_name)&rank=eq.5 HTTP/1.1 - - .. code-tab:: bash Curl - - curl "http://localhost:3000/nominations_view?select=film_title,films(language),roles(character),actors(last_name,first_name)&rank=eq.5" - -It's also possible to embed `Materialized Views `_. - -.. important:: - - - It's not guaranteed that all kinds of views will be embeddable. In particular, views that contain UNIONs will not be made embeddable. - - + Why? PostgREST detects source table foreign keys in the view by querying and parsing `pg_rewrite `_. - This may fail depending on the complexity of the view. - + As a workaround, you can use :ref:`computed_relationships` to define manual relationships for views. - - - If view definitions change you must refresh PostgREST's schema cache for this to work properly. See the section :ref:`schema_reloading`. - -.. _embedding_view_chains: - -Embedding Chains of Views -------------------------- - -Views can also depend on other views, which in turn depend on the actual source table. For PostgREST to pick up those chains recursively to any depth, all the views must be in the search path, so either in the exposed schema (:ref:`db-schemas`) or in one of the schemas set in :ref:`db-extra-search-path`. This does not apply to the source table, which could be in a private schema as well. See :ref:`schema_isolation` for more details. - -.. _s_proc_embed: - -Embedding on Stored Procedures ------------------------------- - -If you have a :ref:`Stored Procedure ` that returns a table type, you can embed its related resources. - -Here's a sample function (notice the ``RETURNS SETOF films``). - -.. code-block:: plpgsql - - CREATE FUNCTION getallfilms() RETURNS SETOF films AS $$ - SELECT * FROM films; - $$ LANGUAGE SQL IMMUTABLE; - -A request with ``directors`` embedded: - -.. tabs:: - - .. code-tab:: http - - GET /rpc/getallfilms?select=title,directors(id,last_name)&title=like.*Workers* HTTP/1.1 - - .. code-tab:: bash Curl - - curl "http://localhost:3000/rpc/getallfilms?select=title,directors(id,last_name)&title=like.*Workers*" - -.. code-block:: json - - [ - { "title": "Workers Leaving The Lumière Factory In Lyon", - "directors": { - "id": 2, - "last_name": "Lumière" - } - } - ] - -.. _mutation_embed: - -Embedding after Insertions/Updates/Deletions --------------------------------------------- - -You can embed related resources after doing :ref:`insert`, :ref:`update` or :ref:`delete`. - -Say you want to insert a **film** and then get some of its attributes plus embed its **director**. - -.. tabs:: - - .. code-tab:: http - - POST /films?select=title,year,director:directors(first_name,last_name) HTTP/1.1 - Prefer: return=representation - - { - "id": 100, - "director_id": 40, - "title": "127 hours", - "year": 2010, - "rating": 7.6, - "language": "english" - } - - .. code-tab:: bash Curl - - curl "http://localhost:3000/films?select=title,year,director:directors(first_name,last_name)" \ - -H "Prefer: return=representation" \ - -d @- << EOF - { - "id": 100, - "director_id": 40, - "title": "127 hours", - "year": 2010, - "rating": 7.6, - "language": "english" - } - EOF - -Response: - -.. code-block:: json - - { - "title": "127 hours", - "year": 2010, - "director": { - "first_name": "Danny", - "last_name": "Boyle" - } - } - -.. _embed_disamb: - -Embedding Disambiguation ------------------------- - -For doing resource embedding, PostgREST infers the relationship between two tables based on a foreign key between them. -However, in cases where there's more than one foreign key between two tables, it's not possible to infer the relationship unambiguously -by just specifying the tables names. - -.. _target_disamb: - -Target Disambiguation -~~~~~~~~~~~~~~~~~~~~~ - -For example, suppose you have the following ``orders`` and ``addresses`` tables: - -.. image:: ../_static/orders.png - -And you try to embed ``orders`` with ``addresses`` (this is the **target**): - -.. tabs:: - - .. code-tab:: http - - GET /orders?select=*,addresses(*) HTTP/1.1 - - .. code-tab:: bash Curl - - curl "http://localhost:3000/orders?select=*,addresses(*)" -i - -Since the ``orders`` table has two foreign keys to the ``addresses`` table — an order has a billing address and a shipping address — -the request is ambiguous and PostgREST will respond with an error: - -.. code-block:: http - - HTTP/1.1 300 Multiple Choices - - {..} - -If this happens, you need to disambiguate the request by adding precision to the **target**. -Instead of the **table name**, you can specify the **foreign key constraint name** or the **column name** that is part of the foreign key. - -Let's try first with the **foreign key constraint name**. To make it clearer we can name it: - -.. code-block:: postgresql - - ALTER TABLE orders - ADD CONSTRAINT billing_address foreign key (billing_address_id) references addresses(id), - ADD CONSTRAINT shipping_address foreign key (shipping_address_id) references addresses(id); - - -- Or if the constraints names were already generated by PostgreSQL we can rename them - -- ALTER TABLE orders - -- RENAME CONSTRAINT orders_billing_address_id_fkey TO billing_address, - -- RENAME CONSTRAINT orders_shipping_address_id_fkey TO shipping_address; - -Now we can unambiguously embed the billing address by specifying the ``billing_address`` foreign key constraint as the **target**. - -.. tabs:: - - .. code-tab:: http - - GET /orders?select=name,billing_address(name) HTTP/1.1 - - .. code-tab:: bash Curl - - curl "http://localhost:3000/orders?select=name,billing_address(name)" - -.. code-block:: json - - [ - { - "name": "Personal Water Filter", - "billing_address": { - "name": "32 Glenlake Dr.Dearborn, MI 48124" - } - } - ] - -Alternatively, you can specify the **column name** of the foreign key constraint as the **target**. This can be aliased to make -the result more clear. - -.. tabs:: - - .. code-tab:: http - - GET /orders?select=name,billing_address:billing_address_id(name) HTTP/1.1 - - .. code-tab:: bash Curl - - curl "http://localhost:3000/orders?select=name,billing_address:billing_address_id(name)" - -.. code-block:: json - - [ - { - "name": "Personal Water Filter", - "billing_address": { - "name": "32 Glenlake Dr.Dearborn, MI 48124" - } - } - ] - -.. _hint_disamb: - -Hint Disambiguation -~~~~~~~~~~~~~~~~~~~ - -If specifying the **target** is not enough for unambiguous embedding, you can add a **hint**. For example, let's assume we create -two views of ``addresses``: ``central_addresses`` and ``eastern_addresses``. - -PostgREST cannot detect a view as an embedded resource by using a column name or foreign key name as targets, that is why we need to use the view name ``central_addresses`` instead. But, still, this is not enough for an unambiguous embed. - -.. tabs:: - - .. code-tab:: http - - GET /orders?select=*,central_addresses(*) HTTP/1.1 - - .. code-tab:: bash Curl - - curl "http://localhost:3000/orders?select=*,central_addresses(*)" -i - -.. code-block:: http - - HTTP/1.1 300 Multiple Choices - -For solving this case, in addition to the **target**, we can add a **hint**. -Here, we still specify ``central_addresses`` as the **target** and use the ``billing_address`` foreign key as the **hint**: - -.. tabs:: - - .. code-tab:: http - - GET /orders?select=*,central_addresses!billing_address(*) HTTP/1.1 - - .. code-tab:: bash Curl - - curl 'http://localhost:3000/orders?select=*,central_addresses!billing_address(*)' -i - -.. code-block:: http - - HTTP/1.1 200 OK - - [ ... ] - -Similarly to the **target**, the **hint** can be a **table name**, **foreign key constraint name** or **column name**. - -Hints also work alongside ``!inner`` if a top level filtering is needed. From the above example: - -.. tabs:: - - .. code-tab:: http - - GET /orders?select=*,central_addresses!billing_address!inner(*)¢ral_addresses.code=AB1000 HTTP/1.1 - - .. code-tab:: bash Curl - - curl "http://localhost:3000/orders?select=*,central_addresses!billing_address!inner(*)¢ral_addresses.code=AB1000" - -.. note:: - - If the relationship is so complex that hint disambiguation does not solve it, you can use :ref:`computed_relationships`. - -.. _insert: - -Insertions -========== - -All tables and `auto-updatable views `_ can be modified through the API, subject to permissions of the requester's database role. - -To create a row in a database table post a JSON object whose keys are the names of the columns you would like to create. Missing properties will be set to default values when applicable. - -.. tabs:: - - .. code-tab:: http - - POST /table_name HTTP/1.1 - - { "col1": "value1", "col2": "value2" } - - .. code-tab:: bash Curl - - curl "http://localhost:3000/table_name" \ - -X POST -H "Content-Type: application/json" \ - -d '{ "col1": "value1", "col2": "value2" }' - -If the table has a primary key, the response can contain a :code:`Location` header describing where to find the new object by including the header :code:`Prefer: return=headers-only` in the request. Make sure that the table is not write-only, otherwise constructing the :code:`Location` header will cause a permissions error. - -On the other end of the spectrum you can get the full created object back in the response to your request by including the header :code:`Prefer: return=representation`. That way you won't have to make another HTTP call to discover properties that may have been filled in on the server side. You can also apply the standard :ref:`v_filter` to these results. - -URL encoded payloads can be posted with ``Content-Type: application/x-www-form-urlencoded``. - -.. tabs:: - - .. code-tab:: http - - POST /people HTTP/1.1 - Content-Type: application/x-www-form-urlencoded - - name=John+Doe&age=50&weight=80 - - .. code-tab:: bash Curl - - curl "http://localhost:3000/people" \ - -X POST -H "Content-Type: application/x-www-form-urlencoded" \ - -d "name=John+Doe&age=50&weight=80" - -.. note:: - - When inserting a row you must post a JSON object, not quoted JSON. - - .. code:: - - Yes - { "a": 1, "b": 2 } - - No - "{ \"a\": 1, \"b\": 2 }" - - Some JavaScript libraries will post the data incorrectly if you're not careful. For best results try one of the :ref:`clientside_libraries` built for PostgREST. - -.. important:: - - It's recommended that you `use triggers instead of rules `_. - Insertion on views with complex `rules `_ might not work out of the box with PostgREST due to its usage of CTEs. - If you want to keep using rules, a workaround is to wrap the view insertion in a stored procedure and call it through the :ref:`s_procs` interface. - For more details, see this `github issue `_. - -.. _bulk_insert: - -Bulk Insert ------------ - -Bulk insert works exactly like single row insert except that you provide either a JSON array of objects having uniform keys, or lines in CSV format. This not only minimizes the HTTP requests required but uses a single INSERT statement on the back-end for efficiency. - -To bulk insert CSV simply post to a table route with :code:`Content-Type: text/csv` and include the names of the columns as the first row. For instance - -.. tabs:: - - .. code-tab:: http - - POST /people HTTP/1.1 - Content-Type: text/csv - - name,age,height - J Doe,62,70 - Jonas,10,55 - - .. code-tab:: bash Curl - - curl "http://localhost:3000/people" \ - -X POST -H "Content-Type: text/csv" \ - --data-binary @- << EOF - name,age,height - J Doe,62,70 - Jonas,10,55 - EOF - -An empty field (:code:`,,`) is coerced to an empty string and the reserved word :code:`NULL` is mapped to the SQL null value. Note that there should be no spaces between the column names and commas. - -To bulk insert JSON post an array of objects having all-matching keys - -.. tabs:: - - .. code-tab:: http - - POST /people HTTP/1.1 - Content-Type: application/json - - [ - { "name": "J Doe", "age": 62, "height": 70 }, - { "name": "Janus", "age": 10, "height": 55 } - ] - - .. code-tab:: bash Curl - - curl "http://localhost:3000/people" \ - -X POST -H "Content-Type: application/json" \ - -d @- << EOF - [ - { "name": "J Doe", "age": 62, "height": 70 }, - { "name": "Janus", "age": 10, "height": 55 } - ] - EOF - -.. _specify_columns: - -Specifying Columns ------------------- - -By using the :code:`columns` query parameter it's possible to specify the payload keys that will be inserted and ignore the rest of the payload. - -.. tabs:: - - .. code-tab:: http - - POST /datasets?columns=source,publication_date,figure HTTP/1.1 - Content-Type: application/json - - { - "source": "Natural Disaster Prevention and Control", - "publication_date": "2015-09-11", - "figure": 1100, - "location": "...", - "comment": "...", - "extra": "...", - "stuff": "..." - } - - .. code-tab:: bash Curl - - curl "http://localhost:3000/datasets?columns=source,publication_date,figure" \ - -X POST -H "Content-Type: application/json" \ - -d @- << EOF - { - "source": "Natural Disaster Prevention and Control", - "publication_date": "2015-09-11", - "figure": 1100, - "location": "...", - "comment": "...", - "extra": "...", - "stuff": "..." - } - EOF - -In this case, only **source**, **publication_date** and **figure** will be inserted. The rest of the JSON keys will be ignored. - -Using this also has the side-effect of being more efficient for :ref:`bulk_insert` since PostgREST will not process the JSON and -it'll send it directly to PostgreSQL. - -.. _update: - -Updates -======= - -To update a row or rows in a table, use the PATCH verb. Use :ref:`h_filter` to specify which record(s) to update. Here is an example query setting the :code:`category` column to child for all people below a certain age. - -.. tabs:: - - .. code-tab:: http - - PATCH /people?age=lt.13 HTTP/1.1 - - { "category": "child" } - - .. code-tab:: bash Curl - - curl "http://localhost:3000/people?age=lt.13" \ - -X PATCH -H "Content-Type: application/json" \ - -d '{ "category": "child" }' - -Updates also support :code:`Prefer: return=representation` plus :ref:`v_filter`. - -.. warning:: - - Beware of accidentally updating every row in a table. To learn to prevent that see :ref:`block_fulltable`. - -.. _upsert: - -Upsert -====== - -You can make an upsert with :code:`POST` and the :code:`Prefer: resolution=merge-duplicates` header: - -.. tabs:: - - .. code-tab:: http - - POST /employees HTTP/1.1 - Prefer: resolution=merge-duplicates - - [ - { "id": 1, "name": "Old employee 1", "salary": 30000 }, - { "id": 2, "name": "Old employee 2", "salary": 42000 }, - { "id": 3, "name": "New employee 3", "salary": 50000 } - ] - - .. code-tab:: bash Curl - - curl "http://localhost:3000/employees" \ - -X POST -H "Content-Type: application/json" \ - -H "Prefer: resolution=merge-duplicates" \ - -d @- << EOF - [ - { "id": 1, "name": "Old employee 1", "salary": 30000 }, - { "id": 2, "name": "Old employee 2", "salary": 42000 }, - { "id": 3, "name": "New employee 3", "salary": 50000 } - ] - EOF - -By default, upsert operates based on the primary key columns, you must specify all of them. You can also choose to ignore the duplicates with :code:`Prefer: resolution=ignore-duplicates`. This works best when the primary key is natural, but it's also possible to use it if the primary key is surrogate (example: "id serial primary key"). For more details read `this issue `_. - -.. important:: - After creating a table or changing its primary key, you must refresh PostgREST schema cache for upsert to work properly. To learn how to refresh the cache see :ref:`schema_reloading`. - -.. _on_conflict: - -On Conflict ------------ - -By specifying the ``on_conflict`` query parameter, you can make upsert work on a column(s) that has a UNIQUE constraint. - -.. tabs:: - - .. code-tab:: http - - POST /employees?on_conflict=name HTTP/1.1 - Prefer: resolution=merge-duplicates - - [ - { "name": "Old employee 1", "salary": 40000 }, - { "name": "Old employee 2", "salary": 52000 }, - { "name": "New employee 3", "salary": 60000 } - ] - - .. code-tab:: bash Curl - - curl "http://localhost:3000/employees?on_conflict=name" \ - -X POST -H "Content-Type: application/json" \ - -H "Prefer: resolution=merge-duplicates" \ - -d @- << EOF - [ - { "name": "Old employee 1", "salary": 40000 }, - { "name": "Old employee 2", "salary": 52000 }, - { "name": "New employee 3", "salary": 60000 } - ] - EOF - -.. _upsert_put: - -PUT ---- - -A single row upsert can be done by using :code:`PUT` and filtering the primary key columns with :code:`eq`: - -.. tabs:: - - .. code-tab:: http - - PUT /employees?id=eq.4 HTTP/1.1 - - { "id": 4, "name": "Sara B.", "salary": 60000 } - - .. code-tab:: bash Curl - - curl "http://localhost/employees?id=eq.4" \ - -X PUT -H "Content-Type: application/json" \ - -d '{ "id": 4, "name": "Sara B.", "salary": 60000 }' - -All the columns must be specified in the request body, including the primary key columns. - -.. _delete: - -Deletions -========= - -To delete rows in a table, use the DELETE verb plus :ref:`h_filter`. For instance deleting inactive users: - -.. tabs:: - - .. code-tab:: http - - DELETE /user?active=is.false HTTP/1.1 - - .. code-tab:: bash Curl - - curl "http://localhost:3000/user?active=is.false" -X DELETE - -Deletions also support :code:`Prefer: return=representation` plus :ref:`v_filter`. - -.. tabs:: - - .. code-tab:: http - - DELETE /user?id=eq.1 HTTP/1.1 - Prefer: return=representation - - .. code-tab:: bash Curl - - curl "http://localhost:3000/user?id=eq.1" -X DELETE \ - -H "Prefer: return=representation" - -.. code-block:: json - - {"id": 1, "email": "johndoe@email.com"} - -.. warning:: - - Beware of accidentally deleting all rows in a table. To learn to prevent that see :ref:`block_fulltable`. - -.. _limited_update_delete: - -Limited Updates/Deletions -========================= - -You can limit the amount of affected rows by :ref:`update` or :ref:`delete` with the ``limit`` query parameter. For this, you must add an explicit ``order`` on a unique column(s). - -.. tabs:: - - .. code-tab:: http - - PATCH /users?limit=10&order=id&last_login=lt.2017-01-01 HTTP/1.1 - - { "status": "inactive" } - - .. code-tab:: bash Curl - - curl -X PATCH "/users?limit=10&order=id&last_login=lt.2020-01-01" \ - -H "Content-Type: application/json" \ - -d '{ "status": "inactive" }' - -.. tabs:: - - .. code-tab:: http - - DELETE /users?limit=10&order=id&status=eq.inactive HTTP/1.1 - - .. code-tab:: bash Curl - - curl -X DELETE "http://localhost:3000/users?limit=10&order=id&status=eq.inactive" - -If your table has no unique columns, you can use the `ctid `_ system column. - -Using ``offset`` to target a different subset of rows is also possible. - -.. note:: - - There is no native ``UPDATE...LIMIT`` or ``DELETE...LIMIT`` support in PostgreSQL; the generated query simulates that behavior and is based on `this Crunchy Data blog post `_. - -.. _custom_queries: - -Custom Queries -============== - -The PostgREST URL grammar limits the kinds of queries clients can perform. It prevents arbitrary, potentially poorly constructed and slow client queries. It's good for quality of service, but means database administrators must create custom views and stored procedures to provide richer endpoints. The most common causes for custom endpoints are - -* Table unions -* More complicated joins than those provided by `Resource Embedding`_ -* Geo-spatial queries that require an argument, like "points near (lat,lon)" - -.. _s_procs: - -Stored Procedures -================= - -*"A single resource can be the equivalent of a database stored procedure, with the power to abstract state changes over any number of storage items"* -- `Roy T. Fielding `_ - -Every stored procedure in the exposed database schema is accessible under the :code:`/rpc` prefix. Procedures can perform any operations allowed by PostgreSQL (read data, modify data, and even DDL operations). - -.. note:: - - The ``/rpc`` prefix is used to avoid name collisions between views and procedures. - -POST on Stored Procedures -------------------------- - -To supply arguments in an API call, include a JSON object in the request payload. Each key/value of the object will become an argument. - -For instance, assume we have created this function in the database. - -.. code-block:: plpgsql - - CREATE FUNCTION add_them(a integer, b integer) - RETURNS integer AS $$ - SELECT a + b; - $$ LANGUAGE SQL IMMUTABLE; - -.. important:: - - Whenever you create or change a function you must refresh PostgREST's schema cache. See the section :ref:`schema_reloading`. - -The client can call it by posting an object like - -.. tabs:: - - .. code-tab:: http - - POST /rpc/add_them HTTP/1.1 - - { "a": 1, "b": 2 } - - .. code-tab:: bash Curl - - curl "http://localhost:3000/rpc/add_them" \ - -X POST -H "Content-Type: application/json" \ - -d '{ "a": 1, "b": 2 }' - -.. code-block:: json - - 3 - -.. note:: - - PostgreSQL converts identifier names to lowercase unless you quote them like: - - .. code-block:: postgres - - CREATE FUNCTION "someFunc"("someParam" text) ... - -GET on Stored Procedures ------------------------- - -If the function doesn't modify the database, it will also run under the GET method(see :ref:`access_mode`). - -.. tabs:: - - .. code-tab:: http - - GET /rpc/add_them?a=1&b=2 HTTP/1.1 - - .. code-tab:: bash Curl - - curl "http://localhost:3000/rpc/add_them?a=1&b=2" - -The function parameter names match the JSON object keys in the POST case, for the GET case they match the query parameters ``?a=1&b=2``. - -.. _s_proc_single_json: - -Calling functions with a single JSON parameter ----------------------------------------------- - -You can also call a function that takes a single parameter of type JSON by sending the header :code:`Prefer: params=single-object` with your request. That way the JSON request body will be used as the single argument. - -.. code-block:: plpgsql - - CREATE FUNCTION mult_them(param json) RETURNS int AS $$ - SELECT (param->>'x')::int * (param->>'y')::int - $$ LANGUAGE SQL; - -.. tabs:: - - .. code-tab:: http - - POST /rpc/mult_them HTTP/1.1 - Prefer: params=single-object - - { "x": 4, "y": 2 } - - .. code-tab:: bash Curl - - curl "http://localhost:3000/rpc/mult_them" \ - -X POST -H "Content-Type: application/json" \ - -H "Prefer: params=single-object" \ - -d '{ "x": 4, "y": 2 }' - -.. code-block:: json - - 8 - -.. _s_proc_single_unnamed: - -Calling functions with a single unnamed parameter -------------------------------------------------- - -You can make a POST request to a function with a single unnamed parameter to send raw ``json/jsonb``, ``bytea``, ``text`` or ``xml`` data. - -To send raw JSON, the function must have a single unnamed ``json`` or ``jsonb`` parameter and the header ``Content-Type: application/json`` must be included in the request. - -.. code-block:: plpgsql - - CREATE FUNCTION mult_them(json) RETURNS int AS $$ - SELECT ($1->>'x')::int * ($1->>'y')::int - $$ LANGUAGE SQL; - -.. tabs:: - - .. code-tab:: http - - POST /rpc/mult_them HTTP/1.1 - Content-Type: application/json - - { "x": 4, "y": 2 } - - .. code-tab:: bash Curl - - curl "http://localhost:3000/rpc/mult_them" \ - -X POST -H "Content-Type: application/json" \ - -d '{ "x": 4, "y": 2 }' - -.. code-block:: json - - 8 - -.. note:: - - If an overloaded function has a single ``json`` or ``jsonb`` unnamed parameter, PostgREST will call this function as a fallback provided that no other overloaded function is found with the parameters sent in the POST request. - -To send raw XML, the parameter type must be ``xml`` and the header ``Content-Type: text/xml`` must be included in the request. - -To send raw binary, the parameter type must be ``bytea`` and the header ``Content-Type: application/octet-stream`` must be included in the request. - -.. code-block:: plpgsql - - CREATE TABLE files(blob bytea); - - CREATE FUNCTION upload_binary(bytea) RETURNS void AS $$ - INSERT INTO files(blob) VALUES ($1); - $$ LANGUAGE SQL; - -.. tabs:: - - .. code-tab:: http - - POST /rpc/upload_binary HTTP/1.1 - Content-Type: application/octet-stream - - file_name.ext - - .. code-tab:: bash Curl - - curl "http://localhost:3000/rpc/upload_binary" \ - -X POST -H "Content-Type: application/octet-stream" \ - --data-binary "@file_name.ext" - -.. code-block:: http - - HTTP/1.1 200 OK - - [ ... ] - -To send raw text, the parameter type must be ``text`` and the header ``Content-Type: text/plain`` must be included in the request. - -.. _s_procs_array: - -Calling functions with array parameters ---------------------------------------- - -You can call a function that takes an array parameter: - -.. code-block:: postgres - - create function plus_one(arr int[]) returns int[] as $$ - SELECT array_agg(n + 1) FROM unnest($1) AS n; - $$ language sql; - -.. tabs:: - - .. code-tab:: http - - POST /rpc/plus_one HTTP/1.1 - Content-Type: application/json - - {"arr": [1,2,3,4]} - - .. code-tab:: bash Curl - - curl "http://localhost:3000/rpc/plus_one" \ - -X POST -H "Content-Type: application/json" \ - -d '{"arr": [1,2,3,4]}' - -.. code-block:: json - - [2,3,4,5] - -For calling the function with GET, you can pass the array as an `array literal `_, -as in ``{1,2,3,4}``. Note that the curly brackets have to be urlencoded(``{`` is ``%7B`` and ``}`` is ``%7D``). - -.. tabs:: - - .. code-tab:: http - - GET /rpc/plus_one?arr=%7B1,2,3,4%7D' HTTP/1.1 - - .. code-tab:: bash Curl - - curl "http://localhost:3000/rpc/plus_one?arr=%7B1,2,3,4%7D'" - -.. note:: - - For versions prior to PostgreSQL 10, to pass a PostgreSQL native array on a POST payload, you need to quote it and use an array literal: - - .. tabs:: - - .. code-tab:: http - - POST /rpc/plus_one HTTP/1.1 - - { "arr": "{1,2,3,4}" } - - .. code-tab:: bash Curl - - curl "http://localhost:3000/rpc/plus_one" \ - -X POST -H "Content-Type: application/json" \ - -d '{ "arr": "{1,2,3,4}" }' - - In these versions we recommend using function parameters of type JSON to accept arrays from the client. - -.. _s_procs_variadic: - -Calling variadic functions --------------------------- - -You can call a variadic function by passing a JSON array in a POST request: - -.. code-block:: postgres - - create function plus_one(variadic v int[]) returns int[] as $$ - SELECT array_agg(n + 1) FROM unnest($1) AS n; - $$ language sql; - -.. tabs:: - - .. code-tab:: http - - POST /rpc/plus_one HTTP/1.1 - Content-Type: application/json - - {"v": [1,2,3,4]} - - .. code-tab:: bash Curl - - curl "http://localhost:3000/rpc/plus_one" \ - -X POST -H "Content-Type: application/json" \ - -d '{"v": [1,2,3,4]}' - -.. code-block:: json - - [2,3,4,5] - -In a GET request, you can repeat the same parameter name: - -.. tabs:: - - .. code-tab:: http - - GET /rpc/plus_one?v=1&v=2&v=3&v=4 HTTP/1.1 - - .. code-tab:: bash Curl - - curl "http://localhost:3000/rpc/plus_one?v=1&v=2&v=3&v=4" - -Repeating also works in POST requests with ``Content-Type: application/x-www-form-urlencoded``: - -.. tabs:: - - .. code-tab:: http - - POST /rpc/plus_one HTTP/1.1 - Content-Type: application/x-www-form-urlencoded - - v=1&v=2&v=3&v=4 - - .. code-tab:: bash Curl - - curl "http://localhost:3000/rpc/plus_one" \ - -X POST -H "Content-Type: application/x-www-form-urlencoded" \ - -d 'v=1&v=2&v=3&v=4' - -Scalar functions ----------------- - -PostgREST will detect if the function is scalar or table-valued and will shape the response format accordingly: - -.. tabs:: - - .. code-tab:: http - - GET /rpc/add_them?a=1&b=2 HTTP/1.1 - - .. code-tab:: bash Curl - - curl "http://localhost:3000/rpc/add_them?a=1&b=2" - -.. code-block:: json - - 3 - -.. tabs:: - - .. code-tab:: http - - GET /rpc/best_films_2017 HTTP/1.1 - - .. code-tab:: bash Curl - - curl "http://localhost:3000/rpc/best_films_2017" - -.. code-block:: json - - [ - { "title": "Okja", "rating": 7.4}, - { "title": "Call me by your name", "rating": 8}, - { "title": "Blade Runner 2049", "rating": 8.1} - ] - -To manually choose a return format such as binary, plain text or XML, see the section :ref:`scalar_return_formats`. - - -.. _bulk_call: - -Bulk Call ---------- - -It's possible to call a function in a bulk way, analogously to :ref:`bulk_insert`. To do this, you need to add the -``Prefer: params=multiple-objects`` header to your request. - -.. tabs:: - - .. code-tab:: http - - POST /rpc/add_them HTTP/1.1 - Content-Type: text/csv - Prefer: params=multiple-objects - - a,b - 1,2 - 3,4 - - .. code-tab:: bash Curl - - curl "http://localhost:3000/rpc/add_them" \ - -X POST -H "Content-Type: text/csv" \ - -H "Prefer: params=multiple-objects" \ - --data-binary @- << EOF - a,b - 1,2 - 3,4 - EOF - -.. code-block:: json - - [ 3, 7 ] - -If you have large payloads to process, it's preferable you instead use a function with an :ref:`array parameter ` or JSON parameter, as this will be more efficient. - -It's also possible to :ref:`Specify Columns ` on functions calls. - -Function filters ----------------- - -A function that returns a table type response can be shaped using the same filters as the ones used for tables and views: - -.. code-block:: postgres - - CREATE FUNCTION best_films_2017() RETURNS SETOF films .. - -.. tabs:: - - .. code-tab:: http - - GET /rpc/best_films_2017?select=title,director:directors(*) HTTP/1.1 - - .. code-tab:: bash Curl - - curl "http://localhost:3000/rpc/best_films_2017?select=title,director:directors(*)" - -.. tabs:: - - .. code-tab:: http - - GET /rpc/best_films_2017?rating=gt.8&order=title.desc HTTP/1.1 - - .. code-tab:: bash Curl - - curl "http://localhost:3000/rpc/best_films_2017?rating=gt.8&order=title.desc" - -Overloaded functions --------------------- - -You can call overloaded functions with different number of arguments. - -.. code-block:: postgres - - CREATE FUNCTION rental_duration(customer_id integer) .. - - CREATE FUNCTION rental_duration(customer_id integer, from_date date) .. - -.. tabs:: - - .. code-tab:: http - - GET /rpc/rental_duration?customer_id=232 HTTP/1.1 - - .. code-tab:: bash Curl - - curl "http://localhost:3000/rpc/rental_duration?customer_id=232" - -.. tabs:: - - .. code-tab:: http - - GET /rpc/rental_duration?customer_id=232&from_date=2018-07-01 HTTP/1.1 - - .. code-tab:: bash Curl - - curl "http://localhost:3000/rpc/rental_duration?customer_id=232&from_date=2018-07-01" - -.. important:: - - Overloaded functions with the same argument names but different types are not supported. - -.. _scalar_return_formats: - -Response Formats For Scalar Responses -===================================== - -For scalar return values such as - -* single-column selects on tables or -* scalar functions, - -you can set the additional content types - -* ``application/octet-stream`` -* ``text/plain`` -* ``text/xml`` - -as part of the :code:`Accept` header. - -Example 1: If you want to return raw binary data from a :code:`bytea` column, you must specify :code:`application/octet-stream` as part of the :code:`Accept` header -and select a single column :code:`?select=bin_data`. - -.. tabs:: - - .. code-tab:: http - - GET /items?select=bin_data&id=eq.1 HTTP/1.1 - Accept: application/octet-stream - - .. code-tab:: bash Curl - - curl "http://localhost:3000/items?select=bin_data&id=eq.1" \ - -H "Accept: application/octet-stream" - -Example 2: You can request XML output when calling `Stored Procedures`_ that return a scalar value of type ``text/xml``. You are not forced to use select for this case. - -.. code-block:: postgres - - CREATE FUNCTION generate_xml_content(..) RETURNS xml .. - -.. tabs:: - - .. code-tab:: http - - POST /rpc/generate_xml_content HTTP/1.1 - Accept: text/xml - - .. code-tab:: bash Curl - - curl "http://localhost:3000/rpc/generate_xml_content" \ - -X POST -H "Accept: text/xml" - -Example 3: If the stored procedure returns non-scalar values, you need to do a :code:`select` in the same way as for GET binary output. - -.. code-block:: sql - - CREATE FUNCTION get_descriptions(..) RETURNS SETOF TABLE(id int, description text) .. - -.. tabs:: - - .. code-tab:: http - - POST /rpc/get_descriptions?select=description HTTP/1.1 - Accept: text/plain - - .. code-tab:: bash Curl - - curl "http://localhost:3000/rpc/get_descriptions?select=description" \ - -X POST -H "Accept: text/plain" - -.. note:: - - If more than one row would be returned the binary/plain-text/xml results will be concatenated with no delimiter. - - -.. _open-api: - -OpenAPI Support -=============== - -Every API hosted by PostgREST automatically serves a full `OpenAPI `_ description on the root path. This provides a list of all endpoints (tables, foreign tables, views, functions), along with supported HTTP verbs and example payloads. - -.. note:: - - By default, this output depends on the permissions of the role that is contained in the JWT role claim (or the :ref:`db-anon-role` if no JWT is sent). If you need to show all the endpoints disregarding the role's permissions, set the :ref:`openapi-mode` config to :code:`ignore-privileges`. - -For extra customization, the OpenAPI output contains a "description" field for every `SQL comment `_ on any database object. For instance, - -.. code-block:: sql - - COMMENT ON SCHEMA mammals IS - 'A warm-blooded vertebrate animal of a class that is distinguished by the secretion of milk by females for the nourishment of the young'; - - COMMENT ON TABLE monotremes IS - 'Freakish mammals lay the best eggs for breakfast'; - - COMMENT ON COLUMN monotremes.has_venomous_claw IS - 'Sometimes breakfast is not worth it'; - -These unsavory comments will appear in the generated JSON as the fields, ``info.description``, ``definitions.monotremes.description`` and ``definitions.monotremes.properties.has_venomous_claw.description``. - -Also if you wish to generate a ``summary`` field you can do it by having a multiple line comment, the ``summary`` will be the first line and the ``description`` the lines that follow it: - -.. code-block:: plpgsql - - COMMENT ON TABLE entities IS - $$Entities summary - - Entities description that - spans - multiple lines$$; - -If you need to include the ``security`` and ``securityDefinitions`` options, set the :ref:`openapi-security-active` configuration to ``true``. - -You can use a tool like `Swagger UI `_ to create beautiful documentation from the description and to host an interactive web-based dashboard. The dashboard allows developers to make requests against a live PostgREST server, and provides guidance with request headers and example request bodies. - -.. important:: - - The OpenAPI information can go out of date as the schema changes under a running server. To learn how to refresh the cache see :ref:`schema_reloading`. - -.. _options_requests: - -OPTIONS -======= - -You can verify which HTTP methods are allowed on endpoints for tables and views by using an OPTIONS request. These methods are allowed depending on what operations *can* be done on the table or view, not on the database permissions assigned to them. - -For a table named ``people``, OPTIONS would show: - -.. tabs:: - - .. code-tab:: http - - OPTIONS /people HTTP/1.1 - - .. code-tab:: bash Curl - - curl "http://localhost:3000/people" -X OPTIONS -i - -.. code-block:: http - - HTTP/1.1 200 OK - Allow: OPTIONS,GET,HEAD,POST,PUT,PATCH,DELETE - -For a view, the methods are determined by the presence of INSTEAD OF TRIGGERS. - -.. table:: - :widths: auto - - +--------------------+-------------------------------------------------------------------------------------------------+ - | Method allowed | View's requirements | - +====================+=================================================================================================+ - | OPTIONS, GET, HEAD | None (Always allowed) | - +--------------------+-------------------------------------------------------------------------------------------------+ - | POST | INSTEAD OF INSERT TRIGGER | - +--------------------+-------------------------------------------------------------------------------------------------+ - | PUT | INSTEAD OF INSERT TRIGGER, INSTEAD OF UPDATE TRIGGER, also requires the presence of a | - | | primary key | - +--------------------+-------------------------------------------------------------------------------------------------+ - | PATCH | INSTEAD OF UPDATE TRIGGER | - +--------------------+-------------------------------------------------------------------------------------------------+ - | DELETE | INSTEAD OF DELETE TRIGGER | - +--------------------+-------------------------------------------------------------------------------------------------+ - | All the above methods are allowed for | - | `auto-updatable views `_ | - +--------------------+-------------------------------------------------------------------------------------------------+ - -For functions, the methods depend on their volatility. ``VOLATILE`` functions allow only ``OPTIONS,POST``, whereas the rest also permit ``GET,HEAD``. - -.. important:: - - Whenever you add or remove tables or views, or modify a view's INSTEAD OF TRIGGERS on the database, you must refresh PostgREST's schema cache for OPTIONS requests to work properly. See the section :ref:`schema_reloading`. - -CORS ----- - -PostgREST sets highly permissive cross origin resource sharing, that is why it accepts Ajax requests from any domain. - -It also handles `preflight requests `_ done by the browser, which are cached using the returned ``Access-Control-Max-Age: 86400`` header (86400 seconds = 24 hours). This is useful to reduce the latency of the subsequent requests. - -A ``POST`` preflight request would look like this: - -.. tabs:: - - .. code-tab:: http - - OPTIONS /items HTTP/1.1 - Origin: http://example.com - Access-Control-Allow-Method: POST - Access-Control-Allow-Headers: Content-Type - - .. code-tab:: bash Curl - - curl -i "http://localhost:3000/items" \ - -X OPTIONS \ - -H "Origin: http://example.com" \ - -H "Access-Control-Request-Method: POST" \ - -H "Access-Control-Request-Headers: Content-Type" - -.. code-block:: http - - HTTP/1.1 200 OK - Access-Control-Allow-Origin: http://example.com - Access-Control-Allow-Credentials: true - Access-Control-Allow-Methods: GET, POST, PATCH, PUT, DELETE, OPTIONS, HEAD - Access-Control-Allow-Headers: Authorization, Content-Type, Accept, Accept-Language, Content-Language - Access-Control-Max-Age: 86400 - -.. _multiple-schemas: - -Switching Schemas -================= - -You can switch schemas at runtime with the ``Accept-Profile`` and ``Content-Profile`` headers. You can only switch to a schema that is included in :ref:`db-schemas`. - -For GET or HEAD, the schema to be used can be selected through the ``Accept-Profile`` header: - -.. tabs:: - - .. code-tab:: http - - GET /items HTTP/1.1 - Accept-Profile: tenant2 - - .. code-tab:: bash Curl - - curl "http://localhost:3000/items" \ - -H "Accept-Profile: tenant2" - -For POST, PATCH, PUT and DELETE, you can use the ``Content-Profile`` header for selecting the schema: - -.. tabs:: - - .. code-tab:: http - - POST /items HTTP/1.1 - Content-Profile: tenant2 - - {...} - - .. code-tab:: bash Curl - - curl "http://localhost:3000/items" \ - -X POST -H "Content-Type: application/json" \ - -H "Content-Profile: tenant2" \ - -d '{...}' - -You can also select the schema for :ref:`s_procs` and :ref:`open-api`. - -.. note:: - - These headers are based on the nascent "Content Negotiation by Profile" spec: https://www.w3.org/TR/dx-prof-conneg - -.. _explain_plan: - -Execution plan --------------- - -You can get the `EXPLAIN execution plan `_ of a request by adding the ``Accept: application/vnd.pgrst.plan`` header when :ref:`db-plan-enabled` is set to ``true``. - -.. tabs:: - - .. code-tab:: http - - GET /users?select=name&order=id HTTP/1.1 - Accept: application/vnd.pgrst.plan - - .. code-tab:: bash Curl - - curl "http://localhost:3000/users?select=name&order=id" \ - -H "Accept: application/vnd.pgrst.plan" - -.. code-block:: psql - - Aggregate (cost=73.65..73.68 rows=1 width=112) - -> Index Scan using users_pkey on users (cost=0.15..60.90 rows=850 width=36) - -The output of the plan is generated in ``text`` format by default but you can change it to JSON by using the ``+json`` suffix. - -.. tabs:: - - .. code-tab:: http - - GET /users?select=name&order=id HTTP/1.1 - Accept: application/vnd.pgrst.plan+json - - .. code-tab:: bash Curl - - curl "http://localhost:3000/users?select=name&order=id" \ - -H "Accept: application/vnd.pgrst.plan+json" - -.. code-block:: json - - [ - { - "Plan": { - "Node Type": "Aggregate", - "Strategy": "Plain", - "Partial Mode": "Simple", - "Parallel Aware": false, - "Async Capable": false, - "Startup Cost": 73.65, - "Total Cost": 73.68, - "Plan Rows": 1, - "Plan Width": 112, - "Plans": [ - { - "Node Type": "Index Scan", - "Parent Relationship": "Outer", - "Parallel Aware": false, - "Async Capable": false, - "Scan Direction": "Forward", - "Index Name": "users_pkey", - "Relation Name": "users", - "Alias": "users", - "Startup Cost": 0.15, - "Total Cost": 60.90, - "Plan Rows": 850, - "Plan Width": 36 - } - ] - } - } - ] - -By default the plan is assumed to generate the JSON representation of a resource(``application/json``), but you can obtain the plan for the :ref:`different representations that PostgREST supports ` by adding them to the ``for`` parameter. For instance, to obtain the plan for a ``text/xml``, you would use ``Accept: application/vnd.pgrst.plan; for="text/xml``. - -The other available parameters are ``analyze``, ``verbose``, ``settings``, ``buffers`` and ``wal``, which correspond to the `EXPLAIN command options `_. To use the ``analyze`` and ``wal`` parameters for example, you would add them like ``Accept: application/vnd.pgrst.plan; options=analyze|wal``. - -Note that akin to the EXPLAIN command, the changes will be committed when using the ``analyze`` option. To avoid this, you can use the :ref:`db-tx-end` and the ``Prefer: tx=rollback`` header. +PostgREST exposes three database objects of a schema as resources: tables, views and stored procedures. + +.. toctree:: + :glob: + :maxdepth: 1 + + api/tables_views.rst + api/stored_procedures.rst + api/schemas.rst + api/resource_embedding.rst + api/openapi.rst + api/resource_representation.rst + api/* diff --git a/docs/references/api/cors.rst b/docs/references/api/cors.rst new file mode 100644 index 0000000000..77ad54d681 --- /dev/null +++ b/docs/references/api/cors.rst @@ -0,0 +1,34 @@ +CORS +==== + +PostgREST sets highly permissive cross origin resource sharing, that is why it accepts Ajax requests from any domain. + +It also handles `preflight requests `_ done by the browser, which are cached using the returned ``Access-Control-Max-Age: 86400`` header (86400 seconds = 24 hours). This is useful to reduce the latency of the subsequent requests. + +A ``POST`` preflight request would look like this: + +.. tabs:: + + .. code-tab:: http + + OPTIONS /items HTTP/1.1 + Origin: http://example.com + Access-Control-Allow-Method: POST + Access-Control-Allow-Headers: Content-Type + + .. code-tab:: bash Curl + + curl -i "http://localhost:3000/items" \ + -X OPTIONS \ + -H "Origin: http://example.com" \ + -H "Access-Control-Request-Method: POST" \ + -H "Access-Control-Request-Headers: Content-Type" + +.. code-block:: http + + HTTP/1.1 200 OK + Access-Control-Allow-Origin: http://example.com + Access-Control-Allow-Credentials: true + Access-Control-Allow-Methods: GET, POST, PATCH, PUT, DELETE, OPTIONS, HEAD + Access-Control-Allow-Headers: Authorization, Content-Type, Accept, Accept-Language, Content-Language + Access-Control-Max-Age: 86400 diff --git a/docs/references/api/openapi.rst b/docs/references/api/openapi.rst new file mode 100644 index 0000000000..31d23b52a2 --- /dev/null +++ b/docs/references/api/openapi.rst @@ -0,0 +1,45 @@ +.. _open-api: + +OpenAPI +======= + +PostgREST automatically serves a full `OpenAPI `_ description on the root path. This provides a list of all endpoints (tables, foreign tables, views, functions), along with supported HTTP verbs and example payloads. + +.. note:: + + By default, this output depends on the permissions of the role that is contained in the JWT role claim (or the :ref:`db-anon-role` if no JWT is sent). If you need to show all the endpoints disregarding the role's permissions, set the :ref:`openapi-mode` config to :code:`ignore-privileges`. + +For extra customization, the OpenAPI output contains a "description" field for every `SQL comment `_ on any database object. For instance, + +.. code-block:: sql + + COMMENT ON SCHEMA mammals IS + 'A warm-blooded vertebrate animal of a class that is distinguished by the secretion of milk by females for the nourishment of the young'; + + COMMENT ON TABLE monotremes IS + 'Freakish mammals lay the best eggs for breakfast'; + + COMMENT ON COLUMN monotremes.has_venomous_claw IS + 'Sometimes breakfast is not worth it'; + +These unsavory comments will appear in the generated JSON as the fields, ``info.description``, ``definitions.monotremes.description`` and ``definitions.monotremes.properties.has_venomous_claw.description``. + +Also if you wish to generate a ``summary`` field you can do it by having a multiple line comment, the ``summary`` will be the first line and the ``description`` the lines that follow it: + +.. code-block:: plpgsql + + COMMENT ON TABLE entities IS + $$Entities summary + + Entities description that + spans + multiple lines$$; + +If you need to include the ``security`` and ``securityDefinitions`` options, set the :ref:`openapi-security-active` configuration to ``true``. + +You can use a tool like `Swagger UI `_ to create beautiful documentation from the description and to host an interactive web-based dashboard. The dashboard allows developers to make requests against a live PostgREST server, and provides guidance with request headers and example request bodies. + +.. important:: + + The OpenAPI information can go out of date as the schema changes under a running server. To learn how to refresh the cache see :ref:`schema_reloading`. + diff --git a/docs/references/api/options.rst b/docs/references/api/options.rst new file mode 100644 index 0000000000..288c3b53d2 --- /dev/null +++ b/docs/references/api/options.rst @@ -0,0 +1,52 @@ +.. _options_requests: + +OPTIONS method +============== + +You can verify which HTTP methods are allowed on endpoints for tables and views by using an OPTIONS request. These methods are allowed depending on what operations *can* be done on the table or view, not on the database permissions assigned to them. + +For a table named ``people``, OPTIONS would show: + +.. tabs:: + + .. code-tab:: http + + OPTIONS /people HTTP/1.1 + + .. code-tab:: bash Curl + + curl "http://localhost:3000/people" -X OPTIONS -i + +.. code-block:: http + + HTTP/1.1 200 OK + Allow: OPTIONS,GET,HEAD,POST,PUT,PATCH,DELETE + +For a view, the methods are determined by the presence of INSTEAD OF TRIGGERS. + +.. table:: + :widths: auto + + +--------------------+-------------------------------------------------------------------------------------------------+ + | Method allowed | View's requirements | + +====================+=================================================================================================+ + | OPTIONS, GET, HEAD | None (Always allowed) | + +--------------------+-------------------------------------------------------------------------------------------------+ + | POST | INSTEAD OF INSERT TRIGGER | + +--------------------+-------------------------------------------------------------------------------------------------+ + | PUT | INSTEAD OF INSERT TRIGGER, INSTEAD OF UPDATE TRIGGER, also requires the presence of a | + | | primary key | + +--------------------+-------------------------------------------------------------------------------------------------+ + | PATCH | INSTEAD OF UPDATE TRIGGER | + +--------------------+-------------------------------------------------------------------------------------------------+ + | DELETE | INSTEAD OF DELETE TRIGGER | + +--------------------+-------------------------------------------------------------------------------------------------+ + | All the above methods are allowed for | + | `auto-updatable views `_ | + +--------------------+-------------------------------------------------------------------------------------------------+ + +For functions, the methods depend on their volatility. ``VOLATILE`` functions allow only ``OPTIONS,POST``, whereas the rest also permit ``GET,HEAD``. + +.. important:: + + Whenever you add or remove tables or views, or modify a view's INSTEAD OF TRIGGERS on the database, you must refresh PostgREST's schema cache for OPTIONS requests to work properly. See the section :ref:`schema_reloading`. diff --git a/docs/references/api/resource_embedding.rst b/docs/references/api/resource_embedding.rst new file mode 100644 index 0000000000..231ddd3773 --- /dev/null +++ b/docs/references/api/resource_embedding.rst @@ -0,0 +1,836 @@ +.. _resource_embedding: + +Resource Embedding +================== + +PostgREST allows including related resources in a single API call. This reduces the need for many API requests. + +**Foreign Keys** determine which tables and views can be returned together. For example, consider a database of films and their awards: + +.. image:: ../../_static/film.png + +.. important:: + + Whenever foreign keys change you must do :ref:`schema_reloading` for this feature to work. + +.. _many-to-one: + +Many-to-one relationships +------------------------- + +Since ``films`` has a **foreign key** to ``directors``, this establishes a many-to-one relationship. Thus, we're able to request all the films and the director for each film. + +.. tabs:: + + .. code-tab:: http + + GET /films?select=title,directors(id,last_name) HTTP/1.1 + + .. code-tab:: bash Curl + + curl "http://localhost:3000/films?select=title,directors(id,last_name)" + +.. code-block:: json + + [ + { "title": "Workers Leaving The Lumière Factory In Lyon", + "directors": { + "id": 2, + "last_name": "Lumière" + } + }, + { "title": "The Dickson Experimental Sound Film", + "directors": { + "id": 1, + "last_name": "Dickson" + } + }, + { "title": "The Haunted Castle", + "directors": { + "id": 3, + "last_name": "Méliès" + } + } + ] + +Note that the embedded ``directors`` is returned as a JSON object because of the "to-one" end. + +Since the table name is plural, we can be more accurate by making it singular with an alias. + +.. tabs:: + + .. code-tab:: http + + GET /films?select=title,director:directors(id,last_name) HTTP/1.1 + + .. code-tab:: bash Curl + + curl "http://localhost:3000/films?select=title,director:directors(id,last_name)" + +.. code-block:: json + + [ + { "title": "Workers Leaving The Lumière Factory In Lyon", + "director": { + "id": 2, + "last_name": "Lumière" + } + }, + ".." + ] + +.. _one-to-many: + +One-to-many relationships +------------------------- + +The **foreign key reference** establishes the inverse one-to-many relationship. In this case, ``films`` returns as a JSON array because of the “to-many” end. + +.. tabs:: + + .. code-tab:: http + + GET /directors?select=last_name,films(title) HTTP/1.1 + + .. code-tab:: bash Curl + + curl "http://localhost:3000/directors?select=last_name,films(title)" + +.. code-block:: json + + [ + { "last_name": "Lumière", + "films": [ + {"title": "Workers Leaving The Lumière Factory In Lyon"} + ] + }, + { "last_name": "Dickson", + "films": [ + {"title": "The Dickson Experimental Sound Film"} + ] + }, + { "last_name": "Méliès", + "films": [ + {"title": "The Haunted Castle"} + ] + } + ] + +.. _many-to-many: + +Many-to-many relationships +-------------------------- + +The join table determines many-to-many relationships. It must contain foreign keys to other two tables and they must be part of its composite key. + +For the many-to-many relationship between ``films`` and ``actors``, the join table ``roles`` is: + +.. code-block:: postgresql + + create table roles( + film_id int references films(id) + , actor_id int references actors(id) + , primary key(film_id, actor_id) + ); + + -- the join table can also be detected if the composite key has additional columns + + create table roles( + id int generated always as identity, + , film_id int references films(id) + , actor_id int references actors(id) + , primary key(id, film_id, actor_id) + ); + +.. tabs:: + + .. code-tab:: http + + GET /actors?select=first_name,last_name,films(title) HTTP/1.1 + + .. code-tab:: bash Curl + + curl "http://localhost:3000/actors?select=first_name,last_name,films(title)" + +.. code-block:: json + + [ + { "first_name": "Willem", + "last_name": "Dafoe", + "films": [ + {"title": "The Lighthouse"} + ] + }, + ".." + ] + +.. _one-to-one: + +One-to-one relationships +------------------------ + +One-to-one relationships are detected when: + +- The foreign key has a unique constraint. + +.. code-block:: postgresql + + CREATE TABLE technical_specs( + film_id INT REFERENCES films UNIQUE, + runtime TIME, + camera TEXT, + sound TEXT + ); + +- The foreign key is a primary key. + +.. code-block:: postgresql + + -- references Films using the primary key as a foreign key + CREATE TABLE technical_specs( + film_id INT PRIMARY KEY REFERENCES films, + runtime TIME, + camera TEXT, + sound TEXT + ); + +.. tabs:: + + .. code-tab:: http + + GET /films?select=title,technical_specs(runtime) HTTP/1.1 + + .. code-tab:: bash Curl + + curl "http://localhost:3000/films?select=title,technical_specs(runtime)" + +.. code-block:: json + + [ + { + "title": "Pulp Fiction", + "technical_specs": {"camera": "Arriflex 35-III"} + }, + ".." + ] + +.. _computed_relationships: + +Computed relationships +---------------------- + +You can manually define relationships between resources. This is useful for database objects that can't define foreign keys, like `Foreign Data Wrappers `_. + +To do this, you can create functions similar to :ref:`computed_cols`. + +Assuming there's a foreign table ``premieres`` that we want to relate to ``films``. + +.. code-block:: postgres + + create foreign table premieres ( + id integer, + location text, + "date" date, + film_id integer + ) server import_csv options ( filename '/tmp/directors.csv', format 'csv'); + + create function film(premieres) returns setof films rows 1 as $$ + select * from films where id = $1.film_id + $$ stable language sql; + +The above function defines a relationship between ``premieres`` (the parameter) and ``films`` (the return type). Since there's a ``rows 1``, this defines a many-to-one relationship. +The name of the function ``film`` is arbitrary and can be used to do the embedding: + +.. tabs:: + + .. code-tab:: http + + GET /premieres?select=location,film(name) HTTP/1.1 + + .. code-tab:: bash Curl + + curl "http://localhost:3000/premieres?select=location,film(name)" + +.. code-block:: json + + [ + { + "location": "Cannes Film Festival", + "film": {"name": "Pulp Fiction"} + }, + ".." + ] + +Now let's define the opposite one-to-many relationship. + +.. code-block:: postgres + + create function premieres(films) returns setof premieres as $$ + select * from premieres where film_id = $1.id + $$ stable language sql; + +In this case there's an implicit ``ROWS 1000`` defined by PostgreSQL(`search "result_rows" on this PostgreSQL doc `_). +We consider any value greater than 1 as "many" so this defines a one-to-many relationship. + +.. tabs:: + + .. code-tab:: http + + GET /films?select=name,premieres(name) HTTP/1.1 + + .. code-tab:: bash Curl + + curl "http://localhost:3000/films?select=name,premieres(name)" + +.. code-block:: json + + [ + { + "name": "Pulp Ficiton", + "premieres": [{"location": "Cannes Festival"}] + }, + ".." + ] + +Computed relationships also allow you to override the ones that PostgREST auto-detects. + +For example, to override the :ref:`many-to-one relationship ` between ``films`` and ``directors``. + +.. code-block:: postgres + + create function directors(films) returns setof directors rows 1 as $$ + select * from directors where id = $1.director_id + $$ stable language sql; + +Thanks to overloaded functions, you can use the same function name for different parameters. Thus define relationships from other tables/views to directors. + +.. code-block:: postgres + + create function directors(film_schools) returns setof directors as $$ + select * from directors where film_school_id = $1.id + $$ stable language sql; + +Computed relationships have good performance as their intended design enable `inlining `_. + +.. warning:: + + - Always use ``SETOF`` when creating computed relationships. Functions can return a table without using ``SETOF``, but bear in mind that they will not be inlined. + + - Make sure to correctly label the ``to-one`` part of the relationship. When using the ``ROWS 1`` estimation, PostgREST will expect a single row to be returned. If that is not the case, it will unnest the embedding and return repeated values for the top level resource. + +.. _nested_embedding: + +Nested Embedding +---------------- + +If you want to embed through join tables but need more control on the intermediate resources, you can do nested embedding. For instance, you can request the Actors, their Roles and the Films for those Roles: + +.. tabs:: + + .. code-tab:: http + + GET /actors?select=roles(character,films(title,year)) HTTP/1.1 + + .. code-tab:: bash Curl + + curl "http://localhost:3000/actors?select=roles(character,films(title,year))" + +.. _embed_filters: + +Embedded Filters +---------------- + +Embedded resources can be shaped similarly to their top-level counterparts. To do so, prefix the query parameters with the name of the embedded resource. For instance, to order the actors in each film: + +.. tabs:: + + .. code-tab:: http + + GET /films?select=*,actors(*)&actors.order=last_name,first_name HTTP/1.1 + + .. code-tab:: bash Curl + + curl "http://localhost:3000/films?select=*,actors(*)&actors.order=last_name,first_name" + +This sorts the list of actors in each film but does *not* change the order of the films themselves. To filter the roles returned with each film: + +.. tabs:: + + .. code-tab:: http + + GET /films?select=*,roles(*)&roles.character=in.(Chico,Harpo,Groucho) HTTP/1.1 + + .. code-tab:: bash Curl + + curl "http://localhost:3000/films?select=*,roles(*)&roles.character=in.(Chico,Harpo,Groucho)" + +Once again, this restricts the roles included to certain characters but does not filter the films in any way. Films without any of those characters would be included along with empty character lists. + +An ``or`` filter can be used for a similar operation: + +.. tabs:: + + .. code-tab:: http + + GET /films?select=*,roles(*)&roles.or=(character.eq.Gummo,character.eq.Zeppo) HTTP/1.1 + + .. code-tab:: bash Curl + + curl "http://localhost:3000/films?select=*,roles(*)&roles.or=(character.eq.Gummo,character.eq.Zeppo)" + +Limit and offset operations are possible: + +.. tabs:: + + .. code-tab:: http + + GET /films?select=*,actors(*)&actors.limit=10&actors.offset=2 HTTP/1.1 + + .. code-tab:: bash Curl + + curl "http://localhost:3000/films?select=*,actors(*)&actors.limit=10&actors.offset=2" + +Embedded resources can be aliased and filters can be applied on these aliases: + +.. tabs:: + + .. code-tab:: http + + GET /films?select=*,90_comps:competitions(name),91_comps:competitions(name)&90_comps.year=eq.1990&91_comps.year=eq.1991 HTTP/1.1 + + .. code-tab:: bash Curl + + curl "http://localhost:3000/films?select=*,90_comps:competitions(name),91_comps:competitions(name)&90_comps.year=eq.1990&91_comps.year=eq.1991" + +Filters can also be applied on nested embedded resources: + +.. tabs:: + + .. code-tab:: http + + GET /films?select=*,roles(*,actors(*))&roles.actors.order=last_name&roles.actors.first_name=like.*Tom* HTTP/1.1 + + .. code-tab:: bash Curl + + curl "http://localhost:3000/films?select=*,roles(*,actors(*))&roles.actors.order=last_name&roles.actors.first_name=like.*Tom*" + +The result will show the nested actors named Tom and order them by last name. Aliases can also be used instead of the resource names to filter the nested tables. + +.. _embedding_top_level_filter: + +Embedding with Top-level Filtering +---------------------------------- + +By default, :ref:`embed_filters` don't change the top-level resource(``films``) rows at all: + +.. tabs:: + + .. code-tab:: http + + GET /films?select=title,actors(first_name,last_name)&actors.first_name=eq.Jehanne HTTP/1.1 + + .. code-tab:: bash Curl + + curl "http://localhost:3000/films?select=title,actors(first_name,last_name)&actors.first_name=eq.Jehanne + +.. code-block:: json + + [ + { + "title": "Workers Leaving The Lumière Factory In Lyon", + "actors": [] + }, + { + "title": "The Dickson Experimental Sound Film", + "actors": [] + }, + { + "title": "The Haunted Castle", + "actors": [ + { + "first_name": "Jehanne", + "last_name": "d'Alcy" + } + ] + } + ] + +In order to filter the top level rows you need to add ``!inner`` to the embedded resource. For instance, to get **only** the films that have an actor named ``Jehanne``: + +.. tabs:: + + .. code-tab:: http + + GET /films?select=title,actors!inner(first_name,last_name)&actors.first_name=eq.Jehanne HTTP/1.1 + + .. code-tab:: bash Curl + + curl "http://localhost:3000/films?select=title,actors!inner(first_name,last_name)&actors.first_name=eq.Jehanne" + +.. code-block:: json + + [ + { + "title": "The Haunted Castle", + "actors": [ + { + "first_name": "Jehanne", + "last_name": "d'Alcy" + } + ] + } + ] + +.. _embedding_partitioned_tables: + +Embedding Partitioned Tables +---------------------------- + +Embedding can also be done between `partitioned tables `_ and other tables. + +For example, let's create the ``box_office`` partitioned table that has the gross daily revenue of a film: + +.. code-block:: postgres + + CREATE TABLE box_office ( + bo_date DATE NOT NULL, + film_id INT REFERENCES test.films NOT NULL, + gross_revenue DECIMAL(12,2) NOT NULL, + PRIMARY KEY (bo_date, film_id) + ) PARTITION BY RANGE (bo_date); + + -- Let's also create partitions for each month of 2021 + + CREATE TABLE box_office_2021_01 PARTITION OF test.box_office + FOR VALUES FROM ('2021-01-01') TO ('2021-01-31'); + + CREATE TABLE box_office_2021_02 PARTITION OF test.box_office + FOR VALUES FROM ('2021-02-01') TO ('2021-02-28'); + + -- and so until december 2021 + +Since it contains the ``films_id`` foreign key, it is possible to embed ``box_office`` and ``films``: + +.. tabs:: + + .. code-tab:: http + + GET /box_office?select=bo_date,gross_revenue,films(title)&gross_revenue=gte.1000000 HTTP/1.1 + + .. code-tab:: bash Curl + + curl "http://localhost:3000/box_office?select=bo_date,gross_revenue,films(title)&gross_revenue=gte.1000000" + +.. note:: + + * Embedding on partitions is not allowed because it leads to ambiguity errors (see :ref:`embed_disamb`) between them and their parent partitioned table. More details at `#1783(comment) `_). :ref:`custom_queries` can be used if this is needed. + + * Partitioned tables can reference other tables since PostgreSQL 11 but can only be referenced from any other table since PostgreSQL 12. + +.. _embedding_views: + +Embedding Views +--------------- + +PostgREST will infer the relationships of a view based on its source tables. Source tables are the ones referenced in the ``FROM`` and ``JOIN`` clauses of the view definition. The foreign keys of the relationships must be present in the top ``SELECT`` clause of the view for this to work. + +For instance, the following view has ``nominations``, ``films`` and ``competitions`` as source tables: + +.. code-block:: postgres + + CREATE VIEW nominations_view AS + SELECT + films.title as film_title + , competitions.name as competition_name + , nominations.rank + , nominations.film_id as nominations_film_id + , films.id as film_id + FROM nominations + JOIN films ON films.id = nominations.film_id + JOIN competitions ON competitions.id = nominations.competition_id; + +Since this view contains ``nominations.film_id``, which has a **foreign key** relationship to ``films``, then we can embed the ``films`` table. Similarly, because the view contains ``films.id``, then we can also embed the ``roles`` and the ``actors`` tables (the last one in a many-to-many relationship): + +.. tabs:: + + .. code-tab:: http + + GET /nominations_view?select=film_title,films(language),roles(character),actors(last_name,first_name)&rank=eq.5 HTTP/1.1 + + .. code-tab:: bash Curl + + curl "http://localhost:3000/nominations_view?select=film_title,films(language),roles(character),actors(last_name,first_name)&rank=eq.5" + +It's also possible to embed `Materialized Views `_. + +.. important:: + + - It's not guaranteed that all kinds of views will be embeddable. In particular, views that contain UNIONs will not be made embeddable. + + + Why? PostgREST detects source table foreign keys in the view by querying and parsing `pg_rewrite `_. + This may fail depending on the complexity of the view. + + As a workaround, you can use :ref:`computed_relationships` to define manual relationships for views. + + - If view definitions change you must refresh PostgREST's schema cache for this to work properly. See the section :ref:`schema_reloading`. + +.. _embedding_view_chains: + +Embedding Chains of Views +------------------------- + +Views can also depend on other views, which in turn depend on the actual source table. For PostgREST to pick up those chains recursively to any depth, all the views must be in the search path, so either in the exposed schema (:ref:`db-schemas`) or in one of the schemas set in :ref:`db-extra-search-path`. This does not apply to the source table, which could be in a private schema as well. See :ref:`schema_isolation` for more details. + +.. _s_proc_embed: + +Embedding on Stored Procedures +------------------------------ + +If you have a :ref:`Stored Procedure ` that returns a table type, you can embed its related resources. + +Here's a sample function (notice the ``RETURNS SETOF films``). + +.. code-block:: plpgsql + + CREATE FUNCTION getallfilms() RETURNS SETOF films AS $$ + SELECT * FROM films; + $$ LANGUAGE SQL IMMUTABLE; + +A request with ``directors`` embedded: + +.. tabs:: + + .. code-tab:: http + + GET /rpc/getallfilms?select=title,directors(id,last_name)&title=like.*Workers* HTTP/1.1 + + .. code-tab:: bash Curl + + curl "http://localhost:3000/rpc/getallfilms?select=title,directors(id,last_name)&title=like.*Workers*" + +.. code-block:: json + + [ + { "title": "Workers Leaving The Lumière Factory In Lyon", + "directors": { + "id": 2, + "last_name": "Lumière" + } + } + ] + +.. _mutation_embed: + +Embedding after Insertions/Updates/Deletions +-------------------------------------------- + +You can embed related resources after doing :ref:`insert`, :ref:`update` or :ref:`delete`. + +Say you want to insert a **film** and then get some of its attributes plus embed its **director**. + +.. tabs:: + + .. code-tab:: http + + POST /films?select=title,year,director:directors(first_name,last_name) HTTP/1.1 + Prefer: return=representation + + { + "id": 100, + "director_id": 40, + "title": "127 hours", + "year": 2010, + "rating": 7.6, + "language": "english" + } + + .. code-tab:: bash Curl + + curl "http://localhost:3000/films?select=title,year,director:directors(first_name,last_name)" \ + -H "Prefer: return=representation" \ + -d @- << EOF + { + "id": 100, + "director_id": 40, + "title": "127 hours", + "year": 2010, + "rating": 7.6, + "language": "english" + } + EOF + +Response: + +.. code-block:: json + + { + "title": "127 hours", + "year": 2010, + "director": { + "first_name": "Danny", + "last_name": "Boyle" + } + } + +.. _embed_disamb: + +Embedding Disambiguation +------------------------ + +For doing resource embedding, PostgREST infers the relationship between two tables based on a foreign key between them. +However, in cases where there's more than one foreign key between two tables, it's not possible to infer the relationship unambiguously +by just specifying the tables names. + +.. _target_disamb: + +Target Disambiguation +~~~~~~~~~~~~~~~~~~~~~ + +For example, suppose you have the following ``orders`` and ``addresses`` tables: + +.. image:: ../../_static/orders.png + +And you try to embed ``orders`` with ``addresses`` (this is the **target**): + +.. tabs:: + + .. code-tab:: http + + GET /orders?select=*,addresses(*) HTTP/1.1 + + .. code-tab:: bash Curl + + curl "http://localhost:3000/orders?select=*,addresses(*)" -i + +Since the ``orders`` table has two foreign keys to the ``addresses`` table — an order has a billing address and a shipping address — +the request is ambiguous and PostgREST will respond with an error: + +.. code-block:: http + + HTTP/1.1 300 Multiple Choices + + {..} + +If this happens, you need to disambiguate the request by adding precision to the **target**. +Instead of the **table name**, you can specify the **foreign key constraint name** or the **column name** that is part of the foreign key. + +Let's try first with the **foreign key constraint name**. To make it clearer we can name it: + +.. code-block:: postgresql + + ALTER TABLE orders + ADD CONSTRAINT billing_address foreign key (billing_address_id) references addresses(id), + ADD CONSTRAINT shipping_address foreign key (shipping_address_id) references addresses(id); + + -- Or if the constraints names were already generated by PostgreSQL we can rename them + -- ALTER TABLE orders + -- RENAME CONSTRAINT orders_billing_address_id_fkey TO billing_address, + -- RENAME CONSTRAINT orders_shipping_address_id_fkey TO shipping_address; + +Now we can unambiguously embed the billing address by specifying the ``billing_address`` foreign key constraint as the **target**. + +.. tabs:: + + .. code-tab:: http + + GET /orders?select=name,billing_address(name) HTTP/1.1 + + .. code-tab:: bash Curl + + curl "http://localhost:3000/orders?select=name,billing_address(name)" + +.. code-block:: json + + [ + { + "name": "Personal Water Filter", + "billing_address": { + "name": "32 Glenlake Dr.Dearborn, MI 48124" + } + } + ] + +Alternatively, you can specify the **column name** of the foreign key constraint as the **target**. This can be aliased to make +the result more clear. + +.. tabs:: + + .. code-tab:: http + + GET /orders?select=name,billing_address:billing_address_id(name) HTTP/1.1 + + .. code-tab:: bash Curl + + curl "http://localhost:3000/orders?select=name,billing_address:billing_address_id(name)" + +.. code-block:: json + + [ + { + "name": "Personal Water Filter", + "billing_address": { + "name": "32 Glenlake Dr.Dearborn, MI 48124" + } + } + ] + +.. _hint_disamb: + +Hint Disambiguation +~~~~~~~~~~~~~~~~~~~ + +If specifying the **target** is not enough for unambiguous embedding, you can add a **hint**. For example, let's assume we create +two views of ``addresses``: ``central_addresses`` and ``eastern_addresses``. + +PostgREST cannot detect a view as an embedded resource by using a column name or foreign key name as targets, that is why we need to use the view name ``central_addresses`` instead. But, still, this is not enough for an unambiguous embed. + +.. tabs:: + + .. code-tab:: http + + GET /orders?select=*,central_addresses(*) HTTP/1.1 + + .. code-tab:: bash Curl + + curl "http://localhost:3000/orders?select=*,central_addresses(*)" -i + +.. code-block:: http + + HTTP/1.1 300 Multiple Choices + +For solving this case, in addition to the **target**, we can add a **hint**. +Here, we still specify ``central_addresses`` as the **target** and use the ``billing_address`` foreign key as the **hint**: + +.. tabs:: + + .. code-tab:: http + + GET /orders?select=*,central_addresses!billing_address(*) HTTP/1.1 + + .. code-tab:: bash Curl + + curl 'http://localhost:3000/orders?select=*,central_addresses!billing_address(*)' -i + +.. code-block:: http + + HTTP/1.1 200 OK + + [ ... ] + +Similarly to the **target**, the **hint** can be a **table name**, **foreign key constraint name** or **column name**. + +Hints also work alongside ``!inner`` if a top level filtering is needed. From the above example: + +.. tabs:: + + .. code-tab:: http + + GET /orders?select=*,central_addresses!billing_address!inner(*)¢ral_addresses.code=AB1000 HTTP/1.1 + + .. code-tab:: bash Curl + + curl "http://localhost:3000/orders?select=*,central_addresses!billing_address!inner(*)¢ral_addresses.code=AB1000" + +.. note:: + + If the relationship is so complex that hint disambiguation does not solve it, you can use :ref:`computed_relationships`. + diff --git a/docs/references/api/resource_representation.rst b/docs/references/api/resource_representation.rst new file mode 100644 index 0000000000..82f27d96b2 --- /dev/null +++ b/docs/references/api/resource_representation.rst @@ -0,0 +1,150 @@ +Resource Representation +####################### + +PostgREST uses proper HTTP content negotiation (`RFC7231 `_) to deliver a resource representation. +That is to say the same API endpoint can respond in different formats like JSON or CSV depending on the request. + +.. _res_format: + +Response Format +=============== + +Use the Accept request header to specify the acceptable format (or formats) for the response: + +.. tabs:: + + .. code-tab:: http + + GET /people HTTP/1.1 + Accept: application/json + + .. code-tab:: bash Curl + + curl "http://localhost:3000/people" \ + -H "Accept: application/json" + +For tables and views the current possibilities are: + +* ``*/*`` +* ``text/csv`` +* ``application/json`` +* ``application/openapi+json`` +* ``application/geo+json`` + +The server will default to JSON for API endpoints and OpenAPI on the root. + +.. _singular_plural: + +Singular or Plural +------------------ + +By default PostgREST returns all JSON results in an array, even when there is only one item. For example, requesting :code:`/items?id=eq.1` returns + +.. code:: json + + [ + { "id": 1 } + ] + +This can be inconvenient for client code. To return the first result as an object unenclosed by an array, specify :code:`vnd.pgrst.object` as part of the :code:`Accept` header + +.. tabs:: + + .. code-tab:: http + + GET /items?id=eq.1 HTTP/1.1 + Accept: application/vnd.pgrst.object+json + + .. code-tab:: bash Curl + + curl "http://localhost:3000/items?id=eq.1" \ + -H "Accept: application/vnd.pgrst.object+json" + +This returns + +.. code:: json + + { "id": 1 } + +When a singular response is requested but no entries are found, the server responds with an error message and 406 Not Acceptable status code rather than the usual empty array and 200 status: + +.. code-block:: json + + { + "message": "JSON object requested, multiple (or no) rows returned", + "details": "Results contain 0 rows, application/vnd.pgrst.object+json requires 1 row", + "hint": null, + "code": "PGRST505" + } + +.. note:: + + Many APIs distinguish plural and singular resources using a special nested URL convention e.g. `/stories` vs `/stories/1`. Why do we use `/stories?id=eq.1`? The answer is because a singular resource is (for us) a row determined by a primary key, and primary keys can be compound (meaning defined across more than one column). The more familiar nested urls consider only a degenerate case of simple and overwhelmingly numeric primary keys. These so-called artificial keys are often introduced automatically by Object Relational Mapping libraries. + + Admittedly PostgREST could detect when there is an equality condition holding on all columns constituting the primary key and automatically convert to singular. However this could lead to a surprising change of format that breaks unwary client code just by filtering on an extra column. Instead we allow manually specifying singular vs plural to decouple that choice from the URL format. + +.. _scalar_return_formats: + +Scalar Function Response Format +------------------------------- + +In the special case of a :ref:`scalar_functions` there are three additional formats: + +* ``application/octet-stream`` +* ``text/plain`` +* ``text/xml`` + +Example 1: If you want to return raw binary data from a :code:`bytea` column, you must specify :code:`application/octet-stream` as part of the :code:`Accept` header +and select a single column :code:`?select=bin_data`. + +.. tabs:: + + .. code-tab:: http + + GET /items?select=bin_data&id=eq.1 HTTP/1.1 + Accept: application/octet-stream + + .. code-tab:: bash Curl + + curl "http://localhost:3000/items?select=bin_data&id=eq.1" \ + -H "Accept: application/octet-stream" + +Example 2: You can request XML output when having a scalar function that returns a type of ``text/xml``. You are not forced to use select for this case. + +.. code-block:: postgres + + CREATE FUNCTION generate_xml_content(..) RETURNS xml .. + +.. tabs:: + + .. code-tab:: http + + POST /rpc/generate_xml_content HTTP/1.1 + Accept: text/xml + + .. code-tab:: bash Curl + + curl "http://localhost:3000/rpc/generate_xml_content" \ + -X POST -H "Accept: text/xml" + +Example 3: If the stored procedure returns non-scalar values, you need to do a :code:`select` in the same way as for GET binary output. + +.. code-block:: sql + + CREATE FUNCTION get_descriptions(..) RETURNS SETOF TABLE(id int, description text) .. + +.. tabs:: + + .. code-tab:: http + + POST /rpc/get_descriptions?select=description HTTP/1.1 + Accept: text/plain + + .. code-tab:: bash Curl + + curl "http://localhost:3000/rpc/get_descriptions?select=description" \ + -X POST -H "Accept: text/plain" + +.. note:: + + If more than one row would be returned the binary/plain-text/xml results will be concatenated with no delimiter. diff --git a/docs/references/api/schemas.rst b/docs/references/api/schemas.rst new file mode 100644 index 0000000000..359f5c9592 --- /dev/null +++ b/docs/references/api/schemas.rst @@ -0,0 +1,107 @@ +.. _schemas: + +Schemas +======= + +PostgREST can expose a single or multiple schema's tables, views and functions. The :ref:`active database role ` must have the usage privilege on the schemas to access them. + +Single schema +------------- + +To expose a single schema, specify a single value in :ref:`db-schemas`. + +.. code:: bash + + db-schemas = "api" + +This schema is added to the `search_path `_ of every request using :ref:`tx_settings`. + +.. _multiple-schemas: + +Multiple schemas +---------------- + +To expose multiple schemas, specify a comma-separated list on :ref:`db-schemas`: + +.. code:: bash + + db-schemas = "tenant1, tenant2" + +To switch schemas, use the ``Accept-Profile`` and ``Content-Profile`` headers. + +If you don't specify a Profile header, the first schema in the list(``tenant1`` here) is selected as the default schema. + +Only the selected schema gets added to the `search_path `_ of every request. + +.. note:: + + These headers are based on the "Content Negotiation by Profile" spec: https://www.w3.org/TR/dx-prof-conneg + +GET/HEAD +~~~~~~~~ + +For GET or HEAD, select the schema with ``Accept-Profile``. + +.. tabs:: + + .. code-tab:: http + + GET /items HTTP/1.1 + Accept-Profile: tenant2 + + .. code-tab:: bash Curl + + curl "http://localhost:3000/items" \ + -H "Accept-Profile: tenant2" + +Other methods +~~~~~~~~~~~~~ + +For POST, PATCH, PUT and DELETE, select the schema with ``Content-Profile``. + +.. tabs:: + + .. code-tab:: http + + POST /items HTTP/1.1 + Content-Profile: tenant2 + + {...} + + .. code-tab:: bash Curl + + curl "http://localhost:3000/items" \ + -X POST -H "Content-Type: application/json" \ + -H "Content-Profile: tenant2" \ + -d '{...}' + +You can also select the schema for :ref:`s_procs` and :ref:`open-api`. + +Restricted schemas +~~~~~~~~~~~~~~~~~~ + +You can only switch to a schema included in :ref:`db-schemas`. Using another schema will result in an error: + +.. tabs:: + + .. code-tab:: http + + GET /items HTTP/1.1 + Accept-Profile: tenant3 + + {...} + + .. code-tab:: bash Curl + + curl "http://localhost:3000/items" \ + -H "Accept-Profile: tenant3" + +.. code-block:: + + { + "code":"PGRST106", + "details":null, + "hint":null, + "message":"The schema must be one of the following: tenant1, tenant2" + } + diff --git a/docs/references/api/stored_procedures.rst b/docs/references/api/stored_procedures.rst new file mode 100644 index 0000000000..64fa86d49d --- /dev/null +++ b/docs/references/api/stored_procedures.rst @@ -0,0 +1,456 @@ +.. _s_procs: + +Stored Procedures +================= + +*"A single resource can be the equivalent of a database stored procedure, with the power to abstract state changes over any number of storage items"* -- `Roy T. Fielding `_ + +Every stored procedure in the :ref:`exposed schema ` and accessible by the :ref:`active database role ` is executable under the :code:`/rpc` prefix. Procedures can perform any operations allowed by PostgreSQL (read data, modify data, and even DDL operations). + +If they return table types, Stored Procedures can: + +- Use all the same :ref:`read filters as Tables and Views ` (horizontal/vertical filtering, counts, limits, etc.). +- Use :ref:`Resource Embedding `, if the returned table type has relationships to other tables. + +.. note:: + + Why the ``/rpc`` prefix? PostgreSQL allows a table or view to have the same name as a function. The prefix allows us to avoid routes collisions. + +Calling with POST +----------------- + +To supply arguments in an API call, include a JSON object in the request payload. Each key/value of the object will become an argument. + +For instance, assume we have created this function in the database. + +.. code-block:: plpgsql + + CREATE FUNCTION add_them(a integer, b integer) + RETURNS integer AS $$ + SELECT a + b; + $$ LANGUAGE SQL IMMUTABLE; + +.. important:: + + Whenever you create or change a function you must refresh PostgREST's schema cache. See the section :ref:`schema_reloading`. + +The client can call it by posting an object like + +.. tabs:: + + .. code-tab:: http + + POST /rpc/add_them HTTP/1.1 + + { "a": 1, "b": 2 } + + .. code-tab:: bash Curl + + curl "http://localhost:3000/rpc/add_them" \ + -X POST -H "Content-Type: application/json" \ + -d '{ "a": 1, "b": 2 }' + +.. code-block:: json + + 3 + +.. note:: + + PostgreSQL converts identifier names to lowercase unless you quote them like: + + .. code-block:: postgres + + CREATE FUNCTION "someFunc"("someParam" text) ... + +Calling with GET +---------------- + +If the function doesn't modify the database, it will also run under the GET method(see :ref:`access_mode`). + +.. tabs:: + + .. code-tab:: http + + GET /rpc/add_them?a=1&b=2 HTTP/1.1 + + .. code-tab:: bash Curl + + curl "http://localhost:3000/rpc/add_them?a=1&b=2" + +The function parameter names match the JSON object keys in the POST case, for the GET case they match the query parameters ``?a=1&b=2``. + +.. _s_proc_single_json: + +Functions with a single JSON parameter +-------------------------------------- + +You can also call a function that takes a single parameter of type JSON by sending the header :code:`Prefer: params=single-object` with your request. That way the JSON request body will be used as the single argument. + +.. code-block:: plpgsql + + CREATE FUNCTION mult_them(param json) RETURNS int AS $$ + SELECT (param->>'x')::int * (param->>'y')::int + $$ LANGUAGE SQL; + +.. tabs:: + + .. code-tab:: http + + POST /rpc/mult_them HTTP/1.1 + Prefer: params=single-object + + { "x": 4, "y": 2 } + + .. code-tab:: bash Curl + + curl "http://localhost:3000/rpc/mult_them" \ + -X POST -H "Content-Type: application/json" \ + -H "Prefer: params=single-object" \ + -d '{ "x": 4, "y": 2 }' + +.. code-block:: json + + 8 + +.. _s_proc_single_unnamed: + +Functions with a single unnamed parameter +----------------------------------------- + +You can make a POST request to a function with a single unnamed parameter to send raw ``json/jsonb``, ``bytea``, ``text`` or ``xml`` data. + +To send raw JSON, the function must have a single unnamed ``json`` or ``jsonb`` parameter and the header ``Content-Type: application/json`` must be included in the request. + +.. code-block:: plpgsql + + CREATE FUNCTION mult_them(json) RETURNS int AS $$ + SELECT ($1->>'x')::int * ($1->>'y')::int + $$ LANGUAGE SQL; + +.. tabs:: + + .. code-tab:: http + + POST /rpc/mult_them HTTP/1.1 + Content-Type: application/json + + { "x": 4, "y": 2 } + + .. code-tab:: bash Curl + + curl "http://localhost:3000/rpc/mult_them" \ + -X POST -H "Content-Type: application/json" \ + -d '{ "x": 4, "y": 2 }' + +.. code-block:: json + + 8 + +.. note:: + + If an overloaded function has a single ``json`` or ``jsonb`` unnamed parameter, PostgREST will call this function as a fallback provided that no other overloaded function is found with the parameters sent in the POST request. + +To send raw XML, the parameter type must be ``xml`` and the header ``Content-Type: text/xml`` must be included in the request. + +To send raw binary, the parameter type must be ``bytea`` and the header ``Content-Type: application/octet-stream`` must be included in the request. + +.. code-block:: plpgsql + + CREATE TABLE files(blob bytea); + + CREATE FUNCTION upload_binary(bytea) RETURNS void AS $$ + INSERT INTO files(blob) VALUES ($1); + $$ LANGUAGE SQL; + +.. tabs:: + + .. code-tab:: http + + POST /rpc/upload_binary HTTP/1.1 + Content-Type: application/octet-stream + + file_name.ext + + .. code-tab:: bash Curl + + curl "http://localhost:3000/rpc/upload_binary" \ + -X POST -H "Content-Type: application/octet-stream" \ + --data-binary "@file_name.ext" + +.. code-block:: http + + HTTP/1.1 200 OK + + [ ... ] + +To send raw text, the parameter type must be ``text`` and the header ``Content-Type: text/plain`` must be included in the request. + +.. _s_procs_array: + +Functions with array parameters +------------------------------- + +You can call a function that takes an array parameter: + +.. code-block:: postgres + + create function plus_one(arr int[]) returns int[] as $$ + SELECT array_agg(n + 1) FROM unnest($1) AS n; + $$ language sql; + +.. tabs:: + + .. code-tab:: http + + POST /rpc/plus_one HTTP/1.1 + Content-Type: application/json + + {"arr": [1,2,3,4]} + + .. code-tab:: bash Curl + + curl "http://localhost:3000/rpc/plus_one" \ + -X POST -H "Content-Type: application/json" \ + -d '{"arr": [1,2,3,4]}' + +.. code-block:: json + + [2,3,4,5] + +For calling the function with GET, you can pass the array as an `array literal `_, +as in ``{1,2,3,4}``. Note that the curly brackets have to be urlencoded(``{`` is ``%7B`` and ``}`` is ``%7D``). + +.. tabs:: + + .. code-tab:: http + + GET /rpc/plus_one?arr=%7B1,2,3,4%7D' HTTP/1.1 + + .. code-tab:: bash Curl + + curl "http://localhost:3000/rpc/plus_one?arr=%7B1,2,3,4%7D'" + +.. note:: + + For versions prior to PostgreSQL 10, to pass a PostgreSQL native array on a POST payload, you need to quote it and use an array literal: + + .. tabs:: + + .. code-tab:: http + + POST /rpc/plus_one HTTP/1.1 + + { "arr": "{1,2,3,4}" } + + .. code-tab:: bash Curl + + curl "http://localhost:3000/rpc/plus_one" \ + -X POST -H "Content-Type: application/json" \ + -d '{ "arr": "{1,2,3,4}" }' + + In these versions we recommend using function parameters of type JSON to accept arrays from the client. + +.. _s_procs_variadic: + +Variadic functions +------------------ + +You can call a variadic function by passing a JSON array in a POST request: + +.. code-block:: postgres + + create function plus_one(variadic v int[]) returns int[] as $$ + SELECT array_agg(n + 1) FROM unnest($1) AS n; + $$ language sql; + +.. tabs:: + + .. code-tab:: http + + POST /rpc/plus_one HTTP/1.1 + Content-Type: application/json + + {"v": [1,2,3,4]} + + .. code-tab:: bash Curl + + curl "http://localhost:3000/rpc/plus_one" \ + -X POST -H "Content-Type: application/json" \ + -d '{"v": [1,2,3,4]}' + +.. code-block:: json + + [2,3,4,5] + +In a GET request, you can repeat the same parameter name: + +.. tabs:: + + .. code-tab:: http + + GET /rpc/plus_one?v=1&v=2&v=3&v=4 HTTP/1.1 + + .. code-tab:: bash Curl + + curl "http://localhost:3000/rpc/plus_one?v=1&v=2&v=3&v=4" + +Repeating also works in POST requests with ``Content-Type: application/x-www-form-urlencoded``: + +.. tabs:: + + .. code-tab:: http + + POST /rpc/plus_one HTTP/1.1 + Content-Type: application/x-www-form-urlencoded + + v=1&v=2&v=3&v=4 + + .. code-tab:: bash Curl + + curl "http://localhost:3000/rpc/plus_one" \ + -X POST -H "Content-Type: application/x-www-form-urlencoded" \ + -d 'v=1&v=2&v=3&v=4' + +Table-Valued functions +---------------------- + +A function that returns a table type can be filtered using the same filters as :ref:`tables and views `. They can also use :ref:`Resource Embedding `. + +.. code-block:: postgres + + CREATE FUNCTION best_films_2017() RETURNS SETOF films .. + +.. tabs:: + + .. code-tab:: http + + GET /rpc/best_films_2017?select=title,director:directors(*) HTTP/1.1 + + .. code-tab:: bash Curl + + curl "http://localhost:3000/rpc/best_films_2017?select=title,director:directors(*)" + +.. tabs:: + + .. code-tab:: http + + GET /rpc/best_films_2017?rating=gt.8&order=title.desc HTTP/1.1 + + .. code-tab:: bash Curl + + curl "http://localhost:3000/rpc/best_films_2017?rating=gt.8&order=title.desc" + +.. _scalar_functions: + +Scalar functions +---------------- + +PostgREST will detect if the function is scalar or table-valued and will shape the response format accordingly: + +.. tabs:: + + .. code-tab:: http + + GET /rpc/add_them?a=1&b=2 HTTP/1.1 + + .. code-tab:: bash Curl + + curl "http://localhost:3000/rpc/add_them?a=1&b=2" + +.. code-block:: json + + 3 + +.. tabs:: + + .. code-tab:: http + + GET /rpc/best_films_2017 HTTP/1.1 + + .. code-tab:: bash Curl + + curl "http://localhost:3000/rpc/best_films_2017" + +.. code-block:: json + + [ + { "title": "Okja", "rating": 7.4}, + { "title": "Call me by your name", "rating": 8}, + { "title": "Blade Runner 2049", "rating": 8.1} + ] + +To manually choose a return format such as binary, plain text or XML, see the section :ref:`scalar_return_formats`. + +Overloaded functions +-------------------- + +You can call overloaded functions with different number of arguments. + +.. code-block:: postgres + + CREATE FUNCTION rental_duration(customer_id integer) .. + + CREATE FUNCTION rental_duration(customer_id integer, from_date date) .. + +.. tabs:: + + .. code-tab:: http + + GET /rpc/rental_duration?customer_id=232 HTTP/1.1 + + .. code-tab:: bash Curl + + curl "http://localhost:3000/rpc/rental_duration?customer_id=232" + +.. tabs:: + + .. code-tab:: http + + GET /rpc/rental_duration?customer_id=232&from_date=2018-07-01 HTTP/1.1 + + .. code-tab:: bash Curl + + curl "http://localhost:3000/rpc/rental_duration?customer_id=232&from_date=2018-07-01" + +.. important:: + + Overloaded functions with the same argument names but different types are not supported. + +.. _bulk_call: + +Bulk Call +--------- + +It's possible to call a function in a bulk way, analogously to :ref:`bulk_insert`. To do this, you need to add the +``Prefer: params=multiple-objects`` header to your request. + +.. tabs:: + + .. code-tab:: http + + POST /rpc/add_them HTTP/1.1 + Content-Type: text/csv + Prefer: params=multiple-objects + + a,b + 1,2 + 3,4 + + .. code-tab:: bash Curl + + curl "http://localhost:3000/rpc/add_them" \ + -X POST -H "Content-Type: text/csv" \ + -H "Prefer: params=multiple-objects" \ + --data-binary @- << EOF + a,b + 1,2 + 3,4 + EOF + +.. code-block:: json + + [ 3, 7 ] + +If you have large payloads to process, it's preferable you instead use a function with an :ref:`array parameter ` or JSON parameter, as this will be more efficient. + +It's also possible to :ref:`Specify Columns ` on functions calls. diff --git a/docs/references/api/tables_views.rst b/docs/references/api/tables_views.rst new file mode 100644 index 0000000000..99a919e49c --- /dev/null +++ b/docs/references/api/tables_views.rst @@ -0,0 +1,1060 @@ +.. _tables_views: + +Tables and Views +################ + +All views and tables of the :ref:`exposed schema ` and accessible by the :ref:`active database role ` are available for querying. They are exposed in one-level deep routes. + +.. _read: + +Read +==== + +For instance the full contents of a table `people` is returned at + +.. tabs:: + + .. code-tab:: http + + GET /people HTTP/1.1 + + .. code-tab:: bash Curl + + curl "http://localhost:3000/people" + +There are no deeply/nested/routes. Each route provides OPTIONS, GET, HEAD, POST, PATCH, and DELETE verbs depending entirely on database permissions. + +.. note:: + + Why not provide nested routes? Many APIs allow nesting to retrieve related information, such as :code:`/films/1/director`. We offer a more flexible mechanism (inspired by GraphQL) to embed related information. It can handle one-to-many and many-to-many relationships. This is covered in the section about :ref:`resource_embedding`. + + +.. _h_filter: + +Horizontal Filtering (Rows) +--------------------------- + +You can filter result rows by adding conditions on columns. For instance, to return people aged under 13 years old: + +.. tabs:: + + .. code-tab:: http + + GET /people?age=lt.13 HTTP/1.1 + + .. code-tab:: bash Curl + + curl "http://localhost:3000/people?age=lt.13" + +You can evaluate multiple conditions on columns by adding more query string parameters. For instance, to return people who are 18 or older **and** are students: + +.. tabs:: + + .. code-tab:: http + + GET /people?age=gte.18&student=is.true HTTP/1.1 + + .. code-tab:: bash Curl + + curl "http://localhost:3000/people?age=gte.18&student=is.true" + +.. _operators: + +Operators +~~~~~~~~~ + +These operators are available: + +============ ======================== ================================================================================== +Abbreviation In PostgreSQL Meaning +============ ======================== ================================================================================== +eq :code:`=` equals +gt :code:`>` greater than +gte :code:`>=` greater than or equal +lt :code:`<` less than +lte :code:`<=` less than or equal +neq :code:`<>` or :code:`!=` not equal +like :code:`LIKE` LIKE operator (to avoid `URL encoding `_ you can use ``*`` as an alias of the percent sign ``%`` for the pattern) +ilike :code:`ILIKE` ILIKE operator (to avoid `URL encoding `_ you can use ``*`` as an alias of the percent sign ``%`` for the pattern) +match :code:`~` ~ operator, see :ref:`pattern_matching` +imatch :code:`~*` ~* operator, see :ref:`pattern_matching` +in :code:`IN` one of a list of values, e.g. :code:`?a=in.(1,2,3)` + – also supports commas in quoted strings like + :code:`?a=in.("hi,there","yes,you")` +is :code:`IS` checking for exact equality (null,true,false,unknown) +fts :code:`@@` :ref:`fts` using to_tsquery +plfts :code:`@@` :ref:`fts` using plainto_tsquery +phfts :code:`@@` :ref:`fts` using phraseto_tsquery +wfts :code:`@@` :ref:`fts` using websearch_to_tsquery +cs :code:`@>` contains e.g. :code:`?tags=cs.{example, new}` +cd :code:`<@` contained in e.g. :code:`?values=cd.{1,2,3}` +ov :code:`&&` overlap (have points in common), e.g. :code:`?period=ov.[2017-01-01,2017-06-30]` – + also supports array types, use curly braces instead of square brackets e.g. + :code: `?arr=ov.{1,3}` +sl :code:`<<` strictly left of, e.g. :code:`?range=sl.(1,10)` +sr :code:`>>` strictly right of +nxr :code:`&<` does not extend to the right of, e.g. :code:`?range=nxr.(1,10)` +nxl :code:`&>` does not extend to the left of +adj :code:`-|-` is adjacent to, e.g. :code:`?range=adj.(1,10)` +not :code:`NOT` negates another operator, see :ref:`logical_operators` +or :code:`OR` logical :code:`OR`, see :ref:`logical_operators` +and :code:`AND` logical :code:`AND`, see :ref:`logical_operators` +============ ======================== ================================================================================== + +For more complicated filters you will have to create a new view in the database, or use a stored procedure. For instance, here's a view to show "today's stories" including possibly older pinned stories: + +.. code-block:: postgresql + + CREATE VIEW fresh_stories AS + SELECT * + FROM stories + WHERE pinned = true + OR published > now() - interval '1 day' + ORDER BY pinned DESC, published DESC; + +The view will provide a new endpoint: + +.. tabs:: + + .. code-tab:: http + + GET /fresh_stories HTTP/1.1 + + .. code-tab:: bash Curl + + curl "http://localhost:3000/fresh_stories" + +.. _logical_operators: + +Logical operators +~~~~~~~~~~~~~~~~~ + +Multiple conditions on columns are evaluated using ``AND`` by default, but you can combine them using ``OR`` with the ``or`` operator. For example, to return people under 18 **or** over 21: + +.. tabs:: + + .. code-tab:: http + + GET /people?or=(age.lt.18,age.gt.21) HTTP/1.1 + + .. code-tab:: bash Curl + + curl "http://localhost:3000/people?or=(age.lt.18,age.gt.21)" + +To **negate** any operator, you can prefix it with :code:`not` like :code:`?a=not.eq.2` or :code:`?not.and=(a.gte.0,a.lte.100)` . + +You can also apply complex logic to the conditions: + +.. tabs:: + + .. code-tab:: http + + GET /people?grade=gte.90&student=is.true&or=(age.eq.14,not.and(age.gte.11,age.lte.17)) HTTP/1.1 + + .. code-tab:: bash Curl + + curl "http://localhost:3000/people?grade=gte.90&student=is.true&or=(age.eq.14,not.and(age.gte.11,age.lte.17))" + +.. _pattern_matching: + +Pattern Matching +~~~~~~~~~~~~~~~~ + +The pattern-matching operators (:code:`like`, :code:`ilike`, :code:`match`, :code:`imatch`) exist to support filtering data using patterns instead of concrete strings, as described in the `PostgreSQL docs `__. + +To ensure best performance on larger data sets, an `appropriate index `__ should be used and even then, it depends on the pattern value and actual data statistics whether an existing index will be used by the query planner or not. + +.. _fts: + +Full-Text Search +~~~~~~~~~~~~~~~~ + +The :code:`fts` filter mentioned above has a number of options to support flexible textual queries, namely the choice of plain vs phrase search and the language used for stemming. Suppose that :code:`tsearch` is a table with column :code:`my_tsv`, of type `tsvector `_. The following examples illustrate the possibilities. + +.. tabs:: + + .. code-tab:: http + + GET /tsearch?my_tsv=fts(french).amusant HTTP/1.1 + + .. code-tab:: bash Curl + + curl "http://localhost:3000/tsearch?my_tsv=fts(french).amusant" + +.. tabs:: + + .. code-tab:: http + + GET /tsearch?my_tsv=plfts.The%20Fat%20Cats HTTP/1.1 + + .. code-tab:: bash Curl + + curl "http://localhost:3000/tsearch?my_tsv=plfts.The%20Fat%20Cats" + +.. tabs:: + + .. code-tab:: http + + GET /tsearch?my_tsv=not.phfts(english).The%20Fat%20Cats HTTP/1.1 + + .. code-tab:: bash Curl + + curl "http://localhost:3000/tsearch?my_tsv=not.phfts(english).The%20Fat%20Cats" + +.. tabs:: + + .. code-tab:: http + + GET /tsearch?my_tsv=not.wfts(french).amusant HTTP/1.1 + + .. code-tab:: bash Curl + + curl "http://localhost:3000/tsearch?my_tsv=not.wfts(french).amusant" + +Using `websearch_to_tsquery` requires PostgreSQL of version at least 11.0 and will raise an error in earlier versions of the database. + +.. _v_filter: + +Vertical Filtering (Columns) +---------------------------- + +When certain columns are wide (such as those holding binary data), it is more efficient for the server to withhold them in a response. The client can specify which columns are required using the sql:`select` parameter. + +.. tabs:: + + .. code-tab:: http + + GET /people?select=first_name,age HTTP/1.1 + + .. code-tab:: bash Curl + + curl "http://localhost:3000/people?select=first_name,age" + +.. code-block:: json + + [ + {"first_name": "John", "age": 30}, + {"first_name": "Jane", "age": 20} + ] + +The default is ``*``, meaning all columns. This value will become more important below in :ref:`resource_embedding`. + +Renaming Columns +~~~~~~~~~~~~~~~~ + +You can rename the columns by prefixing them with an alias followed by the colon ``:`` operator. + +.. tabs:: + + .. code-tab:: http + + GET /people?select=fullName:full_name,birthDate:birth_date HTTP/1.1 + + .. code-tab:: bash Curl + + curl "http://localhost:3000/people?select=fullName:full_name,birthDate:birth_date" + +.. code-block:: json + + [ + {"fullName": "John Doe", "birthDate": "04/25/1988"}, + {"fullName": "Jane Doe", "birthDate": "01/12/1998"} + ] + +.. _casting_columns: + +Casting Columns +~~~~~~~~~~~~~~~ + +Casting the columns is possible by suffixing them with the double colon ``::`` plus the desired type. + +.. tabs:: + + .. code-tab:: http + + GET /people?select=full_name,salary::text HTTP/1.1 + + .. code-tab:: bash Curl + + curl "http://localhost:3000/people?select=full_name,salary::text" + +.. code-block:: json + + [ + {"full_name": "John Doe", "salary": "90000.00"}, + {"full_name": "Jane Doe", "salary": "120000.00"} + ] + +.. _json_columns: + +JSON Columns +------------ + +You can specify a path for a ``json`` or ``jsonb`` column using the arrow operators(``->`` or ``->>``) as per the `PostgreSQL docs `__. + +.. code-block:: postgres + + CREATE TABLE people ( + id int, + json_data json + ); + +.. tabs:: + + .. code-tab:: http + + GET /people?select=id,json_data->>blood_type,json_data->phones HTTP/1.1 + + .. code-tab:: bash Curl + + curl "http://localhost:3000/people?select=id,json_data->>blood_type,json_data->phones" + +.. code-block:: json + + [ + { "id": 1, "blood_type": "A-", "phones": [{"country_code": "61", "number": "917-929-5745"}] }, + { "id": 2, "blood_type": "O+", "phones": [{"country_code": "43", "number": "512-446-4988"}, {"country_code": "43", "number": "213-891-5979"}] } + ] + +.. tabs:: + + .. code-tab:: http + + GET /people?select=id,json_data->phones->0->>number HTTP/1.1 + + .. code-tab:: bash Curl + + curl "http://localhost:3000/people?select=id,json_data->phones->0->>number" + +.. code-block:: json + + [ + { "id": 1, "number": "917-929-5745"}, + { "id": 2, "number": "512-446-4988"} + ] + +This also works with filters: + +.. tabs:: + + .. code-tab:: http + + GET /people?select=id,json_data->blood_type&json_data->>blood_type=eq.A- HTTP/1.1 + + .. code-tab:: bash Curl + + curl "http://localhost:3000/people?select=id,json_data->blood_type&json_data->>blood_type=eq.A-" + +.. code-block:: json + + [ + { "id": 1, "blood_type": "A-" }, + { "id": 3, "blood_type": "A-" }, + { "id": 7, "blood_type": "A-" } + ] + +Note that ``->>`` is used to compare ``blood_type`` as ``text``. To compare with an integer value use ``->``: + +.. tabs:: + + .. code-tab:: http + + GET /people?select=id,json_data->age&json_data->age=gt.20 HTTP/1.1 + + .. code-tab:: bash Curl + + curl "http://localhost:3000/people?select=id,json_data->age&json_data->age=gt.20" + +.. code-block:: json + + [ + { "id": 11, "age": 25 }, + { "id": 12, "age": 30 }, + { "id": 15, "age": 35 } + ] +.. _composite_array_columns: + +Composite / Array Columns +------------------------- + +The arrow operators(``->``, ``->>``) can also be used for accessing composite fields and array elements. + +.. code-block:: postgres + + CREATE TYPE coordinates ( + lat decimal(8,6), + long decimal(9,6) + ); + + CREATE TABLE countries ( + id int, + location coordinates, + languages text[] + ); + +.. tabs:: + + .. code-tab:: http + + GET /countries?select=id,location->>lat,location->>long,primary_language:languages->0&location->lat=gte.19 HTTP/1.1 + + .. code-tab:: bash Curl + + curl "http://localhost:3000/countries?select=id,location->>lat,location->>long,primary_language:languages->0&location->lat=gte.19" + +.. code-block:: json + + [ + { + "id": 5, + "lat": "19.741755", + "long": "-155.844437", + "primary_language": "en" + } + ] + +.. important:: + + When using the ``->`` and ``->>`` operators, PostgREST uses a query like ``to_jsonb()->'field'``. To make filtering and ordering on those nested fields use an index, the index needs to be created on the same expression, including the ``to_jsonb(...)`` call: + + .. code-block:: postgres + + CREATE INDEX ON mytable ((to_jsonb(data) -> 'identification' ->> 'registration_number')); + +.. _computed_cols: + +Computed / Virtual Columns +-------------------------- + +Filters may be applied to computed columns(**a.k.a. virtual columns**) as well as actual table/view columns, even though the computed columns will not appear in the output. For example, to search first and last names at once we can create a computed column that will not appear in the output but can be used in a filter: + +.. code-block:: postgres + + CREATE TABLE people ( + fname text, + lname text + ); + + CREATE FUNCTION full_name(people) RETURNS text AS $$ + SELECT $1.fname || ' ' || $1.lname; + $$ LANGUAGE SQL; + + -- (optional) add an index to speed up anticipated query + CREATE INDEX people_full_name_idx ON people + USING GIN (to_tsvector('english', full_name(people))); + +A full-text search on the computed column: + +.. tabs:: + + .. code-tab:: http + + GET /people?full_name=fts.Beckett HTTP/1.1 + + .. code-tab:: bash Curl + + curl "http://localhost:3000/people?full_name=fts.Beckett" + +As mentioned, computed columns do not appear in the output by default. However you can include them by listing them in the vertical filtering :code:`select` parameter: + +.. tabs:: + + .. code-tab:: http + + GET /people?select=*,full_name HTTP/1.1 + + .. code-tab:: bash Curl + + curl "http://localhost:3000/people?select=*,full_name" + +.. important:: + + Computed columns must be created in the :ref:`exposed schema ` or in a schema in the :ref:`extra search path ` to be used in this way. When placing the computed column in the :ref:`exposed schema ` you can use an **unnamed** argument, as in the example above, to prevent it from being exposed as an :ref:`RPC ` under ``/rpc``. + + +.. _ordering: + +Ordering +-------- + +The reserved word ``order`` reorders the response rows. It uses a comma-separated list of columns and directions: + +.. tabs:: + + .. code-tab:: http + + GET /people?order=age.desc,height.asc HTTP/1.1 + + .. code-tab:: bash Curl + + curl "http://localhost:3000/people?order=age.desc,height.asc" + +If no direction is specified it defaults to ascending order: + +.. tabs:: + + .. code-tab:: http + + GET /people?order=age HTTP/1.1 + + .. code-tab:: bash Curl + + curl "http://localhost:3000/people?order=age" + +If you care where nulls are sorted, add ``nullsfirst`` or ``nullslast``: + +.. tabs:: + + .. code-tab:: http + + GET /people?order=age.nullsfirst HTTP/1.1 + + .. code-tab:: bash Curl + + curl "http://localhost:3000/people?order=age.nullsfirst" + +.. tabs:: + + .. code-tab:: http + + GET /people?order=age.desc.nullslast HTTP/1.1 + + .. code-tab:: bash Curl + + curl "http://localhost:3000/people?order=age.desc.nullslast" + +You can also use :ref:`computed_cols` to order the results, even though the computed columns will not appear in the output. You can sort by nested fields of :ref:`json_columns` with the JSON operators. + +.. _limits: + +Limits and Pagination +--------------------- + +PostgREST uses HTTP range headers to describe the size of results. Every response contains the current range and, if requested, the total number of results: + +.. code-block:: http + + HTTP/1.1 200 OK + Range-Unit: items + Content-Range: 0-14/* + +Here items zero through fourteen are returned. This information is available in every response and can help you render pagination controls on the client. This is an RFC7233-compliant solution that keeps the response JSON cleaner. + +There are two ways to apply a limit and offset rows: through request headers or query parameters. When using headers you specify the range of rows desired. This request gets the first twenty people. + +.. tabs:: + + .. code-tab:: http + + GET /people HTTP/1.1 + Range-Unit: items + Range: 0-19 + + .. code-tab:: bash Curl + + curl "http://localhost:3000/people" -i \ + -H "Range-Unit: items" \ + -H "Range: 0-19" + +Note that the server may respond with fewer if unable to meet your request: + +.. code-block:: http + + HTTP/1.1 200 OK + Range-Unit: items + Content-Range: 0-17/* + +You may also request open-ended ranges for an offset with no limit, e.g. :code:`Range: 10-`. + +The other way to request a limit or offset is with query parameters. For example + +.. tabs:: + + .. code-tab:: http + + GET /people?limit=15&offset=30 HTTP/1.1 + + .. code-tab:: bash Curl + + curl "http://localhost:3000/people?limit=15&offset=30" + +This method is also useful for embedded resources, which we will cover in another section. The server always responds with range headers even if you use query parameters to limit the query. + +.. _exact_count: + +Exact Count +----------- + +In order to obtain the total size of the table or view (such as when rendering the last page link in a pagination control), specify ``Prefer: count=exact`` as a request header: + +.. tabs:: + + .. code-tab:: http + + HEAD /bigtable HTTP/1.1 + Range-Unit: items + Range: 0-24 + Prefer: count=exact + + .. code-tab:: bash Curl + + curl "http://localhost:3000/bigtable" -I \ + -H "Range-Unit: items" \ + -H "Range: 0-24" \ + -H "Prefer: count=exact" + +Note that the larger the table the slower this query runs in the database. The server will respond with the selected range and total + +.. code-block:: http + + HTTP/1.1 206 Partial Content + Range-Unit: items + Content-Range: 0-24/3573458 + +.. _planned_count: + +Planned Count +------------- + +To avoid the shortcomings of :ref:`exact count `, PostgREST can leverage PostgreSQL statistics and get a fairly accurate and fast count. +To do this, specify the ``Prefer: count=planned`` header. + +.. tabs:: + + .. code-tab:: http + + HEAD /bigtable?limit=25 HTTP/1.1 + Prefer: count=planned + + .. code-tab:: bash Curl + + curl "http://localhost:3000/bigtable?limit=25" -I \ + -H "Prefer: count=planned" + +.. code-block:: http + + HTTP/1.1 206 Partial Content + Content-Range: 0-24/3572000 + +Note that the accuracy of this count depends on how up-to-date are the PostgreSQL statistics tables. +For example in this case, to increase the accuracy of the count you can do ``ANALYZE bigtable``. +See `ANALYZE `_ for more details. + +.. _estimated_count: + +Estimated Count +--------------- + +When you are interested in the count, the relative error is important. If you have a :ref:`planned count ` of 1000000 and the exact count is +1001000, the error is small enough to be ignored. But with a planned count of 7, an exact count of 28 would be a huge misprediction. + +In general, when having smaller row-counts, the estimated count should be as close to the exact count as possible. + +To help with these cases, PostgREST can get the exact count up until a threshold and get the planned count when +that threshold is surpassed. To use this behavior, you can specify the ``Prefer: count=estimated`` header. The **threshold** is +defined by :ref:`db-max-rows`. + +Here's an example. Suppose we set ``db-max-rows=1000`` and ``smalltable`` has 321 rows, then we'll get the exact count: + +.. tabs:: + + .. code-tab:: http + + HEAD /smalltable?limit=25 HTTP/1.1 + Prefer: count=estimated + + .. code-tab:: bash Curl + + curl "http://localhost:3000/smalltable?limit=25" -I \ + -H "Prefer: count=estimated" + +.. code-block:: http + + HTTP/1.1 206 Partial Content + Content-Range: 0-24/321 + +If we make a similar request on ``bigtable``, which has 3573458 rows, we would get the planned count: + +.. tabs:: + + .. code-tab:: http + + HEAD /bigtable?limit=25 HTTP/1.1 + Prefer: count=estimated + + .. code-tab:: bash Curl + + curl "http://localhost:3000/bigtable?limit=25" -I \ + -H "Prefer: count=estimated" + +.. code-block:: http + + HTTP/1.1 206 Partial Content + Content-Range: 0-24/3572000 + +.. _update: + +Update +====== + +To update a row or rows in a table, use the PATCH verb. Use :ref:`h_filter` to specify which record(s) to update. Here is an example query setting the :code:`category` column to child for all people below a certain age. + +.. tabs:: + + .. code-tab:: http + + PATCH /people?age=lt.13 HTTP/1.1 + + { "category": "child" } + + .. code-tab:: bash Curl + + curl "http://localhost:3000/people?age=lt.13" \ + -X PATCH -H "Content-Type: application/json" \ + -d '{ "category": "child" }' + +Updates also support :code:`Prefer: return=representation` plus :ref:`v_filter`. + +.. warning:: + + Beware of accidentally updating every row in a table. To learn to prevent that see :ref:`block_fulltable`. + +.. _insert: + +Insert +====== + +All tables and `auto-updatable views `_ can be modified through the API, subject to permissions of the requester's database role. + +To create a row in a database table post a JSON object whose keys are the names of the columns you would like to create. Missing properties will be set to default values when applicable. + +.. tabs:: + + .. code-tab:: http + + POST /table_name HTTP/1.1 + + { "col1": "value1", "col2": "value2" } + + .. code-tab:: bash Curl + + curl "http://localhost:3000/table_name" \ + -X POST -H "Content-Type: application/json" \ + -d '{ "col1": "value1", "col2": "value2" }' + +If the table has a primary key, the response can contain a :code:`Location` header describing where to find the new object by including the header :code:`Prefer: return=headers-only` in the request. Make sure that the table is not write-only, otherwise constructing the :code:`Location` header will cause a permissions error. + +On the other end of the spectrum you can get the full created object back in the response to your request by including the header :code:`Prefer: return=representation`. That way you won't have to make another HTTP call to discover properties that may have been filled in on the server side. You can also apply the standard :ref:`v_filter` to these results. + +URL encoded payloads can be posted with ``Content-Type: application/x-www-form-urlencoded``. + +.. tabs:: + + .. code-tab:: http + + POST /people HTTP/1.1 + Content-Type: application/x-www-form-urlencoded + + name=John+Doe&age=50&weight=80 + + .. code-tab:: bash Curl + + curl "http://localhost:3000/people" \ + -X POST -H "Content-Type: application/x-www-form-urlencoded" \ + -d "name=John+Doe&age=50&weight=80" + +.. note:: + + When inserting a row you must post a JSON object, not quoted JSON. + + .. code:: + + Yes + { "a": 1, "b": 2 } + + No + "{ \"a\": 1, \"b\": 2 }" + + Some JavaScript libraries will post the data incorrectly if you're not careful. For best results try one of the :ref:`clientside_libraries` built for PostgREST. + +.. important:: + + It's recommended that you `use triggers instead of rules `_. + Insertion on views with complex `rules `_ might not work out of the box with PostgREST due to its usage of CTEs. + If you want to keep using rules, a workaround is to wrap the view insertion in a stored procedure and call it through the :ref:`s_procs` interface. + For more details, see this `github issue `_. + +.. _bulk_insert: + +Bulk Insert +----------- + +Bulk insert works exactly like single row insert except that you provide either a JSON array of objects having uniform keys, or lines in CSV format. This not only minimizes the HTTP requests required but uses a single INSERT statement on the back-end for efficiency. + +To bulk insert CSV simply post to a table route with :code:`Content-Type: text/csv` and include the names of the columns as the first row. For instance + +.. tabs:: + + .. code-tab:: http + + POST /people HTTP/1.1 + Content-Type: text/csv + + name,age,height + J Doe,62,70 + Jonas,10,55 + + .. code-tab:: bash Curl + + curl "http://localhost:3000/people" \ + -X POST -H "Content-Type: text/csv" \ + --data-binary @- << EOF + name,age,height + J Doe,62,70 + Jonas,10,55 + EOF + +An empty field (:code:`,,`) is coerced to an empty string and the reserved word :code:`NULL` is mapped to the SQL null value. Note that there should be no spaces between the column names and commas. + +To bulk insert JSON post an array of objects having all-matching keys + +.. tabs:: + + .. code-tab:: http + + POST /people HTTP/1.1 + Content-Type: application/json + + [ + { "name": "J Doe", "age": 62, "height": 70 }, + { "name": "Janus", "age": 10, "height": 55 } + ] + + .. code-tab:: bash Curl + + curl "http://localhost:3000/people" \ + -X POST -H "Content-Type: application/json" \ + -d @- << EOF + [ + { "name": "J Doe", "age": 62, "height": 70 }, + { "name": "Janus", "age": 10, "height": 55 } + ] + EOF + +.. _specify_columns: + +Specifying Columns +------------------ + +By using the :code:`columns` query parameter it's possible to specify the payload keys that will be inserted and ignore the rest of the payload. + +.. tabs:: + + .. code-tab:: http + + POST /datasets?columns=source,publication_date,figure HTTP/1.1 + Content-Type: application/json + + { + "source": "Natural Disaster Prevention and Control", + "publication_date": "2015-09-11", + "figure": 1100, + "location": "...", + "comment": "...", + "extra": "...", + "stuff": "..." + } + + .. code-tab:: bash Curl + + curl "http://localhost:3000/datasets?columns=source,publication_date,figure" \ + -X POST -H "Content-Type: application/json" \ + -d @- << EOF + { + "source": "Natural Disaster Prevention and Control", + "publication_date": "2015-09-11", + "figure": 1100, + "location": "...", + "comment": "...", + "extra": "...", + "stuff": "..." + } + EOF + +In this case, only **source**, **publication_date** and **figure** will be inserted. The rest of the JSON keys will be ignored. + +Using this also has the side-effect of being more efficient for :ref:`bulk_insert` since PostgREST will not process the JSON and +it'll send it directly to PostgreSQL. + +.. _upsert: + +Upsert +====== + +You can make an upsert with :code:`POST` and the :code:`Prefer: resolution=merge-duplicates` header: + +.. tabs:: + + .. code-tab:: http + + POST /employees HTTP/1.1 + Prefer: resolution=merge-duplicates + + [ + { "id": 1, "name": "Old employee 1", "salary": 30000 }, + { "id": 2, "name": "Old employee 2", "salary": 42000 }, + { "id": 3, "name": "New employee 3", "salary": 50000 } + ] + + .. code-tab:: bash Curl + + curl "http://localhost:3000/employees" \ + -X POST -H "Content-Type: application/json" \ + -H "Prefer: resolution=merge-duplicates" \ + -d @- << EOF + [ + { "id": 1, "name": "Old employee 1", "salary": 30000 }, + { "id": 2, "name": "Old employee 2", "salary": 42000 }, + { "id": 3, "name": "New employee 3", "salary": 50000 } + ] + EOF + +By default, upsert operates based on the primary key columns, you must specify all of them. You can also choose to ignore the duplicates with :code:`Prefer: resolution=ignore-duplicates`. This works best when the primary key is natural, but it's also possible to use it if the primary key is surrogate (example: "id serial primary key"). For more details read `this issue `_. + +.. important:: + After creating a table or changing its primary key, you must refresh PostgREST schema cache for upsert to work properly. To learn how to refresh the cache see :ref:`schema_reloading`. + +.. _on_conflict: + +On Conflict +----------- + +By specifying the ``on_conflict`` query parameter, you can make upsert work on a column(s) that has a UNIQUE constraint. + +.. tabs:: + + .. code-tab:: http + + POST /employees?on_conflict=name HTTP/1.1 + Prefer: resolution=merge-duplicates + + [ + { "name": "Old employee 1", "salary": 40000 }, + { "name": "Old employee 2", "salary": 52000 }, + { "name": "New employee 3", "salary": 60000 } + ] + + .. code-tab:: bash Curl + + curl "http://localhost:3000/employees?on_conflict=name" \ + -X POST -H "Content-Type: application/json" \ + -H "Prefer: resolution=merge-duplicates" \ + -d @- << EOF + [ + { "name": "Old employee 1", "salary": 40000 }, + { "name": "Old employee 2", "salary": 52000 }, + { "name": "New employee 3", "salary": 60000 } + ] + EOF + +.. _upsert_put: + +PUT +--- + +A single row upsert can be done by using :code:`PUT` and filtering the primary key columns with :code:`eq`: + +.. tabs:: + + .. code-tab:: http + + PUT /employees?id=eq.4 HTTP/1.1 + + { "id": 4, "name": "Sara B.", "salary": 60000 } + + .. code-tab:: bash Curl + + curl "http://localhost/employees?id=eq.4" \ + -X PUT -H "Content-Type: application/json" \ + -d '{ "id": 4, "name": "Sara B.", "salary": 60000 }' + +All the columns must be specified in the request body, including the primary key columns. + +.. _delete: + +Delete +====== + +To delete rows in a table, use the DELETE verb plus :ref:`h_filter`. For instance deleting inactive users: + +.. tabs:: + + .. code-tab:: http + + DELETE /user?active=is.false HTTP/1.1 + + .. code-tab:: bash Curl + + curl "http://localhost:3000/user?active=is.false" -X DELETE + +Deletions also support :code:`Prefer: return=representation` plus :ref:`v_filter`. + +.. tabs:: + + .. code-tab:: http + + DELETE /user?id=eq.1 HTTP/1.1 + Prefer: return=representation + + .. code-tab:: bash Curl + + curl "http://localhost:3000/user?id=eq.1" -X DELETE \ + -H "Prefer: return=representation" + +.. code-block:: json + + {"id": 1, "email": "johndoe@email.com"} + +.. warning:: + + Beware of accidentally deleting all rows in a table. To learn to prevent that see :ref:`block_fulltable`. + +.. _limited_update_delete: + +Limited Update/Delete +===================== + +You can limit the amount of affected rows by :ref:`update` or :ref:`delete` with the ``limit`` query parameter. For this, you must add an explicit ``order`` on a unique column(s). + +.. tabs:: + + .. code-tab:: http + + PATCH /users?limit=10&order=id&last_login=lt.2017-01-01 HTTP/1.1 + + { "status": "inactive" } + + .. code-tab:: bash Curl + + curl -X PATCH "/users?limit=10&order=id&last_login=lt.2020-01-01" \ + -H "Content-Type: application/json" \ + -d '{ "status": "inactive" }' + +.. tabs:: + + .. code-tab:: http + + DELETE /users?limit=10&order=id&status=eq.inactive HTTP/1.1 + + .. code-tab:: bash Curl + + curl -X DELETE "http://localhost:3000/users?limit=10&order=id&status=eq.inactive" + +If your table has no unique columns, you can use the `ctid `_ system column. + +Using ``offset`` to target a different subset of rows is also possible. + +.. note:: + + There is no native ``UPDATE...LIMIT`` or ``DELETE...LIMIT`` support in PostgreSQL; the generated query simulates that behavior and is based on `this Crunchy Data blog post `_. + diff --git a/docs/references/api/url_grammar.rst b/docs/references/api/url_grammar.rst new file mode 100644 index 0000000000..c562f0a75c --- /dev/null +++ b/docs/references/api/url_grammar.rst @@ -0,0 +1,108 @@ +.. note:: + + This page is a work in progress. + +URL Grammar +=========== + +.. _custom_queries: + +Custom Queries +-------------- + +The PostgREST URL grammar limits the kinds of queries clients can perform. It prevents arbitrary, potentially poorly constructed and slow client queries. It's good for quality of service, but means database administrators must create custom views and stored procedures to provide richer endpoints. The most common causes for custom endpoints are + +* Table unions +* More complicated joins than those provided by :ref:`resource_embedding`. +* Geo-spatial queries that require an argument, like "points near (lat,lon)" + +Unicode support +--------------- + +PostgREST supports unicode in schemas, tables, columns and values. To access a table with unicode name, use percent encoding. + +To request this: + +.. code-block:: http + + GET /موارد HTTP/1.1 + +Do this: + +.. tabs:: + + .. code-tab:: http + + GET /%D9%85%D9%88%D8%A7%D8%B1%D8%AF HTTP/1.1 + + .. code-tab:: bash Curl + + curl "http://localhost:3000/%D9%85%D9%88%D8%A7%D8%B1%D8%AF" + +.. _tabs-cols-w-spaces: + +Table / Columns with spaces +~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +You can request table/columns with spaces in them by percent encoding the spaces with ``%20``: + +.. tabs:: + + .. code-tab:: http + + GET /Order%20Items?Unit%20Price=lt.200 HTTP/1.1 + + .. code-tab:: bash Curl + + curl "http://localhost:3000/Order%20Items?Unit%20Price=lt.200" + +.. _reserved-chars: + +Reserved characters +~~~~~~~~~~~~~~~~~~~ + +If filters include PostgREST reserved characters(``,``, ``.``, ``:``, ``()``) you'll have to surround them in percent encoded double quotes ``%22`` for correct processing. + +Here ``Hebdon,John`` and ``Williams,Mary`` are values. + +.. tabs:: + + .. code-tab:: http + + GET /employees?name=in.(%22Hebdon,John%22,%22Williams,Mary%22) HTTP/1.1 + + .. code-tab:: bash Curl + + curl "http://localhost:3000/employees?name=in.(%22Hebdon,John%22,%22Williams,Mary%22)" + +Here ``information.cpe`` is a column name. + +.. tabs:: + + .. code-tab:: http + + GET /vulnerabilities?%22information.cpe%22=like.*MS* HTTP/1.1 + + .. code-tab:: bash Curl + + curl "http://localhost:3000/vulnerabilities?%22information.cpe%22=like.*MS*" + +If the value filtered by the ``in`` operator has a double quote (``"``), you can escape it using a backslash ``"\""``. A backslash itself can be used with a double backslash ``"\\"``. + +Here ``Quote:"`` and ``Backslash:\`` are percent-encoded values. Note that ``%5C`` is the percent-encoded backslash. + +.. tabs:: + + .. code-tab:: http + + GET /marks?name=in.(%22Quote:%5C%22%22,%22Backslash:%5C%5C%22) HTTP/1.1 + + .. code-tab:: bash Curl + + curl "http://localhost:3000/marks?name=in.(%22Quote:%5C%22%22,%22Backslash:%5C%5C%22)" + +.. note:: + + Some HTTP libraries might encode URLs automatically(e.g. :code:`axios`). In these cases you should use double quotes + :code:`""` directly instead of :code:`%22`. + diff --git a/docs/references/configuration.rst b/docs/references/configuration.rst index d27eb0bcbe..fdf922b3c7 100644 --- a/docs/references/configuration.rst +++ b/docs/references/configuration.rst @@ -398,30 +398,7 @@ db-schemas **In-Database** pgrst.db_schemas =============== ================= - The database schema to expose to REST clients. Tables, views and stored procedures in this schema will get API endpoints. - - .. code:: bash - - db-schemas = "api" - - This schema gets added to the `search_path `_ of every request. - -List of schemas -~~~~~~~~~~~~~~~ - - You can also specify a list of schemas that can be used for **schema-based multitenancy** and **api versioning** by :ref:`multiple-schemas`. Example: - - .. code:: bash - - db-schemas = "tenant1, tenant2" - - If you don't :ref:`Switch Schemas `, the first schema in the list(``tenant1`` in this case) is chosen as the default schema. - - *Only the chosen schema* gets added to the `search_path `_ of every request. - - .. warning:: - - Never expose private schemas in this way. See :ref:`schema_isolation`. + The list of database schemas to expose to clients. See :ref:`schemas`. .. _db-tx-end: diff --git a/docs/references/connection_pool.rst b/docs/references/connection_pool.rst index 38dabeee13..d0dea79392 100644 --- a/docs/references/connection_pool.rst +++ b/docs/references/connection_pool.rst @@ -67,7 +67,7 @@ If the pool loses the connection to the database, it will retry reconnecting usi The retries happen immediately after a connection loss, if :ref:`db-channel-enabled` is set to true(the default). Otherwise they'll happen once a request arrives. -The server reloads the :ref:`schema_cache` when recoverying. +The server reloads the :ref:`schema_cache` when recovering. To notify the client of the next retry, the server sends a ``503 Service Unavailable`` status with the ``Retry-After: x`` header. Where ``x`` is the number of seconds programmed for the next retry. diff --git a/postgrest.dict b/postgrest.dict index 6e1e1dd4c8..672343183b 100644 --- a/postgrest.dict +++ b/postgrest.dict @@ -154,6 +154,7 @@ RSA Saleeba savepoint schemas +schema's Sencha Serverless Severin From c5d6526d996ec4c0723704d9cfd1d90b7f8fcb9c Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Wed, 10 May 2023 13:51:51 -0300 Subject: [PATCH 568/711] move pg-safeupdate to own integration --- docs/integrations/nginx.rst | 31 --------------------- docs/integrations/pg-safeupdate.rst | 42 +++++++++++++++++++++++++++++ postgrest.dict | 1 + 3 files changed, 43 insertions(+), 31 deletions(-) create mode 100644 docs/integrations/pg-safeupdate.rst diff --git a/docs/integrations/nginx.rst b/docs/integrations/nginx.rst index 25ce6ca98a..2dc7755b8f 100644 --- a/docs/integrations/nginx.rst +++ b/docs/integrations/nginx.rst @@ -35,37 +35,6 @@ The first step is to create an Nginx configuration file that proxies requests to For ubuntu, if you already installed nginx through :code:`apt` you can add this to the config file in :code:`/etc/nginx/sites-enabled/default`. -.. _block_fulltable: - -Block Full-Table Operations ---------------------------- - -Each table in the admin-selected schema gets exposed as a top level route. Client requests are executed by certain database roles depending on their authentication. All HTTP verbs are supported that correspond to actions permitted to the role. For instance if the active role can drop rows of the table then the DELETE verb is allowed for clients. Here's an API request to delete old rows from a hypothetical logs table: - -.. tabs:: - - .. code-tab:: http - - DELETE /logs?time=lt.1991-08-06 HTTP/1.1 - - .. code-tab:: bash Curl - - curl "http://localhost:3000/logs?time=lt.1991-08-06" -X DELETE - -However it's very easy to delete the **entire table** by omitting the query parameter! - -.. tabs:: - - .. code-tab:: http - - DELETE /logs HTTP/1.1 - - .. code-tab:: bash Curl - - curl "http://localhost:3000/logs" -X DELETE - -This can happen accidentally such as by switching a request from a GET to a DELETE. To protect against accidental operations use the `pg-safeupdate `_ PostgreSQL extension. It raises an error if UPDATE or DELETE are executed without specifying conditions. To install it you can use the `PGXN `_ network: - .. code-block:: bash sudo -E pgxn install safeupdate diff --git a/docs/integrations/pg-safeupdate.rst b/docs/integrations/pg-safeupdate.rst new file mode 100644 index 0000000000..c5f0928cde --- /dev/null +++ b/docs/integrations/pg-safeupdate.rst @@ -0,0 +1,42 @@ +pg-safeupdate +############# + +.. _block_fulltable: + +Block Full-Table Operations +--------------------------- + +If the :ref:`active role ` can delete table rows then the DELETE verb is allowed for clients. Here's an API request to delete old rows from a hypothetical logs table: + +.. tabs:: + + .. code-tab:: http + + DELETE /logs?time=lt.1991-08-06 HTTP/1.1 + + .. code-tab:: bash Curl + + curl "http://localhost:3000/logs?time=lt.1991-08-06" -X DELETE + +Note that it's very easy to delete the **entire table** by omitting the query parameter! + +.. tabs:: + + .. code-tab:: http + + DELETE /logs HTTP/1.1 + + .. code-tab:: bash Curl + + curl "http://localhost:3000/logs" -X DELETE + +This can happen accidentally such as by switching a request from a GET to a DELETE. To protect against accidental operations use the `pg-safeupdate `_ PostgreSQL extension. It raises an error if UPDATE or DELETE are executed without specifying conditions. To install it you can use the `PGXN `_ network: + +.. code-block:: bash + + sudo -E pgxn install safeupdate + + # then add this to postgresql.conf: + # shared_preload_libraries='safeupdate'; + +This does not protect against malicious actions, since someone can add a url parameter that does not affect the result set. To prevent this you must turn to database permissions, forbidding the wrong people from deleting rows, and using `row-level security `_ if finer access control is required. diff --git a/postgrest.dict b/postgrest.dict index 672343183b..2ae87ffacb 100644 --- a/postgrest.dict +++ b/postgrest.dict @@ -152,6 +152,7 @@ RLS RPC RSA Saleeba +safeupdate savepoint schemas schema's From d593bcff802e13e14837d4313ec71e62040e8a9c Mon Sep 17 00:00:00 2001 From: Laurence Isla Date: Wed, 10 May 2023 15:29:11 -0500 Subject: [PATCH 569/711] Fix remaining info about pg-safeupdate in nginx docs --- docs/integrations/nginx.rst | 9 --------- 1 file changed, 9 deletions(-) diff --git a/docs/integrations/nginx.rst b/docs/integrations/nginx.rst index 2dc7755b8f..449716bbcd 100644 --- a/docs/integrations/nginx.rst +++ b/docs/integrations/nginx.rst @@ -35,15 +35,6 @@ The first step is to create an Nginx configuration file that proxies requests to For ubuntu, if you already installed nginx through :code:`apt` you can add this to the config file in :code:`/etc/nginx/sites-enabled/default`. -.. code-block:: bash - - sudo -E pgxn install safeupdate - - # then add this to postgresql.conf: - # shared_preload_libraries='safeupdate'; - -This does not protect against malicious actions, since someone can add a url parameter that does not affect the result set. To prevent this you must turn to database permissions, forbidding the wrong people from deleting rows, and using `row-level security `_ if finer access control is required. - .. _https: HTTPS From dec1e03a0e66c4edfe61c6580bd01a51d91c049c Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Wed, 10 May 2023 18:57:19 -0300 Subject: [PATCH 570/711] add v11 release notes with docs improvs --- docs/conf.py | 4 +- docs/{integrations => explanations}/nginx.rst | 2 + docs/index.rst | 4 ++ docs/references/auth.rst | 2 + docs/references/connection_pool.rst | 2 + docs/references/transactions.rst | 2 + docs/releases/v11.0.0.rst | 72 +++++++++++++++++++ postgrest.dict | 1 + 8 files changed, 87 insertions(+), 2 deletions(-) rename docs/{integrations => explanations}/nginx.rst (99%) create mode 100644 docs/releases/v11.0.0.rst diff --git a/docs/conf.py b/docs/conf.py index f0390613d5..2e48d664bf 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -57,9 +57,9 @@ # built documents. # # The short X.Y version. -version = u'9.0' +version = u'11.0' # The full version, including alpha/beta/rc tags. -release = u'9.0.0' +release = u'11.0.0' # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. diff --git a/docs/integrations/nginx.rst b/docs/explanations/nginx.rst similarity index 99% rename from docs/integrations/nginx.rst rename to docs/explanations/nginx.rst index 449716bbcd..ccbdebc47a 100644 --- a/docs/integrations/nginx.rst +++ b/docs/explanations/nginx.rst @@ -1,3 +1,5 @@ +.. _nginx: + Nginx ===== diff --git a/docs/index.rst b/docs/index.rst index 09529b4b59..34890d57dc 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -158,8 +158,12 @@ Recipes that'll help you address specific use-cases. :name: how-tos :maxdepth: 1 + how-tos/sql-user-* + how-tos/working-* how-tos/* +.. _intgrs: + Integrations ------------ diff --git a/docs/references/auth.rst b/docs/references/auth.rst index 2501c3536a..4eb8b93a14 100644 --- a/docs/references/auth.rst +++ b/docs/references/auth.rst @@ -1,3 +1,5 @@ +.. _authn: + Authentication ============== diff --git a/docs/references/connection_pool.rst b/docs/references/connection_pool.rst index d0dea79392..48683b90a7 100644 --- a/docs/references/connection_pool.rst +++ b/docs/references/connection_pool.rst @@ -1,3 +1,5 @@ +.. _connection_pool: + Connection Pool =============== diff --git a/docs/references/transactions.rst b/docs/references/transactions.rst index 565a2e6d06..45a17b1cc6 100644 --- a/docs/references/transactions.rst +++ b/docs/references/transactions.rst @@ -1,3 +1,5 @@ +.. _transactions: + Transactions ============ diff --git a/docs/releases/v11.0.0.rst b/docs/releases/v11.0.0.rst new file mode 100644 index 0000000000..2db22b082b --- /dev/null +++ b/docs/releases/v11.0.0.rst @@ -0,0 +1,72 @@ +11.0.0 +====== + +Features +-------- + +Documentation improvements +~~~~~~~~~~~~~~~~~~~~~~~~~~ + +- New :ref:`transactions` reference. +- New :ref:`connection_pool` reference. +- Split :ref:`api` into other sub-references. +- Split :ref:`authn` into :ref:`db_authz` and :ref:`sql_user_management`. +- Split :ref:`admin` into :ref:`intgrs` and :ref:`nginx`. + +Breaking changes +---------------- + +Bug fixes +--------- + +Thanks +------ + +Big thanks from the `PostgREST team `_ to our sponsors! + +.. container:: image-container + + .. image:: ../_static/cybertec-new.png + :target: https://www.cybertec-postgresql.com/en/?utm_source=postgrest.org&utm_medium=referral&utm_campaign=postgrest + :width: 13em + + .. image:: ../_static/2ndquadrant.png + :target: https://www.2ndquadrant.com/en/?utm_campaign=External%20Websites&utm_source=PostgREST&utm_medium=Logo + :width: 13em + + .. image:: ../_static/retool.png + :target: https://retool.com/?utm_source=sponsor&utm_campaign=postgrest + :width: 13em + + .. image:: ../_static/gnuhost.png + :target: https://gnuhost.eu/?utm_source=sponsor&utm_campaign=postgrest + :width: 13em + + .. image:: ../_static/supabase.png + :target: https://supabase.com/?utm_source=postgrest%20backers&utm_medium=open%20source%20partner&utm_campaign=postgrest%20backers%20github&utm_term=homepage + :width: 13em + + .. image:: ../_static/oblivious.jpg + :target: https://oblivious.ai/?utm_source=sponsor&utm_campaign=postgrest + :width: 13em + +* `Roboflow `_ +* Evans Fernandes +* Jan Sommer +* `Franz Gusenbauer `_ +* Zac Miller +* Tsingson Qin +* Michel Pelletier +* Jay Hannah +* Robert Stolarz +* Nicholas DiBiase +* Christopher Reid +* Nathan Bouscal +* Daniel Rafaj +* David Fenko +* Remo Rechkemmer +* Severin Ibarluzea +* Tom Saleeba +* Pawel Tyll + +If you like to join them please consider `supporting PostgREST development `_. diff --git a/postgrest.dict b/postgrest.dict index 2ae87ffacb..5a3c355bd4 100644 --- a/postgrest.dict +++ b/postgrest.dict @@ -213,4 +213,5 @@ websearch Websockets webuser wfts +Zac ZeroMQ From c56108b8a9a4fb407adf8a08a06dfc87f86350fc Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Wed, 10 May 2023 19:59:33 -0300 Subject: [PATCH 571/711] add breaking changes --- docs/references/api/stored_procedures.rst | 39 ----------------------- docs/releases/v11.0.0.rst | 9 ++++-- 2 files changed, 7 insertions(+), 41 deletions(-) diff --git a/docs/references/api/stored_procedures.rst b/docs/references/api/stored_procedures.rst index 64fa86d49d..3bb971ab3c 100644 --- a/docs/references/api/stored_procedures.rst +++ b/docs/references/api/stored_procedures.rst @@ -415,42 +415,3 @@ You can call overloaded functions with different number of arguments. .. important:: Overloaded functions with the same argument names but different types are not supported. - -.. _bulk_call: - -Bulk Call ---------- - -It's possible to call a function in a bulk way, analogously to :ref:`bulk_insert`. To do this, you need to add the -``Prefer: params=multiple-objects`` header to your request. - -.. tabs:: - - .. code-tab:: http - - POST /rpc/add_them HTTP/1.1 - Content-Type: text/csv - Prefer: params=multiple-objects - - a,b - 1,2 - 3,4 - - .. code-tab:: bash Curl - - curl "http://localhost:3000/rpc/add_them" \ - -X POST -H "Content-Type: text/csv" \ - -H "Prefer: params=multiple-objects" \ - --data-binary @- << EOF - a,b - 1,2 - 3,4 - EOF - -.. code-block:: json - - [ 3, 7 ] - -If you have large payloads to process, it's preferable you instead use a function with an :ref:`array parameter ` or JSON parameter, as this will be more efficient. - -It's also possible to :ref:`Specify Columns ` on functions calls. diff --git a/docs/releases/v11.0.0.rst b/docs/releases/v11.0.0.rst index 2db22b082b..83a3a5a94a 100644 --- a/docs/releases/v11.0.0.rst +++ b/docs/releases/v11.0.0.rst @@ -13,11 +13,16 @@ Documentation improvements - Split :ref:`authn` into :ref:`db_authz` and :ref:`sql_user_management`. - Split :ref:`admin` into :ref:`intgrs` and :ref:`nginx`. +Bug fixes +--------- + Breaking changes ---------------- -Bug fixes ---------- +- Removed Bulk Call with ``Prefer: params=multiple-objects`` on Stored Procedures. +- To comply with `RFC 9110 `_, the Range header is now only considered on GET. + + Other methods will ignore it and instead should use the ``limit/offset``. + + PUT requests no longer return an error when this header is present (using limit/offset still triggers the error) Thanks ------ From 0bd43663fcf2d0e8c6b31dbb40b6f2ecc63f6c1e Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Wed, 10 May 2023 20:06:06 -0300 Subject: [PATCH 572/711] add isdistinct --- docs/references/api/tables_views.rst | 1 + docs/releases/v11.0.0.rst | 5 +++++ postgrest.dict | 1 + 3 files changed, 7 insertions(+) diff --git a/docs/references/api/tables_views.rst b/docs/references/api/tables_views.rst index 99a919e49c..aec5d9dcb6 100644 --- a/docs/references/api/tables_views.rst +++ b/docs/references/api/tables_views.rst @@ -82,6 +82,7 @@ in :code:`IN` one of a list of values, e.g. :code:`?a= – also supports commas in quoted strings like :code:`?a=in.("hi,there","yes,you")` is :code:`IS` checking for exact equality (null,true,false,unknown) +isdistinct :code:`IS DISTINCT FROM` not equal, treating :code:`NULL` as a comparable value fts :code:`@@` :ref:`fts` using to_tsquery plfts :code:`@@` :ref:`fts` using plainto_tsquery phfts :code:`@@` :ref:`fts` using phraseto_tsquery diff --git a/docs/releases/v11.0.0.rst b/docs/releases/v11.0.0.rst index 83a3a5a94a..3372bf58c3 100644 --- a/docs/releases/v11.0.0.rst +++ b/docs/releases/v11.0.0.rst @@ -4,6 +4,11 @@ Features -------- +Horizontal Filtering +~~~~~~~~~~~~~~~~~~~~ + +- New ``isdistinct`` :ref:`operator `. It is a direct translation of `IS DINTINCT FROM `_. + Documentation improvements ~~~~~~~~~~~~~~~~~~~~~~~~~~ diff --git a/postgrest.dict b/postgrest.dict index 5a3c355bd4..6803c01be7 100644 --- a/postgrest.dict +++ b/postgrest.dict @@ -67,6 +67,7 @@ ilike imatch io IP +isdistinct JS js JSON From cb7d70c197e420cab365f4220294fe47f3c72ceb Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Wed, 10 May 2023 20:17:46 -0300 Subject: [PATCH 573/711] add trace header --- docs/references/admin.rst | 28 ++++++++++++++++++++++++++++ docs/references/configuration.rst | 13 +++++++++++++ docs/releases/v11.0.0.rst | 5 +++++ 3 files changed, 46 insertions(+) diff --git a/docs/references/admin.rst b/docs/references/admin.rst index ed83e8c9dd..2a8f01b7ae 100644 --- a/docs/references/admin.rst +++ b/docs/references/admin.rst @@ -89,6 +89,34 @@ When debugging a problem it's important to verify the PostgREST version. Look fo Server: postgrest/11.0.1 +.. _trace_header: + +Trace Header +------------ + +You can enable tracing HTTP requests by setting :ref:`server-trace-header`. Specify the set header in the request, and the server will include it in the response. + +.. code:: bash + + server-trace-header = "X-Request-Id" + +.. tabs:: + + .. code-tab:: http + + GET /users + X-Request-Id: 123 + + .. code-tab:: bash Curl + + curl "http://localhost:3000/users" \ + -H "X-Request-Id: 123" + +.. code:: + + HTTP/1.1 200 OK + X-Request-Id: 123 + .. _explain_plan: Execution plan diff --git a/docs/references/configuration.rst b/docs/references/configuration.rst index fdf922b3c7..64906661bc 100644 --- a/docs/references/configuration.rst +++ b/docs/references/configuration.rst @@ -174,6 +174,7 @@ openapi-server-proxy-uri String Y raw-media-types String Y server-host String !4 server-port Int 3000 +server-trace-header String Y server-unix-socket String server-unix-socket-mode String 660 =========================== ======= ================= ========== @@ -670,6 +671,18 @@ server-port The TCP port to bind the web server. +.. _server-trace-header: + +server-trace-header +------------------- + + =============== ================= + **Environment** PGRST_SERVER_TRACE_HEADER + **In-Database** `pgrst.server_trace_header` + =============== ================= + + The header name used to trace HTTP requests. See :ref:`trace_header`. + .. _server-unix-socket: server-unix-socket diff --git a/docs/releases/v11.0.0.rst b/docs/releases/v11.0.0.rst index 3372bf58c3..da5aa1d3e9 100644 --- a/docs/releases/v11.0.0.rst +++ b/docs/releases/v11.0.0.rst @@ -9,6 +9,11 @@ Horizontal Filtering - New ``isdistinct`` :ref:`operator `. It is a direct translation of `IS DINTINCT FROM `_. +Admin +~~~~~ + +- New :ref:`trace_header`. + Documentation improvements ~~~~~~~~~~~~~~~~~~~~~~~~~~ From 1de06f5332e9f73e62b4d3e56368243d5e1fcb94 Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Wed, 10 May 2023 20:40:46 -0300 Subject: [PATCH 574/711] add openapi overriding --- docs/references/api/openapi.rst | 50 +++++++++++++++++++++++++++++++ docs/references/configuration.rst | 12 ++++++++ docs/releases/v11.0.0.rst | 5 ++++ 3 files changed, 67 insertions(+) diff --git a/docs/references/api/openapi.rst b/docs/references/api/openapi.rst index 31d23b52a2..f2ba5d4760 100644 --- a/docs/references/api/openapi.rst +++ b/docs/references/api/openapi.rst @@ -43,3 +43,53 @@ You can use a tool like `Swagger UI `_ to The OpenAPI information can go out of date as the schema changes under a running server. To learn how to refresh the cache see :ref:`schema_reloading`. +.. _override_openapi: + +Overriding OpenAPI response +--------------------------- + +You can override the default response with a function result. To do this, set the function on :ref:`db-root-spec`. + +.. code:: bash + + db-root-spec = "root" + +.. code:: postgres + + create or replace function root() returns json as $_$ + declare + openapi json = $$ + { + "swagger": "2.0", + "info":{ + "title":"Overridden", + "description":"This is a my own API" + } + } + $$; + begin + return openapi; + end + $_$ language plpgsql; + +.. tabs:: + + .. code-tab:: http + + GET / HTTP/1.1 + + .. code-tab:: bash Curl + + curl http://localhost:3000 + +.. code-block:: http + + HTTP/1.1 200 OK + + { + "swagger": "2.0", + "info":{ + "title":"Overridden", + "description":"This is a my own API" + } + } diff --git a/docs/references/configuration.rst b/docs/references/configuration.rst index 64906661bc..557972a15d 100644 --- a/docs/references/configuration.rst +++ b/docs/references/configuration.rst @@ -387,6 +387,18 @@ db-prepared-statements You should only set this to ``false`` when using PostgresSQL behind an external connection pooler such as PgBouncer working in transaction pooling mode. See :ref:`this section ` for more information. +.. _db-root-spec: + +db-root-spec +------------ + + =============== ================= + **Environment** PGRST_DB_ROOT_SPEC + **In-Database** pgrst.db_root_spec + =============== ================= + + Function to override the OpenAPI response. See :ref:`override_openapi`. + .. _db-schemas: db-schemas diff --git a/docs/releases/v11.0.0.rst b/docs/releases/v11.0.0.rst index da5aa1d3e9..7e67adb7ea 100644 --- a/docs/releases/v11.0.0.rst +++ b/docs/releases/v11.0.0.rst @@ -9,6 +9,11 @@ Horizontal Filtering - New ``isdistinct`` :ref:`operator `. It is a direct translation of `IS DINTINCT FROM `_. +OpenAPI +~~~~~~~ + +- Allow :ref:`override_openapi`. + Admin ~~~~~ From e813375c7da5b72cbbd6d16bb69c89909e2ccac6 Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Wed, 10 May 2023 20:47:09 -0300 Subject: [PATCH 575/711] openapi title override --- docs/references/api/openapi.rst | 17 +++++++++++++---- docs/releases/v11.0.0.rst | 1 + 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/docs/references/api/openapi.rst b/docs/references/api/openapi.rst index f2ba5d4760..d8d3ce34b6 100644 --- a/docs/references/api/openapi.rst +++ b/docs/references/api/openapi.rst @@ -35,20 +35,29 @@ Also if you wish to generate a ``summary`` field you can do it by having a multi spans multiple lines$$; +Similarly, you can override the API title by commenting the schema. + +.. code-block:: plpgsql + + COMMENT ON SCHEMA api IS + $$FooBar API + + A RESTful API that serves FooBar data.$$; + If you need to include the ``security`` and ``securityDefinitions`` options, set the :ref:`openapi-security-active` configuration to ``true``. You can use a tool like `Swagger UI `_ to create beautiful documentation from the description and to host an interactive web-based dashboard. The dashboard allows developers to make requests against a live PostgREST server, and provides guidance with request headers and example request bodies. .. important:: - The OpenAPI information can go out of date as the schema changes under a running server. To learn how to refresh the cache see :ref:`schema_reloading`. + The OpenAPI information can go out of date as the schema changes under a running server. See :ref:`schema_reloading`. .. _override_openapi: -Overriding OpenAPI response ---------------------------- +Overriding Full OpenAPI Response +-------------------------------- -You can override the default response with a function result. To do this, set the function on :ref:`db-root-spec`. +You can override the whole default response with a function result. To do this, set the function on :ref:`db-root-spec`. .. code:: bash diff --git a/docs/releases/v11.0.0.rst b/docs/releases/v11.0.0.rst index 7e67adb7ea..8ef67c98d6 100644 --- a/docs/releases/v11.0.0.rst +++ b/docs/releases/v11.0.0.rst @@ -12,6 +12,7 @@ Horizontal Filtering OpenAPI ~~~~~~~ +- Allow :ref:`overriding the OpenAPI title `. - Allow :ref:`override_openapi`. Admin From 7832ddba52426cad026ab2a70d4c39cde5df7a51 Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Wed, 10 May 2023 21:14:50 -0300 Subject: [PATCH 576/711] add any/all modifiers --- docs/references/api/tables_views.rst | 33 ++++++++++++++++++++++++++++ docs/releases/v11.0.0.rst | 1 + 2 files changed, 34 insertions(+) diff --git a/docs/references/api/tables_views.rst b/docs/references/api/tables_views.rst index aec5d9dcb6..837dd82322 100644 --- a/docs/references/api/tables_views.rst +++ b/docs/references/api/tables_views.rst @@ -100,6 +100,8 @@ adj :code:`-|-` is adjacent to, e.g. :code:`?range=adj.( not :code:`NOT` negates another operator, see :ref:`logical_operators` or :code:`OR` logical :code:`OR`, see :ref:`logical_operators` and :code:`AND` logical :code:`AND`, see :ref:`logical_operators` +all :code:`ALL` comparison matches all the values in the list, see :ref:`logical_operators` +any :code:`ANY` comparison matches any value in the list, see :ref:`logical_operators` ============ ======================== ================================================================================== For more complicated filters you will have to create a new view in the database, or use a stored procedure. For instance, here's a view to show "today's stories" including possibly older pinned stories: @@ -156,6 +158,37 @@ You can also apply complex logic to the conditions: curl "http://localhost:3000/people?grade=gte.90&student=is.true&or=(age.eq.14,not.and(age.gte.11,age.lte.17))" +.. _modifiers: + +Operator Modifiers +~~~~~~~~~~~~~~~~~~ + +You may further simplify the logic using the ``any/all`` modifiers of ``eq,like,ilike,gt,gte,lt,lte,match,imatch``. + +For instance, to avoid repeating the same column for ``or``, use ``any`` to get people with last names that start with O or P: + +.. tabs:: + + .. code-tab:: http + + GET /people?last_name=like(any).{O*,P*} HTTP/1.1 + + .. code-tab:: bash Curl + + curl "http://localhost:3000/people?last_name=like(any).{O*,P*}" + +In a similar way, you can use ``all`` to avoid repeating the same column for ``and``. To get the people with last names that start with O and end with n: + +.. tabs:: + + .. code-tab:: http + + GET /people?last_name=like(all).{O*,*n} HTTP/1.1 + + .. code-tab:: bash Curl + + curl "http://localhost:3000/people?last_name=like(all).{O*,*n}" + .. _pattern_matching: Pattern Matching diff --git a/docs/releases/v11.0.0.rst b/docs/releases/v11.0.0.rst index 8ef67c98d6..c7cf789eaf 100644 --- a/docs/releases/v11.0.0.rst +++ b/docs/releases/v11.0.0.rst @@ -8,6 +8,7 @@ Horizontal Filtering ~~~~~~~~~~~~~~~~~~~~ - New ``isdistinct`` :ref:`operator `. It is a direct translation of `IS DINTINCT FROM `_. +- New ``and/all`` :ref:`modifiers`. OpenAPI ~~~~~~~ From 8ae6b012f4abba8d7643b2b1c8e311885d01c31b Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Wed, 10 May 2023 21:23:34 -0300 Subject: [PATCH 577/711] add empty embed filter --- docs/references/api/resource_embedding.rst | 28 ++++++++++++++++++++-- docs/releases/v11.0.0.rst | 6 +++++ 2 files changed, 32 insertions(+), 2 deletions(-) diff --git a/docs/references/api/resource_embedding.rst b/docs/references/api/resource_embedding.rst index 231ddd3773..e410ba4475 100644 --- a/docs/references/api/resource_embedding.rst +++ b/docs/references/api/resource_embedding.rst @@ -418,8 +418,8 @@ The result will show the nested actors named Tom and order them by last name. Al .. _embedding_top_level_filter: -Embedding with Top-level Filtering ----------------------------------- +Top-level Filtering +------------------- By default, :ref:`embed_filters` don't change the top-level resource(``films``) rows at all: @@ -481,6 +481,30 @@ In order to filter the top level rows you need to add ``!inner`` to the embedded } ] +.. _empty_embed_filter: + +Empty Embed Filter +~~~~~~~~~~~~~~~~~~ + +If you want to filter the films by actors but don't want to include them in the response, empty the embedded columns. + +.. tabs:: + + .. code-tab:: http + + GET /films?select=title,actors!inner()&actors.first_name=eq.Jehanne HTTP/1.1 + + .. code-tab:: bash Curl + + curl "http://localhost:3000/films?select=title,actors!inner()&actors.first_name=eq.Jehanne" + +.. code-block:: json + [ + { + "title": "The Haunted Castle", + } + ] + .. _embedding_partitioned_tables: Embedding Partitioned Tables diff --git a/docs/releases/v11.0.0.rst b/docs/releases/v11.0.0.rst index c7cf789eaf..a346e17972 100644 --- a/docs/releases/v11.0.0.rst +++ b/docs/releases/v11.0.0.rst @@ -10,6 +10,11 @@ Horizontal Filtering - New ``isdistinct`` :ref:`operator `. It is a direct translation of `IS DINTINCT FROM `_. - New ``and/all`` :ref:`modifiers`. +Resource Embedding +~~~~~~~~~~~~~~~~~~ + +- New :ref:`empty_embed_filter`. + OpenAPI ~~~~~~~ @@ -38,6 +43,7 @@ Breaking changes - Removed Bulk Call with ``Prefer: params=multiple-objects`` on Stored Procedures. - To comply with `RFC 9110 `_, the Range header is now only considered on GET. + + Other methods will ignore it and instead should use the ``limit/offset``. + PUT requests no longer return an error when this header is present (using limit/offset still triggers the error) From d15dc680aff2b4b94d29b8818b56cb71e10e1e1b Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Wed, 10 May 2023 22:28:58 -0300 Subject: [PATCH 578/711] add top-level ordering --- docs/references/api/resource_embedding.rst | 19 +++++++++++++++++++ docs/releases/v11.0.0.rst | 1 + 2 files changed, 20 insertions(+) diff --git a/docs/references/api/resource_embedding.rst b/docs/references/api/resource_embedding.rst index e410ba4475..ed44c47cbe 100644 --- a/docs/references/api/resource_embedding.rst +++ b/docs/references/api/resource_embedding.rst @@ -505,6 +505,25 @@ If you want to filter the films by actors but don't want to include them in the } ] +.. _top_level_order: + +Top-level Ordering +------------------ + +On :ref:`Many-to-One ` and :ref:`One-to-One ` relationships, you can use a column of the "to-one" end to sort the top-level. + +For example, to arrange the films in descending order using the director's last name. + +.. tabs:: + + .. code-tab:: http + + GET /films?select=title,directors(last_name)&order=directors(last_name).desc HTTP/1.1 + + .. code-tab:: bash Curl + + curl "http://localhost:3000/films?select=title,directors(last_name)&order=directors(last_name).desc" + .. _embedding_partitioned_tables: Embedding Partitioned Tables diff --git a/docs/releases/v11.0.0.rst b/docs/releases/v11.0.0.rst index a346e17972..5223369e11 100644 --- a/docs/releases/v11.0.0.rst +++ b/docs/releases/v11.0.0.rst @@ -14,6 +14,7 @@ Resource Embedding ~~~~~~~~~~~~~~~~~~ - New :ref:`empty_embed_filter`. +- New :ref:`top_level_order`. OpenAPI ~~~~~~~ From 9595ed845e4067622388dbf9bf311805bec5dae3 Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Wed, 10 May 2023 22:50:22 -0300 Subject: [PATCH 579/711] add null filtering embeds --- docs/references/admin.rst | 3 +- docs/references/api/resource_embedding.rst | 59 +++++++++++++++++++--- docs/releases/v11.0.0.rst | 3 +- 3 files changed, 57 insertions(+), 8 deletions(-) diff --git a/docs/references/admin.rst b/docs/references/admin.rst index 2a8f01b7ae..6e00eb3f9b 100644 --- a/docs/references/admin.rst +++ b/docs/references/admin.rst @@ -104,7 +104,8 @@ You can enable tracing HTTP requests by setting :ref:`server-trace-header`. Spec .. code-tab:: http - GET /users + GET /users HTTP/1.1 + X-Request-Id: 123 .. code-tab:: bash Curl diff --git a/docs/references/api/resource_embedding.rst b/docs/references/api/resource_embedding.rst index ed44c47cbe..456e03dbff 100644 --- a/docs/references/api/resource_embedding.rst +++ b/docs/references/api/resource_embedding.rst @@ -481,24 +481,71 @@ In order to filter the top level rows you need to add ``!inner`` to the embedded } ] -.. _empty_embed_filter: +.. _null_embed: -Empty Embed Filter -~~~~~~~~~~~~~~~~~~ +Null filtering on Embedded Resources +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -If you want to filter the films by actors but don't want to include them in the response, empty the embedded columns. +Null filtering on the embedded resources can behave the same as ``!inner``. While providing more flexibility. + +For example, doing ``actors=not.is.null`` returns the same result as ``actors!inner(*)``: .. tabs:: .. code-tab:: http - GET /films?select=title,actors!inner()&actors.first_name=eq.Jehanne HTTP/1.1 + GET /films?select=title,actors(*)&actors=not.is.null HTTP/1.1 .. code-tab:: bash Curl - curl "http://localhost:3000/films?select=title,actors!inner()&actors.first_name=eq.Jehanne" + curl "http://localhost:3000/films?select=title,actors(*)&actors=not.is.null" + +The ``is.null`` filter can be used in embedded resources to perform an anti-join. To get all the films that do not have any nominations: + +.. tabs:: + + .. code-tab:: http + + GET /films?select=title,nominations()&nominations=is.null HTTP/1.1 + + .. code-tab:: bash Curl + + curl "http://localhost:3000/films?select=title,nominations()&nominations=is.null" + + +Both ``is.null`` and ``not.is.null`` can be included inside the `or` operator. For instance, to get the films that have no actors **or** directors registered yet: + +.. tabs:: + + .. code-tab:: http + + GET /films?select=title,actors(*),directors(*)&or=(actors.is.null,directors.is.null) HTTP/1.1 + + .. code-tab:: bash Curl + + curl "http://localhost:3000/films?select=title,actors(*),directors(*)&or=(actors.is.null,directors.is.null)" + +.. _empty_embed: + +Empty Embed +~~~~~~~~~~~ + +You can leave an embedded resource empty, this helps with filtering in some cases. + +To filter the films by actors but not include them: + +.. tabs:: + + .. code-tab:: http + + GET /films?select=title,actors()&actors.first_name=eq.Jehanne&actors=not.is.null HTTP/1.1 + + .. code-tab:: bash Curl + + curl "http://localhost:3000/films?select=title,actors()&actors.first_name=eq.Jehanne&actors=not.is.null" .. code-block:: json + [ { "title": "The Haunted Castle", diff --git a/docs/releases/v11.0.0.rst b/docs/releases/v11.0.0.rst index 5223369e11..7eba9688ad 100644 --- a/docs/releases/v11.0.0.rst +++ b/docs/releases/v11.0.0.rst @@ -13,8 +13,9 @@ Horizontal Filtering Resource Embedding ~~~~~~~~~~~~~~~~~~ -- New :ref:`empty_embed_filter`. - New :ref:`top_level_order`. +- New :ref:`null_embed`. +- New :ref:`empty_embed`. OpenAPI ~~~~~~~ From f02be3fb769c5f0410df96fc30b8f9ecf4ec1192 Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Wed, 10 May 2023 23:11:45 -0300 Subject: [PATCH 580/711] add spread embed --- docs/references/api/resource_embedding.rst | 59 ++++++++++++++++++++++ docs/releases/v11.0.0.rst | 1 + 2 files changed, 60 insertions(+) diff --git a/docs/references/api/resource_embedding.rst b/docs/references/api/resource_embedding.rst index 456e03dbff..54de4d4600 100644 --- a/docs/references/api/resource_embedding.rst +++ b/docs/references/api/resource_embedding.rst @@ -571,6 +571,65 @@ For example, to arrange the films in descending order using the director's last curl "http://localhost:3000/films?select=title,directors(last_name)&order=directors(last_name).desc" +.. _spread_embed: + +Spread embedded resource +------------------------ + +On many-to-one and one-to-one relationships, you can "spread" the embedded resource. That is, remove the surrounding JSON object for the embedded resource columns. + +.. tabs:: + + .. code-tab:: http + + GET /films?select=title,...directors(director_last_name:last_name)&title=like.*Workers* HTTP/1.1 + + .. code-tab:: bash Curl + + curl "http://localhost:3000/films?select=title,...directors(director_last_name:last_name)&title=like.*Workers*" + +.. code-block:: json + + [ + { + "title": "Workers Leaving The Lumière Factory In Lyon", + "director_last_name": "Lumière" + } + ] + +Note that there is no ``"directors"`` object. Also the embed columns can be aliased normally. + +You can use this to get the columns of a join table in a many-to-many relationship. For instance, to get films and its actors, but including the ``character`` column from the roles table: + +.. tabs:: + + .. code-tab:: http + + GET /films?select=title,actors:roles(character,...actors(first_name,last_name))&title=like.*Lighthouse* HTTP/1.1 + + .. code-tab:: bash Curl + + curl "http://localhost:3000/films?select=title,actors:roles(character,...actors(first_name,last_name))&title=like.*Lighthouse*" + +.. code-block:: json + + [ + { + "title": "The Lighthouse", + "actors": [ + { + "character": "Thomas Wake", + "first_name": "Willem", + "last_name": "Dafoe" + } + ] + } + ] + +.. note:: + + The spread operator ``...`` is borrowed from the Javascript `spread syntax `_. + .. _embedding_partitioned_tables: Embedding Partitioned Tables diff --git a/docs/releases/v11.0.0.rst b/docs/releases/v11.0.0.rst index 7eba9688ad..a2de2b3b9b 100644 --- a/docs/releases/v11.0.0.rst +++ b/docs/releases/v11.0.0.rst @@ -14,6 +14,7 @@ Resource Embedding ~~~~~~~~~~~~~~~~~~ - New :ref:`top_level_order`. +- New :ref:`spread_embed`. - New :ref:`null_embed`. - New :ref:`empty_embed`. From 84b01dea993e28fc71e6881e02a12cde507742a3 Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Wed, 10 May 2023 23:44:09 -0300 Subject: [PATCH 581/711] add recursive m2m disamb --- diagrams/users.er | 13 +++++++ docs/_static/users.png | Bin 0 -> 14073 bytes docs/references/api/resource_embedding.rst | 38 +++++++++++++++++++++ 3 files changed, 51 insertions(+) create mode 100644 diagrams/users.er create mode 100644 docs/_static/users.png diff --git a/diagrams/users.er b/diagrams/users.er new file mode 100644 index 0000000000..e42ca312f4 --- /dev/null +++ b/diagrams/users.er @@ -0,0 +1,13 @@ +[Users] +*id +first_name +last_name +username + +[Subscriptions] +*+subscriber_id +*+subscribed_id +type + +Users 1--* Subscriptions +Subscriptions *--1 Users diff --git a/docs/_static/users.png b/docs/_static/users.png new file mode 100644 index 0000000000000000000000000000000000000000..f8b57fee753d46a31e6d918c868c8775fc8f97fb GIT binary patch literal 14073 zcmb8W1yq(>*EafqfDa)hB`7H(A}uZ5As|ReBZzb(T_PYMEhXI{rG#{+NJ=9up>%`5 zKk@y?IOiMRch33Gy~o(f-cQ{3T5DeOipe`=Md=$@T{zJ2x^3^gy=Juj~n%-I?pu5F6;3)k-SYl2I<&CA#}c) z%A$06WMTIW#6{5GpwsD@6Ut}gJ&n$LMI9mWr-j+C`Ap^MP5C@-Y8eEve;T1g#61%O zgO?Yqhsk>%O<%@~C7@`{l8&u>tT>u*?|WBdk*ezzGPievgge0xiORSGf07|YiqH^< z2%I)K_^JE<@P{rECQnaK%ruRigM*FC%P$DTKCPn`RXnfVLe7(<)0S9K83_sh3|$05 zJEI^F`93HAA76N%TD`&Z?8CG!uiO4BUln(E_wp}w zbvhTD@NVR_#sB_poOsQIl$3^7gBgRF(uD;D9Ar2Y6cntiC3$&y1qBa$6WiO{DR``J z3pf|$$;NOUx`XKHE{ z6&0}`KICL&d7Q50(n-I+TR79;>E4&fbsP6O&Hj8K)y2V>KD#?9< z{*S}WnckH>0x`Hz8k**j5h9xXjjCC_dbfk_Xokm>Tfa*hbKc))udJ-x+1YtS{)s{m z6~QJ$Mz+{vx7aZsl9zY?#*G^e4tsnKzbt1PlF5&&b*x{$yw~uuOp{lc)*tC-YiHLy zrlqBIaBzSc)}O#BO|2|9L5D!RxsD#nw6=d)qWTyo%dgP`-Q4T){OD+F_HrfF8(&O^ zrRvMowSRi>`#SDz%{rHzx7eikVqsxn$;rvpUW$siqWCSkdoFdPta`63EL6izPfuI8 zveyX6@O=_F28cP{(LONH={Dwwjg8%@*uEeB1s^TFurQ?L$&)AYa&m-(grg<;TbrBK z=H_w%E&l#!b@rd~^BEsMCd$dqmTaQsD3BYbW22UllPk!}Q~p9Ka+#5lLCeS}n-TbRT#0to=C8h_{#0QbD=RB=bGQ9f0xf>? zk^3HHFFJ7_pSu4&-U%jV!otR$nw(r;U&q42V$rEC^*Gs0OQU8Kj48i58rU2gZ0qgk zKKfoK*G&G{4tGT6u;#b>MY9MN9X{oM0+8f8Jt*!lIWF#~!jNwV*7xNzv z?3c;+gfI7mp$=-DHzuPQlpZ{I@cjAnc!iv>u)e=1dt;xpb8~W}Ms+^F46Cg@QxZOR zT=||{US9s;1BtG#uArdc_3PJ_l=`(kzm#1|*}poGWYouEOoK*E^1%^L3#)vN7_TG! zWMpIjVtlYtN@5sKZ-k!5BG`QJl_`|J2wV!EPF7v~opMLE$r&iCK701%WgoePg$2f& z^rE82mg8)ys>AuJxy8>b)+Z}0f)9&Rjb6P9%AAj3R3+L7`AbG-dK)E;6+V9(4(#eG zH8UJ;xR#ffZ{4~j9*BE>yckZrN;y#CV@J;>lb@fDiHqCeYrj5{@3J^KRb>+$9c{Sx zkQyhH$yZbkE(ZtBh6^a{QdFPBMA&AyU=6D59UO?)4N}=mdWaH89-V5RVWD-zHc_Kf z9d;@Ux3X_;Zl-!)@VUBQ{B^bO_H*O5o^9~VsxQnm@`g$(H|doMB}>oA=`bqG$jn5~ zc(-3L#Hv>}UTHOTyt4@Sq4wvM8`MbL=v@9+Qmmf)~C&Bqca|LNX9F!W zGB!FYO6Kfmy}RrgJkh(bk!ajP^-n`XLxjhf*hnO`c7&eV>9+(QDHejNkDd2s`CAgq3s ztr!i15x$dNT*=OECyHMFOGQOz=&jF=YeP2~6zklNiVLr|f8@FO3yPG6hUUkQA5dSf zU%&3`_-xvrBJ546FQ5P5ypzhiNat%*-%C1wSY!e!Dt$PYy1M6QTaE6nuJ0UWvx1!P z?ljmfVx;!-u(35A0+>dpOMJskPvWtGUbwK677`-=^yyQ0lY|5su0ujX0#pj=$=uFj z=lS_L^e(8@j?i1;{Hj`7jKfpE?-&OcvEi=k&UyBrj2ztRgjaKt;Y50qLg9?$<}LOt zEg287*y*gTuF9wv7Zu&@REM_KDaC>29}p1CCm`T?>R8?<@OslxEo`#l(gqBj5+6U-i@%sr08z8ZlC-GsEvwsaBz65O$O~!>m2If`c zjqn9Dh>MBwI6oMp^4RwENz)e>f0LRz3ybeIj?VW;9J#i(7P*#XZ*RZND=&A)Vs~_W zJf57Vom!=>W(Bub&eW8FgjgJ@_5AsJO2Nd3yW88;C1qmq2u{=QcT4iA7C(LZbS##V zIE@b_5|)yp=i=g`sQA71^%lS?0H6$g)A#R+?+61uWGx!9FbbQP<9gduPiDO@1^EW-oxSNu`N{peB5ZtgpxvJXKLfhO5yWsy4d1g}1lUzl51yiLu0s-Jfyxq2t31?fFFGaWSN;?*)Is_W&>s@&M3U^$2 z5BK`FmhOWgaNOkNLPJB{2H!L*SXq5~`}S={Jy{lX*gxZCi-A;L$NR%d!WYLcfH3hV zr^LloSxs^4_)29$lbW{xyxnbHU44azhv(#U;CXf^=z03ggZ1mzuYhKk{oWUQKtL)i z#uog)A=7VAaLBW!H!ooh`SQ&o#-c{(g(v$L0R z`d+vA?3cbetVBge+o3BdDM7cgc41nc`b|7Hjmwtjy7#LO042Y7g3OP);rvh=;N8Q* z%xrCW+3950#9vud6y?I3*VFTym`VMkkmqxSGk_c*gnYJhh##xaXt%b)OP~%H;QNh? z{8ODA9rq6pJI01{o(KRQLSLA$bcV$MoXz8+S4@%%mk1;f`}y)Xgp^{R3D zJ-WBjKVey!o<8r7d2T&7C*}3^y3*37z*OYpSPu5~GJiS8V!E2!zZor|^@TPp@>_!zn&OhjE5JFfA3x5p zUY&y++Q+=AHN@R(WrUy*IPjTjm7JZqMe*T7NmN(%*M?Ca=phDXn=+!~o7uD`1gX{G zO)?mV8qQRvrYm~WV;Be#Z;XyuP%KftniHP>D@+vR zh}9=^6m?_35R-&F`CT1_85mZgm4tkm2N2s{h{YZ~Iw1b6to=Pb>+syb4NXi;EXIo4 zcY6^C97hA42@9PX$9L30@N|ZZX0YE>-hX!{KAS#^WCHedpRM>07jy+{0|OEB%@;5G zQ$F4IhVPX8-}l?l?0!X#1M#RxNJvxyKhzf*;W>r_#!c70RvOepoCm?_(xQSVuyApA z7k1fhnwk>e=XV3<2DCB|_l{q8&xObpMUV^5s7GLM<1@L3L4CD#cCIWh_rRxPpKtaL!OzmsfZ65n288tOEs1Ilnno}q~N7u+SoTK3; zsQqn=i9Nz@346i!E$%ppi(eDP&s9pbHZub{uV7%1M*BFH2LM38`A^rkZ%g)HZ{AZt z;^Cz}b}iozZv<(kKp|*7UG09f8HrhoE=M4ysHn)hgN@kdf_1rPW0Jd)3^GRZ`EzFh zzIV4>wShXMjRpi5j_oY`=4el{DqLs!#5Zq7 z15dntTSrCZim|I&0J{V{7ry-aIVovsC|mxl!vqmQLZ*R>({Q@ZL`oX>@#Ad}F_LFP z^k!ye0E|LHLdF-5$-^pv6lj#_If+Y2sHt(WuqevPGTyzLMIrDQk@nhGlaCF=ZW|!c zL~3ILf!OQKX;CC*R&aaO%#;8Z6ev_5Hy78*>1ky}#X)fN){RuJQ$|sIKzRGj*X_Z? zXrd7ga_4O~B9Bi`hhBa8_3M}38iCPrQ`&3JJ4Xbd;v|u`$jMd0FfcIkw6(q2fh;G2 z!t?UF2)IGvwmE+$p{V#Cs8rL`hil=Kf*f2>UOzT8tb?-B(wcgD3aX-V#f#9~!U6&? z{PEv3r;+b8jsOyGR^(@85s{Lb8XFS<*prfuIWWxP@!nPx74?1d=FQ()mWK}?GBN$W z`XFF@Sy^q}-T75+{+gKk%)EUVqWCk`q8b`U3+*92Jv~5?TvoA`R#qH%Z@)#$_gW2* z0a;zGQ`{7)tmFf4AqRefOot6AAeddqu;zpn1A<)fg1`$wPECl=48BP_Qt$RR^fx?3?1}YL@fs2jJfQ>9AB?V63 zF-T*4v3lNO2@kDp5XU<^k!u7ZI5RG(uwkH-!~d?)=zAUzi>(54eMYB;qF?L$N#Tj0 z+kQ~DF&5cQ`WLlA^~f`(Y!sT9hzM%cEl;fQ&b|G8q6_)IJDpT^=+N~zIXQiEfd;-X zHkSB_as4`-f2HLFZRvEC=b1C3dwxLyIanFCZ+m*=%01WD-t{H%L_6z9lk*&Vc)7ZM z1>qsWN={A=ykJDi|BUdB4~3+pB%M@fTBXg47dJ^rpg2dSryrK1d+cg@u%e0-J-fT5 zRn+!-F4gn!)(}f%%Ry2J<9}|1CmBuymdHNX$+3&*cg?7b0~FCx_F@d zSDknDU#hAWNv5Z#0ZDd1&rVKG!bnT7Kiy)Kvo#fJBQ$GX26H(AN!neKly3B0&o_R9Rc{+boRMZ;t zEQ&If%5yi+X8;sn3Pi0jrZE9UdU)AK;u#nfHT3Q#Lyl5vgZ*+3C~**8cLbbcVq$da z-C`dP>+0zVz5GT-86FoMz1Mu5D(Fj4^Y`zY;Hc;|c(|rs#tXH=H9XAu@Zlf0-OJU? za9DWFha_6TPTU~RB|PskF=0RDF8;N$^4ig{NWYOXyh~B|5H|A@@Y%=m^j>bVYRmQGGiN5D!x zy$QG6|7A=c#a`Z^Ffh!sj27z(*mlOo!?!0F{*{Drp67#MFmHSYhHeS za~0e!GX3)6sBwfJ&H&&a00*IabD*Qauhd+RYLp`(eQld zyNj5Pqp@q-M!;?F_1~6yIU0YOS3D${AZERH)&jj+HGX>b| zu{|fMtxYkiMuTi=Ys<>dmo;LAW(%?gnZCWf9UP3sousR*TndU8zjKrLK!?wCooriZS)?&I7Nj`wh0ws*7{i#ixR_X;WNW~Usn4c(Vy{3jRih^L zpxJ5tr)OrMbarT~-@Lh2908y*F=1wIUSrbxVPIh3+cyQE zj$lcFMgbnWzz>dY^0D5%69x)+e2>_VX=oExFH{-&_YA>h6{` z=oha1tod+lMg;jbARsX*Nm@z@Oz1BS4SM?e-XPB|E-rwr5e>(Yp-qb*t)?n(&^W?p zz;=NLyD|Os=2jIT>O(DQKzG^v+!br2P%5jZ)#E571%*F`C5W7{S%$#YdHb)r=e;fm z>uRv|fvxGIfK#xnv=w}y-J})!RWG@elDMB_J(>oJJ2*1(Ok4YGbubfrbD+fFQwRtM z2n!4U9b{;NHZxoAo|};&rW6s|V$UH7iR&-CoX^1zpE;&oC+P-QurbPry67 zi=>4#gVg=jv-qT>>u6{=6x<5N`EYB%tHD%+3n~=+@$BsEgaj>(3G!#po@L?1%pe>G zeUIXQhQ|{81?j$!gH9?YL4lwoz&Lfyq#Kf^c z68e*PSUEXWt0UnNq1xEUaOmhV-(1IA80zYh0WA&^2rK~KJHmhw;41J+S0*NshqSi@ z`wDutUn3E^dMI=(&Fi29uSBo9Vh8QFsY+Nbd!|6MfV0br#$*TzYQQ+l2(#{noJ z(_xFi7yJ+x2Zr^+5Y!3}4^R0nm?9uQ-2e>XZ_tpU4$qFZqKl#0tfwlUNJ?fG6a+sG z+lDlNUjBoorskY0hEVF()|S$p3utwL0Rcjw$Us=E9opQwzhA*}3LYn(K(1T z_x8j*a8FcJ6g*03D9(!)i?FaNUsI?-=!HZ1)wvx6x6Xss z`UQ+1q|{OuL3Bg}K762_-p}djk1;V>MMbwMDJgH>yh%Z!4M3r-T?OY>uX{rS;m3iV zw1~09Spb{Q9X5NE2&)cPa`GLqRoE)Q%ctkJ;rwW8Pi1A@wfDx0>#et)_lt}i1T>r8 zI|S;?s$0`$z*cHci|D$E-X;e<8wES0-R*RL4IU9X5YTeKKr2(zz~NFS3SV&>UjDty zbFZt~4Q!nNgYKWt!%exez>ZDqn>C546B zU+qnxY^uA9agjUVl@ zhS!RVi(R@#CnwEKOduQcH{IF6z3clhQ4o%bC6qa@G+_=nk6Bp~a8?-lo@;Bb{Q9M? zuI}vAvt4fr#u%sx@El6Z%NKTBfMQ%Oh6~?QN_nUpMh%SDB=Q4DwS~KAQ?TW+OxylatTq+0BmFxVc##JOK6DA{`34i^pnG0vE6LiL$b?lvDu3P>@#LQ;2Ue z<^b3Oa%8)^)D6a&Z0b{Ek;T>3`@i((p(N3>c+ei!)YN#$_Pz$@$>A9Q*~8(@WSX>8 z+nt4Wlv_+!u6o=%uoc3f|2)LO!GUg(S;(y5n+!7o8CSCag(1v@mmlszLTP_~dH`-u zM6T%VJ9hwY;G1WnUtYU*4R|v61A;a`AN$hot{@O>_-mxsEh!(nlzN@J6^Z2)7G8Oj z5UlkJ* z6LKZcU_d(AIXU-scjXinonOD+BJM{)C?nGj3T5s#^sn@%nwpplt~tVP_)*K8Z~>D? z+3@-X*juV{OHaO;&K89xFVt7(4L0|gm;i)9S9c@)$@vtlxv z0t+m1-4v{&mSI$6`kz0R1*rI8Qmr&Unwv#Mq!TRx{LfmP0Ubd31n0BPl|oq3HQm>r zBIv$7hjLN>tQP!Kq4ftM07yVhz{7C2prt_67|pf!crl?*l0r5=_ar$UR8navoT>6+ zXY^1C9^BlL)#;uZs`{Ue+Jk|$ff+e> ziSM}*P*Sp0(s(gBJ{}alA-ko5ryU*OOUiVefj4~>2vC>j7H#_Q+A&#F%)B_55IF=1 zB7f9f&YxyV&7z+p0y z_Y}-E_!)>@Q$i7en6IxdnkZ7C6b%gxAML5C>KmJ#6MFEXp{oG4ff5AJwrMyC;CE$i zAoW*vcRvdkzTkCQe+JJ7LILc!<6{>OtVPhQ_mB$^7(7u_OyRZ5NKBmk$mbw)7R#iO z_4*pkK9E+(A^7tZj{m={m*1`Y10F)Nutq@X=knQKbO4QvtO5msOlQ`v zRE{mf7lWQ2R~}bTPykhgrP0)*S$*ErBr?aoCz*N@pP5%lcxJikLSo<02=}&cZ zLYat&i7~TGKx$xOV}sB%x3>OpECe?tWic~w%TF_3hFZPH_X3}(tT^rSX9u9u!1~~V z039Mqh`dfbgnkm%dYss=)47CxHE2d1@;k_aFxc!x*E@8lj75YUD>K#|pG0;?@ z`x18+B;CM58= z?i#}>2P<0VbbDSLD!?~(`O1(8+8ukZ@$6+^qU5LHpFh2hHg%ylc!-E7umUB9jfGck zn180Rp6%?E&Pv8nAe?EsLlYd#MA@;B2;Sz^i&7p#2?jTj%)wL>^;!nSkL;AHdxGT~ zx5`UPl~q-L6NgzKXdE{txlXp2Fo@7Y+KtLIk?G(Rkc3otUtRzkpz{w734w!T_J~|- z4|p-4DknR8y7i?Lk)iiD5LZB*k2YtR%1A%HC%Y_>u|*J)P0^-nG7jFDZU-}cadA=7 z`I)Y67=8ipcyjP8!|w=4We&F8?!LLE0uKZWg_6)PZrD)%+V=zoMu-IU{|D!yC_(Jr zJ&yloT<~sW|4+t+P^TomKg@2asz$fzfx3Rg#YG@CKR*wS8F(IPX$J5V5T3Mb0J`H* z3F(Zx!t5B7)7lJ>H?Xh(u>h${ii(zOd9PeNH@7Q>O-Dy(M|XVfxH@94Zk zR*%$=8d#b7pp>cL-hZtAJy}4*B{ZX?M5&l7(BEG<1RVKF(|$_-0q9kB=-f$9a)+T0 zp|@p&Q*veAnXsaAx{=kP!rYHo=HRdI$xL&6m8?3|%5LD*3MCLc_i1aB&=IAsX9|-# z1C#n6juPtU_{h&#-xziNsa>pBADqj3d9p&q5*Jbe&qBOGN}T|)ts#gM=$#7pqPvaD zHH)AmV0+-5P&c85!h_8_cY%HrCdPa&ju_>bM{(!N>^<`vel<)2Ep_SI+Rxkf5NZ z0~oWRA|+jcYzN$ZkU$_U6BB!k%0P6ycdCLh)x0huty-R9Fm#{`ffWN*?ucPxdO8hD zvXE!Z+qaU^(t%y0{x7m!wj&~*xpzoNO49hlI3!)R{QoZn_|`7_wg`*~`LA|Vt5CWR zel9Nuzy15XE!rPTZVG(~2?>a5laiA96S)9SpCmrYUonz{Ly-B?DArX)UM@qP42aG; zv!X8Gzufazj}m=-Q4&-NN=qYpmltkUAD=H^`wxKO?|vMDKqyo12E|^-qXZ;^d=JtC z7#C80`V@@W$w~6uTcXG^%_4|oUjosF1C*N^7#R3_eO<5GHl4wh3!RW^ftco^adwMP zx5WVSny-|981D^AF{HljR~* z5T{NP6aJSsh8`~FL-c}ItWX3xP1P_k!N;EFaQnXvYKu??eY3NL+}w{E1|iTN=-0VK zQU?K9qmhg9yE3Axt3k{-wgnM@{a2iypDxt0wHSkTHHe{17Jcu@>2@m~G)|~Ig$h_s zPO{LsIfJ37*x0Ku8%$lu7+`5YRKlk2GX68HsECLh!GVQH1*{!_RItLqA^B-fda|*7>-a(i~+ND+6oZZ=bD=LC$SOAcVUhk3_1%K$AKA~GJ1Y~avF*CNrMiMUNELu zL?hs|J_6MR`^7*{KOdt5(L=`It1A`^Q&$JzPXT3t`RI!y@5|RiS+ashH?PJ>?ni;Y zSEThh2QnKFA~cYTdVn$qJ_wRcx$r8EOlc}4^1!NvBXszP) zaZw_bcHq3iMgK~0pF~sO8Ulk4)^4KF+uPCcOJU(}Sca>h*=|uP;dul+C7A{)f|{YG z$BxZ@sS9xT5?Vj>QCJ(87XcB9>g08{!Ly#>42B4dE5@_G*!~2=1dwM!%HZ!14A_3~ zey@HAe&xVNB99LjEtuPSdVFxO%=|||96>)RH;Wn%&2F=ybFHp?+ zAt)WNFg#(}gx6gRjFsol6T!;;x8MI(LKv*Qpx0Vh(Md^6yEu670PNt3?;vG?g!6YpycaDU2o!FqtG2+UY(8ykidsxz8@uYL?&0y-hV&j%yk zJ~p<{V7oy$zTW!DoYMkE>6!Qgw5xAM$mEn5nOIsr6vams_*J&EyWD&H;s1dR#1^sY zMZAAjA^+rwlY_(Xz<{l@^Sv+_Tubg9E`rrdt$DDXgrR0wQH(0GHZ^ z<_bPlRJJi4+<=pvogo_;@C^X}wrmK^K!t&(1Q!;yQ}FD$C>{dwmd4|*3=T}Az%?}T z*y}H^*nM{Pr{h=B$_9dp2Y-}|jqkE7@3;WZYavz#Pl*XI@ea+>@89ydm$M3fFo(#^ zqFt!~!(pc}fbVM^S8O5)*aQ^f$On+e3YDQSN7n^vTe0FkBjfqWN~#L~bo3FXBZa@R zn3x|-9i5VbDO4^cEa~+IlK6yX1DJ@)Pft&WV-B6Y_XG3NFBL}gHNu-Wuc4xXDKk1T zk&u)W681k50~ktYXQ4;7w6-qx#4>?PzF^A>^y{n3P6ot|eD-a3@7@KQ9UOINqENt$ zOiXYDI$=1lqeERo19E%opLGeHi{Qw1EwKUPBTS&R*m}=&HMV4E2$ma7`CGt|;a6W^ zD59XOv=pCaznxTn`|{5DlaIWSor{sgrFOu3MdvQc{4x6&Dt|&$pn%oaWsM>MMK379G0PIx}w0U+*zZT*}8?^R_T+zr3|&V_=X5 z$sN8w;0QE@d?lD7!Q!E{yz8BLn`qx>({3O5x^(!1No)gyVU03-Xcx%z#>2(?e0P*J(cnO~is>;P zh}g&Qtf+ipVG)AQ55KZN<^8w$<>%hsUO;GtO_COHC$Gj7p;v&ED=XUpstslXke})= zTWD+WTLgtrS{WJSFuFuR0q6^RNymn^iD9oia19~ybpJ>7(6?`v5RU@>{f0rp%Mu3u znc3OY#81pTJQ^;eK14~s1w?D0O+hKxjF5W#*CX580ThWw_D>(T3!5M=k8Tmh2)kALUtzjXXA56ZfXj0Hez&-otetc;A7 zfdOS0DMV1;N_cVQOF(f?lNRGBdU$vcZ2-hYMQ%Lih2KV-L;Lk#M=$@&9OnP~4||sg Y=eAoHZk`NIaNh`7NkxfbF$2H<1p%6R&;S4c literal 0 HcmV?d00001 diff --git a/docs/references/api/resource_embedding.rst b/docs/references/api/resource_embedding.rst index 54de4d4600..392655a8d6 100644 --- a/docs/references/api/resource_embedding.rst +++ b/docs/references/api/resource_embedding.rst @@ -983,3 +983,41 @@ Hints also work alongside ``!inner`` if a top level filtering is needed. From th If the relationship is so complex that hint disambiguation does not solve it, you can use :ref:`computed_relationships`. +.. _recursive_m2m_disamb: + +Recursive Many-To-Many Disambiguation +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Use hints plus the :ref:`spread_embed` to disambiguate a recursive many-to-many relationship. Having the following: + +.. image:: ../../_static/users.png + +Note that ``subscriptions`` has more than one foreign key to ``users``. + +To get all the subscribers of a user: + +.. tabs:: + + .. code-tab:: http + + GET /users?select=username,subscribers:subscriptions!subscribed_id(...users!subscriber_id(username))&id=eq.4 HTTP/1.1 + + .. code-tab:: bash Curl + + curl "http://localhost:3000/users?select=username,subscribers:subscriptions!subscribed_id(...users!subscriber_id(username))&id=eq.4" + +.. code-block:: json + + [ + { + "username": "the_top_artist", + "subscribers": [ + { "username": "patrick109" }, + { "username": "alicia_smith" } + ] + } + ] + +.. note:: + + We're working on a better interface for recursive relationships to reduce the request verbosity. From ea7a2bd531ffb11097900c6ec36ae729514e1611 Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Thu, 11 May 2023 00:43:35 -0300 Subject: [PATCH 582/711] add bulk insert defaults --- docs/references/api/tables_views.rst | 50 ++++++++++++++++++++++++++++ docs/releases/v11.0.0.rst | 13 +++++--- 2 files changed, 59 insertions(+), 4 deletions(-) diff --git a/docs/references/api/tables_views.rst b/docs/references/api/tables_views.rst index 837dd82322..989c1f8d8d 100644 --- a/docs/references/api/tables_views.rst +++ b/docs/references/api/tables_views.rst @@ -875,6 +875,56 @@ To bulk insert JSON post an array of objects having all-matching keys ] EOF +.. _bulk_insert_default: + +Bulk Insert with Default Values +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Any missing columns in the payload will be inserted as ``null`` values. To use the ``DEFAULT`` column value instead, use the ``Prefer: missing=default`` header. + +Having: + +.. code-block:: postgres + + create table foo ( + id bigint generated by default as identity primary key + , bar text + , baz int default 100 + ); + +A request: + +.. code-block:: http + + POST /foo?columns=id,bar,baz HTTP/1.1 + Content-Type: application/json + Prefer: return=representation + +.. code-block:: json + + [ + { "bar": "val1" + } + , { "bar": "val2" + , "baz": 15 + } + ] + +Will result in: + +.. code-block:: json + + [ + { "id": 1 + , "bar": "val1" + , "baz": 100 + } + , { "id": 2 + , "bar": "val2" + , "baz": 15 + } + ] + .. _specify_columns: Specifying Columns diff --git a/docs/releases/v11.0.0.rst b/docs/releases/v11.0.0.rst index a2de2b3b9b..b24e61fa44 100644 --- a/docs/releases/v11.0.0.rst +++ b/docs/releases/v11.0.0.rst @@ -4,11 +4,10 @@ Features -------- -Horizontal Filtering -~~~~~~~~~~~~~~~~~~~~ +Inserts +~~~~~~~ -- New ``isdistinct`` :ref:`operator `. It is a direct translation of `IS DINTINCT FROM `_. -- New ``and/all`` :ref:`modifiers`. +- New :ref:`bulk_insert_default`. Resource Embedding ~~~~~~~~~~~~~~~~~~ @@ -18,6 +17,12 @@ Resource Embedding - New :ref:`null_embed`. - New :ref:`empty_embed`. +Horizontal Filtering +~~~~~~~~~~~~~~~~~~~~ + +- New ``isdistinct`` :ref:`operator `. It is a direct translation of `IS DINTINCT FROM `_. +- New ``and/all`` :ref:`modifiers`. + OpenAPI ~~~~~~~ From e0b0e988166d961142d220d1ec54a8d695b76f6c Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Thu, 11 May 2023 00:59:10 -0300 Subject: [PATCH 583/711] add impersonated settings --- docs/references/transactions.rst | 12 ++++++++++++ docs/releases/v11.0.0.rst | 5 +++++ 2 files changed, 17 insertions(+) diff --git a/docs/references/transactions.rst b/docs/references/transactions.rst index 45a17b1cc6..1fc43360d1 100644 --- a/docs/references/transactions.rst +++ b/docs/references/transactions.rst @@ -102,6 +102,18 @@ Because of :ref:`user_impersonation`, PostgREST sets the standard ``role``. You Additionally it also sets the ``search_path`` based on :ref:`db-schemas` and :ref:`db-extra-search-path`. +.. _impersonated_settings: + +Impersonated Role Settings +~~~~~~~~~~~~~~~~~~~~~~~~~~ + +The :ref:`Impersonated Role ` settings are applied. For example, if you do: + +.. code-block:: postgresql + + ALTER ROLE webuser SET statement_timeout TO '5s'; + +Every ``webuser`` request gets its queries executed with a ``statement_timeout`` of 5 seconds. .. _guc_req_headers_cookies_claims: diff --git a/docs/releases/v11.0.0.rst b/docs/releases/v11.0.0.rst index b24e61fa44..bdccd0b0fc 100644 --- a/docs/releases/v11.0.0.rst +++ b/docs/releases/v11.0.0.rst @@ -4,6 +4,11 @@ Features -------- +Transactions +~~~~~~~~~~~~ + +- New :ref:`impersonated_settings`. + Inserts ~~~~~~~ From 789cedff0898d6e6e168680e5e0accc05bdc7080 Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Thu, 11 May 2023 01:17:55 -0300 Subject: [PATCH 584/711] add isolation level --- docs/references/transactions.rst | 77 ++++++++++++++++++++------------ docs/releases/v11.0.0.rst | 1 + 2 files changed, 49 insertions(+), 29 deletions(-) diff --git a/docs/references/transactions.rst b/docs/references/transactions.rst index 1fc43360d1..dc37777256 100644 --- a/docs/references/transactions.rst +++ b/docs/references/transactions.rst @@ -59,10 +59,29 @@ Modifying the database inside READ ONLY transactions is not possible. PostgREST The :ref:`options_requests` method doesn't start a transaction, so it's not relevant here. +.. _isolation_lvl: + Isolation Level --------------- -Every transaction uses the PostgreSQL default isolation level: READ COMMITTED. +Every transaction uses the PostgreSQL default isolation level: READ COMMITTED. Unless you modify `default_transaction_isolation `_ for an impersonated role or function. + +Using :ref:`impersonated_settings`, change the isolation level for all the role's requests with: + +.. code-block:: postgresql + + ALTER ROLE webuser SET default_transaction_isolation TO 'repeatable read'; + +Or to change the isolation level per function call. + +.. code-block:: postgresql + + CREATE OR REPLACE FUNCTION myfunc() + RETURNS text as $$ + SELECT 'hello'; + $$ + LANGUAGE SQL + SET default_transaction_isolation TO 'serializable'; .. _tx_settings: @@ -87,34 +106,6 @@ And you can set them with ``set_config`` SELECT set_config('response.', 'value1' ,true); -Request Role and Search Path -~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -Because of :ref:`user_impersonation`, PostgREST sets the standard ``role``. You can get this in different ways: - -.. code-block:: postgresql - - SELECT current_role; - - SELECT current_user; - - SELECT current_setting('role', true); - -Additionally it also sets the ``search_path`` based on :ref:`db-schemas` and :ref:`db-extra-search-path`. - -.. _impersonated_settings: - -Impersonated Role Settings -~~~~~~~~~~~~~~~~~~~~~~~~~~ - -The :ref:`Impersonated Role ` settings are applied. For example, if you do: - -.. code-block:: postgresql - - ALTER ROLE webuser SET statement_timeout TO '5s'; - -Every ``webuser`` request gets its queries executed with a ``statement_timeout`` of 5 seconds. - .. _guc_req_headers_cookies_claims: Request Headers, Cookies and JWT claims @@ -153,6 +144,34 @@ The path and method are stored as ``text``. SELECT current_setting('request.method', true); +Request Role and Search Path +~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Because of :ref:`user_impersonation`, PostgREST sets the standard ``role``. You can get this in different ways: + +.. code-block:: postgresql + + SELECT current_role; + + SELECT current_user; + + SELECT current_setting('role', true); + +Additionally it also sets the ``search_path`` based on :ref:`db-schemas` and :ref:`db-extra-search-path`. + +.. _impersonated_settings: + +Impersonated Role Settings +~~~~~~~~~~~~~~~~~~~~~~~~~~ + +The :ref:`Impersonated Role ` settings are applied. For example, if you do: + +.. code-block:: postgresql + + ALTER ROLE webuser SET statement_timeout TO '5s'; + +Every ``webuser`` request gets its queries executed with a ``statement_timeout`` of 5 seconds. + .. _guc_resp_hdrs: Response Headers diff --git a/docs/releases/v11.0.0.rst b/docs/releases/v11.0.0.rst index bdccd0b0fc..d8b04ffbb1 100644 --- a/docs/releases/v11.0.0.rst +++ b/docs/releases/v11.0.0.rst @@ -8,6 +8,7 @@ Transactions ~~~~~~~~~~~~ - New :ref:`impersonated_settings`. +- New configurable :ref:`isolation_lvl`. Inserts ~~~~~~~ From ed147ce5c8c9310a4e31832bae2a01f94b867b93 Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Thu, 11 May 2023 01:27:34 -0300 Subject: [PATCH 585/711] add bug fixes simply link to github releases page. bug fixes do not add anything for docs. --- docs/releases/v11.0.0.rst | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/docs/releases/v11.0.0.rst b/docs/releases/v11.0.0.rst index d8b04ffbb1..6093452edb 100644 --- a/docs/releases/v11.0.0.rst +++ b/docs/releases/v11.0.0.rst @@ -7,14 +7,20 @@ Features Transactions ~~~~~~~~~~~~ -- New :ref:`impersonated_settings`. - New configurable :ref:`isolation_lvl`. +- New :ref:`impersonated_settings`. Inserts ~~~~~~~ - New :ref:`bulk_insert_default`. +Horizontal Filtering +~~~~~~~~~~~~~~~~~~~~ + +- New ``isdistinct`` :ref:`operator `. It is a direct translation of `IS DINTINCT FROM `_. +- New ``and/all`` :ref:`modifiers`. + Resource Embedding ~~~~~~~~~~~~~~~~~~ @@ -23,12 +29,6 @@ Resource Embedding - New :ref:`null_embed`. - New :ref:`empty_embed`. -Horizontal Filtering -~~~~~~~~~~~~~~~~~~~~ - -- New ``isdistinct`` :ref:`operator `. It is a direct translation of `IS DINTINCT FROM `_. -- New ``and/all`` :ref:`modifiers`. - OpenAPI ~~~~~~~ @@ -47,11 +47,13 @@ Documentation improvements - New :ref:`connection_pool` reference. - Split :ref:`api` into other sub-references. - Split :ref:`authn` into :ref:`db_authz` and :ref:`sql_user_management`. -- Split :ref:`admin` into :ref:`intgrs` and :ref:`nginx`. +- Split :ref:`admin` into :ref:`intgrs`, :ref:`nginx` and :ref:`connection_pool`. Bug fixes --------- +- Please check the "Fixed" section on https://github.com/PostgREST/postgrest/releases/tag/v11.0.0 and https://github.com/PostgREST/postgrest/releases/tag/v11.0.1. + Breaking changes ---------------- From d7907f4aa425606f8346a3eb92018756a740d0e3 Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Thu, 11 May 2023 01:34:25 -0300 Subject: [PATCH 586/711] pin version to 11.0.1 --- docs/conf.py | 2 +- docs/releases/{v11.0.0.rst => v11.0.1.rst} | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) rename docs/releases/{v11.0.0.rst => v11.0.1.rst} (90%) diff --git a/docs/conf.py b/docs/conf.py index 2e48d664bf..c754b47b57 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -59,7 +59,7 @@ # The short X.Y version. version = u'11.0' # The full version, including alpha/beta/rc tags. -release = u'11.0.0' +release = u'11.0.1' # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. diff --git a/docs/releases/v11.0.0.rst b/docs/releases/v11.0.1.rst similarity index 90% rename from docs/releases/v11.0.0.rst rename to docs/releases/v11.0.1.rst index 6093452edb..6818c5fdb7 100644 --- a/docs/releases/v11.0.0.rst +++ b/docs/releases/v11.0.1.rst @@ -1,6 +1,8 @@ -11.0.0 +11.0.1 ====== +These release notes include the changes in versions `11.0.0 `_ and `11.0.1 `_. The detailed changelog and pre-compiled binaries are available on the `GitHub release pages `_. + Features -------- From 946b1139129c9c3be6a042a606a1d65741a9f85c Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Thu, 11 May 2023 21:14:42 -0300 Subject: [PATCH 587/711] add function inlining --- docs/index.rst | 5 +++ docs/references/api/stored_procedures.rst | 39 +++++++++++++++++++++++ docs/releases/v11.0.1.rst | 5 +++ postgrest.dict | 4 +++ 4 files changed, 53 insertions(+) diff --git a/docs/index.rst b/docs/index.rst index 34890d57dc..35601c1c53 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -82,6 +82,11 @@ Leak-proof Abstraction There is no ORM involved. Creating new views happens in SQL with known performance implications. A database administrator can now create an API from scratch with no custom programming. +Business Logic in Database Functions +------------------------------------ + +There is nothing "business" about keeping data segregated across piles of layers. Use database functions to process data and get the performance benefits of data colocality and reduced network roundtrips. + One Thing Well -------------- diff --git a/docs/references/api/stored_procedures.rst b/docs/references/api/stored_procedures.rst index 3bb971ab3c..fcf42fed5e 100644 --- a/docs/references/api/stored_procedures.rst +++ b/docs/references/api/stored_procedures.rst @@ -340,6 +340,45 @@ A function that returns a table type can be filtered using the same filters as : curl "http://localhost:3000/rpc/best_films_2017?rating=gt.8&order=title.desc" +.. _function_inlining: + +Function Inlining +~~~~~~~~~~~~~~~~~ + +A function that follows the `rules for inlining `_ will also inline :ref:`filters `, :ref:`order ` and :ref:`limits `. + +For example, for the following function: + +.. code-block:: postgres + + create function getallprojects() returns setof projects + language sql stable + as $$ + select * from projects; + $$; + +Let's get its :ref:`explain_plan` when calling it with filters applied: + +.. tabs:: + + .. code-tab:: http + + GET /rpc/getallprojects?id=eq.1 HTTP/1.1 + Accept: application/vnd.pgrst.plan + + .. code-tab:: bash Curl + + curl "http://localhost:3000/rpc/getallprojects?id=eq.1" \ + -H "Accept: application/vnd.pgrst.plan" + +.. code-block:: psql + + Aggregate (cost=8.18..8.20 rows=1 width=112) + -> Index Scan using projects_pkey on projects (cost=0.15..8.17 rows=1 width=40) + Index Cond: (id = 1) + +Notice there's no "Function Scan" node in the plan, which tells us it has been inlined. + .. _scalar_functions: Scalar functions diff --git a/docs/releases/v11.0.1.rst b/docs/releases/v11.0.1.rst index 6818c5fdb7..10257fa855 100644 --- a/docs/releases/v11.0.1.rst +++ b/docs/releases/v11.0.1.rst @@ -17,6 +17,11 @@ Inserts - New :ref:`bulk_insert_default`. +Functions +~~~~~~~~~ + +- Filters on Table-Valued Functions are now guaranteed to be inlined. See :ref:`function_inlining`. + Horizontal Filtering ~~~~~~~~~~~~~~~~~~~~ diff --git a/postgrest.dict b/postgrest.dict index 6803c01be7..92a3b4b87c 100644 --- a/postgrest.dict +++ b/postgrest.dict @@ -19,6 +19,7 @@ Cardano cd centric changelog +colocality ClojureScript cloudfared config @@ -62,6 +63,8 @@ HTTP HTTPS HV Ibarluzea +Inlining +inlined Integrations ilike imatch @@ -147,6 +150,7 @@ refactor Reloadable Remo requester's +roundtrips RESTful RestSharp RLS From 911634ed32d8d694851d0354fd4901ebe2471653 Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Fri, 12 May 2023 01:13:35 -0300 Subject: [PATCH 588/711] move impersonated settings --- docs/references/auth.rst | 13 +++++++++++++ docs/references/transactions.rst | 13 ------------- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/docs/references/auth.rst b/docs/references/auth.rst index 4eb8b93a14..9a53fd9124 100644 --- a/docs/references/auth.rst +++ b/docs/references/auth.rst @@ -188,3 +188,16 @@ doing custom logic based on the web user info. END IF; END $$ LANGUAGE plpgsql; + +.. _impersonated_settings: + +Impersonated Role Settings +-------------------------- + +The :ref:`Impersonated Role ` settings are applied. For example, if you do: + +.. code-block:: postgresql + + ALTER ROLE webuser SET statement_timeout TO '5s'; + +Every ``webuser`` :ref:`transaction ` gets its queries executed with a ``statement_timeout`` of 5 seconds. diff --git a/docs/references/transactions.rst b/docs/references/transactions.rst index dc37777256..6409ce82ce 100644 --- a/docs/references/transactions.rst +++ b/docs/references/transactions.rst @@ -159,19 +159,6 @@ Because of :ref:`user_impersonation`, PostgREST sets the standard ``role``. You Additionally it also sets the ``search_path`` based on :ref:`db-schemas` and :ref:`db-extra-search-path`. -.. _impersonated_settings: - -Impersonated Role Settings -~~~~~~~~~~~~~~~~~~~~~~~~~~ - -The :ref:`Impersonated Role ` settings are applied. For example, if you do: - -.. code-block:: postgresql - - ALTER ROLE webuser SET statement_timeout TO '5s'; - -Every ``webuser`` request gets its queries executed with a ``statement_timeout`` of 5 seconds. - .. _guc_resp_hdrs: Response Headers From ce82b0c79b831c01d8396c3374e1871234b9b2f7 Mon Sep 17 00:00:00 2001 From: Laurence Isla Date: Fri, 12 May 2023 21:27:12 -0500 Subject: [PATCH 589/711] Re-add missing legacy gucs information --- docs/references/transactions.rst | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/docs/references/transactions.rst b/docs/references/transactions.rst index 6409ce82ce..4c8e63ea49 100644 --- a/docs/references/transactions.rst +++ b/docs/references/transactions.rst @@ -131,6 +131,13 @@ PostgREST stores the headers, cookies and headers as JSON. To get them: The ``role`` in ``request.jwt.claims`` defaults to the value of :ref:`db-anon-role`. +.. _guc_legacy_names: + +Legacy settings +^^^^^^^^^^^^^^^ + +For PostgreSQL versions below 14, PostgREST will take into consideration the :ref:`db-use-legacy-gucs` config, which is set to true by default. This means that the interface for accessing these GUCs is `the same as in older versions `_. You can opt in to use the JSON GUCs mentioned above by setting the ``db-use-legacy-gucs`` to false. + .. _guc_req_path_method: Request Path and Method From 05bd033539fbff22734229d40cc8c0202da78c6c Mon Sep 17 00:00:00 2001 From: Laurence Isla Date: Fri, 12 May 2023 21:48:01 -0500 Subject: [PATCH 590/711] Add JavaScript redirect from the old api.html to new pages and sections Uses the hashtag in the url to redirect to the sections where the content was moved to --- docs/references/api.rst | 99 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 99 insertions(+) diff --git a/docs/references/api.rst b/docs/references/api.rst index b83d24b94e..b253f3be86 100644 --- a/docs/references/api.rst +++ b/docs/references/api.rst @@ -16,3 +16,102 @@ PostgREST exposes three database objects of a schema as resources: tables, views api/openapi.rst api/resource_representation.rst api/* + +.. raw:: html + + \ No newline at end of file From 2e6ebca8855fd1eafa0881e29c75ca9fe1b977b1 Mon Sep 17 00:00:00 2001 From: Steve Chavez Date: Thu, 25 May 2023 22:54:23 -0500 Subject: [PATCH 591/711] Fix link to archlinux pkg --- docs/explanations/install.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/explanations/install.rst b/docs/explanations/install.rst index 8d3a6455a5..6944803a80 100644 --- a/docs/explanations/install.rst +++ b/docs/explanations/install.rst @@ -32,7 +32,7 @@ You can also use your OS package manager. .. tab:: Arch Linux - You can install PostgREST from the `community repo `_. + You can install PostgREST from the `community repo `_. .. code:: bash From 281d7a9223bb734a82ed3b88b875b884d2151fb1 Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Fri, 19 May 2023 14:21:56 -0300 Subject: [PATCH 592/711] remove db functions section on index --- docs/index.rst | 5 ----- 1 file changed, 5 deletions(-) diff --git a/docs/index.rst b/docs/index.rst index 35601c1c53..34890d57dc 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -82,11 +82,6 @@ Leak-proof Abstraction There is no ORM involved. Creating new views happens in SQL with known performance implications. A database administrator can now create an API from scratch with no custom programming. -Business Logic in Database Functions ------------------------------------- - -There is nothing "business" about keeping data segregated across piles of layers. Use database functions to process data and get the performance benefits of data colocality and reduced network roundtrips. - One Thing Well -------------- From 5e19594ea488ace95dd42545a0077b7f8f243011 Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Mon, 22 May 2023 16:28:04 -0300 Subject: [PATCH 593/711] auth: explain why jwt is used --- docs/references/auth.rst | 2 +- postgrest.dict | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/references/auth.rst b/docs/references/auth.rst index 9a53fd9124..a25b08be19 100644 --- a/docs/references/auth.rst +++ b/docs/references/auth.rst @@ -42,7 +42,7 @@ This role switching mechanism is called **user impersonation**. In PostgreSQL it JWT-Based User Impersonation ---------------------------- -We use `JSON Web Tokens `_ to authenticate API requests. As you'll recall a JWT contains a list of cryptographically signed claims. All claims are allowed but PostgREST cares specifically about a claim called role. +We use `JSON Web Tokens `_ to authenticate API requests, this allows us to be stateless and not require database lookups for verification. As you'll recall a JWT contains a list of cryptographically signed claims. All claims are allowed but PostgREST cares specifically about a claim called role. .. code:: json diff --git a/postgrest.dict b/postgrest.dict index 92a3b4b87c..9f01bfde94 100644 --- a/postgrest.dict +++ b/postgrest.dict @@ -83,6 +83,7 @@ Kofi Kubernetes localhost login +lookups Logins logins lon From fff0eae77eb2af04c1c1dde4b1bca0a818540555 Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Sat, 27 May 2023 17:43:15 -0500 Subject: [PATCH 594/711] Fix in-db config settings --- docs/references/configuration.rst | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/docs/references/configuration.rst b/docs/references/configuration.rst index 557972a15d..faadd91d9a 100644 --- a/docs/references/configuration.rst +++ b/docs/references/configuration.rst @@ -159,6 +159,7 @@ db-pool-acquisition-timeout Int 10 db-pool-max-lifetime Int 1800 db-pre-request String Y db-prepared-statements Boolean True Y +db-root-spec String Y db-schemas String public Y db-tx-end String commit db-uri String postgresql:// @@ -198,7 +199,7 @@ app.settings.* =============== ==================== **Environment** PGRST_APP_SETTINGS_* - **In-Database** pgrst.app_settings_* + **In-Database** `n/a` =============== ==================== Arbitrary settings that can be used to pass in secret keys directly as strings, or via OS environment variables. For instance: :code:`app.settings.jwt_secret = "$(MYAPP_JWT_SECRET)"` will take :code:`MYAPP_JWT_SECRET` from the environment and make it available to postgresql functions as :code:`current_setting('app.settings.jwt_secret')`. @@ -210,7 +211,7 @@ db-anon-role =============== ================== **Environment** PGRST_DB_ANON_ROLE - **In-Database** `n/a` + **In-Database** `pgrst.db_anon_role` =============== ================== The database role to use when executing commands on behalf of unauthenticated clients. For more information, see :ref:`roles`. From 8d706a342c200463e07260013b11222482e2c86f Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Sat, 27 May 2023 18:15:01 -0500 Subject: [PATCH 595/711] fix broken links --- docs/index.rst | 4 ++-- docs/references/api/stored_procedures.rst | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/index.rst b/docs/index.rst index 34890d57dc..4020d61959 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -197,7 +197,6 @@ Here are some companies that use PostgREST in production. * `Drip Depot `_ * `Image-charts `_ * `Moat `_ -* `MotionDynamic - Fast highly dynamic video generation at scale `_ * `Netwo `_ * `Nimbus `_ - See how Nimbus uses PostgREST in `Paul Copplestone's blog post `_. @@ -206,8 +205,9 @@ Here are some companies that use PostgREST in production. * `Sompani `_ * `Supabase `_ -.. Certs are failing +.. Failing links * `eGull `_ + * `MotionDynamic - Fast highly dynamic video generation at scale `_ Testimonials ------------ diff --git a/docs/references/api/stored_procedures.rst b/docs/references/api/stored_procedures.rst index fcf42fed5e..0597171ebb 100644 --- a/docs/references/api/stored_procedures.rst +++ b/docs/references/api/stored_procedures.rst @@ -3,7 +3,7 @@ Stored Procedures ================= -*"A single resource can be the equivalent of a database stored procedure, with the power to abstract state changes over any number of storage items"* -- `Roy T. Fielding `_ +*"A single resource can be the equivalent of a database stored procedure, with the power to abstract state changes over any number of storage items"* -- `Roy T. Fielding `_ Every stored procedure in the :ref:`exposed schema ` and accessible by the :ref:`active database role ` is executable under the :code:`/rpc` prefix. Procedures can perform any operations allowed by PostgreSQL (read data, modify data, and even DDL operations). From 232c6dc702ba23ca444dca6afbf6f0e3295447bf Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Sat, 27 May 2023 22:00:14 -0500 Subject: [PATCH 596/711] dry config settings Environment variables names and in-db configs on the table. --- docs/references/configuration.rst | 262 +++++------------------------- 1 file changed, 43 insertions(+), 219 deletions(-) diff --git a/docs/references/configuration.rst b/docs/references/configuration.rst index faadd91d9a..0f9ae89111 100644 --- a/docs/references/configuration.rst +++ b/docs/references/configuration.rst @@ -97,21 +97,10 @@ Configuration Reloading It's possible to reload PostgREST's configuration without restarting the server. You can do this :ref:`via signal ` or :ref:`via notification `. -It's not possible to change :ref:`env_variables_config` for a running process and reloading a Docker container configuration will not work. In these cases, you need to restart the PostgREST server or use :ref:`in_db_config` as an alternative. - -.. important:: - - The following settings will not be reloaded. You will need to restart PostgREST to change those. - - * :ref:`admin-server-port` - * :ref:`db-uri` - * :ref:`db-pool` - * :ref:`db-pool-acquisition-timeout` - * :ref:`db-pool-max-lifetime` - * :ref:`server-host` - * :ref:`server-port` - * :ref:`server-unix-socket` - * :ref:`server-unix-socket-mode` +- Any modification to the :ref:`file_config` will be applied during reload. +- Any modification to the :ref:`in_db_config` will be applied during reload. +- Not all settings are reloadable, the reloadable column on :ref:`config_full_list` specifies which ones are. +- It's not possible to change :ref:`env_variables_config` for a running process, hence reloading a Docker container configuration will not work. In these cases, you can restart the process or use :ref:`in_db_config`. .. _config_reloading_signal: @@ -135,73 +124,63 @@ To reload the configuration from within the database, you can use a NOTIFY comma NOTIFY pgrst, 'reload config' -The ``"pgrst"`` notification channel is enabled by default. For configuring the channel, see :ref:`db-channel` and :ref:`db-channel-enabled`. +The ``"pgrst"`` notification channel is enabled by default. You can name the channel with :ref:`db-channel` and enable or disable it with :ref:`db-channel-enabled`. .. _config_full_list: List of parameters ================== -=========================== ======= ================= ========== -Name Type Default Reloadable -=========================== ======= ================= ========== -admin-server-port Int -app.settings.* String Y -db-anon-role String Y -db-channel String pgrst Y -db-channel-enabled Boolean True Y -db-config Boolean True Y -db-extra-search-path String public Y -db-max-rows Int ∞ Y -db-plan-enabled Boolean False Y -db-pool Int 10 -db-pool-acquisition-timeout Int 10 -db-pool-max-lifetime Int 1800 -db-pre-request String Y -db-prepared-statements Boolean True Y -db-root-spec String Y -db-schemas String public Y -db-tx-end String commit -db-uri String postgresql:// -db-use-legacy-gucs Boolean True Y -jwt-aud String Y -jwt-role-claim-key String .role Y -jwt-secret String Y -jwt-secret-is-base64 Boolean False Y -log-level String error Y -openapi-mode String follow-privileges Y -openapi-security-active Boolean False Y -openapi-server-proxy-uri String Y -raw-media-types String Y -server-host String !4 -server-port Int 3000 -server-trace-header String Y -server-unix-socket String -server-unix-socket-mode String 660 -=========================== ======= ================= ========== +=========================== ======= ================= ========== ================================= ============================== +Name Type Default Reloadable Environment variable In-database name +=========================== ======= ================= ========== ================================= ============================== +admin-server-port Int PGRST_ADMIN_SERVER_PORT +app.settings.* String Y PGRST_APP_SETTINGS_* +db-anon-role String Y PGRST_DB_ANON_ROLE pgrst.db_anon_role +db-channel String pgrst Y PGRST_DB_CHANNEL +db-channel-enabled Boolean True Y PGRST_DB_CHANNEL_ENABLED +db-config Boolean True Y PGRST_DB_CONFIG +db-extra-search-path String public Y PGRST_DB_EXTRA_SEARCH_PATH pgrst.db_extra_search_path +db-max-rows Int ∞ Y PGRST_DB_MAX_ROWS pgrst.db_max_rows +db-plan-enabled Boolean False Y PGRST_DB_PLAN_ENABLED pgrst.db_plan_enabled +db-pool Int 10 PGRST_DB_POOL +db-pool-acquisition-timeout Int 10 PGRST_DB_POOL_ACQUISITION_TIMEOUT +db-pool-max-lifetime Int 1800 PGRST_DB_POOL_MAX_LIFETIME +db-pre-request String Y PGRST_DB_PRE_REQUEST pgrst.db_pre_request +db-prepared-statements Boolean True Y PGRST_DB_PREPARED_STATEMENTS pgrst.db_prepared_statements +db-root-spec String Y PGRST_DB_ROOT_SPEC pgrst.db_root_spec +db-schemas String public Y PGRST_DB_SCHEMAS pgrst.db_schemas +db-tx-end String commit PGRST_DB_TX_END +db-uri String postgresql:// PGRST_DB_URI +db-use-legacy-gucs Boolean True Y PGRST_DB_USE_LEGACY_GUCS pgrst.db_use_legacy_gucs +jwt-aud String Y PGRST_JWT_AUD pgrst.jwt_aud +jwt-role-claim-key String .role Y PGRST_JWT_ROLE_CLAIM_KEY pgrst.jwt_role_claim_key +jwt-secret String Y PGRST_JWT_SECRET pgrst.jwt_secret +jwt-secret-is-base64 Boolean False Y PGRST_JWT_SECRET_IS_BASE64 pgrst.jwt_secret_is_base64 +log-level String error PGRST_LOG_LEVEL +openapi-mode String follow-privileges Y PGRST_OPENAPI_MODE pgrst.openapi_mode +openapi-security-active Boolean False Y PGRST_OPENAPI_SECURITY_ACTIVE pgrst.openapi_security_active +openapi-server-proxy-uri String Y PGRST_OPENAPI_SERVER_PROXY_URI pgrst.openapi_server_proxy_uri +raw-media-types String Y PGRST_RAW_MEDIA_TYPES pgrst.raw_media_types +server-host String !4 PGRST_SERVER_HOST +server-port Int 3000 PGRST_SERVER_PORT +server-trace-header String Y PGRST_SERVER_TRACE_HEADER pgrst.server_trace_header +server-unix-socket String PGRST_SERVER_UNIX_SOCKET +server-unix-socket-mode String 660 PGRST_SERVER_UNIX_SOCKET_MODE +=========================== ======= ================= ========== ================================= ============================== .. _admin-server-port: admin-server-port ----------------- - =============== ======================= - **Environment** PGRST_ADMIN_SERVER_PORT - **In-Database** `n/a` - =============== ======================= - -Specifies the port for the :ref:`health_check` endpoints. + Specifies the port for the :ref:`health_check` endpoints. .. _app.settings.*: app.settings.* -------------- - =============== ==================== - **Environment** PGRST_APP_SETTINGS_* - **In-Database** `n/a` - =============== ==================== - Arbitrary settings that can be used to pass in secret keys directly as strings, or via OS environment variables. For instance: :code:`app.settings.jwt_secret = "$(MYAPP_JWT_SECRET)"` will take :code:`MYAPP_JWT_SECRET` from the environment and make it available to postgresql functions as :code:`current_setting('app.settings.jwt_secret')`. .. _db-anon-role: @@ -209,11 +188,6 @@ app.settings.* db-anon-role ------------ - =============== ================== - **Environment** PGRST_DB_ANON_ROLE - **In-Database** `pgrst.db_anon_role` - =============== ================== - The database role to use when executing commands on behalf of unauthenticated clients. For more information, see :ref:`roles`. When unset anonymous access will be blocked. @@ -223,11 +197,6 @@ db-anon-role db-channel ---------- - =============== ================ - **Environment** PGRST_DB_CHANNEL - **In-Database** `n/a` - =============== ================ - The name of the notification channel that PostgREST uses for :ref:`schema_reloading` and configuration reloading. .. _db-channel-enabled: @@ -235,11 +204,6 @@ db-channel db-channel-enabled ------------------ - =============== ======================== - **Environment** PGRST_DB_CHANNEL_ENABLED - **In-Database** `n/a` - =============== ======================== - When this is set to :code:`true`, the notification channel specified in :ref:`db-channel` is enabled. You should set this to ``false`` when using PostgresSQL behind an external connection pooler such as PgBouncer working in transaction pooling mode. See :ref:`this section ` for more information. @@ -249,11 +213,6 @@ db-channel-enabled db-config --------- - =============== =============== - **Environment** PGRST_DB_CONFIG - **In-Database** `n/a` - =============== =============== - Enables the in-database configuration. .. _db-extra-search-path: @@ -261,11 +220,6 @@ db-config db-extra-search-path -------------------- - =============== ========================== - **Environment** PGRST_DB_EXTRA_SEARCH_PATH - **In-Database** pgrst.db_extra_search_path - =============== ========================== - Extra schemas to add to the `search_path `_ of every request. These schemas tables, views and stored procedures **don't get API endpoints**, they can only be referred from the database objects inside your :ref:`db-schemas`. This parameter was meant to make it easier to use **PostgreSQL extensions** (like PostGIS) that are outside of the :ref:`db-schemas`. @@ -279,11 +233,6 @@ db-max-rows *For backwards compatibility, this config parameter is also available without prefix as "max-rows".* - =============== ================= - **Environment** PGRST_DB_MAX_ROWS - **In-Database** pgrst.db_max_rows - =============== ================= - A hard limit to the number of rows PostgREST will fetch from a view, table, or stored procedure. Limits payload size for accidental or malicious requests. .. _db-plan-enabled: @@ -291,11 +240,6 @@ db-max-rows db-plan-enabled --------------- - =============== ===================== - **Environment** PGRST_DB_PLAN_ENABLED - **In-Database** pgrst.db_plan_enabled - =============== ===================== - When this is set to :code:`true`, the execution plan of a request can be retrieved by using the :code:`Accept: application/vnd.pgrst.plan` header. See :ref:`explain_plan`. It's recommended to use this in testing environments only since it reveals internal database details. @@ -327,11 +271,6 @@ db-plan-enabled db-pool ------- - =============== ================= - **Environment** PGRST_DB_POOL - **In-Database** `n/a` - =============== ================= - Number of maximum connections to keep open in PostgREST's database pool. .. _db-pool-acquisition-timeout: @@ -339,11 +278,6 @@ db-pool db-pool-acquisition-timeout --------------------------- - =============== ================= - **Environment** PGRST_DB_POOL_ACQUISITION_TIMEOUT - **In-Database** `n/a` - =============== ================= - Specifies the maximum time in seconds that the request will wait for the pool to free up a connection slot to the database. .. _db-pool-max-lifetime: @@ -351,11 +285,6 @@ db-pool-acquisition-timeout db-pool-max-lifetime -------------------- - =============== ================= - **Environment** PGRST_DB_POOL_MAX_LIFETIME - **In-Database** `n/a` - =============== ================= - Specifies the maximum time in seconds of an existing connection in the pool. .. _db-pre-request: @@ -365,11 +294,6 @@ db-pre-request *For backwards compatibility, this config parameter is also available without prefix as "pre-request".* - =============== ================= - **Environment** PGRST_DB_PRE_REQUEST - **In-Database** pgrst.db_pre_request - =============== ================= - A schema-qualified stored procedure name to call right after the :ref:`tx_settings` are set. See :ref:`pre-request`. .. _db-prepared-statements: @@ -377,11 +301,6 @@ db-pre-request db-prepared-statements ---------------------- - =============== ================= - **Environment** PGRST_DB_PREPARED_STATEMENTS - **In-Database** pgrst.db_prepared_statements - =============== ================= - Enables or disables prepared statements. When disabled, the generated queries will be parameterized (invulnerable to SQL injection) but they will not be prepared (cached in the database session). Not using prepared statements will noticeably decrease performance, so it's recommended to always have this setting enabled. @@ -393,11 +312,6 @@ db-prepared-statements db-root-spec ------------ - =============== ================= - **Environment** PGRST_DB_ROOT_SPEC - **In-Database** pgrst.db_root_spec - =============== ================= - Function to override the OpenAPI response. See :ref:`override_openapi`. .. _db-schemas: @@ -407,11 +321,6 @@ db-schemas *For backwards compatibility, this config parameter is also available in singular as "db-schema".* - =============== ================= - **Environment** PGRST_DB_SCHEMAS - **In-Database** pgrst.db_schemas - =============== ================= - The list of database schemas to expose to clients. See :ref:`schemas`. .. _db-tx-end: @@ -419,11 +328,6 @@ db-schemas db-tx-end --------- - =============== ================= - **Environment** PGRST_DB_TX_END - **In-Database** pgrst.db_tx_end - =============== ================= - Specifies how to terminate the database transactions. .. code:: bash @@ -445,11 +349,6 @@ db-tx-end db-uri ------ - =============== ================= - **Environment** PGRST_DB_URI - **In-Database** `n/a` - =============== ================= - The standard connection PostgreSQL `URI format `_. Symbols and unusual characters in the password or other fields should be percent encoded to avoid a parse error. If enforcing an SSL connection to the database is required you can use `sslmode `_ in the URI, for example ``postgres://user:pass@host:5432/dbname?sslmode=require``. The user with whom PostgREST connects to the database is also known as the ``authenticator`` role. For more information see :ref:`roles`. @@ -463,11 +362,6 @@ db-uri db-use-legacy-gucs ------------------ - =============== ================= - **Environment** PGRST_DB_USE_LEGACY_GUCS - **In-Database** pgrst.db_use_legacy_gucs - =============== ================= - Determine if GUC request settings for headers, cookies and jwt claims use the `legacy names `_ (string with dashes, invalid starting from PostgreSQL v14) with text values instead of the :ref:`new names ` (string without dashes, valid on all PostgreSQL versions) with json values. On PostgreSQL versions 14 and above, this parameter is ignored. @@ -477,11 +371,6 @@ db-use-legacy-gucs jwt-aud ------- - =============== ================= - **Environment** PGRST_JWT_AUD - **In-Database** pgrst.jwt_aud - =============== ================= - Specifies the `JWT audience claim `_. If this claim is present in the client provided JWT then you must set this to the same value as in the JWT, otherwise verifying the JWT will fail. .. _jwt-role-claim-key: @@ -491,11 +380,6 @@ jwt-role-claim-key *For backwards compatibility, this config parameter is also available without prefix as "role-claim-key".* - =============== ================= - **Environment** PGRST_JWT_ROLE_CLAIM_KEY - **In-Database** pgrst.jwt_role_claim_key - =============== ================= - A JSPath DSL that specifies the location of the :code:`role` key in the JWT claims. This can be used to consume a JWT provided by a third party service like Auth0, Okta or Keycloak. Usage examples: .. code:: bash @@ -513,11 +397,6 @@ jwt-role-claim-key jwt-secret ---------- - =============== ================= - **Environment** PGRST_JWT_SECRET - **In-Database** pgrst.jwt_secret - =============== ================= - The secret or `JSON Web Key (JWK) (or set) `_ used to decode JWT tokens clients provide for authentication. For security the key must be **at least 32 characters long**. If this parameter is not specified then PostgREST refuses authentication requests. Choosing a value for this parameter beginning with the at sign such as :code:`@filename` loads the secret out of an external file. This is useful for automating deployments. Note that any binary secrets must be base64 encoded. Both symmetric and asymmetric cryptography are supported. For more info see :ref:`asym_keys`. Choosing a value for this parameter beginning with the at sign such as ``@filename`` (e.g. ``@./configs/my-config``) loads the secret out of an external file. @@ -531,11 +410,6 @@ jwt-secret jwt-secret-is-base64 -------------------- - =============== ================= - **Environment** PGRST_JWT_SECRET_IS_BASE64 - **In-Database** pgrst.jwt_secret_is_base64 - =============== ================= - When this is set to :code:`true`, the value derived from :code:`jwt-secret` will be treated as a base64 encoded secret. .. _log-level: @@ -543,11 +417,6 @@ jwt-secret-is-base64 log-level --------- - =============== ================= - **Environment** PGRST_LOG_LEVEL - **In-Database** `n/a` - =============== ================= - Specifies the level of information to be logged while running PostgREST. .. code:: bash @@ -572,11 +441,6 @@ log-level openapi-mode ------------ - =============== ================= - **Environment** PGRST_OPENAPI_MODE - **In-Database** pgrst.openapi_mode - =============== ================= - Specifies how the OpenAPI output should be displayed. .. code:: bash @@ -598,11 +462,6 @@ openapi-mode openapi-security-active ----------------------- - =============== ============================= - **Environment** PGRST_OPENAPI_SECURITY_ACTIVE - **In-Database** pgrst.openapi_security_active - =============== ============================= - When this is set to :code:`true`, security options are included in the :ref:`OpenAPI output `. .. _openapi-server-proxy-uri: @@ -610,11 +469,6 @@ When this is set to :code:`true`, security options are included in the :ref:`Ope openapi-server-proxy-uri ------------------------ - =============== ================= - **Environment** PGRST_OPENAPI_SERVER_PROXY_URI - **In-Database** pgrst.openapi_server_proxy_uri - =============== ================= - Overrides the base URL used within the OpenAPI self-documentation hosted at the API root path. Use a complete URI syntax :code:`scheme:[//[user:password@]host[:port]][/]path[?query][#fragment]`. Ex. :code:`https://postgrest.com` .. code:: json @@ -638,11 +492,6 @@ openapi-server-proxy-uri raw-media-types --------------- - =============== ================= - **Environment** PGRST_RAW_MEDIA_TYPES - **In-Database** pgrst.raw_media_types - =============== ================= - This serves to extend the `Media Types `_ that PostgREST currently accepts through an ``Accept`` header. These media types can be requested by following the same rules as the ones defined in :ref:`scalar_return_formats`. @@ -659,11 +508,6 @@ raw-media-types server-host ----------- - =============== ================= - **Environment** PGRST_SERVER_HOST - **In-Database** `n/a` - =============== ================= - Where to bind the PostgREST web server. In addition to the usual address options, PostgREST interprets these reserved addresses with special meanings: * :code:`*` - any IPv4 or IPv6 hostname @@ -677,11 +521,6 @@ server-host server-port ----------- - =============== ================= - **Environment** PGRST_SERVER_PORT - **In-Database** `n/a` - =============== ================= - The TCP port to bind the web server. .. _server-trace-header: @@ -689,11 +528,6 @@ server-port server-trace-header ------------------- - =============== ================= - **Environment** PGRST_SERVER_TRACE_HEADER - **In-Database** `pgrst.server_trace_header` - =============== ================= - The header name used to trace HTTP requests. See :ref:`trace_header`. .. _server-unix-socket: @@ -701,11 +535,6 @@ server-trace-header server-unix-socket ------------------ - =============== ================= - **Environment** PGRST_SERVER_UNIX_SOCKET - **In-Database** `n/a` - =============== ================= - `Unix domain socket `_ where to bind the PostgREST web server. If specified, this takes precedence over :ref:`server-port`. Example: @@ -718,11 +547,6 @@ server-unix-socket server-unix-socket-mode ----------------------- - =============== ================= - **Environment** PGRST_SERVER_UNIX_SOCKET_MODE - **In-Database** `n/a` - =============== ================= - `Unix file mode `_ to be set for the socket specified in :ref:`server-unix-socket` Needs to be a valid octal between 600 and 777. From 1c15d3d35bed8a36ebc31522830930fda0a77e6c Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Sat, 27 May 2023 22:35:24 -0500 Subject: [PATCH 597/711] remove note and put it at the start --- docs/references/configuration.rst | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/docs/references/configuration.rst b/docs/references/configuration.rst index 0f9ae89111..440ada5d25 100644 --- a/docs/references/configuration.rst +++ b/docs/references/configuration.rst @@ -3,7 +3,9 @@ Configuration ############# -Without configuration, PostgREST won't be able to serve requests. At the minimum it needs either :ref:`a role to serve anonymous requests with ` - or :ref:`a secret to use for JWT authentication `. Config parameters can be provided via :ref:`file_config`, via :ref:`env_variables_config` or through :ref:`in_db_config`. +Config parameters can be provided via :ref:`file_config`, :ref:`env_variables_config` or :ref:`in_db_config`. Using :ref:`config_reloading` you can modify the parameters without restarting the server. + +Without configuration, PostgREST won't be able to serve requests. At the minimum it needs either :ref:`a role to serve anonymous requests with ` - or :ref:`a secret to use for JWT authentication `. To connect to a database it uses a `libpq connection string `_. The connection string can be set in the configuration file or via environment variable or can be read from an external file. See :ref:`db-uri` for details. Any parameter that is not set in the connection string is read from `libpq environment variables `_. The default connection string is ``postgresql://``, which reads **all** parameters from the environment. @@ -24,10 +26,6 @@ PostgREST can read a config file. There is no predefined location for this file, ./postgrest /path/to/postgrest.conf -.. note:: - - Configuration can be reloaded without restarting the server. See :ref:`config_reloading`. - The configuration file must contain a set of key value pairs: .. code:: From d59e2498be84b18eed47cf98f27a1ce8abc2c253 Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Sun, 28 May 2023 00:01:54 -0500 Subject: [PATCH 598/711] add pre-config function --- docs/references/configuration.rst | 55 +++++++++++++++++-------- docs/releases/unreleased.rst | 68 +++++++++++++++++++++++++++++++ postgrest.dict | 1 + 3 files changed, 108 insertions(+), 16 deletions(-) create mode 100644 docs/releases/unreleased.rst diff --git a/docs/references/configuration.rst b/docs/references/configuration.rst index 440ada5d25..a55b5fef3b 100644 --- a/docs/references/configuration.rst +++ b/docs/references/configuration.rst @@ -57,36 +57,51 @@ Environment Variables You can also set these :ref:`configuration parameters ` using environment variables. They are capitalized, have a ``PGRST_`` prefix, and use underscores. For example: ``PGRST_DB_URI`` corresponds to ``db-uri`` and ``PGRST_APP_SETTINGS_*`` to ``app.settings.*``. +See the full list of environment variable names on :ref:`config_full_list`. + .. _in_db_config: In-Database Configuration ========================= -By adding settings to the **authenticator** role (see :ref:`roles`), you can make the database the single source of truth for PostgREST's configuration. -This is enabled by :ref:`db-config`. +Using a :ref:`pre-config ` function, you can configure the server with database settings. For example, you can configure :ref:`db-schemas` and :ref:`jwt-secret` like this: -For example, you can configure :ref:`db-schemas` and :ref:`jwt-secret` like this: +.. code-block:: -.. code:: postgresql + # postgrest.conf + + db-pre-config = "postgrest.pre_config" + + # or env vars - ALTER ROLE authenticator SET pgrst.db_schemas = "tenant1, tenant2, tenant3" - ALTER ROLE authenticator IN DATABASE SET pgrst.jwt_secret = "REALLYREALLYREALLYREALLYVERYSAFE" + PGRST_DB_PRE_CONFIG = "postgrest.pre_config" -You can use both database-specific settings with `IN DATABASE` and cluster-wide settings without it. Database-specific settings will override cluster-wide settings if both are used for the same parameter. +.. code-block:: postgresql -Note that underscores(``_``) need to be used instead of dashes(``-``) for the in-database config parameters. + -- create a dedicated schema, hidden from the API + create schema postgrest; + -- grant usage on this schema to the authenticator + grant usage on schema postgrest to authenticator; -.. important:: + -- the function can configure postgREST by using set_config + create or replace function postgrest.pre_config() + returns void as $$ + select + set_config('pgrst.db_schemas', 'schema1, schema2', true) + , set_config('pgrst.db_jwt_secret', 'REALLYREALLYREALLYREALLYVERYSAFE', true); + $$ language sql; - For altering a role in this way, you need a SUPERUSER. You might not be able to use this configuration mode on cloud-hosted databases. +Note that underscores(``_``) need to be used instead of dashes(``-``) for the in-database config parameters. See the full list of in-database names on :ref:`config_full_list`. -When using both the configuration file and the in-database configuration, the latter takes precedence. +You can disable the in-database configuration by setting :ref:`db-config` to ``false``. -.. danger:: +.. note:: + For backwards compatibility, you can do in-db config by modifying the :ref:`authenticator role `. This is no longer recommended as it requires SUPERUSER. - If direct connections to the database are allowed, then it's not safe to use the in-db configuration for storing the :ref:`jwt-secret`. - The settings of every role are PUBLIC - they can be viewed by any user that queries the ``pg_catalog.pg_db_role_setting`` table. - In this case you should keep the :ref:`jwt-secret` in the configuration file or as environment variables. + .. code:: postgresql + + ALTER ROLE authenticator SET pgrst.db_schemas = "tenant1, tenant2, tenant3" + ALTER ROLE authenticator IN DATABASE SET pgrst.db_schemas = "tenant4, tenant5" -- database-specific setting, overrides the previous setting .. _config_reloading: @@ -97,7 +112,7 @@ It's possible to reload PostgREST's configuration without restarting the server. - Any modification to the :ref:`file_config` will be applied during reload. - Any modification to the :ref:`in_db_config` will be applied during reload. -- Not all settings are reloadable, the reloadable column on :ref:`config_full_list` specifies which ones are. +- Not all settings are reloadable, see the reloadable list on :ref:`config_full_list`. - It's not possible to change :ref:`env_variables_config` for a running process, hence reloading a Docker container configuration will not work. In these cases, you can restart the process or use :ref:`in_db_config`. .. _config_reloading_signal: @@ -138,6 +153,7 @@ db-anon-role String Y PGRST_DB_ANON_R db-channel String pgrst Y PGRST_DB_CHANNEL db-channel-enabled Boolean True Y PGRST_DB_CHANNEL_ENABLED db-config Boolean True Y PGRST_DB_CONFIG +db-pre-config String Y PGRST_DB_PRE_CONFIG pgrst.db_pre_config db-extra-search-path String public Y PGRST_DB_EXTRA_SEARCH_PATH pgrst.db_extra_search_path db-max-rows Int ∞ Y PGRST_DB_MAX_ROWS pgrst.db_max_rows db-plan-enabled Boolean False Y PGRST_DB_PLAN_ENABLED pgrst.db_plan_enabled @@ -213,6 +229,13 @@ db-config Enables the in-database configuration. +.. _db-pre-config: + +db-pre-config +------------- + + Name of the function that does in-database configuration. + .. _db-extra-search-path: db-extra-search-path diff --git a/docs/releases/unreleased.rst b/docs/releases/unreleased.rst new file mode 100644 index 0000000000..8b88fa9cab --- /dev/null +++ b/docs/releases/unreleased.rst @@ -0,0 +1,68 @@ +Unreleased +========== + +Features +-------- + +Configuration +~~~~~~~~~~~~~ + +- New :ref:`in_db_config`. It no longer requires high privileges and can be used on cloud-hosted databases. + +Documentation improvements +~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Bug fixes +--------- + +Thanks +------ + +Big thanks from the `PostgREST team `_ to our sponsors! + +.. container:: image-container + + .. image:: ../_static/cybertec-new.png + :target: https://www.cybertec-postgresql.com/en/?utm_source=postgrest.org&utm_medium=referral&utm_campaign=postgrest + :width: 13em + + .. image:: ../_static/2ndquadrant.png + :target: https://www.2ndquadrant.com/en/?utm_campaign=External%20Websites&utm_source=PostgREST&utm_medium=Logo + :width: 13em + + .. image:: ../_static/retool.png + :target: https://retool.com/?utm_source=sponsor&utm_campaign=postgrest + :width: 13em + + .. image:: ../_static/gnuhost.png + :target: https://gnuhost.eu/?utm_source=sponsor&utm_campaign=postgrest + :width: 13em + + .. image:: ../_static/supabase.png + :target: https://supabase.com/?utm_source=postgrest%20backers&utm_medium=open%20source%20partner&utm_campaign=postgrest%20backers%20github&utm_term=homepage + :width: 13em + + .. image:: ../_static/oblivious.jpg + :target: https://oblivious.ai/?utm_source=sponsor&utm_campaign=postgrest + :width: 13em + +* `Roboflow `_ +* Evans Fernandes +* Jan Sommer +* `Franz Gusenbauer `_ +* Zac Miller +* Tsingson Qin +* Michel Pelletier +* Jay Hannah +* Robert Stolarz +* Nicholas DiBiase +* Christopher Reid +* Nathan Bouscal +* Daniel Rafaj +* David Fenko +* Remo Rechkemmer +* Severin Ibarluzea +* Tom Saleeba +* Pawel Tyll + +If you like to join them please consider `supporting PostgREST development `_. diff --git a/postgrest.dict b/postgrest.dict index 9f01bfde94..fa04fbd508 100644 --- a/postgrest.dict +++ b/postgrest.dict @@ -148,6 +148,7 @@ Rechkemmer reconnection Redux refactor +reloadable Reloadable Remo requester's From d87d80108ac3adea5706c1344ee650e8c8282de6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 29 May 2023 12:57:34 +0000 Subject: [PATCH 599/711] Bump cachix/install-nix-action from 20 to 21 Bumps [cachix/install-nix-action](https://github.com/cachix/install-nix-action) from 20 to 21. - [Release notes](https://github.com/cachix/install-nix-action/releases) - [Commits](https://github.com/cachix/install-nix-action/compare/v20...v21) --- updated-dependencies: - dependency-name: cachix/install-nix-action dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- .github/workflows/ci.yaml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index c3bc418294..9411dfad9c 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -16,7 +16,7 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - - uses: cachix/install-nix-action@v20 + - uses: cachix/install-nix-action@v21 - run: nix-env -f default.nix -iA build - run: postgrest-docs-build @@ -25,7 +25,7 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - - uses: cachix/install-nix-action@v20 + - uses: cachix/install-nix-action@v21 - run: nix-env -f default.nix -iA spellcheck - run: postgrest-docs-spellcheck @@ -35,7 +35,7 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - - uses: cachix/install-nix-action@v20 + - uses: cachix/install-nix-action@v21 - run: nix-env -f default.nix -iA linkcheck - run: postgrest-docs-linkcheck From 48365188adb8556e3395cb3a3f20e66e42d70169 Mon Sep 17 00:00:00 2001 From: Laurence Isla Date: Wed, 31 May 2023 12:33:08 -0500 Subject: [PATCH 600/711] Add redirect to many-to-many relationships from embedding through join tables --- docs/references/api.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/references/api.rst b/docs/references/api.rst index b253f3be86..2a64797816 100644 --- a/docs/references/api.rst +++ b/docs/references/api.rst @@ -78,6 +78,7 @@ PostgREST exposes three database objects of a schema as resources: tables, views '#embedding-disambiguation': 'api/resource_embedding.html#embedding-disambiguation', '#target-disambiguation': 'api/resource_embedding.html#target-disambiguation', '#hint-disambiguation': 'api/resource_embedding.html#hint-disambiguation', + "#embedding-through-join-tables": "api/resource_embedding.html#many-to-many-relationships", // OpenAPI '#openapi-support': 'api/openapi.html', // Resource Representation From a7ff2294ac8d1bac3fc0d375452b6b935852c80a Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Sat, 3 Jun 2023 00:11:40 -0500 Subject: [PATCH 601/711] references: move raise error to errors page --- docs/references/api/stored_procedures.rst | 2 +- docs/references/errors.rst | 56 ++++++++++++++++++++ docs/references/transactions.rst | 63 ++--------------------- 3 files changed, 61 insertions(+), 60 deletions(-) diff --git a/docs/references/api/stored_procedures.rst b/docs/references/api/stored_procedures.rst index 0597171ebb..842ddf7a2f 100644 --- a/docs/references/api/stored_procedures.rst +++ b/docs/references/api/stored_procedures.rst @@ -5,7 +5,7 @@ Stored Procedures *"A single resource can be the equivalent of a database stored procedure, with the power to abstract state changes over any number of storage items"* -- `Roy T. Fielding `_ -Every stored procedure in the :ref:`exposed schema ` and accessible by the :ref:`active database role ` is executable under the :code:`/rpc` prefix. Procedures can perform any operations allowed by PostgreSQL (read data, modify data, and even DDL operations). +Every stored procedure in the :ref:`exposed schema ` and accessible by the :ref:`active database role ` is executable under the :code:`/rpc` prefix. Procedures can perform any operations allowed by PostgreSQL (read data, modify data, :ref:`raise errors `, and even DDL operations). If they return table types, Stored Procedures can: diff --git a/docs/references/errors.rst b/docs/references/errors.rst index e481a70fd0..0c0a40c72c 100644 --- a/docs/references/errors.rst +++ b/docs/references/errors.rst @@ -96,6 +96,62 @@ PostgREST translates `PostgreSQL error codes `. For instance, here's a saucy function that always responds with an error: + +.. code-block:: postgresql + + CREATE OR REPLACE FUNCTION just_fail() RETURNS void + LANGUAGE plpgsql + AS $$ + BEGIN + RAISE EXCEPTION 'I refuse!' + USING DETAIL = 'Pretty simple', + HINT = 'There is nothing you can do.'; + END + $$; + +Calling the function returns HTTP 400 with the body + +.. code-block:: json + + { + "message":"I refuse!", + "details":"Pretty simple", + "hint":"There is nothing you can do.", + "code":"P0001" + } + +One way to customize the HTTP status code is by raising particular exceptions according to the PostgREST :ref:`error to status code mapping `. For example, :code:`RAISE insufficient_privilege` will respond with HTTP 401/403 as appropriate. + +For even greater control of the HTTP status code, raise an exception of the ``PTxyz`` type. For instance to respond with HTTP 402, raise ``PT402``: + +.. code-block:: sql + + RAISE sqlstate 'PT402' using + message = 'Payment Required', + detail = 'Quota exceeded', + hint = 'Upgrade your plan'; + +Returns: + +.. code-block:: http + + HTTP/1.1 402 Payment Required + Content-Type: application/json; charset=utf-8 + + { + "message": "Payment Required", + "details": "Quota exceeded", + "hint": "Upgrade your plan", + "code": "PT402" + } + + Errors from PostgREST ===================== diff --git a/docs/references/transactions.rst b/docs/references/transactions.rst index 4c8e63ea49..bbf4b93b29 100644 --- a/docs/references/transactions.rst +++ b/docs/references/transactions.rst @@ -23,7 +23,7 @@ The access mode on :ref:`tables_views` is determined by the HTTP method. :header-rows: 1 * - HTTP Method - - Access Method + - Access Mode * - GET, HEAD - READ ONLY * - POST, PATCH, PUT, DELETE @@ -35,7 +35,7 @@ The access mode on :ref:`tables_views` is determined by the HTTP method. :header-rows: 2 * - - - Access Method + - Access Mode - - * - HTTP Method @@ -235,7 +235,7 @@ If the status code is standard, PostgREST will complete the status message(**I'm Main query ---------- -The main query is produced by requesting the :doc:`API resources `. +The main query is produced by requesting :ref:`tables_views` or :ref:`s_procs`. Transaction End --------------- @@ -245,62 +245,7 @@ If the transaction doesn't fail, it will always end in a COMMIT. Unless :ref:`db Aborting transactions --------------------- -Any database failure(like a failed constraint) will result in a rollback of the transaction. You can also do a RAISE inside a function to cause a rollback. - -.. _raise_error: - -Raise errors with HTTP Status Codes -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -You can return non-200 HTTP status codes by raising SQL exceptions. For instance, here's a saucy function that always responds with an error: - -.. code-block:: postgresql - - CREATE OR REPLACE FUNCTION just_fail() RETURNS void - LANGUAGE plpgsql - AS $$ - BEGIN - RAISE EXCEPTION 'I refuse!' - USING DETAIL = 'Pretty simple', - HINT = 'There is nothing you can do.'; - END - $$; - -Calling the function returns HTTP 400 with the body - -.. code-block:: json - - { - "message":"I refuse!", - "details":"Pretty simple", - "hint":"There is nothing you can do.", - "code":"P0001" - } - -One way to customize the HTTP status code is by raising particular exceptions according to the PostgREST :ref:`error to status code mapping `. For example, :code:`RAISE insufficient_privilege` will respond with HTTP 401/403 as appropriate. - -For even greater control of the HTTP status code, raise an exception of the ``PTxyz`` type. For instance to respond with HTTP 402, raise 'PT402': - -.. code-block:: sql - - RAISE sqlstate 'PT402' using - message = 'Payment Required', - detail = 'Quota exceeded', - hint = 'Upgrade your plan'; - -Returns: - -.. code-block:: http - - HTTP/1.1 402 Payment Required - Content-Type: application/json; charset=utf-8 - - { - "message": "Payment Required", - "details": "Quota exceeded", - "hint": "Upgrade your plan", - "code": "PT402" - } +Any database failure(like a failed constraint) will result in a rollback of the transaction. You can also :ref:`RAISE an error inside a function ` to cause a rollback. .. _pre-request: From e7d63a2b27733f6bff5524cc60e78ece56e098cc Mon Sep 17 00:00:00 2001 From: paulocr Date: Mon, 5 Jun 2023 15:02:52 -0600 Subject: [PATCH 602/711] Fix boolean configuration example --- docs/references/configuration.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/references/configuration.rst b/docs/references/configuration.rst index a55b5fef3b..bdd382e9eb 100644 --- a/docs/references/configuration.rst +++ b/docs/references/configuration.rst @@ -43,7 +43,7 @@ The configuration file must contain a set of key value pairs: # The secret to verify the JWT for authenticated requests with. # Needs to be 32 characters minimum. jwt-secret = "reallyreallyreallyreallyverysafe" - jwt-secret-is-base64 = False + jwt-secret-is-base64 = false # Port the postgrest process is listening on for http requests server-port = 80 From c62d24c993dcd286377f35f4aa02c47b8a811c85 Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Wed, 7 Jun 2023 12:12:38 -0500 Subject: [PATCH 603/711] references: add dynamic pool --- docs/references/configuration.rst | 10 ++++++++++ docs/references/connection_pool.rst | 24 +++++++++++++----------- docs/releases/unreleased.rst | 5 +++++ 3 files changed, 28 insertions(+), 11 deletions(-) diff --git a/docs/references/configuration.rst b/docs/references/configuration.rst index bdd382e9eb..9b44ac3ab6 100644 --- a/docs/references/configuration.rst +++ b/docs/references/configuration.rst @@ -158,6 +158,7 @@ db-extra-search-path String public Y PGRST_DB_EXTRA_ db-max-rows Int ∞ Y PGRST_DB_MAX_ROWS pgrst.db_max_rows db-plan-enabled Boolean False Y PGRST_DB_PLAN_ENABLED pgrst.db_plan_enabled db-pool Int 10 PGRST_DB_POOL +db-pool-max-idletime Int 30 PGRST_DB_POOL_MAX_IDLETIME db-pool-acquisition-timeout Int 10 PGRST_DB_POOL_ACQUISITION_TIMEOUT db-pool-max-lifetime Int 1800 PGRST_DB_POOL_MAX_LIFETIME db-pre-request String Y PGRST_DB_PRE_REQUEST pgrst.db_pre_request @@ -294,6 +295,15 @@ db-pool Number of maximum connections to keep open in PostgREST's database pool. +.. _db-pool-max-idletime: + +db-pool-max-idletime +-------------------- + + *For backwards compatibility, this config parameter is also available as “db-pool-timeout”.* + + Time in seconds to close idle pool connections. + .. _db-pool-acquisition-timeout: db-pool-acquisition-timeout diff --git a/docs/references/connection_pool.rst b/docs/references/connection_pool.rst index 48683b90a7..fbccccaa78 100644 --- a/docs/references/connection_pool.rst +++ b/docs/references/connection_pool.rst @@ -9,29 +9,31 @@ A connection pool is a cache of reusable database connections. It allows serving Minimizing connections it’s paramount to performance. Each PostgreSQL connection creates a process, having too many can exhaust available resources. -.. _pool_growth_limit: +.. _dyn_conn_pool: -Growth Limit ------------- +Dynamic Connection Pool +----------------------- -If all the connections are being used, a new connection is added to the pool. The pool can grow until it reaches the :ref:`db-pool` size. +To converve system resources, PostgREST uses a dynamic connection pool. This enables the number of connections in the pool to increase and decrease depending on request traffic. -Note it’s pointless to set this higher than the ``max_connections`` setting in your database. +If all the connections are being used, a new connection is added to the pool. The pool can grow until it reaches the :ref:`db-pool` size. Note it’s pointless to set this higher than the ``max_connections`` setting in your database. + +If a connection is unused for a period of time(determined by :ref:`db-pool-max-idletime`, 30 seconds by default), it will be closed. Connection lifetime ------------------- -After a period of time, connections from the pool will be released and news ones will be created. This time is specified by :ref:`db-pool-max-lifetime`. +Long-lived PostgreSQL connections can consume considerable memory(see `here `_ for more details). +Under a busy system, the :ref:`db-pool-max-idletime` won't be reached and the connection pool can have many long-lived connections. -The lifetime doesn't affect running requests. Only unused connections will be released. +To avoid this problem and save resources, a connection max lifetime(determined by :ref:`db-pool-max-lifetime`, 30 minutes by default) is enforced. -For knowing why a connection lifetime is necessary, see the following discussion: -https://www.postgresql.org/message-id/flat/CA%2Bmi_8bnvpxHZtb6EgHSHY-xn29W8VJMzjPU3fiCOv1bfjrNuA%40mail.gmail.com. +After the max lifetime is reached, connections from the pool will be released and news ones will be created. This doesn't affect running requests. Only unused connections will be released. Acquisition Timeout ------------------- -If all the available connections in the pool are busy, an HTTP request will wait until reaching a timeout. You can configure this timeout with :ref:`db-pool-acquisition-timeout`. +If all the available connections in the pool are busy, an HTTP request will wait until reaching a timeout(determined by :ref:`db-pool-acquisition-timeout`, 10 seconds by default). If the request reaches the timeout, it will be aborted with the following response: @@ -69,7 +71,7 @@ If the pool loses the connection to the database, it will retry reconnecting usi The retries happen immediately after a connection loss, if :ref:`db-channel-enabled` is set to true(the default). Otherwise they'll happen once a request arrives. -The server reloads the :ref:`schema_cache` when recovering. +The server reloads the :ref:`schema_cache` and :ref:`configuration` when recovering. To notify the client of the next retry, the server sends a ``503 Service Unavailable`` status with the ``Retry-After: x`` header. Where ``x`` is the number of seconds programmed for the next retry. diff --git a/docs/releases/unreleased.rst b/docs/releases/unreleased.rst index 8b88fa9cab..48e4ed895c 100644 --- a/docs/releases/unreleased.rst +++ b/docs/releases/unreleased.rst @@ -4,6 +4,11 @@ Unreleased Features -------- +Connection Pool +~~~~~~~~~~~~~~~ + +- New :ref:`db-pool-max-idletime`. It enables a :ref:`dyn_conn_pool`. + Configuration ~~~~~~~~~~~~~ From 188461af7d62ba120806792969605ce261d10865 Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Wed, 7 Jun 2023 12:15:37 -0500 Subject: [PATCH 604/711] references: prepared statements mention --- docs/references/transactions.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/references/transactions.rst b/docs/references/transactions.rst index bbf4b93b29..85f462fa23 100644 --- a/docs/references/transactions.rst +++ b/docs/references/transactions.rst @@ -235,7 +235,7 @@ If the status code is standard, PostgREST will complete the status message(**I'm Main query ---------- -The main query is produced by requesting :ref:`tables_views` or :ref:`s_procs`. +The main query is generated by requesting :ref:`tables_views` or :ref:`s_procs`. All generated queries use prepared statements(:ref:`db-prepared-statements`). Transaction End --------------- From fb59b82c35af874400ff478639d31f9dfca23384 Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Wed, 7 Jun 2023 13:43:23 -0500 Subject: [PATCH 605/711] references: updated automatic recovery * use bullets were possible and join paragraphs. * add bug fixes to the unreleased page --- docs/references/connection_pool.rst | 47 ++++++++++++++--------------- docs/releases/unreleased.rst | 6 ++-- postgrest.dict | 2 ++ 3 files changed, 28 insertions(+), 27 deletions(-) diff --git a/docs/references/connection_pool.rst b/docs/references/connection_pool.rst index fbccccaa78..a196ee689e 100644 --- a/docs/references/connection_pool.rst +++ b/docs/references/connection_pool.rst @@ -3,22 +3,20 @@ Connection Pool =============== -Every request to an :doc:`API resource ` borrows a connection from the connection pool to start a :doc:`transaction `. - -A connection pool is a cache of reusable database connections. It allows serving many HTTP requests using few database connections. +A connection pool is a cache of reusable database connections. It allows serving many HTTP requests using few database connections. Every request to an :doc:`API resource ` borrows a connection from the pool to start a :doc:`transaction `. Minimizing connections it’s paramount to performance. Each PostgreSQL connection creates a process, having too many can exhaust available resources. +.. _pool_growth_limit: .. _dyn_conn_pool: Dynamic Connection Pool ----------------------- -To converve system resources, PostgREST uses a dynamic connection pool. This enables the number of connections in the pool to increase and decrease depending on request traffic. - -If all the connections are being used, a new connection is added to the pool. The pool can grow until it reaches the :ref:`db-pool` size. Note it’s pointless to set this higher than the ``max_connections`` setting in your database. +To conserve system resources, PostgREST uses a dynamic connection pool. This enables the number of connections in the pool to increase and decrease depending on request traffic. -If a connection is unused for a period of time(determined by :ref:`db-pool-max-idletime`, 30 seconds by default), it will be closed. +- If all the connections are being used, a new connection is added. The pool can grow until it reaches the :ref:`db-pool` size. Note it’s pointless to set this higher than the ``max_connections`` setting in your database. +- If a connection is unused for a period of time(determined by :ref:`db-pool-max-idletime`, 30 seconds by default), it will be released. Connection lifetime ------------------- @@ -27,8 +25,7 @@ Long-lived PostgreSQL connections can consume considerable memory(see `here `. + - Reduce write requests. Do :ref:`bulk_insert` (or :ref:`upsert`) instead of inserting rows one by one. + - Reduce read requests. Use :ref:`resource_embedding`. Combine unrelated data into a single request using custom database views or functions. + - Use :ref:`s_procs` for combining read and write logic into a single request. - - Not a panacea since connections can't grow infinitely. Try the previous recommendations before this. + - Increase the :ref:`db-pool` size. + + - Not a panacea since connections can't grow infinitely. Try the previous recommendations before this. .. _automatic_recovery: Automatic Recovery ------------------ -If the pool loses the connection to the database, it will retry reconnecting using exponential backoff. With 32 seconds being the maximum backoff time between retries. - -The retries happen immediately after a connection loss, if :ref:`db-channel-enabled` is set to true(the default). Otherwise they'll happen once a request arrives. - -The server reloads the :ref:`schema_cache` and :ref:`configuration` when recovering. +The server will retry reconnecting to the database if connection loss happens. -To notify the client of the next retry, the server sends a ``503 Service Unavailable`` status with the ``Retry-After: x`` header. Where ``x`` is the number of seconds programmed for the next retry. +- It will retry forever with exponential backoff. 32 seconds being the maximum backoff time between retries. Each of these attempts are :ref:`logged `. +- It will only stop retrying if the server deems the error to be fatal. This can be a password authentication failure or an internal error. +- The retries happen immediately after a connection loss, if :ref:`db-channel-enabled` is set to true(the default). Otherwise they'll happen once a request arrives. +- To ensure a valid state, the server reloads the :ref:`schema_cache` and :ref:`configuration` when recovering. +- To notify the client of the next retry, the server sends a ``503 Service Unavailable`` status with the ``Retry-After: x`` header. Where ``x`` is the number of seconds programmed for the next retry. .. _external_connection_poolers: diff --git a/docs/releases/unreleased.rst b/docs/releases/unreleased.rst index 48e4ed895c..1044e92d84 100644 --- a/docs/releases/unreleased.rst +++ b/docs/releases/unreleased.rst @@ -14,12 +14,12 @@ Configuration - New :ref:`in_db_config`. It no longer requires high privileges and can be used on cloud-hosted databases. -Documentation improvements -~~~~~~~~~~~~~~~~~~~~~~~~~~ - Bug fixes --------- +- Fix dropping schema cache reload notifications. +- Stop automatic recovery when the error is "no password supplied". + Thanks ------ diff --git a/postgrest.dict b/postgrest.dict index fa04fbd508..35bdccaf91 100644 --- a/postgrest.dict +++ b/postgrest.dict @@ -66,6 +66,8 @@ Ibarluzea Inlining inlined Integrations +idletime +IDLETIME ilike imatch io From b1f50537e98a9697e05cd136fca405d56573432f Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Wed, 7 Jun 2023 19:33:42 -0500 Subject: [PATCH 606/711] clarify procs intro --- docs/references/api/stored_procedures.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/references/api/stored_procedures.rst b/docs/references/api/stored_procedures.rst index 842ddf7a2f..45c5e62f05 100644 --- a/docs/references/api/stored_procedures.rst +++ b/docs/references/api/stored_procedures.rst @@ -5,7 +5,7 @@ Stored Procedures *"A single resource can be the equivalent of a database stored procedure, with the power to abstract state changes over any number of storage items"* -- `Roy T. Fielding `_ -Every stored procedure in the :ref:`exposed schema ` and accessible by the :ref:`active database role ` is executable under the :code:`/rpc` prefix. Procedures can perform any operations allowed by PostgreSQL (read data, modify data, :ref:`raise errors `, and even DDL operations). +Procedures can perform any operations allowed by PostgreSQL (read data, modify data, :ref:`raise errors `, and even DDL operations). Every stored procedure in the :ref:`exposed schema ` and accessible by the :ref:`active database role ` is executable under the :code:`/rpc` prefix. If they return table types, Stored Procedures can: From ee6b9c522476be3648d5a488707a329ea1e07003 Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Wed, 7 Jun 2023 18:47:12 -0500 Subject: [PATCH 607/711] pin version to 11.0.1 --- docs/conf.py | 4 ++-- docs/references/api/stored_procedures.rst | 2 +- docs/references/configuration.rst | 16 ++++++++-------- docs/references/connection_pool.rst | 18 +++++++++--------- docs/releases/{unreleased.rst => v11.1.0.rst} | 4 ++-- 5 files changed, 22 insertions(+), 22 deletions(-) rename docs/releases/{unreleased.rst => v11.1.0.rst} (98%) diff --git a/docs/conf.py b/docs/conf.py index c754b47b57..5125f82996 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -57,9 +57,9 @@ # built documents. # # The short X.Y version. -version = u'11.0' +version = u'11.1' # The full version, including alpha/beta/rc tags. -release = u'11.0.1' +release = u'11.1.0' # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. diff --git a/docs/references/api/stored_procedures.rst b/docs/references/api/stored_procedures.rst index 45c5e62f05..e5098864b7 100644 --- a/docs/references/api/stored_procedures.rst +++ b/docs/references/api/stored_procedures.rst @@ -65,7 +65,7 @@ The client can call it by posting an object like Calling with GET ---------------- -If the function doesn't modify the database, it will also run under the GET method(see :ref:`access_mode`). +If the function doesn't modify the database, it will also run under the GET method (see :ref:`access_mode`). .. tabs:: diff --git a/docs/references/configuration.rst b/docs/references/configuration.rst index 9b44ac3ab6..50e71c17d7 100644 --- a/docs/references/configuration.rst +++ b/docs/references/configuration.rst @@ -158,8 +158,8 @@ db-extra-search-path String public Y PGRST_DB_EXTRA_ db-max-rows Int ∞ Y PGRST_DB_MAX_ROWS pgrst.db_max_rows db-plan-enabled Boolean False Y PGRST_DB_PLAN_ENABLED pgrst.db_plan_enabled db-pool Int 10 PGRST_DB_POOL -db-pool-max-idletime Int 30 PGRST_DB_POOL_MAX_IDLETIME db-pool-acquisition-timeout Int 10 PGRST_DB_POOL_ACQUISITION_TIMEOUT +db-pool-max-idletime Int 30 PGRST_DB_POOL_MAX_IDLETIME db-pool-max-lifetime Int 1800 PGRST_DB_POOL_MAX_LIFETIME db-pre-request String Y PGRST_DB_PRE_REQUEST pgrst.db_pre_request db-prepared-statements Boolean True Y PGRST_DB_PREPARED_STATEMENTS pgrst.db_prepared_statements @@ -295,6 +295,13 @@ db-pool Number of maximum connections to keep open in PostgREST's database pool. +.. _db-pool-acquisition-timeout: + +db-pool-acquisition-timeout +--------------------------- + + Specifies the maximum time in seconds that the request will wait for the pool to free up a connection slot to the database. + .. _db-pool-max-idletime: db-pool-max-idletime @@ -304,13 +311,6 @@ db-pool-max-idletime Time in seconds to close idle pool connections. -.. _db-pool-acquisition-timeout: - -db-pool-acquisition-timeout ---------------------------- - - Specifies the maximum time in seconds that the request will wait for the pool to free up a connection slot to the database. - .. _db-pool-max-lifetime: db-pool-max-lifetime diff --git a/docs/references/connection_pool.rst b/docs/references/connection_pool.rst index a196ee689e..c1ff099bd9 100644 --- a/docs/references/connection_pool.rst +++ b/docs/references/connection_pool.rst @@ -13,24 +13,24 @@ Minimizing connections it’s paramount to performance. Each PostgreSQL connecti Dynamic Connection Pool ----------------------- -To conserve system resources, PostgREST uses a dynamic connection pool. This enables the number of connections in the pool to increase and decrease depending on request traffic. +To conserve system resources, PostgREST uses a dynamic connection pool. This enables the number of connections in the pool to increase and decrease depending on request traffic. -- If all the connections are being used, a new connection is added. The pool can grow until it reaches the :ref:`db-pool` size. Note it’s pointless to set this higher than the ``max_connections`` setting in your database. -- If a connection is unused for a period of time(determined by :ref:`db-pool-max-idletime`, 30 seconds by default), it will be released. +- If all the connections are being used, a new connection is added. The pool can grow until it reaches the :ref:`db-pool` size. Note that it’s pointless to set this higher than the ``max_connections`` setting in your database. +- If a connection is unused for a period of time (determined by :ref:`db-pool-max-idletime`, 30 seconds by default), it will be released. Connection lifetime ------------------- -Long-lived PostgreSQL connections can consume considerable memory(see `here `_ for more details). +Long-lived PostgreSQL connections can consume considerable memory (see `here `_ for more details). Under a busy system, the :ref:`db-pool-max-idletime` won't be reached and the connection pool can have many long-lived connections. -To avoid this problem and save resources, a connection max lifetime(determined by :ref:`db-pool-max-lifetime`, 30 minutes by default) is enforced. -After the max lifetime is reached, connections from the pool will be released and news ones will be created. This doesn't affect running requests, only unused connections will be released. +To avoid this problem and save resources, a connection max lifetime (determined by :ref:`db-pool-max-lifetime`, 30 minutes by default) is enforced. +After the max lifetime is reached, connections from the pool will be released and new ones will be created. This doesn't affect running requests, only unused connections will be released. Acquisition Timeout ------------------- -If all the available connections in the pool are busy, an HTTP request will wait until reaching a timeout(determined by :ref:`db-pool-acquisition-timeout`, 10 seconds by default). +If all the available connections in the pool are busy, an HTTP request will wait until reaching a timeout (determined by :ref:`db-pool-acquisition-timeout`, 10 seconds by default). If the request reaches the timeout, it will be aborted with the following response: @@ -68,9 +68,9 @@ Automatic Recovery The server will retry reconnecting to the database if connection loss happens. -- It will retry forever with exponential backoff. 32 seconds being the maximum backoff time between retries. Each of these attempts are :ref:`logged `. +- It will retry forever with exponential backoff, with a maximum backoff time of 32 seconds between retries. Each of these attempts are :ref:`logged `. - It will only stop retrying if the server deems the error to be fatal. This can be a password authentication failure or an internal error. -- The retries happen immediately after a connection loss, if :ref:`db-channel-enabled` is set to true(the default). Otherwise they'll happen once a request arrives. +- The retries happen immediately after a connection loss, if :ref:`db-channel-enabled` is set to true (the default). Otherwise they'll happen once a request arrives. - To ensure a valid state, the server reloads the :ref:`schema_cache` and :ref:`configuration` when recovering. - To notify the client of the next retry, the server sends a ``503 Service Unavailable`` status with the ``Retry-After: x`` header. Where ``x`` is the number of seconds programmed for the next retry. diff --git a/docs/releases/unreleased.rst b/docs/releases/v11.1.0.rst similarity index 98% rename from docs/releases/unreleased.rst rename to docs/releases/v11.1.0.rst index 1044e92d84..55cba22e28 100644 --- a/docs/releases/unreleased.rst +++ b/docs/releases/v11.1.0.rst @@ -1,5 +1,5 @@ -Unreleased -========== +11.1.0 +====== Features -------- From 018427e2b63648a8e1674f85403fe848d1d137d6 Mon Sep 17 00:00:00 2001 From: David Baynard Date: Fri, 9 Jun 2023 21:23:04 +0100 Subject: [PATCH 608/711] Note content-type for singular objects (#639) * Clarify vnd.pgrst.object+json is also Content-Type The previous docs explained how the `Accept` header could be set to `application/vnd.pgrst.object+json`. This change indicates the resulting response `Content-Type` begins likewise. While robust clients will correctly identify that `application/vnd.pgrst.object+json` data are json, many others which naively check the `Content-Type` is `application/json` will fail to recognize what should be a valid `Content-Type`. --- docs/references/api/resource_representation.rst | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/references/api/resource_representation.rst b/docs/references/api/resource_representation.rst index 82f27d96b2..c11d8e8726 100644 --- a/docs/references/api/resource_representation.rst +++ b/docs/references/api/resource_representation.rst @@ -66,6 +66,8 @@ This returns { "id": 1 } +with a :code:`Content-Type: application/vnd.pgrst.object+json`. + When a singular response is requested but no entries are found, the server responds with an error message and 406 Not Acceptable status code rather than the usual empty array and 200 status: .. code-block:: json From 396afa106ee885f6b58e5895252a839c574d54cf Mon Sep 17 00:00:00 2001 From: Laurence Isla Date: Mon, 12 Jun 2023 19:36:06 -0500 Subject: [PATCH 609/711] Remove old or unmaintained links from the ecosystem page --- docs/ecosystem.rst | 42 ++---------------------------------------- postgrest.dict | 1 + 2 files changed, 3 insertions(+), 40 deletions(-) diff --git a/docs/ecosystem.rst b/docs/ecosystem.rst index 7774b3d1f8..11c75a4c9b 100644 --- a/docs/ecosystem.rst +++ b/docs/ecosystem.rst @@ -18,6 +18,8 @@ Community Tutorials * `REST Data Service on YugabyteDB / PostgreSQL `_ +* `Build data-driven applications with Workers and PostgreSQL `_ - A tutorial on how to integrate with PostgREST and PostgreSQL using Cloudfare Workers. + .. _templates: Templates @@ -31,28 +33,10 @@ Templates Example Apps ------------ -* `chronicle `_ - tracking a tree of personal memories -* `code-du-travail-backoffice `_ - data administration portal for the official French Labor Code and Agreements * `delibrium-postgrest `_ - example school API and front-end in Vue.js -* `elm-workshop `_ - building a simple database query UI -* `ember-postgrest-dynamic-ui `_ - generating Ember forms to edit data * `ETH-transactions-storage `_ - indexer for Ethereum to get transaction list by ETH address -* `ext-postgrest-crud `_ - browser-based spreadsheet * `general `_ - example auth back-end -* `goodfilm `_ - example film API * `guild-operators `_ - example queries and functions that the Cardano Community uses for their Guild Operators' Repository -* `handsontable-postgrest `_ - an excel-like database table editor -* `heritage-near-me `_ - Elm and PostgREST with PostGIS -* `ng-admin-postgrest `_ - automatic database admin panel -* `pgrst-dev-setup `_ - docker-compose and tmuxp setup for experimentation. -* `postgres-postgrest-cloudflared-example `_ - docker-compose setup exposing PostgREST using cloudfared -* `postgrest-demo `_ - multi-tenant logging system -* `postgrest-example `_ - sqitch versioning for API -* `postgrest-sessions-example `_ - example for cookie-based sessions -* `postgrest-translation-proxy `_ - calling to external translation service -* `postgrest-ui `_ - ClojureScript UI components for PostgREST -* `postgrest-vercel `_ - run PostgREST on Vercel (Serverless/AWS Lambda) -* `PostgrestSkeleton `_ - Docker Compose, PostgREST, Nginx and Auth0 * `PostGUI `_ - React Material UI admin panel * `prospector `_ - data warehouse and visualization platform @@ -74,14 +58,10 @@ External Notification These are PostgreSQL bridges that propagate LISTEN/NOTIFY to external queues for further processing. This allows stored procedures to initiate actions outside the database such as sending emails. -* `pg-bridge `_ - Amazon SNS -* `pg-kinesis-bridge `_ - Amazon Kinesis * `pg-notify-webhook `_ - trigger webhooks from PostgreSQL's LISTEN/NOTIFY * `pgsql-listen-exchange `_ - RabbitMQ * `postgres-websockets `_ - expose web sockets for PostgreSQL's LISTEN/NOTIFY -* `postgresql-to-amqp `_ - AMQP * `postgresql2websocket `_ - Websockets -* `skeeter `_ - ZeroMQ .. _eco_extensions: @@ -91,25 +71,14 @@ Extensions * `aiodata `_ - Python, event-based proxy and caching client. * `pg-safeupdate `_ - prevent full-table updates or deletes -* `postgrest-auth (criles25) `_ - email based auth/signup * `postgrest-node `_ - Run a PostgREST server in Node.js via npm module -* `postgrest-oauth `_ - OAuth2 WAI middleware -* `postgrest-oauth/api `_ - OAuth2 server * `PostgREST-writeAPI `_ - generate Nginx rewrite rules to fit an OpenAPI spec -* `spas `_ - allow file uploads and basic auth .. _clientside_libraries: Client-Side Libraries --------------------- -* `aor-postgrest-client `_ - JS, admin-on-rest -* `elm-postgrest `_ - Elm -* `general-angular `_ - TypeScript, generate UI from API description -* `jarvus-postgrest-apikit `_ - JS, Sencha framework -* `mithril-postgrest `_ - JS, Mithril -* `ng-postgrest `_ - Angular app for browsing, editing data exposed over PostgREST. -* `postgrest-client `_ - JS * `postgrest-csharp `_ - C# * `postgrest-dart `_ - Dart * `postgrest-ex `_ - Elixir @@ -117,15 +86,8 @@ Client-Side Libraries * `postgrest-js `_ - TypeScript/JavaScript * `postgrest-kt `_ - Kotlin * `postgrest-py `_ - Python -* `postgrest-request `_ - JS, SuperAgent * `postgrest-rs `_ - Rust -* `postgrest-sharp-client `_ (needs maintainer) - C#, RestSharp * `postgrest-swift `_ - Swift -* `postgrest-url `_ - JS, just for generating query URLs -* `postgrest_python_requests_client `_ - Python -* `postgrester `_ - JS + Typescript -* `postgrestR `_ - R -* `py-postgrest `_ - Python * `redux-postgrest `_ - TypeScript/JS, client integrated with (React) Redux. * `vue-postgrest `_ - Vue.js diff --git a/postgrest.dict b/postgrest.dict index 35bdccaf91..fad0d5b6b0 100644 --- a/postgrest.dict +++ b/postgrest.dict @@ -21,6 +21,7 @@ centric changelog colocality ClojureScript +Cloudfare cloudfared config CORS From fdf85773e76705b8fd33e6b287ad1bf441952c9f Mon Sep 17 00:00:00 2001 From: Laurence Isla Date: Wed, 14 Jun 2023 14:25:54 -0500 Subject: [PATCH 610/711] Fix jwt_secret in example --- docs/references/configuration.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/references/configuration.rst b/docs/references/configuration.rst index 50e71c17d7..a0683c774d 100644 --- a/docs/references/configuration.rst +++ b/docs/references/configuration.rst @@ -88,7 +88,7 @@ Using a :ref:`pre-config ` function, you can configure the server returns void as $$ select set_config('pgrst.db_schemas', 'schema1, schema2', true) - , set_config('pgrst.db_jwt_secret', 'REALLYREALLYREALLYREALLYVERYSAFE', true); + , set_config('pgrst.jwt_secret', 'REALLYREALLYREALLYREALLYVERYSAFE', true); $$ language sql; Note that underscores(``_``) need to be used instead of dashes(``-``) for the in-database config parameters. See the full list of in-database names on :ref:`config_full_list`. From 772046242e2b0c359a26f2ff683ed6a901ddfd0c Mon Sep 17 00:00:00 2001 From: Laurence Isla Date: Wed, 14 Jun 2023 14:55:28 -0500 Subject: [PATCH 611/711] Add postgrest-docs-dictcheck to CI --- .github/workflows/ci.yaml | 9 +++++++++ .gitignore | 1 + default.nix | 4 +++- postgrest.dict | 32 -------------------------------- 4 files changed, 13 insertions(+), 33 deletions(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 9411dfad9c..d26de3e700 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -29,6 +29,15 @@ jobs: - run: nix-env -f default.nix -iA spellcheck - run: postgrest-docs-spellcheck + dictcheck: + name: Run dictcheck + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - uses: cachix/install-nix-action@v21 + - run: nix-env -f default.nix -iA dictcheck + - run: postgrest-docs-dictcheck + linkcheck: name: Run linkcheck if: github.base_ref == 'main' diff --git a/.gitignore b/.gitignore index 4c1f956008..ccba409df5 100644 --- a/.gitignore +++ b/.gitignore @@ -4,3 +4,4 @@ Pipfile.lock *.log diagrams/db.pdf misspellings +unuseddict diff --git a/default.nix b/default.nix index 5dffe887ac..42fbaca769 100644 --- a/default.nix +++ b/default.nix @@ -73,7 +73,9 @@ in | tail -n+2 \ | tr '\n' '\0' \ | xargs -0 -n 1 -i \ - sh -c "grep \"{}\" $FILES > /dev/null || echo \"{}\"" + sh -c "grep \"{}\" $FILES > /dev/null || echo \"{}\"" \ + | tee unuseddict + test ! -s unuseddict ''; linkcheck = diff --git a/postgrest.dict b/postgrest.dict index fad0d5b6b0..52956e941c 100644 --- a/postgrest.dict +++ b/postgrest.dict @@ -1,6 +1,4 @@ personal_ws-1.1 en 0 utf-8 -Adossi -AMQP api API's Archlinux @@ -10,7 +8,6 @@ auth authenticator backoff balancer -Beles booleans Bouscal buildpack @@ -19,21 +16,16 @@ Cardano cd centric changelog -colocality -ClojureScript Cloudfare -cloudfared config CORS CPUs cryptographically CSV -Daemonizing DDL DevOps DiBiase dockerize -DoS eq ETH Ethereum @@ -54,7 +46,6 @@ Greenplum gte GUC gucs -Gumbs Haskell Heroku HMAC @@ -80,9 +71,6 @@ JSON JWK JWT jwt -JWTs -Kinesis -Kofi Kubernetes localhost login @@ -92,23 +80,18 @@ logins lon lt lte -middleware misprediction -Mithril multi -MVCC namespace namespaced Nanos neq nginx -ngrep nixpkgs npm nxl nxr OAuth -onwards OpenAPI openapi ORM @@ -117,7 +100,6 @@ passphrase Pawel PBKDF Pelletier -Petr PgBouncer pgcrypto pgjwt @@ -148,16 +130,13 @@ Rafaj RDS reallyreallyreallyreallyverysafe Rechkemmer -reconnection Redux refactor reloadable Reloadable Remo requester's -roundtrips RESTful -RestSharp RLS RPC RSA @@ -166,16 +145,12 @@ safeupdate savepoint schemas schema's -Sencha -Serverless Severin SHA Sommer signup SIGUSR sl -SNS -sqitch SQL sql sr @@ -183,14 +158,10 @@ SSL stateful stdout Stolarz -subselect -SuperAgent SvelteKit SwaggerUI syslog systemd -Tcl -tmuxp todo todos tos @@ -212,16 +183,13 @@ uri url urls variadic -Vercel verifier versioning Vondra Vue -WAI webhooks websearch Websockets webuser wfts Zac -ZeroMQ From ab986b77d8379968cced0720abaa8b1be044a20c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 19 Jun 2023 10:22:57 -0500 Subject: [PATCH 612/711] Bump cachix/install-nix-action from 21 to 22 (#648) --- .github/workflows/ci.yaml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index d26de3e700..782b3eceb3 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -16,7 +16,7 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - - uses: cachix/install-nix-action@v21 + - uses: cachix/install-nix-action@v22 - run: nix-env -f default.nix -iA build - run: postgrest-docs-build @@ -25,7 +25,7 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - - uses: cachix/install-nix-action@v21 + - uses: cachix/install-nix-action@v22 - run: nix-env -f default.nix -iA spellcheck - run: postgrest-docs-spellcheck @@ -34,7 +34,7 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - - uses: cachix/install-nix-action@v21 + - uses: cachix/install-nix-action@v22 - run: nix-env -f default.nix -iA dictcheck - run: postgrest-docs-dictcheck @@ -44,7 +44,7 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - - uses: cachix/install-nix-action@v21 + - uses: cachix/install-nix-action@v22 - run: nix-env -f default.nix -iA linkcheck - run: postgrest-docs-linkcheck From 9780790cee18866f41795ab17ec2adaa016b4303 Mon Sep 17 00:00:00 2001 From: Joonas Date: Wed, 21 Jun 2023 12:09:11 +0300 Subject: [PATCH 613/711] Change example getallfilms to stable instead of immutable --- docs/references/api/resource_embedding.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/references/api/resource_embedding.rst b/docs/references/api/resource_embedding.rst index 392655a8d6..1507fd8417 100644 --- a/docs/references/api/resource_embedding.rst +++ b/docs/references/api/resource_embedding.rst @@ -742,7 +742,7 @@ Here's a sample function (notice the ``RETURNS SETOF films``). CREATE FUNCTION getallfilms() RETURNS SETOF films AS $$ SELECT * FROM films; - $$ LANGUAGE SQL IMMUTABLE; + $$ LANGUAGE SQL STABLE; A request with ``directors`` embedded: From 14de9f1dfd1d3dc974f96d2086727ab1893ccadd Mon Sep 17 00:00:00 2001 From: Steve Chavez Date: Thu, 22 Jun 2023 09:14:23 -0500 Subject: [PATCH 614/711] references: add computed fields page (#650) --- docs/references/api.rst | 7 +- docs/references/api/computed_fields.rst | 86 ++++++++++++++++++++++++ docs/references/api/tables_views.rst | 89 +++++++++---------------- 3 files changed, 122 insertions(+), 60 deletions(-) create mode 100644 docs/references/api/computed_fields.rst diff --git a/docs/references/api.rst b/docs/references/api.rst index 2a64797816..c156ffa672 100644 --- a/docs/references/api.rst +++ b/docs/references/api.rst @@ -12,9 +12,10 @@ PostgREST exposes three database objects of a schema as resources: tables, views api/tables_views.rst api/stored_procedures.rst api/schemas.rst + api/computed_fields.rst api/resource_embedding.rst - api/openapi.rst api/resource_representation.rst + api/openapi.rst api/* .. raw:: html @@ -34,7 +35,7 @@ PostgREST exposes three database objects of a schema as resources: tables, views '#casting-columns': 'api/tables_views.html#casting-columns', '#json-columns': 'api/tables_views.html#json-columns', '#composite-array-columns': 'api/tables_views.html#composite-array-columns', - '#computed-virtual-columns': 'api/tables_views.html#computed-virtual-columns', + '#computed-virtual-columns': 'api/computed_fields.html#computed-fields', '#ordering': 'api/tables_views.html#ordering', '#limits-and-pagination': 'api/tables_views.html#limits-and-pagination', '#exact-count': 'api/tables_views.html#exact-count', @@ -115,4 +116,4 @@ PostgREST exposes three database objects of a schema as resources: tables, views if (willRedirectTo) { window.location.href = willRedirectTo; } - \ No newline at end of file + diff --git a/docs/references/api/computed_fields.rst b/docs/references/api/computed_fields.rst new file mode 100644 index 0000000000..194a48f3c3 --- /dev/null +++ b/docs/references/api/computed_fields.rst @@ -0,0 +1,86 @@ +.. _computed_cols: + +Computed Fields +############### + +Computed fields are virtual columns that are not stored in a table. PostgreSQL makes it possible to implement them using functions on table types. + +.. code-block:: postgres + + CREATE TABLE people ( + first_name text + , last_name text + , job text + ); + + -- a computed field that combines data from two columns + CREATE FUNCTION full_name(people) + RETURNS text AS $$ + SELECT $1.first_name || ' ' || $1.last_name; + $$ LANGUAGE SQL; + +:ref:`h_filter` can be applied to computed fields. For example, we can do a :ref:`fts` on :code:`full_name`: + +.. code-block:: postgres + + -- (optional) you can add an index on the computed field to speed up the query + CREATE INDEX people_full_name_idx ON people + USING GIN (to_tsvector('english', full_name(people))); + +.. tabs:: + + .. code-tab:: http + + GET /people?full_name=fts.Beckett HTTP/1.1 + + .. code-tab:: bash Curl + + curl "http://localhost:3000/people?full_name=fts.Beckett" + +.. code-block:: json + + [ + {"first_name": "Samuel", "last_name": "Beckett", "job": "novelist"} + ] + + +Computed fields won't appear on the response by default but you can use :ref:`v_filter` to include them: + +.. tabs:: + + .. code-tab:: http + + GET /people?select=full_name,job HTTP/1.1 + + .. code-tab:: bash Curl + + curl "http://localhost:3000/people?select=full_name,job" + +.. code-block:: json + + [ + {"full_name": "Samuel Beckett", "job": "novelist"} + ] + + +:ref:`ordering` on computed fields is also possible: + +.. tabs:: + + .. code-tab:: http + + GET /people?order=full_name.desc HTTP/1.1 + + .. code-tab:: bash Curl + + curl "http://localhost:3000/people?order=full_name.desc" + +.. important:: + + Computed columns must be created in the :ref:`exposed schema ` or in a schema in the :ref:`extra search path ` to be used in this way. When placing the computed column in the :ref:`exposed schema ` you can use an **unnamed** parameter, as in the example above, to prevent it from being exposed as an :ref:`RPC ` under ``/rpc``. + +.. note:: + + - PostgreSQL 12 introduced `generated columns `_, which can also compute a value based on other columns. However they're stored, not virtual. + - "computed fields" are documented on https://www.postgresql.org/docs/current/rowtypes.html#ROWTYPES-USAGE (search for "computed fields") + - On previous PostgREST versions this feature was documented with the name of "computed columns". diff --git a/docs/references/api/tables_views.rst b/docs/references/api/tables_views.rst index 989c1f8d8d..fa796c8132 100644 --- a/docs/references/api/tables_views.rst +++ b/docs/references/api/tables_views.rst @@ -31,8 +31,8 @@ There are no deeply/nested/routes. Each route provides OPTIONS, GET, HEAD, POST, .. _h_filter: -Horizontal Filtering (Rows) ---------------------------- +Horizontal Filtering +-------------------- You can filter result rows by adding conditions on columns. For instance, to return people aged under 13 years old: @@ -249,10 +249,10 @@ Using `websearch_to_tsquery` requires PostgreSQL of version at least 11.0 and wi .. _v_filter: -Vertical Filtering (Columns) ----------------------------- +Vertical Filtering +------------------ -When certain columns are wide (such as those holding binary data), it is more efficient for the server to withhold them in a response. The client can specify which columns are required using the sql:`select` parameter. +When certain columns are wide (such as those holding binary data), it is more efficient for the server to withhold them in a response. The client can specify which columns are required using the :code:`select` parameter. .. tabs:: @@ -455,57 +455,6 @@ The arrow operators(``->``, ``->>``) can also be used for accessing composite fi CREATE INDEX ON mytable ((to_jsonb(data) -> 'identification' ->> 'registration_number')); -.. _computed_cols: - -Computed / Virtual Columns --------------------------- - -Filters may be applied to computed columns(**a.k.a. virtual columns**) as well as actual table/view columns, even though the computed columns will not appear in the output. For example, to search first and last names at once we can create a computed column that will not appear in the output but can be used in a filter: - -.. code-block:: postgres - - CREATE TABLE people ( - fname text, - lname text - ); - - CREATE FUNCTION full_name(people) RETURNS text AS $$ - SELECT $1.fname || ' ' || $1.lname; - $$ LANGUAGE SQL; - - -- (optional) add an index to speed up anticipated query - CREATE INDEX people_full_name_idx ON people - USING GIN (to_tsvector('english', full_name(people))); - -A full-text search on the computed column: - -.. tabs:: - - .. code-tab:: http - - GET /people?full_name=fts.Beckett HTTP/1.1 - - .. code-tab:: bash Curl - - curl "http://localhost:3000/people?full_name=fts.Beckett" - -As mentioned, computed columns do not appear in the output by default. However you can include them by listing them in the vertical filtering :code:`select` parameter: - -.. tabs:: - - .. code-tab:: http - - GET /people?select=*,full_name HTTP/1.1 - - .. code-tab:: bash Curl - - curl "http://localhost:3000/people?select=*,full_name" - -.. important:: - - Computed columns must be created in the :ref:`exposed schema ` or in a schema in the :ref:`extra search path ` to be used in this way. When placing the computed column in the :ref:`exposed schema ` you can use an **unnamed** argument, as in the example above, to prevent it from being exposed as an :ref:`RPC ` under ``/rpc``. - - .. _ordering: Ordering @@ -557,7 +506,17 @@ If you care where nulls are sorted, add ``nullsfirst`` or ``nullslast``: curl "http://localhost:3000/people?order=age.desc.nullslast" -You can also use :ref:`computed_cols` to order the results, even though the computed columns will not appear in the output. You can sort by nested fields of :ref:`json_columns` with the JSON operators. +You can also sort on fields of :ref:`composite_array_columns` or :ref:`json_columns`. + +.. tabs:: + + .. code-tab:: http + + GET /countries?order=location->>lat HTTP/1.1 + + .. code-tab:: bash Curl + + curl "http://localhost:3000/countries?order=location->>lat" .. _limits: @@ -1142,3 +1101,19 @@ Using ``offset`` to target a different subset of rows is also possible. There is no native ``UPDATE...LIMIT`` or ``DELETE...LIMIT`` support in PostgreSQL; the generated query simulates that behavior and is based on `this Crunchy Data blog post `_. +.. raw:: html + + From 991b151b6907d3c02680e12d2bb250d285d7d7b8 Mon Sep 17 00:00:00 2001 From: Steve Chavez Date: Thu, 22 Jun 2023 14:44:26 -0500 Subject: [PATCH 615/711] improve connection pool wording --- docs/references/connection_pool.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/references/connection_pool.rst b/docs/references/connection_pool.rst index c1ff099bd9..7464f90722 100644 --- a/docs/references/connection_pool.rst +++ b/docs/references/connection_pool.rst @@ -22,7 +22,7 @@ Connection lifetime ------------------- Long-lived PostgreSQL connections can consume considerable memory (see `here `_ for more details). -Under a busy system, the :ref:`db-pool-max-idletime` won't be reached and the connection pool can have many long-lived connections. +Under a busy system, the :ref:`db-pool-max-idletime` won't be reached and the connection pool can be full of long-lived connections. To avoid this problem and save resources, a connection max lifetime (determined by :ref:`db-pool-max-lifetime`, 30 minutes by default) is enforced. After the max lifetime is reached, connections from the pool will be released and new ones will be created. This doesn't affect running requests, only unused connections will be released. From 06a389810703034bc34f72f828cc9665dd376b8a Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Mon, 26 Jun 2023 17:30:28 -0500 Subject: [PATCH 616/711] nix: add HISTFILE --- .gitignore | 1 + shell.nix | 4 ++++ 2 files changed, 5 insertions(+) diff --git a/.gitignore b/.gitignore index ccba409df5..bab47b52ea 100644 --- a/.gitignore +++ b/.gitignore @@ -5,3 +5,4 @@ Pipfile.lock diagrams/db.pdf misspellings unuseddict +.history diff --git a/shell.nix b/shell.nix index 4800d62ec1..e8d38d96ee 100644 --- a/shell.nix +++ b/shell.nix @@ -15,4 +15,8 @@ pkgs.mkShell { docs.dictcheck docs.linkcheck ]; + + shellHook = '' + export HISTFILE=.history + ''; } From d59f841d15993c5f865737e427625ad54e7c398c Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Mon, 26 Jun 2023 17:47:01 -0500 Subject: [PATCH 617/711] add request body handling --- .../api/resource_representation.rst | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/docs/references/api/resource_representation.rst b/docs/references/api/resource_representation.rst index c11d8e8726..8a1f805291 100644 --- a/docs/references/api/resource_representation.rst +++ b/docs/references/api/resource_representation.rst @@ -150,3 +150,24 @@ Example 3: If the stored procedure returns non-scalar values, you need to do a : .. note:: If more than one row would be returned the binary/plain-text/xml results will be concatenated with no delimiter. + +.. _req_body: + +Request Body +============ + +The server handles the following request body media types: + +* ``application/json`` +* ``application/x-www-form-urlencoded`` +* ``text/csv`` + +For :ref:`tables_views` this works on ``POST``, ``PATCH`` and ``PUT`` methods. For :ref:`s_procs`, it works on ``POST`` methods. + +For stored procedures there are three additional types: + +* ``application/octet-stream`` +* ``text/plain`` +* ``text/xml`` + +See :ref:`s_proc_single_unnamed`. From 3a41d55be6b36a16955c497492192ee7fbd30a7d Mon Sep 17 00:00:00 2001 From: Steve Chavez Date: Tue, 27 Jun 2023 15:26:53 -0500 Subject: [PATCH 618/711] Fix inserting with defaults --- docs/references/api/tables_views.rst | 39 +++++++++++++++++++--------- 1 file changed, 27 insertions(+), 12 deletions(-) diff --git a/docs/references/api/tables_views.rst b/docs/references/api/tables_views.rst index fa796c8132..5a8ca92e61 100644 --- a/docs/references/api/tables_views.rst +++ b/docs/references/api/tables_views.rst @@ -853,21 +853,36 @@ Having: A request: -.. code-block:: http +.. tabs:: - POST /foo?columns=id,bar,baz HTTP/1.1 - Content-Type: application/json - Prefer: return=representation + .. code-tab:: http -.. code-block:: json + POST /foo?columns=id,bar,baz HTTP/1.1 + Content-Type: application/json + Prefer: missing=default, return=representation - [ - { "bar": "val1" - } - , { "bar": "val2" - , "baz": 15 - } - ] + [ + { "bar": "val1" + } + , { "bar": "val2" + , "baz": 15 + } + ] + + .. code-tab:: bash Curl + + curl "http://localhost:3000/foo?columns=id,bar,baz" \ + -H "Content-Type: application/json" \ + -H "Prefer: missing=default, return=representation" \ + -d @- << EOF + [ + { "bar": "val1" + } + , { "bar": "val2" + , "baz": 15 + } + ] + EOF Will result in: From 1a9e105227f4e724814d57b4fe2f98c9dd803d6b Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Wed, 28 Jun 2023 12:12:27 -0500 Subject: [PATCH 619/711] add headings to computed fields --- docs/references/api/computed_fields.rst | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/docs/references/api/computed_fields.rst b/docs/references/api/computed_fields.rst index 194a48f3c3..5379d51d5e 100644 --- a/docs/references/api/computed_fields.rst +++ b/docs/references/api/computed_fields.rst @@ -19,6 +19,9 @@ Computed fields are virtual columns that are not stored in a table. PostgreSQL m SELECT $1.first_name || ' ' || $1.last_name; $$ LANGUAGE SQL; +Horizontal Filtering on Computed Fields +======================================= + :ref:`h_filter` can be applied to computed fields. For example, we can do a :ref:`fts` on :code:`full_name`: .. code-block:: postgres @@ -43,6 +46,8 @@ Computed fields are virtual columns that are not stored in a table. PostgreSQL m {"first_name": "Samuel", "last_name": "Beckett", "job": "novelist"} ] +Vertical Filtering on Computed Fields +===================================== Computed fields won't appear on the response by default but you can use :ref:`v_filter` to include them: @@ -62,6 +67,8 @@ Computed fields won't appear on the response by default but you can use :ref:`v_ {"full_name": "Samuel Beckett", "job": "novelist"} ] +Ordering on Computed Fields +=========================== :ref:`ordering` on computed fields is also possible: From ab8ccf43a62151225d3d3d496743a75d0cfcc851 Mon Sep 17 00:00:00 2001 From: Steve Chavez Date: Sun, 2 Jul 2023 14:51:47 -0500 Subject: [PATCH 620/711] add domain representations (#655) * add domain representations * Update docs/references/api/domain_representations.rst Co-authored-by: Alexander Ljungberg * Update docs/references/api/domain_representations.rst Co-authored-by: Alexander Ljungberg * Update docs/references/api/domain_representations.rst Co-authored-by: Alexander Ljungberg * Update docs/references/api/domain_representations.rst Co-authored-by: Alexander Ljungberg * Update docs/references/api/domain_representations.rst Co-authored-by: Alexander Ljungberg * Update docs/references/api/domain_representations.rst Co-authored-by: Alexander Ljungberg * add custom domain subheading and TOC this way it can be seen at the beggining there are advantages over views and computed fields. * important note for scache reloading * clarify advantages * why not create a type? --------- Co-authored-by: Alexander Ljungberg --- docs/references/api.rst | 1 + .../references/api/domain_representations.rst | 200 ++++++++++++++++++ postgrest.dict | 1 + 3 files changed, 202 insertions(+) create mode 100644 docs/references/api/domain_representations.rst diff --git a/docs/references/api.rst b/docs/references/api.rst index c156ffa672..0796ba1afc 100644 --- a/docs/references/api.rst +++ b/docs/references/api.rst @@ -13,6 +13,7 @@ PostgREST exposes three database objects of a schema as resources: tables, views api/stored_procedures.rst api/schemas.rst api/computed_fields.rst + api/domain_representations.rst api/resource_embedding.rst api/resource_representation.rst api/openapi.rst diff --git a/docs/references/api/domain_representations.rst b/docs/references/api/domain_representations.rst new file mode 100644 index 0000000000..f303f6cf6c --- /dev/null +++ b/docs/references/api/domain_representations.rst @@ -0,0 +1,200 @@ +.. _domain_reps: + +Domain Representations +###################### + +Domain Representations separates "how the data is presented" from "how the data is stored". It works by creating `domains `_ and `casts `_, the latter act on the former to present and receive the data in different formats. + +.. contents:: + :depth: 1 + :local: + :backlinks: none + +Custom Domain +============= + +Suppose you want to use a ``uuid`` type for a primary key and want to present it shortened to web users. + +For this, let's create a domain based on ``uuid``. + +.. code-block:: postgres + + create domain app_uuid as uuid; + + -- and use it as our table PK. + create table profiles( + id app_uuid + , name text + ); + + -- some data for the example + insert into profiles values ('846c4ffd-92ce-4de7-8d11-8e29929f4ec4', 'John Doe'); + +Domain Response Format +====================== + +We can shorten the ``uuid`` with ``base64`` encoding. Let's use JSON as our response format for this example. + +To change the domain format for JSON, create a function that converts ``app_uuid`` to ``json``. + +.. code-block:: postgres + + -- the name of the function is arbitrary + CREATE OR REPLACE FUNCTION json(app_uuid) RETURNS json AS $$ + select to_json(encode(uuid_send($1),'base64')); + $$ LANGUAGE SQL IMMUTABLE; + + -- check it works + select json('846c4ffd-92ce-4de7-8d11-8e29929f4ec4'::app_uuid); + json + ---------------------------- + "hGxP/ZLOTeeNEY4pkp9OxA==" + +Then create a CAST to tell PostgREST to convert it automatically whenever a JSON response is requested. + +.. code-block:: postgres + + CREATE CAST (app_uuid AS json) WITH FUNCTION json(app_uuid) AS IMPLICIT; + +With this you can obtain the data in the shortened format. + +.. tabs:: + + .. code-tab:: http + + GET /profiles HTTP/1.1 + Accept: application/json + + .. code-tab:: bash Curl + + curl "http://localhost:3000/profiles" \ + -H "Accept: application/json" + +.. code-block:: json + + [{"id":"hGxP/ZLOTeeNEY4pkp9OxA==","name":"John Doe"}] + +.. note:: + + - Casts on domains are ignored by PostgreSQL, their interpretation is left to the application. We're discussing the possibility of including the Domain Representations behavior on `pgsql-hackers `_. + - It would make more sense to use ``base58`` encoding as it's URL friendly but for simplicity we use ``base64`` (supported natively in PostgreSQL). + +.. important:: + + After creating a cast over a domain, you must refresh PostgREST schema cache. See :ref:`schema_reloading`. + +Domain Filter Format +==================== + +For :ref:`h_filter` to work with the shortened format, you need a different conversion. + +PostgREST considers the URL query string to be, in the most generic sense, ``text``. So let's create a function that converts ``text`` to ``app_uuid``. + +.. code-block:: postgres + + -- the name of the function is arbitrary + CREATE OR REPLACE FUNCTION app_uuid(text) RETURNS app_uuid AS $$ + select substring(decode($1,'base64')::text from 3)::uuid; + $$ LANGUAGE SQL IMMUTABLE; + + -- plus a CAST to tell PostgREST to use this function + CREATE CAST (text AS app_uuid) WITH FUNCTION app_uuid(text) AS IMPLICIT; + +Now you can filter as usual. + +.. tabs:: + + .. code-tab:: http + + GET /profiles?id=eq.hGxP/ZLOTeeNEY4pkp9OxA== HTTP/1.1 + Accept: application/json + + .. code-tab:: bash Curl + + curl "http://localhost:3000/profiles?id=eq.ZLOTeeNEY4pkp9OxA==" \ + -H "Accept: application/json" + +.. code-block:: json + + [{"id":"hGxP/ZLOTeeNEY4pkp9OxA==","name":"John Doe"}] + +.. note:: + + If there's no CAST from ``text`` to ``app_uuid`` defined, the filter will still work with the native uuid format (``846c4ffd-92ce-4de7-8d11-8e29929f4ec4``). + +Domain Request Body Format +========================== + +To accept the shortened format in a JSON request body, for example when creating a new record, define a ``json`` to ``app_uuid`` conversion. + +.. code-block:: postgres + + -- the name of the function is arbitrary + CREATE OR REPLACE FUNCTION app_uuid(json) RETURNS public.app_uuid AS $$ + -- here we reuse the previous app_uuid(text) function + select app_uuid($1 #>> '{}'); + $$ LANGUAGE SQL IMMUTABLE; + + CREATE CAST (json AS public.app_uuid) WITH FUNCTION app_uuid(json) AS IMPLICIT; + +Now we can :ref:`insert` (or :ref:`update`) as usual. + +.. tabs:: + + .. code-tab:: http + + POST /profiles HTTP/1.1 + Content-Type: application/json + Prefer: return=representation + + {"id":"zH7HbFJUTfy/GZpwuirpuQ==","name":"Jane Doe"} + + .. code-tab:: bash Curl + + curl "http://localhost:3000/profiles" \ + -H "Prefer: return=representation" \ + -H "Content-Type: application/json" \ + -d @- <`_ also allow us to change the format of the underlying type. However they come with drawbacks that increase complexity. + +1) Formatting the column in the view makes it `non-updatable `_ since Postgres doesn't know how to reverse the transform. This can be worked around using INSTEAD OF triggers. +2) When filtering by this column, we get full table scans for the same reason (also applies to :ref:`computed_cols`) . The performance loss here can be avoided with a computed index, or using a materialized generated column. +3) If the formatted column is used as a foreign key, PostgREST can no longer detect that relationship and :ref:`resource_embedding` breaks. This can be worked around with :ref:`computed_relationships`. + +Domain Representations avoid all the above drawbacks. Their only drawback is that for existing tables, you have to change the column types. But this should be a fast operation since domains are binary coercible with their underlying types. A table rewrite won't be required. + +.. note:: + + Why not create a `base type `_ instead? ``CREATE TYPE app_uuid (INTERNALLENGTH = 22, INPUT = app_uuid_parser, OUTPUT = app_uuid_formatter)``. + + Creating base types need superuser, which is restricted on cloud hosted databases. Additionally this way lets “how the data is presented” dictate “how the data is stored” which would be backwards. diff --git a/postgrest.dict b/postgrest.dict index 52956e941c..bf07b7b201 100644 --- a/postgrest.dict +++ b/postgrest.dict @@ -16,6 +16,7 @@ Cardano cd centric changelog +coercible Cloudfare config CORS From 4706472df96913479231bd28f56892690d98750d Mon Sep 17 00:00:00 2001 From: Grant <109616836+4dex@users.noreply.github.com> Date: Wed, 5 Jul 2023 09:48:47 -0600 Subject: [PATCH 621/711] Update connection_pool.rst typo --- docs/references/connection_pool.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/references/connection_pool.rst b/docs/references/connection_pool.rst index 7464f90722..aa0a904f62 100644 --- a/docs/references/connection_pool.rst +++ b/docs/references/connection_pool.rst @@ -5,7 +5,7 @@ Connection Pool A connection pool is a cache of reusable database connections. It allows serving many HTTP requests using few database connections. Every request to an :doc:`API resource ` borrows a connection from the pool to start a :doc:`transaction `. -Minimizing connections it’s paramount to performance. Each PostgreSQL connection creates a process, having too many can exhaust available resources. +Minimizing connections is paramount to performance. Each PostgreSQL connection creates a process, having too many can exhaust available resources. .. _pool_growth_limit: .. _dyn_conn_pool: From c74b9c4efa834f31e45e819dd33fb7dadd921c90 Mon Sep 17 00:00:00 2001 From: Steve Chavez Date: Mon, 10 Jul 2023 17:04:23 -0500 Subject: [PATCH 622/711] add version querying (#657) --- docs/references/admin.rst | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/docs/references/admin.rst b/docs/references/admin.rst index 6e00eb3f9b..33110028c8 100644 --- a/docs/references/admin.rst +++ b/docs/references/admin.rst @@ -19,6 +19,7 @@ For diagnostic information about the server itself, PostgREST logs to ``stderr`` .. code:: + 12/Jun/2021:17:47:39 -0500: Starting PostgREST 11.1.0... 12/Jun/2021:17:47:39 -0500: Attempting to connect to the database... 12/Jun/2021:17:47:39 -0500: Listening on port 3000 12/Jun/2021:17:47:39 -0500: Connection successful @@ -83,12 +84,34 @@ Restart the database and watch the log file in real-time to understand how HTTP Server Version -------------- -When debugging a problem it's important to verify the PostgREST version. Look for the :code:`Server` HTTP response header, which contains the version number. +When debugging a problem it's important to verify the running PostgREST version. There are three ways to do this: + +- Look for the :code:`Server` HTTP response header that is returned on every request. .. code:: + HEAD /users HTTP/1.1 + Server: postgrest/11.0.1 +- Query ``application_name`` on `pg_stat_activity `_. + +.. code-block:: psql + + select distinct application_name + from pg_stat_activity + where application_name ilike '%postgrest%'; + + application_name + ------------------------------ + PostgREST 11.1.0 + +.. note:: + + The server sets the `fallback_application_name `_ for this query to work. To override the value set ``application_name`` on the connection string. + +- The ``stderr`` logs also contain the version, as noted on :ref:`pgrst_logging`. + .. _trace_header: Trace Header From a6aa2adf04d54a7c77f78a46fe763fc9bede4cca Mon Sep 17 00:00:00 2001 From: Laurence Isla Date: Thu, 20 Jul 2023 09:02:33 -0500 Subject: [PATCH 623/711] Remove embedding disambiguation in favor of computed rels (#660) * Add SQL snippets for ERDs --------- Co-authored-by: steve-chavez --- diagrams/employees.er | 7 + diagrams/presidents.er | 7 + docs/_static/employees.png | Bin 0 -> 8244 bytes docs/_static/presidents.png | Bin 0 -> 8331 bytes docs/references/api/resource_embedding.rst | 605 +++++++++++++-------- docs/references/errors.rst | 2 +- postgrest.dict | 1 + 7 files changed, 393 insertions(+), 229 deletions(-) create mode 100644 diagrams/employees.er create mode 100644 diagrams/presidents.er create mode 100644 docs/_static/employees.png create mode 100644 docs/_static/presidents.png diff --git a/diagrams/employees.er b/diagrams/employees.er new file mode 100644 index 0000000000..7010a670e6 --- /dev/null +++ b/diagrams/employees.er @@ -0,0 +1,7 @@ +[Employees] +*id +first_name +last_name ++supervisor_id + +Employees 1--* Employees diff --git a/diagrams/presidents.er b/diagrams/presidents.er new file mode 100644 index 0000000000..b491009615 --- /dev/null +++ b/diagrams/presidents.er @@ -0,0 +1,7 @@ +[Presidents] +*id +first_name +last_name ++predecessor_id + +Presidents 1--? Presidents diff --git a/docs/_static/employees.png b/docs/_static/employees.png new file mode 100644 index 0000000000000000000000000000000000000000..0a72df2a28ccb7c5042db28cdbbc6a0a158874a1 GIT binary patch literal 8244 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 literal 0 HcmV?d00001 diff --git a/docs/_static/presidents.png b/docs/_static/presidents.png new file mode 100644 index 0000000000000000000000000000000000000000..2164ff3de19ead9700797c517a93ec2486dbdbf4 GIT binary patch literal 8331 zcmaia1yoi4_U9!;q(P)pkdy`qk(Mq==@by8LmH$dL`0-Rlr9kvX_1za6fZ3zD4kLl zX5aUldH-4S)>|V|XPtY`Ip4kar@lPZ)>IRU2?11}v%ZEK}0XUa_8i(dD(92@qeKGoypFzMi zJ&R;exP9QJMuCl8o6B6Hk7PQ%z=6YJbuxRi?QnRWR7ruaS~WigDfV4b*#-@d+9>rTwW^hhRi+B=sP0uDJ^YmutY^g38)3J zH8nNeyu2b>TJAh@cBY**=S^jimS$`_KjC(Ca$5ZLD@ryT$7=QK>vz@F4__O3nPRsd zI7r~(ZFLBOTY0 zpbKY@kL%5}2GR00Z_7DFkL6fZ)5;kcQ8#-1#!Qc|TAOA*D|pdr`{2Q19AB%9j*gB~ z^k?B@BJRV82y9<}|IeR4A31Gzb}9s-4!(VKTf{UEK7MfD$jIt*#1&)bhKQJ%nZ*JQAJueEJSOt|HSnaM;Ks?}M%)dxS9ztSrAABMzQy70OWlMSl751O z)PfP~8yhOTsiM=VIwfz9j(m;l9Ix?Mv}Pf`{+TE%dHYtO30Qz@!9g8t4vuC*JaQPt2Wpcb+tL7bre&etKoO-v*uCK7vZ&1G|OadjRdk;c2b zyZJeH0(A8CQ;dF*P*N(D8CDfKeXG2e%4@dTu#z(tl0Rx?5#2O=zMN|D8Hq$XNJD+) zRaNoq2GTHyiHXUtU6bWaT|3KP+5bJJtfA4Be>ZNtJGFl~O~3}npwjedM>H|Z&6@*1 zJ=26AlEvU&CZY??&ZduzjoqI!Q1$xg>7$Elc5v;&;(V9V*Vh*jdc;%AtC=Ht1%Zo; z`*l^fE?dl9u4;!cJDdp@{SK0M?%Xpn>RVZtSaq`&y(E}UFjk}$T~$>zH~qG#2n#VY zJ1cTBGc$ugP*YPEUeU&fGx%DMuGN=36VgCnhhS%>VTXV@eZbt@zl~ z^d>(a^ZWPjff8c~ih!%+l$170-3jQK3A=>vg%p>Nzzm)2@zrwa`!!ikNGt2^XQQ6*rIq$(&V=>75~EG6Yy zsI-d_5gdWX>h0|%nbr`GK7r|68hNACJ2Z65f$qvD;xN>1KOYAtr)<5;EKOZaeSObX z+eKxK1zYlBKVO@IySu=zf%NdRvq0!3tHsZey#oWCL)o`QBBY!qZ{mi9W{SFI*zzK_ zw-@E7rl&IpER^y)o}#uFJ4moG!k89dor=rKu7=FjIi+UskS?Ab?`{A6>$-bQENJs> zJe2_E%20N=-0RTPRLYb6-{AuT>SwTwRH80fQK*)Hzm`r;apo=lA^}8$3Hq^KAA2t4 zgq-_juPhMuefc7%qH-n2|4#{~ZQl_#w&(6-uDsXUc@cWxy|NNsX z&dSv_QN(GIYD4R;h6W)lu}CX12Ol2{*=@HCq)2kY1Vd8!6gM|_QhNH8kdTm;b^ZG7 zTaTtJ_rnb?UAhEI-2L<_`vO4XOTKFW%V{hh6OV>H~0S@9ToK>Sxc%Nuw~)bufn}$!XP(q@2+$qdm4>0E8L`{BsX{W_DZv+ z?GYtLWyr=~`)ob%gqfVNz>Nb?5bY*8yN(Avf(A*pPK&omLrEEj@k3hYc8yL8_8{2a#$@3W`$tsT0NqQz9iLB?3k%I&OpVPvMt| zjk(qPmNqwe8B#xe`ZP(@!-4$yrSeOi@6M0A<>oCkb8~YaeRr&#qPuE6k?~Uje>VxQ zlg;B8e|VHWWvHhY@$MbJiger{l~yKcKv1L4My!_9u>w!E1Mp!}uLTtq703A~8EJlg zzVU6=Um>+B)mS0T%+i5JZgn4kvvw|!yx3!7W26iWM3j`2xM6uoOdKpMSZc3swm)Z< zw{&$SR#Q{k-<+kbu^;YE;Wn)8PD)FQfwg$8l`Hk`{rj+l1j6Q)7E&6T*ws~spDQb6 z-$lKjs45(NYdeo*&+)~aoSby?@#$9MYkB)Phf;nek0+yrQDQ*d#Ep*`dv*hv?5tL(Nch{LPy;9i~4xJ1%X_x8>Rj z8oeQAPoNf3bk2-&4?6sA?}(~uJt;MiCL$u*M>8r=kcL!Roo(L>yDfJ4Cs!D-oocKNxl(?vt(Dn%ZZF7Iw=K$I%ZwFjya9?V zt*Fr7^FBLrC&QMl4cP5t{|yAIr>CdT|BC18^aDZaY)LUfz1(a_XX zHo@iSOLCcz<}I_wHGp3O6V&^fnl7mV9Tn&}>kv!JyeUHqT-TO^SIDDA2le$QPo6mD zH+!$WLVm!&z>q*+TsYny#FC>;rAfVJMVr-Yp`gyWER-!rAxS`{xczWnAL;O=Cg{in zTG7}b&|YG03o>t(4cRoaibXKA&CIfmA1X>qOYd(?8=e`FV8_#m>zo}!U9Cq#U&}|w zZj6kKysN1RkB+_!FNyg(AHw+b=~MsV#F%lHTz_BRyvJK}j<-Mn8P|*05fMH-3iIp8 z62Ersn#O>_RozW?&r!Qhb4FPbXyU}sP(m|1NbLD1;ygw;ekNVin@@ibs|Dyc)7Xpm7dYHpB$`_l9NZIn)|C%iR6{iG` z97eU()YSB?e0?6}=P2R*=dIycg4Gw4ttL|aqzN?Z(qx6n;GDT(uzWy3K=1M{8-D17 zlD=e~>wGKFih`*roo2370w^XHxCrnO+1OZDclUKc!S{WVt7eT}vOpGh+nv;E_3qzy z*cBJ7v$_x;l|Ujm#(*!!u}N0AxiE zkM~F_PEJmZZf4vtW6i$u@|&PaO$HV9-G|3L`J+yXq7qQ=(;cPLlZp6z780>hrPnsT zq;SW?$16BGasiBLo0`VId`TX7x>27d;zaRlD4W|w6u9u_{dWkozJ}6j-@ErDnwas& zXn~sJ`GJO2z1yPP&V{$PcT7x-jGY}D=;vzdu2@CJrw*HR@dcpieq2qzT2@tn7JjW67^7qx|HO_+OQ5LBq1e%(a~)E(Of3WcI=Q5)y4jETXm2;OfP zp34#!zNV$F9&daBoicv%t;(XxGpn<+^Pkb&?5<7s^zq#5rgddvWyPMZckSs*W>3n_ zPT1Y`5W9W*4WKBMq%S|4dRpEqB~;r5itoqL5-B5NBHSIbs3_&~^0J$oTWEc~DBJ~z zC<-dQx1wxpI4p|spAI*slX7y1OiWB7A|fn73Ta3Yjbw>a^}m164^5o_ME(Ox@4LU6 z6qO);m@LlEg)#%Tg0Q?eN3r3@Sk*G)VxsBBuOWAAUSRb9;*kF!mH%>}y;vzwNKo*3 zdiqn)%o$t^Q6nmfic$Bb_r3rhy)p0stp+|~cW*uZJ1I6sPEL;E@j^;=62brYEqhk1 zxNHGV6%`d=Vs69A@%~`YZtyecVt!XkAU85OK|hkGc5jiqFNMxJ7~6mx&o7m~h2>x0%4+ArK!v ze3)wV<_73{c9mVTR++B(y^!5XcLJ@Or{~p3^W0bEo$c2DJj`td28NFTe|dFubwy5S z446gPZ~AnvM?^+Gi6Nn&h)QPH$}cY`K-;&^k@zO-f%FUbdWDzn*E*0MZqCNReZ>PY zJfg(L03q*MeOnNHrJgTe@TAX=SSW7Z4|SPsY=>XZ&(FoYR<+~I^E}e2yIFt!{JBt+ z8!Y%mDOW0p-+$ksBB+oB4-0x$0L~Y(yIC!i0_!+iZZW>;4i&2*Mj z5RH)iPz2D*O&%V!hXHI@TK`@n5p;31lt?A+!TRXYqpvmgT92mQ$<|K4e}E4+Zu#Ir znM0rsWrOz)zSlmy+H$(tM6)57uI_BXnWCB@?pZkGzA~8k z?WZJ$_M=DTbEkLlPoZ{zVtI=l(N486i>5_W7+=e(T2%opi@f)pUXKrNLFk#Q&B!z!r1JJ_K(#0=_Ju3SNDCa`o~f5tg? z_x4y2UT_h`l|E}xfk9Gqvn!YAIX=2dN2iX3Ly(t|k)hZloHCUguqmF<3QUM8b8-H+ zZ33D6;suAKWS0N_>g#IjrluyRBL?Z<=BO=D&zLf~!6zlg0nW}m;$mXjGBTl46!3N) z4Ox&$2%o(zEF?o1w+8yX*%OYOI>ww(2G3QSV-o`E5f>jHtxf=qE`yGdMD34(-4j)# z8!LF%A2eN~ooi1SV``;^lU?_{*KpMN|7z4NKRAK!Cjs0)Gt z420l!#x)IRXXm)im%yliiVw+`2f?5M*E0mH3nV9sgU$o-%GcZ99}fTeP;2;A>vq;K zF;lHUw?{`uwT+CfK#m8pGrzbP7m|zo*`-8jB80NKy6_3TTF~l58Rh1DTOt&YgB%b3 zv$C>U{^)$_SXRxMe)};mvKXV11dswXJR&v)(@l^0&;btwF90hGVA#=}hL+)= zfP|fhxImWeOq#eZf_~%R=I#K%|5~EUUT$262dcCKQV2HyD|9yWd$d5CE5&hG4YeYD z(Jne47!Hld!pw{TF!2Hh%A)o*I&s5!rk5m{PREW41LO5*z1RX>iqJ{tbQuXhp z{&z(2kD6>RHc5m?5&lgEaR^x~0rfM%vnFWOca`B9b%EkvKYx~MSvUDZrEI-qx(+Lqpu;U)mNh&rQ-1;VC6Z4L}Gkm0wiZ%oqW$VmuWFh*I?| zv3s@0kOEcvY#1M%o_2J1$M1@KHk97N-CvV=c08#OK{8V0_Z8GHf{k&Dm$oUfPEtQT!Lo98PUv9_p|i5GqOoXOtC`P~TV~IUIXc5begd=$Y*`eW0SIs=Pb)q)pjmoqjGElv2I<$9z4 z0ars~qhnpb*-j59JG;^rs*;$C@j&R1#-E@TvO3$F(o(LGU@-pqBvPn--NvBP4^xIlMk)~Ju_pI%aB;-~5vc;bcx}zy zF>dfEF!nfwGX42hmFtTD&011g8vEkKi{74|XxI;t3&$aJe6^*N$nezt8N;0n_*8{B z5zYELJ3H2R59I?(M-4AyW5Xa8DZkc!F84YQm}ms@BvuN%uiq-)z0)Q?0YT5n!;=7p zbrr~1*l*VsQwBtb|Hk7WY6&lngVhoFv+rMR^5T4$4`KJ{eRVZ+y1F75?6Fm1Lc$ve zFVuQ)8;T2YYp|7r@#fnc& zpzF-XB*a(ls%AOW0-cpJ!X0YZy+CkCNEjDM%dhL{3&7?>$;ji=L+85YO%1ps?PK4? zNJ>Du#3#JS$SM84Un>LYZ|XvT(H%n$c}+jcAUK4D^~zAtKvxib%N{#bVd`uwvLv0- ziC{hy6n<`OXaI}pnVVNGu5>=ViX95_e9!Kf0TO$VFkgWeX|vmyrOHZ69bn7I*2+p& zw^04{u=GV10HjFZAE$4iZvRYHWFjpzAgc{Se1(0e;%~vF0%a%Wx62B98j$khEhJhuA<%M{@Dv0%ddow5_@Ls;--^!=;6n)W z(Px7O6ANpkK#h{n0?K=7dnGdIbt^h+BqtwVZLyLM#0-V_kBp4$`OB9Pd3j7(cLFFN zt_rKF;scGK5D>Jks;cU?GDJ^6drRGkNJ+n%U*A2V`>?6CIIwuLoXVeI;F&-h*Gc($ zX`HTeNH_R2n*=fzh>WpA-@kt^ybcOW4dKuoPp#2y0Fo533iCX&s-~jy8U$IgDKDiV zoqS-~qq<`km*&Qg9?N(bdFb5Pwup-y6kxfPiMhEZEI2DJW1+X1@n?$r)kYinw}yu8Li z6XWC0!^5$@Bax$U2b_F-iLej!8%}$fmZl7Lfs}iMloaF;>9&%7{fif5Ts%AlX=zkD z`GY+@MMkZFJH2yrIf$>N`ehuVqNy4<4y$9(7MjikSt!*+zeVKWrq9fgGwDTbaK&f1F)EgZK&o zv7uehrZ=gRZvi<34*l8pvVl>W_@xJcz(R%jogQMY!=F|q9+{z`{RX-ii*dZQ<0D())%Oyo1x|uxD*(mKD6yMfox(M-u`CTW4ntvnHPcLvz1Khz%yz!6iU> z!G|V13pm=gq7kwqfI$y0FE2;upyU)3itg_2dL|~^$UFY~F;YhhSbxTfh`oQ0MnYfy zhPm;A&=w5B*@|@LMrMoy=n8TwDrKmYt*fgR3{er#ckFe+PJ17pTd4U96eA(+t#~>* zI<$EK)8{Zzst?&5$I0k7%`Pb7!`|o2;|-qn9$sE=p`A}o)~Yh==4s`Zms~?mGmQg0 zpFO#SY@YhN{#_n1j@Kus?#UlHHRvy@=*`~U)6y1`R(rJJ==N9N(X-(AdLQ7fZYSC4&k9-Df|ClDuK=| bIxeu3dLq^aE+Yis^$3-_nhKS2mSO)3irzAo literal 0 HcmV?d00001 diff --git a/docs/references/api/resource_embedding.rst b/docs/references/api/resource_embedding.rst index 1507fd8417..be4ea15f2f 100644 --- a/docs/references/api/resource_embedding.rst +++ b/docs/references/api/resource_embedding.rst @@ -1,7 +1,7 @@ .. _resource_embedding: Resource Embedding -================== +################## PostgREST allows including related resources in a single API call. This reduces the need for many API requests. @@ -11,12 +11,13 @@ PostgREST allows including related resources in a single API call. This reduces .. important:: - Whenever foreign keys change you must do :ref:`schema_reloading` for this feature to work. + - PostgREST respects composite foreign keys. + - Whenever foreign keys change you must do :ref:`schema_reloading` for this feature to work. .. _many-to-one: Many-to-one relationships -------------------------- +========================= Since ``films`` has a **foreign key** to ``directors``, this establishes a many-to-one relationship. Thus, we're able to request all the films and the director for each film. @@ -82,7 +83,7 @@ Since the table name is plural, we can be more accurate by making it singular wi .. _one-to-many: One-to-many relationships -------------------------- +========================= The **foreign key reference** establishes the inverse one-to-many relationship. In this case, ``films`` returns as a JSON array because of the “to-many” end. @@ -119,7 +120,7 @@ The **foreign key reference** establishes the inverse one-to-many relationship. .. _many-to-many: Many-to-many relationships --------------------------- +========================== The join table determines many-to-many relationships. It must contain foreign keys to other two tables and they must be part of its composite key. @@ -167,11 +168,11 @@ For the many-to-many relationship between ``films`` and ``actors``, the join tab .. _one-to-one: One-to-one relationships ------------------------- +======================== -One-to-one relationships are detected when: +One-to-one relationships are detected in two ways. -- The foreign key has a unique constraint. +- When the foreign key has a unique constraint. .. code-block:: postgresql @@ -182,7 +183,7 @@ One-to-one relationships are detected when: sound TEXT ); -- The foreign key is a primary key. +- When the foreign key is a primary key. .. code-block:: postgresql @@ -216,12 +217,10 @@ One-to-one relationships are detected when: .. _computed_relationships: -Computed relationships ----------------------- - -You can manually define relationships between resources. This is useful for database objects that can't define foreign keys, like `Foreign Data Wrappers `_. +Computed Relationships +====================== -To do this, you can create functions similar to :ref:`computed_cols`. +You can manually define relationships between resources using functions. This is useful for database objects that can't define foreign keys, like `Foreign Data Wrappers `_. Assuming there's a foreign table ``premieres`` that we want to relate to ``films``. @@ -292,6 +291,9 @@ We consider any value greater than 1 as "many" so this defines a one-to-many rel ".." ] +Overriding Relationships +------------------------ + Computed relationships also allow you to override the ones that PostgREST auto-detects. For example, to override the :ref:`many-to-one relationship ` between ``films`` and ``directors``. @@ -318,10 +320,359 @@ Computed relationships have good performance as their intended design enable `in - Make sure to correctly label the ``to-one`` part of the relationship. When using the ``ROWS 1`` estimation, PostgREST will expect a single row to be returned. If that is not the case, it will unnest the embedding and return repeated values for the top level resource. +.. _embed_disamb: +.. _hint_disamb: +.. _target_disamb: +.. _complex_rels: + +Complex Relationships +===================== + +As mentioned on :ref:`resource_embedding`, the server does joins based on **Foreign Keys**. +When there are many foreign keys between tables, it needs disambiguation to resolve which foreign key columns to use for the join. + +:ref:`computed_relationships` can do the job here, they can choose join columns arbitrarily. + +.. note:: + + Previous versions addressed complex relationships with `Embedding disambiguation `_ but this is now deprecated. Follow the solutions in this section when a ``300 Multiple Choices`` error is returned. + +.. _multiple_m2o: + +Multiple Many-To-One +-------------------- + +.. tabs:: + + .. group-tab:: ERD + + .. image:: ../../_static/orders.png + + .. code-tab:: postgresql SQL + + create table addresses ( + id int primary key generated always as identity, + name text, + city text, + state text, + postal_code char(5) + ); + + create table orders ( + id int primary key generated always as identity, + name text, + billing_address_id int references addresses(id), + shipping_address_id int references addresses(id) + ); + +To successfully embed ``orders`` with ``addresses``, you need to create computed relationships for the foreign keys columns you want to use: + +.. code-block:: postgresql + + create function billing_address(orders) returns setof addresses rows 1 as $$ + select * from addresses where id = $1.billing_address_id + $$ stable language sql; + + create function shipping_address(orders) returns setof addresses rows 1 as $$ + select * from addresses where id = $1.shipping_address_id + $$ stable language sql; + +Now, we can unambiguously embed the billing and shipping addresses. + +.. tabs:: + + .. code-tab:: http + + GET /orders?select=name,billing_address(name),shipping_address(name) HTTP/1.1 + + .. code-tab:: bash Curl + + curl "http://localhost:3000/orders?select=name,billing_address(name),shipping_address(name)" + +.. code-block:: json + + [ + { + "name": "Personal Water Filter", + "billing_address": { + "name": "32 Glenlake Dr.Dearborn, MI 48124" + }, + "shipping_address": { + "name": "30 Glenlake Dr.Dearborn, MI 48124" + } + } + ] + +.. _multiple_o2m: + +Multiple One-To-Many +-------------------- + +Let's take the tables from :ref:`multiple_m2o`. +To embed ``addresses`` with ``orders``, you need to create computed relationships like these ones: + +.. code-block:: postgresql + + create function billing_orders(addresses) returns setof orders as $$ + select * from orders where billing_address_id = $1.id + $$ stable language sql; + + create function shipping_orders(addresses) returns setof orders as $$ + select * from orders where shipping_address_id = $1.id + $$ stable language sql; + +Then, the request would look like: + +.. tabs:: + + .. code-tab:: http + + GET /addresses?select=name,billing_orders(name),shipping_orders(name)&id=eq.1 HTTP/1.1 + + .. code-tab:: bash Curl + + curl "http://localhost:3000/addresses?select=name,billing_orders(name),shipping_orders(name)&id=eq.1" + +.. code-block:: json + + [ + { + "name": "32 Glenlake Dr.Dearborn, MI 48124", + "billing_orders": [ + { "name": "Personal Water Filter" }, + { "name": "Coffee Machine" } + ], + "shipping_orders": [ + { "name": "Coffee Machine" } + ] + } + ] + +.. _recursive_o2o_embed: + +Recursive One-To-One +-------------------- + +.. tabs:: + + .. group-tab:: ERD + + .. image:: ../../_static/presidents.png + + .. code-tab:: postgresql SQL + + create table presidents ( + id int primary key generated always as identity, + first_name text, + last_name text, + predecessor_id int references presidents(id) unique + ); + +To get either side of the Recursive One-To-One relationship, create the functions: + +.. code-block:: postgresql + + create or replace function predecessor(presidents) returns setof presidents rows 1 as $$ + select * from presidents where id = $1.predecessor_id + $$ stable language sql; + + create or replace function successor(presidents) returns setof presidents rows 1 as $$ + select * from presidents where predecessor_id = $1.id + $$ stable language sql; + +Now, to query a president with their predecessor and successor: + +.. tabs:: + + .. code-tab:: http + + GET /presidents?select=last_name,predecessor(last_name),successor(last_name)&id=eq.2 HTTP/1.1 + + .. code-tab:: bash Curl + + curl "http://localhost:3000/presidents?select=last_name,predecessor(last_name),successor(last_name)&id=eq.2" + +.. code-block:: json + + [ + { + "last_name": "Adams", + "predecessor": { + "last_name": "Washington" + }, + "successor": { + "last_name": "Jefferson" + } + } + ] + +.. _recursive_o2m_embed: + +Recursive One-To-Many +--------------------- + +.. tabs:: + + .. group-tab:: ERD + + .. image:: ../../_static/employees.png + + .. code-tab:: postgresql SQL + + create table employees ( + id int primary key generated always as identity, + first_name text, + last_name text, + supervisor_id int references employees(id) + ); + +To get the One-To-Many embedding, that is, the supervisors with their supervisees, create a function like this one: + +.. code-block:: postgresql + + create or replace function supervisees(employees) returns setof employees as $$ + select * from employees where supervisor_id = $1.id + $$ stable language sql; + +Now, the query would be: + +.. tabs:: + + .. code-tab:: http + + GET /employees?select=last_name,supervisees(last_name)&id=eq.1 HTTP/1.1 + + .. code-tab:: bash Curl + + curl "http://localhost:3000/employees?select=last_name,supervisees(last_name)&id=eq.1" + +.. code-block:: json + + [ + { + "name": "Taylor", + "supervisees": [ + { "name": "Johnson" }, + { "name": "Miller" } + ] + } + ] + +.. _recursive_m2o_embed: + +Recursive Many-To-One +---------------------- + +Let's take the same ``employees`` table from :ref:`recursive_o2m_embed`. +To get the Many-To-One relationship, that is, the employees with their respective supervisor, you need to create a function like this one: + +.. code-block:: postgresql + + create or replace function supervisor(employees) returns setof employees rows 1 as $$ + select * from employees where id = $1.supervisor_id + $$ stable language sql; + +Then, the query would be: + +.. tabs:: + + .. code-tab:: http + + GET /employees?select=last_name,supervisor(last_name)&id=eq.3 HTTP/1.1 + + .. code-tab:: bash Curl + + curl "http://localhost:3000/employees?select=last_name,supervisor(last_name)&id=eq.3" + +.. code-block:: json + + [ + { + "last_name": "Miller", + "supervisor": { + "last_name": "Taylor" + } + } + ] + +.. _recursive_m2m_embed: + +Recursive Many-To-Many +---------------------- + +.. tabs:: + + .. group-tab:: ERD + + .. image:: ../../_static/users.png + + .. code-tab:: postgresql SQL + + create table users ( + id int primary key generated always as identity, + first_name text, + last_name text, + username text unique + ); + + create table subscriptions ( + subscriber_id int references users(id), + subscribed_id int references users(id), + type text, + primary key (subscriber_id, subscribed_id) + ); + +To get all the subscribers of a user as well as the ones they're following, define these functions: + +.. code-block:: postgresql + + create or replace function subscribers(users) returns setof users as $$ + select u.* + from users u, + subscriptions s + where s.subscriber_id = u.id and + s.subscribed_id = $1.id + $$ stable language sql; + + create or replace function following(users) returns setof users as $$ + select u.* + from users u, + subscriptions s + where s.subscribed_id = u.id and + s.subscriber_id = $1.id + $$ stable language sql; + +Then, the request would be: + +.. tabs:: + + .. code-tab:: http + + GET /users?select=username,subscribers(username),following(username)&id=eq.4 HTTP/1.1 + + .. code-tab:: bash Curl + + curl "http://localhost:3000/users?select=username,subscribers(username),following(username)&id=eq.4" + +.. code-block:: json + + [ + { + "username": "the_top_artist", + "subscribers": [ + { "username": "patrick109" }, + { "username": "alicia_smith" } + ], + "following": [ + { "username": "top_streamer" } + ] + } + ] + .. _nested_embedding: Nested Embedding ----------------- +================ If you want to embed through join tables but need more control on the intermediate resources, you can do nested embedding. For instance, you can request the Actors, their Roles and the Films for those Roles: @@ -338,7 +689,7 @@ If you want to embed through join tables but need more control on the intermedia .. _embed_filters: Embedded Filters ----------------- +================ Embedded resources can be shaped similarly to their top-level counterparts. To do so, prefix the query parameters with the name of the embedded resource. For instance, to order the actors in each film: @@ -419,7 +770,7 @@ The result will show the nested actors named Tom and order them by last name. Al .. _embedding_top_level_filter: Top-level Filtering -------------------- +=================== By default, :ref:`embed_filters` don't change the top-level resource(``films``) rows at all: @@ -484,7 +835,7 @@ In order to filter the top level rows you need to add ``!inner`` to the embedded .. _null_embed: Null filtering on Embedded Resources -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +------------------------------------ Null filtering on the embedded resources can behave the same as ``!inner``. While providing more flexibility. @@ -528,7 +879,7 @@ Both ``is.null`` and ``not.is.null`` can be included inside the `or` operator. F .. _empty_embed: Empty Embed -~~~~~~~~~~~ +----------- You can leave an embedded resource empty, this helps with filtering in some cases. @@ -555,7 +906,7 @@ To filter the films by actors but not include them: .. _top_level_order: Top-level Ordering ------------------- +================== On :ref:`Many-to-One ` and :ref:`One-to-One ` relationships, you can use a column of the "to-one" end to sort the top-level. @@ -574,7 +925,7 @@ For example, to arrange the films in descending order using the director's last .. _spread_embed: Spread embedded resource ------------------------- +======================== On many-to-one and one-to-one relationships, you can "spread" the embedded resource. That is, remove the surrounding JSON object for the embedded resource columns. @@ -633,7 +984,7 @@ You can use this to get the columns of a join table in a many-to-many relationsh .. _embedding_partitioned_tables: Embedding Partitioned Tables ----------------------------- +============================ Embedding can also be done between `partitioned tables `_ and other tables. @@ -679,7 +1030,7 @@ Since it contains the ``films_id`` foreign key, it is possible to embed ``box_of .. _embedding_views: Embedding Views ---------------- +=============== PostgREST will infer the relationships of a view based on its source tables. Source tables are the ones referenced in the ``FROM`` and ``JOIN`` clauses of the view definition. The foreign keys of the relationships must be present in the top ``SELECT`` clause of the view for this to work. @@ -725,14 +1076,14 @@ It's also possible to embed `Materialized Views ` that returns a table type, you can embed its related resources. @@ -770,7 +1121,7 @@ A request with ``directors`` embedded: .. _mutation_embed: Embedding after Insertions/Updates/Deletions --------------------------------------------- +============================================ You can embed related resources after doing :ref:`insert`, :ref:`update` or :ref:`delete`. @@ -819,205 +1170,3 @@ Response: "last_name": "Boyle" } } - -.. _embed_disamb: - -Embedding Disambiguation ------------------------- - -For doing resource embedding, PostgREST infers the relationship between two tables based on a foreign key between them. -However, in cases where there's more than one foreign key between two tables, it's not possible to infer the relationship unambiguously -by just specifying the tables names. - -.. _target_disamb: - -Target Disambiguation -~~~~~~~~~~~~~~~~~~~~~ - -For example, suppose you have the following ``orders`` and ``addresses`` tables: - -.. image:: ../../_static/orders.png - -And you try to embed ``orders`` with ``addresses`` (this is the **target**): - -.. tabs:: - - .. code-tab:: http - - GET /orders?select=*,addresses(*) HTTP/1.1 - - .. code-tab:: bash Curl - - curl "http://localhost:3000/orders?select=*,addresses(*)" -i - -Since the ``orders`` table has two foreign keys to the ``addresses`` table — an order has a billing address and a shipping address — -the request is ambiguous and PostgREST will respond with an error: - -.. code-block:: http - - HTTP/1.1 300 Multiple Choices - - {..} - -If this happens, you need to disambiguate the request by adding precision to the **target**. -Instead of the **table name**, you can specify the **foreign key constraint name** or the **column name** that is part of the foreign key. - -Let's try first with the **foreign key constraint name**. To make it clearer we can name it: - -.. code-block:: postgresql - - ALTER TABLE orders - ADD CONSTRAINT billing_address foreign key (billing_address_id) references addresses(id), - ADD CONSTRAINT shipping_address foreign key (shipping_address_id) references addresses(id); - - -- Or if the constraints names were already generated by PostgreSQL we can rename them - -- ALTER TABLE orders - -- RENAME CONSTRAINT orders_billing_address_id_fkey TO billing_address, - -- RENAME CONSTRAINT orders_shipping_address_id_fkey TO shipping_address; - -Now we can unambiguously embed the billing address by specifying the ``billing_address`` foreign key constraint as the **target**. - -.. tabs:: - - .. code-tab:: http - - GET /orders?select=name,billing_address(name) HTTP/1.1 - - .. code-tab:: bash Curl - - curl "http://localhost:3000/orders?select=name,billing_address(name)" - -.. code-block:: json - - [ - { - "name": "Personal Water Filter", - "billing_address": { - "name": "32 Glenlake Dr.Dearborn, MI 48124" - } - } - ] - -Alternatively, you can specify the **column name** of the foreign key constraint as the **target**. This can be aliased to make -the result more clear. - -.. tabs:: - - .. code-tab:: http - - GET /orders?select=name,billing_address:billing_address_id(name) HTTP/1.1 - - .. code-tab:: bash Curl - - curl "http://localhost:3000/orders?select=name,billing_address:billing_address_id(name)" - -.. code-block:: json - - [ - { - "name": "Personal Water Filter", - "billing_address": { - "name": "32 Glenlake Dr.Dearborn, MI 48124" - } - } - ] - -.. _hint_disamb: - -Hint Disambiguation -~~~~~~~~~~~~~~~~~~~ - -If specifying the **target** is not enough for unambiguous embedding, you can add a **hint**. For example, let's assume we create -two views of ``addresses``: ``central_addresses`` and ``eastern_addresses``. - -PostgREST cannot detect a view as an embedded resource by using a column name or foreign key name as targets, that is why we need to use the view name ``central_addresses`` instead. But, still, this is not enough for an unambiguous embed. - -.. tabs:: - - .. code-tab:: http - - GET /orders?select=*,central_addresses(*) HTTP/1.1 - - .. code-tab:: bash Curl - - curl "http://localhost:3000/orders?select=*,central_addresses(*)" -i - -.. code-block:: http - - HTTP/1.1 300 Multiple Choices - -For solving this case, in addition to the **target**, we can add a **hint**. -Here, we still specify ``central_addresses`` as the **target** and use the ``billing_address`` foreign key as the **hint**: - -.. tabs:: - - .. code-tab:: http - - GET /orders?select=*,central_addresses!billing_address(*) HTTP/1.1 - - .. code-tab:: bash Curl - - curl 'http://localhost:3000/orders?select=*,central_addresses!billing_address(*)' -i - -.. code-block:: http - - HTTP/1.1 200 OK - - [ ... ] - -Similarly to the **target**, the **hint** can be a **table name**, **foreign key constraint name** or **column name**. - -Hints also work alongside ``!inner`` if a top level filtering is needed. From the above example: - -.. tabs:: - - .. code-tab:: http - - GET /orders?select=*,central_addresses!billing_address!inner(*)¢ral_addresses.code=AB1000 HTTP/1.1 - - .. code-tab:: bash Curl - - curl "http://localhost:3000/orders?select=*,central_addresses!billing_address!inner(*)¢ral_addresses.code=AB1000" - -.. note:: - - If the relationship is so complex that hint disambiguation does not solve it, you can use :ref:`computed_relationships`. - -.. _recursive_m2m_disamb: - -Recursive Many-To-Many Disambiguation -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -Use hints plus the :ref:`spread_embed` to disambiguate a recursive many-to-many relationship. Having the following: - -.. image:: ../../_static/users.png - -Note that ``subscriptions`` has more than one foreign key to ``users``. - -To get all the subscribers of a user: - -.. tabs:: - - .. code-tab:: http - - GET /users?select=username,subscribers:subscriptions!subscribed_id(...users!subscriber_id(username))&id=eq.4 HTTP/1.1 - - .. code-tab:: bash Curl - - curl "http://localhost:3000/users?select=username,subscribers:subscriptions!subscribed_id(...users!subscriber_id(username))&id=eq.4" - -.. code-block:: json - - [ - { - "username": "the_top_artist", - "subscribers": [ - { "username": "patrick109" }, - { "username": "alicia_smith" } - ] - } - ] - -.. note:: - - We're working on a better interface for recursive relationships to reduce the request verbosity. diff --git a/docs/references/errors.rst b/docs/references/errors.rst index 0c0a40c72c..d03db69fbb 100644 --- a/docs/references/errors.rst +++ b/docs/references/errors.rst @@ -320,7 +320,7 @@ Related to a :ref:`stale schema cache `. Most of the time, these e | PGRST200 | | exist in the database. | +---------------+-------------+-------------------------------------------------------------+ | .. _pgrst201: | 300 | An ambiguous embedding request was made. | -| | | See :ref:`embed_disamb`. | +| | | See :ref:`complex_rels`. | | PGRST201 | | | +---------------+-------------+-------------------------------------------------------------+ | .. _pgrst202: | 404 | Caused by a stale function signature, otherwise | diff --git a/postgrest.dict b/postgrest.dict index bf07b7b201..685cc788ff 100644 --- a/postgrest.dict +++ b/postgrest.dict @@ -159,6 +159,7 @@ SSL stateful stdout Stolarz +supervisees SvelteKit SwaggerUI syslog From 4c4a1de832ee07166b773e743150a8605ab1d611 Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Mon, 10 Jul 2023 17:57:16 -0500 Subject: [PATCH 624/711] to_jsonb index no longer required on json/jsonb --- docs/references/api/tables_views.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/references/api/tables_views.rst b/docs/references/api/tables_views.rst index 5a8ca92e61..19f651d404 100644 --- a/docs/references/api/tables_views.rst +++ b/docs/references/api/tables_views.rst @@ -449,7 +449,7 @@ The arrow operators(``->``, ``->>``) can also be used for accessing composite fi .. important:: - When using the ``->`` and ``->>`` operators, PostgREST uses a query like ``to_jsonb()->'field'``. To make filtering and ordering on those nested fields use an index, the index needs to be created on the same expression, including the ``to_jsonb(...)`` call: + When using the ``->`` and ``->>`` operators on composite and array columns, PostgREST uses a query like ``to_jsonb()->'field'``. To make filtering and ordering on those nested fields use an index, the index needs to be created on the same expression, including the ``to_jsonb(...)`` call: .. code-block:: postgres From 220683cef001305d0ab456b8d3f8f28f8b1767b9 Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Tue, 11 Jul 2023 10:31:51 -0500 Subject: [PATCH 625/711] add HEAD optimization --- docs/references/api/tables_views.rst | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/docs/references/api/tables_views.rst b/docs/references/api/tables_views.rst index 19f651d404..3d4bb9b31f 100644 --- a/docs/references/api/tables_views.rst +++ b/docs/references/api/tables_views.rst @@ -685,6 +685,14 @@ If we make a similar request on ``bigtable``, which has 3573458 rows, we would g HTTP/1.1 206 Partial Content Content-Range: 0-24/3572000 +.. _head_req: + +HEAD +---- + +A HEAD method will behave identically to GET except that no body will be returned (`RFC 2616 `_) . +As an optimization, the generated query won't execute an aggregate (to avoid unnecessary data transfer). + .. _update: Update From fefd0e2e83885ea4bce57c750a11668034c16b05 Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Thu, 20 Jul 2023 23:04:19 -0500 Subject: [PATCH 626/711] dry config and make it responsive * shorten connection pool * move securing execution plan * shorten config intro page --- docs/ecosystem.rst | 2 +- docs/references/admin.rst | 28 +++ docs/references/configuration.rst | 376 ++++++++++++++++++++++------ docs/references/connection_pool.rst | 6 +- postgrest.dict | 4 +- 5 files changed, 335 insertions(+), 81 deletions(-) diff --git a/docs/ecosystem.rst b/docs/ecosystem.rst index 11c75a4c9b..da7b4eb668 100644 --- a/docs/ecosystem.rst +++ b/docs/ecosystem.rst @@ -18,7 +18,7 @@ Community Tutorials * `REST Data Service on YugabyteDB / PostgreSQL `_ -* `Build data-driven applications with Workers and PostgreSQL `_ - A tutorial on how to integrate with PostgREST and PostgreSQL using Cloudfare Workers. +* `Build data-driven applications with Workers and PostgreSQL `_ - A tutorial on how to integrate with PostgREST and PostgreSQL using Cloudflare Workers. .. _templates: diff --git a/docs/references/admin.rst b/docs/references/admin.rst index 33110028c8..34ba883ba8 100644 --- a/docs/references/admin.rst +++ b/docs/references/admin.rst @@ -220,6 +220,34 @@ The other available parameters are ``analyze``, ``verbose``, ``settings``, ``buf Note that akin to the EXPLAIN command, the changes will be committed when using the ``analyze`` option. To avoid this, you can use the :ref:`db-tx-end` and the ``Prefer: tx=rollback`` header. +Securing the Execution Plan +~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +It's recommended to only activate :ref:`db-plan-enabled` on testing environments since it reveals internal database details. +However, if you choose to use it in production you can add a :ref:`db-pre-request` to filter the requests that can use this feature. + +For example, to only allow requests from an IP address to get the execution plans: + +.. code-block:: postgresql + + -- Assuming a proxy(Nginx, Cloudflare, etc) passes an "X-Forwarded-For" header(https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Forwarded-For) + create or replace function filter_plan_requests() + returns void as $$ + declare + headers json := current_setting('request.headers', true)::json; + client_ip text := coalesce(headers->>'x-forwarded-for', ''); + accept text := coalesce(headers->>'accept', ''); + begin + if accept like 'application/vnd.pgrst.plan%' and client_ip != '144.96.121.73' then + raise insufficient_privilege using + message = 'Not allowed to use application/vnd.pgrst.plan'; + end if; + end; $$ language plpgsql; + + -- set this function on your postgrest.conf + -- db-pre-request = filter_plan_requests + + .. _health_check: Health Check diff --git a/docs/references/configuration.rst b/docs/references/configuration.rst index a0683c774d..338e0aa1b9 100644 --- a/docs/references/configuration.rst +++ b/docs/references/configuration.rst @@ -3,24 +3,26 @@ Configuration ############# -Config parameters can be provided via :ref:`file_config`, :ref:`env_variables_config` or :ref:`in_db_config`. Using :ref:`config_reloading` you can modify the parameters without restarting the server. +Configuration parameters can be provided via: -Without configuration, PostgREST won't be able to serve requests. At the minimum it needs either :ref:`a role to serve anonymous requests with ` - or :ref:`a secret to use for JWT authentication `. +- :ref:`file_config`. +- :ref:`env_variables_config`, overriding values from the config file. +- :ref:`in_db_config`, overriding values from both the config file and environment variables. -To connect to a database it uses a `libpq connection string `_. The connection string can be set in the configuration file or via environment variable or can be read from an external file. See :ref:`db-uri` for details. Any parameter that is not set in the connection string is read from `libpq environment variables `_. The default connection string is ``postgresql://``, which reads **all** parameters from the environment. +Using :ref:`config_reloading` you can modify the parameters without restarting the server. -Config parameters are read in the following order: -1. From the config file. -2. From environment variables, overriding values from the config file. -3. From the database, overriding values from both the config file and environment variables. +Minimum parameters +================== + +The server is able to start without any config parameters, but it won't be able to serve requests unless it has :ref:`a role to serve anonymous requests with ` - or :ref:`a secret to use for JWT authentication `. .. _file_config: Config File =========== -PostgREST can read a config file. There is no predefined location for this file, you must specify the file path as the one and only argument to the server: +There is no predefined location for the config file, you must specify the file path as the one and only argument to the server: .. code:: bash @@ -46,7 +48,7 @@ The configuration file must contain a set of key value pairs: jwt-secret-is-base64 = false # Port the postgrest process is listening on for http requests - server-port = 80 + server-port = 3000 You can run ``postgrest --example`` to display all possible configuration parameters and how to use them in a configuration file. @@ -55,7 +57,9 @@ You can run ``postgrest --example`` to display all possible configuration parame Environment Variables ===================== -You can also set these :ref:`configuration parameters ` using environment variables. They are capitalized, have a ``PGRST_`` prefix, and use underscores. For example: ``PGRST_DB_URI`` corresponds to ``db-uri`` and ``PGRST_APP_SETTINGS_*`` to ``app.settings.*``. +Environment variables are capitalized, have a ``PGRST_`` prefix, and use underscores. For example: ``PGRST_DB_URI`` corresponds to ``db-uri`` and ``PGRST_APP_SETTINGS_*`` to ``app.settings.*``. + +`libpq environment variables `_ are also supported for constructing the connection string, see :ref:`db-uri`. See the full list of environment variable names on :ref:`config_full_list`. @@ -64,7 +68,7 @@ See the full list of environment variable names on :ref:`config_full_list`. In-Database Configuration ========================= -Using a :ref:`pre-config ` function, you can configure the server with database settings. For example, you can configure :ref:`db-schemas` and :ref:`jwt-secret` like this: +You can also configure the server with database settings by using a :ref:`pre-config ` function. For example, you can configure :ref:`db-schemas` and :ref:`jwt-secret` like this: .. code-block:: @@ -144,51 +148,19 @@ The ``"pgrst"`` notification channel is enabled by default. You can name the cha List of parameters ================== -=========================== ======= ================= ========== ================================= ============================== -Name Type Default Reloadable Environment variable In-database name -=========================== ======= ================= ========== ================================= ============================== -admin-server-port Int PGRST_ADMIN_SERVER_PORT -app.settings.* String Y PGRST_APP_SETTINGS_* -db-anon-role String Y PGRST_DB_ANON_ROLE pgrst.db_anon_role -db-channel String pgrst Y PGRST_DB_CHANNEL -db-channel-enabled Boolean True Y PGRST_DB_CHANNEL_ENABLED -db-config Boolean True Y PGRST_DB_CONFIG -db-pre-config String Y PGRST_DB_PRE_CONFIG pgrst.db_pre_config -db-extra-search-path String public Y PGRST_DB_EXTRA_SEARCH_PATH pgrst.db_extra_search_path -db-max-rows Int ∞ Y PGRST_DB_MAX_ROWS pgrst.db_max_rows -db-plan-enabled Boolean False Y PGRST_DB_PLAN_ENABLED pgrst.db_plan_enabled -db-pool Int 10 PGRST_DB_POOL -db-pool-acquisition-timeout Int 10 PGRST_DB_POOL_ACQUISITION_TIMEOUT -db-pool-max-idletime Int 30 PGRST_DB_POOL_MAX_IDLETIME -db-pool-max-lifetime Int 1800 PGRST_DB_POOL_MAX_LIFETIME -db-pre-request String Y PGRST_DB_PRE_REQUEST pgrst.db_pre_request -db-prepared-statements Boolean True Y PGRST_DB_PREPARED_STATEMENTS pgrst.db_prepared_statements -db-root-spec String Y PGRST_DB_ROOT_SPEC pgrst.db_root_spec -db-schemas String public Y PGRST_DB_SCHEMAS pgrst.db_schemas -db-tx-end String commit PGRST_DB_TX_END -db-uri String postgresql:// PGRST_DB_URI -db-use-legacy-gucs Boolean True Y PGRST_DB_USE_LEGACY_GUCS pgrst.db_use_legacy_gucs -jwt-aud String Y PGRST_JWT_AUD pgrst.jwt_aud -jwt-role-claim-key String .role Y PGRST_JWT_ROLE_CLAIM_KEY pgrst.jwt_role_claim_key -jwt-secret String Y PGRST_JWT_SECRET pgrst.jwt_secret -jwt-secret-is-base64 Boolean False Y PGRST_JWT_SECRET_IS_BASE64 pgrst.jwt_secret_is_base64 -log-level String error PGRST_LOG_LEVEL -openapi-mode String follow-privileges Y PGRST_OPENAPI_MODE pgrst.openapi_mode -openapi-security-active Boolean False Y PGRST_OPENAPI_SECURITY_ACTIVE pgrst.openapi_security_active -openapi-server-proxy-uri String Y PGRST_OPENAPI_SERVER_PROXY_URI pgrst.openapi_server_proxy_uri -raw-media-types String Y PGRST_RAW_MEDIA_TYPES pgrst.raw_media_types -server-host String !4 PGRST_SERVER_HOST -server-port Int 3000 PGRST_SERVER_PORT -server-trace-header String Y PGRST_SERVER_TRACE_HEADER pgrst.server_trace_header -server-unix-socket String PGRST_SERVER_UNIX_SOCKET -server-unix-socket-mode String 660 PGRST_SERVER_UNIX_SOCKET_MODE -=========================== ======= ================= ========== ================================= ============================== - .. _admin-server-port: admin-server-port ----------------- + =============== ======================= + **Type** Int + **Default** `n/a` + **Reloadable** N + **Environment** PGRST_ADMIN_SERVER_PORT + **In-Database** `n/a` + =============== ======================= + Specifies the port for the :ref:`health_check` endpoints. .. _app.settings.*: @@ -196,6 +168,14 @@ admin-server-port app.settings.* -------------- + =============== ======================= + **Type** String + **Default** `n/a` + **Reloadable** & + **Environment** PGRST_APP_SETTINGS_* + **In-Database** `n/a` + =============== ======================= + Arbitrary settings that can be used to pass in secret keys directly as strings, or via OS environment variables. For instance: :code:`app.settings.jwt_secret = "$(MYAPP_JWT_SECRET)"` will take :code:`MYAPP_JWT_SECRET` from the environment and make it available to postgresql functions as :code:`current_setting('app.settings.jwt_secret')`. .. _db-anon-role: @@ -203,6 +183,14 @@ app.settings.* db-anon-role ------------ + =============== ======================= + **Type** String + **Default** `n/a` + **Reloadable** Y + **Environment** PGRST_DB_ANON_ROLE + **In-Database** pgrst.db_anon_role + =============== ======================= + The database role to use when executing commands on behalf of unauthenticated clients. For more information, see :ref:`roles`. When unset anonymous access will be blocked. @@ -212,6 +200,14 @@ db-anon-role db-channel ---------- + =============== ======================= + **Type** String + **Default** pgrst + **Reloadable** Y + **Environment** PGRST_DB_CHANNEL + **In-Database** `n/a` + =============== ======================= + The name of the notification channel that PostgREST uses for :ref:`schema_reloading` and configuration reloading. .. _db-channel-enabled: @@ -219,6 +215,14 @@ db-channel db-channel-enabled ------------------ + =============== ======================= + **Type** Boolean + **Default** True + **Reloadable** Y + **Environment** PGRST_DB_CHANNEL_ENABLED + **In-Database** `n/a` + =============== ======================= + When this is set to :code:`true`, the notification channel specified in :ref:`db-channel` is enabled. You should set this to ``false`` when using PostgresSQL behind an external connection pooler such as PgBouncer working in transaction pooling mode. See :ref:`this section ` for more information. @@ -228,6 +232,14 @@ db-channel-enabled db-config --------- + =============== ======================= + **Type** Boolean + **Default** True + **Reloadable** Y + **Environment** PGRST_DB_CONFIG + **In-Database** `n/a` + =============== ======================= + Enables the in-database configuration. .. _db-pre-config: @@ -235,6 +247,14 @@ db-config db-pre-config ------------- + =============== ======================= + **Type** String + **Default** `n/a` + **Reloadable** Y + **Environment** PGRST_DB_PRE_CONFIG + **In-Database** pgrst.db_pre_config + =============== ======================= + Name of the function that does in-database configuration. .. _db-extra-search-path: @@ -242,6 +262,14 @@ db-pre-config db-extra-search-path -------------------- + =============== ========================== + **Type** String + **Default** public + **Reloadable** Y + **Environment** PGRST_DB_EXTRA_SEARCH_PATH + **In-Database** pgrst.db_extra_search_path + =============== ========================== + Extra schemas to add to the `search_path `_ of every request. These schemas tables, views and stored procedures **don't get API endpoints**, they can only be referred from the database objects inside your :ref:`db-schemas`. This parameter was meant to make it easier to use **PostgreSQL extensions** (like PostGIS) that are outside of the :ref:`db-schemas`. @@ -253,6 +281,14 @@ db-extra-search-path db-max-rows ----------- + =============== ========================== + **Type** Int + **Default** ∞ + **Reloadable** Y + **Environment** PGRST_DB_MAX_ROWS + **In-Database** pgrst.db_max_rows + =============== ========================== + *For backwards compatibility, this config parameter is also available without prefix as "max-rows".* A hard limit to the number of rows PostgREST will fetch from a view, table, or stored procedure. Limits payload size for accidental or malicious requests. @@ -262,37 +298,29 @@ db-max-rows db-plan-enabled --------------- - When this is set to :code:`true`, the execution plan of a request can be retrieved by using the :code:`Accept: application/vnd.pgrst.plan` header. See :ref:`explain_plan`. - - It's recommended to use this in testing environments only since it reveals internal database details. - However, if you choose to use it in production you can add a :ref:`db-pre-request` to filter the requests that can use this feature. - - For example, to only allow requests from an IP address to get the execution plans: - - .. code-block:: postgresql - - -- Assuming a proxy(Nginx, Cloudflare, etc) passes an "X-Forwarded-For" header(https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Forwarded-For) - create or replace function filter_plan_requests() - returns void as $$ - declare - headers json := current_setting('request.headers', true)::json; - client_ip text := coalesce(headers->>'x-forwarded-for', ''); - accept text := coalesce(headers->>'accept', ''); - begin - if accept like 'application/vnd.pgrst.plan%' and client_ip != '144.96.121.73' then - raise insufficient_privilege using - message = 'Not allowed to use application/vnd.pgrst.plan'; - end if; - end; $$ language plpgsql; + =============== ========================== + **Type** Boolean + **Default** False + **Reloadable** Y + **Environment** PGRST_DB_PLAN_ENABLED + **In-Database** pgrst.db_plan_enabled + =============== ========================== - -- set this function on your postgrest.conf - -- db-pre-request = filter_plan_requests + When this is set to :code:`true`, the execution plan of a request can be retrieved by using the :code:`Accept: application/vnd.pgrst.plan` header. See :ref:`explain_plan`. .. _db-pool: db-pool ------- + =============== ========================== + **Type** Int + **Default** 10 + **Reloadable** N + **Environment** PGRST_DB_POOL + **In-Database** n/a + =============== ========================== + Number of maximum connections to keep open in PostgREST's database pool. .. _db-pool-acquisition-timeout: @@ -300,6 +328,14 @@ db-pool db-pool-acquisition-timeout --------------------------- + =============== ================================= + **Type** Int + **Default** 10 + **Reloadable** N + **Environment** PGRST_DB_POOL_ACQUISITION_TIMEOUT + **In-Database** `n/a` + =============== ================================= + Specifies the maximum time in seconds that the request will wait for the pool to free up a connection slot to the database. .. _db-pool-max-idletime: @@ -307,6 +343,14 @@ db-pool-acquisition-timeout db-pool-max-idletime -------------------- + =============== ================================= + **Type** Int + **Default** 30 + **Reloadable** N + **Environment** PGRST_DB_POOL_MAX_IDLETIME + **In-Database** `n/a` + =============== ================================= + *For backwards compatibility, this config parameter is also available as “db-pool-timeout”.* Time in seconds to close idle pool connections. @@ -316,6 +360,14 @@ db-pool-max-idletime db-pool-max-lifetime -------------------- + =============== ================================= + **Type** Int + **Default** 1800 + **Reloadable** N + **Environment** PGRST_DB_POOL_MAX_LIFETIME + **In-Database** `n/a` + =============== ================================= + Specifies the maximum time in seconds of an existing connection in the pool. .. _db-pre-request: @@ -323,6 +375,14 @@ db-pool-max-lifetime db-pre-request -------------- + =============== ================================= + **Type** String + **Default** `n/a` + **Reloadable** Y + **Environment** PGRST_DB_PRE_REQUEST + **In-Database** pgrst.db_pre_request + =============== ================================= + *For backwards compatibility, this config parameter is also available without prefix as "pre-request".* A schema-qualified stored procedure name to call right after the :ref:`tx_settings` are set. See :ref:`pre-request`. @@ -332,6 +392,14 @@ db-pre-request db-prepared-statements ---------------------- + =============== ================================= + **Type** Boolean + **Default** True + **Reloadable** Y + **Environment** PGRST_DB_PREPARED_STATEMENTS + **In-Database** pgrst.db_prepared_statements + =============== ================================= + Enables or disables prepared statements. When disabled, the generated queries will be parameterized (invulnerable to SQL injection) but they will not be prepared (cached in the database session). Not using prepared statements will noticeably decrease performance, so it's recommended to always have this setting enabled. @@ -343,6 +411,14 @@ db-prepared-statements db-root-spec ------------ + =============== ================================= + **Type** String + **Default** `n/a` + **Reloadable** Y + **Environment** PGRST_DB_ROOT_SPEC + **In-Database** pgrst.db_root_spec + =============== ================================= + Function to override the OpenAPI response. See :ref:`override_openapi`. .. _db-schemas: @@ -350,6 +426,14 @@ db-root-spec db-schemas ---------- + =============== ================================= + **Type** String + **Default** public + **Reloadable** Y + **Environment** PGRST_DB_SCHEMAS + **In-Database** pgrst.db_schemas + =============== ================================= + *For backwards compatibility, this config parameter is also available in singular as "db-schema".* The list of database schemas to expose to clients. See :ref:`schemas`. @@ -359,6 +443,14 @@ db-schemas db-tx-end --------- + =============== ================================= + **Type** String + **Default** commit + **Reloadable** N + **Environment** PGRST_DB_TX_END + **In-Database** `n/a` + =============== ================================= + Specifies how to terminate the database transactions. .. code:: bash @@ -380,7 +472,19 @@ db-tx-end db-uri ------ - The standard connection PostgreSQL `URI format `_. Symbols and unusual characters in the password or other fields should be percent encoded to avoid a parse error. If enforcing an SSL connection to the database is required you can use `sslmode `_ in the URI, for example ``postgres://user:pass@host:5432/dbname?sslmode=require``. + =============== ================================= + **Type** String + **Default** postgresql:// + **Reloadable** N + **Environment** PGRST_DB_URI + **In-Database** `n/a` + =============== ================================= + + The standard connection PostgreSQL `URI format `_. Symbols and unusual characters in the password or other fields should be percent encoded to avoid a parse error. + + If enforcing an SSL connection to the database is required you can use `sslmode `_ in the URI, for example ``postgres://user:pass@host:5432/dbname?sslmode=require``. + + Any parameter that is not set in the connection string is read from `libpq environment variables `_. The default connection string is ``postgresql://``, which reads **all** parameters from the environment. The user with whom PostgREST connects to the database is also known as the ``authenticator`` role. For more information see :ref:`roles`. @@ -393,6 +497,14 @@ db-uri db-use-legacy-gucs ------------------ + =============== ================================= + **Type** Boolean + **Default** True + **Reloadable** Y + **Environment** PGRST_DB_USE_LEGACY_GUCS + **In-Database** pgrst.db_use_legacy_gucs + =============== ================================= + Determine if GUC request settings for headers, cookies and jwt claims use the `legacy names `_ (string with dashes, invalid starting from PostgreSQL v14) with text values instead of the :ref:`new names ` (string without dashes, valid on all PostgreSQL versions) with json values. On PostgreSQL versions 14 and above, this parameter is ignored. @@ -402,6 +514,14 @@ db-use-legacy-gucs jwt-aud ------- + =============== ================================= + **Type** String + **Default** `n/a` + **Reloadable** Y + **Environment** PGRST_JWT_AUD + **In-Database** pgrst.jwt_aud + =============== ================================= + Specifies the `JWT audience claim `_. If this claim is present in the client provided JWT then you must set this to the same value as in the JWT, otherwise verifying the JWT will fail. .. _jwt-role-claim-key: @@ -409,6 +529,14 @@ jwt-aud jwt-role-claim-key ------------------ + =============== ================================= + **Type** String + **Default** .role + **Reloadable** Y + **Environment** PGRST_JWT_ROLE_CLAIM_KEY + **In-Database** pgrst.jwt_role_claim_key + =============== ================================= + *For backwards compatibility, this config parameter is also available without prefix as "role-claim-key".* A JSPath DSL that specifies the location of the :code:`role` key in the JWT claims. This can be used to consume a JWT provided by a third party service like Auth0, Okta or Keycloak. Usage examples: @@ -428,6 +556,14 @@ jwt-role-claim-key jwt-secret ---------- + =============== ================================= + **Type** String + **Default** `n/a` + **Reloadable** Y + **Environment** PGRST_JWT_SECRET + **In-Database** pgrst.jwt_secret + =============== ================================= + The secret or `JSON Web Key (JWK) (or set) `_ used to decode JWT tokens clients provide for authentication. For security the key must be **at least 32 characters long**. If this parameter is not specified then PostgREST refuses authentication requests. Choosing a value for this parameter beginning with the at sign such as :code:`@filename` loads the secret out of an external file. This is useful for automating deployments. Note that any binary secrets must be base64 encoded. Both symmetric and asymmetric cryptography are supported. For more info see :ref:`asym_keys`. Choosing a value for this parameter beginning with the at sign such as ``@filename`` (e.g. ``@./configs/my-config``) loads the secret out of an external file. @@ -441,6 +577,14 @@ jwt-secret jwt-secret-is-base64 -------------------- + =============== ================================= + **Type** Boolean + **Default** False + **Reloadable** Y + **Environment** PGRST_JWT_SECRET_IS_BASE64 + **In-Database** pgrst.jwt_secret_is_base64 + =============== ================================= + When this is set to :code:`true`, the value derived from :code:`jwt-secret` will be treated as a base64 encoded secret. .. _log-level: @@ -448,6 +592,14 @@ jwt-secret-is-base64 log-level --------- + =============== ================================= + **Type** String + **Default** error + **Reloadable** N + **Environment** PGRST_LOG_LEVEL + **In-Database** `n/a` + =============== ================================= + Specifies the level of information to be logged while running PostgREST. .. code:: bash @@ -472,6 +624,14 @@ log-level openapi-mode ------------ + =============== ================================= + **Type** String + **Default** follow-privileges + **Reloadable** Y + **Environment** PGRST_OPENAPI_MODE + **In-Database** pgrst.openapi_mode + =============== ================================= + Specifies how the OpenAPI output should be displayed. .. code:: bash @@ -493,6 +653,14 @@ openapi-mode openapi-security-active ----------------------- + =============== ================================= + **Type** Boolean + **Default** False + **Reloadable** Y + **Environment** PGRST_OPENAPI_SECURITY_ACTIVE + **In-Database** pgrst.openapi_security_active + =============== ================================= + When this is set to :code:`true`, security options are included in the :ref:`OpenAPI output `. .. _openapi-server-proxy-uri: @@ -500,6 +668,14 @@ When this is set to :code:`true`, security options are included in the :ref:`Ope openapi-server-proxy-uri ------------------------ + =============== ================================= + **Type** String + **Default** `n/a` + **Reloadable** N + **Environment** PGRST_OPENAPI_SERVER_PROXY_URI + **In-Database** pgrst.openapi_server_proxy_uri + =============== ================================= + Overrides the base URL used within the OpenAPI self-documentation hosted at the API root path. Use a complete URI syntax :code:`scheme:[//[user:password@]host[:port]][/]path[?query][#fragment]`. Ex. :code:`https://postgrest.com` .. code:: json @@ -523,6 +699,14 @@ openapi-server-proxy-uri raw-media-types --------------- + =============== ================================= + **Type** String + **Default** `n/a` + **Reloadable** Y + **Environment** PGRST_RAW_MEDIA_TYPES + **In-Database** pgrst.raw_media_types + =============== ================================= + This serves to extend the `Media Types `_ that PostgREST currently accepts through an ``Accept`` header. These media types can be requested by following the same rules as the ones defined in :ref:`scalar_return_formats`. @@ -539,6 +723,14 @@ raw-media-types server-host ----------- + =============== ================================= + **Type** String + **Default** !4 + **Reloadable** N + **Environment** PGRST_SERVER_HOST + **In-Database** `n/a` + =============== ================================= + Where to bind the PostgREST web server. In addition to the usual address options, PostgREST interprets these reserved addresses with special meanings: * :code:`*` - any IPv4 or IPv6 hostname @@ -552,6 +744,14 @@ server-host server-port ----------- + =============== ================================= + **Type** Int + **Default** 3000 + **Reloadable** N + **Environment** PGRST_SERVER_PORT + **In-Database** `n/a` + =============== ================================= + The TCP port to bind the web server. .. _server-trace-header: @@ -559,6 +759,14 @@ server-port server-trace-header ------------------- + =============== ================================= + **Type** String + **Default** `n/a` + **Reloadable** Y + **Environment** PGRST_SERVER_TRACE_HEADER + **In-Database** pgrst.server_trace_header + =============== ================================= + The header name used to trace HTTP requests. See :ref:`trace_header`. .. _server-unix-socket: @@ -566,6 +774,14 @@ server-trace-header server-unix-socket ------------------ + =============== ================================= + **Type** String + **Default** `n/a` + **Reloadable** N + **Environment** PGRST_SERVER_UNIX_SOCKET + **In-Database** `n/a` + =============== ================================= + `Unix domain socket `_ where to bind the PostgREST web server. If specified, this takes precedence over :ref:`server-port`. Example: @@ -578,6 +794,14 @@ server-unix-socket server-unix-socket-mode ----------------------- + =============== ================================= + **Type** String + **Default** 660 + **Reloadable** N + **Environment** PGRST_SERVER_UNIX_SOCKET_MODE + **In-Database** `n/a` + =============== ================================= + `Unix file mode `_ to be set for the socket specified in :ref:`server-unix-socket` Needs to be a valid octal between 600 and 777. diff --git a/docs/references/connection_pool.rst b/docs/references/connection_pool.rst index aa0a904f62..db7ed01601 100644 --- a/docs/references/connection_pool.rst +++ b/docs/references/connection_pool.rst @@ -16,7 +16,7 @@ Dynamic Connection Pool To conserve system resources, PostgREST uses a dynamic connection pool. This enables the number of connections in the pool to increase and decrease depending on request traffic. - If all the connections are being used, a new connection is added. The pool can grow until it reaches the :ref:`db-pool` size. Note that it’s pointless to set this higher than the ``max_connections`` setting in your database. -- If a connection is unused for a period of time (determined by :ref:`db-pool-max-idletime`, 30 seconds by default), it will be released. +- If a connection is unused for a period of time (:ref:`db-pool-max-idletime`), it will be released. Connection lifetime ------------------- @@ -24,13 +24,13 @@ Connection lifetime Long-lived PostgreSQL connections can consume considerable memory (see `here `_ for more details). Under a busy system, the :ref:`db-pool-max-idletime` won't be reached and the connection pool can be full of long-lived connections. -To avoid this problem and save resources, a connection max lifetime (determined by :ref:`db-pool-max-lifetime`, 30 minutes by default) is enforced. +To avoid this problem and save resources, a connection max lifetime (:ref:`db-pool-max-lifetime`) is enforced. After the max lifetime is reached, connections from the pool will be released and new ones will be created. This doesn't affect running requests, only unused connections will be released. Acquisition Timeout ------------------- -If all the available connections in the pool are busy, an HTTP request will wait until reaching a timeout (determined by :ref:`db-pool-acquisition-timeout`, 10 seconds by default). +If all the available connections in the pool are busy, an HTTP request will wait until reaching a timeout (:ref:`db-pool-acquisition-timeout`). If the request reaches the timeout, it will be aborted with the following response: diff --git a/postgrest.dict b/postgrest.dict index 685cc788ff..cc6bc534ff 100644 --- a/postgrest.dict +++ b/postgrest.dict @@ -17,7 +17,8 @@ cd centric changelog coercible -Cloudfare +conf +Cloudflare config CORS CPUs @@ -124,6 +125,7 @@ postgrest PostgREST's pre preflight +plpgsql psql Qin RabbitMQ From 1b036dfab9b42dce24af76f74546cefda07747d3 Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Fri, 4 Aug 2023 18:18:23 -0500 Subject: [PATCH 627/711] release page for v11.2.0 Closes #644 --- docs/releases/v11.2.0.rst | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 docs/releases/v11.2.0.rst diff --git a/docs/releases/v11.2.0.rst b/docs/releases/v11.2.0.rst new file mode 100644 index 0000000000..48809ae620 --- /dev/null +++ b/docs/releases/v11.2.0.rst @@ -0,0 +1,4 @@ +11.2.0 +====== + +Starting from this version, the release notes will be posted on PostgREST's GitHub release page. Please see https://github.com/PostgREST/postgrest/releases/tag/v11.2.0. From e82dc41a6a691d258e7378d58cc4426511ad71de Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Fri, 4 Aug 2023 18:36:38 -0500 Subject: [PATCH 628/711] add link to github discussions closes #401 --- docs/index.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/index.rst b/docs/index.rst index 4020d61959..d803c4a34c 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -90,7 +90,7 @@ PostgREST has a focused scope. It works well with other tools like Nginx. This f Getting Support ---------------- -The project has a friendly and growing community. Join our `chat room `_ for discussion and help. You can also report or search for bugs/features on the Github `issues `_ page. +The project has a friendly and growing community. For discussions, use the Github `discussions page `_ or join our `chat room `_. You can also report or search for bugs/features on the Github `issues `_ page. .. toctree:: :glob: From 43a8745e628454f52ce44dc3ffd63326f9bf03f5 Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Fri, 4 Aug 2023 19:09:47 -0500 Subject: [PATCH 629/711] link connection string from connection pool Closes #647 --- docs/references/connection_pool.rst | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/docs/references/connection_pool.rst b/docs/references/connection_pool.rst index db7ed01601..0876dbd270 100644 --- a/docs/references/connection_pool.rst +++ b/docs/references/connection_pool.rst @@ -7,6 +7,11 @@ A connection pool is a cache of reusable database connections. It allows serving Minimizing connections is paramount to performance. Each PostgreSQL connection creates a process, having too many can exhaust available resources. +Connection String +----------------- + +For connecting to the database, the pool requires a connection string. You can can configure it using :ref:`db-uri`. + .. _pool_growth_limit: .. _dyn_conn_pool: From 291b6f3587b468a33e430455523ac22737b59fe5 Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Fri, 4 Aug 2023 19:38:21 -0500 Subject: [PATCH 630/711] add different ways to specify the connection string Closes #576 --- docs/references/configuration.rst | 34 ++++++++++++++++++++++++++----- postgrest.dict | 1 + 2 files changed, 30 insertions(+), 5 deletions(-) diff --git a/docs/references/configuration.rst b/docs/references/configuration.rst index 338e0aa1b9..e0c4864ef3 100644 --- a/docs/references/configuration.rst +++ b/docs/references/configuration.rst @@ -480,18 +480,42 @@ db-uri **In-Database** `n/a` =============== ================================= - The standard connection PostgreSQL `URI format `_. Symbols and unusual characters in the password or other fields should be percent encoded to avoid a parse error. + The standard `PostgreSQL connection string `_, there are different ways to specify it: - If enforcing an SSL connection to the database is required you can use `sslmode `_ in the URI, for example ``postgres://user:pass@host:5432/dbname?sslmode=require``. +URI Format +~~~~~~~~~~ - Any parameter that is not set in the connection string is read from `libpq environment variables `_. The default connection string is ``postgresql://``, which reads **all** parameters from the environment. + .. code:: - The user with whom PostgREST connects to the database is also known as the ``authenticator`` role. For more information see :ref:`roles`. + "postgres://authenticator:mysecretpassword@localhost:5433/postgres?parameters=val" - When running PostgREST on the same machine as PostgreSQL, it is also possible to connect to the database using a `Unix socket `_ and the `Peer Authentication method `_ as an alternative to TCP/IP communication and authentication with a password, this also grants higher performance. To do this you can omit the host and the password, e.g. ``postgres://user@/dbname``, see the `libpq connection string `_ documentation for more details. + - Under this format symbols and unusual characters in the password or other fields should be percent encoded to avoid a parse error. + - If enforcing an SSL connection to the database is required you can use `sslmode `_ in the URI, for example ``postgres://user:pass@host:5432/dbname?sslmode=require``. + - The user with whom PostgREST connects to the database is also known as the ``authenticator`` role. For more information see :ref:`roles`. + - When running PostgREST on the same machine as PostgreSQL, it is also possible to connect to the database using a `Unix socket `_ and the `Peer Authentication method `_ as an alternative to TCP/IP communication and authentication with a password, this also grants higher performance. To do this you can omit the host and the password, e.g. ``postgres://user@/dbname``, see the `libpq connection string `_ documentation for more details. + +Keyword/Value Format +~~~~~~~~~~~~~~~~~~~~ + + .. code:: + + "host=localhost port=5433 user=authenticator password=mysecretpassword dbname=postgres" + +LIBPQ Environment Variables +~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + .. code:: + + PGHOST=localhost PGPORT=5433 PGUSER=authenticator PGDATABASE=postgres + + Any parameter that is not set in the above formats is read from `libpq environment variables `_. The default connection string is ``postgresql://``, which reads **all** parameters from the environment. + +External config file +~~~~~~~~~~~~~~~~~~~~ Choosing a value for this parameter beginning with the at sign such as ``@filename`` (e.g. ``@./configs/my-config``) loads the connection string out of an external file. + .. _db-use-legacy-gucs: db-use-legacy-gucs diff --git a/postgrest.dict b/postgrest.dict index cc6bc534ff..3d968a3fe0 100644 --- a/postgrest.dict +++ b/postgrest.dict @@ -78,6 +78,7 @@ localhost login lookups Logins +LIBPQ logins lon lt From a6f93f55b1c4196432d41f4b171a28f15972817f Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Fri, 4 Aug 2023 21:15:26 -0500 Subject: [PATCH 631/711] clear supported pg versions closes #592 --- docs/explanations/install.rst | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/docs/explanations/install.rst b/docs/explanations/install.rst index 6944803a80..df76e8aa58 100644 --- a/docs/explanations/install.rst +++ b/docs/explanations/install.rst @@ -55,6 +55,18 @@ You can also use your OS package manager. choco install postgrest scoop install postgrest + +.. _pg-dependency: + +Supported PostgreSQL versions +============================= + +=============== ================================= +**Supported** PostgreSQL >= 9.6 +=============== ================================= + +PostgREST works with all PostgreSQL versions starting from 9.6. + Running PostgREST ================= @@ -101,13 +113,6 @@ For a complete reference of the configuration file, see :ref:`configuration`. To test that the system path is set correctly, run ``pg_config`` from the command line. You should see it output a list of paths. -.. _pg-dependency: - -PostgreSQL dependency ---------------------- - -To use PostgREST you will need an underlying database. We require PostgreSQL 9.6 or greater. You can use something like `Amazon RDS `_ but installing your own locally is cheaper and more convenient for development. You can also run PostgreSQL in a :ref:`docker container`. - Docker ====== From 54bfefdb55fd45b529e7d9507f9485c14571a38b Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Fri, 4 Aug 2023 21:23:18 -0500 Subject: [PATCH 632/711] move heroku outside Installation --- docs/explanations/install.rst | 123 ---------------------------------- docs/integrations/heroku.rst | 122 +++++++++++++++++++++++++++++++++ 2 files changed, 122 insertions(+), 123 deletions(-) create mode 100644 docs/integrations/heroku.rst diff --git a/docs/explanations/install.rst b/docs/explanations/install.rst index df76e8aa58..fad838b60f 100644 --- a/docs/explanations/install.rst +++ b/docs/explanations/install.rst @@ -261,126 +261,3 @@ You can build PostgREST from source with `Stack `_: - - .. code-block:: bash - - # If you have multiple Heroku accounts, use flag '--interactive' to switch between them - heroku login --interactive - - -2. Create a new Heroku app using the PostgREST buildpack: - - .. code-block:: bash - - mkdir ${YOUR_APP_NAME} - cd ${YOUR_APP_NAME} - git init . - - heroku apps:create ${YOUR_APP_NAME} --buildpack https://github.com/PostgREST/postgrest-heroku.git - heroku git:remote -a ${YOUR_APP_NAME} - -3. Create a new Heroku PostgreSQL add-on attached to the app and keep notes of the assigned add-on name (e.g. :code:`postgresql-curly-58902`) referred later as ${HEROKU_PG_DB_NAME} - - .. code-block:: bash - - heroku addons:create heroku-postgresql:standard-0 -a ${YOUR_APP_NAME} - # wait until the add-on is available - heroku pg:wait -a ${YOUR_APP_NAME} - -4. Create the necessary user roles according to the - `PostgREST documentation `_: - - .. code-block:: bash - - heroku pg:credentials:create --name api_user -a ${YOUR_APP_NAME} - # use the following command to ensure the new credential state is active before attaching it - heroku pg:credentials -a ${YOUR_APP_NAME} - - heroku addons:attach ${HEROKU_PG_DB_NAME} --credential api_user -a ${YOUR_APP_NAME} - -5. Connect to the PostgreSQL database and create some sample data: - - .. code-block:: bash - - heroku psql -a ${YOUR_APP_NAME} - - .. code-block:: postgres - - # from the psql command prompt execute the following commands: - create schema api; - - create table api.todos ( - id serial primary key, - done boolean not null default false, - task text not null, - due timestamptz - ); - - insert into api.todos (task) values - ('finish tutorial 0'), ('pat self on back'); - - grant usage on schema api to api_user; - grant select on api.todos to api_user; - -6. Create the :code:`Procfile`: - - .. code-block:: bash - - web: PGRST_SERVER_HOST=0.0.0.0 PGRST_SERVER_PORT=${PORT} PGRST_DB_URI=${PGRST_DB_URI:-${DATABASE_URL}} ./postgrest-${POSTGREST_VER} - .. - - Set the following environment variables on Heroku: - - .. code-block:: bash - - heroku config:set POSTGREST_VER=10.0.0 - heroku config:set PGRST_DB_SCHEMA=api - heroku config:set PGRST_DB_ANON_ROLE=api_user - .. - - PGRST_DB_URI can be set if an external database is used or if it's different from the default Heroku DATABASE_URL. This latter is used if nothing is provided. - POSTGREST_VER is mandatory to select and build the required PostgREST release. - - See https://postgrest.org/en/stable/configuration.html#environment-variables for the full list of environment variables. - -7. Build and deploy your app: - - .. code-block:: bash - - git add Procfile - git commit -m "PostgREST on Heroku" - git push heroku master - .. - - Your Heroku app should be live at :code:`${YOUR_APP_NAME}.herokuapp.com` - -8. Test your app - - From a terminal display the application logs: - - .. code-block:: bash - - heroku logs -t - .. - - From a different terminal retrieve with curl the records previously created: - - .. code-block:: bash - - curl https://${YOUR_APP_NAME}.herokuapp.com/todos - .. - - and test that any attempt to modify the table via a read-only user is not allowed: - - .. code-block:: bash - - curl https://${YOUR_APP_NAME}.herokuapp.com/todos -X POST \ - -H "Content-Type: application/json" \ - -d '{"task": "do bad thing"}' diff --git a/docs/integrations/heroku.rst b/docs/integrations/heroku.rst new file mode 100644 index 0000000000..614950c1d3 --- /dev/null +++ b/docs/integrations/heroku.rst @@ -0,0 +1,122 @@ +.. _deploy_heroku: + +Heroku +====== + +1. Log into Heroku using the `Heroku CLI `_: + + .. code-block:: bash + + # If you have multiple Heroku accounts, use flag '--interactive' to switch between them + heroku login --interactive + + +2. Create a new Heroku app using the PostgREST buildpack: + + .. code-block:: bash + + mkdir ${YOUR_APP_NAME} + cd ${YOUR_APP_NAME} + git init . + + heroku apps:create ${YOUR_APP_NAME} --buildpack https://github.com/PostgREST/postgrest-heroku.git + heroku git:remote -a ${YOUR_APP_NAME} + +3. Create a new Heroku PostgreSQL add-on attached to the app and keep notes of the assigned add-on name (e.g. :code:`postgresql-curly-58902`) referred later as ${HEROKU_PG_DB_NAME} + + .. code-block:: bash + + heroku addons:create heroku-postgresql:standard-0 -a ${YOUR_APP_NAME} + # wait until the add-on is available + heroku pg:wait -a ${YOUR_APP_NAME} + +4. Create the necessary user roles according to the + `PostgREST documentation `_: + + .. code-block:: bash + + heroku pg:credentials:create --name api_user -a ${YOUR_APP_NAME} + # use the following command to ensure the new credential state is active before attaching it + heroku pg:credentials -a ${YOUR_APP_NAME} + + heroku addons:attach ${HEROKU_PG_DB_NAME} --credential api_user -a ${YOUR_APP_NAME} + +5. Connect to the PostgreSQL database and create some sample data: + + .. code-block:: bash + + heroku psql -a ${YOUR_APP_NAME} + + .. code-block:: postgres + + # from the psql command prompt execute the following commands: + create schema api; + + create table api.todos ( + id serial primary key, + done boolean not null default false, + task text not null, + due timestamptz + ); + + insert into api.todos (task) values + ('finish tutorial 0'), ('pat self on back'); + + grant usage on schema api to api_user; + grant select on api.todos to api_user; + +6. Create the :code:`Procfile`: + + .. code-block:: bash + + web: PGRST_SERVER_HOST=0.0.0.0 PGRST_SERVER_PORT=${PORT} PGRST_DB_URI=${PGRST_DB_URI:-${DATABASE_URL}} ./postgrest-${POSTGREST_VER} + .. + + Set the following environment variables on Heroku: + + .. code-block:: bash + + heroku config:set POSTGREST_VER=10.0.0 + heroku config:set PGRST_DB_SCHEMA=api + heroku config:set PGRST_DB_ANON_ROLE=api_user + .. + + PGRST_DB_URI can be set if an external database is used or if it's different from the default Heroku DATABASE_URL. This latter is used if nothing is provided. + POSTGREST_VER is mandatory to select and build the required PostgREST release. + + See https://postgrest.org/en/stable/configuration.html#environment-variables for the full list of environment variables. + +7. Build and deploy your app: + + .. code-block:: bash + + git add Procfile + git commit -m "PostgREST on Heroku" + git push heroku master + .. + + Your Heroku app should be live at :code:`${YOUR_APP_NAME}.herokuapp.com` + +8. Test your app + + From a terminal display the application logs: + + .. code-block:: bash + + heroku logs -t + .. + + From a different terminal retrieve with curl the records previously created: + + .. code-block:: bash + + curl https://${YOUR_APP_NAME}.herokuapp.com/todos + .. + + and test that any attempt to modify the table via a read-only user is not allowed: + + .. code-block:: bash + + curl https://${YOUR_APP_NAME}.herokuapp.com/todos -X POST \ + -H "Content-Type: application/json" \ + -d '{"task": "do bad thing"}' From b0aaf7afe851a6f2ab864bbca0de29b91afd85c0 Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Fri, 4 Aug 2023 22:32:20 -0500 Subject: [PATCH 633/711] mention header names are lowercased Closes #627 --- docs/references/transactions.rst | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docs/references/transactions.rst b/docs/references/transactions.rst index 85f462fa23..1e732cd7ad 100644 --- a/docs/references/transactions.rst +++ b/docs/references/transactions.rst @@ -113,6 +113,10 @@ Request Headers, Cookies and JWT claims PostgREST stores the headers, cookies and headers as JSON. To get them: +.. important:: + + The headers names are lowercased. e.g. If the request sends ``User-Agent: x`` this will be obtainable as ``current_setting('request.headers', true)::json->>'user-agent'``. + .. code-block:: postgresql -- To get all the headers sent in the request From 459f3f817396aa3711546a22e6457c93b0a54a36 Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Fri, 4 Aug 2023 22:43:22 -0500 Subject: [PATCH 634/711] add apache apisix tutorial --- docs/ecosystem.rst | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/ecosystem.rst b/docs/ecosystem.rst index da7b4eb668..423f0341ba 100644 --- a/docs/ecosystem.rst +++ b/docs/ecosystem.rst @@ -20,6 +20,8 @@ Community Tutorials * `Build data-driven applications with Workers and PostgreSQL `_ - A tutorial on how to integrate with PostgREST and PostgreSQL using Cloudflare Workers. +* `A poor man's API `_ - Shows how to integrate PostgREST with Apache APISIX as an alternative to Nginx. + .. _templates: Templates From afee9b73a477b5655c304d44f0b5692fe5dc1412 Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Fri, 4 Aug 2023 23:08:52 -0500 Subject: [PATCH 635/711] add return=minimal and organize other returns Closes #624 --- docs/references/api/tables_views.rst | 111 +++++++++++++++++++++------ 1 file changed, 89 insertions(+), 22 deletions(-) diff --git a/docs/references/api/tables_views.rst b/docs/references/api/tables_views.rst index 3d4bb9b31f..469ad612f0 100644 --- a/docs/references/api/tables_views.rst +++ b/docs/references/api/tables_views.rst @@ -693,60 +693,100 @@ HEAD A HEAD method will behave identically to GET except that no body will be returned (`RFC 2616 `_) . As an optimization, the generated query won't execute an aggregate (to avoid unnecessary data transfer). -.. _update: +.. _insert: -Update +Insert ====== -To update a row or rows in a table, use the PATCH verb. Use :ref:`h_filter` to specify which record(s) to update. Here is an example query setting the :code:`category` column to child for all people below a certain age. +All tables and `auto-updatable views `_ can be modified through the API, subject to permissions of the requester's database role. + +To create a row in a database table post a JSON object whose keys are the names of the columns you would like to create. Missing properties will be set to default values when applicable. .. tabs:: .. code-tab:: http - PATCH /people?age=lt.13 HTTP/1.1 + POST /table_name HTTP/1.1 - { "category": "child" } + { "col1": "value1", "col2": "value2" } .. code-tab:: bash Curl - curl "http://localhost:3000/people?age=lt.13" \ - -X PATCH -H "Content-Type: application/json" \ - -d '{ "category": "child" }' + curl "http://localhost:3000/table_name" \ + -X POST -H "Content-Type: application/json" \ + -d '{ "col1": "value1", "col2": "value2" }' -Updates also support :code:`Prefer: return=representation` plus :ref:`v_filter`. +.. code:: -.. warning:: + HTTP/1.1 201 Created - Beware of accidentally updating every row in a table. To learn to prevent that see :ref:`block_fulltable`. +No request body will be returned by default. -.. _insert: +.. note:: -Insert -====== + You can use the ``Prefer: return=minimal`` header to get the same behavior. This is only provided for completeness because it's basically a no-op. -All tables and `auto-updatable views `_ can be modified through the API, subject to permissions of the requester's database role. +Prefer: return=headers-only +--------------------------- -To create a row in a database table post a JSON object whose keys are the names of the columns you would like to create. Missing properties will be set to default values when applicable. +If the table has a primary key, the response can contain a :code:`Location` header describing where to find the new object by including the header :code:`Prefer: return=headers-only` in the request. Make sure that the table is not write-only, otherwise constructing the :code:`Location` header will cause a permissions error. .. tabs:: .. code-tab:: http - POST /table_name HTTP/1.1 + POST /projects HTTP/1.1 + Prefer: return=headers-only - { "col1": "value1", "col2": "value2" } + {"id":33, "name": "x"} .. code-tab:: bash Curl - curl "http://localhost:3000/table_name" \ - -X POST -H "Content-Type: application/json" \ - -d '{ "col1": "value1", "col2": "value2" }' + curl "http://localhost:3000/projects" \ + -X POST -H "Content-Type: application/json" -H "Prefer: return=headers-only" \ + -d '{"id":33, "name": "x"}' -If the table has a primary key, the response can contain a :code:`Location` header describing where to find the new object by including the header :code:`Prefer: return=headers-only` in the request. Make sure that the table is not write-only, otherwise constructing the :code:`Location` header will cause a permissions error. +.. code-block:: http + + HTTP/1.1 201 Created + Location: /projects?id=eq.34 + +Prefer: return=representation +----------------------------- On the other end of the spectrum you can get the full created object back in the response to your request by including the header :code:`Prefer: return=representation`. That way you won't have to make another HTTP call to discover properties that may have been filled in on the server side. You can also apply the standard :ref:`v_filter` to these results. +.. tabs:: + + .. code-tab:: http + + POST /projects HTTP/1.1 + Content-Type: application/json; charset=utf-8 + Prefer: return=representation + + {"id":33, "name": "x"} + + .. code-tab:: bash Curl + + curl "http://localhost:3000/projects" \ + -X POST -H "Content-Type: application/json" -H "Prefer: return=representation" \ + -d '{"id":33, "name": "x"}' + +.. code:: + + HTTP/1.1 201 Created + Transfer-Encoding: chunked + + [ + { + "id": 33, + "name": "x" + } + ] + +x-www-form-urlencoded +--------------------- + URL encoded payloads can be posted with ``Content-Type: application/x-www-form-urlencoded``. .. tabs:: @@ -952,6 +992,33 @@ In this case, only **source**, **publication_date** and **figure** will be inser Using this also has the side-effect of being more efficient for :ref:`bulk_insert` since PostgREST will not process the JSON and it'll send it directly to PostgreSQL. +.. _update: + +Update +====== + +To update a row or rows in a table, use the PATCH verb. Use :ref:`h_filter` to specify which record(s) to update. Here is an example query setting the :code:`category` column to child for all people below a certain age. + +.. tabs:: + + .. code-tab:: http + + PATCH /people?age=lt.13 HTTP/1.1 + + { "category": "child" } + + .. code-tab:: bash Curl + + curl "http://localhost:3000/people?age=lt.13" \ + -X PATCH -H "Content-Type: application/json" \ + -d '{ "category": "child" }' + +Updates also support :code:`Prefer: return=representation` plus :ref:`v_filter`. + +.. warning:: + + Beware of accidentally updating every row in a table. To learn to prevent that see :ref:`block_fulltable`. + .. _upsert: Upsert From 49d4b9b7db4d50b3851c6467a78c331db44d94ae Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Fri, 4 Aug 2023 23:11:12 -0500 Subject: [PATCH 636/711] fix dict --- postgrest.dict | 3 +++ 1 file changed, 3 insertions(+) diff --git a/postgrest.dict b/postgrest.dict index 3d968a3fe0..c5070d1dd6 100644 --- a/postgrest.dict +++ b/postgrest.dict @@ -1,6 +1,7 @@ personal_ws-1.1 en 0 utf-8 api API's +APISIX Archlinux aud Auth @@ -186,6 +187,7 @@ Upsert upsert uri url +urlencoded urls variadic verifier @@ -197,4 +199,5 @@ websearch Websockets webuser wfts +www Zac From 095d43ff75a4701e0e8beb9f841a30249a9557fd Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Fri, 4 Aug 2023 23:51:41 -0500 Subject: [PATCH 637/711] add dynamic schemas example Closes #644 --- docs/references/api/schemas.rst | 49 +++++++++++++++++++++++++++++++ docs/references/configuration.rst | 2 +- 2 files changed, 50 insertions(+), 1 deletion(-) diff --git a/docs/references/api/schemas.rst b/docs/references/api/schemas.rst index 359f5c9592..4c62de4513 100644 --- a/docs/references/api/schemas.rst +++ b/docs/references/api/schemas.rst @@ -105,3 +105,52 @@ You can only switch to a schema included in :ref:`db-schemas`. Using another sch "message":"The schema must be one of the following: tenant1, tenant2" } + +Dynamic schemas +~~~~~~~~~~~~~~~ + +To add schemas dynamically, you can use :ref:`in_db_config` plus :ref:`config reloading ` and :ref:`schema cache reloading `. Here are some options for how to do this: + +- If the schemas' names have a pattern, like a ``tenant_`` prefix, do: + +.. code-block:: postgresql + + create or replace function postgrest.pre_config() + returns void as $$ + select + set_config('pgrst.db_schemas', string_agg(nspname, ','), true) + from pg_namespace + where nspname like 'tenant_%'; + $$ language sql; + +- If there's no name pattern but they're created with a particular role (``CREATE SCHEMA mine AUTHORIZATION joe``), do: + +.. code-block:: postgresql + + create or replace function postgrest.pre_config() + returns void as $$ + select + set_config('pgrst.db_schemas', string_agg(nspname, ','), true) + from pg_namespace + where nspowner = 'joe'::regrole; + $$ language sql; + +- Otherwise, you might need to create a table that stores the allowed schemas. + +.. code-block:: postgresql + + create table postgrest.config (schemas text); + + create or replace function postgrest.pre_config() + returns void as $$ + select + set_config('pgrst.db_schemas', schemas, true) + from postgrest.config; + $$ language sql; + +Then each time you add an schema, do: + +.. code-block:: postgresql + + NOTIFY pgrst, 'reload config'; + NOTIFY pgrst, 'reload schema'; diff --git a/docs/references/configuration.rst b/docs/references/configuration.rst index e0c4864ef3..5da6db953a 100644 --- a/docs/references/configuration.rst +++ b/docs/references/configuration.rst @@ -255,7 +255,7 @@ db-pre-config **In-Database** pgrst.db_pre_config =============== ======================= - Name of the function that does in-database configuration. + Name of the function that does :ref:`in_db_config`. .. _db-extra-search-path: From 637165ba5bd88d02f4e20076b4b6c50f1f24fa37 Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Sun, 6 Aug 2023 21:00:16 -0500 Subject: [PATCH 638/711] use the foreign key join term --- docs/references/api/resource_embedding.rst | 327 +++++++++++---------- 1 file changed, 174 insertions(+), 153 deletions(-) diff --git a/docs/references/api/resource_embedding.rst b/docs/references/api/resource_embedding.rst index be4ea15f2f..18c1076bf1 100644 --- a/docs/references/api/resource_embedding.rst +++ b/docs/references/api/resource_embedding.rst @@ -5,19 +5,31 @@ Resource Embedding PostgREST allows including related resources in a single API call. This reduces the need for many API requests. -**Foreign Keys** determine which tables and views can be returned together. For example, consider a database of films and their awards: +.. _fk_join: -.. image:: ../../_static/film.png +Foreign Key Joins +================= + +The server uses **Foreign Keys** to determine which tables and views can be joined together. + +- For joining tables, it reads foreign keys (respecting composite keys) and generates a join condition based on the foreign key columns. +- For joining views, it reads the base tables of the views' definition, and generates a join condition based on the foreign key columns of the base tables. .. important:: - - PostgREST respects composite foreign keys. - Whenever foreign keys change you must do :ref:`schema_reloading` for this feature to work. +Relationships +============= + +For example, consider a database of films and their awards: + +.. image:: ../../_static/film.png + .. _many-to-one: Many-to-one relationships -========================= +------------------------- Since ``films`` has a **foreign key** to ``directors``, this establishes a many-to-one relationship. Thus, we're able to request all the films and the director for each film. @@ -83,7 +95,7 @@ Since the table name is plural, we can be more accurate by making it singular wi .. _one-to-many: One-to-many relationships -========================= +------------------------- The **foreign key reference** establishes the inverse one-to-many relationship. In this case, ``films`` returns as a JSON array because of the “to-many” end. @@ -120,7 +132,7 @@ The **foreign key reference** establishes the inverse one-to-many relationship. .. _many-to-many: Many-to-many relationships -========================== +-------------------------- The join table determines many-to-many relationships. It must contain foreign keys to other two tables and they must be part of its composite key. @@ -168,7 +180,7 @@ For the many-to-many relationship between ``films`` and ``actors``, the join tab .. _one-to-one: One-to-one relationships -======================== +------------------------ One-to-one relationships are detected in two ways. @@ -220,7 +232,7 @@ One-to-one relationships are detected in two ways. Computed Relationships ====================== -You can manually define relationships between resources using functions. This is useful for database objects that can't define foreign keys, like `Foreign Data Wrappers `_. +You can manually define relationships between using functions. This is useful for database objects that can't define foreign keys, like `Foreign Data Wrappers `_. Assuming there's a foreign table ``premieres`` that we want to relate to ``films``. @@ -325,13 +337,21 @@ Computed relationships have good performance as their intended design enable `in .. _target_disamb: .. _complex_rels: -Complex Relationships -===================== +FK Joins on Multiple Foreign Key Relationships +============================================== + +When there are multiple foreign keys between tables, :ref:`fk_join` need disambiguation to resolve which foreign key columns to use for the join. -As mentioned on :ref:`resource_embedding`, the server does joins based on **Foreign Keys**. -When there are many foreign keys between tables, it needs disambiguation to resolve which foreign key columns to use for the join. +.. code:: -:ref:`computed_relationships` can do the job here, they can choose join columns arbitrarily. + HTTP/1.1 300 Multiple Choices + + { + "code": "PGRST201", + "details": [ "..." ], + "hint": "...", + "message": "Could not embed because more than one relationship was found for 'sites' and 'big_projects'" + } .. note:: @@ -365,7 +385,7 @@ Multiple Many-To-One shipping_address_id int references addresses(id) ); -To successfully embed ``orders`` with ``addresses``, you need to create computed relationships for the foreign keys columns you want to use: +To successfully join ``orders`` with ``addresses``, you need to create computed relationships for the foreign keys columns you want to use: .. code-block:: postgresql @@ -377,7 +397,7 @@ To successfully embed ``orders`` with ``addresses``, you need to create computed select * from addresses where id = $1.shipping_address_id $$ stable language sql; -Now, we can unambiguously embed the billing and shipping addresses. +Now, we can unambiguously join the billing and shipping addresses. .. tabs:: @@ -409,7 +429,7 @@ Multiple One-To-Many -------------------- Let's take the tables from :ref:`multiple_m2o`. -To embed ``addresses`` with ``orders``, you need to create computed relationships like these ones: +To join ``addresses`` with ``orders``, you need to create computed relationships like these ones: .. code-block:: postgresql @@ -669,6 +689,144 @@ Then, the request would be: } ] +.. _embedding_partitioned_tables: + +FK Joins on Partitioned Tables +============================== + +Foreign Key joins can also be done between `partitioned tables `_ and other tables. + +For example, let's create the ``box_office`` partitioned table that has the gross daily revenue of a film: + +.. code-block:: postgres + + CREATE TABLE box_office ( + bo_date DATE NOT NULL, + film_id INT REFERENCES test.films NOT NULL, + gross_revenue DECIMAL(12,2) NOT NULL, + PRIMARY KEY (bo_date, film_id) + ) PARTITION BY RANGE (bo_date); + + -- Let's also create partitions for each month of 2021 + + CREATE TABLE box_office_2021_01 PARTITION OF test.box_office + FOR VALUES FROM ('2021-01-01') TO ('2021-01-31'); + + CREATE TABLE box_office_2021_02 PARTITION OF test.box_office + FOR VALUES FROM ('2021-02-01') TO ('2021-02-28'); + + -- and so until december 2021 + +Since it contains the ``films_id`` foreign key, it is possible to join ``box_office`` and ``films``: + +.. tabs:: + + .. code-tab:: http + + GET /box_office?select=bo_date,gross_revenue,films(title)&gross_revenue=gte.1000000 HTTP/1.1 + + .. code-tab:: bash Curl + + curl "http://localhost:3000/box_office?select=bo_date,gross_revenue,films(title)&gross_revenue=gte.1000000" + +.. note:: + + * FK joins on partitions is not allowed because it leads to ambiguity errors (see :ref:`embed_disamb`) between them and their parent partitioned table. More details at `#1783(comment) `_). :ref:`computed_relationships` can be used if this is needed. + + * Partitioned tables can reference other tables since PostgreSQL 11 but can only be referenced from any other table since PostgreSQL 12. + +.. _embedding_views: + +FK Joins on Views +================= + +PostgREST will infer the relationships of a view based on its base tables. Base tables are the ones referenced in the ``FROM`` and ``JOIN`` clauses of the view definition. +The foreign keys of the relationships must be present in the top ``SELECT`` clause of the view for this to work. + +For instance, the following view has ``nominations``, ``films`` and ``competitions`` as base tables: + +.. code-block:: postgres + + CREATE VIEW nominations_view AS + SELECT + films.title as film_title + , competitions.name as competition_name + , nominations.rank + , nominations.film_id as nominations_film_id + , films.id as film_id + FROM nominations + JOIN films ON films.id = nominations.film_id + JOIN competitions ON competitions.id = nominations.competition_id; + +Since this view contains ``nominations.film_id``, which has a **foreign key** relationship to ``films``, then we can join the ``films`` table. Similarly, because the view contains ``films.id``, then we can also join the ``roles`` and the ``actors`` tables (the last one in a many-to-many relationship): + +.. tabs:: + + .. code-tab:: http + + GET /nominations_view?select=film_title,films(language),roles(character),actors(last_name,first_name)&rank=eq.5 HTTP/1.1 + + .. code-tab:: bash Curl + + curl "http://localhost:3000/nominations_view?select=film_title,films(language),roles(character),actors(last_name,first_name)&rank=eq.5" + +It's also possible to foreign key join `Materialized Views `_. + +.. important:: + + - It's not guaranteed that FK joins will work on all kinds of views. In particular, FK joins won't work on views that contain UNIONs. + + + Why? PostgREST detects base table foreign keys in the view by querying and parsing `pg_rewrite `_. + This may fail depending on the complexity of the view. + + As a workaround, you can use :ref:`computed_relationships` to define manual relationships for views. + + - If view definitions change you must refresh PostgREST's schema cache for this to work properly. See the section :ref:`schema_reloading`. + +.. _embedding_view_chains: + +FK Joins on Chains of Views +--------------------------- + +Views can also depend on other views, which in turn depend on the actual base table. For PostgREST to pick up those chains recursively to any depth, all the views must be in the search path, so either in the exposed schema (:ref:`db-schemas`) or in one of the schemas set in :ref:`db-extra-search-path`. This does not apply to the base table, which could be in a private schema as well. See :ref:`schema_isolation` for more details. + +.. _s_proc_embed: + +FK Joins on Table-Valued Functions +================================== + +If you have a :ref:`Stored Procedure ` that returns a table type, you can do a Foreign Key join on the result. + +Here's a sample function (notice the ``RETURNS SETOF films``). + +.. code-block:: plpgsql + + CREATE FUNCTION getallfilms() RETURNS SETOF films AS $$ + SELECT * FROM films; + $$ LANGUAGE SQL STABLE; + +A request with ``directors`` embedded: + +.. tabs:: + + .. code-tab:: http + + GET /rpc/getallfilms?select=title,directors(id,last_name)&title=like.*Workers* HTTP/1.1 + + .. code-tab:: bash Curl + + curl "http://localhost:3000/rpc/getallfilms?select=title,directors(id,last_name)&title=like.*Workers*" + +.. code-block:: json + + [ + { "title": "Workers Leaving The Lumière Factory In Lyon", + "directors": { + "id": 2, + "last_name": "Lumière" + } + } + ] + .. _nested_embedding: Nested Embedding @@ -981,143 +1139,6 @@ You can use this to get the columns of a join table in a many-to-many relationsh The spread operator ``...`` is borrowed from the Javascript `spread syntax `_. -.. _embedding_partitioned_tables: - -Embedding Partitioned Tables -============================ - -Embedding can also be done between `partitioned tables `_ and other tables. - -For example, let's create the ``box_office`` partitioned table that has the gross daily revenue of a film: - -.. code-block:: postgres - - CREATE TABLE box_office ( - bo_date DATE NOT NULL, - film_id INT REFERENCES test.films NOT NULL, - gross_revenue DECIMAL(12,2) NOT NULL, - PRIMARY KEY (bo_date, film_id) - ) PARTITION BY RANGE (bo_date); - - -- Let's also create partitions for each month of 2021 - - CREATE TABLE box_office_2021_01 PARTITION OF test.box_office - FOR VALUES FROM ('2021-01-01') TO ('2021-01-31'); - - CREATE TABLE box_office_2021_02 PARTITION OF test.box_office - FOR VALUES FROM ('2021-02-01') TO ('2021-02-28'); - - -- and so until december 2021 - -Since it contains the ``films_id`` foreign key, it is possible to embed ``box_office`` and ``films``: - -.. tabs:: - - .. code-tab:: http - - GET /box_office?select=bo_date,gross_revenue,films(title)&gross_revenue=gte.1000000 HTTP/1.1 - - .. code-tab:: bash Curl - - curl "http://localhost:3000/box_office?select=bo_date,gross_revenue,films(title)&gross_revenue=gte.1000000" - -.. note:: - - * Embedding on partitions is not allowed because it leads to ambiguity errors (see :ref:`embed_disamb`) between them and their parent partitioned table. More details at `#1783(comment) `_). :ref:`custom_queries` can be used if this is needed. - - * Partitioned tables can reference other tables since PostgreSQL 11 but can only be referenced from any other table since PostgreSQL 12. - -.. _embedding_views: - -Embedding Views -=============== - -PostgREST will infer the relationships of a view based on its source tables. Source tables are the ones referenced in the ``FROM`` and ``JOIN`` clauses of the view definition. The foreign keys of the relationships must be present in the top ``SELECT`` clause of the view for this to work. - -For instance, the following view has ``nominations``, ``films`` and ``competitions`` as source tables: - -.. code-block:: postgres - - CREATE VIEW nominations_view AS - SELECT - films.title as film_title - , competitions.name as competition_name - , nominations.rank - , nominations.film_id as nominations_film_id - , films.id as film_id - FROM nominations - JOIN films ON films.id = nominations.film_id - JOIN competitions ON competitions.id = nominations.competition_id; - -Since this view contains ``nominations.film_id``, which has a **foreign key** relationship to ``films``, then we can embed the ``films`` table. Similarly, because the view contains ``films.id``, then we can also embed the ``roles`` and the ``actors`` tables (the last one in a many-to-many relationship): - -.. tabs:: - - .. code-tab:: http - - GET /nominations_view?select=film_title,films(language),roles(character),actors(last_name,first_name)&rank=eq.5 HTTP/1.1 - - .. code-tab:: bash Curl - - curl "http://localhost:3000/nominations_view?select=film_title,films(language),roles(character),actors(last_name,first_name)&rank=eq.5" - -It's also possible to embed `Materialized Views `_. - -.. important:: - - - It's not guaranteed that all kinds of views will be embeddable. In particular, views that contain UNIONs will not be made embeddable. - - + Why? PostgREST detects source table foreign keys in the view by querying and parsing `pg_rewrite `_. - This may fail depending on the complexity of the view. - + As a workaround, you can use :ref:`computed_relationships` to define manual relationships for views. - - - If view definitions change you must refresh PostgREST's schema cache for this to work properly. See the section :ref:`schema_reloading`. - -.. _embedding_view_chains: - -Embedding Chains of Views -========================= - -Views can also depend on other views, which in turn depend on the actual source table. For PostgREST to pick up those chains recursively to any depth, all the views must be in the search path, so either in the exposed schema (:ref:`db-schemas`) or in one of the schemas set in :ref:`db-extra-search-path`. This does not apply to the source table, which could be in a private schema as well. See :ref:`schema_isolation` for more details. - -.. _s_proc_embed: - -Embedding on Stored Procedures -============================== - -If you have a :ref:`Stored Procedure ` that returns a table type, you can embed its related resources. - -Here's a sample function (notice the ``RETURNS SETOF films``). - -.. code-block:: plpgsql - - CREATE FUNCTION getallfilms() RETURNS SETOF films AS $$ - SELECT * FROM films; - $$ LANGUAGE SQL STABLE; - -A request with ``directors`` embedded: - -.. tabs:: - - .. code-tab:: http - - GET /rpc/getallfilms?select=title,directors(id,last_name)&title=like.*Workers* HTTP/1.1 - - .. code-tab:: bash Curl - - curl "http://localhost:3000/rpc/getallfilms?select=title,directors(id,last_name)&title=like.*Workers*" - -.. code-block:: json - - [ - { "title": "Workers Leaving The Lumière Factory In Lyon", - "directors": { - "id": 2, - "last_name": "Lumière" - } - } - ] - .. _mutation_embed: Embedding after Insertions/Updates/Deletions From 3f112553b08b0cc06793b42229658a8148c4ccce Mon Sep 17 00:00:00 2001 From: Laurence Isla Date: Mon, 7 Aug 2023 18:25:49 -0500 Subject: [PATCH 639/711] Add missing ERD/SQL tabs and fix some requests --- diagrams/README.md | 2 + diagrams/boxoffice.er | 15 ++ diagrams/employees.er | 5 + diagrams/film.er | 11 ++ diagrams/orders.er | 5 + diagrams/premieres.er | 16 ++ diagrams/presidents.er | 5 + diagrams/users.er | 5 + docs/_static/boxoffice.png | Bin 0 -> 11482 bytes docs/_static/employees.png | Bin 8244 -> 8550 bytes docs/_static/film.png | Bin 51752 -> 56781 bytes docs/_static/orders.png | Bin 17892 -> 16680 bytes docs/_static/premieres.png | Bin 0 -> 8990 bytes docs/_static/presidents.png | Bin 8331 -> 9166 bytes docs/_static/users.png | Bin 14073 -> 15354 bytes docs/references/api/resource_embedding.rst | 173 +++++++++++++-------- 16 files changed, 173 insertions(+), 64 deletions(-) create mode 100644 diagrams/boxoffice.er create mode 100644 diagrams/premieres.er create mode 100644 docs/_static/boxoffice.png create mode 100644 docs/_static/premieres.png diff --git a/diagrams/README.md b/diagrams/README.md index 67009dc31c..fa4a1e7fe9 100644 --- a/diagrams/README.md +++ b/diagrams/README.md @@ -8,6 +8,8 @@ You can go download erd from https://github.com/BurntSushi/erd/releases and then ./erd_static-x86-64 -i diagrams/film.er -o docs/_static/film.png ``` +The fonts used belong to the GNU FreeFont family. You can download them here: http://ftp.gnu.org/gnu/freefont/ + ## LaTeX The schema structure diagram is done with LaTeX. You can use a GUI like https://www.mathcha.io/editor to create the .tex file. diff --git a/diagrams/boxoffice.er b/diagrams/boxoffice.er new file mode 100644 index 0000000000..7d6b0a1c77 --- /dev/null +++ b/diagrams/boxoffice.er @@ -0,0 +1,15 @@ +entity {font: "FreeSans"} +relationship {font: "FreeMono"} + +[Box_Office] +*bo_date +*+film_id +gross_revenue + +[Films] +*id ++director_id +title +`...` + +Box_Office +--1 Films diff --git a/diagrams/employees.er b/diagrams/employees.er index 7010a670e6..4632f5bac5 100644 --- a/diagrams/employees.er +++ b/diagrams/employees.er @@ -1,3 +1,8 @@ +# Build using: -e ortho + +entity {font: "FreeSans"} +relationship {font: "FreeMono"} + [Employees] *id first_name diff --git a/diagrams/film.er b/diagrams/film.er index d19fdf61b5..cc54c4800c 100644 --- a/diagrams/film.er +++ b/diagrams/film.er @@ -1,3 +1,6 @@ +entity {font: "FreeSans"} +relationship {font: "FreeSerif"} + [Films] *id +director_id @@ -31,6 +34,12 @@ year *+film_id rank +[Technical_Specs] +*+film_id +runtime +camera +sound + Roles *--1 Actors Roles *--1 Films @@ -38,3 +47,5 @@ Nominations *--1 Competitions Nominations *--1 Films Films *--1 Directors + +Films 1--1 Technical_Specs diff --git a/diagrams/orders.er b/diagrams/orders.er index bdd93de2ef..86f0805e95 100644 --- a/diagrams/orders.er +++ b/diagrams/orders.er @@ -1,3 +1,8 @@ +# Build using: -e ortho + +entity {font: "FreeSans"} +relationship {font: "FreeMono"} + [Addresses] *id name diff --git a/diagrams/premieres.er b/diagrams/premieres.er new file mode 100644 index 0000000000..6099e74fd4 --- /dev/null +++ b/diagrams/premieres.er @@ -0,0 +1,16 @@ +entity {font: "FreeSans"} +relationship {font: "FreeMono"} + +[Premieres] +*id +location +date ++film_id + +[Films] +*id ++director_id +title +`...` + +Premieres *--1 Films diff --git a/diagrams/presidents.er b/diagrams/presidents.er index b491009615..ca7cf71ba1 100644 --- a/diagrams/presidents.er +++ b/diagrams/presidents.er @@ -1,3 +1,8 @@ +# Build using: -e ortho + +entity {font: "FreeSans"} +relationship {font: "FreeMono"} + [Presidents] *id first_name diff --git a/diagrams/users.er b/diagrams/users.er index e42ca312f4..8ec011302a 100644 --- a/diagrams/users.er +++ b/diagrams/users.er @@ -1,3 +1,8 @@ +# Build using: -e ortho + +entity {font: "FreeSans"} +relationship {font: "FreeMono"} + [Users] *id first_name diff --git a/docs/_static/boxoffice.png b/docs/_static/boxoffice.png new file mode 100644 index 0000000000000000000000000000000000000000..87249a6659f7c1f1a050f800fec72e16a52a441a GIT binary patch literal 11482 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 ODBij&mn&oX{67G^$XU1m literal 0 HcmV?d00001 diff --git a/docs/_static/employees.png b/docs/_static/employees.png index 0a72df2a28ccb7c5042db28cdbbc6a0a158874a1..b21153cc5af6c662788cceeef1871d096f57bd3d 100644 GIT binary patch literal 8550 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 diff --git a/docs/_static/film.png b/docs/_static/film.png index 99843b8709145b1f89bf14ea93b2134a9f2b4a2f..03b9b2b749d9d7cc2a3d1a98995ef8bd86796b79 100644 GIT binary patch literal 56781 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 literal 51752 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 HDWM4f7(Sx2 diff --git a/docs/_static/orders.png b/docs/_static/orders.png index db709c873da885c3c73b42678bbcc279f582c836..0ac19aacd2c7ddfe9cbf1ae6d670fc8725b76206 100644 GIT binary patch literal 16680 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 M>FVdQ&MBb@0J;5iXaE2J diff --git a/docs/_static/premieres.png b/docs/_static/premieres.png new file mode 100644 index 0000000000000000000000000000000000000000..794e96767de072d6414630fc9fbfbeb24d4f9d9b GIT binary patch literal 8990 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 A(EtDd literal 8331 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 bIxeu3dLq^aE+Yis^$3-_nhKS2mSO)3irzAo diff --git a/docs/_static/users.png b/docs/_static/users.png index f8b57fee753d46a31e6d918c868c8775fc8f97fb..d94f097fc01a41246fdc32b747369519bfe600e4 100644 GIT binary patch literal 15354 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 Y=eAoHZk`NIaNh`7NkxfbF$2H<1p%6R&;S4c diff --git a/docs/references/api/resource_embedding.rst b/docs/references/api/resource_embedding.rst index 18c1076bf1..63dda347e0 100644 --- a/docs/references/api/resource_embedding.rst +++ b/docs/references/api/resource_embedding.rst @@ -24,7 +24,56 @@ Relationships For example, consider a database of films and their awards: -.. image:: ../../_static/film.png +.. _erd_film: + +.. tabs:: + + .. group-tab:: ERD + + .. image:: ../../_static/film.png + + .. code-tab:: postgresql SQL + + create table actors( + id int primary key generated always as identity, + first_name text, + last_name text + ); + + create table directors( + id int primary key generated always as identity, + first_name text, + last_name text + ); + + create table films( + id int primary key generated always as identity, + director_id int references directors(id), + title text, + year int, + rating numeric(3,1), + language text + ); + + create table roles( + film_id int references films(id), + actor_id int references actors(id), + character text, + primary key(film_id, actor_id) + ); + + create table competitions( + id int primary key generated always as identity, + name text, + year int + ); + + create table nominations( + competition_id int references competitions(id), + film_id int references films(id), + rank int, + primary key (competition_id, film_id) + ); .. _many-to-one: @@ -136,24 +185,7 @@ Many-to-many relationships The join table determines many-to-many relationships. It must contain foreign keys to other two tables and they must be part of its composite key. -For the many-to-many relationship between ``films`` and ``actors``, the join table ``roles`` is: - -.. code-block:: postgresql - - create table roles( - film_id int references films(id) - , actor_id int references actors(id) - , primary key(film_id, actor_id) - ); - - -- the join table can also be detected if the composite key has additional columns - - create table roles( - id int generated always as identity, - , film_id int references films(id) - , actor_id int references actors(id) - , primary key(id, film_id, actor_id) - ); +Thus, it can detect the join table ``roles`` between ``films`` and ``actors``: .. tabs:: @@ -177,6 +209,18 @@ For the many-to-many relationship between ``films`` and ``actors``, the join tab ".." ] +The join table can also be detected if the composite key has additional columns: + +.. code-block:: postgresql + + create table roles( + id int generated always as identity, + , film_id int references films(id) + , actor_id int references actors(id) + , character text, + , primary key(id, film_id, actor_id) + ); + .. _one-to-one: One-to-one relationships @@ -184,38 +228,27 @@ One-to-one relationships One-to-one relationships are detected in two ways. +- When the foreign key is a primary key as specified in the :ref:`DB structure example `. - When the foreign key has a unique constraint. -.. code-block:: postgresql - - CREATE TABLE technical_specs( - film_id INT REFERENCES films UNIQUE, - runtime TIME, - camera TEXT, - sound TEXT - ); - -- When the foreign key is a primary key. - -.. code-block:: postgresql + .. code-block:: postgresql - -- references Films using the primary key as a foreign key - CREATE TABLE technical_specs( - film_id INT PRIMARY KEY REFERENCES films, - runtime TIME, - camera TEXT, - sound TEXT - ); + CREATE TABLE technical_specs( + film_id INT REFERENCES films UNIQUE, + runtime TIME, + camera TEXT, + sound TEXT + ); .. tabs:: .. code-tab:: http - GET /films?select=title,technical_specs(runtime) HTTP/1.1 + GET /films?select=title,technical_specs(camera) HTTP/1.1 .. code-tab:: bash Curl - curl "http://localhost:3000/films?select=title,technical_specs(runtime)" + curl "http://localhost:3000/films?select=title,technical_specs(camera)" .. code-block:: json @@ -236,20 +269,26 @@ You can manually define relationships between using functions. This is useful fo Assuming there's a foreign table ``premieres`` that we want to relate to ``films``. -.. code-block:: postgres +.. tabs:: - create foreign table premieres ( - id integer, - location text, - "date" date, - film_id integer - ) server import_csv options ( filename '/tmp/directors.csv', format 'csv'); + .. group-tab:: ERD - create function film(premieres) returns setof films rows 1 as $$ - select * from films where id = $1.film_id - $$ stable language sql; + .. image:: ../../_static/premieres.png + + .. code-tab:: postgresql SQL -The above function defines a relationship between ``premieres`` (the parameter) and ``films`` (the return type). Since there's a ``rows 1``, this defines a many-to-one relationship. + create foreign table premieres ( + id integer, + location text, + "date" date, + film_id integer + ) server import_csv options ( filename '/tmp/directors.csv', format 'csv'); + + create function film(premieres) returns setof films rows 1 as $$ + select * from films where id = $1.film_id + $$ stable language sql; + +The above function (see the **SQL** tab) defines a relationship between ``premieres`` (the parameter) and ``films`` (the return type). Since there's a ``rows 1``, this defines a many-to-one relationship. The name of the function ``film`` is arbitrary and can be used to do the embedding: .. tabs:: @@ -698,24 +737,30 @@ Foreign Key joins can also be done between `partitioned tables Date: Mon, 7 Aug 2023 22:04:17 -0500 Subject: [PATCH 640/711] Revert disamb using FK instead of computed rels --- docs/references/api/resource_embedding.rst | 75 +++++++--------------- 1 file changed, 24 insertions(+), 51 deletions(-) diff --git a/docs/references/api/resource_embedding.rst b/docs/references/api/resource_embedding.rst index 63dda347e0..3870f298a9 100644 --- a/docs/references/api/resource_embedding.rst +++ b/docs/references/api/resource_embedding.rst @@ -372,7 +372,6 @@ Computed relationships have good performance as their intended design enable `in - Make sure to correctly label the ``to-one`` part of the relationship. When using the ``ROWS 1`` estimation, PostgREST will expect a single row to be returned. If that is not the case, it will unnest the embedding and return repeated values for the top level resource. .. _embed_disamb: -.. _hint_disamb: .. _target_disamb: .. _complex_rels: @@ -392,14 +391,8 @@ When there are multiple foreign keys between tables, :ref:`fk_join` need disambi "message": "Could not embed because more than one relationship was found for 'sites' and 'big_projects'" } -.. note:: - - Previous versions addressed complex relationships with `Embedding disambiguation `_ but this is now deprecated. Follow the solutions in this section when a ``300 Multiple Choices`` error is returned. - -.. _multiple_m2o: - -Multiple Many-To-One --------------------- +Instead of the **table name**, you can specify the **foreign key constraint name** or the **column name** that is part of the foreign key. +For example, let's use the following tables: .. tabs:: @@ -420,23 +413,15 @@ Multiple Many-To-One create table orders ( id int primary key generated always as identity, name text, - billing_address_id int references addresses(id), - shipping_address_id int references addresses(id) + billing_address_id int, + shipping_address_id int, + constraint billing_address + foreign key(billing_address_id) references addresses(id), + constraint shipping_address + foreign key(shipping_address_id) references addresses(id) ); -To successfully join ``orders`` with ``addresses``, you need to create computed relationships for the foreign keys columns you want to use: - -.. code-block:: postgresql - - create function billing_address(orders) returns setof addresses rows 1 as $$ - select * from addresses where id = $1.billing_address_id - $$ stable language sql; - - create function shipping_address(orders) returns setof addresses rows 1 as $$ - select * from addresses where id = $1.shipping_address_id - $$ stable language sql; - -Now, we can unambiguously join the billing and shipping addresses. +To successfully join ``orders`` with the billing and shipping ``addresses``, use the corresponding foreign key constraints: .. tabs:: @@ -462,48 +447,36 @@ Now, we can unambiguously join the billing and shipping addresses. } ] -.. _multiple_o2m: - -Multiple One-To-Many --------------------- - -Let's take the tables from :ref:`multiple_m2o`. -To join ``addresses`` with ``orders``, you need to create computed relationships like these ones: - -.. code-block:: postgresql - - create function billing_orders(addresses) returns setof orders as $$ - select * from orders where billing_address_id = $1.id - $$ stable language sql; +.. _hint_disamb: - create function shipping_orders(addresses) returns setof orders as $$ - select * from orders where shipping_address_id = $1.id - $$ stable language sql; +Multiple FK Relationships to Many Resources +------------------------------------------- -Then, the request would look like: +Additionally, let's create two views for ``addresses``: ``central_addresses`` and ``eastern_addresses``. +Using the the view name is not enough to join ``orders`` with any of them. +To solve this, you need to add the foreign key as a hint: .. tabs:: .. code-tab:: http - GET /addresses?select=name,billing_orders(name),shipping_orders(name)&id=eq.1 HTTP/1.1 + GET /orders?select=name,central_addresses!billing_address(name),central_addresses!shipping_address(name) HTTP/1.1 .. code-tab:: bash Curl - curl "http://localhost:3000/addresses?select=name,billing_orders(name),shipping_orders(name)&id=eq.1" + curl "http://localhost:3000/orders?select=name,central_addresses!billing_address(name),central_addresses!shipping_address(name)" .. code-block:: json [ { - "name": "32 Glenlake Dr.Dearborn, MI 48124", - "billing_orders": [ - { "name": "Personal Water Filter" }, - { "name": "Coffee Machine" } - ], - "shipping_orders": [ - { "name": "Coffee Machine" } - ] + "name": "Personal Water Filter", + "billing_address": { + "name": "32 Glenlake Dr.Dearborn, MI 48124" + }, + "shipping_address": { + "name": "30 Glenlake Dr.Dearborn, MI 48124" + } } ] From 9ed7ff88465d1749cb85eb292562aee9b55e4812 Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Wed, 9 Aug 2023 20:17:32 -0500 Subject: [PATCH 641/711] clarify FK joins --- docs/_static/premieres.png | Bin 8990 -> 0 bytes docs/references/api/resource_embedding.rst | 305 +++++++++++---------- 2 files changed, 163 insertions(+), 142 deletions(-) delete mode 100644 docs/_static/premieres.png diff --git a/docs/_static/premieres.png b/docs/_static/premieres.png deleted file mode 100644 index 794e96767de072d6414630fc9fbfbeb24d4f9d9b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8990 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, ``roles`` is taken as a join table. + +The join table is also detected if the composite key has additional columns. -Thus, it can detect the join table ``roles`` between ``films`` and ``actors``: +.. code-block:: postgresql + + create table roles( + id int generated always as identity, + , film_id int references films(id) + , actor_id int references actors(id) + , character text, + , primary key(id, film_id, actor_id) + ); .. tabs:: @@ -209,18 +228,6 @@ Thus, it can detect the join table ``roles`` between ``films`` and ``actors``: ".." ] -The join table can also be detected if the composite key has additional columns: - -.. code-block:: postgresql - - create table roles( - id int generated always as identity, - , film_id int references films(id) - , actor_id int references actors(id) - , character text, - , primary key(id, film_id, actor_id) - ); - .. _one-to-one: One-to-one relationships @@ -228,7 +235,7 @@ One-to-one relationships One-to-one relationships are detected in two ways. -- When the foreign key is a primary key as specified in the :ref:`DB structure example `. +- When the foreign key is a primary key as specified in the :ref:`sample film database `. - When the foreign key has a unique constraint. .. code-block:: postgresql @@ -265,30 +272,24 @@ One-to-one relationships are detected in two ways. Computed Relationships ====================== -You can manually define relationships between using functions. This is useful for database objects that can't define foreign keys, like `Foreign Data Wrappers `_. +You can manually define relationships by using functions. This is useful for database objects that can't define foreign keys, like `Foreign Data Wrappers `_. Assuming there's a foreign table ``premieres`` that we want to relate to ``films``. -.. tabs:: - - .. group-tab:: ERD - - .. image:: ../../_static/premieres.png - - .. code-tab:: postgresql SQL +.. code-block:: postgresql - create foreign table premieres ( - id integer, - location text, - "date" date, - film_id integer - ) server import_csv options ( filename '/tmp/directors.csv', format 'csv'); + create foreign table premieres ( + id integer, + location text, + "date" date, + film_id integer + ) server import_csv options ( filename '/tmp/directors.csv', format 'csv'); - create function film(premieres) returns setof films rows 1 as $$ - select * from films where id = $1.film_id - $$ stable language sql; + create function film(premieres) returns setof films rows 1 as $$ + select * from films where id = $1.film_id + $$ stable language sql; -The above function (see the **SQL** tab) defines a relationship between ``premieres`` (the parameter) and ``films`` (the return type). Since there's a ``rows 1``, this defines a many-to-one relationship. +The above function defines a relationship between ``premieres`` (the parameter) and ``films`` (the return type). Since there's a ``rows 1``, this defines a many-to-one relationship. The name of the function ``film`` is arbitrary and can be used to do the embedding: .. tabs:: @@ -363,36 +364,31 @@ Thanks to overloaded functions, you can use the same function name for different select * from directors where film_school_id = $1.id $$ stable language sql; -Computed relationships have good performance as their intended design enable `inlining `_. +Computed relationships have good performance as their intended design enable `function inlining `_. .. warning:: - - Always use ``SETOF`` when creating computed relationships. Functions can return a table without using ``SETOF``, but bear in mind that they will not be inlined. + - Always use ``SETOF`` when creating computed relationships. Functions can return a table without using ``SETOF``, but bear in mind that PostgreSQL will not inline them. - Make sure to correctly label the ``to-one`` part of the relationship. When using the ``ROWS 1`` estimation, PostgREST will expect a single row to be returned. If that is not the case, it will unnest the embedding and return repeated values for the top level resource. .. _embed_disamb: .. _target_disamb: +.. _hint_disamb: .. _complex_rels: -FK Joins on Multiple Foreign Key Relationships -============================================== +Foreign Key Joins on Multiple Foreign Key Relationships +======================================================= When there are multiple foreign keys between tables, :ref:`fk_join` need disambiguation to resolve which foreign key columns to use for the join. +To do this, you can specify a foreign key by using the ``!hint`` syntax. -.. code:: +.. _multiple_m2o: - HTTP/1.1 300 Multiple Choices - - { - "code": "PGRST201", - "details": [ "..." ], - "hint": "...", - "message": "Could not embed because more than one relationship was found for 'sites' and 'big_projects'" - } +Multiple Many-To-One +-------------------- -Instead of the **table name**, you can specify the **foreign key constraint name** or the **column name** that is part of the foreign key. -For example, let's use the following tables: +For example, suppose you have the following ``orders`` and ``addresses`` tables: .. tabs:: @@ -415,23 +411,41 @@ For example, let's use the following tables: name text, billing_address_id int, shipping_address_id int, - constraint billing_address - foreign key(billing_address_id) references addresses(id), - constraint shipping_address - foreign key(shipping_address_id) references addresses(id) + constraint billing foreign key(billing_address_id) references addresses(id), + constraint shipping foreign key(shipping_address_id) references addresses(id) ); -To successfully join ``orders`` with the billing and shipping ``addresses``, use the corresponding foreign key constraints: +Since the ``orders`` table has two foreign keys to the ``addresses`` table, a foreign key join is ambiguous and PostgREST will respond with an error: + +.. tabs:: + + .. code-tab:: http + + GET /orders?select=*,addresses(*) HTTP/1.1 + + .. code-tab:: bash Curl + + curl "http://localhost:3000/orders?select=*,addresses(*)" -i + + +.. code-block:: http + + HTTP/1.1 300 Multiple Choices + + {..} + + +To successfully join ``orders`` with ``addresses``, you can specify the foreign key name like so: .. tabs:: .. code-tab:: http - GET /orders?select=name,billing_address(name),shipping_address(name) HTTP/1.1 + GET /orders?select=name,billing_address:addresses!billing(name),shipping_address:addresses!shipping(name) HTTP/1.1 .. code-tab:: bash Curl - curl "http://localhost:3000/orders?select=name,billing_address(name),shipping_address(name)" + curl "http://localhost:3000/orders?select=name,billing_address:addresses!billing(name),shipping_address:addresses!shipping(name)" .. code-block:: json @@ -447,43 +461,49 @@ To successfully join ``orders`` with the billing and shipping ``addresses``, use } ] -.. _hint_disamb: +Note that ``!billing`` and ``!shipping`` are foreign keys names, which have been named explicitly in the :ref:`SQL definition above `. + +.. _multiple_o2m: -Multiple FK Relationships to Many Resources -------------------------------------------- +Multiple One-To-Many +-------------------- -Additionally, let's create two views for ``addresses``: ``central_addresses`` and ``eastern_addresses``. -Using the the view name is not enough to join ``orders`` with any of them. -To solve this, you need to add the foreign key as a hint: +Let's take the tables from :ref:`multiple_m2o`. To get the opposite one-to-many relationship, we can also specify the foreign key name: .. tabs:: .. code-tab:: http - GET /orders?select=name,central_addresses!billing_address(name),central_addresses!shipping_address(name) HTTP/1.1 + GET /addresses?select=name,billing_orders:orders!billing(name),shipping_orders!shipping(name)&id=eq.1 HTTP/1.1 .. code-tab:: bash Curl - curl "http://localhost:3000/orders?select=name,central_addresses!billing_address(name),central_addresses!shipping_address(name)" + curl "http://localhost:3000/addresses?select=name,billing_orders:orders!billing(name),shipping_orders!shipping(name)&id=eq.1" .. code-block:: json [ { - "name": "Personal Water Filter", - "billing_address": { - "name": "32 Glenlake Dr.Dearborn, MI 48124" - }, - "shipping_address": { - "name": "30 Glenlake Dr.Dearborn, MI 48124" - } + "name": "32 Glenlake Dr.Dearborn, MI 48124", + "billing_orders": [ + { "name": "Personal Water Filter" }, + { "name": "Coffee Machine" } + ], + "shipping_orders": [ + { "name": "Coffee Machine" } + ] } ] +Recursive Relationships +----------------------- + +To disambiguate recursive relationships, PostgREST requires :ref:`computed_relationships`. + .. _recursive_o2o_embed: Recursive One-To-One --------------------- +~~~~~~~~~~~~~~~~~~~~ .. tabs:: @@ -541,7 +561,7 @@ Now, to query a president with their predecessor and successor: .. _recursive_o2m_embed: Recursive One-To-Many ---------------------- +~~~~~~~~~~~~~~~~~~~~~ .. tabs:: @@ -593,7 +613,7 @@ Now, the query would be: .. _recursive_m2o_embed: Recursive Many-To-One ----------------------- +~~~~~~~~~~~~~~~~~~~~~~ Let's take the same ``employees`` table from :ref:`recursive_o2m_embed`. To get the Many-To-One relationship, that is, the employees with their respective supervisor, you need to create a function like this one: @@ -630,7 +650,7 @@ Then, the query would be: .. _recursive_m2m_embed: Recursive Many-To-Many ----------------------- +~~~~~~~~~~~~~~~~~~~~~~ .. tabs:: @@ -703,8 +723,8 @@ Then, the request would be: .. _embedding_partitioned_tables: -FK Joins on Partitioned Tables -============================== +Foreign Key Joins on Partitioned Tables +======================================= Foreign Key joins can also be done between `partitioned tables `_ and other tables. @@ -749,17 +769,17 @@ Since it contains the ``films_id`` foreign key, it is possible to join ``box_off .. note:: - * FK joins on partitions is not allowed because it leads to ambiguity errors (see :ref:`embed_disamb`) between them and their parent partitioned table. More details at `#1783(comment) `_). :ref:`computed_relationships` can be used if this is needed. + * Foreign key joins on partitions is not allowed because it leads to ambiguity errors (see :ref:`embed_disamb`) between them and their parent partitioned table. More details at `#1783(comment) `_). :ref:`computed_relationships` can be used if this is needed. * Partitioned tables can reference other tables since PostgreSQL 11 but can only be referenced from any other table since PostgreSQL 12. .. _embedding_views: -FK Joins on Views -================= +Foreign Key Joins on Views +========================== -PostgREST will infer the relationships of a view based on its base tables. Base tables are the ones referenced in the ``FROM`` and ``JOIN`` clauses of the view definition. -The foreign keys of the relationships must be present in the top ``SELECT`` clause of the view for this to work. +PostgREST will infer the foreign keys of a view using its base tables. Base tables are the ones referenced in the ``FROM`` and ``JOIN`` clauses of the view definition. +The foreign keys' columns must be present in the top ``SELECT`` clause of the view for this to work. For instance, the following view has ``nominations``, ``films`` and ``competitions`` as base tables: @@ -792,7 +812,7 @@ It's also possible to foreign key join `Materialized Views `_. This may fail depending on the complexity of the view. @@ -802,15 +822,15 @@ It's also possible to foreign key join `Materialized Views ` that returns a table type, you can do a Foreign Key join on the result. @@ -845,6 +865,59 @@ A request with ``directors`` embedded: } ] +.. _mutation_embed: + +Foreign Key Joins on Writes +=========================== + +You can join related database objects after doing :ref:`insert`, :ref:`update` or :ref:`delete`. + +Say you want to insert a **film** and then get some of its attributes plus join its **director**. + +.. tabs:: + + .. code-tab:: http + + POST /films?select=title,year,director:directors(first_name,last_name) HTTP/1.1 + Prefer: return=representation + + { + "id": 100, + "director_id": 40, + "title": "127 hours", + "year": 2010, + "rating": 7.6, + "language": "english" + } + + .. code-tab:: bash Curl + + curl "http://localhost:3000/films?select=title,year,director:directors(first_name,last_name)" \ + -H "Prefer: return=representation" \ + -d @- << EOF + { + "id": 100, + "director_id": 40, + "title": "127 hours", + "year": 2010, + "rating": 7.6, + "language": "english" + } + EOF + +Response: + +.. code-block:: json + + { + "title": "127 hours", + "year": 2010, + "director": { + "first_name": "Danny", + "last_name": "Boyle" + } + } + .. _nested_embedding: Nested Embedding @@ -1157,55 +1230,3 @@ You can use this to get the columns of a join table in a many-to-many relationsh The spread operator ``...`` is borrowed from the Javascript `spread syntax `_. -.. _mutation_embed: - -Embedding after Insertions/Updates/Deletions -============================================ - -You can embed related resources after doing :ref:`insert`, :ref:`update` or :ref:`delete`. - -Say you want to insert a **film** and then get some of its attributes plus embed its **director**. - -.. tabs:: - - .. code-tab:: http - - POST /films?select=title,year,director:directors(first_name,last_name) HTTP/1.1 - Prefer: return=representation - - { - "id": 100, - "director_id": 40, - "title": "127 hours", - "year": 2010, - "rating": 7.6, - "language": "english" - } - - .. code-tab:: bash Curl - - curl "http://localhost:3000/films?select=title,year,director:directors(first_name,last_name)" \ - -H "Prefer: return=representation" \ - -d @- << EOF - { - "id": 100, - "director_id": 40, - "title": "127 hours", - "year": 2010, - "rating": 7.6, - "language": "english" - } - EOF - -Response: - -.. code-block:: json - - { - "title": "127 hours", - "year": 2010, - "director": { - "first_name": "Danny", - "last_name": "Boyle" - } - } From c229bee681459ac4b07c36dee093c0dfd8845739 Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Wed, 9 Aug 2023 23:48:18 -0500 Subject: [PATCH 642/711] add disamb error --- docs/references/api/resource_embedding.rst | 28 +++++++++++++++++----- 1 file changed, 22 insertions(+), 6 deletions(-) diff --git a/docs/references/api/resource_embedding.rst b/docs/references/api/resource_embedding.rst index 6e12171c27..4aa29d6633 100644 --- a/docs/references/api/resource_embedding.rst +++ b/docs/references/api/resource_embedding.rst @@ -15,7 +15,7 @@ table-valued functions. - For tables, it generates a join condition using the foreign keys columns (respecting composite keys). - For views, it generates a join condition using the views' base tables foreign key columns. -- For table-valued functions, it generates a join condition based on the foreign key columns of the function return type. +- For table-valued functions, it generates a join condition based on the foreign key columns of the returned table type. .. important:: @@ -381,7 +381,7 @@ Foreign Key Joins on Multiple Foreign Key Relationships ======================================================= When there are multiple foreign keys between tables, :ref:`fk_join` need disambiguation to resolve which foreign key columns to use for the join. -To do this, you can specify a foreign key by using the ``!hint`` syntax. +To do this, you can specify a foreign key by using the ``!`` syntax. .. _multiple_m2o: @@ -432,10 +432,28 @@ Since the ``orders`` table has two foreign keys to the ``addresses`` table, a fo HTTP/1.1 300 Multiple Choices - {..} +.. code-block:: json + { + "code": "PGRST201", + "details": [ + { + "cardinality": "many-to-one", + "embedding": "orders with addresses", + "relationship": "billing using orders(billing_address_id) and addresses(id)" + }, + { + "cardinality": "many-to-one", + "embedding": "orders with addresses", + "relationship": "shipping using orders(shipping_address_id) and addresses(id)" + } + ], + "hint": "Try changing 'addresses' to one of the following: 'addresses!billing', 'addresses!shipping'. Find the desired relationship in the 'details' key.", + "message": "Could not embed because more than one relationship was found for 'orders' and 'addresses'" + } -To successfully join ``orders`` with ``addresses``, you can specify the foreign key name like so: +To successfully join ``orders`` with ``addresses``, we can follow the error ``hint`` which tells us to add the foreign key name as ``!billing`` or ``!shipping``. +Note that the foreign keys have been named explicitly in the :ref:`SQL definition above `. To make the result clearer we'll also alias the tables: .. tabs:: @@ -461,8 +479,6 @@ To successfully join ``orders`` with ``addresses``, you can specify the foreign } ] -Note that ``!billing`` and ``!shipping`` are foreign keys names, which have been named explicitly in the :ref:`SQL definition above `. - .. _multiple_o2m: Multiple One-To-Many From daad21e9ec1b1275ef627804a298396b2d8a2679 Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Thu, 10 Aug 2023 01:15:59 -0500 Subject: [PATCH 643/711] add note to impersonated role settings --- docs/references/auth.rst | 33 +++++++++++++++++++-------------- 1 file changed, 19 insertions(+), 14 deletions(-) diff --git a/docs/references/auth.rst b/docs/references/auth.rst index a25b08be19..3e7428f2ee 100644 --- a/docs/references/auth.rst +++ b/docs/references/auth.rst @@ -37,6 +37,24 @@ The picture below shows how the server handles authentication. If auth succeeds, This role switching mechanism is called **user impersonation**. In PostgreSQL it's done with the ``SET ROLE`` statement. +.. _impersonated_settings: + +Impersonated Role Settings +-------------------------- + +The impersonated role has its settings applied. For example, if you do: + +.. code-block:: postgresql + + ALTER ROLE webuser SET statement_timeout TO '5s'; + +Every ``webuser`` :ref:`transaction ` gets its queries executed with a ``statement_timeout`` of 5 seconds. + +.. note:: + + Settings that have a high privilege context (like ``superuser``) won't be applied, only settings that have a ``user`` context will be. This is so we don't cause permission errors. + For more details see `Understanding Postgres Parameter Context `_. + .. _jwt_impersonation: JWT-Based User Impersonation @@ -71,7 +89,7 @@ If the client included no JWT (or one without a role claim) then PostgREST switc JWT Generation ~~~~~~~~~~~~~~ -You can create a valid JWT either from inside your database(see :ref:`sql_user_management`) or via an external service(see :ref:`external_jwt`). +You can create a valid JWT either from inside your database (see :ref:`sql_user_management`) or via an external service (see :ref:`external_jwt`). .. _client_auth: @@ -188,16 +206,3 @@ doing custom logic based on the web user info. END IF; END $$ LANGUAGE plpgsql; - -.. _impersonated_settings: - -Impersonated Role Settings --------------------------- - -The :ref:`Impersonated Role ` settings are applied. For example, if you do: - -.. code-block:: postgresql - - ALTER ROLE webuser SET statement_timeout TO '5s'; - -Every ``webuser`` :ref:`transaction ` gets its queries executed with a ``statement_timeout`` of 5 seconds. From b33bfb656d5d1ec233130b82f0db4b183d4b49eb Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Thu, 10 Aug 2023 01:24:02 -0500 Subject: [PATCH 644/711] add preference-applied for return=* --- docs/references/api/tables_views.rst | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/references/api/tables_views.rst b/docs/references/api/tables_views.rst index 469ad612f0..518a58e2eb 100644 --- a/docs/references/api/tables_views.rst +++ b/docs/references/api/tables_views.rst @@ -750,6 +750,7 @@ If the table has a primary key, the response can contain a :code:`Location` head HTTP/1.1 201 Created Location: /projects?id=eq.34 + Preference-Applied: return=headers-only Prefer: return=representation ----------------------------- @@ -775,7 +776,7 @@ On the other end of the spectrum you can get the full created object back in the .. code:: HTTP/1.1 201 Created - Transfer-Encoding: chunked + Preference-Applied: return=representation [ { From 78d9880607907a35639aa5ae11c27c3ec5bbb054 Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Thu, 10 Aug 2023 02:11:41 -0500 Subject: [PATCH 645/711] add nulls=stripped --- .../api/resource_representation.rst | 37 +++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/docs/references/api/resource_representation.rst b/docs/references/api/resource_representation.rst index 8a1f805291..76c0c55112 100644 --- a/docs/references/api/resource_representation.rst +++ b/docs/references/api/resource_representation.rst @@ -85,6 +85,43 @@ When a singular response is requested but no entries are found, the server respo Admittedly PostgREST could detect when there is an equality condition holding on all columns constituting the primary key and automatically convert to singular. However this could lead to a surprising change of format that breaks unwary client code just by filtering on an extra column. Instead we allow manually specifying singular vs plural to decouple that choice from the URL format. +Stripped Nulls +-------------- + +By default PostgREST returns all JSON null values. For example, requesting ``/projects?id=gt.10`` returns + +.. code:: json + + [ + { "id": 11, "name": "OSX", "client_id": 1, "another_col": "val" }, + { "id": 12, "name": "ProjectX", "client_id": null, "another_col": null }, + { "id": 13, "name": "Y", "client_id": null, "another_col": null } + ] + +On large result sets, the unused keys with ``null`` values can waste bandwith unnecessarily. To remove them, specify ``nulls=stripped`` as a parameter of ``application/vnd.pgrst.array``: + +.. tabs:: + + .. code-tab:: http + + GET /projects?id=gt.10 HTTP/1.1 + Accept: application/vnd.pgrst.array+json;nulls=stripped + + .. code-tab:: bash Curl + + curl "http://localhost:3000/projects?id=gt.10" \ + -H "Accept: application/vnd.pgrst.array+json;nulls=stripped" + +This returns + +.. code:: json + + [ + { "id": 11, "name": "OSX", "client_id": 1, "another_col": "val" }, + { "id": 12, "name": "ProjectX" }, + { "id": 13, "name": "Y"} + ] + .. _scalar_return_formats: Scalar Function Response Format From cacbbc31fee8bb072f870b77266179b7c84c2dc9 Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Thu, 10 Aug 2023 02:27:21 -0500 Subject: [PATCH 646/711] add setof record functions --- docs/references/api/stored_procedures.rst | 33 +++++++++++++++++++++++ postgrest.dict | 1 + 2 files changed, 34 insertions(+) diff --git a/docs/references/api/stored_procedures.rst b/docs/references/api/stored_procedures.rst index e5098864b7..9aa28d9e29 100644 --- a/docs/references/api/stored_procedures.rst +++ b/docs/references/api/stored_procedures.rst @@ -420,6 +420,39 @@ PostgREST will detect if the function is scalar or table-valued and will shape t To manually choose a return format such as binary, plain text or XML, see the section :ref:`scalar_return_formats`. +.. _untyped_functions: + +Untyped functions +----------------- + +Functions that return ``record`` or ``SETOF record`` are supported: + +.. code-block:: postgres + + create function projects_setof_record() returns setof record as $$ + select * from projects; + $$ language sql; + +.. tabs:: + + .. code-tab:: http + + GET /rpc/projects_setof_record HTTP/1.1 + + .. code-tab:: bash Curl + + curl "http://localhost:3000/rpc/projects_setof_record" + +.. code-block:: json + + [{"id":1,"name":"Windows 7","client_id":1}, + {"id":2,"name":"Windows 10","client_id":1}, + {"id":3,"name":"IOS","client_id":2}] + +However note that they will fail when trying to use :ref:`v_filter` and :ref:`h_filter` on them. + +So while they can be used for quick tests, it's recommended to always choose a strict return type for the function. + Overloaded functions -------------------- diff --git a/postgrest.dict b/postgrest.dict index c5070d1dd6..f4aa4dd428 100644 --- a/postgrest.dict +++ b/postgrest.dict @@ -182,6 +182,7 @@ unicode unikernel unix updatable +Untyped UPSERT Upsert upsert From 46548dd09b4c2fc5d0430c5d508b608c189a753d Mon Sep 17 00:00:00 2001 From: Laurence Isla Date: Thu, 10 Aug 2023 16:46:55 -0500 Subject: [PATCH 647/711] Fix typo and version --- docs/conf.py | 4 ++-- docs/references/connection_pool.rst | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/conf.py b/docs/conf.py index 5125f82996..f561c28d62 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -57,9 +57,9 @@ # built documents. # # The short X.Y version. -version = u'11.1' +version = u'11.2' # The full version, including alpha/beta/rc tags. -release = u'11.1.0' +release = u'11.2.0' # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. diff --git a/docs/references/connection_pool.rst b/docs/references/connection_pool.rst index 0876dbd270..6072b4266e 100644 --- a/docs/references/connection_pool.rst +++ b/docs/references/connection_pool.rst @@ -10,7 +10,7 @@ Minimizing connections is paramount to performance. Each PostgreSQL connection c Connection String ----------------- -For connecting to the database, the pool requires a connection string. You can can configure it using :ref:`db-uri`. +For connecting to the database, the pool requires a connection string. You can configure it using :ref:`db-uri`. .. _pool_growth_limit: .. _dyn_conn_pool: From ff3a3a9100928cb3b0376d18082675a1807db431 Mon Sep 17 00:00:00 2001 From: Taimoor Zaeem Date: Fri, 25 Aug 2023 10:30:04 +0500 Subject: [PATCH 648/711] add db-pool-automatic-recovery --- docs/references/configuration.rst | 17 +++++++++++++++++ docs/references/connection_pool.rst | 1 + 2 files changed, 18 insertions(+) diff --git a/docs/references/configuration.rst b/docs/references/configuration.rst index 5da6db953a..6cd7217be1 100644 --- a/docs/references/configuration.rst +++ b/docs/references/configuration.rst @@ -370,6 +370,23 @@ db-pool-max-lifetime Specifies the maximum time in seconds of an existing connection in the pool. +.. _db-pool-automatic-recovery: + +db-pool-automatic-recovery +-------------------------- + + =============== ================================= + **Type** Boolean + **Default** True + **Reloadable** Y + **Environment** PGRST_DB_POOL_AUTOMATIC_RECOVERY + **In-Database** `n/a` + =============== ================================= + + Enables or disables connection retrying. + + When disabled, PostgREST would terminate immediately after connection loss instead of retrying indefinitely. See :ref:`this section ` for more information. + .. _db-pre-request: db-pre-request diff --git a/docs/references/connection_pool.rst b/docs/references/connection_pool.rst index 6072b4266e..efff666c7c 100644 --- a/docs/references/connection_pool.rst +++ b/docs/references/connection_pool.rst @@ -78,6 +78,7 @@ The server will retry reconnecting to the database if connection loss happens. - The retries happen immediately after a connection loss, if :ref:`db-channel-enabled` is set to true (the default). Otherwise they'll happen once a request arrives. - To ensure a valid state, the server reloads the :ref:`schema_cache` and :ref:`configuration` when recovering. - To notify the client of the next retry, the server sends a ``503 Service Unavailable`` status with the ``Retry-After: x`` header. Where ``x`` is the number of seconds programmed for the next retry. +- Automatic recovery can be disabled by setting :ref:`db-pool-automatic-recovery` to ``false``. .. _external_connection_poolers: From 9352a72195ad7563a13795e62ca77725edc7280d Mon Sep 17 00:00:00 2001 From: Haowu Ge Date: Tue, 29 Aug 2023 03:24:10 +0000 Subject: [PATCH 649/711] Add a regular account to reduce operational security risks --- docs/integrations/systemd.rst | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/docs/integrations/systemd.rst b/docs/integrations/systemd.rst index 55b7d6cf77..d0aba9288f 100644 --- a/docs/integrations/systemd.rst +++ b/docs/integrations/systemd.rst @@ -12,6 +12,12 @@ First, create postgrest configuration in ``/etc/postgrest/config`` db-anon-role = "" jwt-secret = "" +Create a dedicated ``postgrest`` user with: + +.. code-block:: ini + + sudo useradd -M -U -d /nonexistent -s /usr/sbin/nologin postgrest + Then create the systemd service file in ``/etc/systemd/system/postgrest.service`` .. code-block:: ini @@ -21,6 +27,8 @@ Then create the systemd service file in ``/etc/systemd/system/postgrest.service` After=postgresql.service [Service] + User=postgrest + Group=postgrest ExecStart=/bin/postgrest /etc/postgrest/config ExecReload=/bin/kill -SIGUSR1 $MAINPID From d643aab261136a12962994699f64eec410be4841 Mon Sep 17 00:00:00 2001 From: Laurence Isla Date: Wed, 12 Jul 2023 09:46:41 -0500 Subject: [PATCH 650/711] Add html-htmx how-to --- .../providing-html-content-using-htmx.rst | 353 ++++++++++++++++++ postgrest.dict | 3 + 2 files changed, 356 insertions(+) create mode 100644 docs/how-tos/providing-html-content-using-htmx.rst diff --git a/docs/how-tos/providing-html-content-using-htmx.rst b/docs/how-tos/providing-html-content-using-htmx.rst new file mode 100644 index 0000000000..0909fe5cf9 --- /dev/null +++ b/docs/how-tos/providing-html-content-using-htmx.rst @@ -0,0 +1,353 @@ +.. note:: + + This page is a work in progress. + +.. _providing_html_htmx: + +Providing HTML Content Using htmx +================================= + +:author: `Laurence Isla `_ + +This how-to shows a way to return HTML content and use the `htmx library `_ to handle the AJAX requests. +Htmx expects an HTML response and uses it to replace an element inside the DOM (see the `htmx introduction `_ in the docs). + +Preparatory Configuration +------------------------- + +We will make a to-do app based on the :ref:`tut0`, so make sure to complete it before continuing. + +To simplify things, we won't be using authentication, so grant all permissions on the ``todos`` table to the ``web_anon`` user. + +.. code-block:: postgres + + grant all on api.todos to web_anon; + +Next, add the ``text/html`` media type to the :ref:`raw-media-types` configuration. +With this, PostgREST can identify the request made by your web browser (with the ``Accept: text/html`` header) and return a raw HTML document file. + +.. code-block:: ini + + # tutorial.conf + raw-media-types = "text/html" + +Creating an HTML Response +------------------------- + +Let's create a function that returns a basic HTML file, using `Tailwind CSS `_ for styling. + +.. code-block:: postgres + + create or replace function api.index() returns text + language plpgsql + as $$ + begin + perform set_config('response.headers','[{"Content-Type": "text/html; charset=utf-8"}]', true); + return $html$ + + + + + + PostgREST To-Do list + + + + +

    +
    +
    PostgREST To-Do List
    +
    +
    + + + $html$; + end $$; + +The web browser will open the web page at ``http://localhost:3000/rpc/index``. + +.. _html_htmx_list_create: + +Listing and Creating To-Dos +--------------------------- + +Now, let's show a list of the to-dos already inserted in the database. + +.. code-block:: postgres + + create or replace function api.html_todo(api.todos) returns text + language sql stable + as $$ + select format($html$ +
  • + + %3$s + +
  • + $html$, + $1.id, + case when $1.done then 'line-through text-gray-400' else '' end, + $1.task + ); + $$; + + create or replace function api.html_all_todos() returns text + language sql + as $$ + select coalesce( + '
      ' + || string_agg(api.html_todo(t), '' order by t.id) || + '
    ', + '

    There is nothing else to do.

    ' + ) + from api.todos t; + $$; + +These two functions are used to build the to-do list template. We won't call them outside of PostgreSQL. + +- The ``html_todo`` function uses the table ``api.todos`` as a parameter and is used to format each element into a list element ``
  • ``. + The PostgreSQL `format `_ function is useful to that end. + It replaces the values according to the position in the template, e.g. the ``%1$s`` in the template will be replaced with the value of ``$1.id`` (the first parameter). + +- The ``html_all_todos`` function is the ``
      `` wrapper for all the list elements and uses `string_arg `_ to concatenate all the to-dos in a single text value. + It also returns an alternative message, instead of a list, when the ``api.todos`` table is empty. + +Next, let's add an endpoint to register a to-do in the database and modify the ``/rpc/index`` page accordingly. + +.. code-block:: postgres + + create or replace function api.add_todo(_task text) returns text + language plpgsql + as $$ + begin + perform set_config('response.headers','[{"Content-Type": "text/html; charset=utf-8"}]', true); + insert into api.todos(task) values (_task); + return api.html_all_todos(); + end; + $$; + + create or replace function api.index() returns text + language plpgsql + as $$ + begin + perform set_config('response.headers','[{"Content-Type": "text/html; charset=utf-8"}]', true); + return $html$ + + + + + + PostgREST To-Do list + + + + + + +
      +
      +
      PostgREST To-Do List
      +
      + +
      +
      + $html$ + || api.html_all_todos() || + $html$ +
      +
      +
      + + + $html$; + end $$; + +- The ``/rpc/add_todo`` endpoint allows us to add a new to-do using the ``_task`` parameter and returns an ``html`` with all the to-dos in the database. + +- The ``/rpc/index`` now adds the ``hx-headers='{"Accept": "text/html"}'`` tag to the ````. + This will make sure that all htmx elements inside the body send this header, otherwise PostgREST won't recognize it as HTML. + + There is also a ``
      `` element that uses the htmx library. Let's break it down: + + + ``hx-post="/rpc/add_todo"``: sends an AJAX POST request to the ``/rpc/add_todo`` endpoint, with the value of the ``_task`` from the ```` element. + + + ``hx-target="#todo-list-area"``: the HTML content returned from the request will go inside ``
      `` (which is the list of to-dos). + + + ``hx-trigger="submit"``: htmx will do this request when submitting the form (by pressing enter inside the ````). + + + ``hx-on="htmx:afterRequest: this.reset()">``: this is a Javascript command that clears the form `after the request is done `_. + +With this, the ``http://localhost:3000/rpc/index`` page lists all the todos and adds new ones by submitting tasks in the input element. + +Editing and Deleting To-Dos +--------------------------- + +Now, let's modify the ``html_todo`` function and make it more functional. + +.. code-block:: postgres + + create or replace function api.html_todo_template(api.todos) returns text + language sql stable + as $$ + select format($html$ +
    • +
      +
      + + + %3$s + + +
      +
      + + +
      +
      +
    • + $html$, + $1.id, + case when $1.done then 'line-through text-gray-400' else '' end, + $1.task, + (not $1.done)::text + ); + $$; + +Let's deconstruct the new features: + +- The ``
      `` element is configured as follows: + + + ``hx-post="/rpc/change_todo_state"``: does an AJAX POST request to that endpoint. It will toggle the ``done`` state of the to-do. + + + ``hx-vals='{"_id": %1$s, "_done": %4$s}'``: adds the parameters to the request. + This is an alternative to using hidden inputs inside the ````. + + + ``hx-target="#todo-list-area"``: the returned HTML will replace the element with this id. + + + ``hx-trigger="click"``: htmx does the request after clicking on the element. + +- The ``
    ', - '

    There is nothing else to do.

    ' + '

    There is nothing else to do.

    ' ) from api.todos t; $$; -These two functions are used to build the to-do list template. We won't call them outside of PostgreSQL. +These two functions are used to build the to-do list template. We won't use them as PostgREST endpoints. -- The ``html_todo`` function uses the table ``api.todos`` as a parameter and is used to format each element into a list element ``
  • ``. - The PostgreSQL `format `_ function is useful to that end. - It replaces the values according to the position in the template, e.g. the ``%1$s`` in the template will be replaced with the value of ``$1.id`` (the first parameter). +- The ``api.html_todo`` function uses the table ``api.todos`` as a parameter and formats each item into a list element ``
  • ``. + The PostgreSQL `format `_ is useful to that end. + It replaces the values according to the position in the template, e.g. ``%1$s`` will be replaced with the value of ``$1.id`` (the first parameter). -- The ``html_all_todos`` function is the ``
      `` wrapper for all the list elements and uses `string_arg `_ to concatenate all the to-dos in a single text value. +- The ``api.html_all_todos`` function returns the ``
        `` wrapper for all the list elements. + It uses `string_arg `_ to concatenate all the to-dos in a single text value. It also returns an alternative message, instead of a list, when the ``api.todos`` table is empty. Next, let's add an endpoint to register a to-do in the database and modify the ``/rpc/index`` page accordingly. @@ -137,7 +140,7 @@ Next, let's add an endpoint to register a to-do in the database and modify the ` - PostgREST To-Do list + PostgREST + HTMX To-Do List @@ -147,9 +150,8 @@ Next, let's add an endpoint to register a to-do in the database and modify the ` hx-headers='{"Accept": "text/html"}'>
        -
        PostgREST To-Do List
        -
        PostgREST + HTMX To-Do List
  • }Vy`0gb}Jxx3*3krDIhs&2D^d97{nQ0Jiv-^I9q38*|R zWT;SC@A}}t=F?moOX*_1yTmKlT{9*C6KT;T{<2#37E*%w@U4)fQMAxsH0F7k%}Oxz ztmGV3bKkw{;get}n(&R>)t_$SmIx>Vug~SX{pn0!v1A8aUTMF_o*TFZdOxrDAQ={D z+^$s_g#RrvIQ@3a>2(08W-Yx@pd@eFa17?O zye%X8l40CO&^^L@spzdS6X05t$b9s~?o(K|(EPIui?&U{&+^9K3YvhnXObYzTDJW1 zjB<5K7Nc=wS#!;AC+U{1FE?E?&;6p?;2Tf79%Wx$?Jf|FKF}~Ba1>26m*9OaEt?|y z0Kd%m(XZ@Zg$L|ULc4#Na{hWbsd^x*0_uO)r0+qcxqRnU&~w3e>bF1Ynt#Q;9}%(~ z^FExF(HhtK_A8M7V|N|x-m4e`?e#RIg`x6@j{pXfUuT}- zHwVlvwR+wUuJCJ@ZJnv^Ax-0j**8%HW%tPaHo7Bd&ZsNxi#vrETqjK5HOeUF@cH;E zqE(jHI&$WXYEJt@dW;-9ulur9G|!c*aCPbEceIbe*s`|mbdI_&Z9YeGIGV;Cr(8oS z#ksQN9xRCBswRD_JwQ%-oG!4mPYb)s8h48eo2S{*QoFL4|o67Y%&BGcd3er;hx0LR71`Z_M}0$s7w&gPwY-_50( zw2KBhpEMO@G*oC;Eib1E-f@y|XMtG?xPeC!v<#6YaxSkNs15A29K_lxs45*u1Y6jB zO;4zQp&R}QzRTs9#fIY(UcEsXK!klhgteHwD=0%^0U!?uniQjRO(-UovNT)E;6SW zAe|wN?*?Do=j3NBeHzr#5Wjjf^vRd^j6~vWQcc-_7dc1cKY3OJY5(5+_<+J+Bhvy- zAE`K;Tx7LZ=w!2fFcqitbW`TLg&{R!BH>^_=qPaov7XA6bJajS zOouC|*j|D!;}OT_Yk{J7&rP=ctS2rknXkTZkqxELlMOmQPm4oBx7DBIz-sB@WT}#L zioES4x|?2&e~X`$DG!sMk`QZ9-T?ZROLn&)nkH_zrxBNi!@~%~c-QFMNXOv4!BLO( z!Q^o57$Hem9crjGoa*(1+hsD@?*1Ec?XC_<@=~g(@A9+ERVk}>PIKobPMhwu4=EX? zjeh{#&PKxJjXUsm$&GqmBTLjEoj{Yk1*&c6o_~$KL9aoZx0D9v)()^L(sCfa%pYISoqgK z{455l^h8r^n4^GZ$wbPwwF^x(%D@;7;C$kG;^ff=PIAW4V(H;j?uHv8kMJt9ga$v@ z9g4J?%$f9^Qr|WC0vYKKd}}9RVZH1f!|)mqBF>lD`m9;Cg6^pK%3|5M_M)_ zn*!B-?c;C)yk(C%1H4qu#^(Up8A|jc;8o%vYbm^%Tz*biMvWQ&8v}qTA$!6{{D$|s zl+!=s)}em>piSg9YdU6`vV^W{JB(*R+mh^SI8(0S;MP2TJN)T{5n$3>kYRk_qL#oj zBe6~0y}t8wG`piy;#sYBQ*ltpu4SRY_&el^*$L8#q9M7ypBKIddpC=zZgv27JTsZi zw^Q60k#E6QA!IPfE6_NLabtB)pN7ge)t*2RN|rX7kCkp3Ml!g&+9Bwax%D z_o!5c#522o@vzBe>6(LA6Aq(I^s0N6j!_k zG^F0lP+vTJC>W$~3MsR|L3slQ4NSE3!tF zkjo}e;%xpXnS_ES1D=T&;M_gkoOn&jAWga7$RI6$<$$Ne&WLsKs!?d@>p{ukkmLtU zCjkTc1jqBgxJV`Np*0)8yY9|4O06mv!y%L-8aNj*)G&R~HRS7{NA$6j6?+iI1$Mc} zdkfqKm&u!Pp#a&%K% zCb4HobR{d46X3Gf)1oEew4~TpJFED$@15Xzr8B-z!$0(GEDpv}V`qI95>*NmwdsMw zTjt9B?Cxl?8N&*XC|bO6ktFAPJBt<>AHt3^DA_VgaF1DBs+uH|`240Au32)m%j>$^ zLd!UNeEU#2cI%u{xFAATxsFeMN%i^l2Ka8vuq0|n=qi5mh1EbqHQFuFvh8B3qJ4xtAvs4xkE{92kKZvs~%D{z;hT}-S^K76vV7-JFHP0aGdF!wsH2I}YO zk1nq2if8pE>4U1IJ=6 z&ImBQlO93J(}~G;t|Mi74fRgp?lNPdh96W8eV*G%{9*&ti!&vl?dIznPbsvY2M%gE z^kv0fTCr+5SgA&k>}BfUdn%6a$<{y&y?wdhXBg8-I;RVXf}NyrJ@;{jl-7}rAt_Hp zB7C3A#s!QV;0B`)x8J#$a3E?Ylv?~9(05@7$b$+1bjX0>=eEswzFmu%r;%Uf2X)2f z#YR3+KBQn%?O71t!Xy9{fdDuw1G?cRfP;E1&=8qtJ!$0L)!|{ORln*A%|WD>pT*0U z>`|Vus4YGx4IOZrtBfA({11oo{&uTE`*?uEX)c>TDCo#Tq921v4a zRQqrb%<7=CbdC4|L4;g&0YsR*McjV2%0ZAJvR})OFRqg&RY)wTRoKG#Bs+gIN^Gxj zNY2|U4nVTC<7k;@E!bjQ8x$DPPZ6|)AC4Wx_Jo?4vki}!ds-}Kxonp;WD0U!-rGhb zb#CX>Z7PfW{*?7#$Y?TOK5Z{f$d@bbP-ZGW0wz(@DzPa%oj-J`$<0LXwP~*f)!2S` z`5Xt;{XEY6-gqH+Co~Q*TyER9S^okiYJlKK(p+HMlF4uVeE)U>Mx^Y5EWCm0WX+jh zHRv5ewi=VXN-1inJtY{$y6NmwrIpwKzqg{sftulp8gT}5k&PTKbFEuqUKM2dUEnAl zCVc^{N*u+EuPXIG5^x&?qDL3EBRRyA2P=p;6YhYQq|y zPuqnS3J=r@4ER4_f@|R?az}ZsS0=-QO%f)sh~0=Vcw9{>aERwbKL1A9{dv~Qey(-a ztE61tg4GkYql@}y=H>=Sfd#3)!{T3Ui0lt9e!yaVE-hu##WVrk_`TL3z3ci8O&H46 z*X|;#8)F`93#iEVrb;Co7sFO^$_?p!7cViruEH8|Cj>Ehs1?_%uHi!=KZRT-!jG2y?N-Zbq*&}~o?O!hdy5=|k zdiD@&i5mg!+H)s9^ID*F;8cm0!+8sT8kwJMc}QCgL_TPOk1VL}9UWd8i2b;bNUA9vKRwYooA%od{+u`H9F`MRkRkO( zGHDGNn%g8~BGm`<)xMyPCe)5-BAxEh<9qMhj;m>uC#?6HK(Ip6@Lh?H=#u? z!-%|{l^#6h9g#njZR^+QfUoAJ_7KPI4RT%S#L4OdHcsJr_PpeeAVAXOnWOv88!X;> zSjGJiAm{S0_Oi!U*Ep+zsc4Qb)c4SPi*v%S&LS&yJe4xa2On<1OB3gM&a5eq!;EZE zpU=J|KuODh$c{`EcC~8&^!ga3?4mE{ngREz?&e>9O3F%f(P@&)&ar?7V#8y7q;@Rr z6gc~PH%*DLr|2Z)B8JGeEwN@$sF{5Q)exR$7s;`g0@u+|8qztpgd;ON7n9eW#m4b^ zhWrPQ;bb35%5#;_l{?Ne$?!Kyz#eLX6gC=uuv6lKQVGqZT~T{2h|7=SS{cvUzL$~| zpN?#UXAjy>k-2e77b@duzkZl{n!DVNsA>oFu2W=j(5_L$ZYpl6*f&kAR(Zs|94BX# z&bGs$ys!)FkHV^$d9QU}>dFkGjQw&@MPGK!n9kjYVYwLDe*brg+k5@a%@wMra8a?X z-+*k`PQ(uAVEPKsa)?QW*)I&TIm+@#sZ6imVt0}cM~0y+{cw!fbzwhX-cRsj_LTsm zlX2Sx`HllM&;;66+bs9-IJHX6Cc3d9#`ab0^|bsHV0pS{-mA%`Qdaa&ftCBuFHmai zd&A7Ci;%-LD;@iG0mn~Na>9pMsSo%3Bcjd0?0Z=-3NQZIO*eEwECx1(Qd2KKHyua0TMB>cnS5ZNx*Hohp zTg4%pru-p0fjP&yNzus=0gmr zqgQ$=glq?sX!7I20lq1_0q{+NngxhZ@D6)WJ;{>csGu*tIk+A$RuExDqw&0(TI-v) zih4ZZ7(sfD?J|z_ufXv@wayma!~0-HPd}&oZV0W{B;a=Isp8;*n+!V*eiSAg+r{(6 z8)F=(-MC)xDzF2J{WhX-8(1=|tZfnlNB3iFhmNQlpE9{%7LYZM5AE**3dxEcl28@z z`^_)cUQbc%^i<%)pUrg7KizD$51c-)!Fp7YX(sv*5r5D&x03Md%GrJ!StJKhyab|v zd#^e^U9!Jf29iv70@HI`X5Bz?-Qlcx!m0G;62HwC&@F}!k$TiACOm{ z3E+&iV^=pPMF36o1b_Jy$Soavq@0W%GsrI*4L6S!p2%lOL0}o*>(yG_vD(NhG7YMF z252Lvh9$EJOVoU_X&sxHl&4Z+RmG#dGP^@@e|UdFaBjL)CeGDiytk=?!9|;LtMm1J z6}yG$8YAi-K;rBzOQpA>nG=v^;=LXS6h$0=QW%!1l+%$rizESEJ(2$oJ=$wL^NMAT$`n??+{m^ko(@(lBdOv*rr|!G6N-37_@ZUd zd870=sm4}at-%MsKdQt9xu7$lQTQ9pp4XvVr6OeW1M0OW(MB6!v+*14XDn^ zQAZ)fl#2S+=eT;-dOn^3U>|X{=Kdpn#v`(G9(itO@2SNGX7DUp0;@fXM4oB!|-6hiHZfWU70 zG+oo?IAbCboFw28D>)%%NY-bt~UTs2)?!e_GWHVmP1HHon?{4Xx$3_+DE-rl$c;(hz%mw~`Em9!?Jna#j*`HBX6_BMrwl85S@#p; z+}*j%ZH-vF!A9L@O%K<}fJDG)gpPz{Kbb6Q^+CCF-uYCKY17s$){JAbwtz$P@6EqN z_?Hv@m4bhz;9n{DR|@`>f`6spUn%%k3jURXf2H7GDfs_c3P!(mT;Wv11IyDxGk2~5 PKXR{>UY0*M{`h|Y$-4j2 literal 0 HcmV?d00001 diff --git a/index.rst b/index.rst index 3d72f2994e..a16caa4dd6 100644 --- a/index.rst +++ b/index.rst @@ -26,12 +26,14 @@ PostgREST is a standalone web server that turns your PostgreSQL database directl Sponsors -------- -.. image:: _static/timescaledb.png - :target: https://www.timescale.com?utm_campaign=postgrest&utm_source=sponsor&utm_medium=referral&utm_content=docs - :width: 222px - :align: center -`TimescaleDB `_ is an scalable time-series database packaged as a PostgreSQL extension. See our tutorial for using `TimescaleDB with PostgREST `_. +.. image:: _static/2ndquadrant.png + :target: https://www.2ndquadrant.com/en/?utm_campaign=external%20websites&utm_source=postgrest&utm_medium=logo + :width: 13em + +.. image:: _static/retool.png + :target: https://tryretool.com/?utm_source=sponsor&utm_campaign=postgrest + :width: 13em Motivation ---------- From c21e98c9ae4dcfa4ab7d1ed8aef89046ef01db21 Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Sun, 16 Jun 2019 15:09:49 -0500 Subject: [PATCH 233/711] Correct url --- index.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/index.rst b/index.rst index a16caa4dd6..ee35708508 100644 --- a/index.rst +++ b/index.rst @@ -28,7 +28,7 @@ Sponsors .. image:: _static/2ndquadrant.png - :target: https://www.2ndquadrant.com/en/?utm_campaign=external%20websites&utm_source=postgrest&utm_medium=logo + :target: https://www.2ndquadrant.com/en/?utm_campaign=External%20Websites&utm_source=PostgREST&utm_medium=Logo :width: 13em .. image:: _static/retool.png From ecb4f15de0792313666874455b82f0367b147059 Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Wed, 19 Jun 2019 21:11:46 -0500 Subject: [PATCH 234/711] Add CYBERTEC as Sponsor --- _static/css/custom.css | 4 ++++ _static/cybertec.png | Bin 0 -> 15406 bytes index.rst | 3 +++ 3 files changed, 7 insertions(+) create mode 100644 _static/cybertec.png diff --git a/_static/css/custom.css b/_static/css/custom.css index d4c0ceef8b..555afaa1c8 100644 --- a/_static/css/custom.css +++ b/_static/css/custom.css @@ -17,3 +17,7 @@ div.line-block { #sponsors h1{ text-align: left; } + +#sponsors img{ + margin: 10px; +} diff --git a/_static/cybertec.png b/_static/cybertec.png new file mode 100644 index 0000000000000000000000000000000000000000..4bb395027fa0fe438446e46d76c32a8a3d46df0c GIT binary patch literal 15406 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 DEZ}=4 literal 0 HcmV?d00001 diff --git a/index.rst b/index.rst index ee35708508..0b45f87136 100644 --- a/index.rst +++ b/index.rst @@ -26,6 +26,9 @@ PostgREST is a standalone web server that turns your PostgreSQL database directl Sponsors -------- +.. image:: _static/cybertec.png + :target: https://www.cybertec-postgresql.com/en/ + :width: 13em .. image:: _static/2ndquadrant.png :target: https://www.2ndquadrant.com/en/?utm_campaign=External%20Websites&utm_source=PostgREST&utm_medium=Logo From 59816e65765c241d4791d768bd132f15c4363e55 Mon Sep 17 00:00:00 2001 From: Eduardo Jorge Date: Thu, 4 Jul 2019 21:14:18 +0100 Subject: [PATCH 235/711] Add missing doc for the ov operator in array types (#225) --- api.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/api.rst b/api.rst index 20c4113650..085eec6ff5 100644 --- a/api.rst +++ b/api.rst @@ -70,6 +70,9 @@ cs contains e.g. :code:`?tags=cs.{example, new}` :code:`@>` cd contained in e.g. :code:`?values=cd.{1,2,3}` :code:`<@` ov overlap (have points in common), :code:`&&` e.g. :code:`?period=ov.[2017-01-01,2017-06-30]` + – also supports array types, use curly braces + instead of square brackets + e.g. :code: `?arr=ov.{1,3}` sl strictly left of, e.g. :code:`?range=sl.(1,10)` :code:`<<` sr strictly right of :code:`>>` nxr does not extend to the right of, :code:`&<` From 5ad1afbf73c8d252a0429a14aa5eccc70e877eb4 Mon Sep 17 00:00:00 2001 From: Eduardo Jorge Date: Wed, 24 Jul 2019 17:02:58 +0100 Subject: [PATCH 236/711] Add websearch_to_tsquery doc (#226) --- api.rst | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/api.rst b/api.rst index 085eec6ff5..ebe0bdab66 100644 --- a/api.rst +++ b/api.rst @@ -66,6 +66,7 @@ is checking for exact equality (null,true,false) :code:`IS` fts :ref:`fts` using to_tsquery :code:`@@` plfts :ref:`fts` using plainto_tsquery :code:`@@` phfts :ref:`fts` using phraseto_tsquery :code:`@@` +wfts :ref:`fts` using websearch_to_tsquery :code:`@@` cs contains e.g. :code:`?tags=cs.{example, new}` :code:`@>` cd contained in e.g. :code:`?values=cd.{1,2,3}` :code:`<@` ov overlap (have points in common), :code:`&&` @@ -132,8 +133,14 @@ The :code:`fts` filter mentioned above has a number of options to support flexib GET /tsearch?my_tsv=not.phfts(english).The%20Fat%20Cats HTTP/1.1 +.. code-block:: http + + GET /tsearch?my_tsv=not.wfts(french).amusant HTTP/1.1 + Using phrase search mode requires PostgreSQL of version at least 9.6 and will raise an error in earlier versions of the database. +Using `websearch_to_tsquery` requires PostgreSQL of version at least 11.0 and will raise an error in earlier versions of the database. + .. _v_filter: Vertical Filtering (Columns) From ca456ecc51765f8f622b2aca837bf8adab0a70da Mon Sep 17 00:00:00 2001 From: stefan8888 Date: Mon, 29 Jul 2019 20:15:00 +0200 Subject: [PATCH 237/711] Updated Docker section (#236) * Updated Docker section On macOS, it is also necessary to add the IP address in pg_hba.conf --- install.rst | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/install.rst b/install.rst index de4bf4187f..ebc0ea9792 100644 --- a/install.rst +++ b/install.rst @@ -297,6 +297,11 @@ The database connection string above is just an example. Adjust the role and pas .. code-block:: bash listen_addresses = 'localhost,10.0.0.10' + You might also need to add a new IPv4 local connection within pg_hba.conf. For instance: + + .. code-block:: bash + + host all all 10.0.0.10/32 trust Containerized PostgREST *and* db with docker-compose ---------------------------------------------------- From f759b8bfc6b7d15f4432bc7fd318d6fdaf2b376b Mon Sep 17 00:00:00 2001 From: Erwan Thomas Date: Sun, 18 Aug 2019 23:32:08 +0200 Subject: [PATCH 238/711] Fix miscellaneous Sphinx warnings (#244) * /index.rst:24: WARNING: Line block ends without a blank line. * /install.rst:300: WARNING: Explicit markup ends without a blank line; unexpected unindent. * /admin.rst:273: WARNING: Could not lex literal_block as "http". Highlighting skipped. * /tutorials/tut1.rst:150: WARNING: Could not lex literal_block as "json". Highlighting skipped. * Remove extra newline * Use integer value as epoch in JSON snippet Even though using a string value is convenient (due to the lack of JSON comments), it is confusing since the value should actually be an integer. A slightly more verbose documentation is therefore preferable. --- admin.rst | 2 +- index.rst | 1 + install.rst | 5 +++-- tutorials/tut1.rst | 4 +++- 4 files changed, 8 insertions(+), 4 deletions(-) diff --git a/admin.rst b/admin.rst index f8bfd1a958..12af107e4d 100644 --- a/admin.rst +++ b/admin.rst @@ -272,7 +272,7 @@ As discussed in :ref:`singular_plural`, there are no special URL forms for singu .. code:: http - GET /people?id=eq.1 + GET /people?id=eq.1 HTTP/1.1 Accept: application/vnd.pgrst.object+json This allows compound primary keys and makes the intent for singular response independent of a URL convention. diff --git a/index.rst b/index.rst index 0b45f87136..5c8a34dad5 100644 --- a/index.rst +++ b/index.rst @@ -21,6 +21,7 @@ :target: https://www.paypal.me/postgrest | + PostgREST is a standalone web server that turns your PostgreSQL database directly into a RESTful API. The structural constraints and permissions in the database determine the API endpoints and operations. Sponsors diff --git a/install.rst b/install.rst index ebc0ea9792..807b87c783 100644 --- a/install.rst +++ b/install.rst @@ -297,10 +297,11 @@ The database connection string above is just an example. Adjust the role and pas .. code-block:: bash listen_addresses = 'localhost,10.0.0.10' + You might also need to add a new IPv4 local connection within pg_hba.conf. For instance: - + .. code-block:: bash - + host all all 10.0.0.10/32 trust Containerized PostgREST *and* db with docker-compose diff --git a/tutorials/tut1.rst b/tutorials/tut1.rst index bcef5e6329..71c288d11d 100644 --- a/tutorials/tut1.rst +++ b/tutorials/tut1.rst @@ -151,9 +151,11 @@ Go back to jwt.io and change the payload to { "role": "todo_user", - "exp": + "exp": 123456789 } +**NOTE**: Don't forget to change the dummy epoch value :code:`123456789` in the snippet above to the epoch value returned by the psql command. + Copy the updated token as before, and save it as a new environment variable. .. code-block:: bash From 0b5e168c8d944a7cecee1200126521918a4b4240 Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Thu, 1 Aug 2019 12:22:32 -0500 Subject: [PATCH 239/711] Fix #205, operators table with heading --- api.rst | 71 ++++++++++++++++++++++++++++----------------------------- 1 file changed, 35 insertions(+), 36 deletions(-) diff --git a/api.rst b/api.rst index ebe0bdab66..34c8d4abf9 100644 --- a/api.rst +++ b/api.rst @@ -45,43 +45,42 @@ Complex logic can also be applied: GET /people?and=(grade.gte.90,student.is.true,or(age.gte.14,age.is.null)) HTTP/1.1 +Operators +~~~~~~~~~ + These operators are available: -============ =============================================== ===================== -Abbreviation Meaning PostgreSQL Equivalent -============ =============================================== ===================== -eq equals :code:`=` -gt greater than :code:`>` -gte greater than or equal :code:`>=` -lt less than :code:`<` -lte less than or equal :code:`<=` -neq not equal :code:`<>` or :code:`!=` -like LIKE operator (use * in place of %) :code:`LIKE` -ilike ILIKE operator (use * in place of %) :code:`ILIKE` -in one of a list of values e.g. :code:`IN` - :code:`?a=in.(1,2,3)` – also supports commas - in quoted strings like - :code:`?a=in.("hi,there","yes,you")` -is checking for exact equality (null,true,false) :code:`IS` -fts :ref:`fts` using to_tsquery :code:`@@` -plfts :ref:`fts` using plainto_tsquery :code:`@@` -phfts :ref:`fts` using phraseto_tsquery :code:`@@` -wfts :ref:`fts` using websearch_to_tsquery :code:`@@` -cs contains e.g. :code:`?tags=cs.{example, new}` :code:`@>` -cd contained in e.g. :code:`?values=cd.{1,2,3}` :code:`<@` -ov overlap (have points in common), :code:`&&` - e.g. :code:`?period=ov.[2017-01-01,2017-06-30]` - – also supports array types, use curly braces - instead of square brackets - e.g. :code: `?arr=ov.{1,3}` -sl strictly left of, e.g. :code:`?range=sl.(1,10)` :code:`<<` -sr strictly right of :code:`>>` -nxr does not extend to the right of, :code:`&<` - e.g. :code:`?range=nxr.(1,10)` -nxl does not extend to the left of :code:`&>` -adj is adjacent to, e.g. :code:`?range=adj.(1,10)` :code:`-|-` -not negates another operator, see below :code:`NOT` -============ =============================================== ===================== +============ ======================== ================================================================================== +Abbreviation In PostgreSQL Meaning +============ ======================== ================================================================================== +eq :code:`=` equals +gt :code:`>` greater than +gte :code:`>=` greater than or equal +lt :code:`<` less than +lte :code:`<=` less than or equal +neq :code:`<>` or :code:`!=` not equal +like :code:`LIKE` LIKE operator (use * in place of %) +ilike :code:`ILIKE` ILIKE operator (use * in place of %) +in :code:`IN` one of a list of values, e.g. :code:`?a=in.(1,2,3)` + – also supports commas in quoted strings like + :code:`?a=in.("hi,there","yes,you")` +is :code:`IS` checking for exact equality (null,true,false) +fts :code:`@@` :ref:`fts` using to_tsquery +plfts :code:`@@` :ref:`fts` using plainto_tsquery +phfts :code:`@@` :ref:`fts` using phraseto_tsquery +wfts :code:`@@` :ref:`fts` using websearch_to_tsquery +cs :code:`@>` contains e.g. :code:`?tags=cs.{example, new}` +cd :code:`<@` contained in e.g. :code:`?values=cd.{1,2,3}` +ov :code:`&&` overlap (have points in common), e.g. :code:`?period=ov.[2017-01-01,2017-06-30]` – + also supports array types, use curly braces instead of square brackets e.g. + :code: `?arr=ov.{1,3}` +sl :code:`<<` strictly left of, e.g. :code:`?range=sl.(1,10)` +sr :code:`>>` strictly right of +nxr :code:`&<` does not extend to the right of, e.g. :code:`?range=nxr.(1,10)` +nxl :code:`&>` does not extend to the left of +adj :code:`-|-` is adjacent to, e.g. :code:`?range=adj.(1,10)` +not :code:`NOT` negates another operator, see below +============ ======================== ================================================================================== To negate any operator, prefix it with :code:`not` like :code:`?a=not.eq.2` or :code:`?not.and=(a.gte.0,a.lte.100)` . @@ -982,7 +981,7 @@ UPSERT operates based on the primary key columns, you must specify all of them. .. important:: After creating a table or changing its primary key, you must refresh PostgREST schema cache for UPSERT to work properly. To learn how to refresh the cache see :ref:`schema_reloading`. - + A single row UPSERT can be done by using :code:`PUT` and filtering the primary key columns with :code:`eq`: From f983e0af349a0594c55d5882a9e4e6d350333318 Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Thu, 1 Aug 2019 12:35:58 -0500 Subject: [PATCH 240/711] Fix #196, add virtual columns a.k.a. --- api.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/api.rst b/api.rst index 34c8d4abf9..cf529570fd 100644 --- a/api.rst +++ b/api.rst @@ -208,7 +208,7 @@ You can specify a path for a ``json`` or ``jsonb`` column using the arrow operat Computed Columns ~~~~~~~~~~~~~~~~ -Filters may be applied to computed columns as well as actual table/view columns, even though the computed columns will not appear in the output. For example, to search first and last names at once we can create a computed column that will not appear in the output but can be used in a filter: +Filters may be applied to computed columns(**a.k.a. virtual columns**) as well as actual table/view columns, even though the computed columns will not appear in the output. For example, to search first and last names at once we can create a computed column that will not appear in the output but can be used in a filter: .. code-block:: postgres From b07d07f17d5978de623b05a4cae4c20a8f0541fa Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Thu, 1 Aug 2019 13:06:52 -0500 Subject: [PATCH 241/711] Fix #231, add note about assuming text in rpc calls --- api.rst | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/api.rst b/api.rst index cf529570fd..728e485af7 100644 --- a/api.rst +++ b/api.rst @@ -625,10 +625,6 @@ For instance, assume we have created this function in the database. SELECT a + b; $$ LANGUAGE SQL IMMUTABLE STRICT; -.. important:: - - Whenever you create or change a function you must refresh PostgREST's schema. See the section :ref:`schema_reloading`. - The client can call it by posting an object like .. code-block:: http @@ -639,6 +635,22 @@ The client can call it by posting an object like 3 +.. important:: + + Whenever you create or change a function you must refresh PostgREST's schema cache. See the section :ref:`schema_reloading`. + + If the schema cache is not refreshed, PostgREST will assume :code:`text` as the default type for function arguments. This could + lead to getting error responses like: + + .. code-block:: json + + { + "hint":"No function matches the given name and argument types. You might need to add explicit type casts.", + "details":null, + "code":"42883", + "message":"function test.add_them(a => text, b => text) does not exist" + } + You can also call a function that takes a single parameter of type json by sending the header :code:`Prefer: params=single-object` with your request. That way the JSON request body will be used as the single argument. .. code-block:: plpgsql From 03905a584e6740d2880bdacc31a4c653a63ff4ba Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Thu, 1 Aug 2019 13:26:27 -0500 Subject: [PATCH 242/711] Fix #224, remove STRICT from example rpc --- api.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/api.rst b/api.rst index 728e485af7..074135b58f 100644 --- a/api.rst +++ b/api.rst @@ -623,7 +623,7 @@ For instance, assume we have created this function in the database. CREATE FUNCTION add_them(a integer, b integer) RETURNS integer AS $$ SELECT a + b; - $$ LANGUAGE SQL IMMUTABLE STRICT; + $$ LANGUAGE SQL IMMUTABLE; The client can call it by posting an object like From 1fd06ff65d32728b585a70b3f7c79cb2117a0612 Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Thu, 1 Aug 2019 14:10:02 -0500 Subject: [PATCH 243/711] Fix #199, db-extra-search-path clarification --- install.rst | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/install.rst b/install.rst index 807b87c783..7f6e596761 100644 --- a/install.rst +++ b/install.rst @@ -129,7 +129,9 @@ db-pool db-extra-search-path -------------------- - Extra schemas to add to the `search_path `_ of every request. These schemas tables, views and stored procedures don't get API endpoints, they can only be referred from the database objects exposed in your :ref:`db-schema`. + Extra schemas to add to the `search_path `_ of every request. These schemas tables, views and stored procedures **don't get API endpoints**, they can only be referred from the database objects inside your :ref:`db-schema`. + + This parameter was meant to make it easier to use **PostgreSQL extensions** (like PostGIS) that are outside of the :ref:`db-schema`. Multiple schemas can be added in a comma-separated string, e.g. ``public, extensions``. From 3babff99b9b0c5d2f74dc90a292f84065856baf2 Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Thu, 1 Aug 2019 14:30:13 -0500 Subject: [PATCH 244/711] Fix #198, add note about nginx config location --- admin.rst | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/admin.rst b/admin.rst index 12af107e4d..26dd090f4c 100644 --- a/admin.rst +++ b/admin.rst @@ -30,6 +30,11 @@ The first step is to create an Nginx configuration file that proxies requests to } } +.. note:: + + For ubuntu, if you already installed nginx through :code:`apt` you can add this to the config file in + :code:`/etc/nginx/sites-enabled/default`. + .. _block_fulltable: Block Full-Table Operations From 7ccc8c4610edcda420cfeae27e962a8e3b31926a Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Fri, 2 Aug 2019 13:33:59 -0500 Subject: [PATCH 245/711] Fix #197, add note about axios url encoding --- api.rst | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/api.rst b/api.rst index 074135b58f..d1599e02d0 100644 --- a/api.rst +++ b/api.rst @@ -288,6 +288,10 @@ Here ``information.cpe`` is a column name. GET /vulnerabilities?%22information.cpe%22=like.*MS* HTTP/1.1 +.. note:: + + Some http libraries might encode URLs automatically(e.g. :code:`axios`). In these cases you should use double quotes + :code:`""` directly instead of :code:`%22`. Ordering -------- From 91e44f12ec843ef4ae5b1dcefe19dff865833c3b Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Fri, 2 Aug 2019 13:50:11 -0500 Subject: [PATCH 246/711] Fix #216, remove HUP reference --- admin.rst | 4 ---- install.rst | 3 --- postgrest.dict | 1 - 3 files changed, 8 deletions(-) diff --git a/admin.rst b/admin.rst index 26dd090f4c..f7075f9a61 100644 --- a/admin.rst +++ b/admin.rst @@ -222,10 +222,6 @@ Then run the `pg_listen `_ utility to mon Now, whenever the structure of the database schema changes, PostgreSQL will notify the ``ddl_command_end`` channel, which will cause ``pg_listen`` to send PostgREST the signal to reload its cache. -.. important:: - - As of PostgREST v5.1 reloading with SIGHUP is deprecated, it's still supported but will be removed in v6.0. SIGUSR1 should be used instead. - Daemonizing =========== diff --git a/install.rst b/install.rst index 7f6e596761..98abbb3a6a 100644 --- a/install.rst +++ b/install.rst @@ -249,9 +249,6 @@ PostgREST outputs basic request logging to stdout. When running it in an SSH ses # another option is to pipe the output into "logger -t postgrest" -(Avoid :code:`nohup postgrest` because the HUP signal is used for manual :ref:`schema_reloading`.) - - Docker ====== diff --git a/postgrest.dict b/postgrest.dict index 563e11994a..0faacadb5f 100644 --- a/postgrest.dict +++ b/postgrest.dict @@ -45,7 +45,6 @@ RSA RabbitMQ RestSharp SHA -SIGHUP SIGUSR1 SNS SQL From e9712b0aff72e7bd782f29f90294288aba29321e Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Mon, 5 Aug 2019 10:22:29 -0500 Subject: [PATCH 247/711] Fix #200, anon permissions on auth section --- api.rst | 2 ++ auth.rst | 16 +++++++++------- 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/api.rst b/api.rst index d1599e02d0..34aa00188b 100644 --- a/api.rst +++ b/api.rst @@ -768,6 +768,8 @@ A function that returns a table type response can be shaped using the same filte GET /rpc/best_films_2017?rating=gt.8&order=title.desc HTTP/1.1 +.. _func_privs: + Function privileges ------------------- diff --git a/auth.rst b/auth.rst index 0800a08106..bf6fa09811 100644 --- a/auth.rst +++ b/auth.rst @@ -425,7 +425,7 @@ As described in `JWT from SQL`_, we'll create a JWT inside our login function. N into result; return result; end; - $$ language plpgsql; + $$ language plpgsql security definer; An API request to call this function would look like: @@ -446,18 +446,20 @@ The response would look like the snippet below. Try decoding the token at `jwt.i Permissions ~~~~~~~~~~~ -Your database roles need access to the schema, tables, views and functions in order to service HTTP requests. Recall from the `Overview of Role System`_ that PostgREST uses special roles to process requests, namely the authenticator and anonymous roles. Below is an example of permissions that allow anonymous users to create accounts and attempt to log in. +Your database roles need access to the schema, tables, views and functions in order to service HTTP requests. +Recall from the `Overview of Role System`_ that PostgREST uses special roles to process requests, namely the authenticator and +anonymous roles. Below is an example of permissions that allow anonymous users to create accounts and attempt to log in. -.. code:: sql +.. code-block:: postgres -- the names "anon" and "authenticator" are configurable and not -- sacred, we simply choose them for clarity - create role anon; + create role anon noinherit; create role authenticator noinherit; grant anon to authenticator; - grant usage on schema public, basic_auth to anon; - grant select on table pg_authid, basic_auth.users to anon; grant execute on function login(text,text) to anon; -You may be worried from the above that anonymous users can read everything from the :code:`basic_auth.users` table. However this table is not available for direct queries because it lives in a separate schema. The anonymous role needs access because the public :code:`users` view reads the underlying table with the permissions of the calling user. But we have made sure the view properly restricts access to sensitive information. +Since the above :code:`login` function is defined as `security definer `_, +the anonymous user :code:`anon` doesn't need permission to read the :code:`basic_auth.users` table. It doesn't even need permission to access the :code:`basic_auth` schema. +:code:`grant execute on function` is included for clarity but it might not be needed, see :ref:`func_privs` for more details. From a1509dc7315b4ebc3d4e87f1b47255decb606c67 Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Mon, 5 Aug 2019 11:07:44 -0500 Subject: [PATCH 248/711] Fix #170, remove no performance penalty claim --- auth.rst | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/auth.rst b/auth.rst index bf6fa09811..4b770cb24e 100644 --- a/auth.rst +++ b/auth.rst @@ -50,7 +50,7 @@ PostgREST can accommodate either viewpoint. If you treat a role as a single user You can use row-level security to flexibly restrict visibility and access for the current user. Here is an `example `_ from Tomas Vondra, a chat table storing messages sent between users. Users can insert rows into it to send messages to other users, and query it to see messages sent to them by other users. -.. code:: sql +.. code-block:: postgres CREATE TABLE chat ( message_uuid UUID PRIMARY KEY DEFAULT uuid_generate_v4(), @@ -65,7 +65,7 @@ We want to enforce a policy that ensures a user can see only those messages sent PostgreSQL (9.5 and later) allows us to set this policy with row-level security: -.. code:: sql +.. code-block:: postgres CREATE POLICY chat_policy ON chat USING ((message_to = current_user) OR (message_from = current_user)) @@ -73,6 +73,10 @@ PostgreSQL (9.5 and later) allows us to set this policy with row-level security: Anyone accessing the generated API endpoint for the chat table will see exactly the rows they should, without our needing custom imperative server-side coding. +.. warning:: + + Roles are namespaced per-cluster rather than per-database so they may be prone to collision. + Web Users Sharing Role ~~~~~~~~~~~~~~~~~~~~~~ @@ -96,9 +100,9 @@ This allows JWT generation services to include extra information and your databa Hybrid User-Group Roles ~~~~~~~~~~~~~~~~~~~~~~~ -There is no performance penalty for having many database roles, although roles are namespaced per-cluster rather than per-database so may be prone to collision within the database. You are free to assign a new role for every user in a web application if desired. You can mix the group and individual role policies. For instance we could still have a webuser role and individual users which inherit from it: +You can mix the group and individual role policies. For instance we could still have a webuser role and individual users which inherit from it: -.. code:: sql +.. code-block:: postgres CREATE ROLE webuser NOLOGIN; -- grant this role access to certain tables etc From 664604e6cafc6825c2b36df0e4e011366f844ea0 Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Mon, 5 Aug 2019 13:12:26 -0500 Subject: [PATCH 249/711] Fix #212, note about view with complex RULEs --- api.rst | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/api.rst b/api.rst index 34aa00188b..c54b01937c 100644 --- a/api.rst +++ b/api.rst @@ -947,6 +947,12 @@ Updates also support :code:`Prefer: return=representation` plus :ref:`v_filter`. Beware of accidentally updating every row in a table. To learn to prevent that see :ref:`block_fulltable`. +.. warning:: + + Insertion on VIEWs with complex `RULEs `_ might not work out of the box with PostgREST. + It's recommended that you `use triggers instead of RULEs `_. + If you want to keep using RULEs, a workaround is to wrap the VIEW insertion in a stored procedure and call it through the :ref:`s_procs` interface. + .. _bulk_insert: Bulk Insert From aba2f43c1019897d084e0bdd743f943ec09903ee Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Sat, 10 Aug 2019 13:40:42 -0500 Subject: [PATCH 250/711] Fix #230, make clear FKs are needed for embedding --- api.rst | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/api.rst b/api.rst index c54b01937c..8381f85642 100644 --- a/api.rst +++ b/api.rst @@ -487,7 +487,13 @@ If the stored procedure returns non-scalar values, you need to do a :code:`selec Resource Embedding ================== -In addition to providing RESTful routes for each table and view, PostgREST allows related resources to be included together in a single API call. This reduces the need for multiple API requests. The server uses foreign keys to determine which tables and views can be returned together. For example, consider a database of films and their awards: +In addition to providing RESTful routes for each table and view, PostgREST allows related resources to be included together in a single +API call. This reduces the need for multiple API requests. The server uses **foreign keys** to determine which tables and views can be +returned together. For example, consider a database of films and their awards: + +.. important:: + + PostgREST needs `FOREIGN KEY constraints `_ to be able to do Resource Embedding. .. image:: _static/film.png @@ -547,15 +553,18 @@ this: GET /films?select=title,director:directors(id,last_name) HTTP/1.1 -PostgREST can also detect relations going through join tables. Thus you can request the Actors for Films (which in this case finds the information through Roles). You can also reverse the direction of inclusion, asking for all Directors with each including the list of their Films: +.. important:: -.. code-block:: http + Whenever FOREIGN KEY constraints change in the database schema you must refresh PostgREST's schema cache for Resource Embedding to work properly. See the section :ref:`schema_reloading`. - GET /directors?select=films(title,year) HTTP/1.1 +Embeddeding through join tables +------------------------------- -.. important:: +PostgREST can also detect relationships going through join tables. Thus you can request the Actors for Films (which in this case finds the information through Roles). You can also reverse the direction of inclusion, asking for all Directors with each including the list of their Films: - Whenever foreign key relations change in the database schema you must refresh PostgREST's schema cache to allow resource embedding to work properly. See the section :ref:`schema_reloading`. +.. code-block:: http + + GET /directors?select=films(title,year) HTTP/1.1 Embedded Filters ---------------- From 5c22846e12d137b323755dc8e0f1f869ecddcc22 Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Sat, 10 Aug 2019 18:39:55 -0500 Subject: [PATCH 251/711] Fix #172, add section on embedding views --- api.rst | 37 ++++++++++++++++++++++++++++++++++++- 1 file changed, 36 insertions(+), 1 deletion(-) diff --git a/api.rst b/api.rst index 8381f85642..7161eeb480 100644 --- a/api.rst +++ b/api.rst @@ -488,7 +488,7 @@ Resource Embedding ================== In addition to providing RESTful routes for each table and view, PostgREST allows related resources to be included together in a single -API call. This reduces the need for multiple API requests. The server uses **foreign keys** to determine which tables and views can be +API call. This reduces the need for multiple API requests. The server uses **foreign keys** to determine which tables and views can be returned together. For example, consider a database of films and their awards: .. important:: @@ -601,6 +601,41 @@ Embedded resources can be aliased and filters can be applied on these aliases: GET /films?select=*,90_comps:competitions(name),91_comps:competitions(name)&90_comps.year=eq.1990&91_comps.year=eq.1991 HTTP/1.1 +Embedding Views +--------------- + +Embedding a view is possible if the view contains columns that have **foreign keys** defined in their source tables. + +As an example, let's create a view called ``nominations_view`` based on the nominations table. + +.. code-block:: postgres + + CREATE VIEW nominations_view AS + SELECT + rank + , competition_id + , film_id + FROM + nominations; + +Since it contains ``competition_id`` and ``film_id``—and each one has a **foreign key** defined in its source table—we can embed competitions and films: + +.. code-block:: http + + GET /nominations_view?select=rank,competitions(name,year),films(title)&rank=eq.5 HTTP/1.1 + + +.. warning:: + + Is not guaranteed that all kinds of views will be embeddable. In particular, views that contain + UNIONs will not be made embeddable. + + Why? PostgREST detects source table foreign keys in the view by querying and parsing `pg_rewrite `_. + This may fail depending on the complexity of the view, it's a best-effort approach. + +.. important:: + + If view definitions change you must refresh PostgREST's schema cache for this to work properly. See the section :ref:`schema_reloading`. .. _custom_queries: From 396b0468ce9c0b2d9b0003050beeea99e473dd7a Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Mon, 12 Aug 2019 14:13:20 -0500 Subject: [PATCH 252/711] Refine embedding views section --- api.rst | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/api.rst b/api.rst index 7161eeb480..efdff6b20c 100644 --- a/api.rst +++ b/api.rst @@ -606,7 +606,7 @@ Embedding Views Embedding a view is possible if the view contains columns that have **foreign keys** defined in their source tables. -As an example, let's create a view called ``nominations_view`` based on the nominations table. +As an example, let's create a view called ``nominations_view`` based on the *nominations* table. .. code-block:: postgres @@ -618,7 +618,7 @@ As an example, let's create a view called ``nominations_view`` based on the nomi FROM nominations; -Since it contains ``competition_id`` and ``film_id``—and each one has a **foreign key** defined in its source table—we can embed competitions and films: +Since it contains ``competition_id`` and ``film_id``—and each one has a **foreign key** defined in its source table—we can embed *competitions* and *films*: .. code-block:: http @@ -631,7 +631,12 @@ Since it contains ``competition_id`` and ``film_id``—and each one has a **fore UNIONs will not be made embeddable. Why? PostgREST detects source table foreign keys in the view by querying and parsing `pg_rewrite `_. - This may fail depending on the complexity of the view, it's a best-effort approach. + This may fail depending on the complexity of the view. + + `Report an issue `_ if your view is not made embeddable so we can + keep continue improving foreign key detection. + + In the future we'll include include a way to manually specify views source foreign keys to address this limitation. .. important:: From cb2bf809a7fd4b28ddc5c8097eab40dab135d4dd Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Tue, 13 Aug 2019 11:55:21 -0500 Subject: [PATCH 253/711] Fix #219, how-to for embedding table from other schema --- api.rst | 2 + .../embedding-table-from-another-schema.rst | 79 +++++++++++++++++++ index.rst | 6 ++ livereload_docs.py | 1 + 4 files changed, 88 insertions(+) create mode 100644 how-tos/embedding-table-from-another-schema.rst diff --git a/api.rst b/api.rst index efdff6b20c..7c9ed9b9ed 100644 --- a/api.rst +++ b/api.rst @@ -601,6 +601,8 @@ Embedded resources can be aliased and filters can be applied on these aliases: GET /films?select=*,90_comps:competitions(name),91_comps:competitions(name)&90_comps.year=eq.1990&91_comps.year=eq.1991 HTTP/1.1 +.. _embedding_views: + Embedding Views --------------- diff --git a/how-tos/embedding-table-from-another-schema.rst b/how-tos/embedding-table-from-another-schema.rst new file mode 100644 index 0000000000..7517064646 --- /dev/null +++ b/how-tos/embedding-table-from-another-schema.rst @@ -0,0 +1,79 @@ +Embedding a table from another schema +===================================== + +Suppose you have a **people** table in the ``public`` schema and this schema is exposed through PostgREST's :ref:`db-schema`. + +.. code-block:: postgres + + create table public.people( + id int primary key + , full_name text + ); + +And you want to :ref:`embed ` the **people** table with a **details** table that's in another schema named ``private``. + +.. code-block:: postgres + + create schema if not exists private; + + -- For simplicity's sake the table is devoid of constraints on email, phone, etc. + create table private.details( + id int primary key references public.people + , email text + , phone text + , birthday date + , occupation text + , company text + ); + + -- other database objects in this schema + -- ... + -- ... + +To solve this, you can create a view of **details** in the ``public`` schema. We'll call it **public_details**. + +.. code-block:: postgres + + create view public.public_details as + select + id + , occupation + , company + from + private.details; + +Since PostgREST supports :ref:`embedding_views`, you can embed **people** with **public_details**. + +Let's insert some data to test this: + +.. code-block:: postgres + + insert into + public.people + values + (1, 'John Doe'), (2, 'Jane Doe'); + + insert into + private.details + values + (1, 'jhon@fake.com', '772-323-5433', '1990-02-01', 'Transportation attendant', 'Body Fate'), + (2, 'jane@fake.com', '480-474-6571', '1980-04-21', 'Geotechnical engineer', 'Earthworks Garden Kare'); + +.. important:: + + Make sure PostgREST's schema cache is up-to-date. See :ref:`schema_reloading`. + +Now, make the following request: + +.. code-block:: bash + + curl "http://localhost:3000/people?select=full_name,public_details(occupation,company)" + +The result should be: + +.. code-block:: json + + [ + {"full_name":"John Doe","public_details":[{"occupation":"Transportation attendant","company":"Body Fate"}]}, + {"full_name":"Jane Doe","public_details":[{"occupation":"Geotechnical engineer","company":"Earthworks Garden Kare"}]} + ] diff --git a/index.rst b/index.rst index 5c8a34dad5..f8649000dd 100644 --- a/index.rst +++ b/index.rst @@ -105,6 +105,12 @@ Translations tutorials/tut0.rst tutorials/tut1.rst +.. toctree:: + :caption: How-to guides + :titlesonly: + + how-tos/embedding-table-from-another-schema.rst + .. toctree:: :caption: Integrations :titlesonly: diff --git a/livereload_docs.py b/livereload_docs.py index 9983589aa5..d4d0ba6e8e 100755 --- a/livereload_docs.py +++ b/livereload_docs.py @@ -6,4 +6,5 @@ server = Server() server.watch('*.rst', shell('sphinx-build -b html -a -n . _build')) server.watch('tutorials/*.rst', shell('sphinx-build -b html -a -n . _build')) +server.watch('how-tos/*.rst', shell('sphinx-build -b html -a -n . _build')) server.serve(root='_build/') From bed1013ecd5334b0bf8a6ee8abaa2b6c63aed551 Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Wed, 14 Aug 2019 21:49:49 -0500 Subject: [PATCH 254/711] Fix #235, casting type to json object --- api.rst | 8 ++ how-tos/casting-type-to-custom-json.rst | 95 +++++++++++++++++++ .../embedding-table-from-another-schema.rst | 2 +- index.rst | 1 + 4 files changed, 105 insertions(+), 1 deletion(-) create mode 100644 how-tos/casting-type-to-custom-json.rst diff --git a/api.rst b/api.rst index 7c9ed9b9ed..ca8212c3e1 100644 --- a/api.rst +++ b/api.rst @@ -158,6 +158,9 @@ When certain columns are wide (such as those holding binary data), it is more ef The default is :sql:`*`, meaning all columns. This value will become more important below in :ref:`resource_embedding`. +Renaming Columns +~~~~~~~~~~~~~~~~ + You can rename the columns by prefixing them with an alias followed by the colon ``:`` operator. .. code-block:: http @@ -169,6 +172,11 @@ You can rename the columns by prefixing them with an alias followed by the colon {"fullName": "Jane Doe", "birthDate": "01/12/1998"} ] +.. _casting_columns: + +Casting Columns +~~~~~~~~~~~~~~~ + Casting the columns is possible by suffixing them with the double colon ``::`` plus the desired type. .. code-block:: http diff --git a/how-tos/casting-type-to-custom-json.rst b/how-tos/casting-type-to-custom-json.rst new file mode 100644 index 0000000000..f9d13afa79 --- /dev/null +++ b/how-tos/casting-type-to-custom-json.rst @@ -0,0 +1,95 @@ +Casting a type to a custom JSON object +====================================== + +While using PostgREST you might have noticed that certain PostgreSQL types translate to JSON strings when you would +have expected a JSON object or array. For example, let's see the case of `range types `_. + +.. code-block:: postgres + + -- example taken from https://www.postgresql.org/docs/11/rangetypes.html#RANGETYPES-EXAMPLES + create table reservations ( + room int + , during tsrange + ); + + insert into + reservations + values + (1108, tsrange('2010-01-01 14:30', '2010-01-01 15:30')); + +Here we have a column named **during** as a ``tsrange`` type, we would like to get it as JSON through PostgREST. + +.. code-block:: bash + + curl "http://localhost:3000/reservations" + +Result: + +.. code-block:: json + + [ + { + "room":1108, + "during":"[\"2010-01-01 14:30:00\",\"2010-01-01 15:30:00\")" + } + ] + +The **during** value is probably not the in the format you want. We get a JSON string because by default PostgreSQL casts +the type to JSON by using its ``text`` representation. We can change this representation to a custom JSON object by `creating a CAST `_ . + +To do this, first we'll define the function that will do the conversion from ``tsrange`` to ``json``. + +.. code-block:: postgres + + create or replace function tsrange_to_json(tsrange) returns json as $$ + select json_build_object( + 'lower', lower($1) + , 'upper', upper($1) + , 'lower_inc', lower_inc($1) + , 'upper_inc', upper_inc($1) + ); + $$ language sql; + +Using this function we'll create the CAST. + +.. code-block:: postgres + + create cast (tsrange as json) with function tsrange_to_json(tsrange) as assignment; + +And we'll do the request and :ref:`cast the column `. + +.. code-block:: bash + + curl "http://localhost:3000/reservations?select=room,during::json" + +The result now is: + +.. code-block:: json + + [ + { + "room":1108, + "during":{ + "lower" : "2010-01-01T14:30:00", + "upper" : "2010-01-01T15:30:00", + "lower_inc" : true, + "upper_inc" : false + } + } + ] + +You can use the same idea for creating custom CASTs for different types. + +.. note:: + + If you don't want to modify CASTs for built-in types, an option would be to `create a custom type `_ + for your own ``tsrange`` and add its own CAST. + + .. code-block:: postgres + + create type mytsrange as range (subtype = timestamp, subtype_diff = tsrange_subdiff); + + -- define column types and casting function analoguously to the above example + -- ... + + create cast (mytsrange as json) with function mytsrange_to_json(mytsrange) as assignment; diff --git a/how-tos/embedding-table-from-another-schema.rst b/how-tos/embedding-table-from-another-schema.rst index 7517064646..60265dd409 100644 --- a/how-tos/embedding-table-from-another-schema.rst +++ b/how-tos/embedding-table-from-another-schema.rst @@ -16,7 +16,7 @@ And you want to :ref:`embed ` the **people** table with a ** create schema if not exists private; - -- For simplicity's sake the table is devoid of constraints on email, phone, etc. + -- For simplicity's sake the table is devoid of constraints/domains on email, phone, etc. create table private.details( id int primary key references public.people , email text diff --git a/index.rst b/index.rst index f8649000dd..8f6bdf28ff 100644 --- a/index.rst +++ b/index.rst @@ -110,6 +110,7 @@ Translations :titlesonly: how-tos/embedding-table-from-another-schema.rst + how-tos/casting-type-to-custom-json.rst .. toctree:: :caption: Integrations From abdc2ac2a98ae8ae4277e5c9fd868e5e8893f5a6 Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Thu, 15 Aug 2019 14:40:06 -0500 Subject: [PATCH 255/711] Remove integrations section --- index.rst | 6 - integrations/timescaledb.rst | 327 ----------------------------------- 2 files changed, 333 deletions(-) delete mode 100644 integrations/timescaledb.rst diff --git a/index.rst b/index.rst index 8f6bdf28ff..c126cddaf1 100644 --- a/index.rst +++ b/index.rst @@ -112,12 +112,6 @@ Translations how-tos/embedding-table-from-another-schema.rst how-tos/casting-type-to-custom-json.rst -.. toctree:: - :caption: Integrations - :titlesonly: - - integrations/timescaledb.rst - .. toctree:: :caption: Installation :titlesonly: diff --git a/integrations/timescaledb.rst b/integrations/timescaledb.rst deleted file mode 100644 index ea372a507b..0000000000 --- a/integrations/timescaledb.rst +++ /dev/null @@ -1,327 +0,0 @@ -TimescaleDB for Time-Series Data -================================ - -`TimescaleDB `_ is an open-source database designed to make SQL scalable for time-series data. It is engineered up from PostgreSQL, providing automatic partitioning across time and space, while retaining the standard PostgreSQL interface. - -PostgREST turns your PostgreSQL database directly into a RESTful API, since TimescaleDB is packaged as a PostgreSQL extension it works with PostgREST as well. - -In this tutorial we'll explore some of TimescaleDB features through PostgREST. - -Install Docker --------------- - -For an easier setup we're going to use `Docker `_, make sure you have it installed. - -Run TimescaleDB ---------------- - -First, let’s pull and start the `TimescaleDB container image `_: - -.. code-block:: bash - - docker run --name tsdb_tut \ - -e POSTGRES_PASSWORD=mysecretpassword \ - -p 5433:5432 \ - -d timescale/timescaledb:latest-pg11 - -This will run the container as a daemon and expose port ``5433`` to the host system so that it doesn't conflict with another PostgreSQL installation. - -Set up TimescaleDB ------------------- - -Now, we'll create the ``timescaledb`` extension in our database. - -Run ``psql`` in the container we created in the previous step. - -.. code-block:: bash - - docker exec -it tsdb_tut psql -U postgres - ## Run all the following commands inside psql - -And create the extension: - -.. code-block:: postgres - - create extension if not exists timescaledb cascade; - -Create an Hypertable --------------------- - -`Hypertables `_ are the core abstraction TimescaleDB offers for dealing with time-series data. - -To create an ``hypertable``, first we need to create standard PostgreSQL tables: - -.. code-block:: postgres - - create table if not exists locations( - device_id text primary key - , location text - , environment text - ); - - create table if not exists conditions( - time timestamp with time zone not null - , device_id text references locations(device_id) - , temperature numeric - , humidity numeric - ); - -Now, we'll convert ``conditions`` into an hypertable with `create_hypertable `_: - -.. code-block:: postgres - - SELECT create_hypertable('conditions', 'time', chunk_time_interval => interval '1 day'); - -- This also implicitly creates an index: CREATE INDEX ON "conditions"(time DESC); - - -- Exit psql - exit - - -Load sample data ----------------- - -To have some data to play with, we'll download the ``weather_small`` data set from `TimescaleDB's sample datasets `_. - -.. code-block:: bash - - ## Run bash inside the database container - docker exec -it tsdb_tut bash - - ## Download and uncompress the data - wget -qO- https://timescaledata.blob.core.windows.net/datasets/weather_small.tar.gz | tar xvz - - ## Copy data into the database - psql -U postgres <`_: - -.. code-block:: bash - - docker run --rm -p 3000:3000 \ - --name tsdb_pgrst \ - --link tsdb_tut \ - -e PGRST_DB_URI="postgres://postgres:mysecretpassword@tsdb_tut/postgres" \ - -e PGRST_DB_ANON_ROLE="postgres" \ - -d postgrest/postgrest:latest - -PostgREST on Hypertables ------------------------- - -We'll now see how to read data from hypertables through PostgREST. - -Since hypertables can be queried using standard `SELECT statements `_, we can query them through PostgREST normally. - -Suppose we want to run this query on ``conditions``: - -.. code-block:: postgres - - select - time, - device_id, - humidity - from conditions - where - humidity > 90 and - time < '2016-11-16' - order by time desc - limit 10; - -Using PostgREST :ref:`horizontal `/:ref:`vertical ` filtering, this query can be expressed as: - -.. code-block:: bash - - curl -G "localhost:3000/conditions" \ - -d select=time,device_id,humidity \ - -d humidity=gt.90 \ - -d time=lt.2016-11-16 \ - -d order=time.desc \ - -d limit=10 - ## This command is equivalent to: - ## curl "localhost:3000/conditions?select=time,device_id,humidity&humidity=gt.90&time=lt.2016-11-16&order=time.desc&limit=10" - ## Here we used -G and -d to make the command more readable - -The response will be: - -.. code-block:: json - - [{"time":"2016-11-15T23:58:00+00:00","device_id":"weather-pro-000982","humidity":90.90000000000006}, - {"time":"2016-11-15T23:58:00+00:00","device_id":"weather-pro-000968","humidity":92.3}, - {"time":"2016-11-15T23:58:00+00:00","device_id":"weather-pro-000963","humidity":96.29999999999993}, - {"time":"2016-11-15T23:58:00+00:00","device_id":"weather-pro-000951","humidity":94.39999999999998}, - {"time":"2016-11-15T23:58:00+00:00","device_id":"weather-pro-000950","humidity":93.69999999999982}, - {"time":"2016-11-15T23:58:00+00:00","device_id":"weather-pro-000915","humidity":94.69999999999997}, - {"time":"2016-11-15T23:58:00+00:00","device_id":"weather-pro-000911","humidity":93.2000000000001}, - {"time":"2016-11-15T23:58:00+00:00","device_id":"weather-pro-000910","humidity":91.30000000000017}, - {"time":"2016-11-15T23:58:00+00:00","device_id":"weather-pro-000901","humidity":92.30000000000005}, - {"time":"2016-11-15T23:58:00+00:00","device_id":"weather-pro-000895","humidity":91.00000000000014}] - -JOINs with relational tables ----------------------------- - -Hypertables support all standard `PostgreSQL constraints `_ . We can make use of the foreign key defined on ``locations`` to make a JOIN through PostgREST. A query such as: - -.. code-block:: postgres - - select - c.time, - c.temperature, - l.location, - l.environment - from conditions c - left join locations l on - c.device_id = l.device_id - order by time desc - limit 10; - -Can be expressed in PostgREST by using :ref:`resource_embedding`. - -.. code-block:: bash - - curl -G localhost:3000/conditions \ - -d select="time,temperature,device:locations(location,environment)" \ - -d order=time.desc \ - -d limit=10 - -.. code-block:: json - - [{"time":"2016-11-16T21:18:00+00:00","temperature":69.49999999999991,"device":{"location":"office-000202","environment":"inside"}}, - {"time":"2016-11-16T21:18:00+00:00","temperature":90,"device":{"location":"field-000205","environment":"outside"}}, - {"time":"2016-11-16T21:18:00+00:00","temperature":60.499999999999986,"device":{"location":"door-00085","environment":"doorway"}}, - {"time":"2016-11-16T21:18:00+00:00","temperature":91,"device":{"location":"swamp-000188","environment":"outside"}}, - {"time":"2016-11-16T21:18:00+00:00","temperature":42,"device":{"location":"arctic-000219","environment":"outside"}}, - {"time":"2016-11-16T21:18:00+00:00","temperature":70.80000000000003,"device":{"location":"office-000201","environment":"inside"}}, - {"time":"2016-11-16T21:18:00+00:00","temperature":62.699999999999974,"device":{"location":"door-00084","environment":"doorway"}}, - {"time":"2016-11-16T21:18:00+00:00","temperature":85.49999999999918,"device":{"location":"field-000204","environment":"outside"}}, - {"time":"2016-11-16T21:18:00+00:00","temperature":42,"device":{"location":"arctic-000218","environment":"outside"}}, - {"time":"2016-11-16T21:18:00+00:00","temperature":42,"device":{"location":"arctic-000217","environment":"outside"}}] - -Time-Oriented Analytics ------------------------ - -TimescaleDB includes new aggregate functions for time-oriented `analytics `_. - -For using aggregate queries with PostgREST you must create VIEWs or :ref:`s_procs`. Here's an example for using `time_bucket `_: - -.. code-block:: postgres - - -- Run psql in the database container - docker exec -it tsdb_tut psql -U postgres - - -- Create the function - create or replace function temperature_summaries(gap interval default '1 hour', prefix text default 'field') - returns table(hour text, avg_temp numeric, min_temp numeric, max_temp numeric) as $$ - select - time_bucket(gap, time)::text as hour, - trunc(avg(temperature), 2), - trunc(min(temperature), 2), - trunc(max(temperature), 2) - from conditions c - where c.device_id in ( - select device_id from locations - where location like prefix || '-%') - group by hour - $$ language sql stable; - - -- Exit psql - exit - -Every time the schema is changed you must reload PostgREST :ref:`schema cache ` so it can pick up the function parameters correctly. To reload, run: - -.. code-block:: bash - - docker kill --signal=USR1 tsdb_pgrst - - -Now, since the function is ``stable``, we can call it with ``GET`` as: - -.. code-block:: bash - - curl -G "localhost:3000/rpc/temperature_summaries" \ - -d gap=2minutes \ - -d order=hour.asc \ - -d limit=10 \ - -H "Accept: text/csv" - ## time_bucket accepts an interval type as it's argument - ## so you can pass gap=5minutes or gap=5hours - -.. code-block:: sql - - hour,avg_temp,min_temp,max_temp - "2016-11-15 12:00:00+00",72.97,68.00,78.00 - "2016-11-15 12:02:00+00",73.01,68.00,78.00 - "2016-11-15 12:04:00+00",73.05,68.00,78.10 - "2016-11-15 12:06:00+00",73.07,68.00,78.10 - "2016-11-15 12:08:00+00",73.11,68.00,78.10 - "2016-11-15 12:10:00+00",73.14,68.00,78.10 - "2016-11-15 12:12:00+00",73.17,68.00,78.19 - "2016-11-15 12:14:00+00",73.21,68.10,78.19 - "2016-11-15 12:16:00+00",73.24,68.10,78.29 - "2016-11-15 12:18:00+00",73.27,68.10,78.39 - -Note you can use PostgREST standard filtering on function results. Here we also changed the :ref:`res_format` to CSV. - -Fast Ingestion with Bulk Insert -------------------------------- - -You can use PostgREST :ref:`bulk_insert` to leverage TimescaleDB `fast ingestion `_. - -Let's do an insert of three rows: - -.. code-block:: bash - - curl "localhost:3000/conditions" \ - -H "Content-Type: application/json" \ - -H "Prefer: return=representation" \ - -d @- << EOF - [ - {"time": "2019-02-21 01:00:01-05", "device_id": "weather-pro-000000", "temperature": 40.0, "humidity": 59.9}, - {"time": "2019-02-21 01:00:02-05", "device_id": "weather-pro-000000", "temperature": 42.0, "humidity": 69.9}, - {"time": "2019-02-21 01:00:03-05", "device_id": "weather-pro-000000", "temperature": 44.0, "humidity": 79.9} - ] - EOF - -By using the ``Prefer: return=representation`` header we can see the successfully inserted rows: - -.. code-block:: json - - [{"time":"2019-02-21T06:00:01+00:00","device_id":"weather-pro-000000","temperature":40.0,"humidity":59.9}, - {"time":"2019-02-21T06:00:02+00:00","device_id":"weather-pro-000000","temperature":42.0,"humidity":69.9}, - {"time":"2019-02-21T06:00:03+00:00","device_id":"weather-pro-000000","temperature":44.0,"humidity":79.9}] - -Let's now insert a thousand rows, we'll use `jq `_ for constructing the array. - -.. code-block:: bash - - yes "{\"time\": \"$(date +'%F %T')\", \"device_id\": \"weather-pro-000001\", \"temperature\": 50, \"humidity\": 60}" | \ - head -n 1000 | jq -s '.' | \ - curl -i -d @- "http://localhost:3000/conditions" \ - -H "Content-Type: application/json" \ - -H "Prefer: count=exact" - -With ``Prefer: count=exact`` we can know how many rows were inserted. Check out the response: - -.. code-block:: haskell - - HTTP/1.1 201 Created - Transfer-Encoding: chunked - Date: Fri, 22 Feb 2019 16:47:05 GMT - Server: postgrest/5.2.0 (9969262) - Content-Range: */1000 - -You can see in ``Content-Range`` that the total number of inserted rows is ``1000``. - -Summing it up -------------- - -There you have it, with PostgREST you can get an instant and performant RESTful API for a TimescaleDB database. - -For a more in depth exploration of TimescaleDB capabilities, check their `docs `_. From f5868bc277a511654009830f95991192c16bfa2b Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Fri, 16 Aug 2019 14:25:55 -0500 Subject: [PATCH 256/711] Add server-unix-socket config --- install.rst | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/install.rst b/install.rst index 98abbb3a6a..72a0d9fadc 100644 --- a/install.rst +++ b/install.rst @@ -78,6 +78,7 @@ db-pool Int 10 db-extra-search-path String public server-host String 127.0.0.1 server-port Int 3000 +server-unix-socket String server-proxy-uri String jwt-secret String jwt-aud String @@ -153,7 +154,17 @@ server-host server-port ----------- - The port to bind the web server. + The TCP port to bind the web server. + +server-unix-socket +------------------ + + `Unix domain socket `_ where to bind the PostgREST web server. + If specified, this takes precedence over :ref:`server-port`. Example: + + .. code:: bash + + server-unix-socket = "/tmp/pgrst.sock" .. _server-proxy-uri: From eca325c11b7fbe9f638b2340cb7a0c243d909e79 Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Fri, 16 Aug 2019 14:36:59 -0500 Subject: [PATCH 257/711] Add materialized views mention --- api.rst | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/api.rst b/api.rst index ca8212c3e1..c5904779e6 100644 --- a/api.rst +++ b/api.rst @@ -565,8 +565,8 @@ this: Whenever FOREIGN KEY constraints change in the database schema you must refresh PostgREST's schema cache for Resource Embedding to work properly. See the section :ref:`schema_reloading`. -Embeddeding through join tables -------------------------------- +Embedding through join tables +----------------------------- PostgREST can also detect relationships going through join tables. Thus you can request the Actors for Films (which in this case finds the information through Roles). You can also reverse the direction of inclusion, asking for all Directors with each including the list of their Films: @@ -634,6 +634,7 @@ Since it contains ``competition_id`` and ``film_id``—and each one has a **fore GET /nominations_view?select=rank,competitions(name,year),films(title)&rank=eq.5 HTTP/1.1 +It's also possible to embed `Materialized Views `_. .. warning:: From a8b2ed313e64bc7b8759a3cd1306f52fb94c7131 Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Sat, 17 Aug 2019 13:11:15 -0500 Subject: [PATCH 258/711] Add db-pool-timeout config --- install.rst | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/install.rst b/install.rst index 72a0d9fadc..0e288d3eee 100644 --- a/install.rst +++ b/install.rst @@ -75,6 +75,7 @@ db-uri String Y db-schema String Y db-anon-role String Y db-pool Int 10 +db-pool-timeout Int 10 db-extra-search-path String public server-host String 127.0.0.1 server-port Int 3000 @@ -125,6 +126,11 @@ db-pool Number of connections to keep open in PostgREST's database pool. Having enough here for the maximum expected simultaneous client connections can improve performance. Note it's pointless to set this higher than the :code:`max_connections` GUC in your database. +db-pool-timeout +--------------- + + Time to live for an idle database pool connection. + .. _db-extra-search-path: db-extra-search-path From 2414c7f7f0e58012fa238574aeab4f13d8f3b0af Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Sat, 17 Aug 2019 14:45:45 -0500 Subject: [PATCH 259/711] Add bulk call reference --- api.rst | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/api.rst b/api.rst index c5904779e6..d0470ed160 100644 --- a/api.rst +++ b/api.rst @@ -811,6 +811,27 @@ PostgREST will detect if the function is scalar or table-valued and will shape t { "title": "Blade Runner 2049", "rating": 8.1} ] +Bulk Call +--------- + +It's possible to call a function in a bulk way, analoguosly to :ref:`bulk_insert`. + +.. code-block:: http + + POST /rpc/add_them HTTP/1.1 + Content-Type: application/json + + [ + {"a": 1, "b": 2}, + {"a": 3, "b": 4} + ] + +Result: + +.. code-block:: json + + [ 3, 7 ] + Function filters ---------------- From 51c0ad3e0c0467af53de208a69ed7ed0b511f543 Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Sat, 17 Aug 2019 15:34:14 -0500 Subject: [PATCH 260/711] Add specify columns reference --- api.rst | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/api.rst b/api.rst index d0470ed160..82948fe792 100644 --- a/api.rst +++ b/api.rst @@ -832,6 +832,8 @@ Result: [ 3, 7 ] +It's also possible to :ref:`Specify Columns ` on functions calls. + Function filters ---------------- @@ -1066,6 +1068,34 @@ To bulk insert JSON post an array of objects having all-matching keys { "name": "Janus", "age": 10, "height": 55 } ] +.. _specify_columns: + +Specifying Columns +------------------ + +By using the :code:`columns` query parameter it's possible to specify the payload keys that will be inserted/updated +and ignore the rest of the payload. + +.. code-block:: http + + POST /datasets?columns=source,publication_date,figure HTTP/1.1 + Content-Type: application/json + + { + "source": "Natural Disaster Prevention and Control", + "publication_date": "2015-09-11", + "figure": 1100, + "location": "...", + "comment": "...", + "extra": "...", + "stuff": "..." + } + +In this case, only **source**, **publication_date** and **figure** will be inserted. The rest of the JSON keys will be ignored. + +Using this also has the side-effect of being more efficient for :ref:`bulk_insert` since PostgREST will not process the JSON and +it'll send it directly to PostgreSQL. + Upsert ------ From afff7a00a48a173f36dacbb1b01bf558ff4ad8e3 Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Mon, 19 Aug 2019 13:06:12 -0500 Subject: [PATCH 261/711] Put accessing and setting headers together --- api.rst | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/api.rst b/api.rst index 82948fe792..67a911b5bb 100644 --- a/api.rst +++ b/api.rst @@ -914,6 +914,20 @@ Stored procedures can access request headers, cookies and jwt claims by reading ``request.jwt.claim.role`` defaults to the value of :ref:`db-anon-role`. +Setting Response Headers +------------------------ + +PostgREST reads the ``response.headers`` SQL variable to add extra headers to the HTTP response. Stored procedures can modify this variable. For instance, this statement would add caching headers to the response: + +.. code-block:: sql + + -- tell client to cache response for two days + + SET LOCAL "response.headers" = + '[{"Cache-Control": "public"}, {"Cache-Control": "max-age=259200"}]'; + +Notice that the variable should be set to an *array* of single-key objects rather than a single multiple-key object. This is because headers such as ``Cache-Control`` or ``Set-Cookie`` need to be repeated when setting multiple values and an object would not allow the repeated key. + Errors and HTTP Status Codes ---------------------------- @@ -962,20 +976,6 @@ Returns: {"hint":"Upgrade your plan","details":"Quota exceeded"} -Setting Response Headers ------------------------- - -PostgREST reads the ``response.headers`` SQL variable to add extra headers to the HTTP response. Stored procedures can modify this variable. For instance, this statement would add caching headers to the response: - -.. code-block:: sql - - -- tell client to cache response for two days - - SET LOCAL "response.headers" = - '[{"Cache-Control": "public"}, {"Cache-Control": "max-age=259200"}]'; - -Notice that the variable should be set to an *array* of single-key objects rather than a single multiple-key object. This is because headers such as ``Cache-Control`` or ``Set-Cookie`` need to be repeated when setting multiple values and an object would not allow the repeated key. - Insertions / Updates ==================== From b38e29c3d1f258fcb9af5a021a62bf5ea1b2a1c3 Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Mon, 19 Aug 2019 13:50:46 -0500 Subject: [PATCH 262/711] Add text/plain reference Also move binary output to a top heading. --- api.rst | 95 ++++++++++++++++++++++++++++++++++----------------------- 1 file changed, 57 insertions(+), 38 deletions(-) diff --git a/api.rst b/api.rst index 67a911b5bb..5e7271de50 100644 --- a/api.rst +++ b/api.rst @@ -452,44 +452,6 @@ When a singular response is requested but no entries are found, the server respo Admittedly PostgREST could detect when there is an equality condition holding on all columns constituting the primary key and automatically convert to singular. However this could lead to a surprising change of format that breaks unwary client code just by filtering on an extra column. Instead we allow manually specifying singular vs plural to decouple that choice from the URL format. -Binary output -------------- - -If you want to return raw binary data from a :code:`bytea` column, you must specify :code:`application/octet-stream` as part of the :code:`Accept` header -and select a single column :code:`?select=bin_data`. - -.. code-block:: http - - GET /items?select=bin_data&id=eq.1 HTTP/1.1 - Accept: application/octet-stream - -You can also request binary output when calling `Stored Procedures`_ and since they can return a scalar value you are not forced to use :code:`select` -for this case. - -.. code-block:: postgres - - CREATE FUNCTION closest_point(..) RETURNS bytea .. - -.. code-block:: http - - POST /rpc/closest_point HTTP/1.1 - Accept: application/octet-stream - -If the stored procedure returns non-scalar values, you need to do a :code:`select` in the same way as for GET binary output. - -.. code-block:: sql - - CREATE FUNCTION overlapping_regions(..) RETURNS SETOF TABLE(geom_twkb bytea, ..) .. - -.. code-block:: http - - POST /rpc/overlapping_regions?select=geom_twkb HTTP/1.1 - Accept: application/octet-stream - -.. note:: - - If more than one row would be returned the binary results will be concatenated with no delimiter. - .. _resource_embedding: Resource Embedding @@ -1145,6 +1107,63 @@ To delete rows in a table, use the DELETE verb plus :ref:`h_filter`. For instanc Beware of accidentally deleting all rows in a table. To learn to prevent that see :ref:`block_fulltable`. +.. _binary_output: + +Binary Output +============= + +If you want to return raw binary data from a :code:`bytea` column, you must specify :code:`application/octet-stream` as part of the :code:`Accept` header +and select a single column :code:`?select=bin_data`. + +.. code-block:: http + + GET /items?select=bin_data&id=eq.1 HTTP/1.1 + Accept: application/octet-stream + +You can also request binary output when calling `Stored Procedures`_ and since they can return a scalar value you are not forced to use :code:`select` +for this case. + +.. code-block:: postgres + + CREATE FUNCTION closest_point(..) RETURNS bytea .. + +.. code-block:: http + + POST /rpc/closest_point HTTP/1.1 + Accept: application/octet-stream + +If the stored procedure returns non-scalar values, you need to do a :code:`select` in the same way as for GET binary output. + +.. code-block:: sql + + CREATE FUNCTION overlapping_regions(..) RETURNS SETOF TABLE(geom_twkb bytea, ..) .. + +.. code-block:: http + + POST /rpc/overlapping_regions?select=geom_twkb HTTP/1.1 + Accept: application/octet-stream + +.. note:: + + If more than one row would be returned the binary results will be concatenated with no delimiter. + +Plain Text Output +----------------- + +You can get raw output from a ``text`` column by using ``Accept: text/plain``. + +.. code-block:: http + + GET /workers?select=custom_psv_format HTTP/1.1 + Accept: text/plain + + 09310817|JOHN|DOE|15/04/88| + 42152780|FRED|BLOGGS|20/02/85| + 43006541|OTTO|NORMALVERBRAUCHER|01/07/90| + 02452492|ERIKA|MUSTERMANN|11/01/80| + +This follows the same rules as :ref:`binary_output`. + OpenAPI Support =============== From 2d6c16c2a6ef2a0ecd03909a6673e92a71189718 Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Mon, 19 Aug 2019 15:33:55 -0500 Subject: [PATCH 263/711] Fix #234, reference for raw-media-types --- install.rst | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/install.rst b/install.rst index 0e288d3eee..0c71f25edb 100644 --- a/install.rst +++ b/install.rst @@ -88,6 +88,7 @@ max-rows Int ∞ pre-request String app.settings.* String role-claim-key String .role +raw-media-types String ==================== ====== ========= ======== .. _db-uri: @@ -254,6 +255,22 @@ role-claim-key # non-alphanumerical characters can go inside quotes(escaped in the config value) role-claim-key = ".\"https://www.example.com/role\".key" +.. _raw-media-types: + +raw-media-types +--------------- + + This serves to extend the media types that PostgREST currently accepts through an ``Accept`` header. + + These media types can be requested by following the same rules as the ones defined in :ref:`binary_output`. + + As an example, the below config would allow you to request an **image** and an **xml** by doing a request with ``Accept: image/png`` + and a request with ``Accept: text/xml``, respectively. + + .. code:: bash + + raw-media-types="image/png, text/xml" + Running the Server ================== From 4fe34079d8da42a280e9d23ec87c1b44e6dc5039 Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Tue, 20 Aug 2019 14:23:05 -0500 Subject: [PATCH 264/711] Reorganize ecosystem section --- admin.rst | 4 +- ecosystem.rst | 102 ++++++++++++++++++++++++++++++++++++++++++++++++++ index.rst | 98 +++++------------------------------------------- 3 files changed, 114 insertions(+), 90 deletions(-) create mode 100644 ecosystem.rst diff --git a/admin.rst b/admin.rst index f7075f9a61..3638516567 100644 --- a/admin.rst +++ b/admin.rst @@ -84,9 +84,9 @@ However including the request header :code:`Prefer: count=exact` calculates and This is fine in small tables, but count performance degrades in big tables due to the MVCC architecture of PostgreSQL. For very large tables it can take a very long time to retrieve the results which allows a denial of service attack. The solution is to strip this header from all requests: -.. code:: +.. code-block:: postgres - Nginx stuff. Remove any prefer header which contains the word count + -- Pending nginx config: Remove any prefer header which contains the word count .. note:: diff --git a/ecosystem.rst b/ecosystem.rst new file mode 100644 index 0000000000..a64c88579e --- /dev/null +++ b/ecosystem.rst @@ -0,0 +1,102 @@ +.. _eco_external_notification: + +External Notification +--------------------- + +These are PostgreSQL bridges that propagate LISTEN/NOTIFY to external queues for further processing. This allows stored procedures to initiate actions outside the database such as sending emails. + +* `diogob/postgres-websockets `_ - expose web sockets for PostgreSQL's LISTEN/NOTIFY +* `frafra/postgresql2websocket `_ - Websockets +* `matthewmueller/pg-bridge `_ - Amazon SNS +* `aweber/pgsql-listen-exchange `_ - RabbitMQ +* `SpiderOak/skeeter `_ - ZeroMQ +* `FGRibreau/postgresql-to-amqp `_ - AMQP +* `daurnimator/pg-kinesis-bridge `_ - Amazon Kinesis + +.. _eco_example_apps: + +Example Apps +------------ + +* `tatut/postgrest-ui `_ - ClojureScript UI components for PostgREST +* `priyank-purohit/PostGUI `_ - React Material UI admin panel +* `Qu4tro/pgrst-dev-setup `_ - docker-compose and tmuxp setup for experimentation. +* `subzerocloud/postgrest-starter-kit `_ - Boilerplate for new project +* `NikolayS/postgrest-google-translate `_ - Calling to external translation service +* `CodeforAustralia/heritage-near-me `_ - Elm and PostgREST with PostGIS +* `timwis/handsontable-postgrest `_ - An excel-like database table editor +* `Recmo/PostgrestSkeleton `_ - Docker Compose, PostgREST, Nginx and Auth0 +* `benoror/ember-postgrest-dynamic-ui `_ - generating Ember forms to edit data +* `ruslantalpa/blogdemo `_ - blog api demo in a vagrant image +* `timwis/ext-postgrest-crud `_ - browser-based spreadsheet +* `srid/chronicle `_ - tracking a tree of personal memories +* `diogob/elm-workshop `_ - building a simple database query UI +* `myfreeweb/moneylog `_ - accounting web app in Polymer + PostgREST +* `tyrchen/goodfilm `_ - example film api +* `begriffs/postgrest-example `_ - sqitch versioning for API +* `SMRxT/postgrest-demo `_ - multi-tenant logging system +* `PierreRochard/postgrest-boilerplate `_ - example auth back-end +* `marmelab/ng-admin-postgrest `_ - automatic database admin panel + +.. _eco_extensions: + +Extensions +---------- + +* `pg-safeupdate `_ - Prevent full-table updates or deletes +* `srid/spas `_ - allow file uploads and basic auth +* `svmnotn/postgrest-auth `_ - OAuth2-inspired external auth server +* `wildsurfer/postgrest-oauth-server `_ - OAuth2 server +* `nblumoe/postgrest-oauth `_ - OAuth2 WAI middleware +* `criles25/postgrest-auth `_ - email based auth/signup +* `ppKrauss/PostgREST-writeAPI `_ - generate Nginx rewrite rules to fit an OpenAPI spec + +.. _clientside_libraries: + +Client-Side Libraries +--------------------- + +* `Kong/py-postgrest `_ - Python +* `datrium/postgrest-pyclient `_ - Python +* `tomberek/aor-postgrest-client `_ - JS, admin-on-rest +* `hugomrdias/postgrest-url `_ - JS, just for generating query URLs +* `john-kelly/elm-postgrest `_ - Elm +* `mithril.postgrest `_ - JS, Mithril +* `lewisjared/postgrest-request `_ - JS, SuperAgent +* `JarvusInnovations/jarvus-postgrest-apikit `_ - JS, Sencha framework +* `davidthewatson/postgrest_python_requests_client `_ - Python +* `calebmer/postgrest-client `_ - JS +* `clesiemo3/postgrestR `_ - R +* `PierreRochard/postgrest-angular `_ - TypeScript, generate UI from API description +* `thejettdurham/postgrest-sharp-client `_ (needs maintainer) - C#, RestSharp +* `team142/ng-postgrest `_ - Angular app for browsing, editing data exposed over Postgrest. + +.. _eco_commercial: + +Commercial +--------------- + +* `subZero `_ - Automated GraphQL & REST API with built-in caching (powered in part by PostgREST) + +.. _eco_production: + +In Production +------------- + +* `Moat `_ +* `Catarse `_ +* `Redsmin `_ +* `Image-charts `_ +* `MotionDynamic - Fast highly dynamic video generation at scale `_ +* `Drip Depot `_ +* `Convene `_ by Thomson-Reuters +* `eGull `_ +* `Elyios `_ +* `Simply Connected Systems `_ +* `Nimbus `_ + + - See how Nimbus uses PostgREST in `Paul Copplestone's blog post `_. +* `Datrium `_ + +.. * `OpenBooking `_ +.. * `triggerFS - A realtime messaging and distributed trigger system `_ diff --git a/index.rst b/index.rst index c126cddaf1..f60cccf674 100644 --- a/index.rst +++ b/index.rst @@ -141,96 +141,18 @@ Ecosystem PostgREST has a growing ecosystem of examples, and libraries, experiments, and users. Here is a selection. -Example Apps ------------- - -* `subzerocloud/postgrest-starter-kit `_ - Boilerplate for new project -* `NikolayS/postgrest-google-translate `_ - Calling to external translation service -* `CodeforAustralia/heritage-near-me `_ - Elm and PostgREST with PostGIS -* `timwis/handsontable-postgrest `_ - An excel-like database table editor -* `Recmo/PostgrestSkeleton `_ - Docker Compose, PostgREST, Nginx and Auth0 -* `benoror/ember-postgrest-dynamic-ui `_ - generating Ember forms to edit data -* `ruslantalpa/blogdemo `_ - blog api demo in a vagrant image -* `timwis/ext-postgrest-crud `_ - browser-based spreadsheet -* `srid/chronicle `_ - tracking a tree of personal memories -* `diogob/elm-workshop `_ - building a simple database query UI -* `marmelab/ng-admin-postgrest `_ - automatic database admin panel -* `myfreeweb/moneylog `_ - accounting web app in Polymer + PostgREST -* `tyrchen/goodfilm `_ - example film api -* `begriffs/postgrest-example `_ - sqitch versioning for API -* `SMRxT/postgrest-demo `_ - multi-tenant logging system -* `PierreRochard/postgrest-boilerplate `_ - example auth back-end - - -.. _clientside_libraries: - -Client-Side Libraries ---------------------- - -* `tomberek/aor-postgrest-client `_ - JS, admin-on-rest -* `hugomrdias/postgrest-url `_ - JS, just for generating query URLs -* `john-kelly/elm-postgrest `_ - Elm -* `mithril.postgrest `_ - JS, Mithril -* `lewisjared/postgrest-request `_ - JS, SuperAgent -* `JarvusInnovations/jarvus-postgrest-apikit `_ - JS, Sencha framework -* `davidthewatson/postgrest_python_requests_client `_ - Python -* `datrium/postgrest-pyclient `_ - Python -* `calebmer/postgrest-client `_ - JS -* `clesiemo3/postgrestR `_ - R -* `PierreRochard/postgrest-angular `_ - TypeScript, generate UI from API description -* `thejettdurham/postgrest-sharp-client `_ (needs maintainer) - C#, RestSharp -* `team142/ng-postgrest `_ - Angular app for browsing, editing data exposed over Postgrest. - -External Notification ---------------------- - -These are PostgreSQL bridges that propagate LISTEN/NOTIFY to external queues for further processing. This allows stored procedures to initiate actions outside the database such as sending emails. - -* `diogob/postgres-websockets `_ - expose web sockets for PostgreSQL's LISTEN/NOTIFY -* `frafra/postgresql2websocket `_ - Websockets -* `matthewmueller/pg-bridge `_ - Amazon SNS -* `aweber/pgsql-listen-exchange `_ - RabbitMQ -* `SpiderOak/skeeter `_ - ZeroMQ -* `FGRibreau/postgresql-to-amqp `_ - AMQP -* `daurnimator/pg-kinesis-bridge `_ - Amazon Kinesis - -Extensions ----------- - -* `pg-safeupdate `_ - Prevent full-table updates or deletes -* `srid/spas `_ - allow file uploads and basic auth -* `svmnotn/postgrest-auth `_ - OAuth2-inspired external auth server -* `wildsurfer/postgrest-oauth-server `_ - OAuth2 server -* `nblumoe/postgrest-oauth `_ - OAuth2 WAI middleware -* `criles25/postgrest-auth `_ - email based auth/signup -* `ppKrauss/PostgREST-writeAPI `_ - generate Nginx rewrite rules to fit an OpenAPI spec - -Commercial ---------------- - -* `subZero `_ - Automated GraphQL & REST API with built-in caching (powered in part by PostgREST) - -In Production -------------- - -* `Moat `_ -* `Catarse `_ -* `Redsmin `_ -* `Image-charts `_ -* `MotionDynamic - Fast highly dynamic video generation at scale `_ -* `Drip Depot `_ -* `OpenBooking `_ -* `Convene `_ by Thomson-Reuters -* `eGull `_ -* `Elyios `_ -* `Simply Connected Systems `_ -* `Nimbus `_ - - - See how Nimbus uses PostgREST in `Paul Copplestone's blog post `_. +.. toctree:: + :caption: Ecosystem + :hidden: -* `triggerFS - A realtime messaging and distributed trigger system `_ -* `Datrium `_ + ecosystem.rst +* :ref:`eco_external_notification` +* :ref:`eco_example_apps` +* :ref:`eco_extensions` +* :ref:`clientside_libraries` +* :ref:`eco_commercial` +* :ref:`eco_production` Testimonials ------------ From 8271885bb2385612e993edc94997955911c5a05e Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Tue, 20 Aug 2019 14:42:22 -0500 Subject: [PATCH 265/711] Remove some elements of the index page As mentioned in https://github.com/PostgREST/postgrest-docs/issues/249, the embracing the relational model sectin would better fit in a page about our REST style. The shared improvements section no longer seems relevant since we're already an established open source project. Release notes are not removed but hidden from the index page. --- index.rst | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/index.rst b/index.rst index f60cccf674..021c1bb5cd 100644 --- a/index.rst +++ b/index.rst @@ -54,21 +54,11 @@ Leak-proof Abstraction There is no ORM involved. Creating new views happens in SQL with known performance implications. A database administrator can now create an API from scratch with no custom programming. -Embracing the Relational Model ------------------------------- - -In 1970 E. F. Codd criticized the then-dominant hierarchical model of databases in his article A Relational Model of Data for Large Shared Data Banks. Reading the article reveals a striking similarity between hierarchical databases and nested http routes. With PostgREST we attempt to use flexible filtering and embedding rather than nested routes. - One Thing Well -------------- PostgREST has a focused scope. It works well with other tools like Nginx. This forces you to cleanly separate the data-centric CRUD operations from other concerns. Use a collection of sharp tools rather than building a big ball of mud. -Shared Improvements -------------------- - -As with any open source project, we all gain from features and fixes in the tool. It's more beneficial than improvements locked inextricably within custom code-bases. - Getting Support ---------------- @@ -95,6 +85,7 @@ Translations .. toctree:: :caption: Release Notes :titlesonly: + :hidden: release_notes.rst @@ -107,6 +98,7 @@ Translations .. toctree:: :caption: How-to guides + :name: how-tos :titlesonly: how-tos/embedding-table-from-another-schema.rst From 7805b99d573f7ae8532f0a28fcdfb3769d73a595 Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Thu, 22 Aug 2019 15:06:37 -0500 Subject: [PATCH 266/711] Fix #213, reorganize index --- configuration.rst | 210 +++++++++++++++++++++++++++++++++++++++++++++ index.rst | 88 ++++++++++++------- install.rst | 209 +------------------------------------------- livereload_docs.py | 2 + 4 files changed, 273 insertions(+), 236 deletions(-) create mode 100644 configuration.rst diff --git a/configuration.rst b/configuration.rst new file mode 100644 index 0000000000..1bc197385a --- /dev/null +++ b/configuration.rst @@ -0,0 +1,210 @@ +.. _configuration: + +Configuration +============= + +Here is the full list of configuration parameters. + +==================== ====== ========= ======== +Name Type Default Required +==================== ====== ========= ======== +db-uri String Y +db-schema String Y +db-anon-role String Y +db-pool Int 10 +db-pool-timeout Int 10 +db-extra-search-path String public +server-host String 127.0.0.1 +server-port Int 3000 +server-unix-socket String +server-proxy-uri String +jwt-secret String +jwt-aud String +secret-is-base64 Bool False +max-rows Int ∞ +pre-request String +app.settings.* String +role-claim-key String .role +raw-media-types String +==================== ====== ========= ======== + +.. _db-uri: + +db-uri +------ + + The standard connection PostgreSQL `URI format `_. Symbols and unusual characters in the password or other fields should be percent encoded to avoid a parse error. If enforcing an SSL connection to the database is required you can use `sslmode `_ in the URI, for example ``postgres://user:pass@host:5432/dbname?sslmode=require``. + + When running PostgREST on the same machine as PostgreSQL, it is also possible to connect to the database using a `Unix socket `_ and the `Peer Authentication method `_ as an alternative to TCP/IP communication and authentication with a password, this also grants higher performance. To do this you can omit the host and the password, e.g. ``postgres://user@/dbname``, see the `libpq connection string `_ documentation for more details. + + On older systems like Centos 6, with older versions of libpq, a different db-uri syntax has to be used. In this case the URI is a string of space separated key-value pairs (key=value), so the example above would be :code:`"host=host user=user port=5432 dbname=dbname password=pass"`. + + Choosing a value for this parameter beginning with the at sign such as ``@filename`` (e.g. ``@./configs/my-config``) loads the secret out of an external file. + +.. _db-schema: + +db-schema +--------- + + The database schema to expose to REST clients. Tables, views and stored procedures in this schema will get API endpoints. + + This schema gets added to the `search_path `_ of every request. + +.. _db-anon-role: + +db-anon-role +------------ + + The database role to use when executing commands on behalf of unauthenticated clients. + +.. _db-pool: + +db-pool +------- + + Number of connections to keep open in PostgREST's database pool. Having enough here for the maximum expected simultaneous client connections can improve performance. Note it's pointless to set this higher than the :code:`max_connections` GUC in your database. + +db-pool-timeout +--------------- + + Time to live for an idle database pool connection. + +.. _db-extra-search-path: + +db-extra-search-path +-------------------- + + Extra schemas to add to the `search_path `_ of every request. These schemas tables, views and stored procedures **don't get API endpoints**, they can only be referred from the database objects inside your :ref:`db-schema`. + + This parameter was meant to make it easier to use **PostgreSQL extensions** (like PostGIS) that are outside of the :ref:`db-schema`. + + Multiple schemas can be added in a comma-separated string, e.g. ``public, extensions``. + +.. _server-host: + +server-host +----------- + + Where to bind the PostgREST web server. In addition to the usual address options, PostgREST interprets these reserved addresses with special meanings: + + * :code:`*` - any IPv4 or IPv6 hostname + * :code:`*4` - any IPv4 or IPv6 hostname, IPv4 preferred + * :code:`!4` - any IPv4 hostname + * :code:`*6` - any IPv4 or IPv6 hostname, IPv6 preferred + * :code:`!6` - any IPv6 hostname + +.. _server-port: + +server-port +----------- + + The TCP port to bind the web server. + +server-unix-socket +------------------ + + `Unix domain socket `_ where to bind the PostgREST web server. + If specified, this takes precedence over :ref:`server-port`. Example: + + .. code:: bash + + server-unix-socket = "/tmp/pgrst.sock" + +.. _server-proxy-uri: + +server-proxy-uri +---------------- + + Overrides the base URL used within the OpenAPI self-documentation hosted at the API root path. Use a complete URI syntax :code:`scheme:[//[user:password@]host[:port]][/]path[?query][#fragment]`. Ex. :code:`https://postgrest.com` + + .. code:: json + + { + "swagger": "2.0", + "info": { + "version": "0.4.3.0", + "title": "PostgREST API", + "description": "This is a dynamic API generated by PostgREST" + }, + "host": "postgrest.com:443", + "basePath": "/", + "schemes": [ + "https" + ] + } + +.. _jwt-secret: + +jwt-secret +---------- + + The secret or `JSON Web Key (JWK) (or set) `_ used to decode JWT tokens clients provide for authentication. For security the key must be **at least 32 characters long**. If this parameter is not specified then PostgREST refuses authentication requests. Choosing a value for this parameter beginning with the at sign such as :code:`@filename` loads the secret out of an external file. This is useful for automating deployments. Note that any binary secrets must be base64 encoded. Both symmetric and asymmetric cryptography are supported. For more info see :ref:`asym_keys`. + +.. _jwt-aud: + +jwt-aud +------- + + Specifies the `JWT audience claim `_. If this claim is present in the client provided JWT then you must set this to the same value as in the JWT, otherwise verifying the JWT will fail. + +.. _secret-is-base64: + +secret-is-base64 +---------------- + + When this is set to :code:`true`, the value derived from :code:`jwt-secret` will be treated as a base64 encoded secret. + +.. _max-rows: + +max-rows +-------- + + A hard limit to the number of rows PostgREST will fetch from a view, table, or stored procedure. Limits payload size for accidental or malicious requests. + +.. _pre-request: + +pre-request +----------- + + A schema-qualified stored procedure name to call right after switching roles for a client request. This provides an opportunity to modify SQL variables or raise an exception to prevent the request from completing. + +.. _app.settings.*: + +app.settings.* +-------------- + + Arbitrary settings that can be used to pass in secret keys directly as strings, or via OS environment variables. For instance: :code:`app.settings.jwt_secret = "$(MYAPP_JWT_SECRET)"` will take :code:`MYAPP_JWT_SECRET` from the environment and make it available to postgresql functions as :code:`current_setting('app.settings.jwt_secret')`. + +.. _role-claim-key: + +role-claim-key +-------------- + + A JSPath DSL that specifies the location of the :code:`role` key in the JWT claims. This can be used to consume a JWT provided by a third party service like Auth0, Okta or Keycloak. Usage examples: + + .. code:: bash + + # {"postgrest":{"roles": ["other", "author"]}} + # the DSL accepts characters that are alphanumerical or one of "_$@" as keys + role-claim-key = ".postgrest.roles[1]" + + # {"https://www.example.com/role": { "key": "author }} + # non-alphanumerical characters can go inside quotes(escaped in the config value) + role-claim-key = ".\"https://www.example.com/role\".key" + +.. _raw-media-types: + +raw-media-types +--------------- + + This serves to extend the media types that PostgREST currently accepts through an ``Accept`` header. + + These media types can be requested by following the same rules as the ones defined in :ref:`binary_output`. + + As an example, the below config would allow you to request an **image** and an **xml** by doing a request with ``Accept: image/png`` + and a request with ``Accept: text/xml``, respectively. + + .. code:: bash + + raw-media-types="image/png, text/xml" + diff --git a/index.rst b/index.rst index 021c1bb5cd..3d43f32b33 100644 --- a/index.rst +++ b/index.rst @@ -64,24 +64,6 @@ Getting Support The project has a friendly and growing community. Join our `chat room `_ for discussion and help. You can also report or search for bugs/features on the Github `issues `_ page. -.. _supporting-dev: - -Supporting development ----------------------- - -You can help PostgREST ongoing maintenance and development by: - -- Making a regular donation through `Patreon `_ - -- Alternatively, you can make a one-time donation via `Paypal `_ - -Every donation will be spent on making PostgREST better for the whole community. - -Translations -~~~~~~~~~~~~ - -* `Chinese `_ (latest version ``v0.4.2.0``) - .. toctree:: :caption: Release Notes :titlesonly: @@ -89,26 +71,40 @@ Translations release_notes.rst +Tutorials +--------- + +Start here if you're new to PostgREST. + .. toctree:: + :glob: :caption: Tutorials - :titlesonly: + :hidden: + + tutorials/* + +- :doc:`tutorials/tut0` +- :doc:`tutorials/tut1` - tutorials/tut0.rst - tutorials/tut1.rst +How-to guides +------------- + +Goal-oriented guides that show how to solve a specific problem. .. toctree:: + :glob: :caption: How-to guides - :name: how-tos - :titlesonly: + :hidden: - how-tos/embedding-table-from-another-schema.rst - how-tos/casting-type-to-custom-json.rst + how-tos/* -.. toctree:: - :caption: Installation - :titlesonly: +- :doc:`how-tos/embedding-table-from-another-schema` +- :doc:`how-tos/casting-type-to-custom-json` - install.rst +Reference guides +---------------- + +Technical references for PostgREST's API and Configuration. .. toctree:: :caption: API @@ -116,12 +112,28 @@ Translations api.rst +.. toctree:: + :caption: Configuration + + configuration.rst + +Topic guides +------------ + +Explanations of some key concepts in PostgREST. + .. toctree:: :caption: Authentication :titlesonly: auth.rst +.. toctree:: + :caption: Installation + :titlesonly: + + install.rst + .. toctree:: :caption: Administration :titlesonly: @@ -146,6 +158,24 @@ PostgREST has a growing ecosystem of examples, and libraries, experiments, and u * :ref:`eco_commercial` * :ref:`eco_production` +.. _supporting-dev: + +Supporting development +---------------------- + +You can help PostgREST ongoing maintenance and development by: + +- Making a regular donation through `Patreon `_ + +- Alternatively, you can make a one-time donation via `Paypal `_ + +Every donation will be spent on making PostgREST better for the whole community. + +Translations +------------ + +* `Chinese `_ (latest version ``v0.4.2.0``) + Testimonials ------------ diff --git a/install.rst b/install.rst index 0c71f25edb..5c1a0777ab 100644 --- a/install.rst +++ b/install.rst @@ -36,8 +36,6 @@ To use PostgREST you will need an underlying database (PostgreSQL version 9.5 or On Windows, PostgREST will fail to run unless the PostgreSQL binaries are on the system path. To test whether this is the case, run ``pg_config`` from the command line. You should see it output a list of paths. -.. _configuration: - Configuration ============= @@ -47,7 +45,7 @@ The PostgREST server reads a configuration file to determine information about t ./postgrest /path/to/postgrest.conf -The file must contain a set of key value pairs. At minimum you must include these keys: +The configuration file must contain a set of key value pairs. At minimum you must include these keys: .. code:: @@ -66,210 +64,7 @@ The file must contain a set of key value pairs. At minimum you must include thes The user specified in the db-uri is also known as the authenticator role. For more information about the anonymous vs authenticator roles see the :ref:`roles`. -Here is the full list of configuration parameters. - -==================== ====== ========= ======== -Name Type Default Required -==================== ====== ========= ======== -db-uri String Y -db-schema String Y -db-anon-role String Y -db-pool Int 10 -db-pool-timeout Int 10 -db-extra-search-path String public -server-host String 127.0.0.1 -server-port Int 3000 -server-unix-socket String -server-proxy-uri String -jwt-secret String -jwt-aud String -secret-is-base64 Bool False -max-rows Int ∞ -pre-request String -app.settings.* String -role-claim-key String .role -raw-media-types String -==================== ====== ========= ======== - -.. _db-uri: - -db-uri ------- - - The standard connection PostgreSQL `URI format `_. Symbols and unusual characters in the password or other fields should be percent encoded to avoid a parse error. If enforcing an SSL connection to the database is required you can use `sslmode `_ in the URI, for example ``postgres://user:pass@host:5432/dbname?sslmode=require``. - - When running PostgREST on the same machine as PostgreSQL, it is also possible to connect to the database using a `Unix socket `_ and the `Peer Authentication method `_ as an alternative to TCP/IP communication and authentication with a password, this also grants higher performance. To do this you can omit the host and the password, e.g. ``postgres://user@/dbname``, see the `libpq connection string `_ documentation for more details. - - On older systems like Centos 6, with older versions of libpq, a different db-uri syntax has to be used. In this case the URI is a string of space separated key-value pairs (key=value), so the example above would be :code:`"host=host user=user port=5432 dbname=dbname password=pass"`. - - Choosing a value for this parameter beginning with the at sign such as ``@filename`` (e.g. ``@./configs/my-config``) loads the secret out of an external file. - -.. _db-schema: - -db-schema ---------- - - The database schema to expose to REST clients. Tables, views and stored procedures in this schema will get API endpoints. - - This schema gets added to the `search_path `_ of every request. - -.. _db-anon-role: - -db-anon-role ------------- - - The database role to use when executing commands on behalf of unauthenticated clients. - -.. _db-pool: - -db-pool -------- - - Number of connections to keep open in PostgREST's database pool. Having enough here for the maximum expected simultaneous client connections can improve performance. Note it's pointless to set this higher than the :code:`max_connections` GUC in your database. - -db-pool-timeout ---------------- - - Time to live for an idle database pool connection. - -.. _db-extra-search-path: - -db-extra-search-path --------------------- - - Extra schemas to add to the `search_path `_ of every request. These schemas tables, views and stored procedures **don't get API endpoints**, they can only be referred from the database objects inside your :ref:`db-schema`. - - This parameter was meant to make it easier to use **PostgreSQL extensions** (like PostGIS) that are outside of the :ref:`db-schema`. - - Multiple schemas can be added in a comma-separated string, e.g. ``public, extensions``. - -.. _server-host: - -server-host ------------ - - Where to bind the PostgREST web server. In addition to the usual address options, PostgREST interprets these reserved addresses with special meanings: - - * :code:`*` - any IPv4 or IPv6 hostname - * :code:`*4` - any IPv4 or IPv6 hostname, IPv4 preferred - * :code:`!4` - any IPv4 hostname - * :code:`*6` - any IPv4 or IPv6 hostname, IPv6 preferred - * :code:`!6` - any IPv6 hostname - -.. _server-port: - -server-port ------------ - - The TCP port to bind the web server. - -server-unix-socket ------------------- - - `Unix domain socket `_ where to bind the PostgREST web server. - If specified, this takes precedence over :ref:`server-port`. Example: - - .. code:: bash - - server-unix-socket = "/tmp/pgrst.sock" - -.. _server-proxy-uri: - -server-proxy-uri ----------------- - - Overrides the base URL used within the OpenAPI self-documentation hosted at the API root path. Use a complete URI syntax :code:`scheme:[//[user:password@]host[:port]][/]path[?query][#fragment]`. Ex. :code:`https://postgrest.com` - - .. code:: json - - { - "swagger": "2.0", - "info": { - "version": "0.4.3.0", - "title": "PostgREST API", - "description": "This is a dynamic API generated by PostgREST" - }, - "host": "postgrest.com:443", - "basePath": "/", - "schemes": [ - "https" - ] - } - -.. _jwt-secret: - -jwt-secret ----------- - - The secret or `JSON Web Key (JWK) (or set) `_ used to decode JWT tokens clients provide for authentication. For security the key must be **at least 32 characters long**. If this parameter is not specified then PostgREST refuses authentication requests. Choosing a value for this parameter beginning with the at sign such as :code:`@filename` loads the secret out of an external file. This is useful for automating deployments. Note that any binary secrets must be base64 encoded. Both symmetric and asymmetric cryptography are supported. For more info see :ref:`asym_keys`. - -.. _jwt-aud: - -jwt-aud -------- - - Specifies the `JWT audience claim `_. If this claim is present in the client provided JWT then you must set this to the same value as in the JWT, otherwise verifying the JWT will fail. - -.. _secret-is-base64: - -secret-is-base64 ----------------- - - When this is set to :code:`true`, the value derived from :code:`jwt-secret` will be treated as a base64 encoded secret. - -.. _max-rows: - -max-rows --------- - - A hard limit to the number of rows PostgREST will fetch from a view, table, or stored procedure. Limits payload size for accidental or malicious requests. - -.. _pre-request: - -pre-request ------------ - - A schema-qualified stored procedure name to call right after switching roles for a client request. This provides an opportunity to modify SQL variables or raise an exception to prevent the request from completing. - -.. _app.settings.*: - -app.settings.* --------------- - - Arbitrary settings that can be used to pass in secret keys directly as strings, or via OS environment variables. For instance: :code:`app.settings.jwt_secret = "$(MYAPP_JWT_SECRET)"` will take :code:`MYAPP_JWT_SECRET` from the environment and make it available to postgresql functions as :code:`current_setting('app.settings.jwt_secret')`. - -.. _role-claim-key: - -role-claim-key --------------- - - A JSPath DSL that specifies the location of the :code:`role` key in the JWT claims. This can be used to consume a JWT provided by a third party service like Auth0, Okta or Keycloak. Usage examples: - - .. code:: bash - - # {"postgrest":{"roles": ["other", "author"]}} - # the DSL accepts characters that are alphanumerical or one of "_$@" as keys - role-claim-key = ".postgrest.roles[1]" - - # {"https://www.example.com/role": { "key": "author }} - # non-alphanumerical characters can go inside quotes(escaped in the config value) - role-claim-key = ".\"https://www.example.com/role\".key" - -.. _raw-media-types: - -raw-media-types ---------------- - - This serves to extend the media types that PostgREST currently accepts through an ``Accept`` header. - - These media types can be requested by following the same rules as the ones defined in :ref:`binary_output`. - - As an example, the below config would allow you to request an **image** and an **xml** by doing a request with ``Accept: image/png`` - and a request with ``Accept: text/xml``, respectively. - - .. code:: bash - - raw-media-types="image/png, text/xml" +For a complete reference of the configuration parameters, see :ref:`configuration`. Running the Server ================== diff --git a/livereload_docs.py b/livereload_docs.py index d4d0ba6e8e..befcaa35ef 100755 --- a/livereload_docs.py +++ b/livereload_docs.py @@ -7,4 +7,6 @@ server.watch('*.rst', shell('sphinx-build -b html -a -n . _build')) server.watch('tutorials/*.rst', shell('sphinx-build -b html -a -n . _build')) server.watch('how-tos/*.rst', shell('sphinx-build -b html -a -n . _build')) +# For custom port and host +# server.serve(port=8080, host='192.168.1.2') server.serve(root='_build/') From 5942db7fa75a367551aa423e5d9bcb8d169670d6 Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Fri, 23 Aug 2019 13:30:26 -0500 Subject: [PATCH 267/711] Collapse index sections and improve the wording --- ecosystem.rst | 54 +++++++++++------------------------- index.rst | 70 +++++++++++++++++++++++++++++------------------ release_notes.rst | 32 ---------------------- 3 files changed, 60 insertions(+), 96 deletions(-) diff --git a/ecosystem.rst b/ecosystem.rst index a64c88579e..1ffc96e370 100644 --- a/ecosystem.rst +++ b/ecosystem.rst @@ -1,18 +1,3 @@ -.. _eco_external_notification: - -External Notification ---------------------- - -These are PostgreSQL bridges that propagate LISTEN/NOTIFY to external queues for further processing. This allows stored procedures to initiate actions outside the database such as sending emails. - -* `diogob/postgres-websockets `_ - expose web sockets for PostgreSQL's LISTEN/NOTIFY -* `frafra/postgresql2websocket `_ - Websockets -* `matthewmueller/pg-bridge `_ - Amazon SNS -* `aweber/pgsql-listen-exchange `_ - RabbitMQ -* `SpiderOak/skeeter `_ - ZeroMQ -* `FGRibreau/postgresql-to-amqp `_ - AMQP -* `daurnimator/pg-kinesis-bridge `_ - Amazon Kinesis - .. _eco_example_apps: Example Apps @@ -38,6 +23,22 @@ Example Apps * `PierreRochard/postgrest-boilerplate `_ - example auth back-end * `marmelab/ng-admin-postgrest `_ - automatic database admin panel +.. _eco_external_notification: + +External Notification +--------------------- + +These are PostgreSQL bridges that propagate LISTEN/NOTIFY to external queues for further processing. This allows stored procedures to initiate actions outside the database such as sending emails. + +* `diogob/postgres-websockets `_ - expose web sockets for PostgreSQL's LISTEN/NOTIFY +* `frafra/postgresql2websocket `_ - Websockets +* `matthewmueller/pg-bridge `_ - Amazon SNS +* `aweber/pgsql-listen-exchange `_ - RabbitMQ +* `SpiderOak/skeeter `_ - ZeroMQ +* `FGRibreau/postgresql-to-amqp `_ - AMQP +* `daurnimator/pg-kinesis-bridge `_ - Amazon Kinesis + + .. _eco_extensions: Extensions @@ -77,26 +78,3 @@ Commercial --------------- * `subZero `_ - Automated GraphQL & REST API with built-in caching (powered in part by PostgREST) - -.. _eco_production: - -In Production -------------- - -* `Moat `_ -* `Catarse `_ -* `Redsmin `_ -* `Image-charts `_ -* `MotionDynamic - Fast highly dynamic video generation at scale `_ -* `Drip Depot `_ -* `Convene `_ by Thomson-Reuters -* `eGull `_ -* `Elyios `_ -* `Simply Connected Systems `_ -* `Nimbus `_ - - - See how Nimbus uses PostgREST in `Paul Copplestone's blog post `_. -* `Datrium `_ - -.. * `OpenBooking `_ -.. * `triggerFS - A realtime messaging and distributed trigger system `_ diff --git a/index.rst b/index.rst index 3d43f32b33..3b49b816f3 100644 --- a/index.rst +++ b/index.rst @@ -74,7 +74,7 @@ The project has a friendly and growing community. Join our `chat room `. + How-to guides ------------- -Goal-oriented guides that show how to solve a specific problem. +These are recipes that'll help you address specific use-cases. .. toctree:: :glob: @@ -104,19 +106,23 @@ Goal-oriented guides that show how to solve a specific problem. Reference guides ---------------- -Technical references for PostgREST's API and Configuration. +Technical references for PostgREST's functionality. .. toctree:: :caption: API - :titlesonly: + :hidden: api.rst .. toctree:: :caption: Configuration + :hidden: configuration.rst +- :doc:`API ` +- :doc:`configuration` + Topic guides ------------ @@ -124,26 +130,30 @@ Explanations of some key concepts in PostgREST. .. toctree:: :caption: Authentication - :titlesonly: + :hidden: auth.rst .. toctree:: :caption: Installation - :titlesonly: + :hidden: install.rst .. toctree:: :caption: Administration - :titlesonly: + :hidden: admin.rst +- :doc:`Authentication ` +- :doc:`Installation ` +- :doc:`Administration ` + Ecosystem --------- -PostgREST has a growing ecosystem of examples, and libraries, experiments, and users. Here is a selection. +PostgREST has a growing ecosystem of examples, libraries, and experiments. Here is a selection. .. toctree:: :caption: Ecosystem @@ -151,30 +161,33 @@ PostgREST has a growing ecosystem of examples, and libraries, experiments, and u ecosystem.rst -* :ref:`eco_external_notification` * :ref:`eco_example_apps` +* :ref:`eco_external_notification` * :ref:`eco_extensions` * :ref:`clientside_libraries` * :ref:`eco_commercial` -* :ref:`eco_production` - -.. _supporting-dev: -Supporting development ----------------------- - -You can help PostgREST ongoing maintenance and development by: - -- Making a regular donation through `Patreon `_ - -- Alternatively, you can make a one-time donation via `Paypal `_ - -Every donation will be spent on making PostgREST better for the whole community. - -Translations ------------- +In Production +------------- -* `Chinese `_ (latest version ``v0.4.2.0``) +Here are some companies that use PostgREST in production. + +* `Datrium `_ +* `Nimbus `_ + - See how Nimbus uses PostgREST in `Paul Copplestone's blog post `_. +* `Catarse `_ +* `Moat `_ +* `Redsmin `_ +* `Image-charts `_ +* `MotionDynamic - Fast highly dynamic video generation at scale `_ +* `Drip Depot `_ +* `Convene `_ by Thomson-Reuters +* `eGull `_ +* `Elyios `_ +* `Simply Connected Systems `_ + +.. * `OpenBooking `_ +.. * `triggerFS - A realtime messaging and distributed trigger system `_ Testimonials ------------ @@ -215,3 +228,8 @@ Testimonials Couldn't be happier." -- Anupam Garg, Datrium, Inc. + +Translations +------------ + +* `Chinese `_ (latest version ``v0.4.2.0``) diff --git a/release_notes.rst b/release_notes.rst index c4aa0b7c29..e69de29bb2 100644 --- a/release_notes.rst +++ b/release_notes.rst @@ -1,32 +0,0 @@ -Release Notes -============= - -Here we'll include the most relevant changes so you can migrate to newer versions easily. -You can see the full changelog of each release in the `PostgREST repository `_. - -v5.2.0 -====== - -* `Explicit qualification `_ introduced in ``v5.0`` is no longer necessary, this section will not be included from this version onwards. A :ref:`db-extra-search-path` configuration parameter was introduced to avoid the need to explictly qualify database objects. If you install PostgreSQL extensions on the ``public`` schema, they'll work normally from now on. - -* Now you can filter :ref:`tabs-cols-w-spaces`. - -* Included the ability to quote columns that have :ref:`reserved-chars`. - -* Thanks to `Zhou Feng `_, now is possible to reference an external file in :ref:`db-uri`. - -* Thanks to `Russell Davies `_, Json Web Key Sets are now accepted by :ref:`jwt-secret`. - -Thanks ------- - -This release was made possible thanks to: - -* `Daniel Babiak `_ -* `Michel Pelletier `_ -* Tsingson Qin -* Jay Hannah -* Victor Adossi -* Petr Beles - -If you like to join them please consider :ref:`supporting PostgREST development `. From b9c9aee645c055c8fbbe6aeaa3ad1cb21cbbe1f6 Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Fri, 23 Aug 2019 14:23:58 -0500 Subject: [PATCH 268/711] Reorder configuration section --- configuration.rst | 34 ++++++++++++++++++++++++++++++---- install.rst | 23 ++--------------------- 2 files changed, 32 insertions(+), 25 deletions(-) diff --git a/configuration.rst b/configuration.rst index 1bc197385a..f44019b1e6 100644 --- a/configuration.rst +++ b/configuration.rst @@ -3,6 +3,31 @@ Configuration ============= +PostgREST reads a configuration file to determine information about the database and how to serve client requests. There is no predefined location for this file, you must specify the file path as the one and only argument to the server: + +.. code:: bash + + ./postgrest /path/to/postgrest.conf + +The configuration file must contain a set of key value pairs. At minimum you must include these keys: + +.. code:: + + # postgrest.conf + + # The standard connection URI format, documented at + # https://www.postgresql.org/docs/current/static/libpq-connect.html#AEN45347 + db-uri = "postgres://user:pass@host:5432/dbname" + + # The name of which database schema to expose to REST clients + db-schema = "api" + + # The database role to use when no client authentication is provided. + # Can (and should) differ from user in db-uri + db-anon-role = "anon" + +The user specified in the db-uri is also known as the authenticator role. For more information about the anonymous vs authenticator roles see the :ref:`roles`. + Here is the full list of configuration parameters. ==================== ====== ========= ======== @@ -14,7 +39,7 @@ db-anon-role String Y db-pool Int 10 db-pool-timeout Int 10 db-extra-search-path String public -server-host String 127.0.0.1 +server-host String !4 server-port Int 3000 server-unix-socket String server-proxy-uri String @@ -41,6 +66,7 @@ db-uri Choosing a value for this parameter beginning with the at sign such as ``@filename`` (e.g. ``@./configs/my-config``) loads the secret out of an external file. + .. _db-schema: db-schema @@ -55,7 +81,7 @@ db-schema db-anon-role ------------ - The database role to use when executing commands on behalf of unauthenticated clients. + The database role to use when executing commands on behalf of unauthenticated clients. For more information, see :ref:`roles`. .. _db-pool: @@ -197,11 +223,11 @@ role-claim-key raw-media-types --------------- - This serves to extend the media types that PostgREST currently accepts through an ``Accept`` header. + This serves to extend the `Media Types `_ that PostgREST currently accepts through an ``Accept`` header. These media types can be requested by following the same rules as the ones defined in :ref:`binary_output`. - As an example, the below config would allow you to request an **image** and an **xml** by doing a request with ``Accept: image/png`` + As an example, the below config would allow you to request an **image** and an **xml** by doing a request with ``Accept: image/png`` and a request with ``Accept: text/xml``, respectively. .. code:: bash diff --git a/install.rst b/install.rst index 5c1a0777ab..fc3f278cd9 100644 --- a/install.rst +++ b/install.rst @@ -39,32 +39,13 @@ On Windows, PostgREST will fail to run unless the PostgreSQL binaries are on the Configuration ============= -The PostgREST server reads a configuration file to determine information about the database and how to serve client requests. There is no predefined location for this file, you must specify the file path as the one and only argument to the server: +The PostgREST server reads a configuration file as its only argument: .. code:: bash ./postgrest /path/to/postgrest.conf -The configuration file must contain a set of key value pairs. At minimum you must include these keys: - -.. code:: - - # postgrest.conf - - # The standard connection URI format, documented at - # https://www.postgresql.org/docs/current/static/libpq-connect.html#AEN45347 - db-uri = "postgres://user:pass@host:5432/dbname" - - # The name of which database schema to expose to REST clients - db-schema = "api" - - # The database role to use when no client authentication is provided. - # Can (and probably should) differ from user in db-uri - db-anon-role = "anon" - -The user specified in the db-uri is also known as the authenticator role. For more information about the anonymous vs authenticator roles see the :ref:`roles`. - -For a complete reference of the configuration parameters, see :ref:`configuration`. +For a complete reference of the configuration file, see :ref:`configuration`. Running the Server ================== From 0d4b1d8f925d71fdf727374d9065ea3413a12cc1 Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Mon, 26 Aug 2019 07:44:00 -0500 Subject: [PATCH 269/711] Add release notes for v6.0.2 Also add relase notes section at index. --- _static/css/custom.css | 20 +++++++++++ api.rst | 6 ++++ configuration.rst | 7 +++- index.rst | 45 +++++++++++++++--------- livereload_docs.py | 5 +-- release_notes.rst | 0 releases/v5.2.0.rst | 26 ++++++++++++++ releases/v6.0.2.rst | 79 ++++++++++++++++++++++++++++++++++++++++++ 8 files changed, 169 insertions(+), 19 deletions(-) delete mode 100644 release_notes.rst create mode 100644 releases/v5.2.0.rst create mode 100644 releases/v6.0.2.rst diff --git a/_static/css/custom.css b/_static/css/custom.css index 555afaa1c8..50359ce055 100644 --- a/_static/css/custom.css +++ b/_static/css/custom.css @@ -21,3 +21,23 @@ div.line-block { #sponsors img{ margin: 10px; } + +#thanks{ + text-align: center; +} + +#thanks img{ + margin: 10px; +} + +#thanks h2{ + text-align: left; +} + +#thanks p{ + text-align: left; +} + +#thanks ul{ + text-align: left; +} diff --git a/api.rst b/api.rst index 5e7271de50..97f3cf8b70 100644 --- a/api.rst +++ b/api.rst @@ -45,6 +45,8 @@ Complex logic can also be applied: GET /people?and=(grade.gte.90,student.is.true,or(age.gte.14,age.is.null)) HTTP/1.1 +.. _operators: + Operators ~~~~~~~~~ @@ -773,6 +775,8 @@ PostgREST will detect if the function is scalar or table-valued and will shape t { "title": "Blade Runner 2049", "rating": 8.1} ] +.. _bulk_call: + Bulk Call --------- @@ -1147,6 +1151,8 @@ If the stored procedure returns non-scalar values, you need to do a :code:`selec If more than one row would be returned the binary results will be concatenated with no delimiter. +.. _plain_text_output: + Plain Text Output ----------------- diff --git a/configuration.rst b/configuration.rst index f44019b1e6..d44096de43 100644 --- a/configuration.rst +++ b/configuration.rst @@ -90,10 +90,13 @@ db-pool Number of connections to keep open in PostgREST's database pool. Having enough here for the maximum expected simultaneous client connections can improve performance. Note it's pointless to set this higher than the :code:`max_connections` GUC in your database. +.. _db-pool-timeout: + db-pool-timeout --------------- - Time to live for an idle database pool connection. + Time to live for an idle database pool connection. If the timeout is reached the connection will be closed. + Once a new request arrives a new connection will be started. .. _db-extra-search-path: @@ -126,6 +129,8 @@ server-port The TCP port to bind the web server. +.. _server-unix-socket: + server-unix-socket ------------------ diff --git a/index.rst b/index.rst index 3b49b816f3..41b8be7aa3 100644 --- a/index.rst +++ b/index.rst @@ -65,11 +65,13 @@ Getting Support The project has a friendly and growing community. Join our `chat room `_ for discussion and help. You can also report or search for bugs/features on the Github `issues `_ page. .. toctree:: + :glob: + :reversed: :caption: Release Notes :titlesonly: :hidden: - release_notes.rst + releases/* Tutorials --------- @@ -88,21 +90,6 @@ Are you new to PostgREST? This is the place to start! Also have a look at :doc:`Installation `. -How-to guides -------------- - -These are recipes that'll help you address specific use-cases. - -.. toctree:: - :glob: - :caption: How-to guides - :hidden: - - how-tos/* - -- :doc:`how-tos/embedding-table-from-another-schema` -- :doc:`how-tos/casting-type-to-custom-json` - Reference guides ---------------- @@ -123,6 +110,23 @@ Technical references for PostgREST's functionality. - :doc:`API ` - :doc:`configuration` +.. _how_tos: + +How-to guides +------------- + +These are recipes that'll help you address specific use-cases. + +.. toctree:: + :glob: + :caption: How-to guides + :hidden: + + how-tos/* + +- :doc:`how-tos/embedding-table-from-another-schema` +- :doc:`how-tos/casting-type-to-custom-json` + Topic guides ------------ @@ -167,6 +171,15 @@ PostgREST has a growing ecosystem of examples, libraries, and experiments. Here * :ref:`clientside_libraries` * :ref:`eco_commercial` +Release Notes +------------- + +Here we'll include the most relevant changes so you can migrate to newer versions easily. +You can see the full changelog of each release in the `PostgREST repository `_. + +- :doc:`releases/v6.0.2` +- :doc:`releases/v5.2.0` + In Production ------------- diff --git a/livereload_docs.py b/livereload_docs.py index befcaa35ef..03910bd6a9 100755 --- a/livereload_docs.py +++ b/livereload_docs.py @@ -7,6 +7,7 @@ server.watch('*.rst', shell('sphinx-build -b html -a -n . _build')) server.watch('tutorials/*.rst', shell('sphinx-build -b html -a -n . _build')) server.watch('how-tos/*.rst', shell('sphinx-build -b html -a -n . _build')) +server.watch('releases/*.rst', shell('sphinx-build -b html -a -n . _build')) # For custom port and host -# server.serve(port=8080, host='192.168.1.2') -server.serve(root='_build/') +server.serve(root='_build/', host='192.168.1.2') +# server.serve(root='_build/') diff --git a/release_notes.rst b/release_notes.rst deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/releases/v5.2.0.rst b/releases/v5.2.0.rst new file mode 100644 index 0000000000..43bc188339 --- /dev/null +++ b/releases/v5.2.0.rst @@ -0,0 +1,26 @@ +v5.2.0 +====== + +* `Explicit qualification `_ introduced in ``v5.0`` is no longer necessary, this section will not be included from this version onwards. A :ref:`db-extra-search-path` configuration parameter was introduced to avoid the need to explictly qualify database objects. If you install PostgreSQL extensions on the ``public`` schema, they'll work normally from now on. + +* Now you can filter :ref:`tabs-cols-w-spaces`. + +* Included the ability to quote columns that have :ref:`reserved-chars`. + +* Thanks to `Zhou Feng `_, now is possible to reference an external file in :ref:`db-uri`. + +* Thanks to `Russell Davies `_, Json Web Key Sets are now accepted by :ref:`jwt-secret`. + +Thanks +------ + +This release was made possible thanks to: + +* `Daniel Babiak `_ +* `Michel Pelletier `_ +* Tsingson Qin +* Jay Hannah +* Victor Adossi +* Petr Beles + +If you like to join them please consider `supporting PostgREST development `_. diff --git a/releases/v6.0.2.rst b/releases/v6.0.2.rst new file mode 100644 index 0000000000..774ac61bb0 --- /dev/null +++ b/releases/v6.0.2.rst @@ -0,0 +1,79 @@ +.. |br| raw:: html + +
    + +v6.0.2 +====== + +Full changelog is available at `PostgREST releases page `_. + +Added +----- + +* Ignoring payload keys for insert/update can be now done with the ``?columns`` query parameter. See :ref:`specify_columns`. + |br| -- `@steve-chavez `_ + +* `websearch_to_tsquery `_ can now be used + through the ``wfts`` operator. See :ref:`fts`. + |br| -- `@herulume `_ + +* Resource Embedding on materialized views is now possible. See :ref:`embedding_views`. + |br| -- `@vitorbaptista `_ + +* Bulk calling an RPC is now allowed. See :ref:`bulk_call`. + |br| -- `@steve-chavez `_ + +* It's now possible to request a ``text/plain`` output. See :ref:`plain_text_output`. + |br| -- `@steve-chavez `_ + +* Config option for specifying PostgREST database pool timeout. See :ref:`db-pool-timeout`. + |br| -- `@Qu4tro `_ + +* Config option for binding the PostgREST web server to an unix socket. See :ref:`server-unix-socket`. + |br| -- `@Dansvidania `_ + +* Config option for extending the supported media types. See :ref:`raw-media-types`. + |br| -- `@Dansvidania `_ + +* We now offer an statically linked binary for Linux. Look for **postgrest--linux-x64-static.tar.xz** on the + `releases page `_. + |br| -- `@clojurians-org `_ + +* A :ref:`how_tos` section was added to the documentation. + +Changed +------- + +* ``SIGHUP`` support was removed. You should use ``SIGUSR1`` instead. See :ref:`schema_reloading`. + +* server-host default of ``127.0.0.1`` was changed to ``!4``. See :ref:`server-host`. + +Thanks +------ + +This release was sponsored by: + +.. image:: ../_static/cybertec.png + :target: https://www.cybertec-postgresql.com/en/ + :width: 13em + +.. image:: ../_static/2ndquadrant.png + :target: https://www.2ndquadrant.com/en/?utm_campaign=External%20Websites&utm_source=PostgREST&utm_medium=Logo + :width: 13em + +.. image:: ../_static/retool.png + :target: https://tryretool.com/?utm_source=sponsor&utm_campaign=postgrest + :width: 13em + +* Daniel Babiak +* Evans Fernandes +* Tsingson Qin +* Michel Pelletier +* Jay Hannah +* Robert Stolarz +* Kofi Gumbs +* Nicholas DiBiase +* Christopher Reid +* Nathan Bouscal + +If you like to join them please consider `supporting PostgREST development `_. From 7dd37c0bc4a00c942190a9c5ddc29bc29567d6d7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Steve=20Ch=C3=A1vez?= Date: Mon, 26 Aug 2019 12:02:42 -0500 Subject: [PATCH 270/711] Update index.rst --- index.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/index.rst b/index.rst index 41b8be7aa3..5be91d9d44 100644 --- a/index.rst +++ b/index.rst @@ -124,8 +124,8 @@ These are recipes that'll help you address specific use-cases. how-tos/* -- :doc:`how-tos/embedding-table-from-another-schema` - :doc:`how-tos/casting-type-to-custom-json` +- :doc:`how-tos/embedding-table-from-another-schema` Topic guides ------------ From e81ab0d0bb62168d950695520e1894c6ea52ac6a Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Mon, 26 Aug 2019 13:34:58 -0500 Subject: [PATCH 271/711] Fix #246, add CONTRIBUTING.md Also add structure section on README.md --- CONTRIBUTING.md | 3 +++ README.md | 5 +++++ 2 files changed, 8 insertions(+) create mode 100644 CONTRIBUTING.md diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000000..20fdb43dbe --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,3 @@ +This repository follows the same contribution guidelines as the main PostgREST repository contribution guidelines: + +https://github.com/PostgREST/postgrest/blob/master/.github/CONTRIBUTING.md diff --git a/README.md b/README.md index f60577cdc7..e8a06defb8 100644 --- a/README.md +++ b/README.md @@ -17,6 +17,11 @@ Or if you use [nix](https://nixos.org/nix/), you can just run: Both of these options will build the docs and start a livereload server on `http://localhost:5500`. +## Documentation structure + +This documentation is structured according to tutorials-howtos-topics-references. For more details on the rationale of this structure, +see https://www.divio.com/blog/documentation. + ## Translations Translations are maintained in separate repositories forked from this one. Once you finish translating in your fork you can upload the project From 126236c3d03d7c4916e44897e1cc346b2f9b57fd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Steve=20Ch=C3=A1vez?= Date: Mon, 26 Aug 2019 13:52:26 -0500 Subject: [PATCH 272/711] Update v6.0.2.rst --- releases/v6.0.2.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/releases/v6.0.2.rst b/releases/v6.0.2.rst index 774ac61bb0..19176d5b28 100644 --- a/releases/v6.0.2.rst +++ b/releases/v6.0.2.rst @@ -51,7 +51,7 @@ Changed Thanks ------ -This release was sponsored by: +This release is sponsored by: .. image:: ../_static/cybertec.png :target: https://www.cybertec-postgresql.com/en/ From bc6e181d03ce39bd5dfcd99b63781cfadba0d129 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Steve=20Ch=C3=A1vez?= Date: Wed, 11 Sep 2019 12:05:51 -0500 Subject: [PATCH 273/711] Add params=multiple-objects to api reference (#253) --- api.rst | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/api.rst b/api.rst index 97f3cf8b70..42fa40a7f3 100644 --- a/api.rst +++ b/api.rst @@ -602,7 +602,7 @@ It's also possible to embed `Materialized Views `_. @@ -780,12 +780,14 @@ PostgREST will detect if the function is scalar or table-valued and will shape t Bulk Call --------- -It's possible to call a function in a bulk way, analoguosly to :ref:`bulk_insert`. +It's possible to call a function in a bulk way, analoguosly to :ref:`bulk_insert`. To do this, you need to add the +``Prefer: params=multiple-objects`` header to your request. .. code-block:: http POST /rpc/add_them HTTP/1.1 Content-Type: application/json + Prefer: params=multiple-objects [ {"a": 1, "b": 2}, From 1a18ef5a2016a101c87143a88b0da6721750b783 Mon Sep 17 00:00:00 2001 From: Reuben Thomas-Davis Date: Sun, 15 Sep 2019 21:24:17 +0100 Subject: [PATCH 274/711] add server proxy uri env var for smoother swagger-ui use with docker-compose --- install.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/install.rst b/install.rst index fc3f278cd9..685d282354 100644 --- a/install.rst +++ b/install.rst @@ -134,6 +134,7 @@ To avoid having to install the database at all, you can run both it and the serv PGRST_DB_URI: postgres://app_user:password@db:5432/app_db PGRST_DB_SCHEMA: public PGRST_DB_ANON_ROLE: app_user #In production this role should not be the same as the one used for the connection + PGRST_SERVER_PROXY_URI: "http://127.0.0.1:3000" depends_on: - db db: From 2186a7e1a84525b118de956a1fc333fa5075d05a Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Tue, 17 Sep 2019 17:52:10 -0500 Subject: [PATCH 275/711] Add upcoming release page * Add HEAD support mention * Add change for bulk call --- api.rst | 2 +- releases/upcoming.rst | 19 +++++++++++++++++++ 2 files changed, 20 insertions(+), 1 deletion(-) create mode 100644 releases/upcoming.rst diff --git a/api.rst b/api.rst index 42fa40a7f3..1880dc9fc6 100644 --- a/api.rst +++ b/api.rst @@ -10,7 +10,7 @@ All views and tables in the exposed schema and accessible by the active database GET /people HTTP/1.1 -There are no deeply/nested/routes. Each route provides OPTIONS, GET, POST, PATCH, and DELETE verbs depending entirely on database permissions. +There are no deeply/nested/routes. Each route provides OPTIONS, GET, HEAD, POST, PATCH, and DELETE verbs depending entirely on database permissions. .. note:: diff --git a/releases/upcoming.rst b/releases/upcoming.rst new file mode 100644 index 0000000000..836a2c78c8 --- /dev/null +++ b/releases/upcoming.rst @@ -0,0 +1,19 @@ +.. |br| raw:: html + +
    + +Upcoming +======== + +These are changes yet unreleased. If you'd like to try them out before a new official release, you can :ref:`build_source`. + +Added +----- + +* Support for HTTP HEAD requests. + |br| -- `@steve-chavez `_ + +Changed +------- + +* :ref:`bulk_call` should now be done by specifying a ``Prefer: params=multiple-objects`` header. From 476af62326f1828a0f6e8084caf3dcc1adfcc166 Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Wed, 18 Sep 2019 12:40:52 -0500 Subject: [PATCH 276/711] Add planned count reference --- admin.rst | 6 +----- api.rst | 30 ++++++++++++++++++++++++++++-- releases/upcoming.rst | 3 +++ 3 files changed, 32 insertions(+), 7 deletions(-) diff --git a/admin.rst b/admin.rst index 3638516567..9d4841c8d9 100644 --- a/admin.rst +++ b/admin.rst @@ -32,7 +32,7 @@ The first step is to create an Nginx configuration file that proxies requests to .. note:: - For ubuntu, if you already installed nginx through :code:`apt` you can add this to the config file in + For ubuntu, if you already installed nginx through :code:`apt` you can add this to the config file in :code:`/etc/nginx/sites-enabled/default`. .. _block_fulltable: @@ -88,10 +88,6 @@ This is fine in small tables, but count performance degrades in big tables due t -- Pending nginx config: Remove any prefer header which contains the word count -.. note:: - - In future versions we will support :code:`Prefer: count=estimated` to leverage the PostgreSQL statistics tables for a fast (and fairly accurate) result. - .. _hardening_https: HTTPS diff --git a/api.rst b/api.rst index 1880dc9fc6..9284d3eede 100644 --- a/api.rst +++ b/api.rst @@ -371,12 +371,16 @@ The other way to request a limit or offset is with query parameters. For example This method is also useful for embedded resources, which we will cover in another section. The server always responds with range headers even if you use query parameters to limit the query. -In order to obtain the total size of the table or view (such as when rendering the last page link in a pagination control), specify your preference in a request header: +.. _exact_count: +Exact Count +~~~~~~~~~~~ + +In order to obtain the total size of the table or view (such as when rendering the last page link in a pagination control), specify ``Prefer: count=exact`` as a request header: .. code-block:: http - GET /bigtable HTTP/1.1 + HEAD /bigtable HTTP/1.1 Range-Unit: items Range: 0-24 Prefer: count=exact @@ -389,6 +393,28 @@ Note that the larger the table the slower this query runs in the database. The s Range-Unit: items Content-Range: 0-24/3573458 +.. _planned_count: + +Planned Count +~~~~~~~~~~~~~ + +To avoid the shortcomings of :ref:`exact count `, PostgREST can leverage PostgreSQL statistics and get a fairly accurate and fast count. +To do this, specify the ``Prefer: count=planned`` header. + +.. code-block:: http + + HEAD /bigtable?limit=25 HTTP/1.1 + Prefer: count=planned + +.. code-block:: http + + HTTP/1.1 206 Partial Content + Content-Range: 0-24/3572000 + +Note that the accuracy of this count depends how up-to-date are the PostgreSQL statistics tables. +For example in this case, to increase the accuracy of the count you can do ``ANALYZE bigtable``. +See `ANALYZE `_ for more details. + .. _res_format: Response Format diff --git a/releases/upcoming.rst b/releases/upcoming.rst index 836a2c78c8..8096b97ea3 100644 --- a/releases/upcoming.rst +++ b/releases/upcoming.rst @@ -13,6 +13,9 @@ Added * Support for HTTP HEAD requests. |br| -- `@steve-chavez `_ +* Support for :ref:`planned_count`. + |br| -- `@steve-chavez `_ + Changed ------- From 5ef1db42efd962f674ebc68832b9f8f5256d3ddd Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Wed, 18 Sep 2019 14:15:38 -0500 Subject: [PATCH 277/711] Add estimated count reference --- api.rst | 40 +++++++++++++++++++++++++++++++++++++++- releases/upcoming.rst | 2 +- 2 files changed, 40 insertions(+), 2 deletions(-) diff --git a/api.rst b/api.rst index 9284d3eede..7dba6729ef 100644 --- a/api.rst +++ b/api.rst @@ -411,10 +411,48 @@ To do this, specify the ``Prefer: count=planned`` header. HTTP/1.1 206 Partial Content Content-Range: 0-24/3572000 -Note that the accuracy of this count depends how up-to-date are the PostgreSQL statistics tables. +Note that the accuracy of this count depends on how up-to-date are the PostgreSQL statistics tables. For example in this case, to increase the accuracy of the count you can do ``ANALYZE bigtable``. See `ANALYZE `_ for more details. +.. _estimated_count: + +Estimated Count +~~~~~~~~~~~~~~~ + +When you are interested in the count, the relative error is important. If you have an estimated count of 1000000 and the exact count is +1001000, the error is small enough to be ignored. But with an estimated count of 7, an exact count of 28 would be a huge misprediction. + +In general, when having smaller row-counts, the estimated count should be as close to the exact count as possible. + +To help with these cases, PostgREST can get the exact count up until a threshold and get the estimated count when +that threshold is surpassed. To use this behavior, you can specify the ``Prefer: count=estimated`` header. The **threshold** is +defined by :ref:`max-rows`. + +Here's an example. Suppose we set ``max-rows=1000`` and *smalltable* has 321 rows, then we'll get the exact count: + +.. code-block:: http + + HEAD /smalltable?limit=25 HTTP/1.1 + Prefer: count=estimated + +.. code-block:: http + + HTTP/1.1 206 Partial Content + Content-Range: 0-24/321 + +If we make a similar request on *bigtable*, which has 3573458 rows, we would get the estimated count: + +.. code-block:: http + + HEAD /bigtable?limit=25 HTTP/1.1 + Prefer: count=estimated + +.. code-block:: http + + HTTP/1.1 206 Partial Content + Content-Range: 0-24/3572000 + .. _res_format: Response Format diff --git a/releases/upcoming.rst b/releases/upcoming.rst index 8096b97ea3..886c4449b8 100644 --- a/releases/upcoming.rst +++ b/releases/upcoming.rst @@ -13,7 +13,7 @@ Added * Support for HTTP HEAD requests. |br| -- `@steve-chavez `_ -* Support for :ref:`planned_count`. +* Support for :ref:`planned_count` and :ref:`estimated_count`. |br| -- `@steve-chavez `_ Changed From 4f1f80d4f2e94aca4db268146edc4e212c5fb641 Mon Sep 17 00:00:00 2001 From: Lorenz Henk Date: Thu, 19 Sep 2019 09:38:45 +0200 Subject: [PATCH 278/711] Replace estimated with planned The names changed according to https://github.com/PostgREST/postgrest/issues/1378#issuecomment-531506803 --- api.rst | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/api.rst b/api.rst index 7dba6729ef..19a7d85182 100644 --- a/api.rst +++ b/api.rst @@ -420,12 +420,12 @@ See `ANALYZE `_ for more de Estimated Count ~~~~~~~~~~~~~~~ -When you are interested in the count, the relative error is important. If you have an estimated count of 1000000 and the exact count is -1001000, the error is small enough to be ignored. But with an estimated count of 7, an exact count of 28 would be a huge misprediction. +When you are interested in the count, the relative error is important. If you have a :ref:`planned count ` of 1000000 and the exact count is +1001000, the error is small enough to be ignored. But with a planned count of 7, an exact count of 28 would be a huge misprediction. In general, when having smaller row-counts, the estimated count should be as close to the exact count as possible. -To help with these cases, PostgREST can get the exact count up until a threshold and get the estimated count when +To help with these cases, PostgREST can get the exact count up until a threshold and get the planned count when that threshold is surpassed. To use this behavior, you can specify the ``Prefer: count=estimated`` header. The **threshold** is defined by :ref:`max-rows`. @@ -441,7 +441,7 @@ Here's an example. Suppose we set ``max-rows=1000`` and *smalltable* has 321 row HTTP/1.1 206 Partial Content Content-Range: 0-24/321 -If we make a similar request on *bigtable*, which has 3573458 rows, we would get the estimated count: +If we make a similar request on *bigtable*, which has 3573458 rows, we would get the planned count: .. code-block:: http From 6afed0b30dcf7254cf3288cce41d96705bbecdc9 Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Sat, 28 Sep 2019 15:40:31 -0500 Subject: [PATCH 279/711] Add reference for stored proc embedding --- api.rst | 32 ++++++++++++++++++++++++++++++++ releases/upcoming.rst | 2 ++ 2 files changed, 34 insertions(+) diff --git a/api.rst b/api.rst index 19a7d85182..71948cc59d 100644 --- a/api.rst +++ b/api.rst @@ -681,6 +681,38 @@ It's also possible to embed `Materialized Views ` that returns a table type, you can embed its related tables. + +Here's a sample function(notice the ``RETURNS SETOF films``). + +.. code-block:: plpgsql + + CREATE FUNCTION getallfilms() RETURNS SETOF films AS $$ + SELECT * FROM films; + $$ LANGUAGE SQL IMMUTABLE; + +A request with ``directors`` embedded: + +.. code-block:: http + + GET /rpc/getallfilms?select=title,directors(id,last_name)&title=like.*Workers* HTTP/1.1 + +.. code-block:: json + + [ + { "title": "Workers Leaving The Lumière Factory In Lyon", + "directors": { + "id": 2, + "last_name": "Lumière" + } + } + ] + .. _custom_queries: Custom Queries diff --git a/releases/upcoming.rst b/releases/upcoming.rst index 886c4449b8..3085f0a925 100644 --- a/releases/upcoming.rst +++ b/releases/upcoming.rst @@ -16,6 +16,8 @@ Added * Support for :ref:`planned_count` and :ref:`estimated_count`. |br| -- `@steve-chavez `_ +* Documentation reference for :ref:`s_proc_embed`. + Changed ------- From 3325a1bbc6375bf2c2a57fa88b6fcd0a23112c0c Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Sat, 28 Sep 2019 20:08:21 -0500 Subject: [PATCH 280/711] Add reference for mutation embed --- api.rst | 39 ++++++++++++++++++++++++++++++++++++++- releases/upcoming.rst | 4 +++- 2 files changed, 41 insertions(+), 2 deletions(-) diff --git a/api.rst b/api.rst index 71948cc59d..ca5187cb5f 100644 --- a/api.rst +++ b/api.rst @@ -686,7 +686,7 @@ It's also possible to embed `Materialized Views ` that returns a table type, you can embed its related tables. +If you have a :ref:`Stored Procedure ` that returns a table type, you can embed its related resources. Here's a sample function(notice the ``RETURNS SETOF films``). @@ -713,6 +713,39 @@ A request with ``directors`` embedded: } ] +.. _mutation_embed: + +Embedding after Insertions/Updates/Deletions +-------------------------------------------- + +You can embed related resources after doing :ref:`insert_update` or :ref:`delete`. + +Say you want to insert a **film** and then get some of its attributes plus embed its **director**. + +.. code-block:: http + + POST /films?select=title,year,director:directors(first_name,last_name) HTTP/1.1 + Prefer: return=representation + + { + "id": 100, "director_id": 40, + "title": "127 hours", "year": 2010, + "rating": 7.6, "language": "english" + } + +Response: + +.. code-block:: json + + { + "title": "127 hours", + "year": 2010, + "director": { + "first_name": "Danny", + "last_name": "Boyle" + } + } + .. _custom_queries: Custom Queries @@ -1040,6 +1073,8 @@ Returns: {"hint":"Upgrade your plan","details":"Quota exceeded"} +.. _insert_update: + Insertions / Updates ==================== @@ -1196,6 +1231,8 @@ All the columns must be specified in the request body, including the primary key This feature is only available starting from PostgreSQL 9.5 since it uses the `ON CONFLICT clause `_. +.. _delete: + Deletions ========= diff --git a/releases/upcoming.rst b/releases/upcoming.rst index 3085f0a925..72293b8faa 100644 --- a/releases/upcoming.rst +++ b/releases/upcoming.rst @@ -16,7 +16,9 @@ Added * Support for :ref:`planned_count` and :ref:`estimated_count`. |br| -- `@steve-chavez `_ -* Documentation reference for :ref:`s_proc_embed`. +* Reference for :ref:`s_proc_embed`. + +* Reference for :ref:`mutation_embed`. Changed ------- From 22b6ff764dd985a02b031988832bbc6d6a9d2c57 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Steve=20Ch=C3=A1vez?= Date: Fri, 18 Oct 2019 11:03:32 -0500 Subject: [PATCH 281/711] Credit howtos/tuts authors (#264) --- how-tos/casting-type-to-custom-json.rst | 4 +++- how-tos/embedding-table-from-another-schema.rst | 2 ++ tutorials/tut0.rst | 2 ++ tutorials/tut1.rst | 2 ++ 4 files changed, 9 insertions(+), 1 deletion(-) diff --git a/how-tos/casting-type-to-custom-json.rst b/how-tos/casting-type-to-custom-json.rst index f9d13afa79..b2b25128dc 100644 --- a/how-tos/casting-type-to-custom-json.rst +++ b/how-tos/casting-type-to-custom-json.rst @@ -1,6 +1,8 @@ Casting a type to a custom JSON object ====================================== +:author: `steve-chavez `_ + While using PostgREST you might have noticed that certain PostgreSQL types translate to JSON strings when you would have expected a JSON object or array. For example, let's see the case of `range types `_. @@ -82,7 +84,7 @@ You can use the same idea for creating custom CASTs for different types. .. note:: - If you don't want to modify CASTs for built-in types, an option would be to `create a custom type `_ + If you don't want to modify CASTs for built-in types, an option would be to `create a custom type `_ for your own ``tsrange`` and add its own CAST. .. code-block:: postgres diff --git a/how-tos/embedding-table-from-another-schema.rst b/how-tos/embedding-table-from-another-schema.rst index 60265dd409..118d630d17 100644 --- a/how-tos/embedding-table-from-another-schema.rst +++ b/how-tos/embedding-table-from-another-schema.rst @@ -1,6 +1,8 @@ Embedding a table from another schema ===================================== +:author: `steve-chavez `_ + Suppose you have a **people** table in the ``public`` schema and this schema is exposed through PostgREST's :ref:`db-schema`. .. code-block:: postgres diff --git a/tutorials/tut0.rst b/tutorials/tut0.rst index e061b4761d..038b92f6fc 100644 --- a/tutorials/tut0.rst +++ b/tutorials/tut0.rst @@ -3,6 +3,8 @@ Tutorial 0 - Get it Running =========================== +:author: `begriffs `_ + Welcome to PostgREST! In this pre-tutorial we're going to get things running so you can create your first simple API. PostgREST is a standalone web server which turns a PostgreSQL database into a RESTful API. It serves an API that is customized based on the structure of the underlying database. diff --git a/tutorials/tut1.rst b/tutorials/tut1.rst index 71c288d11d..e9fe78f547 100644 --- a/tutorials/tut1.rst +++ b/tutorials/tut1.rst @@ -3,6 +3,8 @@ Tutorial 1 - The Golden Key =========================== +:author: `begriffs `_ + In :ref:`tut0` we created a read-only API with a single endpoint to list todos. There are many directions we can go to make this API more interesting, but one good place to start would be allowing some users to change data in addition to reading it. Step 1. Add a Trusted User From 2fc0e2f8cbae385cb0148677665521ba28500bcf Mon Sep 17 00:00:00 2001 From: Fedor Ortyanov Date: Tue, 22 Oct 2019 11:13:51 +0300 Subject: [PATCH 282/711] fix api.rst other status from 500 to 400 --- api.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/api.rst b/api.rst index ca5187cb5f..871d1a6f48 100644 --- a/api.rst +++ b/api.rst @@ -1403,5 +1403,5 @@ PostgREST translates `PostgreSQL error codes Date: Thu, 14 Nov 2019 10:57:23 -0800 Subject: [PATCH 283/711] Specify units for the pool timeout setting --- configuration.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/configuration.rst b/configuration.rst index d44096de43..267ed24a16 100644 --- a/configuration.rst +++ b/configuration.rst @@ -95,7 +95,7 @@ db-pool db-pool-timeout --------------- - Time to live for an idle database pool connection. If the timeout is reached the connection will be closed. + Time to live, in seconds, for an idle database pool connection. If the timeout is reached the connection will be closed. Once a new request arrives a new connection will be started. .. _db-extra-search-path: From a0179cfd4b7052633d4c9f322bef09c034203626 Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Mon, 18 Nov 2019 15:47:11 -0500 Subject: [PATCH 284/711] Remove keepalive nginx recommendation --- admin.rst | 1 - 1 file changed, 1 deletion(-) diff --git a/admin.rst b/admin.rst index 9d4841c8d9..8334fd02b6 100644 --- a/admin.rst +++ b/admin.rst @@ -12,7 +12,6 @@ The first step is to create an Nginx configuration file that proxies requests to # upstream configuration upstream postgrest { server localhost:3000; - keepalive 64; } # ... server { From e1c9b8fe768167c7fb281a095ff46240b0a657ce Mon Sep 17 00:00:00 2001 From: Danilo Amoroso Date: Mon, 25 Nov 2019 12:55:57 +0100 Subject: [PATCH 285/711] added documentation for server-unix-socket-mode config option --- configuration.rst | 58 +++++++++++++++++++++++++++++------------------ 1 file changed, 36 insertions(+), 22 deletions(-) diff --git a/configuration.rst b/configuration.rst index 267ed24a16..c02d8a62c8 100644 --- a/configuration.rst +++ b/configuration.rst @@ -30,28 +30,29 @@ The user specified in the db-uri is also known as the authenticator role. For mo Here is the full list of configuration parameters. -==================== ====== ========= ======== -Name Type Default Required -==================== ====== ========= ======== -db-uri String Y -db-schema String Y -db-anon-role String Y -db-pool Int 10 -db-pool-timeout Int 10 -db-extra-search-path String public -server-host String !4 -server-port Int 3000 -server-unix-socket String -server-proxy-uri String -jwt-secret String -jwt-aud String -secret-is-base64 Bool False -max-rows Int ∞ -pre-request String -app.settings.* String -role-claim-key String .role -raw-media-types String -==================== ====== ========= ======== +======================= ====== ========= ======== +Name Type Default Required +======================= ====== ========= ======== +db-uri String Y +db-schema String Y +db-anon-role String Y +db-pool Int 10 +db-pool-timeout Int 10 +db-extra-search-path String public +server-host String !4 +server-port Int 3000 +server-unix-socket String +server-unix-socket-mode String 755 +server-proxy-uri String +jwt-secret String +jwt-aud String +secret-is-base64 Bool False +max-rows Int ∞ +pre-request String +app.settings.* String +role-claim-key String .role +raw-media-types String +======================= ====== ========= ======== .. _db-uri: @@ -141,6 +142,18 @@ server-unix-socket server-unix-socket = "/tmp/pgrst.sock" +.. _server-unix-socket-mode: + +server-unix-socket-mode +----------------------- + + `Unix file mode `_ to be set for the socket specified in :ref:`server-unix-socket` + Needs to be a valid octal between 600 and 777. + + .. code:: bash + + server-unix-socket-mode = "755" + .. _server-proxy-uri: server-proxy-uri @@ -239,3 +252,4 @@ raw-media-types raw-media-types="image/png, text/xml" + From a0091f61a183a23da67679716a54591c0b0d6822 Mon Sep 17 00:00:00 2001 From: Jean SIMARD Date: Tue, 26 Nov 2019 10:45:36 +0100 Subject: [PATCH 286/711] Typo (repeated word) --- api.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/api.rst b/api.rst index 871d1a6f48..06082c2f79 100644 --- a/api.rst +++ b/api.rst @@ -675,7 +675,7 @@ It's also possible to embed `Materialized Views `_ if your view is not made embeddable so we can keep continue improving foreign key detection. - In the future we'll include include a way to manually specify views source foreign keys to address this limitation. + In the future we'll include a way to manually specify views source foreign keys to address this limitation. .. important:: From 30d241fcff4ab8aa2af094b4c3c361606ddcc20e Mon Sep 17 00:00:00 2001 From: ycheng2020 <12297766+ycheng-kf@users.noreply.github.com> Date: Sun, 8 Dec 2019 01:00:02 -0500 Subject: [PATCH 287/711] Fixed the pg_listen syntax (#285) * Fixed the pg_listen syntax Can't run killall -SIGUSR1 postgrest: No such file or directory Error happens because pg_listen needs the full path to killall. --- admin.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/admin.rst b/admin.rst index 8334fd02b6..a192b304b4 100644 --- a/admin.rst +++ b/admin.rst @@ -213,9 +213,9 @@ Then run the `pg_listen `_ utility to mon .. code-block:: bash - pg_listen ddl_command_end "killall -SIGUSR1 postgrest" + pg_listen ddl_command_end $(which killall) -SIGUSR1 postgrest -Now, whenever the structure of the database schema changes, PostgreSQL will notify the ``ddl_command_end`` channel, which will cause ``pg_listen`` to send PostgREST the signal to reload its cache. +Now, whenever the structure of the database schema changes, PostgreSQL will notify the ``ddl_command_end`` channel, which will cause ``pg_listen`` to send PostgREST the signal to reload its cache. Note that pg_listen requires full path to the executable in the example above. Daemonizing =========== From 458960f7c3f6475bb0a9748bddbb361d8d54c2c7 Mon Sep 17 00:00:00 2001 From: Dmitry Wagin Date: Mon, 16 Dec 2019 16:38:25 +0300 Subject: [PATCH 288/711] change server-unix-socket-mode 755 -> 660 (#286) --- configuration.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/configuration.rst b/configuration.rst index c02d8a62c8..6317aa4db5 100644 --- a/configuration.rst +++ b/configuration.rst @@ -42,7 +42,7 @@ db-extra-search-path String public server-host String !4 server-port Int 3000 server-unix-socket String -server-unix-socket-mode String 755 +server-unix-socket-mode String 660 server-proxy-uri String jwt-secret String jwt-aud String @@ -152,7 +152,7 @@ server-unix-socket-mode .. code:: bash - server-unix-socket-mode = "755" + server-unix-socket-mode = "660" .. _server-proxy-uri: From 1b166ce0483cfacb7ab3093b9adf15b7718d66bd Mon Sep 17 00:00:00 2001 From: Steve Chavez Date: Mon, 16 Dec 2019 12:39:57 -0500 Subject: [PATCH 289/711] Add Community Tutorials section (#287) Include DO video series --- ecosystem.rst | 8 ++++++++ index.rst | 2 +- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/ecosystem.rst b/ecosystem.rst index 1ffc96e370..ba01d1435d 100644 --- a/ecosystem.rst +++ b/ecosystem.rst @@ -1,3 +1,11 @@ +.. _community_tutorials: + +Community Tutorials +------------------- + +* `Building a Contacts List with PostgREST and Vue.js `_ - + In this video series, DigitalOcean shows how to build and deploy an Nginx + PostgREST(using a managed PostgreSQL database) + Vue.js webapp in an Ubuntu server droplet. + .. _eco_example_apps: Example Apps diff --git a/index.rst b/index.rst index 5be91d9d44..967a33ac9c 100644 --- a/index.rst +++ b/index.rst @@ -88,7 +88,7 @@ Are you new to PostgREST? This is the place to start! - :doc:`tutorials/tut0` - :doc:`tutorials/tut1` -Also have a look at :doc:`Installation `. +Also have a look at :doc:`Installation ` and :ref:`community_tutorials`. Reference guides ---------------- From 8dba0dcc11f50c9a8abc6387e27ad176eb0c727d Mon Sep 17 00:00:00 2001 From: Copple <10214025+kiwicopple@users.noreply.github.com> Date: Wed, 18 Dec 2019 01:28:44 +0800 Subject: [PATCH 290/711] Remove fragment from Nimbus blog post URL (#288) --- index.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/index.rst b/index.rst index 967a33ac9c..eb7f581f91 100644 --- a/index.rst +++ b/index.rst @@ -187,7 +187,7 @@ Here are some companies that use PostgREST in production. * `Datrium `_ * `Nimbus `_ - - See how Nimbus uses PostgREST in `Paul Copplestone's blog post `_. + - See how Nimbus uses PostgREST in `Paul Copplestone's blog post `_. * `Catarse `_ * `Moat `_ * `Redsmin `_ From 4eefe14706e0059eaa588c89c898be919c287752 Mon Sep 17 00:00:00 2001 From: Steve Chavez Date: Mon, 23 Dec 2019 13:46:22 -0500 Subject: [PATCH 291/711] Add GISOPS community tutorial (#291) --- ecosystem.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/ecosystem.rst b/ecosystem.rst index ba01d1435d..6e0317bdf5 100644 --- a/ecosystem.rst +++ b/ecosystem.rst @@ -6,6 +6,9 @@ Community Tutorials * `Building a Contacts List with PostgREST and Vue.js `_ - In this video series, DigitalOcean shows how to build and deploy an Nginx + PostgREST(using a managed PostgreSQL database) + Vue.js webapp in an Ubuntu server droplet. +* `PostgREST + PostGIS API tutorial in 5 minutes `_ - + In this tutorial, GIS • OPS shows how to perform PostGIS calculations through PostgREST :ref:`s_procs` interface. + .. _eco_example_apps: Example Apps From e47d19d4dc8095be53830186205c2a976d8bbd15 Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Sat, 28 Dec 2019 11:21:30 -0500 Subject: [PATCH 292/711] Fix livereload host --- livereload_docs.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/livereload_docs.py b/livereload_docs.py index 03910bd6a9..7674d11d38 100755 --- a/livereload_docs.py +++ b/livereload_docs.py @@ -9,5 +9,5 @@ server.watch('how-tos/*.rst', shell('sphinx-build -b html -a -n . _build')) server.watch('releases/*.rst', shell('sphinx-build -b html -a -n . _build')) # For custom port and host -server.serve(root='_build/', host='192.168.1.2') -# server.serve(root='_build/') +# server.serve(root='_build/', host='192.168.1.2') +server.serve(root='_build/') From 4cd05681dd84abb6616f02920330ef6d9f0ca3e5 Mon Sep 17 00:00:00 2001 From: Steve Chavez Date: Mon, 6 Jan 2020 09:43:54 -0500 Subject: [PATCH 293/711] Add embedding disambiguation section (#290) --- _static/orders.png | Bin 0 -> 17892 bytes api.rst | 104 +++++++++++++++++++++++++++++++++++++++++++++ erd/README.md | 7 +++ erd/orders.er | 15 +++++++ 4 files changed, 126 insertions(+) create mode 100644 _static/orders.png create mode 100644 erd/README.md create mode 100644 erd/orders.er diff --git a/_static/orders.png b/_static/orders.png new file mode 100644 index 0000000000000000000000000000000000000000..db709c873da885c3c73b42678bbcc279f582c836 GIT binary patch literal 17892 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 M>FVdQ&MBb@0J;5iXaE2J literal 0 HcmV?d00001 diff --git a/api.rst b/api.rst index 06082c2f79..2910f7e3aa 100644 --- a/api.rst +++ b/api.rst @@ -746,6 +746,110 @@ Response: } } +.. _embed_disamb: + +Embedding Disambiguation +------------------------ + +For doing resource embedding, PostgREST infers the relationship between two tables based on a foreign key between them. +However, in cases where there's more than one foreign key between two tables, it's not possible to infer the relationship unambiguosly +by just specifying the tables names. + +Target Disambiguation +~~~~~~~~~~~~~~~~~~~~~ + +For example, suppose you have the following ``orders`` and ``addresses`` tables: + +.. image:: _static/orders.png + +And you try to embed ``orders`` with ``addresses`` (this is the **target**): + +.. code-block:: http + + GET /orders?select=*,addresses(*) HTTP/1.1 + +Since the ``orders`` table has two foreign keys to the ``addresses`` table — an order has a billing address and a shipping address — +the request is ambiguous and PostgREST will respond with an error: + +.. code-block:: http + + HTTP/1.1 300 Multiple Choices + +If this happens, you need to disambiguate the request by adding precision to the **target**. +Instead of the **table name**, you can specify the **foreign key constraint name** or the **column name** that is part of the foreign key. + +Let's try first with the **foreign key constraint name**. To make it clearer we can name it: + +.. code-block:: postgresql + + ALTER TABLE orders + ADD CONSTRAINT billing_address foreign key (billing_address_id) references addresses(id), + ADD CONSTRAINT shipping_address foreign key (shipping_address_id) references addresses(id); + + -- Or if the constraints names were already generated by PostgreSQL we can rename them + -- ALTER TABLE orders + -- RENAME CONSTRAINT orders_billing_address_id_fkey TO billing_address, + -- RENAME CONSTRAINT orders_shipping_address_id_fkey TO shipping_address; + +Now we can unambiguously embed the billing address by specifying the ``billing_address`` foreign key constraint as the **target**. + +.. code-block:: http + + GET /orders?select=name,billing_address(name) HTTP/1.1 + + [ + { + "name": "Personal Water Filter", + "billing_address": { + "name": "32 Glenlake Dr.Dearborn, MI 48124" + } + } + ] + +Alternatively, you can specify the **column name** of the foreign key constraint as the **target**. This can be aliased to make +the result more clear. + +.. code-block:: http + + GET /orders?select=name,billing_address:billing_address_id(name) HTTP/1.1 + + [ + { + "name": "Personal Water Filter", + "billing_address": { + "name": "32 Glenlake Dr.Dearborn, MI 48124" + } + } + ] + +Hint Disambiguation +~~~~~~~~~~~~~~~~~~~ + +If specifying the **target** is not enough for unambiguous embedding, you can add a **hint**. For example, let's assume we create +two VIEWs of ``addresses``: ``central_addresses`` and ``eastern_addresses``. + +Since PostgREST supports :ref:`embedding_views` by detecting **source foreign keys** in the views, embedding with the foreign key +as the **target** will not be enough for an unambiguous embed: + +.. code-block:: http + + GET /orders?select=*,billing_address(*) HTTP/1.1 + + HTTP/1.1 300 Multiple Choices + +For solving this case, in addition to the **target**, we can add a **hint**. +Here we specify ``central_addresses`` as the **target** and the ``billing_address`` foreign key as the **hint**: + +.. code-block:: http + + GET /orders?select=*,central_addresses!billing_address(*) HTTP/1.1 + + HTTP/1.1 200 OK + + [ ... ] + +Similarly to the **target**, the **hint** can be a **table name**, **foreign key constraint name** or **column name**. + .. _custom_queries: Custom Queries diff --git a/erd/README.md b/erd/README.md new file mode 100644 index 0000000000..d71e8e263f --- /dev/null +++ b/erd/README.md @@ -0,0 +1,7 @@ +This files were created with https://github.com/BurntSushi/erd/. + +You can go download erd from https://github.com/BurntSushi/erd/releases and then do: + +```bash +./erd_static-x86-64 -i erd/film.er -o _static/film.png +``` diff --git a/erd/orders.er b/erd/orders.er new file mode 100644 index 0000000000..bdd93de2ef --- /dev/null +++ b/erd/orders.er @@ -0,0 +1,15 @@ +[Addresses] +*id +name +city +state +postal_code + +[Orders] +*id +name ++billing_address_id ++shipping_address_id + +Orders *--1 Addresses +Orders *--1 Addresses From da1cf9f76d6c98d81d18372a7df1b1e27f81b450 Mon Sep 17 00:00:00 2001 From: Remo <59358383+monacoremo@users.noreply.github.com> Date: Sun, 19 Jan 2020 20:17:56 +0100 Subject: [PATCH 294/711] Add postgrest-sessions-example to Example Apps (#294) --- ecosystem.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/ecosystem.rst b/ecosystem.rst index 6e0317bdf5..1e41ecbd66 100644 --- a/ecosystem.rst +++ b/ecosystem.rst @@ -14,6 +14,7 @@ Community Tutorials Example Apps ------------ +* `monacoremo/postgrest-sessions-example `_ - example for cookie-based sessions * `tatut/postgrest-ui `_ - ClojureScript UI components for PostgREST * `priyank-purohit/PostGUI `_ - React Material UI admin panel * `Qu4tro/pgrst-dev-setup `_ - docker-compose and tmuxp setup for experimentation. From 1caf114e5aa960c2b7596e96df64fabf7c65fa8f Mon Sep 17 00:00:00 2001 From: Ivan Gabriele Date: Thu, 23 Jan 2020 10:07:08 +0100 Subject: [PATCH 295/711] Add postgrester client library --- ecosystem.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/ecosystem.rst b/ecosystem.rst index 1e41ecbd66..46cdca03ac 100644 --- a/ecosystem.rst +++ b/ecosystem.rst @@ -69,6 +69,7 @@ Extensions Client-Side Libraries --------------------- +* `SocialGouv/postgrester `_ - JS + Typescript * `Kong/py-postgrest `_ - Python * `datrium/postgrest-pyclient `_ - Python * `tomberek/aor-postgrest-client `_ - JS, admin-on-rest From 95fccbb00f89cd9987417e5a0854c58577906523 Mon Sep 17 00:00:00 2001 From: Copple <10214025+kiwicopple@users.noreply.github.com> Date: Mon, 3 Feb 2020 11:33:39 +0800 Subject: [PATCH 296/711] Add supabase/postgrest-js client library --- ecosystem.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/ecosystem.rst b/ecosystem.rst index 46cdca03ac..f3e230f537 100644 --- a/ecosystem.rst +++ b/ecosystem.rst @@ -69,6 +69,7 @@ Extensions Client-Side Libraries --------------------- +* `supabase/postgrest-js `_ - Isomorphic JS client * `SocialGouv/postgrester `_ - JS + Typescript * `Kong/py-postgrest `_ - Python * `datrium/postgrest-pyclient `_ - Python From f6c67ffdc144ac654e5d62f897f594d86bb95fe0 Mon Sep 17 00:00:00 2001 From: Wouter Scherphof Date: Fri, 7 Feb 2020 23:27:41 +0100 Subject: [PATCH 297/711] correction url embedded resources through join tables --- api.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/api.rst b/api.rst index 2910f7e3aa..01f35676c3 100644 --- a/api.rst +++ b/api.rst @@ -600,7 +600,7 @@ PostgREST can also detect relationships going through join tables. Thus you can .. code-block:: http - GET /directors?select=films(title,year) HTTP/1.1 + GET /actors?select=films(title,year) HTTP/1.1 Embedded Filters ---------------- From 878752faee2070914d36c56e49c140a4b17d313f Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Sat, 8 Feb 2020 14:52:28 -0500 Subject: [PATCH 298/711] Correct join table paragraph --- api.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/api.rst b/api.rst index 01f35676c3..03d91ae305 100644 --- a/api.rst +++ b/api.rst @@ -596,7 +596,7 @@ this: Embedding through join tables ----------------------------- -PostgREST can also detect relationships going through join tables. Thus you can request the Actors for Films (which in this case finds the information through Roles). You can also reverse the direction of inclusion, asking for all Directors with each including the list of their Films: +PostgREST can also detect relationships going through join tables. Thus you can request the Actors for Films (which in this case finds the information through Roles). .. code-block:: http From c4005ad8f27ad4463fbb48bc0904f04d5fe57341 Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Thu, 6 Feb 2020 14:21:43 -0500 Subject: [PATCH 299/711] Change server-proxy-uri 2 openapi-server-proxy-uri --- configuration.rst | 54 +++++++++++++++++++++---------------------- releases/upcoming.rst | 2 ++ 2 files changed, 29 insertions(+), 27 deletions(-) diff --git a/configuration.rst b/configuration.rst index 6317aa4db5..fe9b9f7f26 100644 --- a/configuration.rst +++ b/configuration.rst @@ -30,29 +30,29 @@ The user specified in the db-uri is also known as the authenticator role. For mo Here is the full list of configuration parameters. -======================= ====== ========= ======== -Name Type Default Required -======================= ====== ========= ======== -db-uri String Y -db-schema String Y -db-anon-role String Y -db-pool Int 10 -db-pool-timeout Int 10 -db-extra-search-path String public -server-host String !4 -server-port Int 3000 -server-unix-socket String -server-unix-socket-mode String 660 -server-proxy-uri String -jwt-secret String -jwt-aud String -secret-is-base64 Bool False -max-rows Int ∞ -pre-request String -app.settings.* String -role-claim-key String .role -raw-media-types String -======================= ====== ========= ======== +======================== ====== ========= ======== +Name Type Default Required +======================== ====== ========= ======== +db-uri String Y +db-schema String Y +db-anon-role String Y +db-pool Int 10 +db-pool-timeout Int 10 +db-extra-search-path String public +server-host String !4 +server-port Int 3000 +server-unix-socket String +server-unix-socket-mode String 660 +openapi-server-proxy-uri String +jwt-secret String +jwt-aud String +secret-is-base64 Bool False +max-rows Int ∞ +pre-request String +app.settings.* String +role-claim-key String .role +raw-media-types String +======================== ====== ========= ======== .. _db-uri: @@ -149,15 +149,15 @@ server-unix-socket-mode `Unix file mode `_ to be set for the socket specified in :ref:`server-unix-socket` Needs to be a valid octal between 600 and 777. - + .. code:: bash server-unix-socket-mode = "660" -.. _server-proxy-uri: +.. _openapi-server-proxy-uri: -server-proxy-uri ----------------- +openapi-server-proxy-uri +------------------------ Overrides the base URL used within the OpenAPI self-documentation hosted at the API root path. Use a complete URI syntax :code:`scheme:[//[user:password@]host[:port]][/]path[?query][#fragment]`. Ex. :code:`https://postgrest.com` diff --git a/releases/upcoming.rst b/releases/upcoming.rst index 72293b8faa..19572008f5 100644 --- a/releases/upcoming.rst +++ b/releases/upcoming.rst @@ -24,3 +24,5 @@ Changed ------- * :ref:`bulk_call` should now be done by specifying a ``Prefer: params=multiple-objects`` header. + +* ``server-proxy-uri`` config option has been renamed to :ref:`openapi-server-proxy-uri`. From 0ed1d31c7240e9b7dec9d43298609c2dffadc7de Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Fri, 7 Feb 2020 12:52:18 -0500 Subject: [PATCH 300/711] Add embedding disambiguation in upcoming --- releases/upcoming.rst | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/releases/upcoming.rst b/releases/upcoming.rst index 19572008f5..8f00c63961 100644 --- a/releases/upcoming.rst +++ b/releases/upcoming.rst @@ -16,13 +16,18 @@ Added * Support for :ref:`planned_count` and :ref:`estimated_count`. |br| -- `@steve-chavez `_ -* Reference for :ref:`s_proc_embed`. +* Support for :ref:`Resource Embedding Disambiguation `. + |br| -- `@steve-chavez `_ + +* Documentation reference for :ref:`s_proc_embed`. -* Reference for :ref:`mutation_embed`. +* Documentation reference for :ref:`mutation_embed`. Changed ------- * :ref:`bulk_call` should now be done by specifying a ``Prefer: params=multiple-objects`` header. +* Resource Embedding now outputs an error when multiple relationships between two tables are found, see :ref:`embed_disamb`. + * ``server-proxy-uri`` config option has been renamed to :ref:`openapi-server-proxy-uri`. From 1f40492d64b8fea00c53cadf60d6c141e31732f7 Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Fri, 7 Feb 2020 13:23:33 -0500 Subject: [PATCH 301/711] Add request path/method GUC --- api.rst | 183 +++++++++++++++++++++++------------------- releases/upcoming.rst | 3 + 2 files changed, 104 insertions(+), 82 deletions(-) diff --git a/api.rst b/api.rst index 03d91ae305..506cf35b98 100644 --- a/api.rst +++ b/api.rst @@ -1096,87 +1096,6 @@ You can call overloaded functions with different number of arguments. .. code-block:: http GET /rpc/rental_duration?customer_id=232&from_date=2018-07-01 HTTP/1.1 - -Accessing Request Headers, Cookies and JWT claims -------------------------------------------------- - -Stored procedures can access request headers, cookies and jwt claims by reading GUC variables set by PostgREST per request. They are named :code:`request.header.XYZ`, :code:`request.cookie.XYZ` and :code:`request.jwt.claim.XYZ`. - -.. code-block:: postgresql - - -- To read the value of the Origin request header: - SELECT current_setting('request.header.origin', true); - -- To read the value of sessionId in a cookie: - SELECT current_setting('request.cookie.sessionId', true); - -- To read the value of the email claim in a jwt: - SELECT current_setting('request.jwt.claim.email', true); - -.. note:: - - ``request.jwt.claim.role`` defaults to the value of :ref:`db-anon-role`. - -Setting Response Headers ------------------------- - -PostgREST reads the ``response.headers`` SQL variable to add extra headers to the HTTP response. Stored procedures can modify this variable. For instance, this statement would add caching headers to the response: - -.. code-block:: sql - - -- tell client to cache response for two days - - SET LOCAL "response.headers" = - '[{"Cache-Control": "public"}, {"Cache-Control": "max-age=259200"}]'; - -Notice that the variable should be set to an *array* of single-key objects rather than a single multiple-key object. This is because headers such as ``Cache-Control`` or ``Set-Cookie`` need to be repeated when setting multiple values and an object would not allow the repeated key. - -Errors and HTTP Status Codes ----------------------------- - -Stored procedures can return non-200 HTTP status codes by raising SQL exceptions. For instance, here's a saucy function that always responds with an error: - -.. code-block:: postgresql - - CREATE OR REPLACE FUNCTION just_fail() RETURNS void - LANGUAGE plpgsql - AS $$ - BEGIN - RAISE EXCEPTION 'I refuse!' - USING DETAIL = 'Pretty simple', - HINT = 'There is nothing you can do.'; - END - $$; - -Calling the function returns HTTP 400 with the body - -.. code-block:: json - - { - "message":"I refuse!", - "details":"Pretty simple", - "hint":"There is nothing you can do.", - "code":"P0001" - } - -One way to customize the HTTP status code is by raising particular exceptions according to the PostgREST :ref:`error to status code mapping `. For example, :code:`RAISE insufficient_privilege` will respond with HTTP 401/403 as appropriate. - -For even greater control of the HTTP status code, raise an exception of the ``PTxyz`` type. For instance to respond with HTTP 402, raise 'PT402': - -.. code-block:: sql - - RAISE sqlstate 'PT402' using - message = 'Payment Required', - detail = 'Quota exceeded', - hint = 'Upgrade your plan'; - -Returns: - -.. code-block:: http - - HTTP/1.1 402 Payment Required - Content-Type: application/json; charset=utf-8 - - {"hint":"Upgrade your plan","details":"Quota exceeded"} - .. _insert_update: Insertions / Updates @@ -1444,10 +1363,110 @@ You can use a tool like `Swagger UI `_ to create The OpenAPI information can go out of date as the schema changes under a running server. To learn how to refresh the cache see :ref:`schema_reloading`. +HTTP Logic +========== + +.. _guc_req_headers_cookies_claims: + +Accessing Request Headers, Cookies and JWT claims +------------------------------------------------- + +You can access request headers, cookies and jwt claims by reading GUC variables set by PostgREST per request. They are named :code:`request.header.XYZ`, :code:`request.cookie.XYZ` and :code:`request.jwt.claim.XYZ`. + +.. code-block:: postgresql + + -- To read the value of the Origin request header: + SELECT current_setting('request.header.origin', true); + -- To read the value of sessionId in a cookie: + SELECT current_setting('request.cookie.sessionId', true); + -- To read the value of the email claim in a jwt: + SELECT current_setting('request.jwt.claim.email', true); + +.. note:: + + ``request.jwt.claim.role`` defaults to the value of :ref:`db-anon-role`. + +.. _guc_req_path_method: + +Accessing Request Path and Method +--------------------------------- + +You can also access the request path and method with :code:`request.path` and :code:`request.method`. + +.. code-block:: postgresql + + -- You can get the path of the request with + SELECT current_setting('request.path', true); + + -- You can get the method of the request with + SELECT current_setting('request.method', true); + +Setting Response Headers +------------------------ + +PostgREST reads the ``response.headers`` SQL variable to add extra headers to the HTTP response. Stored procedures can modify this variable. For instance, this statement would add caching headers to the response: + +.. code-block:: sql + + -- tell client to cache response for two days + + SET LOCAL "response.headers" = + '[{"Cache-Control": "public"}, {"Cache-Control": "max-age=259200"}]'; + +Notice that the variable should be set to an *array* of single-key objects rather than a single multiple-key object. This is because headers such as ``Cache-Control`` or ``Set-Cookie`` need to be repeated when setting multiple values and an object would not allow the repeated key. + +Errors and HTTP Status Codes +---------------------------- + +Stored procedures can return non-200 HTTP status codes by raising SQL exceptions. For instance, here's a saucy function that always responds with an error: + +.. code-block:: postgresql + + CREATE OR REPLACE FUNCTION just_fail() RETURNS void + LANGUAGE plpgsql + AS $$ + BEGIN + RAISE EXCEPTION 'I refuse!' + USING DETAIL = 'Pretty simple', + HINT = 'There is nothing you can do.'; + END + $$; + +Calling the function returns HTTP 400 with the body + +.. code-block:: json + + { + "message":"I refuse!", + "details":"Pretty simple", + "hint":"There is nothing you can do.", + "code":"P0001" + } + +One way to customize the HTTP status code is by raising particular exceptions according to the PostgREST :ref:`error to status code mapping `. For example, :code:`RAISE insufficient_privilege` will respond with HTTP 401/403 as appropriate. + +For even greater control of the HTTP status code, raise an exception of the ``PTxyz`` type. For instance to respond with HTTP 402, raise 'PT402': + +.. code-block:: sql + + RAISE sqlstate 'PT402' using + message = 'Payment Required', + detail = 'Quota exceeded', + hint = 'Upgrade your plan'; + +Returns: + +.. code-block:: http + + HTTP/1.1 402 Payment Required + Content-Type: application/json; charset=utf-8 + + {"hint":"Upgrade your plan","details":"Quota exceeded"} + .. _status_codes: HTTP Status Codes -================= +----------------- PostgREST translates `PostgreSQL error codes `_ into HTTP status as follows: diff --git a/releases/upcoming.rst b/releases/upcoming.rst index 8f00c63961..cf8bb706c8 100644 --- a/releases/upcoming.rst +++ b/releases/upcoming.rst @@ -13,6 +13,9 @@ Added * Support for HTTP HEAD requests. |br| -- `@steve-chavez `_ +* Add GUCs for :ref:`guc_req_path_method`. + |br| -- `@steve-chavez `_ + * Support for :ref:`planned_count` and :ref:`estimated_count`. |br| -- `@steve-chavez `_ From 5fd86e682bea3f6ff9256c8f67de21125805c0f6 Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Mon, 10 Feb 2020 12:00:04 -0500 Subject: [PATCH 302/711] Add setting headers via pre-request --- api.rst | 37 +++++++++++++++++++++++++++++++++++++ releases/upcoming.rst | 12 ++++++------ 2 files changed, 43 insertions(+), 6 deletions(-) diff --git a/api.rst b/api.rst index 506cf35b98..dd234b7693 100644 --- a/api.rst +++ b/api.rst @@ -1415,6 +1415,43 @@ PostgREST reads the ``response.headers`` SQL variable to add extra headers to th Notice that the variable should be set to an *array* of single-key objects rather than a single multiple-key object. This is because headers such as ``Cache-Control`` or ``Set-Cookie`` need to be repeated when setting multiple values and an object would not allow the repeated key. +.. _pre_req_headers: + +Setting headers via pre-request +------------------------------- + +By using a :ref:`pre-request` function, you can add headers to GET/POST/PATCH/PUT/DELETE responses. +As an example, let's add some cache headers for all requests that come from an Internet Explorer(6 or 7) browser. + +.. code-block:: postgresql + + create or replace function custom_headers() returns void as $$ + declare + user_agent text := current_setting('request.header.user-agent', true); + begin + if user_agent similar to '%MSIE (6.0|7.0)%' then + perform set_config('response.headers', + '[{"Cache-Control": "no-cache, no-store, must-revalidate"}]', false); + end if; + end; $$ language plpgsql; + + -- set this function on postgrest.conf + -- pre-request = custom_headers + +Now when you make a GET request to a table or view, you'll get the cache headers. + +.. code-block:: http + + GET /people HTTP/1.1 + User-Agent: Mozilla/4.01 (compatible; MSIE 6.0; Windows NT 5.1) + + HTTP/1.1 200 OK + Content-Type: application/json; charset=utf-8 + Cache-Control: no-cache, no-store, must-revalidate + + ... + + Errors and HTTP Status Codes ---------------------------- diff --git a/releases/upcoming.rst b/releases/upcoming.rst index cf8bb706c8..4da513f6ec 100644 --- a/releases/upcoming.rst +++ b/releases/upcoming.rst @@ -10,18 +10,18 @@ These are changes yet unreleased. If you'd like to try them out before a new off Added ----- -* Support for HTTP HEAD requests. - |br| -- `@steve-chavez `_ - -* Add GUCs for :ref:`guc_req_path_method`. - |br| -- `@steve-chavez `_ - * Support for :ref:`planned_count` and :ref:`estimated_count`. |br| -- `@steve-chavez `_ * Support for :ref:`Resource Embedding Disambiguation `. |br| -- `@steve-chavez `_ +* HTTP improvements -- `@steve-chavez `_ + + + Support for HTTP HEAD requests. + + GUCs for :ref:`guc_req_path_method`. + + Support for :ref:`pre_req_headers`. + * Documentation reference for :ref:`s_proc_embed`. * Documentation reference for :ref:`mutation_embed`. From 87528412c0e24111349b7a2b07841f496a96876f Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Tue, 11 Feb 2020 14:39:00 -0500 Subject: [PATCH 303/711] Add overriding provided headers note --- api.rst | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/api.rst b/api.rst index dd234b7693..3e8bbad058 100644 --- a/api.rst +++ b/api.rst @@ -1415,6 +1415,10 @@ PostgREST reads the ``response.headers`` SQL variable to add extra headers to th Notice that the variable should be set to an *array* of single-key objects rather than a single multiple-key object. This is because headers such as ``Cache-Control`` or ``Set-Cookie`` need to be repeated when setting multiple values and an object would not allow the repeated key. +.. note:: + + PostgREST provided headers such as ``Content-Type``, ``Location``, etc. can be overriden this way. + .. _pre_req_headers: Setting headers via pre-request From 2aae1a389432cb9d6fa9399ab62fbd869c075586 Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Thu, 13 Feb 2020 11:24:28 -0500 Subject: [PATCH 304/711] Add unix socket changes --- releases/upcoming.rst | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/releases/upcoming.rst b/releases/upcoming.rst index 4da513f6ec..ae5ad42254 100644 --- a/releases/upcoming.rst +++ b/releases/upcoming.rst @@ -16,6 +16,9 @@ Added * Support for :ref:`Resource Embedding Disambiguation `. |br| -- `@steve-chavez `_ +* Support for user defined socket permission via :ref:`server-unix-socket-mode` config option + |br| -- `@Dansvidania `_ + * HTTP improvements -- `@steve-chavez `_ + Support for HTTP HEAD requests. @@ -34,3 +37,5 @@ Changed * Resource Embedding now outputs an error when multiple relationships between two tables are found, see :ref:`embed_disamb`. * ``server-proxy-uri`` config option has been renamed to :ref:`openapi-server-proxy-uri`. + +* Default Unix Socket file mode from 755 to 660 From 1d54b8b07d74f48ddf64ff3c2ab0feb858a610f3 Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Thu, 13 Feb 2020 11:42:15 -0500 Subject: [PATCH 305/711] Add fixes to upcoming --- releases/upcoming.rst | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/releases/upcoming.rst b/releases/upcoming.rst index ae5ad42254..fc7b7b3ef5 100644 --- a/releases/upcoming.rst +++ b/releases/upcoming.rst @@ -29,6 +29,24 @@ Added * Documentation reference for :ref:`mutation_embed`. +Fixed +----- + +* Allow embedding a VIEW when its source table foreign key is UNIQUE + |br| -- `@bwbroersma `_ + +* ``Accept: application/vnd.pgrst.object+json`` behavior is now enforced for POST/PATCH/DELETE regardless of ``Prefer: return=minimal`` + |br| -- `@dwagin `_ + +* Fix self join resource embedding on PATCH + |br| -- `@herulume `_, `@steve-chavez `_ + +* Allow PATCH/DELETE without ``Prefer: return=minimal`` on tables with no SELECT privileges + |br| -- `@steve-chavez `_ + +* Fix many to many resource embedding for RPC/PATCH + |br| -- `@steve-chavez `_ + Changed ------- From f34a480a99b4e33fd15f5f6375a37911a05e6c1f Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Thu, 13 Feb 2020 13:32:31 -0500 Subject: [PATCH 306/711] Add misc header improvements to upcoming --- api.rst | 2 ++ releases/upcoming.rst | 4 +++- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/api.rst b/api.rst index 3e8bbad058..17960fa482 100644 --- a/api.rst +++ b/api.rst @@ -1401,6 +1401,8 @@ You can also access the request path and method with :code:`request.path` and :c -- You can get the method of the request with SELECT current_setting('request.method', true); +.. _guc_resp_hdrs: + Setting Response Headers ------------------------ diff --git a/releases/upcoming.rst b/releases/upcoming.rst index fc7b7b3ef5..de5e751cd5 100644 --- a/releases/upcoming.rst +++ b/releases/upcoming.rst @@ -19,11 +19,13 @@ Added * Support for user defined socket permission via :ref:`server-unix-socket-mode` config option |br| -- `@Dansvidania `_ -* HTTP improvements -- `@steve-chavez `_ +* HTTP logic improvements -- `@steve-chavez `_ + Support for HTTP HEAD requests. + GUCs for :ref:`guc_req_path_method`. + Support for :ref:`pre_req_headers`. + + Allow overriding provided headers(Content-Type, Location, etc) by :ref:`guc_resp_hdrs` + + Access to the ``Authorization`` header value through ``request.header.authorization`` * Documentation reference for :ref:`s_proc_embed`. From 53f35f638c5203d50bf63db0090fb224cb8fb2dc Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Fri, 14 Feb 2020 14:14:32 -0500 Subject: [PATCH 307/711] Add on_conflict query parameter --- api.rst | 26 +++++++++++++++++++++++--- releases/upcoming.rst | 3 +++ 2 files changed, 26 insertions(+), 3 deletions(-) diff --git a/api.rst b/api.rst index 17960fa482..fb478dc12c 100644 --- a/api.rst +++ b/api.rst @@ -1218,7 +1218,7 @@ In this case, only **source**, **publication_date** and **figure** will be inser Using this also has the side-effect of being more efficient for :ref:`bulk_insert` since PostgREST will not process the JSON and it'll send it directly to PostgreSQL. -Upsert +UPSERT ------ You can make an UPSERT with :code:`POST` and the :code:`Prefer: resolution=merge-duplicates` header: @@ -1234,11 +1234,31 @@ You can make an UPSERT with :code:`POST` and the :code:`Prefer: resolution=merge { "id": 3, "name": "New employee 3", "salary": 50000 } ] -UPSERT operates based on the primary key columns, you must specify all of them. You can also choose to ignore the duplicates with :code:`Prefer: resolution=ignore-duplicates`. UPSERT works best when the primary key is natural, but it's also possible to use it if the primary key is surrogate (example: "id serial primary key"). For more details read `this issue `_. +By default, UPSERT operates based on the primary key columns, you must specify all of them. You can also choose to ignore the duplicates with :code:`Prefer: resolution=ignore-duplicates`. This works best when the primary key is natural, but it's also possible to use it if the primary key is surrogate (example: "id serial primary key"). For more details read `this issue `_. .. important:: After creating a table or changing its primary key, you must refresh PostgREST schema cache for UPSERT to work properly. To learn how to refresh the cache see :ref:`schema_reloading`. +.. _on_conflict: + +On Conflict +~~~~~~~~~~~ + +By specifying the ``on_conflict`` query parameter, you can make UPSERT work on a column(s) that has a UNIQUE constraint. + +.. code-block:: http + + POST /employees?on_conflict=name HTTP/1.1 + Prefer: resolution=merge-duplicates + + [ + { "name": "Old employee 1", "salary": 40000 }, + { "name": "Old employee 2", "salary": 52000 }, + { "name": "New employee 3", "salary": 60000 } + ] + +PUT +~~~ A single row UPSERT can be done by using :code:`PUT` and filtering the primary key columns with :code:`eq`: @@ -1252,7 +1272,7 @@ All the columns must be specified in the request body, including the primary key .. note:: - This feature is only available starting from PostgreSQL 9.5 since it uses the `ON CONFLICT clause `_. + Upsert features are only available starting from PostgreSQL 9.5 since it uses the `ON CONFLICT clause `_. .. _delete: diff --git a/releases/upcoming.rst b/releases/upcoming.rst index de5e751cd5..858861f46f 100644 --- a/releases/upcoming.rst +++ b/releases/upcoming.rst @@ -10,6 +10,9 @@ These are changes yet unreleased. If you'd like to try them out before a new off Added ----- +* Support for the :ref:`on_conflict ` query parameter to UPSERT based on a unique constraint. + |br| -- `@ykst `_ + * Support for :ref:`planned_count` and :ref:`estimated_count`. |br| -- `@steve-chavez `_ From 66e0e88539ffab842f4dce4111e40f835008f367 Mon Sep 17 00:00:00 2001 From: H20-17 <51759305+H20-17@users.noreply.github.com> Date: Tue, 18 Feb 2020 17:04:17 -0500 Subject: [PATCH 308/711] Clarify function privileges section (#303) * Add best_practices.rst file * Move function privileges to best_practices.rst --- api.rst | 27 +-------------------------- best_practices.rst | 22 ++++++++++++++++++++++ index.rst | 7 +++++++ 3 files changed, 30 insertions(+), 26 deletions(-) create mode 100644 best_practices.rst diff --git a/api.rst b/api.rst index fb478dc12c..0cb77ee176 100644 --- a/api.rst +++ b/api.rst @@ -1052,32 +1052,6 @@ A function that returns a table type response can be shaped using the same filte GET /rpc/best_films_2017?rating=gt.8&order=title.desc HTTP/1.1 -.. _func_privs: - -Function privileges -------------------- - -By default, a function is executed with the privileges of the user who calls it. This means that the user has to have all permissions to do the operations the procedure performs. - -Another option is to define the function with the :code:`SECURITY DEFINER` option. Then only one permission check will take place, the permission to call the function, and the operations in the function will have the authority of the user who owns the function itself. See `PostgreSQL documentation `_ for more details. - -.. warning:: - - Unlike tables/views, functions privileges work as a blacklist, so they're executable for all the roles by default. You can workaround this by revoking the PUBLIC privileges of the function and then granting privileges to specific roles: - - .. code-block:: postgres - - REVOKE ALL PRIVILEGES ON FUNCTION private_func() FROM PUBLIC; - GRANT EXECUTE ON FUNCTION private_func() TO a_role; - - Also to avoid doing ``REVOKE`` on every function you can enable this behavior by default with: - - .. code-block:: postgres - - ALTER DEFAULT PRIVILEGES REVOKE EXECUTE ON FUNCTIONS FROM PUBLIC; - - See `PostgreSQL alter default privileges `_ for more details. - Overloaded functions -------------------- @@ -1591,3 +1565,4 @@ PostgREST translates `PostgreSQL error codes `_ for more details. + +The foregoing example may not be appropriate in all situations. For instance you may have a situation where different functions are intended to be called by different roles. In that case you will `not` want to grant `EXECUTE` to one specific role by default. Instead you will want to manually grant executability on a case by case basis. + +By default, a function is executed with the privileges of the user who calls it. This means that the user has to have all permissions to do the operations the procedure performs. + +Another option is to define the function with the :code:`SECURITY DEFINER` option. Then only one permission check will take place, the permission to call the function, and the operations in the function will have the authority of the user who owns the function itself. See `PostgreSQL documentation `_ for more details. + diff --git a/index.rst b/index.rst index eb7f581f91..dadf693228 100644 --- a/index.rst +++ b/index.rst @@ -150,9 +150,16 @@ Explanations of some key concepts in PostgREST. admin.rst +.. toctree:: + :caption: Best Practices + :hidden: + + best_practices.rst + - :doc:`Authentication ` - :doc:`Installation ` - :doc:`Administration ` +- :doc:`Best Practices ` Ecosystem --------- From 0d3dc8509c845b54a35e0e252d501bca45c7de46 Mon Sep 17 00:00:00 2001 From: Steve Chavez Date: Thu, 12 Mar 2020 10:39:15 -0500 Subject: [PATCH 309/711] Add sompani to production list (#306) --- index.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/index.rst b/index.rst index dadf693228..75f5c5bc1c 100644 --- a/index.rst +++ b/index.rst @@ -192,6 +192,7 @@ In Production Here are some companies that use PostgREST in production. +* `Sompani `_ * `Datrium `_ * `Nimbus `_ - See how Nimbus uses PostgREST in `Paul Copplestone's blog post `_. From a34353653904311fb21d3033f25ced88f07baaf2 Mon Sep 17 00:00:00 2001 From: yang <27681135@qq.com> Date: Fri, 13 Mar 2020 01:58:07 +0800 Subject: [PATCH 310/711] Add type basic_auth.jwt_token. (#308) Or the function login will show error. --- auth.rst | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/auth.rst b/auth.rst index 4b770cb24e..fc05b28226 100644 --- a/auth.rst +++ b/auth.rst @@ -406,6 +406,11 @@ As described in `JWT from SQL`_, we'll create a JWT inside our login function. N .. code-block:: postgres + -- add type + CREATE TYPE basic_auth.jwt_token AS ( + token text + ); + -- login should be on your exposed schema create or replace function login(email text, pass text) returns basic_auth.jwt_token as $$ From 334dda611c4230c3c3758c4b051b14eacf294077 Mon Sep 17 00:00:00 2001 From: Patrik Keller Date: Tue, 17 Mar 2020 18:59:40 +0100 Subject: [PATCH 311/711] Tutorial: Providing images for (#307) --- how-tos/providing-images-for-img.rst | 126 +++++++++++++++++++++++++++ index.rst | 1 + 2 files changed, 127 insertions(+) create mode 100644 how-tos/providing-images-for-img.rst diff --git a/how-tos/providing-images-for-img.rst b/how-tos/providing-images-for-img.rst new file mode 100644 index 0000000000..8bb5100874 --- /dev/null +++ b/how-tos/providing-images-for-img.rst @@ -0,0 +1,126 @@ +Providing images for +========================== + +:author: `pkel `_ + +In this how-to, you will learn how to create an endpoint for providing images to HTML :code:`` tags without client side javascript. +The resulting HTML might look like this: + +.. code-block:: html + + Cute Kittens + +In fact, the presented technique is suitable for providing not only images, but arbitrary files. + +We will start with a minimal example that highlights the general concept. +Afterwards we present are more detailed solution that fixes a few shortcomings of the first approach. + +Minimal Example +--------------- + +PostgREST returns binary data on requests that set the :code:`Accept: application/octet-stream` header. +The general idea is to configure the reverse proxy in front of the API to set this header for all requests to :code:`/files/`. +We will show how to achieve this using Nginx. + +First, we need a public table for storing the files. + +.. code-block:: postgres + + create table files( + id int primary key + , blob bytea + ); + +Let's assume this table contains an image of two cute kittens with id 42. +We can retrieve this image in binary format from our PostgREST API by requesting :code:`/files?select=blob&id=eq.42` with the :code:`Accept: application/octet-stream` header. +Unfortunately, putting the URL into the :code:`src` of an :code:`` tag will not work. +That's because browsers do not send the required header. + +Luckily, we can configure our `Nginx reverse proxy <../admin.html>`_ to fix this problem for us. +We assume that PostgREST is running on port 3000. +We provide a new location :code:`/files/` that redirects requests to our endpoint with the :code:`Accept` header set to :code:`application/octet-stream`. + +.. code-block:: nginx + + server { + # rest of reverse proxy and web server configuration + ... + + location /files/ { + # /files//* ---> /files?select=blob&id=eq. + rewrite /files/([^/]+).* /files?select=blob&id=eq.$1 break; + # if id is missing + return 404; + # request binary output + proxy_set_header Accept application/octet-stream; + # usual proxy setup + proxy_hide_header Content-Location; + add_header Content-Location /api/$upstream_http_content_location; + proxy_set_header Connection ""; + proxy_http_version 1.1; + proxy_pass http://localhost:3000/; + } + +With this setup, we can request the cat image at :code:`localhost/files/42/cats.jpeg` without setting any headers. +In fact, you can replace :code:`cats.jpeg` with any other filename or simply omit it. +Putting the URL into the :code:`src` of an :code:`` tag should now work as expected. + +Improved Version +---------------- + +The basic solution has some shortcomings: + +1. The response :code:`Content-Type` header is set to :code:`application/octet-stream`. + This might confuse clients and users. +2. Download requests (e.g. Right Click -> Save Image As) to :code:`files/42` will propose :code:`42` as filename. + This might confuse users. +3. Requests to the binary endpoint are not cached. + This will cause unnecessary load on the database. + +The following improved version addresses these problems. +First, we store the media types and names of our files in the database. + +.. code-block:: postgres + + create table files( + id int primary key + , type text + , name text + , blob bytea + ); + +Next, we set up an RPC endpoint that sets the content type and filename. +We use this opportunity to configure some basic, client-side caching. +For production, you probably want to configure additional caches, e.g. on the reverse proxy. + +.. code-block:: postgres + + create function file(id int) returns bytea as + $$ + declare headers text; + declare blob bytea; + begin + select format( + '[{"Content-Type": "%s"},' + '{"Content-Disposition": "inline; filename=\"%s\""},' + '{"Cache-Control": "max-age=259200"}]' + , files.type, files.name) + from files where files.id = file.id into headers; + perform set_config('response.headers', headers, true); + select files.blob from files where files.id = file.id into blob; + if found + then return(blob); + else raise sqlstate 'PT404' using + message = 'NOT FOUND', + detail = 'File not found', + hint = format('%s seems to be an invalid file id', file.id); + end if; + end + $$ language plpgsql; + +With this, we can obtain the cat image from :code:`/rpc/file?id=42`. +Consequently, we have to replace our previous rewrite rule in the Nginx recipe with the following. + +.. code-block:: nginx + + rewrite /files/([^/]+).* /rpc/file?id=$1 break; diff --git a/index.rst b/index.rst index 75f5c5bc1c..0f7deaea99 100644 --- a/index.rst +++ b/index.rst @@ -126,6 +126,7 @@ These are recipes that'll help you address specific use-cases. - :doc:`how-tos/casting-type-to-custom-json` - :doc:`how-tos/embedding-table-from-another-schema` +- :doc:`how-tos/providing-images-for-img` Topic guides ------------ From e23b7afa3c089201438fad08c6e1a571d60ded39 Mon Sep 17 00:00:00 2001 From: Duncan Ogilvie Date: Mon, 23 Mar 2020 17:48:09 +0100 Subject: [PATCH 312/711] Fix the 'Roles for Each Web User' example (#313) Add missing `ALTER TABLE ... ENABLE ROW LEVEL SECURITY;` --- auth.rst | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/auth.rst b/auth.rst index fc05b28226..b762bc0210 100644 --- a/auth.rst +++ b/auth.rst @@ -60,6 +60,8 @@ You can use row-level security to flexibly restrict visibility and access for th message_subject VARCHAR(64) NOT NULL, message_body TEXT ); + + ALTER TABLE chat ENABLE ROW LEVEL SECURITY; We want to enforce a policy that ensures a user can see only those messages sent by him or intended for him. Also we want to prevent a user from forging the message_from column with another person's name. @@ -95,7 +97,7 @@ SQL code can access claims through GUC variables set by PostgREST per request. F current_setting('request.jwt.claim.email', true) -This allows JWT generation services to include extra information and your database code to react to it. For instance the RLS example could be modified to use this current_setting rather than current_user. The second 'true' argument tells current_setting to return NULL if the setting is missing from the current configuration. +This allows JWT generation services to include extra information and your database code to react to it. For instance the RLS example could be modified to use this current_setting rather than current_user. The second 'true' argument tells current_setting to return NULL if the setting is missing from the current configuration. Hybrid User-Group Roles ~~~~~~~~~~~~~~~~~~~~~~~ From 36c453d6dedfd816d887d92a4159cd18e90e3137 Mon Sep 17 00:00:00 2001 From: Sam Khawase <215221+samkhawase@users.noreply.github.com> Date: Mon, 30 Mar 2020 19:48:20 +0200 Subject: [PATCH 313/711] Added the link to tutorial to configure and integrate Auth0 to PostgREST (#312) --- ecosystem.rst | 2 ++ 1 file changed, 2 insertions(+) diff --git a/ecosystem.rst b/ecosystem.rst index f3e230f537..feb09410e6 100644 --- a/ecosystem.rst +++ b/ecosystem.rst @@ -9,6 +9,8 @@ Community Tutorials * `PostgREST + PostGIS API tutorial in 5 minutes `_ - In this tutorial, GIS • OPS shows how to perform PostGIS calculations through PostgREST :ref:`s_procs` interface. +* `PostgREST + Auth0: Create REST API in mintutes and add social login using Auth0 `_ - A step-by-step tutorial to show how to Dockerize and integrate Auth0 to PostgREST service. + .. _eco_example_apps: Example Apps From b7ee8f1cf0e2705a143fc246702d9a999278ceae Mon Sep 17 00:00:00 2001 From: fiatjaf Date: Wed, 1 Apr 2020 13:00:05 -0300 Subject: [PATCH 314/711] mention that JSON operators work for row filtering (#314) --- api.rst | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/api.rst b/api.rst index 0cb77ee176..d05788ce22 100644 --- a/api.rst +++ b/api.rst @@ -200,17 +200,20 @@ You can specify a path for a ``json`` or ``jsonb`` column using the arrow operat GET /people?select=id,json_data->>blood_type,json_data->phones HTTP/1.1 [ - { "id": 1, "blood_type": "A+", "phones": [{"country_code": "61", "number": "917-929-5745"}] }, + { "id": 1, "blood_type": "A-", "phones": [{"country_code": "61", "number": "917-929-5745"}] }, { "id": 2, "blood_type": "O+", "phones": [{"country_code": "43", "number": "512-446-4988"}, {"country_code": "43", "number": "213-891-5979"}] } ] +That also works with filters: + .. code-block:: http - GET /people?select=id,json_data->phones->0->>number HTTP/1.1 + GET /people?select=id,json_data->blood_type&json_data->>blood_type=eq.A- HTTP/1.1 [ - { "id": 1, "number": "917-929-5745"}, - { "id": 2, "number": "512-446-4988"} + { "id": 1, "blood_type": "A-" }, + { "id": 3, "blood_type": "A-" }, + { "id": 7, "blood_type": "A-" } ] .. _computed_cols: From 9f5ab4a8ba6909a85a5e4b496ffd6b7f876c44b9 Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Wed, 1 Apr 2020 11:35:38 -0500 Subject: [PATCH 315/711] Add reference for filtering on json column Fixes https://github.com/PostgREST/postgrest-docs/issues/266 --- api.rst | 25 ++++++++++++++++++++++++- releases/upcoming.rst | 6 ++++-- 2 files changed, 28 insertions(+), 3 deletions(-) diff --git a/api.rst b/api.rst index d05788ce22..f1a71d1233 100644 --- a/api.rst +++ b/api.rst @@ -190,6 +190,8 @@ Casting the columns is possible by suffixing them with the double colon ``::`` p {"full_name": "Jane Doe", "salary": "120000.00"} ] +.. _json_columns: + JSON Columns ~~~~~~~~~~~~ @@ -204,7 +206,16 @@ You can specify a path for a ``json`` or ``jsonb`` column using the arrow operat { "id": 2, "blood_type": "O+", "phones": [{"country_code": "43", "number": "512-446-4988"}, {"country_code": "43", "number": "213-891-5979"}] } ] -That also works with filters: +.. code-block:: http + + GET /people?select=id,json_data->phones->0->>number HTTP/1.1 + + [ + { "id": 1, "number": "917-929-5745"}, + { "id": 2, "number": "512-446-4988"} + ] + +This also works with filters: .. code-block:: http @@ -216,6 +227,18 @@ That also works with filters: { "id": 7, "blood_type": "A-" } ] +Note that ``->>`` is used to compare ``blood_type`` as ``text``. To compare with an integer value use ``->``: + +.. code-block:: http + + GET /people?select=id,json_data->age&json_data->age=gt.20 HTTP/1.1 + + [ + { "id": 11, "age": 25 }, + { "id": 12, "age": 30 }, + { "id": 15, "age": 35 } + ] + .. _computed_cols: Computed Columns diff --git a/releases/upcoming.rst b/releases/upcoming.rst index 858861f46f..d896b201ba 100644 --- a/releases/upcoming.rst +++ b/releases/upcoming.rst @@ -30,9 +30,11 @@ Added + Allow overriding provided headers(Content-Type, Location, etc) by :ref:`guc_resp_hdrs` + Access to the ``Authorization`` header value through ``request.header.authorization`` -* Documentation reference for :ref:`s_proc_embed`. +* Documentation improvements -* Documentation reference for :ref:`mutation_embed`. + + Reference for :ref:`s_proc_embed`. + + Reference for :ref:`mutation_embed`. + + Reference for filters on :ref:`json_columns`. Fixed ----- From dd7e182b12853ca069f8a55303bdf9189b0d6623 Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Fri, 3 Apr 2020 13:57:31 -0500 Subject: [PATCH 316/711] Update config.py version/release Fixes https://github.com/PostgREST/postgrest-docs/issues/260 --- conf.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/conf.py b/conf.py index f1f263a9eb..80008bf49a 100644 --- a/conf.py +++ b/conf.py @@ -46,17 +46,17 @@ # General information about the project. project = u'PostgREST' -copyright = u'2017, Joe Nelson' -author = u'Joe Nelson' +author = u'Joe Nelson, Steve Chavez' +copyright = u'2017, ' + author # The version info for the project you're documenting, acts as replacement for # |version| and |release|, also used in various other places throughout the # built documents. # # The short X.Y version. -version = u'5.0' +version = u'7.0' # The full version, including alpha/beta/rc tags. -release = u'5.0.0' +release = u'7.0.0' # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. @@ -225,7 +225,7 @@ # author, documentclass [howto, manual, or own class]). latex_documents = [ (master_doc, 'PostgREST.tex', u'PostgREST Documentation', - u'Joe Nelson', 'manual'), + author, 'manual'), ] # The name of an image file (relative to this directory) to place at the top of From 33768c509ca9b64098a19ba5b2efc3913e1644e4 Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Mon, 6 Apr 2020 14:00:30 -0500 Subject: [PATCH 317/711] Add reference for rpc with array literals Fixes https://github.com/PostgREST/postgrest-docs/issues/258 --- api.rst | 103 ++++++++++++++++++++++++++++++++++---------------------- 1 file changed, 63 insertions(+), 40 deletions(-) diff --git a/api.rst b/api.rst index f1a71d1233..88b4134dc7 100644 --- a/api.rst +++ b/api.rst @@ -912,16 +912,6 @@ For instance, assume we have created this function in the database. SELECT a + b; $$ LANGUAGE SQL IMMUTABLE; -The client can call it by posting an object like - -.. code-block:: http - - POST /rpc/add_them HTTP/1.1 - - { "a": 1, "b": 2 } - - 3 - .. important:: Whenever you create or change a function you must refresh PostgREST's schema cache. See the section :ref:`schema_reloading`. @@ -938,25 +928,18 @@ The client can call it by posting an object like "message":"function test.add_them(a => text, b => text) does not exist" } -You can also call a function that takes a single parameter of type json by sending the header :code:`Prefer: params=single-object` with your request. That way the JSON request body will be used as the single argument. - -.. code-block:: plpgsql - - CREATE FUNCTION mult_them(param json) RETURNS int AS $$ - SELECT (param->>'x')::int * (param->>'y')::int - $$ LANGUAGE SQL; +The client can call it by posting an object like .. code-block:: http - POST /rpc/mult_them HTTP/1.1 - Prefer: params=single-object + POST /rpc/add_them HTTP/1.1 - { "x": 4, "y": 2 } + { "a": 1, "b": 2 } - 8 + 3 -Procedures must be declared with named parameters, procedures declared like: +Procedures must be declared with named parameters. Procedures declared like: .. code-block:: plpgsql @@ -974,44 +957,84 @@ PostgreSQL has four procedural languages that are part of the core distribution: .. note:: - For versions prior to PostgreSQL 10, to pass a PostgreSQL native array you need to quote it as a string: + Why the `/rpc` prefix? One reason is to avoid name collisions between views and procedures. It also helps emphasize to API consumers that these functions are not normal restful things. The functions can have arbitrary and surprising behavior, not the standard "post creates a resource" thing that users expect from the other routes. - .. code-block:: http +Immutable and stable functions +------------------------------ - POST /rpc/native_array_func HTTP/1.1 +Procedures in PostgreSQL marked with :code:`stable` or :code:`immutable` `volatility `_ can only read, not modify, the database and PostgREST executes them in a read-only transaction compatible for read-replicas. Stable and immutable functions can be called with the HTTP GET verb if desired. - { "arg": "{1,2,3}" } +.. note:: - In these versions we recommend using function arguments of type json to accept arrays from the client: + The volatility marker is a promise about the behavior of the function. PostgreSQL will let you mark a function that modifies the database as ``immutable/stable`` without failure. However the function will fail when called through PostgREST since it executes it in a read-only transaction. - .. code-block:: http +Because ``add_them`` was declared IMMUTABLE, we can alternately call the function with a GET request: - POST /rpc/json_array_func HTTP/1.1 +.. code-block:: http - { "arg": [1,2,3] } + GET /rpc/add_them?a=1&b=2 HTTP/1.1 - Starting from PostgreSQL 10, a json array from the client gets mapped normally to a PostgreSQL native array. +The function parameter names match the JSON object keys in the POST case, for the GET case they match the query parameters ``?a=1&b=2``. -.. note:: +Calling functions with a single json parameter +---------------------------------------------- - Why the `/rpc` prefix? One reason is to avoid name collisions between views and procedures. It also helps emphasize to API consumers that these functions are not normal restful things. The functions can have arbitrary and surprising behavior, not the standard "post creates a resource" thing that users expect from the other routes. +You can also call a function that takes a single parameter of type json by sending the header :code:`Prefer: params=single-object` with your request. That way the JSON request body will be used as the single argument. -Immutable and stable functions ------------------------------- +.. code-block:: plpgsql -Procedures in PostgreSQL marked with :code:`stable` or :code:`immutable` `volatility `_ can only read, not modify, the database and PostgREST executes them in a read-only transaction compatible for read-replicas. Stable and immutable functions can be called with the HTTP GET verb if desired. + CREATE FUNCTION mult_them(param json) RETURNS int AS $$ + SELECT (param->>'x')::int * (param->>'y')::int + $$ LANGUAGE SQL; + +.. code-block:: http + + POST /rpc/mult_them HTTP/1.1 + Prefer: params=single-object + + { "x": 4, "y": 2 } + + 8 + +Calling functions with array parameters +--------------------------------------- + +You can call a function that takes an array parameter: + +.. code-block:: plpgsql + + CREATE FUNCTION native_array_func(arr int[]) RETURNS int[] as $$ + SELECT arr; + $$ LANGUAGE SQL; + +.. code-block:: http + + POST /rpc/native_array_func HTTP/1.1 + + { "arg": [1,2,3] } + + [1,2,3] .. note:: - The volatility marker is a promise about the behavior of the function. PostgreSQL will let you mark a function that modifies the database as ``immutable/stable`` without failure. However the function will fail when called through PostgREST since it executes it in a read-only transaction. + For versions prior to PostgreSQL 10, to pass a PostgreSQL native array you need to quote it as a string: -Because ``add_them`` was declared IMMUTABLE, we can alternately call the function with a GET request: + .. code-block:: http + + POST /rpc/native_array_func HTTP/1.1 + + { "arg": "{1,2,3}" } + + In these versions we recommend using function parameters of type json to accept arrays from the client. + +For calling it with GET, you can pass the array as an `array literal `_; +as in ``{1,2,3}``. Note that the curly brackets have to be urlencoded(``{`` is ``%7B`` and ``}`` is ``%7D``). .. code-block:: http - GET /rpc/add_them?a=1&b=2 HTTP/1.1 + GET /rpc/native_array_func?arr=%7B1,2,3%7D' HTTP/1.1 -The function parameter names match the JSON object keys in the POST case, for the GET case they match the query parameters ``?a=1&b=2``. + [1,2,3] Scalar functions ---------------- From 3292fce732bc1dff9647c2cad9aba2e7b6bfb9f4 Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Tue, 7 Apr 2020 14:37:40 -0500 Subject: [PATCH 318/711] Update schema reloading section Fixes https://github.com/PostgREST/postgrest-docs/issues/243 --- admin.rst | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/admin.rst b/admin.rst index a192b304b4..17486b155a 100644 --- a/admin.rst +++ b/admin.rst @@ -187,12 +187,28 @@ Schema Reloading Users are often confused by PostgREST's database schema cache. It is present because detecting foreign key relationships between tables (including how those relationships pass through views) is necessary, but costly. API requests consult the schema cache as part of :ref:`resource_embedding`. However if the schema changes while the server is running it results in a stale cache and leads to errors claiming that no relations are detected between tables. +.. important:: + + Since v5.0, PostgREST also makes use of the schema cache for stored functions metadata: parameters, return type, volatility. + It also uses the schema cache for resolving overloaded functions. You should refresh the cache if a change in any of the prior is done. + To refresh the cache without restarting the PostgREST server, send the server process a SIGUSR1 signal: .. code:: bash killall -SIGUSR1 postgrest +.. note:: + + To refresh the cache in docker: + + .. code:: bash + + docker kill -s SIGUSR1 + + # or in docker-compose + docker-compose kill -s SIGUSR1 + The above is the manual way to do it. To automate the schema reloads, use a database trigger like this: .. code-block:: postgresql From 87f883b7932940941dd174fe92c4712a7c7e4d92 Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Sat, 11 Apr 2020 17:40:33 -0500 Subject: [PATCH 319/711] Add multiple schemas feature --- api.rst | 34 ++++++++++++++++++++++++++++++++++ configuration.rst | 14 +++++++++++++- releases/upcoming.rst | 9 ++++++--- 3 files changed, 53 insertions(+), 4 deletions(-) diff --git a/api.rst b/api.rst index 88b4134dc7..9d06e45c8f 100644 --- a/api.rst +++ b/api.rst @@ -1371,6 +1371,8 @@ You can get raw output from a ``text`` column by using ``Accept: text/plain``. This follows the same rules as :ref:`binary_output`. +.. _open-api: + OpenAPI Support =============== @@ -1406,6 +1408,38 @@ You can use a tool like `Swagger UI `_ to create The OpenAPI information can go out of date as the schema changes under a running server. To learn how to refresh the cache see :ref:`schema_reloading`. +.. _multiple-schemas: + +Switching Schemas +================= + +You can switch schemas at runtime with the ``Accept-Profile`` and ``Content-Profile`` headers. You can only switch to a schema that is included in :ref:`db-schema`. +This is useful for **api versioning** and **schema-based multitenancy**. + +The schema to be used can be selected through the ``Accept-Profile`` header for GET or HEAD: + +.. code-block:: http + + GET /items HTTP/1.1 + Accept-Profile: tenant2 + +If you don't specify the ``Accept-Profile`` header, the first schema on :ref:`db-schema` will be used. + +For POST, PATCH, PUT, DELETE you can use the ``Content-Profile`` header for selecting the schema: + +.. code-block:: http + + POST /items HTTP/1.1 + Content-Profile: tenant2 + + {...} + +You can also select the schema for :ref:`s_procs` and :ref:`open-api`. + +.. note:: + + These headers are based on the nascent "Content Negotiation by Profile" spec: https://www.w3.org/TR/dx-prof-conneg + HTTP Logic ========== diff --git a/configuration.rst b/configuration.rst index fe9b9f7f26..35d93d3083 100644 --- a/configuration.rst +++ b/configuration.rst @@ -75,7 +75,19 @@ db-schema The database schema to expose to REST clients. Tables, views and stored procedures in this schema will get API endpoints. - This schema gets added to the `search_path `_ of every request. + The chosen schema gets added to the `search_path `_ of every request. Example: + + .. code:: bash + + db-schema = "api" + + You can also specify a list of schemas that can be used for **schema-based multitenancy** and **api versioning** by :ref:`multiple-schemas`. Example: + + .. code:: bash + + db-schema = "tenant1, tenant2" + ##or + ##db-schema = "v1, v2" .. _db-anon-role: diff --git a/releases/upcoming.rst b/releases/upcoming.rst index d896b201ba..5fa71b0f2a 100644 --- a/releases/upcoming.rst +++ b/releases/upcoming.rst @@ -10,11 +10,14 @@ These are changes yet unreleased. If you'd like to try them out before a new off Added ----- -* Support for the :ref:`on_conflict ` query parameter to UPSERT based on a unique constraint. - |br| -- `@ykst `_ +* Support for :ref:`multiple-schemas` at runtime. + |br| -- `@steve-chavez `_, `@mahmoudkassem `_ * Support for :ref:`planned_count` and :ref:`estimated_count`. - |br| -- `@steve-chavez `_ + |br| -- `@steve-chavez `_, `@LorenzHenk `_ + +* Support for the :ref:`on_conflict ` query parameter to UPSERT based on a unique constraint. + |br| -- `@ykst `_ * Support for :ref:`Resource Embedding Disambiguation `. |br| -- `@steve-chavez `_ From 467b22cb298619ddf03e890e502fc4033da7de11 Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Mon, 13 Apr 2020 15:02:40 -0500 Subject: [PATCH 320/711] Fix required pg minimum version Fixes https://github.com/PostgREST/postgrest-docs/issues/317 --- install.rst | 4 +++- tutorials/tut0.rst | 4 +--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/install.rst b/install.rst index 685d282354..0e0e2ae700 100644 --- a/install.rst +++ b/install.rst @@ -24,11 +24,13 @@ The release page has pre-compiled binaries for Mac OS X, Windows, and several Li It usually lives in :code:`C:\Program Files\PostgreSQL\\bin`. See this `article `_ about how to modify the system path. +.. _pg-dependency: PostgreSQL dependency ===================== -To use PostgREST you will need an underlying database (PostgreSQL version 9.5 or greater is required). You can use something like Amazon `RDS `_ but installing your own locally is cheaper and more convenient for development. +To use PostgREST you will need an underlying database. We require PostgreSQL 9.4 or greater, but recommend at least 9.5 for row-level security features. +You can use something like Amazon `RDS `_ but installing your own locally is cheaper and more convenient for development. * `Instructions for OS X `_ * `Instructions for Ubuntu 14.04 `_ diff --git a/tutorials/tut0.rst b/tutorials/tut0.rst index 038b92f6fc..18884ea5f5 100644 --- a/tutorials/tut0.rst +++ b/tutorials/tut0.rst @@ -23,9 +23,7 @@ As you begin the tutorial, pop open the project `chat room `_. Next, let's pull and start the database image: From a5af8dc68fa31854e1cb199ddfcef54178f4b254 Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Tue, 14 Apr 2020 11:35:32 -0500 Subject: [PATCH 321/711] Add return=rep to DELETE section --- api.rst | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/api.rst b/api.rst index 9d06e45c8f..03c97c96b3 100644 --- a/api.rst +++ b/api.rst @@ -1304,14 +1304,24 @@ Deletions To delete rows in a table, use the DELETE verb plus :ref:`h_filter`. For instance deleting inactive users: -.. code-block:: HTTP +.. code-block:: http DELETE /user?active=is.false HTTP/1.1 +Deletions also support :code:`Prefer: return=representation` plus :ref:`v_filter`. + +.. code-block:: HTTP + + DELETE /user?id=eq.1 HTTP/1.1 + Prefer: return=representation + + {"id": 1, "email": "johndoe@email.com"} + .. warning:: Beware of accidentally deleting all rows in a table. To learn to prevent that see :ref:`block_fulltable`. + .. _binary_output: Binary Output From 4d623986eadb65494c2c8a094bf805b5bcf22295 Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Tue, 14 Apr 2020 13:24:48 -0500 Subject: [PATCH 322/711] Alternative to bulk call --- api.rst | 30 +++++++++++++++++++++++------- releases/upcoming.rst | 2 +- 2 files changed, 24 insertions(+), 8 deletions(-) diff --git a/api.rst b/api.rst index 03c97c96b3..380aaf6937 100644 --- a/api.rst +++ b/api.rst @@ -1068,20 +1068,36 @@ It's possible to call a function in a bulk way, analoguosly to :ref:`bulk_insert .. code-block:: http POST /rpc/add_them HTTP/1.1 - Content-Type: application/json + Content-Type: text/csv Prefer: params=multiple-objects - [ - {"a": 1, "b": 2}, - {"a": 3, "b": 4} - ] - -Result: + a,b + 1,2 + 3,4 .. code-block:: json [ 3, 7 ] +If you have large payloads to process, it's preferrable you instead use a function with an array or json parameter, as this will be more efficient. + +.. code-block:: postgres + + create function plus_one(arr int[]) returns int[] as $$ + SELECT array_agg(n + 1) FROM unnest($1) AS n; + $$ language sql; + +.. code-block:: http + + POST /rpc/plus_one HTTP/1.1 + Content-Type: application/json + + {"arr": [1,2,3,4]} + +.. code-block:: json + + [2,3,4,5] + It's also possible to :ref:`Specify Columns ` on functions calls. Function filters diff --git a/releases/upcoming.rst b/releases/upcoming.rst index 5fa71b0f2a..8a77c509be 100644 --- a/releases/upcoming.rst +++ b/releases/upcoming.rst @@ -60,7 +60,7 @@ Fixed Changed ------- -* :ref:`bulk_call` should now be done by specifying a ``Prefer: params=multiple-objects`` header. +* :ref:`bulk_call` should now be done by specifying a ``Prefer: params=multiple-objects`` header. This fixes a performance regression when calling stored procedures. * Resource Embedding now outputs an error when multiple relationships between two tables are found, see :ref:`embed_disamb`. From 750c22cd1cb577010512d0224034d8020a1ae1de Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Thu, 16 Apr 2020 12:35:57 -0500 Subject: [PATCH 323/711] Add mounting config file to docker --- install.rst | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/install.rst b/install.rst index 0e0e2ae700..415757f456 100644 --- a/install.rst +++ b/install.rst @@ -78,6 +78,12 @@ These variables match the options shown in our :ref:`configuration` section, exc docker inspect -f "{{.Config.Env}}" postgrest/postgrest +You can also specify a config file by mounting the file to the container: + +.. code-block:: bash + + docker run -v /absolute/path/to/config:/etc/postgrest.conf postgrest/postgrest + There are two ways to run the PostgREST container: with an existing external database, or through docker-compose. Containerized PostgREST with native PostgreSQL From c2ff7ffb622cb660900285d9ede8215dba067a09 Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Thu, 16 Apr 2020 13:26:02 -0500 Subject: [PATCH 324/711] Redorder insertions before stored procedures --- api.rst | 411 ++++++++++++++++++++++++++++---------------------------- 1 file changed, 205 insertions(+), 206 deletions(-) diff --git a/api.rst b/api.rst index 380aaf6937..55dae2a3f5 100644 --- a/api.rst +++ b/api.rst @@ -400,7 +400,7 @@ This method is also useful for embedded resources, which we will cover in anothe .. _exact_count: Exact Count -~~~~~~~~~~~ +----------- In order to obtain the total size of the table or view (such as when rendering the last page link in a pagination control), specify ``Prefer: count=exact`` as a request header: @@ -422,7 +422,7 @@ Note that the larger the table the slower this query runs in the database. The s .. _planned_count: Planned Count -~~~~~~~~~~~~~ +------------- To avoid the shortcomings of :ref:`exact count `, PostgREST can leverage PostgreSQL statistics and get a fairly accurate and fast count. To do this, specify the ``Prefer: count=planned`` header. @@ -444,7 +444,7 @@ See `ANALYZE `_ for more de .. _estimated_count: Estimated Count -~~~~~~~~~~~~~~~ +--------------- When you are interested in the count, the relative error is important. If you have a :ref:`planned count ` of 1000000 and the exact count is 1001000, the error is small enough to be ignored. But with a planned count of 7, an exact count of 28 would be a huge misprediction. @@ -876,6 +876,208 @@ Here we specify ``central_addresses`` as the **target** and the ``billing_addres Similarly to the **target**, the **hint** can be a **table name**, **foreign key constraint name** or **column name**. +.. _insert_update: + +Insertions / Updates +==================== + +All tables and `auto-updatable views `_ can be modified through the API, subject to permissions of the requester's database role. + +To create a row in a database table post a JSON object whose keys are the names of the columns you would like to create. Missing properties will be set to default values when applicable. + +.. code-block:: HTTP + + POST /table_name HTTP/1.1 + + { "col1": "value1", "col2": "value2" } + +The response will include a :code:`Location` header describing where to find the new object. If the table is write-only then constructing the Location header will cause a permissions error. To successfully insert an item to a write-only table you will need to suppress the Location response header by including the request header :code:`Prefer: return=minimal`. + +On the other end of the spectrum you can get the full created object back in the response to your request by including the header :code:`Prefer: return=representation`. That way you won't have to make another HTTP call to discover properties that may have been filled in on the server side. You can also apply the standard :ref:`v_filter` to these results. + +URL encoded payloads can be posted with ``Content-Type: application/x-www-form-urlencoded``. + +.. code-block:: http + + POST /people HTTP/1.1 + Content-Type: application/x-www-form-urlencoded + + name=John+Doe&age=50&weight=80 + +.. note:: + + When inserting a row you must post a JSON object, not quoted JSON. + + .. code:: + + Yes + { "a": 1, "b": 2 } + + No + "{ \"a\": 1, \"b\": 2 }" + + Some javascript libraries will post the data incorrectly if you're not careful. For best results try one of the :ref:`clientside_libraries` built for PostgREST. + +To update a row or rows in a table, use the PATCH verb. Use :ref:`h_filter` to specify which record(s) to update. Here is an example query setting the :code:`category` column to child for all people below a certain age. + +.. code-block:: http + + PATCH /people?age=lt.13 HTTP/1.1 + + { "category": "child" } + +Updates also support :code:`Prefer: return=representation` plus :ref:`v_filter`. + +.. warning:: + + Beware of accidentally updating every row in a table. To learn to prevent that see :ref:`block_fulltable`. + +.. warning:: + + Insertion on VIEWs with complex `RULEs `_ might not work out of the box with PostgREST. + It's recommended that you `use triggers instead of RULEs `_. + If you want to keep using RULEs, a workaround is to wrap the VIEW insertion in a stored procedure and call it through the :ref:`s_procs` interface. + +.. _bulk_insert: + +Bulk Insert +----------- + +Bulk insert works exactly like single row insert except that you provide either a JSON array of objects having uniform keys, or lines in CSV format. This not only minimizes the HTTP requests required but uses a single INSERT statement on the back-end for efficiency. Note that using CSV requires less parsing on the server and is much faster. + +To bulk insert CSV simply post to a table route with :code:`Content-Type: text/csv` and include the names of the columns as the first row. For instance + +.. code-block:: http + + POST /people HTTP/1.1 + Content-Type: text/csv + + name,age,height + J Doe,62,70 + Jonas,10,55 + +An empty field (:code:`,,`) is coerced to an empty string and the reserved word :code:`NULL` is mapped to the SQL null value. Note that there should be no spaces between the column names and commas. + +To bulk insert JSON post an array of objects having all-matching keys + +.. code-block:: http + + POST /people HTTP/1.1 + Content-Type: application/json + + [ + { "name": "J Doe", "age": 62, "height": 70 }, + { "name": "Janus", "age": 10, "height": 55 } + ] + +.. _specify_columns: + +Specifying Columns +------------------ + +By using the :code:`columns` query parameter it's possible to specify the payload keys that will be inserted/updated +and ignore the rest of the payload. + +.. code-block:: http + + POST /datasets?columns=source,publication_date,figure HTTP/1.1 + Content-Type: application/json + + { + "source": "Natural Disaster Prevention and Control", + "publication_date": "2015-09-11", + "figure": 1100, + "location": "...", + "comment": "...", + "extra": "...", + "stuff": "..." + } + +In this case, only **source**, **publication_date** and **figure** will be inserted. The rest of the JSON keys will be ignored. + +Using this also has the side-effect of being more efficient for :ref:`bulk_insert` since PostgREST will not process the JSON and +it'll send it directly to PostgreSQL. + +UPSERT +------ + +You can make an UPSERT with :code:`POST` and the :code:`Prefer: resolution=merge-duplicates` header: + +.. code-block:: http + + POST /employees HTTP/1.1 + Prefer: resolution=merge-duplicates + + [ + { "id": 1, "name": "Old employee 1", "salary": 30000 }, + { "id": 2, "name": "Old employee 2", "salary": 42000 }, + { "id": 3, "name": "New employee 3", "salary": 50000 } + ] + +By default, UPSERT operates based on the primary key columns, you must specify all of them. You can also choose to ignore the duplicates with :code:`Prefer: resolution=ignore-duplicates`. This works best when the primary key is natural, but it's also possible to use it if the primary key is surrogate (example: "id serial primary key"). For more details read `this issue `_. + +.. important:: + After creating a table or changing its primary key, you must refresh PostgREST schema cache for UPSERT to work properly. To learn how to refresh the cache see :ref:`schema_reloading`. + +.. _on_conflict: + +On Conflict +~~~~~~~~~~~ + +By specifying the ``on_conflict`` query parameter, you can make UPSERT work on a column(s) that has a UNIQUE constraint. + +.. code-block:: http + + POST /employees?on_conflict=name HTTP/1.1 + Prefer: resolution=merge-duplicates + + [ + { "name": "Old employee 1", "salary": 40000 }, + { "name": "Old employee 2", "salary": 52000 }, + { "name": "New employee 3", "salary": 60000 } + ] + +PUT +~~~ + +A single row UPSERT can be done by using :code:`PUT` and filtering the primary key columns with :code:`eq`: + +.. code-block:: http + + PUT /employees?id=eq.4 HTTP/1.1 + + { "id": 4, "name": "Sara B.", "salary": 60000 } + +All the columns must be specified in the request body, including the primary key columns. + +.. note:: + + Upsert features are only available starting from PostgreSQL 9.5 since it uses the `ON CONFLICT clause `_. + +.. _delete: + +Deletions +========= + +To delete rows in a table, use the DELETE verb plus :ref:`h_filter`. For instance deleting inactive users: + +.. code-block:: http + + DELETE /user?active=is.false HTTP/1.1 + +Deletions also support :code:`Prefer: return=representation` plus :ref:`v_filter`. + +.. code-block:: HTTP + + DELETE /user?id=eq.1 HTTP/1.1 + Prefer: return=representation + + {"id": 1, "email": "johndoe@email.com"} + +.. warning:: + + Beware of accidentally deleting all rows in a table. To learn to prevent that see :ref:`block_fulltable`. + .. _custom_queries: Custom Queries @@ -886,7 +1088,6 @@ The PostgREST URL grammar limits the kinds of queries clients can perform. It pr * Table unions * More complicated joins than those provided by `Resource Embedding`_ * Geo-spatial queries that require an argument, like "points near (lat,lon)" -* More sophisticated full-text search than a simple use of the :sql:`fts` filter .. _s_procs: @@ -1135,208 +1336,6 @@ You can call overloaded functions with different number of arguments. .. code-block:: http GET /rpc/rental_duration?customer_id=232&from_date=2018-07-01 HTTP/1.1 -.. _insert_update: - -Insertions / Updates -==================== - -All tables and `auto-updatable views `_ can be modified through the API, subject to permissions of the requester's database role. - -To create a row in a database table post a JSON object whose keys are the names of the columns you would like to create. Missing properties will be set to default values when applicable. - -.. code-block:: HTTP - - POST /table_name HTTP/1.1 - - { "col1": "value1", "col2": "value2" } - -The response will include a :code:`Location` header describing where to find the new object. If the table is write-only then constructing the Location header will cause a permissions error. To successfully insert an item to a write-only table you will need to suppress the Location response header by including the request header :code:`Prefer: return=minimal`. - -On the other end of the spectrum you can get the full created object back in the response to your request by including the header :code:`Prefer: return=representation`. That way you won't have to make another HTTP call to discover properties that may have been filled in on the server side. You can also apply the standard :ref:`v_filter` to these results. - -URL encoded payloads can be posted with ``Content-Type: application/x-www-form-urlencoded``. - -.. code-block:: http - - POST /people HTTP/1.1 - Content-Type: application/x-www-form-urlencoded - - name=John+Doe&age=50&weight=80 - -.. note:: - - When inserting a row you must post a JSON object, not quoted JSON. - - .. code:: - - Yes - { "a": 1, "b": 2 } - - No - "{ \"a\": 1, \"b\": 2 }" - - Some javascript libraries will post the data incorrectly if you're not careful. For best results try one of the :ref:`clientside_libraries` built for PostgREST. - -To update a row or rows in a table, use the PATCH verb. Use :ref:`h_filter` to specify which record(s) to update. Here is an example query setting the :code:`category` column to child for all people below a certain age. - -.. code-block:: http - - PATCH /people?age=lt.13 HTTP/1.1 - - { "category": "child" } - -Updates also support :code:`Prefer: return=representation` plus :ref:`v_filter`. - -.. warning:: - - Beware of accidentally updating every row in a table. To learn to prevent that see :ref:`block_fulltable`. - -.. warning:: - - Insertion on VIEWs with complex `RULEs `_ might not work out of the box with PostgREST. - It's recommended that you `use triggers instead of RULEs `_. - If you want to keep using RULEs, a workaround is to wrap the VIEW insertion in a stored procedure and call it through the :ref:`s_procs` interface. - -.. _bulk_insert: - -Bulk Insert ------------ - -Bulk insert works exactly like single row insert except that you provide either a JSON array of objects having uniform keys, or lines in CSV format. This not only minimizes the HTTP requests required but uses a single INSERT statement on the back-end for efficiency. Note that using CSV requires less parsing on the server and is much faster. - -To bulk insert CSV simply post to a table route with :code:`Content-Type: text/csv` and include the names of the columns as the first row. For instance - -.. code-block:: http - - POST /people HTTP/1.1 - Content-Type: text/csv - - name,age,height - J Doe,62,70 - Jonas,10,55 - -An empty field (:code:`,,`) is coerced to an empty string and the reserved word :code:`NULL` is mapped to the SQL null value. Note that there should be no spaces between the column names and commas. - -To bulk insert JSON post an array of objects having all-matching keys - -.. code-block:: http - - POST /people HTTP/1.1 - Content-Type: application/json - - [ - { "name": "J Doe", "age": 62, "height": 70 }, - { "name": "Janus", "age": 10, "height": 55 } - ] - -.. _specify_columns: - -Specifying Columns ------------------- - -By using the :code:`columns` query parameter it's possible to specify the payload keys that will be inserted/updated -and ignore the rest of the payload. - -.. code-block:: http - - POST /datasets?columns=source,publication_date,figure HTTP/1.1 - Content-Type: application/json - - { - "source": "Natural Disaster Prevention and Control", - "publication_date": "2015-09-11", - "figure": 1100, - "location": "...", - "comment": "...", - "extra": "...", - "stuff": "..." - } - -In this case, only **source**, **publication_date** and **figure** will be inserted. The rest of the JSON keys will be ignored. - -Using this also has the side-effect of being more efficient for :ref:`bulk_insert` since PostgREST will not process the JSON and -it'll send it directly to PostgreSQL. - -UPSERT ------- - -You can make an UPSERT with :code:`POST` and the :code:`Prefer: resolution=merge-duplicates` header: - -.. code-block:: http - - POST /employees HTTP/1.1 - Prefer: resolution=merge-duplicates - - [ - { "id": 1, "name": "Old employee 1", "salary": 30000 }, - { "id": 2, "name": "Old employee 2", "salary": 42000 }, - { "id": 3, "name": "New employee 3", "salary": 50000 } - ] - -By default, UPSERT operates based on the primary key columns, you must specify all of them. You can also choose to ignore the duplicates with :code:`Prefer: resolution=ignore-duplicates`. This works best when the primary key is natural, but it's also possible to use it if the primary key is surrogate (example: "id serial primary key"). For more details read `this issue `_. - -.. important:: - After creating a table or changing its primary key, you must refresh PostgREST schema cache for UPSERT to work properly. To learn how to refresh the cache see :ref:`schema_reloading`. - -.. _on_conflict: - -On Conflict -~~~~~~~~~~~ - -By specifying the ``on_conflict`` query parameter, you can make UPSERT work on a column(s) that has a UNIQUE constraint. - -.. code-block:: http - - POST /employees?on_conflict=name HTTP/1.1 - Prefer: resolution=merge-duplicates - - [ - { "name": "Old employee 1", "salary": 40000 }, - { "name": "Old employee 2", "salary": 52000 }, - { "name": "New employee 3", "salary": 60000 } - ] - -PUT -~~~ - -A single row UPSERT can be done by using :code:`PUT` and filtering the primary key columns with :code:`eq`: - -.. code-block:: http - - PUT /employees?id=eq.4 HTTP/1.1 - - { "id": 4, "name": "Sara B.", "salary": 60000 } - -All the columns must be specified in the request body, including the primary key columns. - -.. note:: - - Upsert features are only available starting from PostgreSQL 9.5 since it uses the `ON CONFLICT clause `_. - -.. _delete: - -Deletions -========= - -To delete rows in a table, use the DELETE verb plus :ref:`h_filter`. For instance deleting inactive users: - -.. code-block:: http - - DELETE /user?active=is.false HTTP/1.1 - -Deletions also support :code:`Prefer: return=representation` plus :ref:`v_filter`. - -.. code-block:: HTTP - - DELETE /user?id=eq.1 HTTP/1.1 - Prefer: return=representation - - {"id": 1, "email": "johndoe@email.com"} - -.. warning:: - - Beware of accidentally deleting all rows in a table. To learn to prevent that see :ref:`block_fulltable`. - .. _binary_output: From 6b72da38e622e4488378fe7e681c4084568ebb69 Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Thu, 16 Apr 2020 18:01:07 -0500 Subject: [PATCH 325/711] Move some api notes to best practices --- api.rst | 18 ------------------ best_practices.rst | 19 +++++++++++++++++++ 2 files changed, 19 insertions(+), 18 deletions(-) diff --git a/api.rst b/api.rst index 55dae2a3f5..fd62a0f92c 100644 --- a/api.rst +++ b/api.rst @@ -103,18 +103,6 @@ The view will provide a new endpoint: GET /fresh_stories HTTP/1.1 -.. important:: - - Views are invoked with the privileges of the view owner, much like stored procedures with the ``SECURITY DEFINER`` option. When created by a SUPERUSER role, all `row-level security `_ will be bypassed unless a different, non-SUPERUSER owner is specified. - - .. code-block:: postgres - - -- Workaround: - -- non-SUPERUSER role to be used as the owner of the views - CREATE ROLE api_views_owner; - -- alter the view owner so RLS can work normally - ALTER VIEW sample_view OWNER TO api_views_owner; - .. _fts: Full-Text Search @@ -932,12 +920,6 @@ Updates also support :code:`Prefer: return=representation` plus :ref:`v_filter`. Beware of accidentally updating every row in a table. To learn to prevent that see :ref:`block_fulltable`. -.. warning:: - - Insertion on VIEWs with complex `RULEs `_ might not work out of the box with PostgREST. - It's recommended that you `use triggers instead of RULEs `_. - If you want to keep using RULEs, a workaround is to wrap the VIEW insertion in a stored procedure and call it through the :ref:`s_procs` interface. - .. _bulk_insert: Bulk Insert diff --git a/best_practices.rst b/best_practices.rst index c8ecdbc092..34e9c473b5 100644 --- a/best_practices.rst +++ b/best_practices.rst @@ -20,3 +20,22 @@ By default, a function is executed with the privileges of the user who calls it. Another option is to define the function with the :code:`SECURITY DEFINER` option. Then only one permission check will take place, the permission to call the function, and the operations in the function will have the authority of the user who owns the function itself. See `PostgreSQL documentation `_ for more details. +Views with RLS +-------------- + +Views are invoked with the privileges of the view owner, much like stored procedures with the ``SECURITY DEFINER`` option. When created by a SUPERUSER role, all `row-level security `_ will be bypassed unless a different, non-SUPERUSER owner is specified. + +.. code-block:: postgres + + -- Workaround: + -- non-SUPERUSER role to be used as the owner of the views + CREATE ROLE api_views_owner; + -- alter the view owner so RLS can work normally + ALTER VIEW sample_view OWNER TO api_views_owner; + +Views with Rules +---------------- + +Insertion on VIEWs with complex `RULEs `_ might not work out of the box with PostgREST. +It's recommended that you `use triggers instead of RULEs `_. +If you want to keep using RULEs, a workaround is to wrap the VIEW insertion in a stored procedure and call it through the :ref:`s_procs` interface. From 5eca88fd87a81bafa5923f5976b689b882fafba1 Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Thu, 16 Apr 2020 18:01:27 -0500 Subject: [PATCH 326/711] Refine function privileges section --- best_practices.rst | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/best_practices.rst b/best_practices.rst index 34e9c473b5..5e1656a6c7 100644 --- a/best_practices.rst +++ b/best_practices.rst @@ -3,18 +3,30 @@ Function privileges ------------------- -By default, when a function is created, the right to execute it is is not restricted by role, but this probably isn't consistent with best practices for an API design. If you want functions to be executable exclusively by a given role upon their creation, issue psql instructions similar to this: +By default, when a function is created, the privilege to execute it is not restricted by role. The function access is PUBLIC—executable by all roles(more details at `PostgreSQL Privileges page `_). This is not ideal for an API schema. To disable this behavior, you can run the following SQL statement: .. code-block:: postgres - -- To stop functions from being universally executable upon creation (note the IN SCHEMA part). + -- Assuming your schema is named "api" ALTER DEFAULT PRIVILEGES IN SCHEMA api REVOKE EXECUTE ON FUNCTIONS FROM PUBLIC; - -- To grant execution rights for functions to a specific role upon function creation. - ALTER DEFAULT PRIVILEGES IN SCHEMA api GRANT EXECUTE ON FUNCTIONS TO my_role; + + -- Or to stop functions from being executable in the whole database(note the removal of the IN SCHEMA part). + ALTER DEFAULT PRIVILEGES REVOKE EXECUTE ON FUNCTIONS FROM PUBLIC; See `PostgreSQL alter default privileges `_ for more details. -The foregoing example may not be appropriate in all situations. For instance you may have a situation where different functions are intended to be called by different roles. In that case you will `not` want to grant `EXECUTE` to one specific role by default. Instead you will want to manually grant executability on a case by case basis. +After that, you'll need to grant EXECUTE privileges on functions explicitly: + +.. code-block:: postgres + + GRANT EXECUTE ON FUNCTION login TO anonymous; + GRANT EXECUTE ON FUNCTION reset_password TO web_user; + + -- you can also GRANT EXECUTE on all functions to a privileged role + GRANT EXECUTE ON ALL FUNCTIONS IN SCHEMA api TO admin; + +Security definer +---------------- By default, a function is executed with the privileges of the user who calls it. This means that the user has to have all permissions to do the operations the procedure performs. From 055b7820b35f234c23bb20ef4a069f9c082425ad Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Fri, 17 Apr 2020 17:09:40 -0500 Subject: [PATCH 327/711] Add schema structure diagram --- .gitignore | 3 ++ _static/db.png | Bin 0 -> 10150 bytes best_practices.rst | 7 ++++ diagrams/README.md | 30 +++++++++++++++ diagrams/db.tex | 71 ++++++++++++++++++++++++++++++++++++ {erd => diagrams}/film.er | 0 {erd => diagrams}/orders.er | 0 erd/README.md | 7 ---- 8 files changed, 111 insertions(+), 7 deletions(-) create mode 100644 _static/db.png create mode 100644 diagrams/README.md create mode 100644 diagrams/db.tex rename {erd => diagrams}/film.er (100%) rename {erd => diagrams}/orders.er (100%) delete mode 100644 erd/README.md diff --git a/.gitignore b/.gitignore index bf70826eac..00042c2760 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,5 @@ _build Pipfile.lock +*.aux +*.log +diagrams/db.pdf diff --git a/_static/db.png b/_static/db.png new file mode 100644 index 0000000000000000000000000000000000000000..bd463f2ef2a49d5c0f7a1dfca40cce621d35be3b GIT binary patch literal 10150 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 Date: Mon, 20 Apr 2020 13:36:48 -0500 Subject: [PATCH 328/711] Move HTTPS section from auth to admin It fits better into administration concerns --- admin.rst | 4 ++-- auth.rst | 13 +++---------- 2 files changed, 5 insertions(+), 12 deletions(-) diff --git a/admin.rst b/admin.rst index 17486b155a..52bb51a0de 100644 --- a/admin.rst +++ b/admin.rst @@ -87,12 +87,12 @@ This is fine in small tables, but count performance degrades in big tables due t -- Pending nginx config: Remove any prefer header which contains the word count -.. _hardening_https: +.. _https: HTTPS ----- -See the :ref:`https` section of the authentication guide. +PostgREST aims to do one thing well: add an HTTP interface to a PostgreSQL database. To keep the code small and focused we do not implement HTTPS. Use a reverse proxy such as NGINX to add this, `here's how `_. Note that some Platforms as a Service like Heroku also add SSL automatically in their load balancer. Rate Limiting ------------- diff --git a/auth.rst b/auth.rst index b762bc0210..48de88125e 100644 --- a/auth.rst +++ b/auth.rst @@ -60,7 +60,7 @@ You can use row-level security to flexibly restrict visibility and access for th message_subject VARCHAR(64) NOT NULL, message_body TEXT ); - + ALTER TABLE chat ENABLE ROW LEVEL SECURITY; We want to enforce a policy that ensures a user can see only those messages sent by him or intended for him. Also we want to prevent a user from forging the message_from column with another person's name. @@ -295,13 +295,6 @@ The last type of critique focuses on the misuse of JWT for maintaining web sessi PostgREST uses JWT mainly for authentication and authorization purposes and encourages users to do the same. For web sessions, using cookies over HTTPS is good enough and well catered for by standard web frameworks. -.. _https: - -HTTPS ------ - -PostgREST aims to do one thing well: add an HTTP interface to a PostgreSQL database. To keep the code small and focused we do not implement HTTPS. Use a reverse proxy such as NGINX to add this, `here's how `_. Note that some Platforms as a Service like Heroku also add SSL automatically in their load balancer. - Schema Isolation ================ @@ -457,8 +450,8 @@ The response would look like the snippet below. Try decoding the token at `jwt.i Permissions ~~~~~~~~~~~ -Your database roles need access to the schema, tables, views and functions in order to service HTTP requests. -Recall from the `Overview of Role System`_ that PostgREST uses special roles to process requests, namely the authenticator and +Your database roles need access to the schema, tables, views and functions in order to service HTTP requests. +Recall from the `Overview of Role System`_ that PostgREST uses special roles to process requests, namely the authenticator and anonymous roles. Below is an example of permissions that allow anonymous users to create accounts and attempt to log in. .. code-block:: postgres From 79f2af08e301d720694cf7599bbe5772473c9dae Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Mon, 20 Apr 2020 18:16:06 -0500 Subject: [PATCH 329/711] Add wording for schema structure --- _static/db.png | Bin 10150 -> 9232 bytes auth.rst | 2 +- best_practices.rst | 20 +++++++++++++------- diagrams/README.md | 12 +++++++++++- diagrams/db.png | Bin 0 -> 9232 bytes diagrams/db.tex | 6 +++--- 6 files changed, 28 insertions(+), 12 deletions(-) create mode 100644 diagrams/db.png diff --git a/_static/db.png b/_static/db.png index bd463f2ef2a49d5c0f7a1dfca40cce621d35be3b..a3dd2d85abeecea82f09e27d0dbbccbd67678397 100644 GIT binary patch delta 6745 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
    ;CI!my`l6(rr4QTLw+sw|48kT>yff#>gNHVa zS7qOs>;2Al<;vsODy9k@tKi1Ki|$LAB26jX=Zy3&Zxe5PuTF3MjR0=`hBk zW`ynB`4C!5(Zi`AFWfWRBKCIa&l&gYuH4E%N}{4-ZgE7&*)$uxU}-0|w6`F-B8u&W zn>UfEJNBBHO!m}r%=WrVZS8l41Vz^VN3mWd#mmG<^4@wFWk^D=xZF~#sycPB$4ee4 z2iosjg`Iu2csuAUKcmh)jhPc79E-9mnG5zDH|tBG#8-$gpy!Pe-vO@aPrcIkx`hoP zRqBt-RH%C(3cVnWI~;Z(@1tXW!)_}sysbI1MK4Hhe%67bRg{SW{#GOb+w4CcpUvI= z&>c^r1=xZ;!dJ%_DE6jFu%n4)o0pT5M}9tNGQW0!qhqp8$@Y3@-m4_jp9Xvtl84@! zl)HbQWQ9_Wh{;2vdL)zx2=9{yUPOPhV@d>;SpUkDeFFR|NA|zS6gsX$k5kv^qPgIh z4^(`8F+@XTp?Cam9l-=Jo!-qed#ROh7Q$#!^D$1+*l6~Mo||u$!mV|rgj18RLU#G> z214U|4U2y(kj6it)p z`*X}jJF(U}@)s=;9~G$zs4SpHaZ}l=L!|M3Sz>V2o~C$IU$&YQOxaT?LEyDA+;4Sr zTR>SPzr@}xDpTgTsGxaoQo|`CGamVhXDKM@+2qUtU;Ha29WAi$V?L>luf$~eC2WYG zj=|8D&L+mUoK)t180iMQ;9k@>H(U*aKvw#`W15kHXijmK*onbcy|EQBVyq2B7vg+m z7MYVjrexw$tySK}zzX^Px@!+rw_LxcJ|!4AUc7z1TYd-$Rr;DGY--Y=mbGS@;#aM9 zPH|0W%Nuc+R3yNN#CHCGPtDvV@G0pS#nxl^;L~(J$bcX+$GCoJbC(0AgybiE%4E4g z^pXmThBtFGL?H6!eu4SqWg6wu`sYE|&mksi@y46klfG=&@8@0*6XILhrX(y1vUiK3 zX-3yDGApSMzAxX>y)*yg9Qb6fMy{sYU6Fl9_T_F~G>zlYpPoy)pys(eKqiddT2XoL zh`|y~Rty-|Aga~KYP(acW9nR`evpuIe;df@r)K8oXy*r!aqxlMe*mJwqQXF7aiEBl wv52IMgp`7es5DSmLPl7)BnI;L8uouA+&vwgor3<4#D5FSudKJFq1grg1HU+f1ONa4 diff --git a/auth.rst b/auth.rst index 48de88125e..29d49be497 100644 --- a/auth.rst +++ b/auth.rst @@ -298,7 +298,7 @@ PostgREST uses JWT mainly for authentication and authorization purposes and enco Schema Isolation ================ -A PostgREST instance is configured to expose all the tables, views, and stored procedures of a single schema specified in a server configuration file. This means private data or implementation details can go inside a private schema and be invisible to HTTP clients. You can then expose views and stored procedures which insulate the internal details from the outside world. It keeps you code easier to refactor, and provides a natural way to do API versioning. For an example of wrapping a private table with a public view see the :ref:`public_ui` section below. +You can isolate your api schema from internal implementation details, as explained in :ref:`schema_structure`. For an example of wrapping a private table with a public view see the :ref:`public_ui` section below. SQL User Management =================== diff --git a/best_practices.rst b/best_practices.rst index cd80ac5396..6a4b0d97c0 100644 --- a/best_practices.rst +++ b/best_practices.rst @@ -1,14 +1,20 @@ -Schema structure ----------------- +.. _schema_structure: + +Schema Structure +================ + +A PostgREST instance exposes all the tables, views, and stored procedures of a single `PostgreSQL schema `_ (a namespace of database objects). This means private data or implementation details can go inside different private schemas and be invisible to HTTP clients. + +It is recommended that you don't expose tables on your API schema. Instead expose views and stored procedures which insulate the internal details from the outside world. +This allows you to change the internals of your schema and maintain backwards compatibility. It also keeps your code easier to refactor, and provides a natural way to do API versioning. .. image:: _static/db.png - :align: center .. _func_privs: Function privileges -------------------- +=================== By default, when a function is created, the privilege to execute it is not restricted by role. The function access is PUBLIC—executable by all roles(more details at `PostgreSQL Privileges page `_). This is not ideal for an API schema. To disable this behavior, you can run the following SQL statement: @@ -17,7 +23,7 @@ By default, when a function is created, the privilege to execute it is not restr -- Assuming your schema is named "api" ALTER DEFAULT PRIVILEGES IN SCHEMA api REVOKE EXECUTE ON FUNCTIONS FROM PUBLIC; - -- Or to stop functions from being executable in the whole database(note the removal of the IN SCHEMA part). + -- Or to stop functions from being PUBLICly executable in the whole database ALTER DEFAULT PRIVILEGES REVOKE EXECUTE ON FUNCTIONS FROM PUBLIC; See `PostgreSQL alter default privileges `_ for more details. @@ -40,7 +46,7 @@ By default, a function is executed with the privileges of the user who calls it. Another option is to define the function with the :code:`SECURITY DEFINER` option. Then only one permission check will take place, the permission to call the function, and the operations in the function will have the authority of the user who owns the function itself. See `PostgreSQL documentation `_ for more details. Views with RLS --------------- +============== Views are invoked with the privileges of the view owner, much like stored procedures with the ``SECURITY DEFINER`` option. When created by a SUPERUSER role, all `row-level security `_ will be bypassed unless a different, non-SUPERUSER owner is specified. @@ -53,7 +59,7 @@ Views are invoked with the privileges of the view owner, much like stored proced ALTER VIEW sample_view OWNER TO api_views_owner; Views with Rules ----------------- +================ Insertion on VIEWs with complex `RULEs `_ might not work out of the box with PostgREST. It's recommended that you `use triggers instead of RULEs `_. diff --git a/diagrams/README.md b/diagrams/README.md index ee4e31da53..36fd9911d0 100644 --- a/diagrams/README.md +++ b/diagrams/README.md @@ -15,7 +15,7 @@ The schema structure diagram is done with LaTeX. You can use a GUI like https:// Then use this command to generate the png file. ```bash -pdflatex --shell-escape -halt-on-error -output-directory ../_static db.tex +pdflatex --shell-escape -halt-on-error db.tex ## and move it to the static folder(it's not easy to do it in one go with the pdflatex) mv db.png ../_static/ @@ -28,3 +28,13 @@ You can install the full latex suite with `nix`: ``` nix-env -iA texlive.combined.scheme-full ``` + +To tweak the file with a live reload environment use: + +```bash +# open the pdf(zathura used as an example) +zathura db.pdf & + +# live reload with entr +echo db.tex | entr pdflatex --shell-escape -halt-on-error db.tex +``` diff --git a/diagrams/db.png b/diagrams/db.png new file mode 100644 index 0000000000000000000000000000000000000000..f5eb82b214db6fb276f74f59667ec0662e35a511 GIT binary patch literal 9232 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 Date: Tue, 21 Apr 2020 13:37:24 -0500 Subject: [PATCH 330/711] Consolidate schema structure page --- auth.rst | 2 +- diagrams/db.png | Bin 9232 -> 0 bytes index.rst | 48 +++++++++---------- best_practices.rst => schema_structure.rst | 52 ++++++++++++--------- 4 files changed, 56 insertions(+), 46 deletions(-) delete mode 100644 diagrams/db.png rename best_practices.rst => schema_structure.rst (68%) diff --git a/auth.rst b/auth.rst index 29d49be497..7aaa9eabda 100644 --- a/auth.rst +++ b/auth.rst @@ -298,7 +298,7 @@ PostgREST uses JWT mainly for authentication and authorization purposes and enco Schema Isolation ================ -You can isolate your api schema from internal implementation details, as explained in :ref:`schema_structure`. For an example of wrapping a private table with a public view see the :ref:`public_ui` section below. +You can isolate your api schema from internal implementation details, as explained in :ref:`schema_isolation`. For an example of wrapping a private table with a public view see the :ref:`public_ui` section below. SQL User Management =================== diff --git a/diagrams/db.png b/diagrams/db.png deleted file mode 100644 index f5eb82b214db6fb276f74f59667ec0662e35a511..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9232 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 - :doc:`configuration` -.. _how_tos: - -How-to guides -------------- - -These are recipes that'll help you address specific use-cases. - -.. toctree:: - :glob: - :caption: How-to guides - :hidden: - - how-tos/* - -- :doc:`how-tos/casting-type-to-custom-json` -- :doc:`how-tos/embedding-table-from-another-schema` -- :doc:`how-tos/providing-images-for-img` - Topic guides ------------ @@ -140,10 +122,10 @@ Explanations of some key concepts in PostgREST. auth.rst .. toctree:: - :caption: Installation + :caption: Schema Structure :hidden: - install.rst + schema_structure.rst .. toctree:: :caption: Administration @@ -152,15 +134,33 @@ Explanations of some key concepts in PostgREST. admin.rst .. toctree:: - :caption: Best Practices + :caption: Installation :hidden: - best_practices.rst + install.rst - :doc:`Authentication ` -- :doc:`Installation ` +- :doc:`Schema Structure ` - :doc:`Administration ` -- :doc:`Best Practices ` +- :doc:`Installation ` + +.. _how_tos: + +How-to guides +------------- + +These are recipes that'll help you address specific use-cases. + +.. toctree:: + :glob: + :caption: How-to guides + :hidden: + + how-tos/* + +- :doc:`how-tos/casting-type-to-custom-json` +- :doc:`how-tos/embedding-table-from-another-schema` +- :doc:`how-tos/providing-images-for-img` Ecosystem --------- diff --git a/best_practices.rst b/schema_structure.rst similarity index 68% rename from best_practices.rst rename to schema_structure.rst index 6a4b0d97c0..80e75b23ff 100644 --- a/best_practices.rst +++ b/schema_structure.rst @@ -1,7 +1,7 @@ -.. _schema_structure: +.. _schema_isolation: -Schema Structure +Schema Isolation ================ A PostgREST instance exposes all the tables, views, and stored procedures of a single `PostgreSQL schema `_ (a namespace of database objects). This means private data or implementation details can go inside different private schemas and be invisible to HTTP clients. @@ -13,19 +13,15 @@ This allows you to change the internals of your schema and maintain backwards co .. _func_privs: -Function privileges -=================== +Functions +========= By default, when a function is created, the privilege to execute it is not restricted by role. The function access is PUBLIC—executable by all roles(more details at `PostgreSQL Privileges page `_). This is not ideal for an API schema. To disable this behavior, you can run the following SQL statement: .. code-block:: postgres - -- Assuming your schema is named "api" ALTER DEFAULT PRIVILEGES IN SCHEMA api REVOKE EXECUTE ON FUNCTIONS FROM PUBLIC; - -- Or to stop functions from being PUBLICly executable in the whole database - ALTER DEFAULT PRIVILEGES REVOKE EXECUTE ON FUNCTIONS FROM PUBLIC; - See `PostgreSQL alter default privileges `_ for more details. After that, you'll need to grant EXECUTE privileges on functions explicitly: @@ -35,32 +31,46 @@ After that, you'll need to grant EXECUTE privileges on functions explicitly: GRANT EXECUTE ON FUNCTION login TO anonymous; GRANT EXECUTE ON FUNCTION reset_password TO web_user; - -- you can also GRANT EXECUTE on all functions to a privileged role - GRANT EXECUTE ON ALL FUNCTIONS IN SCHEMA api TO admin; - Security definer ---------------- -By default, a function is executed with the privileges of the user who calls it. This means that the user has to have all permissions to do the operations the procedure performs. +A function is executed with the privileges of the user who calls it. This means that the user has to have all permissions to do the operations the procedure performs. +If the function accesses private database objects, your `API roles `_ won't be able to succesfully execute the function. + +Another option is to define the function with the :code:`SECURITY DEFINER` option. Then only one permission check will take place, the permission to call the function, and the operations in the function will have the authority of the user who owns the function itself. + +.. code-block:: postgres -Another option is to define the function with the :code:`SECURITY DEFINER` option. Then only one permission check will take place, the permission to call the function, and the operations in the function will have the authority of the user who owns the function itself. See `PostgreSQL documentation `_ for more details. + -- login as a user wich has privileges on the private schemas -Views with RLS -============== + -- create a sample function + create or replace function login(email text, pass text) returns jwt_token as $$ + begin + -- access to a private schema called 'auth' + select auth.user_role(email, pass) into _role; + -- other operations + -- ... + end; + $$ language plpgsql security definer; + +Note the ``SECURITY DEFINER`` keywords at the end of the function. See `PostgreSQL documentation `_ for more details. + +Views +===== Views are invoked with the privileges of the view owner, much like stored procedures with the ``SECURITY DEFINER`` option. When created by a SUPERUSER role, all `row-level security `_ will be bypassed unless a different, non-SUPERUSER owner is specified. +For changing this, we can create a non-SUPERUSER role and make this role the view's owner. + .. code-block:: postgres - -- Workaround: - -- non-SUPERUSER role to be used as the owner of the views - CREATE ROLE api_views_owner; - -- alter the view owner so RLS can work normally + CREATE ROLE api_views_owner NOINHERIT; ALTER VIEW sample_view OWNER TO api_views_owner; -Views with Rules -================ +Rules +----- Insertion on VIEWs with complex `RULEs `_ might not work out of the box with PostgREST. It's recommended that you `use triggers instead of RULEs `_. If you want to keep using RULEs, a workaround is to wrap the VIEW insertion in a stored procedure and call it through the :ref:`s_procs` interface. +For more details, see this `github issue `_. From ef36ec10a19a387454780c3ac4e3999e1650f0e1 Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Tue, 21 Apr 2020 14:17:13 -0500 Subject: [PATCH 331/711] Put warning in db-schema and clarify search_path --- api.rst | 7 ++----- configuration.rst | 12 ++++++++++-- releases/upcoming.rst | 2 +- 3 files changed, 13 insertions(+), 8 deletions(-) diff --git a/api.rst b/api.rst index fd62a0f92c..3a0a4da117 100644 --- a/api.rst +++ b/api.rst @@ -1421,18 +1421,15 @@ Switching Schemas ================= You can switch schemas at runtime with the ``Accept-Profile`` and ``Content-Profile`` headers. You can only switch to a schema that is included in :ref:`db-schema`. -This is useful for **api versioning** and **schema-based multitenancy**. -The schema to be used can be selected through the ``Accept-Profile`` header for GET or HEAD: +For GET or HEAD, the schema to be used can be selected through the ``Accept-Profile`` header: .. code-block:: http GET /items HTTP/1.1 Accept-Profile: tenant2 -If you don't specify the ``Accept-Profile`` header, the first schema on :ref:`db-schema` will be used. - -For POST, PATCH, PUT, DELETE you can use the ``Content-Profile`` header for selecting the schema: +For POST, PATCH, PUT and DELETE, you can use the ``Content-Profile`` header for selecting the schema: .. code-block:: http diff --git a/configuration.rst b/configuration.rst index 35d93d3083..00d0f7ef63 100644 --- a/configuration.rst +++ b/configuration.rst @@ -75,12 +75,12 @@ db-schema The database schema to expose to REST clients. Tables, views and stored procedures in this schema will get API endpoints. - The chosen schema gets added to the `search_path `_ of every request. Example: - .. code:: bash db-schema = "api" + This schema gets added to the `search_path `_ of every request. + You can also specify a list of schemas that can be used for **schema-based multitenancy** and **api versioning** by :ref:`multiple-schemas`. Example: .. code:: bash @@ -89,6 +89,14 @@ db-schema ##or ##db-schema = "v1, v2" + .. warning:: + + Never expose private schemas in this way. See :ref:`schema_isolation`. + + If you don't :ref:`Switch Schemas `, the first schema in the list(``tenant1`` in this case) is chosen as the default schema. + + Only the chosen schema gets added to the `search_path `_ of every request. + .. _db-anon-role: db-anon-role diff --git a/releases/upcoming.rst b/releases/upcoming.rst index 8a77c509be..55eb25bd28 100644 --- a/releases/upcoming.rst +++ b/releases/upcoming.rst @@ -10,7 +10,7 @@ These are changes yet unreleased. If you'd like to try them out before a new off Added ----- -* Support for :ref:`multiple-schemas` at runtime. +* Support for :ref:`Switching to a schema ` defined in :ref:`db-schema`. |br| -- `@steve-chavez `_, `@mahmoudkassem `_ * Support for :ref:`planned_count` and :ref:`estimated_count`. From 3af6df743bf97bf8c19ac190a39a571200f6d2c8 Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Tue, 21 Apr 2020 14:38:31 -0500 Subject: [PATCH 332/711] Reorder calling func with array --- api.rst | 60 +++++++++++++++++++++------------------------------ ecosystem.rst | 4 ++-- 2 files changed, 26 insertions(+), 38 deletions(-) diff --git a/api.rst b/api.rst index 3a0a4da117..350f77123b 100644 --- a/api.rst +++ b/api.rst @@ -1179,45 +1179,50 @@ You can also call a function that takes a single parameter of type json by sendi 8 +.. _s_procs_array: + Calling functions with array parameters --------------------------------------- You can call a function that takes an array parameter: -.. code-block:: plpgsql +.. code-block:: postgres - CREATE FUNCTION native_array_func(arr int[]) RETURNS int[] as $$ - SELECT arr; - $$ LANGUAGE SQL; + create function plus_one(arr int[]) returns int[] as $$ + SELECT array_agg(n + 1) FROM unnest($1) AS n; + $$ language sql; .. code-block:: http - POST /rpc/native_array_func HTTP/1.1 + POST /rpc/plus_one HTTP/1.1 + Content-Type: application/json - { "arg": [1,2,3] } + {"arr": [1,2,3,4]} - [1,2,3] +.. code-block:: json -.. note:: + [2,3,4,5] - For versions prior to PostgreSQL 10, to pass a PostgreSQL native array you need to quote it as a string: +For calling the function with GET, you can pass the array as an `array literal `_, +as in ``{1,2,3,4}``. Note that the curly brackets have to be urlencoded(``{`` is ``%7B`` and ``}`` is ``%7D``). - .. code-block:: http +.. code-block:: http - POST /rpc/native_array_func HTTP/1.1 + GET /rpc/plus_one?arr=%7B1,2,3,4%7D' HTTP/1.1 - { "arg": "{1,2,3}" } + [2,3,4,5] - In these versions we recommend using function parameters of type json to accept arrays from the client. +.. note:: -For calling it with GET, you can pass the array as an `array literal `_; -as in ``{1,2,3}``. Note that the curly brackets have to be urlencoded(``{`` is ``%7B`` and ``}`` is ``%7D``). + For versions prior to PostgreSQL 10, to pass a PostgreSQL native array on a POST payload, you need to quote it and use an array literal: -.. code-block:: http + .. code-block:: http - GET /rpc/native_array_func?arr=%7B1,2,3%7D' HTTP/1.1 + POST /rpc/plus_one HTTP/1.1 - [1,2,3] + { "arr": "{1,2,3,4}" } + + In these versions we recommend using function parameters of type json to accept arrays from the client. Scalar functions ---------------- @@ -1262,24 +1267,7 @@ It's possible to call a function in a bulk way, analoguosly to :ref:`bulk_insert [ 3, 7 ] -If you have large payloads to process, it's preferrable you instead use a function with an array or json parameter, as this will be more efficient. - -.. code-block:: postgres - - create function plus_one(arr int[]) returns int[] as $$ - SELECT array_agg(n + 1) FROM unnest($1) AS n; - $$ language sql; - -.. code-block:: http - - POST /rpc/plus_one HTTP/1.1 - Content-Type: application/json - - {"arr": [1,2,3,4]} - -.. code-block:: json - - [2,3,4,5] +If you have large payloads to process, it's preferrable you instead use a function with an :ref:`array parameter ` or json parameter, as this will be more efficient. It's also possible to :ref:`Specify Columns ` on functions calls. diff --git a/ecosystem.rst b/ecosystem.rst index feb09410e6..0a717478bc 100644 --- a/ecosystem.rst +++ b/ecosystem.rst @@ -6,11 +6,11 @@ Community Tutorials * `Building a Contacts List with PostgREST and Vue.js `_ - In this video series, DigitalOcean shows how to build and deploy an Nginx + PostgREST(using a managed PostgreSQL database) + Vue.js webapp in an Ubuntu server droplet. +* `PostgREST + Auth0: Create REST API in mintutes and add social login using Auth0 `_ - A step-by-step tutorial to show how to Dockerize and integrate Auth0 to PostgREST service. + * `PostgREST + PostGIS API tutorial in 5 minutes `_ - In this tutorial, GIS • OPS shows how to perform PostGIS calculations through PostgREST :ref:`s_procs` interface. -* `PostgREST + Auth0: Create REST API in mintutes and add social login using Auth0 `_ - A step-by-step tutorial to show how to Dockerize and integrate Auth0 to PostgREST service. - .. _eco_example_apps: Example Apps From 469e01f77b90605d8cf6c9b2bb7d20e6256b5d75 Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Tue, 21 Apr 2020 15:09:25 -0500 Subject: [PATCH 333/711] Add release page for v7.0.0 --- how-tos/providing-images-for-img.rst | 2 ++ index.rst | 1 + releases/v5.2.0.rst | 2 +- releases/v6.0.2.rst | 2 +- releases/{upcoming.rst => v7.0.0.rst} | 43 +++++++++++++++++++++++++-- 5 files changed, 45 insertions(+), 5 deletions(-) rename releases/{upcoming.rst => v7.0.0.rst} (69%) diff --git a/how-tos/providing-images-for-img.rst b/how-tos/providing-images-for-img.rst index 8bb5100874..be442287b6 100644 --- a/how-tos/providing-images-for-img.rst +++ b/how-tos/providing-images-for-img.rst @@ -1,3 +1,5 @@ +.. _providing_img: + Providing images for ========================== diff --git a/index.rst b/index.rst index 939f92a088..bdfa5e7751 100644 --- a/index.rst +++ b/index.rst @@ -185,6 +185,7 @@ Release Notes Here we'll include the most relevant changes so you can migrate to newer versions easily. You can see the full changelog of each release in the `PostgREST repository `_. +- :doc:`releases/v7.0.0` - :doc:`releases/v6.0.2` - :doc:`releases/v5.2.0` diff --git a/releases/v5.2.0.rst b/releases/v5.2.0.rst index 43bc188339..d49067b394 100644 --- a/releases/v5.2.0.rst +++ b/releases/v5.2.0.rst @@ -16,7 +16,7 @@ Thanks This release was made possible thanks to: -* `Daniel Babiak `_ +* `Daniel Babiak `_ * `Michel Pelletier `_ * Tsingson Qin * Jay Hannah diff --git a/releases/v6.0.2.rst b/releases/v6.0.2.rst index 19176d5b28..90cdfb514a 100644 --- a/releases/v6.0.2.rst +++ b/releases/v6.0.2.rst @@ -65,7 +65,7 @@ This release is sponsored by: :target: https://tryretool.com/?utm_source=sponsor&utm_campaign=postgrest :width: 13em -* Daniel Babiak +* `Daniel Babiak `_ * Evans Fernandes * Tsingson Qin * Michel Pelletier diff --git a/releases/upcoming.rst b/releases/v7.0.0.rst similarity index 69% rename from releases/upcoming.rst rename to releases/v7.0.0.rst index 55eb25bd28..57117c22f5 100644 --- a/releases/upcoming.rst +++ b/releases/v7.0.0.rst @@ -2,10 +2,10 @@
    -Upcoming -======== +v7.0.0 +====== -These are changes yet unreleased. If you'd like to try them out before a new official release, you can :ref:`build_source`. +You can donwload this release at the `PostgREST v7.0.0 release page `_. Added ----- @@ -35,9 +35,12 @@ Added * Documentation improvements + + Explanation for :ref:`Schema Structure `. + Reference for :ref:`s_proc_embed`. + Reference for :ref:`mutation_embed`. + Reference for filters on :ref:`json_columns`. + + How-to for :ref:`providing_img`. + + Added :ref:`community_tutorials` section. Fixed ----- @@ -67,3 +70,37 @@ Changed * ``server-proxy-uri`` config option has been renamed to :ref:`openapi-server-proxy-uri`. * Default Unix Socket file mode from 755 to 660 + +Thanks +------ + +This release was made possible thanks to: + +.. image:: ../_static/cybertec.png + :target: https://www.cybertec-postgresql.com/en/ + :width: 13em + +.. image:: ../_static/2ndquadrant.png + :target: https://www.2ndquadrant.com/en/?utm_campaign=External%20Websites&utm_source=PostgREST&utm_medium=Logo + :width: 13em + +.. image:: ../_static/retool.png + :target: https://tryretool.com/?utm_source=sponsor&utm_campaign=postgrest + :width: 13em + +* `Daniel Babiak `_ +* Evans Fernandes +* `Jan Sommer `_ +* Tsingson Qin +* Michel Pelletier +* Jay Hannah +* Robert Stolarz +* Kofi Gumbs +* Nicholas DiBiase +* Christopher Reid +* Nathan Bouscal +* Daniel Rafaj +* David Fenko + + +If you like to join them please consider `supporting PostgREST development `_. From b6c03f3658b41101076ab21d4e9bedfc8db0b997 Mon Sep 17 00:00:00 2001 From: Steve Phillips Date: Mon, 27 Apr 2020 06:58:01 -0700 Subject: [PATCH 334/711] api.rst: formatting tweaks --- api.rst | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/api.rst b/api.rst index 350f77123b..0bab1152fd 100644 --- a/api.rst +++ b/api.rst @@ -702,7 +702,7 @@ Embedding on Stored Procedures If you have a :ref:`Stored Procedure ` that returns a table type, you can embed its related resources. -Here's a sample function(notice the ``RETURNS SETOF films``). +Here's a sample function (notice the ``RETURNS SETOF films``). .. code-block:: plpgsql @@ -742,9 +742,12 @@ Say you want to insert a **film** and then get some of its attributes plus embed Prefer: return=representation { - "id": 100, "director_id": 40, - "title": "127 hours", "year": 2010, - "rating": 7.6, "language": "english" + "id": 100, + "director_id": 40, + "title": "127 hours", + "year": 2010, + "rating": 7.6, + "language": "english" } Response: @@ -1122,13 +1125,13 @@ The client can call it by posting an object like 3 -Procedures must be declared with named parameters. Procedures declared like: +Procedures must be declared with named parameters. Procedures declared like .. code-block:: plpgsql CREATE FUNCTION non_named_args(integer, text, integer) ... -Can not be called with PostgREST, since we use `named notation `_ internally. +cannot be called with PostgREST, since we use `named notation `_ internally. Note that PostgreSQL converts identifier names to lowercase unless you quote them like: From 1315584de5dca7cf444116eb3f1c78034c453466 Mon Sep 17 00:00:00 2001 From: Nick Santos Date: Fri, 1 May 2020 16:18:03 -0700 Subject: [PATCH 335/711] Fix link to DigitalOcean PostgREST Contact List video Old playlist is gone - linked to first video in series instead --- ecosystem.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ecosystem.rst b/ecosystem.rst index 0a717478bc..a71c41571a 100644 --- a/ecosystem.rst +++ b/ecosystem.rst @@ -3,7 +3,7 @@ Community Tutorials ------------------- -* `Building a Contacts List with PostgREST and Vue.js `_ - +* `Building a Contacts List with PostgREST and Vue.js `_ - In this video series, DigitalOcean shows how to build and deploy an Nginx + PostgREST(using a managed PostgreSQL database) + Vue.js webapp in an Ubuntu server droplet. * `PostgREST + Auth0: Create REST API in mintutes and add social login using Auth0 `_ - A step-by-step tutorial to show how to Dockerize and integrate Auth0 to PostgREST service. From 622ff7b708f3a0d09eed97a6e5a71426c55bca02 Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Mon, 4 May 2020 11:46:54 -0500 Subject: [PATCH 336/711] Note schema structure page is a work in progress --- schema_structure.rst | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/schema_structure.rst b/schema_structure.rst index 80e75b23ff..8f64354f64 100644 --- a/schema_structure.rst +++ b/schema_structure.rst @@ -1,4 +1,8 @@ +.. note:: + + This page is a work in progress. + .. _schema_isolation: Schema Isolation From 8dc16eef27ab97654ab17c26f61029190bcd7634 Mon Sep 17 00:00:00 2001 From: Remo <59358383+monacoremo@users.noreply.github.com> Date: Wed, 6 May 2020 18:41:14 +0200 Subject: [PATCH 337/711] Documentation on how to run the test suite locally (#316) Uses the `with_tmp_db` script added in https://github.com/PostgREST/postgrest/pull/1476. --- install.rst | 23 ++++++++++++++++++----- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/install.rst b/install.rst index 415757f456..2df5c9517d 100644 --- a/install.rst +++ b/install.rst @@ -229,10 +229,23 @@ When a pre-built binary does not exist for your system you can build the project PostgREST Test Suite -------------------- -Creating the Test Database -~~~~~~~~~~~~~~~~~~~~~~~~~~ +To properly run the test suite, you need a Postgres database that the tests can run against. There are several ways to set up this database. -To properly run postgrest tests one needs to create a database. To do so, use the test creation script :code:`create_test_database` in the :code:`test/` folder. +Testing with a temporary database +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +If you have Postgres installed locally (:code:`initdb`, :code:`pg_ctl` and :code:`psql` should be on your PATH, no server needs to be running), you can run the test suite against a temporary database: + +.. code:: bash + + test/with_tmp_db stack test + +The :code:`with_tmp_db` script will set up a new Postgres cluster in a temporary directory, set the required environment variables and run the command that you passed it as an argument, :code:`stack test` in the example above. When the command is done, the temporary database is torn down and deleted again. + +Manually creating the Test Database +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +To manually create a database for testing, use the test creation script :code:`create_test_database` in the :code:`test/` folder. The script expects the following parameters: @@ -254,8 +267,8 @@ The script will return the db uri to use in the tests--this uri corresponds to t Generating the user and the password allows one to create the database and run the tests against any PostgreSQL server without any modifications to the server. (Such as allowing accounts without a password or setting up trust authentication, or requiring the server to be on the same localhost the tests are run from). -Running the Tests -~~~~~~~~~~~~~~~~~ +Running the Tests with the manually created database +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ To run the tests, one must supply the database uri in the environment variable :code:`POSTGREST_TEST_CONNECTION`. From 40bffc6950425d4e63726596670060d8d8cdddd6 Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Tue, 12 May 2020 13:24:40 -0500 Subject: [PATCH 338/711] Add subheading to db-schema --- configuration.rst | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/configuration.rst b/configuration.rst index 00d0f7ef63..2b066f8967 100644 --- a/configuration.rst +++ b/configuration.rst @@ -81,21 +81,22 @@ db-schema This schema gets added to the `search_path `_ of every request. +List of schemas +~~~~~~~~~~~~~~~ + You can also specify a list of schemas that can be used for **schema-based multitenancy** and **api versioning** by :ref:`multiple-schemas`. Example: .. code:: bash db-schema = "tenant1, tenant2" - ##or - ##db-schema = "v1, v2" - .. warning:: + If you don't :ref:`Switch Schemas `, the first schema in the list(``tenant1`` in this case) is chosen as the default schema. - Never expose private schemas in this way. See :ref:`schema_isolation`. + *Only the chosen schema* gets added to the `search_path `_ of every request. - If you don't :ref:`Switch Schemas `, the first schema in the list(``tenant1`` in this case) is chosen as the default schema. + .. warning:: - Only the chosen schema gets added to the `search_path `_ of every request. + Never expose private schemas in this way. See :ref:`schema_isolation`. .. _db-anon-role: From 20bb295237ada14c3c8d4cda6ccde9c37d1a6b53 Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Wed, 20 May 2020 13:51:04 -0500 Subject: [PATCH 339/711] Add v7.0.1 release --- conf.py | 2 +- releases/v7.0.1.rst | 61 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 62 insertions(+), 1 deletion(-) create mode 100644 releases/v7.0.1.rst diff --git a/conf.py b/conf.py index 80008bf49a..03012ad36a 100644 --- a/conf.py +++ b/conf.py @@ -56,7 +56,7 @@ # The short X.Y version. version = u'7.0' # The full version, including alpha/beta/rc tags. -release = u'7.0.0' +release = u'7.0.1' # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. diff --git a/releases/v7.0.1.rst b/releases/v7.0.1.rst new file mode 100644 index 0000000000..2d64ee5183 --- /dev/null +++ b/releases/v7.0.1.rst @@ -0,0 +1,61 @@ +.. |br| raw:: html + +
    + +v7.0.1 +====== + +You can see the full changelog at `PostgREST v7.0.1 release page `_. + +Fixed +----- + +* Fix overloaded computed columns on RPC + |br| -- `@wolfgangwalther `_ + +* Fix POST, PATCH, DELETE with ``?select=`` and ``Prefer: return=minimal`` and PATCH with empty body + |br| -- `@wolfgangwalther `_ + +* Fix missing ``openapi-server-proxy-uri`` config option + |br| -- `@steve-chavez `_ + +* Fix ``Content-Profile`` not working for POST RPC + |br| -- `@steve-chavez `_ + +* Fix PUT restriction for including all columns in payload + |br| -- `@steve-chavez `_ + + +Thanks +------ + +This release was made possible thanks to: + +.. image:: ../_static/cybertec.png + :target: https://www.cybertec-postgresql.com/en/ + :width: 13em + +.. image:: ../_static/2ndquadrant.png + :target: https://www.2ndquadrant.com/en/?utm_campaign=External%20Websites&utm_source=PostgREST&utm_medium=Logo + :width: 13em + +.. image:: ../_static/retool.png + :target: https://tryretool.com/?utm_source=sponsor&utm_campaign=postgrest + :width: 13em + +* `Daniel Babiak `_ +* Evans Fernandes +* `Jan Sommer `_ +* Tsingson Qin +* Michel Pelletier +* Jay Hannah +* Robert Stolarz +* Kofi Gumbs +* Nicholas DiBiase +* Christopher Reid +* Nathan Bouscal +* Daniel Rafaj +* David Fenko + + +If you'd like to join them, consider `supporting PostgREST development `_. From f8991b0794892766aeb4e68310c3e13bdf9106ab Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Wed, 20 May 2020 14:04:06 -0500 Subject: [PATCH 340/711] Fix broken link in schema structure --- schema_structure.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/schema_structure.rst b/schema_structure.rst index 8f64354f64..7182912558 100644 --- a/schema_structure.rst +++ b/schema_structure.rst @@ -39,7 +39,7 @@ Security definer ---------------- A function is executed with the privileges of the user who calls it. This means that the user has to have all permissions to do the operations the procedure performs. -If the function accesses private database objects, your `API roles `_ won't be able to succesfully execute the function. +If the function accesses private database objects, your :ref:`API roles ` won't be able to succesfully execute the function. Another option is to define the function with the :code:`SECURITY DEFINER` option. Then only one permission check will take place, the permission to call the function, and the operations in the function will have the authority of the user who owns the function itself. From 516809f2de85e787fa2a278193884a897b9be70a Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Wed, 20 May 2020 14:07:35 -0500 Subject: [PATCH 341/711] Add favicon.ico --- _static/favicon.ico | Bin 0 -> 15086 bytes conf.py | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 _static/favicon.ico diff --git a/_static/favicon.ico b/_static/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..a9e16d3a8ba108c83e65a0c90d321c0a194a9bf9 GIT binary patch literal 15086 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 z Date: Fri, 22 May 2020 13:33:49 -0500 Subject: [PATCH 342/711] Add package managers in installation Fixes https://github.com/PostgREST/postgrest-docs/issues/319 * Add development page * Clear installation page from admin and development concerns --- admin.rst | 18 +++- development.rst | 155 ++++++++++++++++++++++++++++++ index.rst | 7 ++ install.rst | 245 +++++++++++------------------------------------- 4 files changed, 234 insertions(+), 191 deletions(-) create mode 100644 development.rst diff --git a/admin.rst b/admin.rst index 52bb51a0de..01c4e87df6 100644 --- a/admin.rst +++ b/admin.rst @@ -126,11 +126,25 @@ Server Version When debugging a problem it's important to verify the PostgREST version. At any time you can make a request to the running server and determine exactly which version is deployed. Look for the :code:`Server` HTTP response header, which contains the version number. -HTTP Requests -------------- +Logging +------- The PostgREST server logs basic request information to stdout, including the requesting IP address and user agent, the URL requested, and HTTP response status. However this provides limited information for debugging server errors. It's helpful to get full information about both client requests and the corresponding SQL commands executed against the underlying database. +.. note:: + + When running it in an SSH session you must detach it from stdout or it will be terminated when the session closes. The easiest technique is redirecting the output to a log file or to the syslog: + + .. code-block:: bash + + ssh foo@example.com \ + 'postgrest foo.conf /var/log/postgrest.log 2>&1 &' + + # another option is to pipe the output into "logger -t postgrest" + +HTTP Requests +------------- + A great way to inspect incoming HTTP requests including headers and query params is to sniff the network traffic on the port where PostgREST is running. For instance on a development server bound to port 3000 on localhost, run this: .. code:: bash diff --git a/development.rst b/development.rst new file mode 100644 index 0000000000..b3e7badc24 --- /dev/null +++ b/development.rst @@ -0,0 +1,155 @@ +.. _build_source: + +Build from Source +================= + +.. note:: + + We discourage building and using PostgREST on **Alpine Linux** because of a reported GHC memory leak on that platform. + +To help with development, you'll need to build from source. `Stack `_ makes it easy. It will install any necessary Haskell dependencies on your system. + +* `Install Stack `_ for your platform +* Install Library Dependencies + + ===================== ======================================= + Operating System Dependencies + ===================== ======================================= + Ubuntu/Debian libpq-dev, libgmp-dev + CentOS/Fedora/Red Hat postgresql-devel, zlib-devel, gmp-devel + BSD postgresql95-client + OS X libpq, gmp + ===================== ======================================= + +* Build and install binary + + .. code-block:: bash + + git clone https://github.com/PostgREST/postgrest.git + cd postgrest + + # adjust local-bin-path to taste + stack build --install-ghc --copy-bins --local-bin-path /usr/local/bin + +.. note:: + + If building fails and your system has less than 1GB of memory, try adding a swap file. + +* Check that the server is installed: :code:`postgrest --help`. + +Running the Test Suite +====================== + +To properly run the test suite, you need a Postgres database that the tests can run against. There are several ways to set up this database. + +Testing with a temporary database +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +If you have Postgres installed locally (:code:`initdb`, :code:`pg_ctl` and :code:`psql` should be on your PATH, no server needs to be running), you can run the test suite against a temporary database: + +.. code:: bash + + test/with_tmp_db stack test + +The :code:`with_tmp_db` script will set up a new Postgres cluster in a temporary directory, set the required environment variables and run the command that you passed it as an argument, :code:`stack test` in the example above. When the command is done, the temporary database is torn down and deleted again. + +Manually creating the Test Database +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +To manually create a database for testing, use the test creation script :code:`create_test_database` in the :code:`test/` folder. + +The script expects the following parameters: + +.. code:: bash + + test/create_test_db connection_uri database_name [test_db_user] [test_db_user_password] + +Use the `connection URI `_ to specify the user, password, host, and port. Do not provide the database in the connection URI. The PostgreSQL role you are using to connect must be capable of creating new databases. + +The :code:`database_name` is the name of the database that :code:`stack test` will connect to. If the database of the same name already exists on the server, the script will first drop it and then re-create it. + +Optionally, specify the database user :code:`stack test` will use. The user will be given necessary permissions to reset the database after every test run. + +If the user is not specified, the script will generate the role name :code:`postgrest_test_` suffixed by the chosen database name, and will generate a random password for it. + +Optionally, if specifying an existing user to be used for the test connection, one can specify the password the user has. + +The script will return the db uri to use in the tests--this uri corresponds to the :code:`db-uri` parameter in the configuration file that one would use in production. + +Generating the user and the password allows one to create the database and run the tests against any PostgreSQL server without any modifications to the server. (Such as allowing accounts without a password or setting up trust authentication, or requiring the server to be on the same localhost the tests are run from). + +Running the Tests with the manually created database +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +To run the tests, one must supply the database uri in the environment variable :code:`POSTGREST_TEST_CONNECTION`. + +Typically, one would create the database and run the test in the same command line, using the `postgres` superuser: + +.. code:: bash + + POSTGREST_TEST_CONNECTION=$(test/create_test_db "postgres://postgres:pwd@database-host" test_db) stack test + +For repeated runs on the same database, one should export the connection variable: + +.. code:: bash + + export POSTGREST_TEST_CONNECTION=$(test/create_test_db "postgres://postgres:pwd@database-host" test_db) + stack test + stack test + ... + +If the environment variable is empty or not specified, then the test runner will default to connection uri + +.. code:: bash + + postgres://postgrest_test@localhost/postgrest_test + +This connection assumes the test server on the :code:`localhost:code:` with the user `postgrest_test` without the password and the database of the same name. + +Destroying the Database +~~~~~~~~~~~~~~~~~~~~~~~ + +The test database will remain after the test, together with four new roles created on the PostgreSQL server. To permanently erase the created database and the roles, run the script :code:`test/delete_test_database`, using the same superuser role used for creating the database: + +.. code:: bash + + test/destroy_test_db connection_uri database_name + +Testing with Docker +~~~~~~~~~~~~~~~~~~~ + +The ability to connect to non-local PostgreSQL simplifies the test setup. One elegant way of testing is to use a disposable PostgreSQL in docker. + +For example, if local development is on a mac with Docker for Mac installed: + +.. code:: bash + + $ docker run --name db-scripting-test -e POSTGRES_PASSWORD=pwd -p 5434:5432 -d postgres + $ POSTGREST_TEST_CONNECTION=$(test/create_test_db "postgres://postgres:pwd@localhost:5434" test_db) stack test + +Additionally, if one creates a docker container to run stack test (this is necessary on Mac OS Sierra with GHC below 8.0.1, where :code:`stack test` fails), one can run PostgreSQL in a separate linked container, or use the locally installed PostgreSQL app. + +Build the test container with :code:`test/Dockerfile.test`: + +.. code:: bash + + $ docker build -t pgst-test - < test/Dockerfile.test + $ mkdir .stack-work-docker ~/.stack-linux + +The first run of the test container will take a long time while the dependencies get cached. Creating the :code:`~/.stack-linux` folder and mapping it as a volume into the container ensures that we can run the container in disposable mode and not worry about subsequent runs being slow. :code:`.stack-work-docker` is also mapped into the container and must be specified when using stack from Linux, not to interfere with the :code:`.stack-work` for local development. (On Sierra, :code:`stack build` works, while :code:`stack test` fails with GHC 8.0.1). + +Linked containers: + +.. code:: bash + + $ docker run --name pg -e POSTGRES_PASSWORD=pwd -d postgres + $ docker run --rm -it -v `pwd`:`pwd` -v ~/.stack-linux:/root/.stack --link pg:pg -w="`pwd`" -v `pwd`/.stack-work-docker:`pwd`/.stack-work pgst-test bash -c "POSTGREST_TEST_CONNECTION=$(test/create_test_db "postgres://postgres:pwd@pg" test_db) stack test" + +Stack test in Docker for Mac, PostgreSQL app on mac: + +.. code:: bash + + $ host_ip=$(ifconfig en0 | grep 'inet ' | cut -f 2 -d' ') + $ export POSTGREST_TEST_CONNECTION=$(test/create_test_db "postgres://postgres@$HOST" test_db) + $ docker run --rm -it -v `pwd`:`pwd` -v ~/.stack-linux:/root/.stack -v `pwd`/.stack-work-docker:`pwd`/.stack-work -e "HOST=$host_ip" -e "POSTGREST_TEST_CONNECTION=$POSTGREST_TEST_CONNECTION" -w="`pwd`" pgst-test bash -c "stack test" + $ test/destroy_test_db "postgres://postgres@localhost" test_db diff --git a/index.rst b/index.rst index bdfa5e7751..59d1b2928a 100644 --- a/index.rst +++ b/index.rst @@ -139,10 +139,17 @@ Explanations of some key concepts in PostgREST. install.rst +.. toctree:: + :caption: Development + :hidden: + + development.rst + - :doc:`Authentication ` - :doc:`Schema Structure ` - :doc:`Administration ` - :doc:`Installation ` +- :doc:`Development ` .. _how_tos: diff --git a/install.rst b/install.rst index 2df5c9517d..0028b2becb 100644 --- a/install.rst +++ b/install.rst @@ -1,65 +1,87 @@ -Binary Release -============== -[ `Download from release page `_ ] +Installation +============ -The release page has pre-compiled binaries for Mac OS X, Windows, and several Linux distributions. Extract the tarball and run the binary inside with the :code:`--help` flag to see usage instructions: +The release page has `pre-compiled binaries for Mac OS X, Windows, Linux and FreeBSD `_ . +The Linux binary is a static executable that can be run on any Linux distribution. -.. code-block:: bash +If you use **macOS Homebrew**, then you can install PostgREST from the `official repo `_. - # Untar the release (available at https://github.com/PostgREST/postgrest/releases/latest) +.. code:: bash - $ tar Jxf postgrest-[version]-[platform].tar.xz + brew install postgrest - # Try running it - $ ./postgrest --help +If you use **Arch Linux**, then you can install PostgREST from the `official repo `_. - # You should see a usage help message +.. code:: bash -.. note:: + pacman -S postgrest - If you see a dialog box like this on Windows, it may be that the :code:`pg_config` program is not in your system path. +If you use **Nix**, then you can install PostgREST from nixpkgs. - .. image:: _static/win-err-dialog.png +.. code:: bash - It usually lives in :code:`C:\Program Files\PostgreSQL\\bin`. See this `article `_ about how to modify the system path. + nix-env -i haskellPackages.postgrest -.. _pg-dependency: +When a pre-built binary does not exist for your system you can :ref:`build the project from source `. -PostgreSQL dependency -===================== +Running +~~~~~~~ -To use PostgREST you will need an underlying database. We require PostgreSQL 9.4 or greater, but recommend at least 9.5 for row-level security features. -You can use something like Amazon `RDS `_ but installing your own locally is cheaper and more convenient for development. +If you downloaded PostgREST from the release page, first extract the compressed file to obtain the executable. -* `Instructions for OS X `_ -* `Instructions for Ubuntu 14.04 `_ -* `Installer for Windows `_ +.. code-block:: bash + + # For UNIX platforms + tar Jxf postgrest-[version]-[platform].tar.xz + + # On Windows you should unzip the file -On Windows, PostgREST will fail to run unless the PostgreSQL binaries are on the system path. To test whether this is the case, run ``pg_config`` from the command line. You should see it output a list of paths. +Now you can run postgrest with the :code:`--help` flag to see usage instructions: -Configuration -============= +.. code-block:: bash + + # Running postgrest binary + ./postgrest --help + + # Running postgrest installed from a package manager + postgrest --help + + # You should see a usage help message The PostgREST server reads a configuration file as its only argument: .. code:: bash - ./postgrest /path/to/postgrest.conf + postgrest /path/to/postgrest.conf + + # You can also generate a sample config file with + # postgrest 2> postgrest.conf + # You'll need to edit this file and remove the usage parts for postgrest to read it For a complete reference of the configuration file, see :ref:`configuration`. -Running the Server -================== +.. note:: -PostgREST outputs basic request logging to stdout. When running it in an SSH session you must detach it from stdout or it will be terminated when the session closes. The easiest technique is redirecting the output to a log file or to the syslog: + If you see a dialog box like this on Windows, it may be that the :code:`pg_config` program is not in your system path. -.. code-block:: bash + .. image:: _static/win-err-dialog.png - ssh foo@example.com \ - 'postgrest foo.conf /var/log/postgrest.log 2>&1 &' + It usually lives in :code:`C:\Program Files\PostgreSQL\\bin`. See this `article `_ about how to modify the system path. - # another option is to pipe the output into "logger -t postgrest" + To test that the system path is set correctly, run ``pg_config`` from the command line. You should see it output a list of paths. + +.. _pg-dependency: + +PostgreSQL dependency +===================== + +To use PostgREST you will need an underlying database. We require PostgreSQL 9.4 or greater, but recommend at least 9.5 for row-level security features. +You can use something like Amazon `RDS `_ but installing your own locally is cheaper and more convenient for development. + +* `Instructions for OS X `_ +* `Instructions for Ubuntu 14.04 `_ +* `Installer for Windows `_ Docker ====== @@ -176,6 +198,7 @@ With this you can see the swagger-ui in your browser on port 8080. Deploying to Heroku =================== + Assuming your making modifications locally and then pushing to GitHub, it's easy to deploy to Heroku. 1. Create a new app on Heroku @@ -186,159 +209,3 @@ Assuming your making modifications locally and then pushing to GitHub, it's easy 6. Push your changes to GitHub 7. Set Heroku to automatically deploy from Master and then manually deploy the branch for the first build - -.. _build_source: - -Build from Source -================= - -.. note:: - - We discourage building and using PostgREST on **Alpine Linux** because of a reported GHC memory leak on that platform. - -When a pre-built binary does not exist for your system you can build the project from source. You'll also need to do this if you want to help with development. `Stack `_ makes it easy. It will install any necessary Haskell dependencies on your system. - -* `Install Stack `_ for your platform -* Install Library Dependencies - - ===================== ======================================= - Operating System Dependencies - ===================== ======================================= - Ubuntu/Debian libpq-dev, libgmp-dev - CentOS/Fedora/Red Hat postgresql-devel, zlib-devel, gmp-devel - BSD postgresql95-client - OS X libpq, gmp - ===================== ======================================= - -* Build and install binary - - .. code-block:: bash - - git clone https://github.com/PostgREST/postgrest.git - cd postgrest - - # adjust local-bin-path to taste - stack build --install-ghc --copy-bins --local-bin-path /usr/local/bin - -.. note:: - - If building fails and your system has less than 1GB of memory, try adding a swap file. - -* Check that the server is installed: :code:`postgrest --help`. - -PostgREST Test Suite --------------------- - -To properly run the test suite, you need a Postgres database that the tests can run against. There are several ways to set up this database. - -Testing with a temporary database -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -If you have Postgres installed locally (:code:`initdb`, :code:`pg_ctl` and :code:`psql` should be on your PATH, no server needs to be running), you can run the test suite against a temporary database: - -.. code:: bash - - test/with_tmp_db stack test - -The :code:`with_tmp_db` script will set up a new Postgres cluster in a temporary directory, set the required environment variables and run the command that you passed it as an argument, :code:`stack test` in the example above. When the command is done, the temporary database is torn down and deleted again. - -Manually creating the Test Database -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -To manually create a database for testing, use the test creation script :code:`create_test_database` in the :code:`test/` folder. - -The script expects the following parameters: - -.. code:: bash - - test/create_test_db connection_uri database_name [test_db_user] [test_db_user_password] - -Use the `connection URI `_ to specify the user, password, host, and port. Do not provide the database in the connection URI. The PostgreSQL role you are using to connect must be capable of creating new databases. - -The :code:`database_name` is the name of the database that :code:`stack test` will connect to. If the database of the same name already exists on the server, the script will first drop it and then re-create it. - -Optionally, specify the database user :code:`stack test` will use. The user will be given necessary permissions to reset the database after every test run. - -If the user is not specified, the script will generate the role name :code:`postgrest_test_` suffixed by the chosen database name, and will generate a random password for it. - -Optionally, if specifying an existing user to be used for the test connection, one can specify the password the user has. - -The script will return the db uri to use in the tests--this uri corresponds to the :code:`db-uri` parameter in the configuration file that one would use in production. - -Generating the user and the password allows one to create the database and run the tests against any PostgreSQL server without any modifications to the server. (Such as allowing accounts without a password or setting up trust authentication, or requiring the server to be on the same localhost the tests are run from). - -Running the Tests with the manually created database -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -To run the tests, one must supply the database uri in the environment variable :code:`POSTGREST_TEST_CONNECTION`. - -Typically, one would create the database and run the test in the same command line, using the `postgres` superuser: - -.. code:: bash - - POSTGREST_TEST_CONNECTION=$(test/create_test_db "postgres://postgres:pwd@database-host" test_db) stack test - -For repeated runs on the same database, one should export the connection variable: - -.. code:: bash - - export POSTGREST_TEST_CONNECTION=$(test/create_test_db "postgres://postgres:pwd@database-host" test_db) - stack test - stack test - ... - -If the environment variable is empty or not specified, then the test runner will default to connection uri - -.. code:: bash - - postgres://postgrest_test@localhost/postgrest_test - -This connection assumes the test server on the :code:`localhost:code:` with the user `postgrest_test` without the password and the database of the same name. - -Destroying the Database -~~~~~~~~~~~~~~~~~~~~~~~ - -The test database will remain after the test, together with four new roles created on the PostgreSQL server. To permanently erase the created database and the roles, run the script :code:`test/delete_test_database`, using the same superuser role used for creating the database: - -.. code:: bash - - test/destroy_test_db connection_uri database_name - -Testing with Docker -~~~~~~~~~~~~~~~~~~~ - -The ability to connect to non-local PostgreSQL simplifies the test setup. One elegant way of testing is to use a disposable PostgreSQL in docker. - -For example, if local development is on a mac with Docker for Mac installed: - -.. code:: bash - - $ docker run --name db-scripting-test -e POSTGRES_PASSWORD=pwd -p 5434:5432 -d postgres - $ POSTGREST_TEST_CONNECTION=$(test/create_test_db "postgres://postgres:pwd@localhost:5434" test_db) stack test - -Additionally, if one creates a docker container to run stack test (this is necessary on Mac OS Sierra with GHC below 8.0.1, where :code:`stack test` fails), one can run PostgreSQL in a separate linked container, or use the locally installed PostgreSQL app. - -Build the test container with :code:`test/Dockerfile.test`: - -.. code:: bash - - $ docker build -t pgst-test - < test/Dockerfile.test - $ mkdir .stack-work-docker ~/.stack-linux - -The first run of the test container will take a long time while the dependencies get cached. Creating the :code:`~/.stack-linux` folder and mapping it as a volume into the container ensures that we can run the container in disposable mode and not worry about subsequent runs being slow. :code:`.stack-work-docker` is also mapped into the container and must be specified when using stack from Linux, not to interfere with the :code:`.stack-work` for local development. (On Sierra, :code:`stack build` works, while :code:`stack test` fails with GHC 8.0.1). - -Linked containers: - -.. code:: bash - - $ docker run --name pg -e POSTGRES_PASSWORD=pwd -d postgres - $ docker run --rm -it -v `pwd`:`pwd` -v ~/.stack-linux:/root/.stack --link pg:pg -w="`pwd`" -v `pwd`/.stack-work-docker:`pwd`/.stack-work pgst-test bash -c "POSTGREST_TEST_CONNECTION=$(test/create_test_db "postgres://postgres:pwd@pg" test_db) stack test" - -Stack test in Docker for Mac, PostgreSQL app on mac: - -.. code:: bash - - $ host_ip=$(ifconfig en0 | grep 'inet ' | cut -f 2 -d' ') - $ export POSTGREST_TEST_CONNECTION=$(test/create_test_db "postgres://postgres@$HOST" test_db) - $ docker run --rm -it -v `pwd`:`pwd` -v ~/.stack-linux:/root/.stack -v `pwd`/.stack-work-docker:`pwd`/.stack-work -e "HOST=$host_ip" -e "POSTGREST_TEST_CONNECTION=$POSTGREST_TEST_CONNECTION" -w="`pwd`" pgst-test bash -c "stack test" - $ test/destroy_test_db "postgres://postgres@localhost" test_db From 0b998e91d69b3a5e220eb0b8683a3f3dc0ef9c05 Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Fri, 22 May 2020 14:32:53 -0500 Subject: [PATCH 343/711] Add notice about single Linux static executable Reorder development page in the toctree --- index.rst | 18 ++++++++++-------- install.rst | 1 + releases/v7.0.1.rst | 8 ++++++++ 3 files changed, 19 insertions(+), 8 deletions(-) diff --git a/index.rst b/index.rst index 59d1b2928a..4dbbf94fb7 100644 --- a/index.rst +++ b/index.rst @@ -139,17 +139,10 @@ Explanations of some key concepts in PostgREST. install.rst -.. toctree:: - :caption: Development - :hidden: - - development.rst - - :doc:`Authentication ` - :doc:`Schema Structure ` - :doc:`Administration ` - :doc:`Installation ` -- :doc:`Development ` .. _how_tos: @@ -184,7 +177,16 @@ PostgREST has a growing ecosystem of examples, libraries, and experiments. Here * :ref:`eco_external_notification` * :ref:`eco_extensions` * :ref:`clientside_libraries` -* :ref:`eco_commercial` + +For helping with development, see the following page. + +* :doc:`Development ` + +.. toctree:: + :caption: Development + :hidden: + + development.rst Release Notes ------------- diff --git a/install.rst b/install.rst index 0028b2becb..fdc1923421 100644 --- a/install.rst +++ b/install.rst @@ -1,3 +1,4 @@ +.. _install: Installation ============ diff --git a/releases/v7.0.1.rst b/releases/v7.0.1.rst index 2d64ee5183..5c7d64eee7 100644 --- a/releases/v7.0.1.rst +++ b/releases/v7.0.1.rst @@ -25,6 +25,14 @@ Fixed * Fix PUT restriction for including all columns in payload |br| -- `@steve-chavez `_ +* Documentation improvements + + + Added package managers to :ref:`install`. + +Changed +------- + +* From this version onwards, the release page will only include a single Linux static executable that can be run on any Linux distribution. Thanks ------ From b965f32137dce9662c2ef21a2c56a496f186e965 Mon Sep 17 00:00:00 2001 From: Steve Chavez Date: Sat, 23 May 2020 19:28:28 -0500 Subject: [PATCH 344/711] Update v7.0.1.rst --- releases/v7.0.1.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/releases/v7.0.1.rst b/releases/v7.0.1.rst index 5c7d64eee7..6adc232358 100644 --- a/releases/v7.0.1.rst +++ b/releases/v7.0.1.rst @@ -32,7 +32,7 @@ Fixed Changed ------- -* From this version onwards, the release page will only include a single Linux static executable that can be run on any Linux distribution. +* From this version onwards, the release page will include a single Linux static executable that can be run on any Linux distribution. Thanks ------ From f03be6d2d0996313aafcbd9af62750247b9a6beb Mon Sep 17 00:00:00 2001 From: Oskar Oldorf Date: Wed, 27 May 2020 19:36:16 +0200 Subject: [PATCH 345/711] Fix typo (#325) --- auth.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/auth.rst b/auth.rst index 7aaa9eabda..8d0f6df506 100644 --- a/auth.rst +++ b/auth.rst @@ -46,7 +46,7 @@ PostgreSQL manages database access permissions using the concept of roles. A rol Roles for Each Web User ~~~~~~~~~~~~~~~~~~~~~~~ -PostgREST can accommodate either viewpoint. If you treat a role as a single user then the the JWT-based role switching described above does most of what you need. When an authenticated user makes a request PostgREST will switch into the role for that user, which in addition to restricting queries, is available to SQL through the :code:`current_user` variable. +PostgREST can accommodate either viewpoint. If you treat a role as a single user then the JWT-based role switching described above does most of what you need. When an authenticated user makes a request PostgREST will switch into the role for that user, which in addition to restricting queries, is available to SQL through the :code:`current_user` variable. You can use row-level security to flexibly restrict visibility and access for the current user. Here is an `example `_ from Tomas Vondra, a chat table storing messages sent between users. Users can insert rows into it to send messages to other users, and query it to see messages sent to them by other users. From ff8fd648bbe23105a1a6a6d08ba928602fc1586a Mon Sep 17 00:00:00 2001 From: waltherjj <34773048+waltherjj@users.noreply.github.com> Date: Wed, 27 May 2020 17:04:39 +0200 Subject: [PATCH 346/711] Add new JS (Vue) client to /ecosystem Hey! We developed a Vue.js library, happy to be part of this. Thank you for postgREST! --- ecosystem.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/ecosystem.rst b/ecosystem.rst index a71c41571a..3791ea138b 100644 --- a/ecosystem.rst +++ b/ecosystem.rst @@ -71,6 +71,7 @@ Extensions Client-Side Libraries --------------------- +* `technowledgy/vue-postgrest `_ - Vue.js * `supabase/postgrest-js `_ - Isomorphic JS client * `SocialGouv/postgrester `_ - JS + Typescript * `Kong/py-postgrest `_ - Python From a8697341400d3688363fc8e08ad2fcc469ced7fd Mon Sep 17 00:00:00 2001 From: Steve Chavez Date: Fri, 5 Jun 2020 13:01:52 -0500 Subject: [PATCH 347/711] reference: Add response.status GUC (#329) Related to https://github.com/PostgREST/postgrest/pull/1541 --- api.rst | 39 +++++++++++++++++++++++++++++++++++++-- 1 file changed, 37 insertions(+), 2 deletions(-) diff --git a/api.rst b/api.rst index 0bab1152fd..1999517218 100644 --- a/api.rst +++ b/api.rst @@ -1496,7 +1496,7 @@ Notice that the variable should be set to an *array* of single-key objects rathe .. _pre_req_headers: Setting headers via pre-request -------------------------------- +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ By using a :ref:`pre-request` function, you can add headers to GET/POST/PATCH/PUT/DELETE responses. As an example, let's add some cache headers for all requests that come from an Internet Explorer(6 or 7) browser. @@ -1529,10 +1529,41 @@ Now when you make a GET request to a table or view, you'll get the cache headers ... +.. _guc_resp_status: -Errors and HTTP Status Codes +Setting Response Status Code ---------------------------- +You can set the ``response.status`` GUC to override the default status code PostgREST provides. For instance, the following function would replace the default ``200`` status code. + +.. code-block:: postgres + + create or replace function teapot() returns json as $$ + begin + perform set_config('response.status', '418', true); + return json_build_object('message', 'The requested entity body is short and stout.', + 'hint', 'Tip it over and pour it out.'); + end; + $$ language plpgsql; + +.. code-block:: http + + GET /rpc/teapot HTTP/1.1 + +.. code-block:: http + + HTTP/1.1 418 I'm a teapot + + {"message" : "The requested entity body is short and stout.", + "hint" : "Tip it over and pour it out."} + +If the status code is standard, PostgREST will complete the status message(**I'm a teapot** in this example). + +.. _raise_error: + +Raise errors with HTTP Status Codes +----------------------------------- + Stored procedures can return non-200 HTTP status codes by raising SQL exceptions. For instance, here's a saucy function that always responds with an error: .. code-block:: postgresql @@ -1558,6 +1589,10 @@ Calling the function returns HTTP 400 with the body "code":"P0001" } +.. note:: + + Keep in mind that ``RAISE EXCEPTION`` will abort the transaction and rollback all changes. If you don't want this, you can instead use the :ref:`response.status GUC `. + One way to customize the HTTP status code is by raising particular exceptions according to the PostgREST :ref:`error to status code mapping `. For example, :code:`RAISE insufficient_privilege` will respond with HTTP 401/403 as appropriate. For even greater control of the HTTP status code, raise an exception of the ``PTxyz`` type. For instance to respond with HTTP 402, raise 'PT402': From 94441c70c05ea9bdcc213f97752bf564bc959655 Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Fri, 5 Jun 2020 14:35:45 -0500 Subject: [PATCH 348/711] Add upcoming page --- .github/PULL_REQUEST_TEMPLATE.md | 3 +++ releases/upcoming.rst | 27 +++++++++++++++++++++++++++ 2 files changed, 30 insertions(+) create mode 100644 .github/PULL_REQUEST_TEMPLATE.md create mode 100644 releases/upcoming.rst diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 0000000000..1bd9f912ab --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,3 @@ + diff --git a/releases/upcoming.rst b/releases/upcoming.rst new file mode 100644 index 0000000000..73a1239224 --- /dev/null +++ b/releases/upcoming.rst @@ -0,0 +1,27 @@ +.. |br| raw:: html + +
    + +Upcoming +======== + +These are changes yet unreleased. If you'd like to try them out before a new official release, you can :ref:`build_source`. + +Added +----- + +* Allow http status override through the :ref:`response.status ` GUC. + |br| -- `@steve-chavez `_ + +Fixed +----- + +* Fix showing UNKNOWN on ``postgrest --help`` invocation. + |br| -- `@monacoremo `_ + +Changed +------- + +* Docker images are now optimized to be built from the scratch image. This reduces the compressed image size from over 30mb to about 4mb. + For more details, see `Docker image built with Nix `_. + |br| -- `@monacoremo `_ From 78bd10acc9aeb0c74e572839efcbd78e9f2f03a6 Mon Sep 17 00:00:00 2001 From: Bobbie Soedirgo Date: Thu, 11 Jun 2020 16:19:57 +0800 Subject: [PATCH 349/711] Add supabase/postgrest-rs client library --- ecosystem.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/ecosystem.rst b/ecosystem.rst index 3791ea138b..f21ca5548f 100644 --- a/ecosystem.rst +++ b/ecosystem.rst @@ -71,6 +71,7 @@ Extensions Client-Side Libraries --------------------- +* `supabase/postgrest-rs `_ - Rust * `technowledgy/vue-postgrest `_ - Vue.js * `supabase/postgrest-js `_ - Isomorphic JS client * `SocialGouv/postgrester `_ - JS + Typescript From 702df3218dc98504614769706d9f48c18a037cd7 Mon Sep 17 00:00:00 2001 From: Andrew Hall Date: Fri, 12 Jun 2020 18:45:31 +0100 Subject: [PATCH 350/711] add redux-postgrest to client-side libraries As per https://github.com/andytango/redux-postgrest/issues/7 --- ecosystem.rst | 2 ++ 1 file changed, 2 insertions(+) diff --git a/ecosystem.rst b/ecosystem.rst index f21ca5548f..0b3110d040 100644 --- a/ecosystem.rst +++ b/ecosystem.rst @@ -89,6 +89,8 @@ Client-Side Libraries * `PierreRochard/postgrest-angular `_ - TypeScript, generate UI from API description * `thejettdurham/postgrest-sharp-client `_ (needs maintainer) - C#, RestSharp * `team142/ng-postgrest `_ - Angular app for browsing, editing data exposed over Postgrest. +* `andytango/redux-postgrest `_ - TypeScript/JS, client integrated with (React) Redux. + .. _eco_commercial: From 864a1440be88dbc2e268f7183aadb4a845bf08f2 Mon Sep 17 00:00:00 2001 From: Mathieu Passenaud Date: Tue, 3 Mar 2020 19:43:51 +0100 Subject: [PATCH 351/711] added https://www.mathieupassenaud.fr/codeless_backend/ tutorial --- ecosystem.rst | 2 ++ 1 file changed, 2 insertions(+) diff --git a/ecosystem.rst b/ecosystem.rst index 0b3110d040..9ac92095ca 100644 --- a/ecosystem.rst +++ b/ecosystem.rst @@ -11,6 +11,8 @@ Community Tutorials * `PostgREST + PostGIS API tutorial in 5 minutes `_ - In this tutorial, GIS • OPS shows how to perform PostGIS calculations through PostgREST :ref:`s_procs` interface. +* `"CodeLess" backend using postgres, postgrest and oauth2 authentication with keycloak ` + .. _eco_example_apps: Example Apps From 7e3c14a71a501161c706104d10ea5ab8ecc30d9c Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Tue, 16 Jun 2020 13:52:43 -0500 Subject: [PATCH 352/711] Update community tutorials - Description to keycloak tutorial - Correct gisops tutorial link --- ecosystem.rst | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/ecosystem.rst b/ecosystem.rst index 9ac92095ca..77247d0916 100644 --- a/ecosystem.rst +++ b/ecosystem.rst @@ -8,10 +8,11 @@ Community Tutorials * `PostgREST + Auth0: Create REST API in mintutes and add social login using Auth0 `_ - A step-by-step tutorial to show how to Dockerize and integrate Auth0 to PostgREST service. -* `PostgREST + PostGIS API tutorial in 5 minutes `_ - +* `PostgREST + PostGIS API tutorial in 5 minutes `_ - In this tutorial, GIS • OPS shows how to perform PostGIS calculations through PostgREST :ref:`s_procs` interface. -* `"CodeLess" backend using postgres, postgrest and oauth2 authentication with keycloak ` +* `"CodeLess" backend using postgres, postgrest and oauth2 authentication with keycloak `_ - + A step-by-step tutorial for using PostgREST with KeyCloak(hosted on a managed service). .. _eco_example_apps: From c518585259645d3029e55d5bb8becdeaf0f935b4 Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Sun, 28 Jun 2020 13:46:39 -0500 Subject: [PATCH 353/711] Add FreeBSD port to install page --- install.rst | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/install.rst b/install.rst index fdc1923421..0481ed2837 100644 --- a/install.rst +++ b/install.rst @@ -12,6 +12,12 @@ If you use **macOS Homebrew**, then you can install PostgREST from the `official brew install postgrest +If you use **FreeBSD**, then you can install PostgREST from the `official ports `_. + +.. code:: bash + + pkg install hs-postgrest + If you use **Arch Linux**, then you can install PostgREST from the `official repo `_. .. code:: bash From 4c92fc7bcaabdc94a5f85b58bdbcc3a778e67717 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Teemu=20Sirvio=CC=88?= Date: Thu, 9 Jul 2020 10:45:47 +0300 Subject: [PATCH 354/711] Update links to pg-safeupdate Change broken links to Bitbucket to GitHub. --- admin.rst | 2 +- ecosystem.rst | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/admin.rst b/admin.rst index 01c4e87df6..a272fcfbb7 100644 --- a/admin.rst +++ b/admin.rst @@ -51,7 +51,7 @@ However it's very easy to delete the **entire table** by omitting the query para DELETE /logs HTTP/1.1 -This can happen accidentally such as by switching a request from a GET to a DELETE. To protect against accidental operations use the `pg-safeupdate `_ PostgreSQL extension. It raises an error if UPDATE or DELETE are executed without specifying conditions. To install it you can use the `PGXN `_ network: +This can happen accidentally such as by switching a request from a GET to a DELETE. To protect against accidental operations use the `pg-safeupdate `_ PostgreSQL extension. It raises an error if UPDATE or DELETE are executed without specifying conditions. To install it you can use the `PGXN `_ network: .. code-block:: bash diff --git a/ecosystem.rst b/ecosystem.rst index 77247d0916..9b33ba5467 100644 --- a/ecosystem.rst +++ b/ecosystem.rst @@ -61,7 +61,7 @@ These are PostgreSQL bridges that propagate LISTEN/NOTIFY to external queues for Extensions ---------- -* `pg-safeupdate `_ - Prevent full-table updates or deletes +* `pg-safeupdate `_ - Prevent full-table updates or deletes * `srid/spas `_ - allow file uploads and basic auth * `svmnotn/postgrest-auth `_ - OAuth2-inspired external auth server * `wildsurfer/postgrest-oauth-server `_ - OAuth2 server From 58116820254971f99d4eb5389cb13e9c7e4677d9 Mon Sep 17 00:00:00 2001 From: Tad Lispy Date: Fri, 17 Jul 2020 18:36:45 +0200 Subject: [PATCH 355/711] Fix #334: Alter default privileges (#338) * Suggest granting execute on all functions in schema api * Suggest to permanently alter default privileges on functions --- schema_structure.rst | 24 ++++++++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/schema_structure.rst b/schema_structure.rst index 7182912558..a51d08c921 100644 --- a/schema_structure.rst +++ b/schema_structure.rst @@ -20,20 +20,36 @@ This allows you to change the internals of your schema and maintain backwards co Functions ========= -By default, when a function is created, the privilege to execute it is not restricted by role. The function access is PUBLIC—executable by all roles(more details at `PostgreSQL Privileges page `_). This is not ideal for an API schema. To disable this behavior, you can run the following SQL statement: +By default, when a function is created, the privilege to execute it is not restricted by role. The function access is PUBLIC—executable by all roles (more details at `PostgreSQL Privileges page `_). This is not ideal for an API schema. To disable this behavior, you can run the following SQL statement: .. code-block:: postgres - ALTER DEFAULT PRIVILEGES IN SCHEMA api REVOKE EXECUTE ON FUNCTIONS FROM PUBLIC; + ALTER DEFAULT PRIVILEGES REVOKE EXECUTE ON FUNCTIONS FROM PUBLIC; -See `PostgreSQL alter default privileges `_ for more details. +This will change the privileges for all functions created in the future in all schemas. Currently there is no way to limit it to a single schema. In our opinion it's a good practice anyway. + +.. note:: + + It is however possible to limit the effect of this clause only to functions you define. You can put the above statement at the beginning of the API schema definition, and then at the end reverse it with: + + .. code-block:: postgres + + ALTER DEFAULT PRIVILEGES GRANT EXECUTE ON FUNCTIONS TO PUBLIC; + + This will work because the :code:`alter default privileges` statement has effect on function created *after* it is executed. See `PostgreSQL alter default privileges `_ for more details. After that, you'll need to grant EXECUTE privileges on functions explicitly: .. code-block:: postgres GRANT EXECUTE ON FUNCTION login TO anonymous; - GRANT EXECUTE ON FUNCTION reset_password TO web_user; + GRANT EXECUTE ON FUNCTION signup TO anonymous; + +You can also grant execute on all functions in a schema to a higher privileged role: + +.. code-block:: postgres + + GRANT EXECUTE ON ALL FUNCTIONS IN SCHEMA api TO web_user; Security definer ---------------- From 7f67cf78e7232f91ca8d7a1f5ce956e67b558623 Mon Sep 17 00:00:00 2001 From: vbalasu Date: Tue, 28 Jul 2020 09:25:17 -0700 Subject: [PATCH 356/711] Update ecosystem.rst (#341) Added pg-notify-webook --- ecosystem.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/ecosystem.rst b/ecosystem.rst index 9b33ba5467..5fd90c41bd 100644 --- a/ecosystem.rst +++ b/ecosystem.rst @@ -47,6 +47,7 @@ External Notification These are PostgreSQL bridges that propagate LISTEN/NOTIFY to external queues for further processing. This allows stored procedures to initiate actions outside the database such as sending emails. +* `vbalasu/pg-notify-webhook `_ - Trigger webhooks from postgres LISTEN/NOTIFY * `diogob/postgres-websockets `_ - expose web sockets for PostgreSQL's LISTEN/NOTIFY * `frafra/postgresql2websocket `_ - Websockets * `matthewmueller/pg-bridge `_ - Amazon SNS From c7e623549d0218e89f52b7b0a333669b0d8823fa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ale=C5=A1=20Najmann?= Date: Tue, 4 Aug 2020 19:02:44 +0200 Subject: [PATCH 357/711] Add Windows installation using Scoop to install page (#342) --- install.rst | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/install.rst b/install.rst index 0481ed2837..a56b0c0d0b 100644 --- a/install.rst +++ b/install.rst @@ -30,6 +30,12 @@ If you use **Nix**, then you can install PostgREST from nixpkgs. nix-env -i haskellPackages.postgrest +If you use Windows, you can install PostgREST using `Scoop command-line installer `_. + +.. code:: bash + + scoop install postgrest + When a pre-built binary does not exist for your system you can :ref:`build the project from source `. Running From 49bc82bfcaed2167d7e7aaa72623fd7d397cc83a Mon Sep 17 00:00:00 2001 From: Wolfgang Walther Date: Thu, 13 Aug 2020 17:29:32 +0200 Subject: [PATCH 358/711] Clarify function volatility and location header (#339) * clarify location header only available with PK * clarify function volatility and GET/POST * improve stable/immutable for post and get * add 405 for read only transaction error --- api.rst | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/api.rst b/api.rst index 1999517218..6fd9c4ff91 100644 --- a/api.rst +++ b/api.rst @@ -882,7 +882,7 @@ To create a row in a database table post a JSON object whose keys are the names { "col1": "value1", "col2": "value2" } -The response will include a :code:`Location` header describing where to find the new object. If the table is write-only then constructing the Location header will cause a permissions error. To successfully insert an item to a write-only table you will need to suppress the Location response header by including the request header :code:`Prefer: return=minimal`. +If the table has a primary key, the response will include a :code:`Location` header describing where to find the new object. If the table is write-only then constructing the Location header will cause a permissions error. To successfully insert an item to a write-only table you will need to suppress the Location response header by including the request header :code:`Prefer: return=minimal`. On the other end of the spectrum you can get the full created object back in the response to your request by including the header :code:`Prefer: return=representation`. That way you won't have to make another HTTP call to discover properties that may have been filled in on the server side. You can also apply the standard :ref:`v_filter` to these results. @@ -1148,13 +1148,15 @@ PostgreSQL has four procedural languages that are part of the core distribution: Immutable and stable functions ------------------------------ -Procedures in PostgreSQL marked with :code:`stable` or :code:`immutable` `volatility `_ can only read, not modify, the database and PostgREST executes them in a read-only transaction compatible for read-replicas. Stable and immutable functions can be called with the HTTP GET verb if desired. +PostgREST executes POST requests in a read/write transaction except for functions marked as ``IMMUTABLE`` or ``STABLE``. Those must not modify the database and are executed in a read-only transaction compatible for read-replicas. + +Procedures that do not modify the database can be called with the HTTP GET verb as well, if desired. PostgREST executes all GET requests in a read-only transaction. Modifying the database inside read-only transactions is not possible and calling volatile functions with GET will fail. .. note:: - The volatility marker is a promise about the behavior of the function. PostgreSQL will let you mark a function that modifies the database as ``immutable/stable`` without failure. However the function will fail when called through PostgREST since it executes it in a read-only transaction. + The `volatility marker `_ is a promise about the behavior of the function. PostgreSQL will let you mark a function that modifies the database as ``IMMUTABLE`` or ``STABLE`` without failure. However, because of the read-only transaction this would still fail with PostgREST. -Because ``add_them`` was declared IMMUTABLE, we can alternately call the function with a GET request: +Because ``add_them`` is ``IMMUTABLE``, we can alternately call the function with a GET request: .. code-block:: http @@ -1227,6 +1229,8 @@ as in ``{1,2,3,4}``. Note that the curly brackets have to be urlencoded(``{`` is In these versions we recommend using function parameters of type json to accept arrays from the client. +.. _s_procs_variadic: + Scalar functions ---------------- @@ -1635,6 +1639,8 @@ PostgREST translates `PostgreSQL error codes Date: Sun, 16 Aug 2020 09:26:40 +0200 Subject: [PATCH 359/711] Updated the link to the blog post for PostgREST + Auth0 tutorial --- ecosystem.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ecosystem.rst b/ecosystem.rst index 5fd90c41bd..ec7f4ba24f 100644 --- a/ecosystem.rst +++ b/ecosystem.rst @@ -6,7 +6,7 @@ Community Tutorials * `Building a Contacts List with PostgREST and Vue.js `_ - In this video series, DigitalOcean shows how to build and deploy an Nginx + PostgREST(using a managed PostgreSQL database) + Vue.js webapp in an Ubuntu server droplet. -* `PostgREST + Auth0: Create REST API in mintutes and add social login using Auth0 `_ - A step-by-step tutorial to show how to Dockerize and integrate Auth0 to PostgREST service. +* `PostgREST + Auth0: Create REST API in mintutes, and add social login using Auth0 `_ - A step-by-step tutorial to show how to Dockerize and integrate Auth0 to PostgREST service. * `PostgREST + PostGIS API tutorial in 5 minutes `_ - In this tutorial, GIS • OPS shows how to perform PostGIS calculations through PostgREST :ref:`s_procs` interface. From 92f76722cc6948908e1584fb7041446c100f336f Mon Sep 17 00:00:00 2001 From: Geoffrey van Wyk Date: Thu, 20 Aug 2020 20:45:00 +0200 Subject: [PATCH 360/711] Fix order of options in tar command (#345) With the current order, the tar command thinks the name of the archive is J. This happens on Windows 10 WSL2 with tar 1.29. --- tutorials/tut0.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tutorials/tut0.rst b/tutorials/tut0.rst index 18884ea5f5..a0c49bac2d 100644 --- a/tutorials/tut0.rst +++ b/tutorials/tut0.rst @@ -46,7 +46,7 @@ The pre-built binaries for download are :code:`.tar.xz` compressed files (except # download from https://github.com/PostgREST/postgrest/releases/latest - tar xfJ postgrest--.tar.xz + tar xJf postgrest--.tar.xz The result will be a file named simply :code:`postgrest` (or :code:`postgrest.exe` on Windows). At this point try running it with From 5b59e79dc9392bdec93e673783dab4e45174a25b Mon Sep 17 00:00:00 2001 From: Vikas Prasad Date: Fri, 21 Aug 2020 00:41:39 +0530 Subject: [PATCH 361/711] Mention `--install-ghc` flag is needed only for the first time. (#347) --- development.rst | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/development.rst b/development.rst index b3e7badc24..f5d2e33882 100644 --- a/development.rst +++ b/development.rst @@ -33,7 +33,8 @@ To help with development, you'll need to build from source. `Stack Date: Thu, 27 Aug 2020 03:23:54 +0300 Subject: [PATCH 362/711] Improvements for Auth0 documentation. (#350) Update for Auth0 integration with the OIDC flow using APIs --- auth.rst | 33 ++++++++------------------------- 1 file changed, 8 insertions(+), 25 deletions(-) diff --git a/auth.rst b/auth.rst index 8d0f6df506..8243e09504 100644 --- a/auth.rst +++ b/auth.rst @@ -204,42 +204,25 @@ JWT from Auth0 An external service like `Auth0 `_ can do the hard work transforming OAuth from Github, Twitter, Google etc into a JWT suitable for PostgREST. Auth0 can also handle email signup and password reset flows. -To use Auth0, copy its client secret into your PostgREST configuration file as the :code:`jwt-secret`. (Old-style Auth0 secrets are Base64 encoded. For these secrets set :code:`secret-is-base64` to :code:`true`, or just refresh the Auth0 secret.) You can find the secret in the client settings of the Auth0 management console. +To use Auth0, create `an application `_ for your app and `an API `_ for your PostgREST server. Auth0 supports both HS256 and RS256 scheme for the issued tokens for APIs. For simplicity, you may first try HS256 scheme while creating your API on Auth0. Your application should use your PostgREST API's `API identifier `_ by setting it with the `audience parameter `_ during the authorization request. This will ensure that Auth0 will issue an access token for your PostgREST API. For PostgREST to verify the access token, you will need to set ``jwt-secret`` on PostgREST config file with your API's signing secret. .. note:: - Make sure OIDC-conformant is toggled off. - - A recent Auth0 change sets it on by default. Turn it `off` here: - - Clients > `Your App` > Settings > Show Advanced Settings > OAuth > OIDC Conformant - - Ensure also that your client application does not pass in any `audience` configuration. - -Our code requires a database role in the JWT. To add it you need to save the database role in Auth0 `app metadata `_. Then, you will need to write a rule that will extract the role from the user metadata and include a :code:`role` claim in the payload of our user object. Afterwards, in your Auth0Lock code, include the :code:`role` claim in your `scope param `_. +Our code requires a database role in the JWT. To add it you need to save the database role in Auth0 `app metadata `_. Then, you will need to write `a rule `_ that will extract the role from the user's app_metadata and set it as a `custom claim `_ in the access token. Note that, you may use Auth0's `core authorization feature `_ for more complex use cases. Metadata solution is mentioned here for simplicity. .. code:: javascript - // Example Auth0 rule function (user, context, callback) { + + // Follow the documentations at http://postgrest.org/en/v7.0.0/configuration.html#role-claim-key + // to set a custom role claim on PostgREST and use it as custom claim attribute in this rule + const myRoleClaim = 'https://myapp.com/role'; + user.app_metadata = user.app_metadata || {}; - user.role = user.app_metadata.role; + context.accessToken[myRoleClaim] = user.app_metadata.role; callback(null, user, context); } - -.. code:: javascript - - // Example using Auth0Lock with role claim in scope - new Auth0Lock ( AUTH0_CLIENTID, AUTH0_DOMAIN, { - container: 'lock-container', - auth: { - params: { scope: 'openid role' }, - redirectUrl: FQDN + '/login', // Replace with your redirect url - responseType: 'token' - } - }) - .. _asym_keys: Asymmetric Keys From 57200320c3a783d93fd8b1b729c4cf6d8479024b Mon Sep 17 00:00:00 2001 From: Severin Ibarluzea Date: Sun, 20 Sep 2020 17:13:11 -0400 Subject: [PATCH 363/711] add postgrest-vercel and postgrest-node --- ecosystem.rst | 2 ++ 1 file changed, 2 insertions(+) diff --git a/ecosystem.rst b/ecosystem.rst index ec7f4ba24f..e775f1d8cc 100644 --- a/ecosystem.rst +++ b/ecosystem.rst @@ -39,6 +39,7 @@ Example Apps * `SMRxT/postgrest-demo `_ - multi-tenant logging system * `PierreRochard/postgrest-boilerplate `_ - example auth back-end * `marmelab/ng-admin-postgrest `_ - automatic database admin panel +* `seveibar/postgrest-vercel `_ - Run postgrest on Vercel (Serverless/AWS Lambda) .. _eco_external_notification: @@ -69,6 +70,7 @@ Extensions * `nblumoe/postgrest-oauth `_ - OAuth2 WAI middleware * `criles25/postgrest-auth `_ - email based auth/signup * `ppKrauss/PostgREST-writeAPI `_ - generate Nginx rewrite rules to fit an OpenAPI spec +* `seveibar/postgrest-node `_ - Run a postgrest server in NodeJS via an npm module .. _clientside_libraries: From 32173bed4d4b14b9acf442a82d40e5d17335f2c2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gergely=20M=C3=A9sz=C3=A1ros?= Date: Fri, 25 Sep 2020 22:32:17 +0200 Subject: [PATCH 364/711] Missing library dependency Without zlib1g-dev the build process fails. --- development.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/development.rst b/development.rst index f5d2e33882..3b1ea2774b 100644 --- a/development.rst +++ b/development.rst @@ -15,7 +15,7 @@ To help with development, you'll need to build from source. `Stack Date: Thu, 22 Oct 2020 21:49:29 +0300 Subject: [PATCH 365/711] Added aiodata --- ecosystem.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/ecosystem.rst b/ecosystem.rst index e775f1d8cc..ea18b916a3 100644 --- a/ecosystem.rst +++ b/ecosystem.rst @@ -96,6 +96,7 @@ Client-Side Libraries * `thejettdurham/postgrest-sharp-client `_ (needs maintainer) - C#, RestSharp * `team142/ng-postgrest `_ - Angular app for browsing, editing data exposed over Postgrest. * `andytango/redux-postgrest `_ - TypeScript/JS, client integrated with (React) Redux. +* `Exahilosys/aiodata `_ - Python, event-based proxy and caching client. .. _eco_commercial: From 15d5b8a292588583cfc6338bd5ddbe3946f4e063 Mon Sep 17 00:00:00 2001 From: Exahilosys Date: Sat, 24 Oct 2020 00:32:17 +0300 Subject: [PATCH 366/711] Moved aiodata to Extensions --- ecosystem.rst | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/ecosystem.rst b/ecosystem.rst index ea18b916a3..6a1f0ffddb 100644 --- a/ecosystem.rst +++ b/ecosystem.rst @@ -71,6 +71,7 @@ Extensions * `criles25/postgrest-auth `_ - email based auth/signup * `ppKrauss/PostgREST-writeAPI `_ - generate Nginx rewrite rules to fit an OpenAPI spec * `seveibar/postgrest-node `_ - Run a postgrest server in NodeJS via an npm module +* `Exahilosys/aiodata `_ - Python, event-based proxy and caching client. .. _clientside_libraries: @@ -96,8 +97,6 @@ Client-Side Libraries * `thejettdurham/postgrest-sharp-client `_ (needs maintainer) - C#, RestSharp * `team142/ng-postgrest `_ - Angular app for browsing, editing data exposed over Postgrest. * `andytango/redux-postgrest `_ - TypeScript/JS, client integrated with (React) Redux. -* `Exahilosys/aiodata `_ - Python, event-based proxy and caching client. - .. _eco_commercial: From 06dba3953f388190a89d7bdc2145013aab067d2d Mon Sep 17 00:00:00 2001 From: Wolfgang Walther Date: Fri, 23 Oct 2020 22:06:49 +0200 Subject: [PATCH 367/711] calling variadic functions --- api.rst | 39 +++++++++++++++++++++++++++++++++++++-- releases/upcoming.rst | 2 ++ 2 files changed, 39 insertions(+), 2 deletions(-) diff --git a/api.rst b/api.rst index 6fd9c4ff91..9303d95280 100644 --- a/api.rst +++ b/api.rst @@ -1215,8 +1215,6 @@ as in ``{1,2,3,4}``. Note that the curly brackets have to be urlencoded(``{`` is GET /rpc/plus_one?arr=%7B1,2,3,4%7D' HTTP/1.1 - [2,3,4,5] - .. note:: For versions prior to PostgreSQL 10, to pass a PostgreSQL native array on a POST payload, you need to quote it and use an array literal: @@ -1231,6 +1229,43 @@ as in ``{1,2,3,4}``. Note that the curly brackets have to be urlencoded(``{`` is .. _s_procs_variadic: +Calling variadic functions +-------------------------- + +You can call a variadic function by passing a json array in a POST request: + +.. code-block:: postgres + + create function plus_one(variadic v int[]) returns int[] as $$ + SELECT array_agg(n + 1) FROM unnest($1) AS n; + $$ language sql; + +.. code-block:: http + + POST /rpc/plus_one HTTP/1.1 + Content-Type: application/json + + {"v": [1,2,3,4]} + +.. code-block:: json + + [2,3,4,5] + +In a GET request, you can repeat the same parameter name: + +.. code-block:: http + + GET /rpc/plus_one?v=1&v=2&v=3&v=4 HTTP/1.1 + +Repeating also works in POST requests with ``Content-Type: application/x-www-form-urlencoded``: + +.. code-block:: http + + POST /rpc/plus_one HTTP/1.1 + Content-Type: application/x-www-form-urlencoded + + v=1&v=2&v=3&v=4 + Scalar functions ---------------- diff --git a/releases/upcoming.rst b/releases/upcoming.rst index 73a1239224..c6d9ec27d8 100644 --- a/releases/upcoming.rst +++ b/releases/upcoming.rst @@ -12,6 +12,8 @@ Added * Allow http status override through the :ref:`response.status ` GUC. |br| -- `@steve-chavez `_ +* Allow :ref:`s_procs_variadic`. + |br| -- `@wolfgangwalther `_ Fixed ----- From fbef0078d5e7772ed796b3fb729b984c0be8f3bc Mon Sep 17 00:00:00 2001 From: Francois-Guillaume Ribreau Date: Mon, 2 Nov 2020 18:37:23 +0100 Subject: [PATCH 368/711] Update index.rst - add netwo - add how to guide :) - fix my name :') --- index.rst | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/index.rst b/index.rst index 4dbbf94fb7..3e7b0b5186 100644 --- a/index.rst +++ b/index.rst @@ -161,6 +161,7 @@ These are recipes that'll help you address specific use-cases. - :doc:`how-tos/casting-type-to-custom-json` - :doc:`how-tos/embedding-table-from-another-schema` - :doc:`how-tos/providing-images-for-img` +- `How PostgreSQL triggers work when called with a PostgREST PATCH HTTP request `_ Ecosystem --------- @@ -209,6 +210,7 @@ Here are some companies that use PostgREST in production. - See how Nimbus uses PostgREST in `Paul Copplestone's blog post `_. * `Catarse `_ * `Moat `_ +* `Netwo `_ * `Redsmin `_ * `Image-charts `_ * `MotionDynamic - Fast highly dynamic video generation at scale `_ @@ -226,7 +228,7 @@ Testimonials "It's so fast to develop, it feels like cheating!" - -- François-G. Ribreau + -- François-Guillaume Ribreau "I just have to say that, the CPU/Memory usage compared to our Node.js/Waterline ORM based API is ridiculous. It's hard to even push From 9f15044e63ecbf2c91fd6e59ba932804fcb35bcb Mon Sep 17 00:00:00 2001 From: Wolfgang Walther Date: Sun, 22 Nov 2020 21:33:37 +0100 Subject: [PATCH 369/711] Add note about embedding of view-chains and the interaction with `db-extra-search-path` --- api.rst | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/api.rst b/api.rst index 9303d95280..d2119a6ea6 100644 --- a/api.rst +++ b/api.rst @@ -670,7 +670,7 @@ As an example, let's create a view called ``nominations_view`` based on the *nom FROM nominations; -Since it contains ``competition_id`` and ``film_id``—and each one has a **foreign key** defined in its source table—we can embed *competitions* and *films*: +Since it contains ``competition_id`` and ``film_id`` — and each one has a **foreign key** defined in its source table — we can embed *competitions* and *films*: .. code-block:: http @@ -697,6 +697,13 @@ It's also possible to embed `Materialized Views Date: Sun, 29 Nov 2020 00:00:35 +0100 Subject: [PATCH 370/711] Add chocolatey installation method #369 --- install.rst | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/install.rst b/install.rst index a56b0c0d0b..d365cf362e 100644 --- a/install.rst +++ b/install.rst @@ -30,10 +30,11 @@ If you use **Nix**, then you can install PostgREST from nixpkgs. nix-env -i haskellPackages.postgrest -If you use Windows, you can install PostgREST using `Scoop command-line installer `_. +If you use Windows, you can install PostgREST using `Chocolatey `_ or `Scoop `_. .. code:: bash + choco install postgrest scoop install postgrest When a pre-built binary does not exist for your system you can :ref:`build the project from source `. From b83ee94fae6a325610e869c0b546c56373a2bec8 Mon Sep 17 00:00:00 2001 From: Wolfgang Walther Date: Sun, 29 Nov 2020 12:31:28 +0100 Subject: [PATCH 371/711] Add nix-shell tools, fix circleci, resolves #322 --- .circleci/config.yml | 33 ++++++++++++ .gitignore | 1 + README.md | 15 +++--- circle.yml | 8 --- default.nix | 75 ++++++++++++++++++++------ postgrest.dict | 124 +++++++++++++++++++++---------------------- shell.nix | 16 ++++++ 7 files changed, 177 insertions(+), 95 deletions(-) create mode 100644 .circleci/config.yml delete mode 100644 circle.yml create mode 100644 shell.nix diff --git a/.circleci/config.yml b/.circleci/config.yml new file mode 100644 index 0000000000..2d7162fb6b --- /dev/null +++ b/.circleci/config.yml @@ -0,0 +1,33 @@ +version: 2.1 + +jobs: + build: + docker: + - image: nixos/nix:2.3 + steps: + - checkout + - run: + name: Install build script + command: nix-env -f default.nix -iA build + - run: + name: Build docs + command: postgrest-docs-build + + spellcheck: + docker: + - image: nixos/nix:2.3 + steps: + - checkout + - run: + name: Install spellcheck script + command: nix-env -f default.nix -iA spellcheck + - run: + name: Run spellcheck + command: postgrest-docs-spellcheck + +workflows: + check: + jobs: + - build + - spellcheck + diff --git a/.gitignore b/.gitignore index 00042c2760..4c1f956008 100644 --- a/.gitignore +++ b/.gitignore @@ -3,3 +3,4 @@ Pipfile.lock *.aux *.log diagrams/db.pdf +misspellings diff --git a/README.md b/README.md index e8a06defb8..0bf6955132 100644 --- a/README.md +++ b/README.md @@ -2,20 +2,17 @@ PostgREST docs use the reStructuredText format, check this [cheatsheet](https://github.com/ralsina/rst-cheatsheet/blob/master/rst-cheatsheet.rst) to get acquainted with it. -You can use [pipenv](https://pipenv.readthedocs.io) to build the docs locally: - -```bash - pipenv install - pipenv run python livereload_docs.py -``` - -Or if you use [nix](https://nixos.org/nix/), you can just run: +To build the docs locally, use [nix](https://nixos.org/nix/): ```bash nix-shell ``` -Both of these options will build the docs and start a livereload server on `http://localhost:5500`. +Once in the nix-shell you have the following commands available: + +- `postgrest-docs-build`: Build the docs. +- `postgrest-docs-serve`: Build the docs and start a livereload server on `http://localhost:5500`. +- `postgrest-docs-spellcheck`: Run aspell. ## Documentation structure diff --git a/circle.yml b/circle.yml deleted file mode 100644 index ae7ac312b9..0000000000 --- a/circle.yml +++ /dev/null @@ -1,8 +0,0 @@ -dependencies: - pre: - - sudo apt-get install aspell - -test: - override: - - cat *.rst | grep -v '^\(\.\.\| \)' | sed 's/`.*`//g' |aspell -d en_US -p ./postgrest.dict list | tee misspellings - - test ! -s misspellings diff --git a/default.nix b/default.nix index 9bc5b1c42e..62a18d8147 100644 --- a/default.nix +++ b/default.nix @@ -1,17 +1,60 @@ -with import (builtins.fetchGit { - url = https://github.com/NixOS/nixpkgs-channels; - ref = "nixos-18.09-small"; - rev = "95fed28ac372c61eb83c87ad97c24b0f957827bf"; -}) {}; - -stdenv.mkDerivation { - name = "postgrest-docs"; - buildInputs = [ - python36Full - python36Packages.sphinx - python36Packages.sphinx_rtd_theme - python36Packages.livereload ]; - shellHook = '' - python livereload_docs.py && exit - ''; +let + # Commit of the Nixpkgs repository that we want to use. + nixpkgsVersion = { + date = "2020-10-27"; + rev = "cd63096d6d887d689543a0b97743d28995bc9bc3"; + tarballHash = "1wg61h4gndm3vcprdcg7rc4s1v3jkm5xd7lw8r2f67w502y94gcy"; + }; + + # Nix files that describe the Nixpkgs repository. We evaluate the expression + # using `import` below. + pkgs = import + (fetchTarball { + url = "https://github.com/nixos/nixpkgs/archive/${nixpkgsVersion.rev}.tar.gz"; + sha256 = nixpkgsVersion.tarballHash; + }) + { }; + + python = pkgs.python3.withPackages (ps: [ ps.sphinx ps.sphinx_rtd_theme ps.livereload ]); +in +{ + inherit pkgs; + + build = + pkgs.writeShellScriptBin "postgrest-docs-build" + '' + set -euo pipefail + + # clean previous build, otherwise some errors might be supressed + rm -rf _build + + ${python}/bin/sphinx-build -W -b html -a -n . _build + ''; + + serve = + pkgs.writeShellScriptBin "postgrest-docs-serve" + '' + set -euo pipefail + + # livereload_docs.py needs to find "sphinx-build" + PATH=${python}/bin:$PATH + + ${python}/bin/python livereload_docs.py + ''; + + spellcheck = + pkgs.writeShellScriptBin "postgrest-docs-spellcheck" + '' + set -euo pipefail + + FILES=$(find . -type f -iname '*.rst' | tr '\n' ' ') + + cat $FILES \ + | grep -v '^\(\.\.\| \)' \ + | sed 's/`.*`//g' \ + | ${pkgs.aspell}/bin/aspell -d ${pkgs.aspellDicts.en}/lib/aspell/en_US -p ./postgrest.dict list \ + | sort -f \ + | tee misspellings + test ! -s misspellings + ''; } diff --git a/postgrest.dict b/postgrest.dict index 0faacadb5f..03dbef3d31 100644 --- a/postgrest.dict +++ b/postgrest.dict @@ -1,134 +1,134 @@ personal_ws-1.1 en 0 utf-8 AMQP -Auth -Bool -CSV -Codd -DDL -DoS -GHC -GUC -Github -Google -GraphQL -HMAC -HTTPS -HV -Haskell -Heroku -Homebrew -ILIKE -IP -JS -JSON -JWK -JWT -Kinesis -Logins -MVCC -Mithril -NGINX -Nginx -OAuth -ORM -OpenAPI -PaaS -PostGIS -PostgREST -PostgREST's -PostgreSQL -PostgreSQL's -RDS -RESTful -RLS -RSA -RabbitMQ -RestSharp -SHA -SIGUSR1 -SNS -SQL -SSL -Sencha -SuperAgent -Tcl -TypeScript -UI -Vondra -WAI -Websockets -ZeroMQ api aud +Auth auth authenticator balancer +Bool cd centric +Codd conf config cryptographically +CSV csv +DDL disjoined +DoS eq filename fts +GHC +Github +Google grantor +GraphQL gte +GUC +Haskell +Heroku +HMAC +Homebrew http +HTTPS +HV +ILIKE ilike +IP +JS +JSON json +JWK +JWT jwt +Kinesis localhost login +Logins logins lon lt lte middleware +Mithril multi +MVCC namespaced neq +NGINX +Nginx ngrep nullsfirst nullslast nxl nxr +OAuth +OpenAPI openapi +ORM ov +PaaS param params passphrase -pgSQL pgcrypto pgjwt +pgSQL phfts plfts +PostGIS +PostgreSQL +PostgreSQL's +PostgREST postgrest +PostgREST's pre +RabbitMQ +RDS reallyreallyreallyreallyverysafe refactor requester's +RESTful +RestSharp +RLS +RSA savepoint schemas +Sencha +SHA signup +SIGUSR sl +SNS sqitch +SQL sql sr +SSL startup stateful stdout +SuperAgent syslog +Tcl tsquery +TypeScript +UI +ui unicode +UPSERT +Upsert uri url urls verifier versioning +Vondra +WAI +Websockets webuser wildcard -Upsert -UPSERT -ui +ZeroMQ diff --git a/shell.nix b/shell.nix new file mode 100644 index 0000000000..37e6d7cbbf --- /dev/null +++ b/shell.nix @@ -0,0 +1,16 @@ +let + docs = + import ./default.nix; + + pkgs = + docs.pkgs; +in +pkgs.mkShell { + name = "postgrest-docs"; + + buildInputs = [ + docs.build + docs.serve + docs.spellcheck + ]; +} From 84e55970911084f0d4a16088ae7027e2c2996603 Mon Sep 17 00:00:00 2001 From: Wolfgang Walther Date: Sun, 29 Nov 2020 21:51:22 +0100 Subject: [PATCH 372/711] Add postgrest-docs-dictcheck to remove obsolete words from postgrest.dict --- default.nix | 15 +++++++++++++++ postgrest.dict | 4 ---- shell.nix | 1 + 3 files changed, 16 insertions(+), 4 deletions(-) diff --git a/default.nix b/default.nix index 62a18d8147..b422be002b 100644 --- a/default.nix +++ b/default.nix @@ -57,4 +57,19 @@ in | tee misspellings test ! -s misspellings ''; + + # dictcheck detects obsolete entries in postgrest.dict, that are not used anymore + dictcheck = + pkgs.writeShellScriptBin "postgrest-docs-dictcheck" + '' + set -euo pipefail + + FILES=$(find . -type f -iname '*.rst' | tr '\n' ' ') + + cat postgrest.dict \ + | tail -n+2 \ + | tr '\n' '\0' \ + | xargs -0 -n 1 -i \ + sh -c "grep \"{}\" $FILES > /dev/null || echo \"{}\"" + ''; } diff --git a/postgrest.dict b/postgrest.dict index 03dbef3d31..c0a0e8c82d 100644 --- a/postgrest.dict +++ b/postgrest.dict @@ -9,7 +9,6 @@ balancer Bool cd centric -Codd conf config cryptographically @@ -70,7 +69,6 @@ OpenAPI openapi ORM ov -PaaS param params passphrase @@ -108,7 +106,6 @@ SQL sql sr SSL -startup stateful stdout SuperAgent @@ -130,5 +127,4 @@ Vondra WAI Websockets webuser -wildcard ZeroMQ diff --git a/shell.nix b/shell.nix index 37e6d7cbbf..81649475d8 100644 --- a/shell.nix +++ b/shell.nix @@ -12,5 +12,6 @@ pkgs.mkShell { docs.build docs.serve docs.spellcheck + docs.dictcheck ]; } From 634a0c70b7a4cc719d298d4601e26d87b305bd83 Mon Sep 17 00:00:00 2001 From: Wolfgang Walther Date: Sun, 29 Nov 2020 23:26:06 +0100 Subject: [PATCH 373/711] Fix spelling to satisfy postgrest-docs-spellcheck --- admin.rst | 6 +-- api.rst | 50 ++++++++++---------- auth.rst | 2 +- configuration.rst | 14 +++--- development.rst | 8 ++-- ecosystem.rst | 20 ++++---- how-tos/casting-type-to-custom-json.rst | 6 +-- how-tos/providing-images-for-img.rst | 6 +-- index.rst | 2 +- install.rst | 4 +- postgrest.dict | 61 +++++++++++++++++++------ releases/upcoming.rst | 4 +- releases/v7.0.0.rst | 4 +- schema_structure.rst | 14 +++--- 14 files changed, 118 insertions(+), 83 deletions(-) diff --git a/admin.rst b/admin.rst index a272fcfbb7..d131708e45 100644 --- a/admin.rst +++ b/admin.rst @@ -145,7 +145,7 @@ The PostgREST server logs basic request information to stdout, including the req HTTP Requests ------------- -A great way to inspect incoming HTTP requests including headers and query params is to sniff the network traffic on the port where PostgREST is running. For instance on a development server bound to port 3000 on localhost, run this: +A great way to inspect incoming HTTP requests including headers and query parameters is to sniff the network traffic on the port where PostgREST is running. For instance on a development server bound to port 3000 on localhost, run this: .. code:: bash @@ -250,7 +250,7 @@ Now, whenever the structure of the database schema changes, PostgreSQL will noti Daemonizing =========== -For linux distros that use **systemd** (ubuntu, debian, archlinux) you can create a daemon in the following way. +For Linux distributions that use **systemd** (Ubuntu, Debian, Archlinux) you can create a daemon in the following way. First, create postgrest configuration in ``/etc/postgrest/config`` @@ -271,7 +271,7 @@ Then create the systemd service file in ``/etc/systemd/system/postgrest.service` .. code-block:: ini [Unit] - Description=REST API for any Postgres database + Description=REST API for any PostgreSQL database After=postgresql.service [Service] diff --git a/api.rst b/api.rst index d2119a6ea6..548c7094d1 100644 --- a/api.rst +++ b/api.rst @@ -255,7 +255,7 @@ A full-text search on the computed column: GET /people?full_name=fts.Beckett HTTP/1.1 -As mentioned, computed columns do not appear in the output by default. However you can include them by listing them in the vertical filtering :code:`select` param: +As mentioned, computed columns do not appear in the output by default. However you can include them by listing them in the vertical filtering :code:`select` parameter: .. code-block:: HTTP @@ -314,7 +314,7 @@ Here ``information.cpe`` is a column name. .. note:: - Some http libraries might encode URLs automatically(e.g. :code:`axios`). In these cases you should use double quotes + Some HTTP libraries might encode URLs automatically(e.g. :code:`axios`). In these cases you should use double quotes :code:`""` directly instead of :code:`%22`. Ordering @@ -332,7 +332,7 @@ If no direction is specified it defaults to ascending order: GET /people?order=age HTTP/1.1 -If you care where nulls are sorted, add nullsfirst or nullslast: +If you care where nulls are sorted, add ``nullsfirst`` or ``nullslast``: .. code-block:: http @@ -359,7 +359,7 @@ PostgREST uses HTTP range headers to describe the size of results. Every respons Here items zero through fourteen are returned. This information is available in every response and can help you render pagination controls on the client. This is an RFC7233-compliant solution that keeps the response JSON cleaner. -There are two ways to apply a limit and offset rows: through request headers or query params. When using headers you specify the range of rows desired. This request gets the first twenty people. +There are two ways to apply a limit and offset rows: through request headers or query parameters. When using headers you specify the range of rows desired. This request gets the first twenty people. .. code-block:: http @@ -443,7 +443,7 @@ To help with these cases, PostgREST can get the exact count up until a threshold that threshold is surpassed. To use this behavior, you can specify the ``Prefer: count=estimated`` header. The **threshold** is defined by :ref:`max-rows`. -Here's an example. Suppose we set ``max-rows=1000`` and *smalltable* has 321 rows, then we'll get the exact count: +Here's an example. Suppose we set ``max-rows=1000`` and ``smalltable`` has 321 rows, then we'll get the exact count: .. code-block:: http @@ -455,7 +455,7 @@ Here's an example. Suppose we set ``max-rows=1000`` and *smalltable* has 321 row HTTP/1.1 206 Partial Content Content-Range: 0-24/321 -If we make a similar request on *bigtable*, which has 3573458 rows, we would get the planned count: +If we make a similar request on ``bigtable``, which has 3573458 rows, we would get the planned count: .. code-block:: http @@ -481,13 +481,13 @@ Use the Accept request header to specify the acceptable format (or formats) for GET /people HTTP/1.1 Accept: application/json -The current possibilities are +The current possibilities are: -* \*/\* -* text/csv -* application/json -* application/openapi+json -* application/octet-stream +* ``*/*`` +* ``text/csv`` +* ``application/json`` +* ``application/openapi+json`` +* ``application/octet-stream`` The server will default to JSON for API endpoints and OpenAPI on the root. @@ -776,7 +776,7 @@ Embedding Disambiguation ------------------------ For doing resource embedding, PostgREST infers the relationship between two tables based on a foreign key between them. -However, in cases where there's more than one foreign key between two tables, it's not possible to infer the relationship unambiguosly +However, in cases where there's more than one foreign key between two tables, it's not possible to infer the relationship unambiguously by just specifying the tables names. Target Disambiguation @@ -850,7 +850,7 @@ Hint Disambiguation ~~~~~~~~~~~~~~~~~~~ If specifying the **target** is not enough for unambiguous embedding, you can add a **hint**. For example, let's assume we create -two VIEWs of ``addresses``: ``central_addresses`` and ``eastern_addresses``. +two views of ``addresses``: ``central_addresses`` and ``eastern_addresses``. Since PostgREST supports :ref:`embedding_views` by detecting **source foreign keys** in the views, embedding with the foreign key as the **target** will not be enough for an unambiguous embed: @@ -914,7 +914,7 @@ URL encoded payloads can be posted with ``Content-Type: application/x-www-form-u No "{ \"a\": 1, \"b\": 2 }" - Some javascript libraries will post the data incorrectly if you're not careful. For best results try one of the :ref:`clientside_libraries` built for PostgREST. + Some JavaScript libraries will post the data incorrectly if you're not careful. For best results try one of the :ref:`clientside_libraries` built for PostgREST. To update a row or rows in a table, use the PATCH verb. Use :ref:`h_filter` to specify which record(s) to update. Here is an example query setting the :code:`category` column to child for all people below a certain age. @@ -1150,7 +1150,7 @@ PostgreSQL has four procedural languages that are part of the core distribution: .. note:: - Why the `/rpc` prefix? One reason is to avoid name collisions between views and procedures. It also helps emphasize to API consumers that these functions are not normal restful things. The functions can have arbitrary and surprising behavior, not the standard "post creates a resource" thing that users expect from the other routes. + Why the ``/rpc`` prefix? One reason is to avoid name collisions between views and procedures. It also helps emphasize to API consumers that these functions are not normal restful things. The functions can have arbitrary and surprising behavior, not the standard "post creates a resource" thing that users expect from the other routes. Immutable and stable functions ------------------------------ @@ -1171,10 +1171,10 @@ Because ``add_them`` is ``IMMUTABLE``, we can alternately call the function with The function parameter names match the JSON object keys in the POST case, for the GET case they match the query parameters ``?a=1&b=2``. -Calling functions with a single json parameter +Calling functions with a single JSON parameter ---------------------------------------------- -You can also call a function that takes a single parameter of type json by sending the header :code:`Prefer: params=single-object` with your request. That way the JSON request body will be used as the single argument. +You can also call a function that takes a single parameter of type JSON by sending the header :code:`Prefer: params=single-object` with your request. That way the JSON request body will be used as the single argument. .. code-block:: plpgsql @@ -1220,7 +1220,7 @@ as in ``{1,2,3,4}``. Note that the curly brackets have to be urlencoded(``{`` is .. code-block:: http - GET /rpc/plus_one?arr=%7B1,2,3,4%7D' HTTP/1.1 + GET /rpc/plus_one?arr=%7B1,2,3,4%7D' HTTP/1.1 .. note:: @@ -1232,14 +1232,14 @@ as in ``{1,2,3,4}``. Note that the curly brackets have to be urlencoded(``{`` is { "arr": "{1,2,3,4}" } - In these versions we recommend using function parameters of type json to accept arrays from the client. + In these versions we recommend using function parameters of type JSON to accept arrays from the client. .. _s_procs_variadic: Calling variadic functions -------------------------- -You can call a variadic function by passing a json array in a POST request: +You can call a variadic function by passing a JSON array in a POST request: .. code-block:: postgres @@ -1299,7 +1299,7 @@ PostgREST will detect if the function is scalar or table-valued and will shape t Bulk Call --------- -It's possible to call a function in a bulk way, analoguosly to :ref:`bulk_insert`. To do this, you need to add the +It's possible to call a function in a bulk way, analogously to :ref:`bulk_insert`. To do this, you need to add the ``Prefer: params=multiple-objects`` header to your request. .. code-block:: http @@ -1316,7 +1316,7 @@ It's possible to call a function in a bulk way, analoguosly to :ref:`bulk_insert [ 3, 7 ] -If you have large payloads to process, it's preferrable you instead use a function with an :ref:`array parameter ` or json parameter, as this will be more efficient. +If you have large payloads to process, it's preferable you instead use a function with an :ref:`array parameter ` or JSON parameter, as this will be more efficient. It's also possible to :ref:`Specify Columns ` on functions calls. @@ -1489,7 +1489,7 @@ HTTP Logic Accessing Request Headers, Cookies and JWT claims ------------------------------------------------- -You can access request headers, cookies and jwt claims by reading GUC variables set by PostgREST per request. They are named :code:`request.header.XYZ`, :code:`request.cookie.XYZ` and :code:`request.jwt.claim.XYZ`. +You can access request headers, cookies and JWT claims by reading GUC variables set by PostgREST per request. They are named :code:`request.header.XYZ`, :code:`request.cookie.XYZ` and :code:`request.jwt.claim.XYZ`. .. code-block:: postgresql @@ -1707,7 +1707,7 @@ PostgREST translates `PostgreSQL error codes `_ - In this video series, DigitalOcean shows how to build and deploy an Nginx + PostgREST(using a managed PostgreSQL database) + Vue.js webapp in an Ubuntu server droplet. -* `PostgREST + Auth0: Create REST API in mintutes, and add social login using Auth0 `_ - A step-by-step tutorial to show how to Dockerize and integrate Auth0 to PostgREST service. +* `PostgREST + Auth0: Create REST API in mintutes, and add social login using Auth0 `_ - A step-by-step tutorial to show how to dockerize and integrate Auth0 to PostgREST service. * `PostgREST + PostGIS API tutorial in 5 minutes `_ - In this tutorial, GIS • OPS shows how to perform PostGIS calculations through PostgREST :ref:`s_procs` interface. @@ -23,10 +23,10 @@ Example Apps * `tatut/postgrest-ui `_ - ClojureScript UI components for PostgREST * `priyank-purohit/PostGUI `_ - React Material UI admin panel * `Qu4tro/pgrst-dev-setup `_ - docker-compose and tmuxp setup for experimentation. -* `subzerocloud/postgrest-starter-kit `_ - Boilerplate for new project -* `NikolayS/postgrest-google-translate `_ - Calling to external translation service +* `subzerocloud/postgrest-starter-kit `_ - boilerplate for new project +* `NikolayS/postgrest-google-translate `_ - calling to external translation service * `CodeforAustralia/heritage-near-me `_ - Elm and PostgREST with PostGIS -* `timwis/handsontable-postgrest `_ - An excel-like database table editor +* `timwis/handsontable-postgrest `_ - an excel-like database table editor * `Recmo/PostgrestSkeleton `_ - Docker Compose, PostgREST, Nginx and Auth0 * `benoror/ember-postgrest-dynamic-ui `_ - generating Ember forms to edit data * `ruslantalpa/blogdemo `_ - blog api demo in a vagrant image @@ -39,7 +39,7 @@ Example Apps * `SMRxT/postgrest-demo `_ - multi-tenant logging system * `PierreRochard/postgrest-boilerplate `_ - example auth back-end * `marmelab/ng-admin-postgrest `_ - automatic database admin panel -* `seveibar/postgrest-vercel `_ - Run postgrest on Vercel (Serverless/AWS Lambda) +* `seveibar/postgrest-vercel `_ - run PostgREST on Vercel (Serverless/AWS Lambda) .. _eco_external_notification: @@ -48,7 +48,7 @@ External Notification These are PostgreSQL bridges that propagate LISTEN/NOTIFY to external queues for further processing. This allows stored procedures to initiate actions outside the database such as sending emails. -* `vbalasu/pg-notify-webhook `_ - Trigger webhooks from postgres LISTEN/NOTIFY +* `vbalasu/pg-notify-webhook `_ - trigger webhooks from PostgreSQL's LISTEN/NOTIFY * `diogob/postgres-websockets `_ - expose web sockets for PostgreSQL's LISTEN/NOTIFY * `frafra/postgresql2websocket `_ - Websockets * `matthewmueller/pg-bridge `_ - Amazon SNS @@ -63,14 +63,14 @@ These are PostgreSQL bridges that propagate LISTEN/NOTIFY to external queues for Extensions ---------- -* `pg-safeupdate `_ - Prevent full-table updates or deletes +* `pg-safeupdate `_ - prevent full-table updates or deletes * `srid/spas `_ - allow file uploads and basic auth * `svmnotn/postgrest-auth `_ - OAuth2-inspired external auth server * `wildsurfer/postgrest-oauth-server `_ - OAuth2 server * `nblumoe/postgrest-oauth `_ - OAuth2 WAI middleware * `criles25/postgrest-auth `_ - email based auth/signup -* `ppKrauss/PostgREST-writeAPI `_ - generate Nginx rewrite rules to fit an OpenAPI spec -* `seveibar/postgrest-node `_ - Run a postgrest server in NodeJS via an npm module +* `ppKrauss/PostgREST-writeAPI `_ - generate nginx rewrite rules to fit an OpenAPI spec +* `seveibar/postgrest-node `_ - Run a PostgREST server in Node.js via npm module * `Exahilosys/aiodata `_ - Python, event-based proxy and caching client. .. _clientside_libraries: @@ -95,7 +95,7 @@ Client-Side Libraries * `clesiemo3/postgrestR `_ - R * `PierreRochard/postgrest-angular `_ - TypeScript, generate UI from API description * `thejettdurham/postgrest-sharp-client `_ (needs maintainer) - C#, RestSharp -* `team142/ng-postgrest `_ - Angular app for browsing, editing data exposed over Postgrest. +* `team142/ng-postgrest `_ - Angular app for browsing, editing data exposed over PostgREST. * `andytango/redux-postgrest `_ - TypeScript/JS, client integrated with (React) Redux. .. _eco_commercial: diff --git a/how-tos/casting-type-to-custom-json.rst b/how-tos/casting-type-to-custom-json.rst index b2b25128dc..1cc6061279 100644 --- a/how-tos/casting-type-to-custom-json.rst +++ b/how-tos/casting-type-to-custom-json.rst @@ -80,12 +80,12 @@ The result now is: } ] -You can use the same idea for creating custom CASTs for different types. +You can use the same idea for creating custom casts for different types. .. note:: - If you don't want to modify CASTs for built-in types, an option would be to `create a custom type `_ - for your own ``tsrange`` and add its own CAST. + If you don't want to modify casts for built-in types, an option would be to `create a custom type `_ + for your own ``tsrange`` and add its own cast. .. code-block:: postgres diff --git a/how-tos/providing-images-for-img.rst b/how-tos/providing-images-for-img.rst index be442287b6..a90c7939ee 100644 --- a/how-tos/providing-images-for-img.rst +++ b/how-tos/providing-images-for-img.rst @@ -1,11 +1,11 @@ .. _providing_img: -Providing images for -========================== +Providing images for ```` +============================== :author: `pkel `_ -In this how-to, you will learn how to create an endpoint for providing images to HTML :code:`` tags without client side javascript. +In this how-to, you will learn how to create an endpoint for providing images to HTML :code:`` tags without client side JavaScript. The resulting HTML might look like this: .. code-block:: html diff --git a/index.rst b/index.rst index 3e7b0b5186..65d0d54e4c 100644 --- a/index.rst +++ b/index.rst @@ -238,7 +238,7 @@ Testimonials -- Louis Brauer "I really enjoyed the fact that all of a sudden I was writing - microservices in SQL DDL (and v8 javascript functions). I dodged so + microservices in SQL DDL (and v8 JavaScript functions). I dodged so much boilerplate. The next thing I knew, we pulled out a full rewrite of a Spring+MySQL legacy app in 6 months. Literally 10x faster, and code was super concise. The old one took 3 years and a team of 4 diff --git a/install.rst b/install.rst index d365cf362e..165a4b6ee2 100644 --- a/install.rst +++ b/install.rst @@ -51,7 +51,7 @@ If you downloaded PostgREST from the release page, first extract the compressed # On Windows you should unzip the file -Now you can run postgrest with the :code:`--help` flag to see usage instructions: +Now you can run PostgREST with the :code:`--help` flag to see usage instructions: .. code-block:: bash @@ -218,7 +218,7 @@ Assuming your making modifications locally and then pushing to GitHub, it's easy 1. Create a new app on Heroku 2. In Settings add the following buildpack :code:`https://github.com/PostgREST/postgrest-heroku` 3. Add the require Config Vars in Heroku (see https://github.com/PostgREST/postgrest/blob/master/app.json#L7-L57 for more details) -4. Modify your postgrest.conf file as required to match your Config Vars in Heroku +4. Modify your ``postgrest.conf`` file as required to match your Config Vars in Heroku 5. Create your :code:`Procfile` and add :code:`./env-to-config ./postgrest postgrest.conf` 6. Push your changes to GitHub 7. Set Heroku to automatically deploy from Master and then manually deploy the branch for the first build diff --git a/postgrest.dict b/postgrest.dict index c0a0e8c82d..0d043e8058 100644 --- a/postgrest.dict +++ b/postgrest.dict @@ -1,24 +1,35 @@ personal_ws-1.1 en 0 utf-8 +Adossi AMQP api +API's +Archlinux aud Auth auth authenticator balancer -Bool +Beles +Bouscal +buildpack cd centric -conf +changelog +ClojureScript config cryptographically CSV -csv +Daemonizing DDL +DiBiase disjoined +dockerize DoS eq +Fenko +Fernandes filename +FreeBSD fts GHC Github @@ -27,23 +38,24 @@ grantor GraphQL gte GUC +Gumbs Haskell Heroku HMAC Homebrew -http HTTPS HV -ILIKE ilike +io IP JS +js JSON -json JWK JWT jwt Kinesis +Kofi localhost login Logins @@ -51,31 +63,36 @@ logins lon lt lte +macOS middleware +misprediction Mithril multi MVCC +namespace namespaced neq -NGINX -Nginx +nginx ngrep -nullsfirst -nullslast +nixpkgs +npm nxl nxr OAuth +onwards OpenAPI openapi ORM ov -param -params passphrase +Pelletier +Petr pgcrypto pgjwt pgSQL phfts +phraseto +plainto plfts PostGIS PostgreSQL @@ -84,18 +101,24 @@ PostgREST postgrest PostgREST's pre +psql +Qin RabbitMQ +Rafaj RDS reallyreallyreallyreallyverysafe +Redux refactor requester's RESTful RestSharp RLS +RPC RSA savepoint schemas Sencha +Serverless SHA signup SIGUSR @@ -108,23 +131,35 @@ sr SSL stateful stdout +Stolarz SuperAgent syslog +systemd Tcl +tmuxp +todo +todos +Tsingson tsquery TypeScript UI ui unicode +unix UPSERT -Upsert uri url urls +variadic +Vercel verifier versioning Vondra +Vue WAI +webhooks +websearch Websockets webuser +wfts ZeroMQ diff --git a/releases/upcoming.rst b/releases/upcoming.rst index c6d9ec27d8..4ef4ea9af6 100644 --- a/releases/upcoming.rst +++ b/releases/upcoming.rst @@ -10,7 +10,7 @@ These are changes yet unreleased. If you'd like to try them out before a new off Added ----- -* Allow http status override through the :ref:`response.status ` GUC. +* Allow HTTP status override through the :ref:`response.status ` GUC. |br| -- `@steve-chavez `_ * Allow :ref:`s_procs_variadic`. |br| -- `@wolfgangwalther `_ @@ -24,6 +24,6 @@ Fixed Changed ------- -* Docker images are now optimized to be built from the scratch image. This reduces the compressed image size from over 30mb to about 4mb. +* Docker images are now optimized to be built from the scratch image. This reduces the compressed image size from over 30 MB to about 4 MB. For more details, see `Docker image built with Nix `_. |br| -- `@monacoremo `_ diff --git a/releases/v7.0.0.rst b/releases/v7.0.0.rst index 57117c22f5..d725790863 100644 --- a/releases/v7.0.0.rst +++ b/releases/v7.0.0.rst @@ -5,7 +5,7 @@ v7.0.0 ====== -You can donwload this release at the `PostgREST v7.0.0 release page `_. +You can download this release at the `PostgREST v7.0.0 release page `_. Added ----- @@ -45,7 +45,7 @@ Added Fixed ----- -* Allow embedding a VIEW when its source table foreign key is UNIQUE +* Allow embedding a view when its source table foreign key is UNIQUE |br| -- `@bwbroersma `_ * ``Accept: application/vnd.pgrst.object+json`` behavior is now enforced for POST/PATCH/DELETE regardless of ``Prefer: return=minimal`` diff --git a/schema_structure.rst b/schema_structure.rst index a51d08c921..c45f30f32b 100644 --- a/schema_structure.rst +++ b/schema_structure.rst @@ -20,7 +20,7 @@ This allows you to change the internals of your schema and maintain backwards co Functions ========= -By default, when a function is created, the privilege to execute it is not restricted by role. The function access is PUBLIC—executable by all roles (more details at `PostgreSQL Privileges page `_). This is not ideal for an API schema. To disable this behavior, you can run the following SQL statement: +By default, when a function is created, the privilege to execute it is not restricted by role. The function access is ``PUBLIC`` — executable by all roles (more details at `PostgreSQL Privileges page `_). This is not ideal for an API schema. To disable this behavior, you can run the following SQL statement: .. code-block:: postgres @@ -55,7 +55,7 @@ Security definer ---------------- A function is executed with the privileges of the user who calls it. This means that the user has to have all permissions to do the operations the procedure performs. -If the function accesses private database objects, your :ref:`API roles ` won't be able to succesfully execute the function. +If the function accesses private database objects, your :ref:`API roles ` won't be able to successfully execute the function. Another option is to define the function with the :code:`SECURITY DEFINER` option. Then only one permission check will take place, the permission to call the function, and the operations in the function will have the authority of the user who owns the function itself. @@ -84,13 +84,13 @@ For changing this, we can create a non-SUPERUSER role and make this role the vie .. code-block:: postgres - CREATE ROLE api_views_owner NOINHERIT; - ALTER VIEW sample_view OWNER TO api_views_owner; + CREATE ROLE api_views_owner NOINHERIT; + ALTER VIEW sample_view OWNER TO api_views_owner; Rules ----- -Insertion on VIEWs with complex `RULEs `_ might not work out of the box with PostgREST. -It's recommended that you `use triggers instead of RULEs `_. -If you want to keep using RULEs, a workaround is to wrap the VIEW insertion in a stored procedure and call it through the :ref:`s_procs` interface. +Insertion on views with complex `rules `_ might not work out of the box with PostgREST. +It's recommended that you `use triggers instead of rules `_. +If you want to keep using rules, a workaround is to wrap the view insertion in a stored procedure and call it through the :ref:`s_procs` interface. For more details, see this `github issue `_. From 881170b9ff7aadb2ad57bd3d49a9035b4e8d9751 Mon Sep 17 00:00:00 2001 From: Wolfgang Walther Date: Sun, 29 Nov 2020 23:42:08 +0100 Subject: [PATCH 374/711] Fix build warnings to satisfy postgrest-docs-build --- auth.rst | 24 +++++++++++++----------- conf.py | 2 +- install.rst | 4 ++-- 3 files changed, 16 insertions(+), 14 deletions(-) diff --git a/auth.rst b/auth.rst index e67fc3a628..99a29c1f30 100644 --- a/auth.rst +++ b/auth.rst @@ -208,20 +208,22 @@ To use Auth0, create `an application `_ for .. note:: -Our code requires a database role in the JWT. To add it you need to save the database role in Auth0 `app metadata `_. Then, you will need to write `a rule `_ that will extract the role from the user's app_metadata and set it as a `custom claim `_ in the access token. Note that, you may use Auth0's `core authorization feature `_ for more complex use cases. Metadata solution is mentioned here for simplicity. + Our code requires a database role in the JWT. To add it you need to save the database role in Auth0 `app metadata `_. Then, you will need to write `a rule `_ that will extract the role from the user's app_metadata and set it as a `custom claim `_ in the access token. Note that, you may use Auth0's `core authorization feature `_ for more complex use cases. Metadata solution is mentioned here for simplicity. -.. code:: javascript + .. code:: javascript - function (user, context, callback) { + function (user, context, callback) { - // Follow the documentations at http://postgrest.org/en/v7.0.0/configuration.html#role-claim-key - // to set a custom role claim on PostgREST and use it as custom claim attribute in this rule - const myRoleClaim = 'https://myapp.com/role'; - - user.app_metadata = user.app_metadata || {}; - context.accessToken[myRoleClaim] = user.app_metadata.role; - callback(null, user, context); - } + // Follow the documentations at + // http://postgrest.org/en/latest/configuration.html#role-claim-key + // to set a custom role claim on PostgREST + // and use it as custom claim attribute in this rule + const myRoleClaim = 'https://myapp.com/role'; + + user.app_metadata = user.app_metadata || {}; + context.accessToken[myRoleClaim] = user.app_metadata.role; + callback(null, user, context); + } .. _asym_keys: diff --git a/conf.py b/conf.py index 67fba70416..29f4382cb4 100644 --- a/conf.py +++ b/conf.py @@ -288,4 +288,4 @@ # -- Custom setup --------------------------------------------------------- def setup(app): - app.add_stylesheet('css/custom.css') + app.add_css_file('css/custom.css') diff --git a/install.rst b/install.rst index 165a4b6ee2..9b4756abd3 100644 --- a/install.rst +++ b/install.rst @@ -18,7 +18,7 @@ If you use **FreeBSD**, then you can install PostgREST from the `official ports pkg install hs-postgrest -If you use **Arch Linux**, then you can install PostgREST from the `official repo `_. +If you use **Arch Linux**, then you can install PostgREST from the `community repo `_. .. code:: bash @@ -40,7 +40,7 @@ If you use Windows, you can install PostgREST using `Chocolatey `. Running -~~~~~~~ +------- If you downloaded PostgREST from the release page, first extract the compressed file to obtain the executable. From d6caa5dae99cdf42fdf5c1c09366f2294d5546c6 Mon Sep 17 00:00:00 2001 From: Wolfgang Walther Date: Sun, 29 Nov 2020 13:18:18 +0100 Subject: [PATCH 375/711] make docs full-width, resolves #351 --- _static/css/custom.css | 16 ++++++++++++++-- index.rst | 3 +++ 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/_static/css/custom.css b/_static/css/custom.css index 50359ce055..cd52bc8483 100644 --- a/_static/css/custom.css +++ b/_static/css/custom.css @@ -1,3 +1,15 @@ +.wy-nav-content { + max-width: initial; +} + +#postgrest-documentation { + max-width: 800px; +} + +#postgrest-documentation > h1 { + display: none; +} + div.wy-menu.rst-pro { display: none !important; } @@ -10,11 +22,11 @@ div.line-block { margin-bottom: 0px !important; } -#sponsors{ +#sponsors { text-align: center; } -#sponsors h1{ +#sponsors h2 { text-align: left; } diff --git a/index.rst b/index.rst index 65d0d54e4c..8bd6b3ec0f 100644 --- a/index.rst +++ b/index.rst @@ -1,5 +1,8 @@ .. title:: PostgREST Documentation +PostgREST Documentation +======================= + .. figure:: _static/logo.png .. image:: https://img.shields.io/github/stars/postgrest/postgrest.svg?style=social From b0ba2f709cd7f0fb055423c7afad96a9b95cc32e Mon Sep 17 00:00:00 2001 From: Wolfgang Walther Date: Mon, 30 Nov 2020 19:38:15 +0100 Subject: [PATCH 376/711] remove Makefile and Pipfile --- Makefile | 230 ------------------------------------------------------- Pipfile | 14 ---- 2 files changed, 244 deletions(-) delete mode 100644 Makefile delete mode 100644 Pipfile diff --git a/Makefile b/Makefile deleted file mode 100644 index b739a52fff..0000000000 --- a/Makefile +++ /dev/null @@ -1,230 +0,0 @@ -# Makefile for Sphinx documentation -# - -# You can set these variables from the command line. -SPHINXOPTS = -SPHINXBUILD = sphinx-build -PAPER = -BUILDDIR = _build - -# User-friendly check for sphinx-build -ifeq ($(shell which $(SPHINXBUILD) >/dev/null 2>&1; echo $$?), 1) - $(error The '$(SPHINXBUILD)' command was not found. Make sure you have Sphinx installed, then set the SPHINXBUILD environment variable to point to the full path of the '$(SPHINXBUILD)' executable. Alternatively you can add the directory with the executable to your PATH. If you don\'t have Sphinx installed, grab it from http://sphinx-doc.org/) -endif - -# Internal variables. -PAPEROPT_a4 = -D latex_paper_size=a4 -PAPEROPT_letter = -D latex_paper_size=letter -ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . -# the i18n builder cannot share the environment and doctrees with the others -I18NSPHINXOPTS = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . - -.PHONY: help -help: - @echo "Please use \`make ' where is one of" - @echo " html to make standalone HTML files" - @echo " dirhtml to make HTML files named index.html in directories" - @echo " singlehtml to make a single large HTML file" - @echo " pickle to make pickle files" - @echo " json to make JSON files" - @echo " htmlhelp to make HTML files and a HTML help project" - @echo " qthelp to make HTML files and a qthelp project" - @echo " applehelp to make an Apple Help Book" - @echo " devhelp to make HTML files and a Devhelp project" - @echo " epub to make an epub" - @echo " epub3 to make an epub3" - @echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter" - @echo " latexpdf to make LaTeX files and run them through pdflatex" - @echo " latexpdfja to make LaTeX files and run them through platex/dvipdfmx" - @echo " text to make text files" - @echo " man to make manual pages" - @echo " texinfo to make Texinfo files" - @echo " info to make Texinfo files and run them through makeinfo" - @echo " gettext to make PO message catalogs" - @echo " changes to make an overview of all changed/added/deprecated items" - @echo " xml to make Docutils-native XML files" - @echo " pseudoxml to make pseudoxml-XML files for display purposes" - @echo " linkcheck to check all external links for integrity" - @echo " doctest to run all doctests embedded in the documentation (if enabled)" - @echo " coverage to run coverage check of the documentation (if enabled)" - @echo " dummy to check syntax errors of document sources" - -.PHONY: clean -clean: - rm -rf $(BUILDDIR)/* - -.PHONY: html -html: - $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html - @echo - @echo "Build finished. The HTML pages are in $(BUILDDIR)/html." - -.PHONY: dirhtml -dirhtml: - $(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml - @echo - @echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml." - -.PHONY: singlehtml -singlehtml: - $(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml - @echo - @echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml." - -.PHONY: pickle -pickle: - $(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle - @echo - @echo "Build finished; now you can process the pickle files." - -.PHONY: json -json: - $(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json - @echo - @echo "Build finished; now you can process the JSON files." - -.PHONY: htmlhelp -htmlhelp: - $(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp - @echo - @echo "Build finished; now you can run HTML Help Workshop with the" \ - ".hhp project file in $(BUILDDIR)/htmlhelp." - -.PHONY: qthelp -qthelp: - $(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp - @echo - @echo "Build finished; now you can run "qcollectiongenerator" with the" \ - ".qhcp project file in $(BUILDDIR)/qthelp, like this:" - @echo "# qcollectiongenerator $(BUILDDIR)/qthelp/PostgREST.qhcp" - @echo "To view the help file:" - @echo "# assistant -collectionFile $(BUILDDIR)/qthelp/PostgREST.qhc" - -.PHONY: applehelp -applehelp: - $(SPHINXBUILD) -b applehelp $(ALLSPHINXOPTS) $(BUILDDIR)/applehelp - @echo - @echo "Build finished. The help book is in $(BUILDDIR)/applehelp." - @echo "N.B. You won't be able to view it unless you put it in" \ - "~/Library/Documentation/Help or install it in your application" \ - "bundle." - -.PHONY: devhelp -devhelp: - $(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp - @echo - @echo "Build finished." - @echo "To view the help file:" - @echo "# mkdir -p $$HOME/.local/share/devhelp/PostgREST" - @echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/PostgREST" - @echo "# devhelp" - -.PHONY: epub -epub: - $(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub - @echo - @echo "Build finished. The epub file is in $(BUILDDIR)/epub." - -.PHONY: epub3 -epub3: - $(SPHINXBUILD) -b epub3 $(ALLSPHINXOPTS) $(BUILDDIR)/epub3 - @echo - @echo "Build finished. The epub3 file is in $(BUILDDIR)/epub3." - -.PHONY: latex -latex: - $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex - @echo - @echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex." - @echo "Run \`make' in that directory to run these through (pdf)latex" \ - "(use \`make latexpdf' here to do that automatically)." - -.PHONY: latexpdf -latexpdf: - $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex - @echo "Running LaTeX files through pdflatex..." - $(MAKE) -C $(BUILDDIR)/latex all-pdf - @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex." - -.PHONY: latexpdfja -latexpdfja: - $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex - @echo "Running LaTeX files through platex and dvipdfmx..." - $(MAKE) -C $(BUILDDIR)/latex all-pdf-ja - @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex." - -.PHONY: text -text: - $(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text - @echo - @echo "Build finished. The text files are in $(BUILDDIR)/text." - -.PHONY: man -man: - $(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man - @echo - @echo "Build finished. The manual pages are in $(BUILDDIR)/man." - -.PHONY: texinfo -texinfo: - $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo - @echo - @echo "Build finished. The Texinfo files are in $(BUILDDIR)/texinfo." - @echo "Run \`make' in that directory to run these through makeinfo" \ - "(use \`make info' here to do that automatically)." - -.PHONY: info -info: - $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo - @echo "Running Texinfo files through makeinfo..." - make -C $(BUILDDIR)/texinfo info - @echo "makeinfo finished; the Info files are in $(BUILDDIR)/texinfo." - -.PHONY: gettext -gettext: - $(SPHINXBUILD) -b gettext $(I18NSPHINXOPTS) $(BUILDDIR)/locale - @echo - @echo "Build finished. The message catalogs are in $(BUILDDIR)/locale." - -.PHONY: changes -changes: - $(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes - @echo - @echo "The overview file is in $(BUILDDIR)/changes." - -.PHONY: linkcheck -linkcheck: - $(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck - @echo - @echo "Link check complete; look for any errors in the above output " \ - "or in $(BUILDDIR)/linkcheck/output.txt." - -.PHONY: doctest -doctest: - $(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest - @echo "Testing of doctests in the sources finished, look at the " \ - "results in $(BUILDDIR)/doctest/output.txt." - -.PHONY: coverage -coverage: - $(SPHINXBUILD) -b coverage $(ALLSPHINXOPTS) $(BUILDDIR)/coverage - @echo "Testing of coverage in the sources finished, look at the " \ - "results in $(BUILDDIR)/coverage/python.txt." - -.PHONY: xml -xml: - $(SPHINXBUILD) -b xml $(ALLSPHINXOPTS) $(BUILDDIR)/xml - @echo - @echo "Build finished. The XML files are in $(BUILDDIR)/xml." - -.PHONY: pseudoxml -pseudoxml: - $(SPHINXBUILD) -b pseudoxml $(ALLSPHINXOPTS) $(BUILDDIR)/pseudoxml - @echo - @echo "Build finished. The pseudo-XML files are in $(BUILDDIR)/pseudoxml." - -.PHONY: dummy -dummy: - $(SPHINXBUILD) -b dummy $(ALLSPHINXOPTS) $(BUILDDIR)/dummy - @echo - @echo "Build finished. Dummy builder generates no files." diff --git a/Pipfile b/Pipfile deleted file mode 100644 index 52ea333a4d..0000000000 --- a/Pipfile +++ /dev/null @@ -1,14 +0,0 @@ -[[source]] -url = "https://pypi.org/simple" -verify_ssl = true -name = "pypi" - -[packages] -sphinx = "*" -sphinx-rtd-theme = "*" -livereload = "*" - -[dev-packages] - -[requires] -python_version = "3.6" From a4fe838308774853038e9136c64ead56712c5a79 Mon Sep 17 00:00:00 2001 From: Joshua Taillon Date: Tue, 8 Dec 2020 12:58:25 -0700 Subject: [PATCH 377/711] Fix outdated environment variable for docker compose Also removed a deprecated `links` setting from the docker-compose, since that's not needed any more --- install.rst | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/install.rst b/install.rst index 9b4756abd3..6e71745a73 100644 --- a/install.rst +++ b/install.rst @@ -172,13 +172,11 @@ To avoid having to install the database at all, you can run both it and the serv image: postgrest/postgrest ports: - "3000:3000" - links: - - db:db environment: PGRST_DB_URI: postgres://app_user:password@db:5432/app_db PGRST_DB_SCHEMA: public PGRST_DB_ANON_ROLE: app_user #In production this role should not be the same as the one used for the connection - PGRST_SERVER_PROXY_URI: "http://127.0.0.1:3000" + PGRST_OPENAPI_SERVER_PROXY_URI: "http://127.0.0.1:3000" depends_on: - db db: From c3ad07fcc0b93f5a952d85bdac0d3e1e24e5b141 Mon Sep 17 00:00:00 2001 From: Gurjeet Singh Date: Sun, 27 Dec 2020 03:42:54 -0800 Subject: [PATCH 378/711] Minor grammar fix --- install.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install.rst b/install.rst index 6e71745a73..88595fe822 100644 --- a/install.rst +++ b/install.rst @@ -211,7 +211,7 @@ With this you can see the swagger-ui in your browser on port 8080. Deploying to Heroku =================== -Assuming your making modifications locally and then pushing to GitHub, it's easy to deploy to Heroku. +Assuming you're making modifications locally and then pushing to GitHub, it's easy to deploy to Heroku. 1. Create a new app on Heroku 2. In Settings add the following buildpack :code:`https://github.com/PostgREST/postgrest-heroku` From 89942601e470a7fe8fd46c3888796aef94fa190d Mon Sep 17 00:00:00 2001 From: Max H <36088096+rxt30@users.noreply.github.com> Date: Thu, 21 Jan 2021 08:33:58 +0100 Subject: [PATCH 379/711] Fix headline numbering in tutorial 1 --- tutorials/tut1.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tutorials/tut1.rst b/tutorials/tut1.rst index e9fe78f547..fa89591f34 100644 --- a/tutorials/tut1.rst +++ b/tutorials/tut1.rst @@ -122,7 +122,7 @@ A request for the todos shows three of them, and all completed. } ] -Step 4. Add Expiration +Step 5. Add Expiration ---------------------- Currently our authentication token is valid for all eternity. The server, as long as it continues using the same JWT password, will honor the token. From 5728bbc4b9235e96397badb79bb205e256b55c87 Mon Sep 17 00:00:00 2001 From: Copple <10214025+kiwicopple@users.noreply.github.com> Date: Thu, 18 Feb 2021 22:16:19 +0800 Subject: [PATCH 380/711] Add Supabase to In Production and client libraries (#389) --- ecosystem.rst | 7 ++++++- index.rst | 1 + 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/ecosystem.rst b/ecosystem.rst index c9ed9956de..53c0f399b4 100644 --- a/ecosystem.rst +++ b/ecosystem.rst @@ -78,9 +78,14 @@ Extensions Client-Side Libraries --------------------- +* `supabase/postgrest-js `_ - TypeScript/JavaScript * `supabase/postgrest-rs `_ - Rust +* `supabase/postgrest-dart `_ - Dart +* `supabase/postgrest-py `_ - Python +* `supabase/postgrest-csharp `_ - C# +* `supabase/postgrest-kt `_ - Kotlin +* `supabase/postgrest-swift `_ - Swift * `technowledgy/vue-postgrest `_ - Vue.js -* `supabase/postgrest-js `_ - Isomorphic JS client * `SocialGouv/postgrester `_ - JS + Typescript * `Kong/py-postgrest `_ - Python * `datrium/postgrest-pyclient `_ - Python diff --git a/index.rst b/index.rst index 8bd6b3ec0f..e779e54943 100644 --- a/index.rst +++ b/index.rst @@ -209,6 +209,7 @@ Here are some companies that use PostgREST in production. * `Sompani `_ * `Datrium `_ +* `Supabase `_ * `Nimbus `_ - See how Nimbus uses PostgREST in `Paul Copplestone's blog post `_. * `Catarse `_ From 82e9895e1f9bda736fa51fd54474b35446e6058e Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Thu, 25 Feb 2021 18:19:51 -0500 Subject: [PATCH 381/711] Update CYBERTEC logo and url --- _static/cybertec-new.png | Bin 0 -> 353666 bytes index.rst | 4 ++-- 2 files changed, 2 insertions(+), 2 deletions(-) create mode 100644 _static/cybertec-new.png diff --git a/_static/cybertec-new.png b/_static/cybertec-new.png new file mode 100644 index 0000000000000000000000000000000000000000..15ec8d4abc8c836e902c9f098b925939c91974ff GIT binary patch literal 353666 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

    - OS X + macOS
    brew install postgresql
    @@ -172,6 +190,10 @@ Now run the server: .. code-block:: bash + # Running postgrest installed from a package manager + postgrest tutorial.conf + + # Running postgrest binary ./postgrest tutorial.conf You should see diff --git a/postgrest.dict b/postgrest.dict index e474ac329c..c2e6690f8d 100644 --- a/postgrest.dict +++ b/postgrest.dict @@ -80,6 +80,7 @@ logins lon lt lte +macOS misprediction multi namespace From d15e357d2e4d632aa764f1c805c373e98bce76ba Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Wed, 29 Nov 2023 14:00:07 -0500 Subject: [PATCH 683/711] reference: media type handlers --- docs/how-tos/create-soap-endpoint.rst | 24 +- .../providing-html-content-using-htmx.rst | 2 +- docs/how-tos/providing-images-for-img.rst | 46 +++- .../working-with-postgresql-data-types.rst | 23 +- docs/references/api.rst | 1 + docs/references/api/media_type_handlers.rst | 252 ++++++++++++++++-- .../api/resource_representation.rst | 111 +++----- docs/references/api/stored_procedures.rst | 6 +- docs/references/configuration.rst | 24 -- docs/references/errors.rst | 4 - docs/references/transactions.rst | 2 +- postgrest.dict | 2 - 12 files changed, 334 insertions(+), 163 deletions(-) diff --git a/docs/how-tos/create-soap-endpoint.rst b/docs/how-tos/create-soap-endpoint.rst index 62f0d0412b..8114d7cecb 100644 --- a/docs/how-tos/create-soap-endpoint.rst +++ b/docs/how-tos/create-soap-endpoint.rst @@ -5,22 +5,20 @@ Create a SOAP endpoint :author: `fjf2002 `_ -PostgREST now has XML support. With a bit of work, SOAP endpoints become possible. - -Please note that PostgREST supports just ``text/xml`` MIME type in request/response headers ``Content-Type`` and ``Accept``. -If you have to use other MIME types such as ``application/soap+xml``, you could manipulate the headers in your reverse proxy. - - +PostgREST supports :ref:`custom_media`. With a bit of work, SOAP endpoints become possible. Minimal Example --------------- + This example will simply return the request body, inside a tag ``therequestbodywas``. Add the following function to your PostgreSQL database: .. code-block:: postgres - CREATE OR REPLACE FUNCTION my_soap_endpoint(xml) RETURNS xml AS $$ + create domain "text/xml" as pg_catalog.xml; + + CREATE OR REPLACE FUNCTION my_soap_endpoint(xml) RETURNS "text/xml" AS $$ DECLARE nsarray CONSTANT text[][] := ARRAY[ ARRAY['soapenv', 'http://schemas.xmlsoap.org/soap/envelope/'] @@ -121,7 +119,7 @@ potentially disclosing internals to the client, but instead handle the errors di xmlelement(NAME "soapenv:Body", body) ); $function$; - + -- helper function CREATE OR REPLACE FUNCTION _soap_exception( faultcode text, @@ -137,9 +135,9 @@ potentially disclosing internals to the client, but instead handle the errors di ) ); $function$; - + CREATE OR REPLACE FUNCTION fraction_to_decimal(xml) - RETURNS xml + RETURNS "text/xml" LANGUAGE plpgsql AS $function$ DECLARE @@ -207,14 +205,14 @@ The output should roughly look like: - References ---------- + For more information concerning PostgREST, cf. - :ref:`s_proc_single_unnamed` -- :ref:`scalar_return_formats` -- :ref:`Nginx reverse proxy ` +- :ref:`custom_media`. See :ref:`any_handler`, if you need to support an ``application/soap+xml`` media type. +- :ref:`Nginx reverse proxy ` For SOAP reference, visit diff --git a/docs/how-tos/providing-html-content-using-htmx.rst b/docs/how-tos/providing-html-content-using-htmx.rst index 82db9e7ecf..d871c205bf 100644 --- a/docs/how-tos/providing-html-content-using-htmx.rst +++ b/docs/how-tos/providing-html-content-using-htmx.rst @@ -23,7 +23,7 @@ To simplify things, we won't be using authentication, so grant all permissions o grant all on api.todos to web_anon; grant usage, select on sequence api.todos_id_seq to web_anon; -Next, add the ``text/html`` media type as a DOMAIN. With this, PostgREST can identify the request made by your web browser (with the ``Accept: text/html`` header) +Next, add the ``text/html`` as a :ref:`custom_media`. With this, PostgREST can identify the request made by your web browser (with the ``Accept: text/html`` header) and return a raw HTML document file. .. code-block:: postgres diff --git a/docs/how-tos/providing-images-for-img.rst b/docs/how-tos/providing-images-for-img.rst index f1d892e0d6..69a97d12dc 100644 --- a/docs/how-tos/providing-images-for-img.rst +++ b/docs/how-tos/providing-images-for-img.rst @@ -26,18 +26,42 @@ First, we need a public table for storing the files. , blob bytea ); -Let's assume this table contains an image of two cute kittens with id 42. -We can retrieve this image in binary format from our PostgREST API by requesting :code:`/files?select=blob&id=eq.42` with the :code:`Accept: application/octet-stream` header. -Unfortunately, putting the URL into the :code:`src` of an :code:`` tag will not work. -That's because browsers do not send the required :code:`Accept: application/octet-stream` header. +Let's assume this table contains an image of two cute kittens with id 42. We can retrieve this image in binary format from our PostgREST API by using :ref:`custom_media`: + +.. code-block:: postgres + + create domain "application/octet-stream" as bytea; + + create or replace function file(id int) returns "application/octet-stream" as $$ + select blob from files where id = file.id; + $$ language sql; + +Now we can request the RPC endpoint :code:`/rpc/file?id=42` with the :code:`Accept: application/octet-stream` header. + + +.. code-block:: bash + + curl "localhost:3000/rpc/file?id=42" -H "Accept: application/octet-stream" + + +Unfortunately, putting the URL into the :code:`src` of an :code:`` tag will not work. That's because browsers do not send the required :code:`Accept: application/octet-stream` header. +Instead, the :code:`Accept: image/webp` header is sent by many web browsers by default. + +Luckily we can change the accepted media type in the function like so: + +.. code-block:: postgres + + create domain "image/webp" as bytea; + + create or replace function file(id int) returns "image/webp" as $$ + select blob from files where id = file.id; + $$ language sql; -Luckily we can specify the accepted media types in the :ref:`raw-media-types` configuration variable. -In this case, the :code:`Accept: image/webp` header is sent by many web browsers by default, so let's add it to the configuration variable, like this: :code:`raw-media-types="image/webp"`. Now, the image will be displayed in the HTML page: .. code-block:: html - Cute Kittens + Cute Kittens Improved Version ---------------- @@ -60,13 +84,15 @@ First, in addition to the minimal example, we need to store the media types and add column type text, add column name text; -Next, we set up an RPC endpoint that sets the content type and filename. +Next, we set modify the function to set the content type and filename. We use this opportunity to configure some basic, client-side caching. For production, you probably want to configure additional caches, e.g. on the :ref:`reverse proxy `. .. code-block:: postgres - create function file(id int) returns bytea as + create domain "*/*" as bytea; + + create function file(id int) returns "*/*" as $$ declare headers text; declare blob bytea; @@ -79,7 +105,7 @@ For production, you probably want to configure additional caches, e.g. on the :r from files where files.id = file.id into headers; perform set_config('response.headers', headers, true); select files.blob from files where files.id = file.id into blob; - if found + if FOUND -- special var, see https://www.postgresql.org/docs/current/plpgsql-statements.html#PLPGSQL-STATEMENTS-DIAGNOSTICS then return(blob); else raise sqlstate 'PT404' using message = 'NOT FOUND', diff --git a/docs/how-tos/working-with-postgresql-data-types.rst b/docs/how-tos/working-with-postgresql-data-types.rst index 6506650785..3c6a90ebaa 100644 --- a/docs/how-tos/working-with-postgresql-data-types.rst +++ b/docs/how-tos/working-with-postgresql-data-types.rst @@ -506,33 +506,26 @@ Now, to send the file ``postgrest-logo.png`` we need to set the ``Content-Type: -X POST -H "Content-Type: application/octet-stream" \ --data-binary "@postgrest-logo.png" -To get the image from the database, set the ``Accept: application/octet-stream`` header and select only the -``bytea`` type column. +To get the image from the database, use :ref:`custom_media` like so: -.. tabs:: - - .. code-tab:: http - - GET /files?select=file&id=eq.1 HTTP/1.1 - Accept: application/octet-stream - - .. code-tab:: bash Curl +.. code-block:: postgres - curl "http://localhost:3000/files?select=file&id=eq.1" \ - -H "Accept: application/octet-stream" + create domain "image/png" as bytea; -Use more accurate headers according to the type of the files by using the :ref:`raw-media-types` configuration. For example, adding the ``raw-media-types="image/png"`` setting to the configuration file will allow you to use the ``Accept: image/png`` header: + create or replace get_image(id int) returns "image/png" as $$ + select file from files where id = $1; + $$ language sql; .. tabs:: .. code-tab:: http - GET /files?select=file&id=eq.1 HTTP/1.1 + GET /get_image?id=1 HTTP/1.1 Accept: image/png .. code-tab:: bash Curl - curl "http://localhost:3000/files?select=file&id=eq.1" \ + curl "http://localhost:3000/get_image?id=1" \ -H "Accept: image/png" See :ref:`providing_img` for a step-by-step example on how to handle images in HTML. diff --git a/docs/references/api.rst b/docs/references/api.rst index 43e2e83c73..1b3f08cd10 100644 --- a/docs/references/api.rst +++ b/docs/references/api.rst @@ -16,6 +16,7 @@ PostgREST exposes three database objects of a schema as resources: tables, views api/domain_representations.rst api/resource_embedding.rst api/resource_representation.rst + api/media_type_handlers.rst api/openapi.rst api/preferences.rst api/* diff --git a/docs/references/api/media_type_handlers.rst b/docs/references/api/media_type_handlers.rst index 7eb1e69f51..90bff1b6a2 100644 --- a/docs/references/api/media_type_handlers.rst +++ b/docs/references/api/media_type_handlers.rst @@ -1,29 +1,245 @@ +.. _custom_media: + Media Type Handlers ################### -PostgREST offers builtin handlers for common media types such as ``application/json`` and ``text/csv``. You can add handlers for other media types or override the builtin handlers. +Media Type Handlers allows PostgREST to deliver custom media types. These handlers extend the :ref:`builtin ones ` and can also override them. + +Media types are expressed as type aliases using `domains `_ and their name must comply to `RFC 6838 requirements `_. + +.. code-block:: postgres + + CREATE DOMAIN "application/json" AS json; + +By using these domains as return types: + +- Of :ref:`Functions `, these will turn into handlers. + +- Of `Aggregates `_ transition or final functions, these will serve as handlers for :ref:`tables_views` and :ref:`table_functions`. + +.. note:: + + PostgREST vendor media types (``application/vnd.pgrst.plan``, ``application/vnd.pgrst.object`` and ``application/vnd.pgrst.array``) cannot be overriden in this way. + +Handler Function +================ + +As an example, let's obtain the `TWKB `_ compressed binary format for a PostGIS geometry. + +.. code-block:: postgres + + create extension postgis; + + create table lines ( + id int primary key + , name text + , geom geometry(LINESTRING, 4326) + ); + + insert into lines values (1, 'line-1', 'LINESTRING(1 1,5 5)'::extensions.geometry), (2, 'line-2', 'LINESTRING(2 2,6 6)'::extensions.geometry); + +For this you can create a vendor media type and use it as a return type on a function. + +.. code-block:: postgres + + create domain "application/vnd.twkb" as bytea; + + create or replace function get_line (id int) + returns "application/vnd.twkb" as $$ + select st_astwkb(geom) from lines where id = get_line.id; + $$ language sql; + +.. note:: + + For PostgreSQL <= 12, you'll need a cast on the function body :code:`st_astwkb(geom)::"application/vnd.twkb"`. + +Now you can request the ``TWKB`` output like so: + +.. code-block:: bash + + curl 'localhost:3000/rpc/get_line?id=1' -H "Accept: application/vnd.twkb" -i + + HTTP/1.1 200 OK + Content-Type: application/vnd.twkb + + # binary output + +Note that PostgREST will automatically set the ``Content-Type`` to ``application/vnd.twkb``. + +Handlers for Tables/Views +========================= + +To benefit from a compressed format like ``TWKB``, it makes more sense to obtain many rows instead of one. Let's allow that by adding a handler for the table. You'll need an aggregate: + +.. code-block:: postgres + + create or replace function twkb_handler_transition (state bytea, next lines) + returns "application/vnd.twkb" as $$ + select state || st_astwkb(next.geom); + $$ language sql; + + create or replace aggregate twkb_agg (lines) ( + initcond = '' + , stype = "application/vnd.twkb" + , sfunc = twkb_handler_transition + ); + + -- quick test + -- SELECT twkb_agg(l) from lines l; + -- twkb_agg + ------------------------------------------------------------------ + -- \xa20002c09a0cc09a0c80ea3080ea30a2000280b51880b51880ea3080ea30 + --(1 row) + +Now you can request the table endpoint with the ``twkb`` media type: + +.. code-block:: bash + + curl 'localhost:3000/lines' -H "Accept: application/vnd.twkb" -i + + HTTP/1.1 200 OK + Content-Type: application/vnd.twkb + + # binary output + +If you have a table-valued function returning the same table type, the handler can also act upon on it. + +.. code-block:: postgres + + create or replace function get_lines () + returns setof lines as $$ + select * from lines; + $$ language sql; + +.. code-block:: bash + + curl 'localhost:3000/get_lines' -H "Accept: application/vnd.twkb" -i + + HTTP/1.1 200 OK + Content-Type: application/vnd.twkb + + # binary output + +Overriding a Builtin Handler +============================ + +Let's override the existing ``text/csv`` handler for the table to provide a more complex CSV output. +It'll include a `Byte order mark `_ plus a ``Content-Disposition`` header to set a name for the downloaded file. + +.. code-block:: postgres + + create domain "text/csv" as text; + + create or replace function bom_csv_trans (state text, next lines) + returns "text/csv" as $$ + select state || next.id::text || ',' || next.name || ',' || next.geom::text || E'\n'; + $$ language sql; + + create or replace function bom_csv_final (data "text/csv") + returns "text/csv" as $$ + -- set the Content-Disposition header + select set_config('response.headers', '[{"Content-Disposition": "attachment; filename=\"lines.csv\""}]', true); + select + -- EFBBBF is the BOM in UTF8 https://en.wikipedia.org/wiki/Byte_order_mark#UTF-8 + convert_from (decode (E'EFBBBF', 'hex'),'UTF8') || + -- the header for the CSV + (E'id,name,geom\n' || data); + $$ language sql; + + drop aggregate if exists bom_csv_agg(lines); + create aggregate bom_csv_agg (lines) ( + initcond = '' + , stype = "text/csv" + , sfunc = bom_csv_trans + , finalfunc = bom_csv_final + ); + +You can now request it like: + +.. code-block:: bash + + curl 'localhost:3000/lines' -H "Accept: text/csv" -i + + HTTP/1.1 200 OK + Content-Type: text/csv + Content-Disposition: attachment; filename="lines.csv" + + id,name,geom + 1,line-1,0102000020E610000002000000000000000000F03F000000000000F03F00000000000014400000000000001440 + 2,line-2,0102000020E6100000020000000000000000000040000000000000004000000000000018400000000000001840 + +.. _any_handler: + +The "Any" Handler +================= + +For more flexibility, you can also define a catch-all handler by using a domain named ``*/*`` (any media type). This will respond to all media types and even to requests that don't include an ``Accept`` header. + +Note that this will take priority over all other handlers (builtin or custom), so it's better to do it for an isolated function or view. + +Let's define an any handler for a view that will always respond with ``XML`` output. It will accept ``text/xml``, ``application/xml``, ``*/*`` and reject other media types. + +.. code-block:: postgres + + create domain "*/*" as pg_catalog.xml; + + create view "lines.xml" as + select * from lines; + + create or replace function lines_xml_trans (state "*/*", next "lines.xml") + returns "*/*" as $$ + select xmlconcat(state, xmlelement(name line, xmlattributes(next.id as id, next.name as name), next.geom)); + $$ language sql; + + create or replace function lines_xml_final (data "*/*") + returns "*/*" as $$ + declare + req_accept text := current_setting('request.headers', true)::json->>'accept'; + begin + -- when receiving */*, we need to set the Content-Type. PostgREST won't set it. + if req_accept = '*/*' + then perform set_config('response.headers', '[{"Content-Type": "text/xml"}]', true); + -- we'll reject other non XML media types, we need to reject manually since */* will command PostgREST to accept all media types + elsif req_accept NOT IN ('application/xml', 'text/xml') + then raise sqlstate 'PT415' using message = 'Unsupported Media Type'; + end if; + + return data; + end; $$ language plpgsql; + + drop aggregate if exists lines_xml_agg ("lines.xml"); + create aggregate test.lines_xml_agg ("lines.xml") ( + stype = "*/*" + , sfunc = lines_xml_trans + , finalfunc = lines_xml_final + ); + +Now we can omit the ``Accept`` header and it will respond with XML. + +.. code-block:: bash + + curl 'localhost:3000/lines.xml' -i + + HTTP/1.1 200 OK + Content-Type: text/xml + + 0102000020E610000002000000000000000000F03F000000000000F03F00000000000014400000000000001440 + 0102000020E6100000020000000000000000000040000000000000004000000000000018400000000000001840 -Standard Media Types Handlers -============================= +And it will accept only XML media types. -Builtins handlers are provided for the following standard media types: +.. code-block:: bash -* ``application/json`` -* ``text/csv`` -* ``application/geo+json`` -* ``application/x-www-form-urlencoded`` -* ``*/*``, uses the same handler as ``application/json``. + curl 'localhost:3000/lines.xml' -i -H "Accept: text/xml" -Vendor Media Types Handlers -=========================== + HTTP/1.1 200 OK + Content-Type: text/xml -PostgREST also includes its own vendored media types, handlers for these are provided but cannot be overridden. + curl 'localhost:3000/lines.xml' -i -H "Accept: application/xml" -* ``application/vnd.pgrst.object`` -* ``application/vnd.pgrst.array`` -* ``application/vnd.pgrst.plan`` + HTTP/1.1 200 OK + Content-Type: text/xml -Custom Media Type Handlers -========================== + curl 'localhost:3000/lines.xml' -i -H "Accept: unknown/media" -TODO + HTTP/1.1 415 Unsupported Media Type diff --git a/docs/references/api/resource_representation.rst b/docs/references/api/resource_representation.rst index 76c0c55112..3382e4b2ae 100644 --- a/docs/references/api/resource_representation.rst +++ b/docs/references/api/resource_representation.rst @@ -23,15 +23,44 @@ Use the Accept request header to specify the acceptable format (or formats) for curl "http://localhost:3000/people" \ -H "Accept: application/json" -For tables and views the current possibilities are: +.. _builtin_media: -* ``*/*`` -* ``text/csv`` -* ``application/json`` -* ``application/openapi+json`` -* ``application/geo+json`` +Builtin Media Type Handlers +=========================== + +Builtin handlers are offered for common standard media types. + +* ``text/csv`` and ``application/json``, for all API endpoints. See :ref:`tables_views` and :ref:`s_procs`. +* ``application/openapi+json``, for the root endpoint. See :ref:`open-api`. +* ``application/geo+json``, see :ref:`ww_postgis`. +* ``*/*``, resolves to ``application/json`` for API endpoints and to ``application/openapi+json`` for the root endpoint. + +The following vendor media types handlers are also supported. + +* ``application/vnd.pgrst.plan``, see :ref:`explain_plan`. +* ``application/vnd.pgrst.object`` and ``application/vnd.pgrst.array``, see :ref:`singular_plural` and :ref:`stripped_nulls`. + +Any unrecognized media type will throw an error. + +.. tabs:: + + .. code-tab:: http + + GET /people HTTP/1.1 + Accept: unknown/unknown + + .. code-tab:: bash Curl -The server will default to JSON for API endpoints and OpenAPI on the root. + curl "http://localhost:3000/people" \ + -H "Accept: unknown/unknown" + +.. code-block:: http + + HTTP/1.1 415 Unsupported Media Type + + {"code":"PGRST107","details":null,"hint":null,"message":"None of these media types are available: unknown/unknown"} + +To extend the accepted media types, you can use :ref:`custom_media`. .. _singular_plural: @@ -85,6 +114,8 @@ When a singular response is requested but no entries are found, the server respo Admittedly PostgREST could detect when there is an equality condition holding on all columns constituting the primary key and automatically convert to singular. However this could lead to a surprising change of format that breaks unwary client code just by filtering on an extra column. Instead we allow manually specifying singular vs plural to decouple that choice from the URL format. +.. _stripped_nulls: + Stripped Nulls -------------- @@ -122,72 +153,6 @@ This returns { "id": 13, "name": "Y"} ] -.. _scalar_return_formats: - -Scalar Function Response Format -------------------------------- - -In the special case of a :ref:`scalar_functions` there are three additional formats: - -* ``application/octet-stream`` -* ``text/plain`` -* ``text/xml`` - -Example 1: If you want to return raw binary data from a :code:`bytea` column, you must specify :code:`application/octet-stream` as part of the :code:`Accept` header -and select a single column :code:`?select=bin_data`. - -.. tabs:: - - .. code-tab:: http - - GET /items?select=bin_data&id=eq.1 HTTP/1.1 - Accept: application/octet-stream - - .. code-tab:: bash Curl - - curl "http://localhost:3000/items?select=bin_data&id=eq.1" \ - -H "Accept: application/octet-stream" - -Example 2: You can request XML output when having a scalar function that returns a type of ``text/xml``. You are not forced to use select for this case. - -.. code-block:: postgres - - CREATE FUNCTION generate_xml_content(..) RETURNS xml .. - -.. tabs:: - - .. code-tab:: http - - POST /rpc/generate_xml_content HTTP/1.1 - Accept: text/xml - - .. code-tab:: bash Curl - - curl "http://localhost:3000/rpc/generate_xml_content" \ - -X POST -H "Accept: text/xml" - -Example 3: If the stored procedure returns non-scalar values, you need to do a :code:`select` in the same way as for GET binary output. - -.. code-block:: sql - - CREATE FUNCTION get_descriptions(..) RETURNS SETOF TABLE(id int, description text) .. - -.. tabs:: - - .. code-tab:: http - - POST /rpc/get_descriptions?select=description HTTP/1.1 - Accept: text/plain - - .. code-tab:: bash Curl - - curl "http://localhost:3000/rpc/get_descriptions?select=description" \ - -X POST -H "Accept: text/plain" - -.. note:: - - If more than one row would be returned the binary/plain-text/xml results will be concatenated with no delimiter. - .. _req_body: Request Body diff --git a/docs/references/api/stored_procedures.rst b/docs/references/api/stored_procedures.rst index 9aa28d9e29..5dcd7beeec 100644 --- a/docs/references/api/stored_procedures.rst +++ b/docs/references/api/stored_procedures.rst @@ -311,7 +311,9 @@ Repeating also works in POST requests with ``Content-Type: application/x-www-for -X POST -H "Content-Type: application/x-www-form-urlencoded" \ -d 'v=1&v=2&v=3&v=4' -Table-Valued functions +.. _table_functions: + +Table-Valued Functions ---------------------- A function that returns a table type can be filtered using the same filters as :ref:`tables and views `. They can also use :ref:`Resource Embedding `. @@ -418,7 +420,7 @@ PostgREST will detect if the function is scalar or table-valued and will shape t { "title": "Blade Runner 2049", "rating": 8.1} ] -To manually choose a return format such as binary, plain text or XML, see the section :ref:`scalar_return_formats`. +To manually choose a return format such as binary, see :ref:`custom_media`. .. _untyped_functions: diff --git a/docs/references/configuration.rst b/docs/references/configuration.rst index 352b454fe8..ab1c0ed029 100644 --- a/docs/references/configuration.rst +++ b/docs/references/configuration.rst @@ -732,30 +732,6 @@ openapi-server-proxy-uri ] } -.. _raw-media-types: - -raw-media-types ---------------- - - =============== ================================= - **Type** String - **Default** `n/a` - **Reloadable** Y - **Environment** PGRST_RAW_MEDIA_TYPES - **In-Database** pgrst.raw_media_types - =============== ================================= - - This serves to extend the `Media Types `_ that PostgREST currently accepts through an ``Accept`` header. - - These media types can be requested by following the same rules as the ones defined in :ref:`scalar_return_formats`. - - As an example, the below config would allow you to request an **image** and a **XML** file by doing a request with ``Accept: image/png`` - or ``Accept: font/woff2``, respectively. - - .. code:: bash - - raw-media-types="image/png, font/woff2" - .. _server_cors_allowed_origins: server-cors-allowed-origins diff --git a/docs/references/errors.rst b/docs/references/errors.rst index 718881d24e..f600100651 100644 --- a/docs/references/errors.rst +++ b/docs/references/errors.rst @@ -217,10 +217,6 @@ Related to the HTTP request elements. | | | See :ref:`guc_resp_status`. | | PGRST112 | | | +---------------+-------------+-------------------------------------------------------------+ -| .. _pgrst113: | 406 | More than one column was returned for a scalar result. | -| | | See :ref:`scalar_return_formats`. | -| PGRST113 | | | -+---------------+-------------+-------------------------------------------------------------+ | .. _pgrst114: | 400 | For an :ref:`UPSERT using PUT `, when | | | | :ref:`limits and offsets ` are used. | | PGRST114 | | | diff --git a/docs/references/transactions.rst b/docs/references/transactions.rst index b0346b3afb..729e493f9d 100644 --- a/docs/references/transactions.rst +++ b/docs/references/transactions.rst @@ -227,7 +227,7 @@ Notice that the ``response.headers`` should be set to an *array* of single-key o .. note:: - PostgREST provided headers such as ``Content-Type``, ``Location``, etc. can be overriden this way. Note that irrespective of overridden ``Content-Type`` response header, the content will still be converted to JSON, unless you also set :ref:`raw-media-types` to something like ``text/html``. + PostgREST provided headers such as ``Content-Type``, ``Location``, etc. can be overriden this way. Note that irrespective of overridden ``Content-Type`` response header, the content will still be converted to JSON, unless you use :ref:`custom_media`. .. _guc_resp_status: diff --git a/postgrest.dict b/postgrest.dict index c2e6690f8d..3261e7330c 100644 --- a/postgrest.dict +++ b/postgrest.dict @@ -10,7 +10,6 @@ authenticator backoff balancer booleans -Builtins buildpack Bytea Cardano @@ -175,7 +174,6 @@ url urlencoded urls variadic -vendored verifier versioning Vondra From 49903ca6dba1b5578deb5ffec49bc925727ac192 Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Fri, 1 Dec 2023 10:07:55 -0500 Subject: [PATCH 684/711] chore: wording of media type handlers --- docs/references/api/media_type_handlers.rst | 35 +++++++++++++-------- 1 file changed, 22 insertions(+), 13 deletions(-) diff --git a/docs/references/api/media_type_handlers.rst b/docs/references/api/media_type_handlers.rst index 90bff1b6a2..12f4bdc1d4 100644 --- a/docs/references/api/media_type_handlers.rst +++ b/docs/references/api/media_type_handlers.rst @@ -36,7 +36,7 @@ As an example, let's obtain the `TWKB ` , geom geometry(LINESTRING, 4326) ); - insert into lines values (1, 'line-1', 'LINESTRING(1 1,5 5)'::extensions.geometry), (2, 'line-2', 'LINESTRING(2 2,6 6)'::extensions.geometry); + insert into lines values (1, 'line-1', 'LINESTRING(1 1,5 5)'::geometry), (2, 'line-2', 'LINESTRING(2 2,6 6)'::geometry); For this you can create a vendor media type and use it as a return type on a function. @@ -57,7 +57,8 @@ Now you can request the ``TWKB`` output like so: .. code-block:: bash - curl 'localhost:3000/rpc/get_line?id=1' -H "Accept: application/vnd.twkb" -i + curl 'localhost:3000/rpc/get_line?id=1' -i \ + -H "Accept: application/vnd.twkb" HTTP/1.1 200 OK Content-Type: application/vnd.twkb @@ -73,11 +74,13 @@ To benefit from a compressed format like ``TWKB``, it makes more sense to obtain .. code-block:: postgres + -- let's add the vendor type as return of the transition function create or replace function twkb_handler_transition (state bytea, next lines) returns "application/vnd.twkb" as $$ select state || st_astwkb(next.geom); $$ language sql; + -- use the transition function on the aggregate create or replace aggregate twkb_agg (lines) ( initcond = '' , stype = "application/vnd.twkb" @@ -95,7 +98,8 @@ Now you can request the table endpoint with the ``twkb`` media type: .. code-block:: bash - curl 'localhost:3000/lines' -H "Accept: application/vnd.twkb" -i + curl 'localhost:3000/lines' -i \ + -H "Accept: application/vnd.twkb" HTTP/1.1 200 OK Content-Type: application/vnd.twkb @@ -113,7 +117,8 @@ If you have a table-valued function returning the same table type, the handler c .. code-block:: bash - curl 'localhost:3000/get_lines' -H "Accept: application/vnd.twkb" -i + curl 'localhost:3000/get_lines' -i \ + -H "Accept: application/vnd.twkb" HTTP/1.1 200 OK Content-Type: application/vnd.twkb @@ -146,8 +151,7 @@ It'll include a `Byte order mark (E'id,name,geom\n' || data); $$ language sql; - drop aggregate if exists bom_csv_agg(lines); - create aggregate bom_csv_agg (lines) ( + create or replace aggregate bom_csv_agg (lines) ( initcond = '' , stype = "text/csv" , sfunc = bom_csv_trans @@ -158,7 +162,8 @@ You can now request it like: .. code-block:: bash - curl 'localhost:3000/lines' -H "Accept: text/csv" -i + curl 'localhost:3000/lines' -i \ + -H "Accept: text/csv" HTTP/1.1 200 OK Content-Type: text/csv @@ -183,6 +188,7 @@ Let's define an any handler for a view that will always respond with ``XML`` out create domain "*/*" as pg_catalog.xml; + -- we'll use an .xml suffix for the view to be clear it's output is always XML create view "lines.xml" as select * from lines; @@ -194,9 +200,10 @@ Let's define an any handler for a view that will always respond with ``XML`` out create or replace function lines_xml_final (data "*/*") returns "*/*" as $$ declare + -- get the Accept header req_accept text := current_setting('request.headers', true)::json->>'accept'; begin - -- when receiving */*, we need to set the Content-Type. PostgREST won't set it. + -- when receiving */*, we need to set the Content-Type, otherwise PostgREST will set a default one. if req_accept = '*/*' then perform set_config('response.headers', '[{"Content-Type": "text/xml"}]', true); -- we'll reject other non XML media types, we need to reject manually since */* will command PostgREST to accept all media types @@ -207,8 +214,7 @@ Let's define an any handler for a view that will always respond with ``XML`` out return data; end; $$ language plpgsql; - drop aggregate if exists lines_xml_agg ("lines.xml"); - create aggregate test.lines_xml_agg ("lines.xml") ( + create or replace aggregate testlines_xml_agg ("lines.xml") ( stype = "*/*" , sfunc = lines_xml_trans , finalfunc = lines_xml_final @@ -230,16 +236,19 @@ And it will accept only XML media types. .. code-block:: bash - curl 'localhost:3000/lines.xml' -i -H "Accept: text/xml" + curl 'localhost:3000/lines.xml' -i \ + -H "Accept: text/xml" HTTP/1.1 200 OK Content-Type: text/xml - curl 'localhost:3000/lines.xml' -i -H "Accept: application/xml" + curl 'localhost:3000/lines.xml' -i \ + -H "Accept: application/xml" HTTP/1.1 200 OK Content-Type: text/xml - curl 'localhost:3000/lines.xml' -i -H "Accept: unknown/media" + curl 'localhost:3000/lines.xml' -i \ + -H "Accept: unknown/media" HTTP/1.1 415 Unsupported Media Type From ee4321623f5753c3cdafafa4b2d278f3dffcc959 Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Fri, 1 Dec 2023 10:50:36 -0500 Subject: [PATCH 685/711] chore: improve intro of media type handlers --- docs/references/api/media_type_handlers.rst | 67 +++++++++++++++------ postgrest.dict | 1 + 2 files changed, 48 insertions(+), 20 deletions(-) diff --git a/docs/references/api/media_type_handlers.rst b/docs/references/api/media_type_handlers.rst index 12f4bdc1d4..f656ec4761 100644 --- a/docs/references/api/media_type_handlers.rst +++ b/docs/references/api/media_type_handlers.rst @@ -3,7 +3,7 @@ Media Type Handlers ################### -Media Type Handlers allows PostgREST to deliver custom media types. These handlers extend the :ref:`builtin ones ` and can also override them. +Media Type Handlers allow PostgREST to deliver custom media types. These handlers extend the :ref:`builtin ones ` and can also override them. Media types are expressed as type aliases using `domains `_ and their name must comply to `RFC 6838 requirements `_. @@ -11,11 +11,7 @@ Media types are expressed as type aliases using `domains `, these will turn into handlers. - -- Of `Aggregates `_ transition or final functions, these will serve as handlers for :ref:`tables_views` and :ref:`table_functions`. +Using these domains, :ref:`functions ` can become handlers and `user-defined aggregates `_ can serve as handlers for :ref:`tables_views` and :ref:`table_functions`. .. note:: @@ -38,12 +34,16 @@ As an example, let's obtain the `TWKB ` insert into lines values (1, 'line-1', 'LINESTRING(1 1,5 5)'::geometry), (2, 'line-2', 'LINESTRING(2 2,6 6)'::geometry); -For this you can create a vendor media type and use it as a return type on a function. +For this you can create a vendor media type. .. code-block:: postgres create domain "application/vnd.twkb" as bytea; +And use it as a return type on a function, to make it a handler. + +.. code-block:: postgres + create or replace function get_line (id int) returns "application/vnd.twkb" as $$ select st_astwkb(geom) from lines where id = get_line.id; @@ -70,29 +70,39 @@ Note that PostgREST will automatically set the ``Content-Type`` to ``applicatio Handlers for Tables/Views ========================= -To benefit from a compressed format like ``TWKB``, it makes more sense to obtain many rows instead of one. Let's allow that by adding a handler for the table. You'll need an aggregate: +To benefit from a compressed format like ``TWKB``, it makes more sense to obtain many rows instead of one. Let's allow that by adding a handler for the table. + +User-defined aggregates can be turned into handlers by using domain media types as the return type of their transition or final functions. + +Let's create a transition function for this example. .. code-block:: postgres - -- let's add the vendor type as return of the transition function create or replace function twkb_handler_transition (state bytea, next lines) returns "application/vnd.twkb" as $$ select state || st_astwkb(next.geom); $$ language sql; - -- use the transition function on the aggregate +Now we'll use it on a new aggregate defined for the ``lines`` table. + +.. code-block:: postgres + create or replace aggregate twkb_agg (lines) ( initcond = '' , stype = "application/vnd.twkb" , sfunc = twkb_handler_transition ); - -- quick test - -- SELECT twkb_agg(l) from lines l; - -- twkb_agg - ------------------------------------------------------------------ - -- \xa20002c09a0cc09a0c80ea3080ea30a2000280b51880b51880ea3080ea30 - --(1 row) +Make a quick test on SQL to see it working. + +.. code-block:: psql + + SELECT twkb_agg(l) from lines l; + + twkb_agg + --------------------------------------------------------------- + \xa20002c09a0cc09a0c80ea3080ea30a2000280b51880b51880ea3080ea30 + (1 row) Now you can request the table endpoint with the ``twkb`` media type: @@ -129,17 +139,27 @@ Overriding a Builtin Handler ============================ Let's override the existing ``text/csv`` handler for the table to provide a more complex CSV output. -It'll include a `Byte order mark `_ plus a ``Content-Disposition`` header to set a name for the downloaded file. +It'll include a `Byte order mark (BOM) `_ plus a ``Content-Disposition`` header to set a name for the downloaded file. + +Create a domain for the standard ``text/csv`` media type. .. code-block:: postgres create domain "text/csv" as text; +And a transition function that returns the domain. + +.. code-block:: postgres + create or replace function bom_csv_trans (state text, next lines) returns "text/csv" as $$ select state || next.id::text || ',' || next.name || ',' || next.geom::text || E'\n'; $$ language sql; +This time we'll add a final function. This will add the CSV header, the BOM and the ``Content-Disposition`` header. + +.. code-block:: postgres + create or replace function bom_csv_final (data "text/csv") returns "text/csv" as $$ -- set the Content-Disposition header @@ -151,6 +171,10 @@ It'll include a `Byte order mark (E'id,name,geom\n' || data); $$ language sql; +Now use the transition and final function as part of the new aggregate. + +.. code-block:: postgres + create or replace aggregate bom_csv_agg (lines) ( initcond = '' , stype = "text/csv" @@ -158,7 +182,7 @@ It'll include a `Byte order mark , finalfunc = bom_csv_final ); -You can now request it like: +And request it like: .. code-block:: bash @@ -188,15 +212,17 @@ Let's define an any handler for a view that will always respond with ``XML`` out create domain "*/*" as pg_catalog.xml; - -- we'll use an .xml suffix for the view to be clear it's output is always XML + -- we'll use an .xml suffix for the view to be clear its output is always XML create view "lines.xml" as select * from lines; + -- transition function create or replace function lines_xml_trans (state "*/*", next "lines.xml") returns "*/*" as $$ select xmlconcat(state, xmlelement(name line, xmlattributes(next.id as id, next.name as name), next.geom)); $$ language sql; + -- final function create or replace function lines_xml_final (data "*/*") returns "*/*" as $$ declare @@ -214,7 +240,8 @@ Let's define an any handler for a view that will always respond with ``XML`` out return data; end; $$ language plpgsql; - create or replace aggregate testlines_xml_agg ("lines.xml") ( + -- new aggregate + create or replace aggregate lines_xml_agg ("lines.xml") ( stype = "*/*" , sfunc = lines_xml_trans , finalfunc = lines_xml_final diff --git a/postgrest.dict b/postgrest.dict index 3261e7330c..063144b681 100644 --- a/postgrest.dict +++ b/postgrest.dict @@ -11,6 +11,7 @@ backoff balancer booleans buildpack +BOM Bytea Cardano cd From a38eee399ee61406b18be24e08e90f36d9e55aad Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Fri, 1 Dec 2023 10:59:48 -0500 Subject: [PATCH 686/711] chore: improve mt handlers snippets --- docs/references/api/media_type_handlers.rst | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/docs/references/api/media_type_handlers.rst b/docs/references/api/media_type_handlers.rst index f656ec4761..710f50fd3c 100644 --- a/docs/references/api/media_type_handlers.rst +++ b/docs/references/api/media_type_handlers.rst @@ -182,6 +182,17 @@ Now use the transition and final function as part of the new aggregate. , finalfunc = bom_csv_final ); +.. code-block:: psql + + select bom_csv_agg(l) from lines l; + bom_csv_agg + ----------------------------------------------------------------------------------------------------- + id,name,geom + + 1,line-1,0102000020E610000002000000000000000000F03F000000000000F03F00000000000014400000000000001440+ + 2,line-2,0102000020E6100000020000000000000000000040000000000000004000000000000018400000000000001840+ + + (1 row) + And request it like: .. code-block:: bash @@ -269,12 +280,16 @@ And it will accept only XML media types. HTTP/1.1 200 OK Content-Type: text/xml +.. code-block:: bash + curl 'localhost:3000/lines.xml' -i \ -H "Accept: application/xml" HTTP/1.1 200 OK Content-Type: text/xml +.. code-block:: bash + curl 'localhost:3000/lines.xml' -i \ -H "Accept: unknown/media" From 2bb9cee996a72af214fab8acc7b22628b1691baf Mon Sep 17 00:00:00 2001 From: Tim Abdulla Date: Fri, 1 Dec 2023 17:38:42 +0100 Subject: [PATCH 687/711] Add documentation for aggregate functions (#701) --- docs/references/api.rst | 1 + docs/references/api/aggregate_functions.rst | 342 ++++++++++++++++++++ docs/references/api/tables_views.rst | 2 + docs/references/configuration.rst | 22 ++ postgrest.dict | 3 + 5 files changed, 370 insertions(+) create mode 100644 docs/references/api/aggregate_functions.rst diff --git a/docs/references/api.rst b/docs/references/api.rst index 1b3f08cd10..6f5642af66 100644 --- a/docs/references/api.rst +++ b/docs/references/api.rst @@ -17,6 +17,7 @@ PostgREST exposes three database objects of a schema as resources: tables, views api/resource_embedding.rst api/resource_representation.rst api/media_type_handlers.rst + api/aggregate_functions.rst api/openapi.rst api/preferences.rst api/* diff --git a/docs/references/api/aggregate_functions.rst b/docs/references/api/aggregate_functions.rst new file mode 100644 index 0000000000..6f1cd5eb1e --- /dev/null +++ b/docs/references/api/aggregate_functions.rst @@ -0,0 +1,342 @@ +.. _aggregate_functions: + +Aggregate Functions +################### + +Aggregate functions allow you to summarize data by performing calculations across groups of rows. For instance, if you have an ``orders`` table that has an ``amount`` column, you could use an aggregate function to get the sum of the ``amount`` column, either for all rows, or for each group of rows that share specific values, for instance all rows that share the same ``order_date``. + +.. note:: + Aggregate functions are *disabled* by default in PostgREST, as without appropriate safeguards, aggregate functions can create performance problems. See :ref:`db-aggregates-enabled` for further details. + +PostgREST supports the following aggregate functions: ``avg()``, ``count()``, ``max()``, ``min()``, and ``sum()``. Please refer to the `section on aggregate functions in the PostgreSQL documentation `_ for a detailed explanation of these functions. + +To use an aggregate function, you append the function to a value in the ``select`` parameter, like so: + +.. tabs:: + + .. code-tab:: http + + GET /orders?select=amount.sum() HTTP/1.1 + + .. code-tab:: bash Curl + + curl "http://localhost:3000/orders?select=amount.sum()" + +With the above query, PostgREST will return a single row with a single column named ``sum`` that contains the sum of all the values in the ``amount`` column: + +.. code-block:: json + + [ + { + "sum": 1234.56 + } + ] + +You can use multiple aggregate functions by just adding more columns with aggregate functions to the ``select`` parameter. + +To group by other columns, you simply add those columns to the ``select`` parameter. For instance: + +.. tabs:: + + .. code-tab:: http + + GET /orders?select=amount.sum(),amount.avg(),order_date HTTP/1.1 + + .. code-tab:: bash Curl + + curl "http://localhost:3000/orders?select=amount.sum(),amount.avg(),order_date" + +This will return a row for each unique value in the ``order_date`` column, with the sum and average of the ``amount`` column for all rows that share the same ``order_date``: + +.. code-block:: json + + [ + { + "sum": 1234.56, + "avg": 123.45, + "order_date": "2023-01-01" + }, + { + "sum": 2345.67, + "avg": 234.56, + "order_date": "2023-01-02" + } + ] + +.. note:: + Aggregate functions work alongside other PostgREST features, like :ref:`h_filter`, :ref:`json_columns`, and :ref:`ordering`. Please note at this time aggregate functions are not compatible with :ref:`domain_reps`. Additionally, PostgreSQL's ``HAVING`` clause and ordering by aggregated columns are not yet supported. + +The Case of ``count()`` +=========================== + +.. note:: + Before the addition of aggregate functions, it was possible to count by adding ``count`` (without parentheses) to the ``select`` parameter. While this is still supported, it may be deprecated in the future, and thus use of this legacy feature is **not recommended.** Please use ``count()`` (with parentheses) instead. + + +``count()`` is treated specially, as it can be used without an associated column. Take for example the following query: + +.. tabs:: + + .. code-tab:: http + + GET /orders?select=count(),order_date HTTP/1.1 + + .. code-tab:: bash Curl + + curl "http://localhost:3000/orders?select=count(),order_date" + +This would return a row for each unique value in the ``order_date`` column, with the count of all rows that share the same ``order_date``: + +.. code-block:: json + + [ + { + "count": 4, + "order_date": "2023-01-01" + }, + { + "count": 2, + "order_date": "2023-01-02" + } + ] + +When ``count()`` is used with an associated column, its behaviour is slightly different: It will return the count of all values that are not ``NULL``. This is due to how PostgreSQL itself implements the ``count()`` function. + +Renaming and Casting +==================== + +Renaming Aggregates +------------------- + +Just like with other columns, you can rename aggregated columns too. See :ref:`renaming_columns` for details. + +Renaming columns is especially helpful in the context of aggregate functions, as by default a column with an aggregate function applied will take on the name of the applied aggregate function. You may want to provide a more semantically meaningful name or prevent collisions when using multiple aggregate functions of the same type. + +Casting Aggregates +------------------ + +When applying an aggregate function to a column, you are able to cast both the value of the input to the aggregate function *and* the value of the output from the aggregate function. In both cases, the syntax works as described in :ref:`casting_columns`, with the only difference being the placement of the cast. + +Casting the Value of the Input +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +For instance, imagine that the ``orders`` table has a JSON column, ``order_details``, and this column contains a JSON object that has a key, ``tax_amount``. Let's say you want to get the sum of the tax amount for every order. You can use the ``->`` or ``->>`` operators to extract the value with this key (see :ref:`json_columns`), but these operators will return values of the types JSON and ``text`` respectively, and neither of these types can be used with ``sum()``. + +Therefore, you will need to first cast the input value to a type that is compatible with ``sum()`` (e.g. ``numeric``). Casting the input value is done in exactly the same way as casting any other value: + +.. tabs:: + + .. code-tab:: http + + GET /orders?select=order_details->tax_amount::numeric.sum() HTTP/1.1 + + .. code-tab:: bash Curl + + curl "http://localhost:3000/orders?select=order_details->tax_amount::numeric.sum()" + +With this, you will receive the sum of the casted ``tax_amount`` value: + +.. code-block:: json + + [ + { + "sum": 1234.56 + } + ] + +Casting the Value of the Output +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Now let's return to an example involving the ``amount`` column of the ``orders`` table. Imagine that we want to get the rounded average of the ``amount`` column. One way to do this is to use the ``avg()`` aggregate function and then to cast the output value of the function to ``int``. To cast the value of the output of the function, we simply place the cast *after* the aggregate function: + +.. tabs:: + + .. code-tab:: http + + GET /orders?select=amount.avg()::int HTTP/1.1 + + .. code-tab:: bash Curl + + curl "http://localhost:3000/orders?select=amount.avg()::int" + +You will then receive the rounded average as the result: + +.. code-block:: json + + [ + { + "avg": 201 + } + ] + +Of course, you can use both input and output casts at the same time, if you so desire. + + +Using Aggregate Functions with Resource Embedding +================================================= + +Aggregate functions can be used in conjunction with :ref:`resource_embedding`. You can use embedded resources as grouping columns, use aggregate functions within the context of an embedded resource, or use columns from a spreaded resource as grouping columns or as inputs to aggregate functions. + +Using Embedded Resources as Grouping Columns +-------------------------------------------- + +Using an embedded resource as a grouping column allows you to use data from an association to group the results of an aggregation. + +For example, imagine that the ``orders`` table from the examples above is related to a ``customers`` table. If you want to get the sum of the ``amount`` column grouped by the ``name`` column from the ``customers`` table, you can include the customer name, using the standard :ref:`resource_embedding` syntax, and perform a sum on the ``amount`` column. + +.. tabs:: + + .. code-tab:: http + + GET /orders?select=amount.sum(),customers(name) HTTP/1.1 + + .. code-tab:: bash Curl + + curl "http://localhost:3000/orders?select=amount.sum(),customers(name)" + +You will then get the summed amount, along with the embedded customer resource: + +.. code-block:: json + + [ + { + "sum": 100, + "customers": { + "name": "Customer A" + } + }, + { + "sum": 200, + "customers": { + "name": "Customer B" + } + } + ] + +.. note:: + The previous example uses a has-one association to demonstrate this functionality, but you may also use has-many associations as grouping columns, although there are few obvious use cases for this. + +Using Aggregate Functions Within the Context of an Embedded Resource +-------------------------------------------------------------------- + +When embedding a resource, you can apply aggregate functions to columns from the associated resource to perform aggregations within the context of an embedded resource. + +Continuing with the example relationship between ``orders`` and ``customers`` from the previous section, imagine that you want to fetch the ``name``, ``city``, and ``state`` for each customer, along with the sum of amount of the customer's orders, grouped by the order date. This can be done in the following way: + +.. tabs:: + + .. code-tab:: http + + GET /customers?select=name,city,state,orders(amount.sum(),order_date) HTTP/1.1 + + .. code-tab:: bash Curl + + curl "http://localhost:3000/customers?select=name,city,state,orders(amount.sum(),order_date)" + +.. code-block:: json + + [ + { + "name": "Customer A", + "city": "New York", + "state": "NY", + "orders": [ + { + "sum": 215.22, + "order_date": "2023-09-01" + }, + { + "sum": 905.73, + "order_date": "2023-09-02" + } + ] + }, + { + "name": "Customer B", + "city": "Los Angeles", + "state": "CA", + "orders": [ + { + "sum": 329.71, + "order_date": "2023-09-01" + }, + { + "sum": 425.87, + "order_date": "2023-09-03" + } + ] + } + ] + +In this example, the ``amount`` column is summed and grouped by the ``order_date`` *within* the context of the embedded resource. That is, the ``name``, ``city``, and ``state`` from the ``customers`` table have no bearing on the aggregation performed in the context of the ``orders`` association; instead, each aggregation can be seen as being performed independently on just the orders belonging to a particular customer, using only the data from the embedded resource for both grouping and aggregation. + +Using Columns from a Spreaded Resource +-------------------------------------- + +When you :ref:`spread an embedded resource `, the columns from the spreaded resource are treated as if they were columns of the top-level resource, both when using them as grouping columns and when applying aggregate functions to them. + +Grouping with Columns from a Spreaded Resource +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +For instance, assume you want to sum the ``amount`` column from the ``orders`` table, using the ``city`` and ``state`` columns from the ``customers`` table as grouping columns. To achieve this, you may select these two columns from the ``customers`` table and spread them; they will then be used as grouping columns: + +.. tabs:: + + .. code-tab:: http + + GET /orders?select=amount.sum(),...customers(city,state) HTTP/1.1 + + .. code-tab:: bash Curl + + curl "http://localhost:3000/orders?select=amount.sum(),...customers(city,state) + +The result will be the same as if ``city`` and ``state`` were columns from the ``orders`` table: + +.. code-block:: json + + [ + { + "sum": 2000.29, + "city": "New York", + "state": "NY" + }, + { + "sum": 9241.21, + "city": "Los Angeles", + "state": "CA" + } + ] + +Aggregate Functions with Columns from a Spreaded Resource +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Now imagine that the ``customers`` table has a ``joined_date`` column that represents the date that the customer joined. You want to get both the most recent and the oldest ``joined_date`` for customers that placed an order on every distinct order date. This can be expressed as follows: + +.. tabs:: + + .. code-tab:: http + + GET /orders?select=order_date,...customers(joined_date.max(),joined_date.min()) HTTP/1.1 + + .. code-tab:: bash Curl + + curl "http://localhost:3000/orders?select=order_date,...customers(joined_date.max(),joined_date.min()) + +As columns from a spreaded resource are treated as if they were columns from the top-level resource, the ``max()`` and ``min()`` are applied *within* the context of the top-level, rather than within the context of the embedded resource, as in the previous section. + +The result will be the same as if the aggregations were applied to columns from the top-level: + +.. code-block:: json + + [ + { + "order_date": "2023-11-01", + "max": "2023-10-15", + "min": "2013-10-01" + }, + { + "order_date": "2023-11-02", + "max": "2023-10-30", + "min": "2016-02-11" + } + ] diff --git a/docs/references/api/tables_views.rst b/docs/references/api/tables_views.rst index fd46d856cc..d2d86c4d2e 100644 --- a/docs/references/api/tables_views.rst +++ b/docs/references/api/tables_views.rst @@ -273,6 +273,8 @@ When certain columns are wide (such as those holding binary data), it is more ef The default is ``*``, meaning all columns. This value will become more important below in :ref:`resource_embedding`. +.. _renaming_columns: + Renaming Columns ~~~~~~~~~~~~~~~~ diff --git a/docs/references/configuration.rst b/docs/references/configuration.rst index ab1c0ed029..e867cc06a8 100644 --- a/docs/references/configuration.rst +++ b/docs/references/configuration.rst @@ -178,6 +178,28 @@ app.settings.* Arbitrary settings that can be used to pass in secret keys directly as strings, or via OS environment variables. For instance: :code:`app.settings.jwt_secret = "$(MYAPP_JWT_SECRET)"` will take :code:`MYAPP_JWT_SECRET` from the environment and make it available to postgresql functions as :code:`current_setting('app.settings.jwt_secret')`. +.. _db-aggregates-enabled: + +db-aggregates-enabled +--------------------- + + =============== ======================= + **Type** Boolean + **Default** False + **Reloadable** Y + **Environment** PGRST_DB_AGGREGATES_ENABLED + **In-Database** pgrst.db_aggregates_enabled + =============== ======================= + + + When this is set to :code:`true`, the use of :ref:`aggregate_functions` is allowed. + + It is recommended that this be set to ``false`` unless proper safeguards are in place to prevent potential performance problems from arising. For example, it is possible that a user may request the ``max()`` of an unindexed column in a table with millions of rows. At best, this would result in a slow query, and at worst, it could be abused to prevent other users from accessing your API (i.e. a form of denial-of-service attack.) + + Proper safeguards could include: + - Use of a statement timeout. See :ref:`impersonated_settings`. + - Use of the `pg_plan_filter extension `_ to block excessively expensive queries. + .. _db-anon-role: db-anon-role diff --git a/postgrest.dict b/postgrest.dict index 063144b681..dc9281688b 100644 --- a/postgrest.dict +++ b/postgrest.dict @@ -14,6 +14,7 @@ buildpack BOM Bytea Cardano +casted cd centric coercible @@ -143,6 +144,8 @@ SHA signup SIGUSR sl +spreaded +Spreaded SQL sql sr From 11f40c384abdbd8896773bcd07b69cc318b39921 Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Fri, 1 Dec 2023 14:50:28 -0500 Subject: [PATCH 688/711] use the clearer START TRANSACTION --- docs/references/transactions.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/references/transactions.rst b/docs/references/transactions.rst index 729e493f9d..dee915a593 100644 --- a/docs/references/transactions.rst +++ b/docs/references/transactions.rst @@ -7,7 +7,7 @@ After :ref:`user_impersonation`, every request to an :doc:`API resource ` r .. code-block:: postgresql - BEGIN; -- + START TRANSACTION; -- -- --
    END; -- From 1268b0a258292fa36621a0bcb69f3991171f18c1 Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Fri, 1 Dec 2023 16:18:18 -0500 Subject: [PATCH 689/711] split pagination/count into own page --- docs/references/api.rst | 1 + docs/references/api/pagination_count.rst | 180 +++++++++++++++++++++++ docs/references/api/preferences.rst | 6 +- docs/references/api/tables_views.rst | 171 +-------------------- 4 files changed, 188 insertions(+), 170 deletions(-) create mode 100644 docs/references/api/pagination_count.rst diff --git a/docs/references/api.rst b/docs/references/api.rst index 6f5642af66..ad4a01e051 100644 --- a/docs/references/api.rst +++ b/docs/references/api.rst @@ -14,6 +14,7 @@ PostgREST exposes three database objects of a schema as resources: tables, views api/schemas.rst api/computed_fields.rst api/domain_representations.rst + api/pagination_count.rst api/resource_embedding.rst api/resource_representation.rst api/media_type_handlers.rst diff --git a/docs/references/api/pagination_count.rst b/docs/references/api/pagination_count.rst new file mode 100644 index 0000000000..1e77c46dfa --- /dev/null +++ b/docs/references/api/pagination_count.rst @@ -0,0 +1,180 @@ +Pagination and Count +#################### + +Pagination controls the number of rows returned for an :doc:`API resource <../api>` response. Combined with the count, you can traverse all the rows of a response. + +.. _limits: + +Limits and Pagination +--------------------- + +PostgREST uses HTTP range headers to describe the size of results. Every response contains the current range and, if requested, the total number of results: + +.. code-block:: http + + HTTP/1.1 200 OK + Range-Unit: items + Content-Range: 0-14/* + +Here items zero through fourteen are returned. This information is available in every response and can help you render pagination controls on the client. This is an RFC7233-compliant solution that keeps the response JSON cleaner. + +There are two ways to apply a limit and offset rows: through request headers or query parameters. When using headers you specify the range of rows desired. This request gets the first twenty people. + +.. tabs:: + + .. code-tab:: http + + GET /people HTTP/1.1 + Range-Unit: items + Range: 0-19 + + .. code-tab:: bash Curl + + curl "http://localhost:3000/people" -i \ + -H "Range-Unit: items" \ + -H "Range: 0-19" + +Note that the server may respond with fewer if unable to meet your request: + +.. code-block:: http + + HTTP/1.1 200 OK + Range-Unit: items + Content-Range: 0-17/* + +You may also request open-ended ranges for an offset with no limit, e.g. :code:`Range: 10-`. + +The other way to request a limit or offset is with query parameters. For example + +.. tabs:: + + .. code-tab:: http + + GET /people?limit=15&offset=30 HTTP/1.1 + + .. code-tab:: bash Curl + + curl "http://localhost:3000/people?limit=15&offset=30" + +This method is also useful for embedded resources, which we will cover in another section. The server always responds with range headers even if you use query parameters to limit the query. + +Counting +-------- + +In order to obtain the total size of the table (such as when rendering the last page link in a pagination control), you can specify a ``Prefer: count=`` header. The values can be ``exact``, ``planned`` and ``estimated``. + +This also works on views and :ref:`table_functions`. + + +.. _exact_count: + +Exact Count +~~~~~~~~~~~ + +To get the exact count, use ``Prefer: count=exact``. + +.. tabs:: + + .. code-tab:: http + + HEAD /bigtable HTTP/1.1 + Range-Unit: items + Range: 0-24 + Prefer: count=exact + + .. code-tab:: bash Curl + + curl "http://localhost:3000/bigtable" -I \ + -H "Range-Unit: items" \ + -H "Range: 0-24" \ + -H "Prefer: count=exact" + +Note that the larger the table the slower this query runs in the database. The server will respond with the selected range and total + +.. code-block:: http + + HTTP/1.1 206 Partial Content + Range-Unit: items + Content-Range: 0-24/3573458 + +.. _planned_count: + +Planned Count +~~~~~~~~~~~~~ + +To avoid the shortcomings of :ref:`exact count `, PostgREST can leverage PostgreSQL statistics and get a fairly accurate and fast count. +To do this, specify the ``Prefer: count=planned`` header. + +.. tabs:: + + .. code-tab:: http + + HEAD /bigtable?limit=25 HTTP/1.1 + Prefer: count=planned + + .. code-tab:: bash Curl + + curl "http://localhost:3000/bigtable?limit=25" -I \ + -H "Prefer: count=planned" + +.. code-block:: http + + HTTP/1.1 206 Partial Content + Content-Range: 0-24/3572000 + +Note that the accuracy of this count depends on how up-to-date are the PostgreSQL statistics tables. +For example in this case, to increase the accuracy of the count you can do ``ANALYZE bigtable``. +See `ANALYZE `_ for more details. + +.. _estimated_count: + +Estimated Count +~~~~~~~~~~~~~~~ + +When you are interested in the count, the relative error is important. If you have a :ref:`planned count ` of 1000000 and the exact count is +1001000, the error is small enough to be ignored. But with a planned count of 7, an exact count of 28 would be a huge misprediction. + +In general, when having smaller row-counts, the estimated count should be as close to the exact count as possible. + +To help with these cases, PostgREST can get the exact count up until a threshold and get the planned count when +that threshold is surpassed. To use this behavior, you can specify the ``Prefer: count=estimated`` header. The **threshold** is +defined by :ref:`db-max-rows`. + +Here's an example. Suppose we set ``db-max-rows=1000`` and ``smalltable`` has 321 rows, then we'll get the exact count: + +.. tabs:: + + .. code-tab:: http + + HEAD /smalltable?limit=25 HTTP/1.1 + Prefer: count=estimated + + .. code-tab:: bash Curl + + curl "http://localhost:3000/smalltable?limit=25" -I \ + -H "Prefer: count=estimated" + +.. code-block:: http + + HTTP/1.1 206 Partial Content + Content-Range: 0-24/321 + +If we make a similar request on ``bigtable``, which has 3573458 rows, we would get the planned count: + +.. tabs:: + + .. code-tab:: http + + HEAD /bigtable?limit=25 HTTP/1.1 + Prefer: count=estimated + + .. code-tab:: bash Curl + + curl "http://localhost:3000/bigtable?limit=25" -I \ + -H "Prefer: count=estimated" + +.. code-block:: http + + HTTP/1.1 206 Partial Content + Content-Range: 0-24/3572000 + diff --git a/docs/references/api/preferences.rst b/docs/references/api/preferences.rst index 140e001198..e79a8f5255 100644 --- a/docs/references/api/preferences.rst +++ b/docs/references/api/preferences.rst @@ -66,7 +66,7 @@ The ``timezone`` preference allows you to change the `PostgreSQL timezone >lat" -.. _limits: - -Limits and Pagination ---------------------- - -PostgREST uses HTTP range headers to describe the size of results. Every response contains the current range and, if requested, the total number of results: - -.. code-block:: http - - HTTP/1.1 200 OK - Range-Unit: items - Content-Range: 0-14/* - -Here items zero through fourteen are returned. This information is available in every response and can help you render pagination controls on the client. This is an RFC7233-compliant solution that keeps the response JSON cleaner. - -There are two ways to apply a limit and offset rows: through request headers or query parameters. When using headers you specify the range of rows desired. This request gets the first twenty people. - -.. tabs:: - - .. code-tab:: http - - GET /people HTTP/1.1 - Range-Unit: items - Range: 0-19 - - .. code-tab:: bash Curl - - curl "http://localhost:3000/people" -i \ - -H "Range-Unit: items" \ - -H "Range: 0-19" - -Note that the server may respond with fewer if unable to meet your request: - -.. code-block:: http - - HTTP/1.1 200 OK - Range-Unit: items - Content-Range: 0-17/* - -You may also request open-ended ranges for an offset with no limit, e.g. :code:`Range: 10-`. - -The other way to request a limit or offset is with query parameters. For example - -.. tabs:: - - .. code-tab:: http - - GET /people?limit=15&offset=30 HTTP/1.1 - - .. code-tab:: bash Curl - - curl "http://localhost:3000/people?limit=15&offset=30" - -This method is also useful for embedded resources, which we will cover in another section. The server always responds with range headers even if you use query parameters to limit the query. - -.. _exact_count: - -Exact Count ------------ - -In order to obtain the total size of the table or view (such as when rendering the last page link in a pagination control), specify ``Prefer: count=exact`` as a request header: - -.. tabs:: - - .. code-tab:: http - - HEAD /bigtable HTTP/1.1 - Range-Unit: items - Range: 0-24 - Prefer: count=exact - - .. code-tab:: bash Curl - - curl "http://localhost:3000/bigtable" -I \ - -H "Range-Unit: items" \ - -H "Range: 0-24" \ - -H "Prefer: count=exact" - -Note that the larger the table the slower this query runs in the database. The server will respond with the selected range and total - -.. code-block:: http - - HTTP/1.1 206 Partial Content - Range-Unit: items - Content-Range: 0-24/3573458 - -.. _planned_count: - -Planned Count -------------- - -To avoid the shortcomings of :ref:`exact count `, PostgREST can leverage PostgreSQL statistics and get a fairly accurate and fast count. -To do this, specify the ``Prefer: count=planned`` header. - -.. tabs:: - - .. code-tab:: http - - HEAD /bigtable?limit=25 HTTP/1.1 - Prefer: count=planned - - .. code-tab:: bash Curl - - curl "http://localhost:3000/bigtable?limit=25" -I \ - -H "Prefer: count=planned" - -.. code-block:: http - - HTTP/1.1 206 Partial Content - Content-Range: 0-24/3572000 - -Note that the accuracy of this count depends on how up-to-date are the PostgreSQL statistics tables. -For example in this case, to increase the accuracy of the count you can do ``ANALYZE bigtable``. -See `ANALYZE `_ for more details. - -.. _estimated_count: - -Estimated Count ---------------- - -When you are interested in the count, the relative error is important. If you have a :ref:`planned count ` of 1000000 and the exact count is -1001000, the error is small enough to be ignored. But with a planned count of 7, an exact count of 28 would be a huge misprediction. - -In general, when having smaller row-counts, the estimated count should be as close to the exact count as possible. - -To help with these cases, PostgREST can get the exact count up until a threshold and get the planned count when -that threshold is surpassed. To use this behavior, you can specify the ``Prefer: count=estimated`` header. The **threshold** is -defined by :ref:`db-max-rows`. - -Here's an example. Suppose we set ``db-max-rows=1000`` and ``smalltable`` has 321 rows, then we'll get the exact count: - -.. tabs:: - - .. code-tab:: http - - HEAD /smalltable?limit=25 HTTP/1.1 - Prefer: count=estimated - - .. code-tab:: bash Curl - - curl "http://localhost:3000/smalltable?limit=25" -I \ - -H "Prefer: count=estimated" - -.. code-block:: http - - HTTP/1.1 206 Partial Content - Content-Range: 0-24/321 - -If we make a similar request on ``bigtable``, which has 3573458 rows, we would get the planned count: - -.. tabs:: - - .. code-tab:: http - - HEAD /bigtable?limit=25 HTTP/1.1 - Prefer: count=estimated - - .. code-tab:: bash Curl - - curl "http://localhost:3000/bigtable?limit=25" -I \ - -H "Prefer: count=estimated" - -.. code-block:: http - - HTTP/1.1 206 Partial Content - Content-Range: 0-24/3572000 - .. _head_req: HEAD @@ -1202,6 +1035,10 @@ Using ``offset`` to target a different subset of rows is also possible. const redirects = { // Tables and Views '#computed-virtual-columns': 'computed_fields.html#computed-fields', + '#limits-and-pagination': 'pagination_count.html#limits-and-pagination', + '#exact-count': 'pagination_count.html#exact-count', + '#planned-count': 'pagination_count.html#planned-count', + '#estimated-count': 'pagination_count.html#estimated-count', }; let willRedirectTo = redirects[hash]; From 2b4e0cc10a12fed8bc0c6066550da7e73aadbba1 Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Fri, 1 Dec 2023 18:30:24 -0500 Subject: [PATCH 690/711] move return representation to preferences page --- docs/references/api/pagination_count.rst | 2 + docs/references/api/preferences.rst | 85 +++++++++++++++++++++++- docs/references/api/tables_views.rst | 73 ++------------------ 3 files changed, 92 insertions(+), 68 deletions(-) diff --git a/docs/references/api/pagination_count.rst b/docs/references/api/pagination_count.rst index 1e77c46dfa..30b0d0da2c 100644 --- a/docs/references/api/pagination_count.rst +++ b/docs/references/api/pagination_count.rst @@ -58,6 +58,8 @@ The other way to request a limit or offset is with query parameters. For example This method is also useful for embedded resources, which we will cover in another section. The server always responds with range headers even if you use query parameters to limit the query. +.. _prefer_count: + Counting -------- diff --git a/docs/references/api/preferences.rst b/docs/references/api/preferences.rst index e79a8f5255..50e3878639 100644 --- a/docs/references/api/preferences.rst +++ b/docs/references/api/preferences.rst @@ -1,10 +1,19 @@ .. _preferences: -Preferences -########### +Prefer Header +############# PostgREST honors the Prefer HTTP header specified on `RFC 7240 `_. It allows clients to specify required and optional behaviors for their requests. +The following preferences are supported. + +- ``Prefer: handling``. See :ref:`prefer_handling`. +- ``Prefer: timezone``. See :ref:`prefer_timezone`. +- ``Prefer: return``. See :ref:`prefer_return`. +- ``Prefer: count``. See :ref:`prefer_count`. +- ``Prefer: resolution``. See :ref:`prefer_resolution`. +- ``Prefer: missing``. See :ref:`bulk_insert_default`. + .. _prefer_handling: Strict or Lenient Handling @@ -105,3 +114,75 @@ However, with ``handling=strict``, an invalid timezone preference will throw an .. code-block:: http HTTP/1.1 400 Bad Request + +.. _prefer_return: + +Return Representation +===================== + +The ``return`` preference can be used to obtain information about affected resource when it's :ref:`inserted `, :ref:`updated ` or :ref:`deleted `. +This helps avoid a subsequent GET request. + +Minimal +------- + +With ``Prefer: return=minimal``, no response body will be returned. This is the default mode for all write requests. + +Headers Only +------------ + +If the table has a primary key, the response can contain a :code:`Location` header describing where to find the new object by including the header :code:`Prefer: return=headers-only` in the request. Make sure that the table is not write-only, otherwise constructing the :code:`Location` header will cause a permissions error. + +.. tabs:: + + .. code-tab:: http + + POST /projects HTTP/1.1 + Prefer: return=headers-only + + {"id":33, "name": "x"} + + .. code-tab:: bash Curl + + curl "http://localhost:3000/projects" \ + -X POST -H "Content-Type: application/json" -H "Prefer: return=headers-only" \ + -d '{"id":33, "name": "x"}' + +.. code-block:: http + + HTTP/1.1 201 Created + Location: /projects?id=eq.34 + Preference-Applied: return=headers-only + +Full +---- + +On the other end of the spectrum you can get the full created object back in the response to your request by including the header :code:`Prefer: return=representation`. That way you won't have to make another HTTP call to discover properties that may have been filled in on the server side. You can also apply the standard :ref:`v_filter` to these results. + +.. tabs:: + + .. code-tab:: http + + POST /projects HTTP/1.1 + Content-Type: application/json; charset=utf-8 + Prefer: return=representation + + {"id":33, "name": "x"} + + .. code-tab:: bash Curl + + curl "http://localhost:3000/projects" \ + -X POST -H "Content-Type: application/json" -H "Prefer: return=representation" \ + -d '{"id":33, "name": "x"}' + +.. code:: + + HTTP/1.1 201 Created + Preference-Applied: return=representation + + [ + { + "id": 33, + "name": "x" + } + ] diff --git a/docs/references/api/tables_views.rst b/docs/references/api/tables_views.rst index 7e538714cf..74bca34c87 100644 --- a/docs/references/api/tables_views.rst +++ b/docs/references/api/tables_views.rst @@ -555,70 +555,7 @@ To create a row in a database table post a JSON object whose keys are the names HTTP/1.1 201 Created -No request body will be returned by default. - -.. note:: - - You can use the ``Prefer: return=minimal`` header to get the same behavior. This is only provided for completeness because it's basically a no-op. - -Prefer: return=headers-only ---------------------------- - -If the table has a primary key, the response can contain a :code:`Location` header describing where to find the new object by including the header :code:`Prefer: return=headers-only` in the request. Make sure that the table is not write-only, otherwise constructing the :code:`Location` header will cause a permissions error. - -.. tabs:: - - .. code-tab:: http - - POST /projects HTTP/1.1 - Prefer: return=headers-only - - {"id":33, "name": "x"} - - .. code-tab:: bash Curl - - curl "http://localhost:3000/projects" \ - -X POST -H "Content-Type: application/json" -H "Prefer: return=headers-only" \ - -d '{"id":33, "name": "x"}' - -.. code-block:: http - - HTTP/1.1 201 Created - Location: /projects?id=eq.34 - Preference-Applied: return=headers-only - -Prefer: return=representation ------------------------------ - -On the other end of the spectrum you can get the full created object back in the response to your request by including the header :code:`Prefer: return=representation`. That way you won't have to make another HTTP call to discover properties that may have been filled in on the server side. You can also apply the standard :ref:`v_filter` to these results. - -.. tabs:: - - .. code-tab:: http - - POST /projects HTTP/1.1 - Content-Type: application/json; charset=utf-8 - Prefer: return=representation - - {"id":33, "name": "x"} - - .. code-tab:: bash Curl - - curl "http://localhost:3000/projects" \ - -X POST -H "Content-Type: application/json" -H "Prefer: return=representation" \ - -d '{"id":33, "name": "x"}' - -.. code:: - - HTTP/1.1 201 Created - Preference-Applied: return=representation - - [ - { - "id": 33, - "name": "x" - } - ] +No response body will be returned by default but you can use :ref:`prefer_return` to get the affected resource. x-www-form-urlencoded --------------------- @@ -849,12 +786,14 @@ To update a row or rows in a table, use the PATCH verb. Use :ref:`h_filter` to s -X PATCH -H "Content-Type: application/json" \ -d '{ "category": "child" }' -Updates also support :code:`Prefer: return=representation` plus :ref:`v_filter`. +Updates also support :ref:`prefer_return` plus :ref:`v_filter`. .. warning:: Beware of accidentally updating every row in a table. To learn to prevent that see :ref:`block_fulltable`. +.. _prefer_resolution: + .. _upsert: Upsert @@ -966,7 +905,7 @@ To delete rows in a table, use the DELETE verb plus :ref:`h_filter`. For instanc curl "http://localhost:3000/user?active=is.false" -X DELETE -Deletions also support :code:`Prefer: return=representation` plus :ref:`v_filter`. +Deletions also support :ref:`prefer_return` plus :ref:`v_filter`. .. tabs:: @@ -1039,6 +978,8 @@ Using ``offset`` to target a different subset of rows is also possible. '#exact-count': 'pagination_count.html#exact-count', '#planned-count': 'pagination_count.html#planned-count', '#estimated-count': 'pagination_count.html#estimated-count', + '#prefer-return-headers-only': 'preferences.html#headers-only', + '#prefer-return-representation': 'preferences.html#full', }; let willRedirectTo = redirects[hash]; From 70c0d88fa75049fe7a85d44488fbc8ad21ce0b27 Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Fri, 1 Dec 2023 18:58:45 -0500 Subject: [PATCH 691/711] bring back schema isolation on its own page --- docs/explanations/db_authz.rst | 11 +---------- docs/explanations/schema_isolation.rst | 15 +++++++++++++++ 2 files changed, 16 insertions(+), 10 deletions(-) create mode 100644 docs/explanations/schema_isolation.rst diff --git a/docs/explanations/db_authz.rst b/docs/explanations/db_authz.rst index eb6b3041bc..e818428398 100644 --- a/docs/explanations/db_authz.rst +++ b/docs/explanations/db_authz.rst @@ -92,19 +92,10 @@ You can mix the group and individual role policies. For instance we could still -- allow authenticator to switch into user000 role -- (the role itself has nologin) -.. _schema_isolation: - Schemas ======= -A PostgREST instance exposes all the tables, views, and stored procedures of the schemas configured in :ref:`db-schemas`. This means private data or implementation details can go inside private schemas and be invisible to HTTP clients. - -It is recommended that you don't expose tables on the schemas you expose, instead expose views and stored procedures which insulate the internal details from the outside world. -This allows you to change the internals of your schema and maintain backwards compatibility. It also keeps your code easier to refactor, and provides a natural way to do API versioning. - -.. image:: ../_static/db.png - -You must explicitly allow roles to access the exposed schemas: +You must explicitly allow roles to access the exposed schemas in :ref:`db-schemas`. .. code-block:: postgres diff --git a/docs/explanations/schema_isolation.rst b/docs/explanations/schema_isolation.rst new file mode 100644 index 0000000000..342b15e8fa --- /dev/null +++ b/docs/explanations/schema_isolation.rst @@ -0,0 +1,15 @@ +.. note:: + + This page is a work in progress. + +.. _schema_isolation: + +Schema Isolation +================ + +A PostgREST instance exposes all the tables, views, and stored procedures of a single `PostgreSQL schema `_ (a namespace of database objects). This means private data or implementation details can go inside different private schemas and be invisible to HTTP clients. + +It is recommended that you don't expose tables on your API schema. Instead expose views and stored procedures which insulate the internal details from the outside world. +This allows you to change the internals of your schema and maintain backwards compatibility. It also keeps your code easier to refactor, and provides a natural way to do API versioning. + +.. image:: ../_static/db.png From f70e852a0a580f41ebaf46ecd9c832f9e903b06c Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Fri, 1 Dec 2023 19:41:04 -0500 Subject: [PATCH 692/711] bump to 12.0.0 --- docs/conf.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/conf.py b/docs/conf.py index 27da717814..e4f4a6576d 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -57,9 +57,9 @@ # built documents. # # The short X.Y version. -version = u'11.2' +version = u'12.0' # The full version, including alpha/beta/rc tags. -release = u'11.2.0' +release = u'12.0.0' # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. From 275bdee47c7fb9d3e5f308318be9c3929b3a9b04 Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Sat, 2 Dec 2023 01:36:26 -0500 Subject: [PATCH 693/711] fix server-timing header section Also link it to jwt caching --- docs/references/admin.rst | 30 ++++++++++++++++++----------- docs/references/api/url_grammar.rst | 2 ++ docs/references/auth.rst | 4 ++++ postgrest.dict | 1 + 4 files changed, 26 insertions(+), 11 deletions(-) diff --git a/docs/references/admin.rst b/docs/references/admin.rst index de10755941..0084c5f409 100644 --- a/docs/references/admin.rst +++ b/docs/references/admin.rst @@ -145,15 +145,11 @@ You can enable tracing HTTP requests by setting :ref:`server-trace-header`. Spec .. _server-timing_header: -`Server-Timing` Header ----------------------- +Server-Timing Header +-------------------- -You can enable the `Server-Timing `_ header by setting :ref:`server-timing-enabled` on. -This header provides timing information about the different phases of the request-response cycle. - -.. code:: bash - - server-timing-header = "on" +You can enable the `Server-Timing `_ header by setting :ref:`server-timing-enabled` on. +This header communicates metrics of the different phases in the request-response cycle. .. tabs:: @@ -163,12 +159,24 @@ This header provides timing information about the different phases of the reques .. code-tab:: bash Curl - curl "http://localhost:3000/users" - + curl "http://localhost:3000/users" -i + .. code:: HTTP/1.1 200 OK - Server-Timing: jwt;dur=16.0, render;dur=8.8, plan;dur=16956.1, query;dur=763.5 + + Server-Timing: jwt;dur=14.9, parse;dur=71.1, plan;dur=109.0, transaction;dur=353.2, response;dur=4.4 + +- All the durations (``dur``) are in milliseconds. +- The ``jwt`` stage is when :ref:`jwt_impersonation` is done. This duration can be lowered with :ref:`jwt_caching`. +- On the ``parse`` stage, the :ref:`url_grammar` is parsed. +- On the ``plan`` stage, the :ref:`schema_cache` is used to generate the :ref:`main_query` of the transaction. +- The ``transaction`` stage corresponds to the database transaction. See :ref:`transactions`. +- The ``response`` stage is where the response status and headers are computed. + +.. note:: + + We're working on lowering the duration of the ``parse`` and ``plan`` stages on https://github.com/PostgREST/postgrest/issues/2816. .. _explain_plan: diff --git a/docs/references/api/url_grammar.rst b/docs/references/api/url_grammar.rst index c562f0a75c..0fdb50f141 100644 --- a/docs/references/api/url_grammar.rst +++ b/docs/references/api/url_grammar.rst @@ -2,6 +2,8 @@ This page is a work in progress. +.. _url_grammar: + URL Grammar =========== diff --git a/docs/references/auth.rst b/docs/references/auth.rst index 379fc17f55..f2a3a69f13 100644 --- a/docs/references/auth.rst +++ b/docs/references/auth.rst @@ -109,6 +109,10 @@ PostgREST validates ``JWTs`` on every request. We can cache ``JWTs`` to avoid th To enable JWT caching, the config :code:`jwt-cache-max-lifetime` is to be set. It is the maximum number of seconds for which the cache stores the JWT validation results. The cache uses the :code:`exp` claim to set the cache entry lifetime. If the JWT does not have an :code:`exp` claim, it uses the config value. See :ref:`jwt-cache-max-lifetime` for more details. +.. note:: + + You can use the :ref:`server-timing_header` to see the effect of JWT caching. + Symmetric Keys ~~~~~~~~~~~~~~ diff --git a/postgrest.dict b/postgrest.dict index dc9281688b..8bc7b50598 100644 --- a/postgrest.dict +++ b/postgrest.dict @@ -25,6 +25,7 @@ cors CORS cryptographically CSV +durations DDL DOM DevOps From 802131aa962355a3b43f3bd4e9b668c53a3bd1c5 Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Sat, 2 Dec 2023 01:36:26 -0500 Subject: [PATCH 694/711] fix: any media type should be bytea --- docs/references/api/media_type_handlers.rst | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/docs/references/api/media_type_handlers.rst b/docs/references/api/media_type_handlers.rst index 710f50fd3c..f3f93c60be 100644 --- a/docs/references/api/media_type_handlers.rst +++ b/docs/references/api/media_type_handlers.rst @@ -221,7 +221,7 @@ Let's define an any handler for a view that will always respond with ``XML`` out .. code-block:: postgres - create domain "*/*" as pg_catalog.xml; + create domain "*/*" as bytea; -- we'll use an .xml suffix for the view to be clear its output is always XML create view "lines.xml" as @@ -230,7 +230,7 @@ Let's define an any handler for a view that will always respond with ``XML`` out -- transition function create or replace function lines_xml_trans (state "*/*", next "lines.xml") returns "*/*" as $$ - select xmlconcat(state, xmlelement(name line, xmlattributes(next.id as id, next.name as name), next.geom)); + select state || xmlelement(name line, xmlattributes(next.id as id, next.name as name), next.geom)::text::bytea || E'\n' ; $$ language sql; -- final function @@ -258,6 +258,16 @@ Let's define an any handler for a view that will always respond with ``XML`` out , finalfunc = lines_xml_final ); +Test it on SQL: + +.. code-block:: psql + + select (encode(lines_xml_agg(x), 'escape'))::xml from "lines.xml" x; + encode + ------------------------------------------------------------------------------------------------------------------------------ + 0102000020E610000002000000000000000000F03F000000000000F03F00000000000014400000000000001440+ + 0102000020E6100000020000000000000000000040000000000000004000000000000018400000000000001840+ + Now we can omit the ``Accept`` header and it will respond with XML. .. code-block:: bash From 9f252678a41bca191db1636a073d25ec91e5dd26 Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Tue, 12 Dec 2023 10:57:47 -0500 Subject: [PATCH 695/711] fix: add missing pgrst.server_timing_enabled --- docs/references/configuration.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/references/configuration.rst b/docs/references/configuration.rst index e867cc06a8..37558c55ae 100644 --- a/docs/references/configuration.rst +++ b/docs/references/configuration.rst @@ -832,7 +832,7 @@ server-timing-enabled **Default** False **Reloadable** Y **Environment** PGRST_SERVER_TIMING_ENABLED - **In-Database** `n/a` + **In-Database** pgrst.server_timing_enabled =============== ================================= Enables the `Server-Timing `_ header. From eb582fb4b03700ec001c1233a35f8a074b4a20a6 Mon Sep 17 00:00:00 2001 From: Laurence Isla Date: Tue, 12 Dec 2023 13:35:23 -0500 Subject: [PATCH 696/711] Add missing in-db configuration for jwt-cache-max-lifetime --- docs/references/configuration.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/references/configuration.rst b/docs/references/configuration.rst index 37558c55ae..0be64d2241 100644 --- a/docs/references/configuration.rst +++ b/docs/references/configuration.rst @@ -642,7 +642,7 @@ jwt-cache-max-lifetime **Default** 0 **Reloadable** Y **Environment** PGRST_JWT_CACHE_MAX_LIFETIME - **In-Database** `n/a` + **In-Database** pgrst.jwt_cache_max_lifetime =============== ================================= Maximum number of seconds of lifetime for cached entries. The default :code:`0` disables caching. See :ref:`jwt_caching`. From fdfc095b0e8eb35d7258cdc67c4fa4f4139bd0f7 Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Tue, 12 Dec 2023 17:41:04 -0500 Subject: [PATCH 697/711] fix: correct any media type handler --- docs/references/api/media_type_handlers.rst | 26 +++++++++++++-------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/docs/references/api/media_type_handlers.rst b/docs/references/api/media_type_handlers.rst index f3f93c60be..6387c1b8db 100644 --- a/docs/references/api/media_type_handlers.rst +++ b/docs/references/api/media_type_handlers.rst @@ -13,9 +13,11 @@ Media types are expressed as type aliases using `domains ` can become handlers and `user-defined aggregates `_ can serve as handlers for :ref:`tables_views` and :ref:`table_functions`. -.. note:: +.. important:: - PostgREST vendor media types (``application/vnd.pgrst.plan``, ``application/vnd.pgrst.object`` and ``application/vnd.pgrst.array``) cannot be overriden in this way. + - PostgREST vendor media types (``application/vnd.pgrst.plan``, ``application/vnd.pgrst.object`` and ``application/vnd.pgrst.array``) cannot be overriden. + - Long media types like ``application/vnd.openxmlformats-officedocument.wordprocessingml.document`` cannot be expressed as domains since they surpass `PostgreSQL identifier length `_. + For these you can use the :ref:`any_handler`. Handler Function ================ @@ -213,9 +215,11 @@ And request it like: The "Any" Handler ================= -For more flexibility, you can also define a catch-all handler by using a domain named ``*/*`` (any media type). This will respond to all media types and even to requests that don't include an ``Accept`` header. +For more flexibility, you can also define a catch-all handler by using a domain named ``*/*`` (any media type). This obeys to the following rules: -Note that this will take priority over all other handlers (builtin or custom), so it's better to do it for an isolated function or view. +- Responds to all media types and even to requests that don't include an ``Accept`` header. +- Sets the ``Content-Type`` header to ``application/octet-stream`` by default, but this can be overridden inside the function with :ref:`guc_resp_hdrs`. +- This overrides all other handlers (:ref:`builtin ` or custom), so it's better to do it for an isolated function or view. Let's define an any handler for a view that will always respond with ``XML`` output. It will accept ``text/xml``, ``application/xml``, ``*/*`` and reject other media types. @@ -240,12 +244,14 @@ Let's define an any handler for a view that will always respond with ``XML`` out -- get the Accept header req_accept text := current_setting('request.headers', true)::json->>'accept'; begin - -- when receiving */*, we need to set the Content-Type, otherwise PostgREST will set a default one. - if req_accept = '*/*' - then perform set_config('response.headers', '[{"Content-Type": "text/xml"}]', true); - -- we'll reject other non XML media types, we need to reject manually since */* will command PostgREST to accept all media types - elsif req_accept NOT IN ('application/xml', 'text/xml') - then raise sqlstate 'PT415' using message = 'Unsupported Media Type'; + -- when we need to override the default Content-Type (application/octet-stream) set by PostgREST + if req_accept = '*/*' then + perform set_config('response.headers', json_build_array(json_build_object('Content-Type', 'text/xml'))::text, true); + elsif req_accept IN ('application/xml', 'text/xml') then + perform set_config('response.headers', json_build_array(json_build_object('Content-Type', req_accept))::text, true); + else + -- we'll reject other non XML media types, we need to reject manually since */* will command PostgREST to accept all media types + raise sqlstate 'PT415' using message = 'Unsupported Media Type'; end if; return data; From fc58262cb2602ecd6a7c5660ea844d16f527c1b7 Mon Sep 17 00:00:00 2001 From: Laurence Isla Date: Tue, 12 Dec 2023 10:39:05 -0500 Subject: [PATCH 698/711] Add new sponsor (#723) --- docs/_static/code-build.png | Bin 0 -> 56151 bytes docs/index.rst | 9 +++++++-- 2 files changed, 7 insertions(+), 2 deletions(-) create mode 100644 docs/_static/code-build.png diff --git a/docs/_static/code-build.png b/docs/_static/code-build.png new file mode 100644 index 0000000000000000000000000000000000000000..5a2d3da5c4ddebf7d0459dda45a0376575b6c9ba GIT binary patch literal 56151 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 SbnYJI8=7jm4@>XchW&pU>(9Rc literal 0 HcmV?d00001 diff --git a/docs/index.rst b/docs/index.rst index 776d7d4bb1..c2b54bbc91 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -42,16 +42,21 @@ Sponsors :target: https://gnuhost.eu/?utm_source=sponsor&utm_campaign=postgrest :width: 13em + .. image:: _static/neon.jpg + :target: https://neon.tech/?utm_source=sponsor&utm_campaign=postgrest + :width: 13em + | .. image:: _static/supabase.png :target: https://supabase.com/?utm_source=postgrest%20backers&utm_medium=open%20source%20partner&utm_campaign=postgrest%20backers%20github&utm_term=homepage :width: 13em - .. image:: _static/neon.jpg - :target: https://neon.tech/?utm_source=sponsor&utm_campaign=postgrest + .. image:: _static/code-build.png + :target: https://code.build/?utm_source=sponsor&utm_campaign=postgrest :width: 13em + .. The static/empty.png(created with `convert -size 320x95 xc:#fcfcfc empty.png`) is an ugly workaround to create space and center the logos. It's not easy to layout with restructuredText. From d75538ec4a109b3afb694fa797cb5c4733827fbc Mon Sep 17 00:00:00 2001 From: Laurence Isla Date: Wed, 6 Dec 2023 16:48:58 -0500 Subject: [PATCH 699/711] Add missing curl requests in Preferences section --- docs/references/api/preferences.rst | 75 +++++++++++++++++++++-------- 1 file changed, 56 insertions(+), 19 deletions(-) diff --git a/docs/references/api/preferences.rst b/docs/references/api/preferences.rst index 50e3878639..cd6ba23cef 100644 --- a/docs/references/api/preferences.rst +++ b/docs/references/api/preferences.rst @@ -23,10 +23,17 @@ The server ignores unrecognized or unfulfillable preferences by default. You can ``handling=strict`` will throw an error if you specify invalid preferences. For instance: -.. code-block:: http +.. tabs:: - GET /projects HTTP/1.1 - Prefer: handling=strict, foo, bar + .. code-tab:: http + + GET /projects HTTP/1.1 + Prefer: handling=strict, foo, bar + + .. code-tab:: bash Curl + + curl -i "http://localhost:3000/projects" \ + -H "Prefer: handling=strict, foo, bar" .. code-block:: http @@ -45,10 +52,17 @@ The server ignores unrecognized or unfulfillable preferences by default. You can ``handling=lenient`` ignores invalid preferences. -.. code-block:: http +.. tabs:: - GET /projects HTTP/1.1 - Prefer: handling=lenient, foo, bar + .. code-tab:: http + + GET /projects HTTP/1.1 + Prefer: handling=lenient, foo, bar + + .. code-tab:: bash Curl + + curl -i "http://localhost:3000/projects" \ + -H "Prefer: handling=lenient, foo, bar" .. code-block:: http @@ -63,10 +77,17 @@ Timezone The ``timezone`` preference allows you to change the `PostgreSQL timezone `_. It accepts all timezones in `pg_timezone_names `_. -.. code-block:: http +.. tabs:: + + .. code-tab:: http - GET /timestamps HTTP/1.1 - Prefer: timezone=America/Los_Angeles + GET /timestamps HTTP/1.1 + Prefer: timezone=America/Los_Angeles + + .. code-tab:: bash Curl + + curl -i "http://localhost:3000/timestamps" \ + -H "Prefer: timezone=America/Los_Angeles" .. code-block:: http @@ -84,10 +105,17 @@ The ``timezone`` preference allows you to change the `PostgreSQL timezone `). -.. code-block:: http +.. tabs:: - GET /timestamps HTTP/1.1 - Prefer: timezone=Jupiter/Red_Spot + .. code-tab:: http + + GET /timestamps HTTP/1.1 + Prefer: timezone=Jupiter/Red_Spot + + .. code-tab:: bash Curl + + curl -i "http://localhost:3000/timestamps" \ + -H "Prefer: timezone=Jupiter/Red_Spot" .. code-block:: http @@ -106,10 +134,17 @@ Note that there's no ``Preference-Applied`` in the response. However, with ``handling=strict``, an invalid timezone preference will throw an :ref:`error `. -.. code-block:: http +.. tabs:: + + .. code-tab:: http + + GET /timestamps HTTP/1.1 + Prefer: handling=strict, timezone=Jupiter/Red_Spot + + .. code-tab:: bash Curl - GET /timestamps HTTP/1.1 - Prefer: handling=strict, timezone=Jupiter/Red_Spot + curl -i "http://localhost:3000/timestamps" \ + -H "Prefer: handling=strict, timezone=Jupiter/Red_Spot" .. code-block:: http @@ -144,8 +179,9 @@ If the table has a primary key, the response can contain a :code:`Location` head .. code-tab:: bash Curl - curl "http://localhost:3000/projects" \ - -X POST -H "Content-Type: application/json" -H "Prefer: return=headers-only" \ + curl -i "http://localhost:3000/projects" -X POST \ + -H "Content-Type: application/json" \ + -H "Prefer: return=headers-only" \ -d '{"id":33, "name": "x"}' .. code-block:: http @@ -171,8 +207,9 @@ On the other end of the spectrum you can get the full created object back in the .. code-tab:: bash Curl - curl "http://localhost:3000/projects" \ - -X POST -H "Content-Type: application/json" -H "Prefer: return=representation" \ + curl -i "http://localhost:3000/projects" -X POST \ + -H "Content-Type: application/json" \ + -H "Prefer: return=representation" \ -d '{"id":33, "name": "x"}' .. code:: From 474bb93e89632346e96bed6641299f495e1b5d19 Mon Sep 17 00:00:00 2001 From: Laurence Isla Date: Thu, 7 Dec 2023 15:52:57 -0500 Subject: [PATCH 700/711] Add meta tags using an Open Graph extension --- default.nix | 11 ++++------- docs/conf.py | 15 ++++++++++++++- extensions/sphinx-copybutton.nix | 33 -------------------------------- extensions/sphinx-tabs.nix | 29 ---------------------------- requirements.txt | 1 + 5 files changed, 19 insertions(+), 70 deletions(-) delete mode 100644 extensions/sphinx-copybutton.nix delete mode 100644 extensions/sphinx-tabs.nix diff --git a/default.nix b/default.nix index 0a54aa523d..b19802c136 100644 --- a/default.nix +++ b/default.nix @@ -1,9 +1,9 @@ let # Commit of the Nixpkgs repository that we want to use. nixpkgsVersion = { - date = "2021-06-02"; - rev = "84aa23742f6c72501f9cc209f29c438766f5352d"; - tarballHash = "0h7xl6q0yjrbl9vm3h6lkxw692nm8bg3wy65gm95a2mivhrdjpxp"; + date = "2023-03-25"; + rev = "dbf5322e93bcc6cfc52268367a8ad21c09d76fea"; + tarballHash = "0lwk4v9dkvd28xpqch0b0jrac4xl9lwm6snrnzx8k5lby72kmkng"; }; # Nix files that describe the Nixpkgs repository. We evaluate the expression @@ -15,10 +15,7 @@ let }) { }; - sphinxTabsPkg = ps: ps.callPackage ./extensions/sphinx-tabs.nix {}; - sphinxCopybuttonPkg = ps: ps.callPackage ./extensions/sphinx-copybutton.nix {}; - - python = pkgs.python3.withPackages (ps: [ ps.sphinx ps.sphinx_rtd_theme ps.livereload (sphinxTabsPkg ps) (sphinxCopybuttonPkg ps) ]); + python = pkgs.python3.withPackages (ps: [ ps.sphinx ps.sphinx_rtd_theme ps.livereload ps.sphinx-tabs ps.sphinx-copybutton ps.sphinxext-opengraph ]); in rec { inherit pkgs; diff --git a/docs/conf.py b/docs/conf.py index e4f4a6576d..e663398911 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -30,7 +30,8 @@ # ones. extensions = [ 'sphinx_tabs.tabs', - 'sphinx_copybutton' + 'sphinx_copybutton', + 'sphinxext.opengraph', ] # Add any paths that contain templates here, relative to this directory. @@ -298,3 +299,15 @@ def setup(app): # sphinx-tabs configuration sphinx_tabs_disable_tab_closing = True + +# sphinxext-opengraph configuration + +ogp_image = '_images/logo.png' +ogp_use_first_image = True +ogp_enable_meta_description = True +ogp_description_length = 300 + +## RTD sets html_baseurl, ensures we use the correct env for canonical URLs +## Useful to generate correct meta tags for Open Graph +## Refs: https://github.com/readthedocs/readthedocs.org/issues/10226, https://github.com/urllib3/urllib3/pull/3064 +html_baseurl = os.environ.get("READTHEDOCS_CANONICAL_URL", "/") diff --git a/extensions/sphinx-copybutton.nix b/extensions/sphinx-copybutton.nix deleted file mode 100644 index 8d408d300c..0000000000 --- a/extensions/sphinx-copybutton.nix +++ /dev/null @@ -1,33 +0,0 @@ -{ lib -, buildPythonPackage -, fetchFromGitHub -, sphinx -}: - -buildPythonPackage rec { - pname = "sphinx-copybutton"; - version = "0.4.0"; - - src = fetchFromGitHub { - owner = "executablebooks"; - repo = "sphinx-copybutton"; - rev = "v${version}"; - sha256 = "sha256-vrEIvQeP7AMXSme1PBp0ox5k8Q1rz+1cbHIO+o17Jqc="; - fetchSubmodules = true; - }; - - propagatedBuildInputs = [ - sphinx - ]; - - doCheck = false; # no tests - - pythonImportsCheck = [ "sphinx_copybutton" ]; - - meta = with lib; { - description = "A small sphinx extension to add a \"copy\" button to code blocks"; - homepage = "https://github.com/executablebooks/sphinx-copybutton"; - license = licenses.mit; - maintainers = with maintainers; [ Luflosi ]; - }; -} diff --git a/extensions/sphinx-tabs.nix b/extensions/sphinx-tabs.nix deleted file mode 100644 index f90b1c18d8..0000000000 --- a/extensions/sphinx-tabs.nix +++ /dev/null @@ -1,29 +0,0 @@ -{ lib -, buildPythonPackage -, fetchPypi -, sphinx -}: - -buildPythonPackage rec { - pname = "sphinx-tabs"; - version = "3.2.0"; - - src = fetchPypi { - inherit pname version; - sha256 = "sha256:1970aahi6sa7c37cpz8nwgdb2xzf21rk6ykdd1m6w9wvxla7j4rk"; - }; - - propagatedBuildInputs = [ - sphinx - ]; - - doCheck = false; - - pythonImportsCheck = [ "sphinx_tabs" ]; - - meta = with lib; { - description = "Create tabbed content in Sphinx documentation when building HTML"; - homepage = "https://sphinx-tabs.readthedocs.io"; - license = licenses.mit; - }; -} \ No newline at end of file diff --git a/requirements.txt b/requirements.txt index 6cf1adb8fa..0dc8d6a2ab 100644 --- a/requirements.txt +++ b/requirements.txt @@ -4,3 +4,4 @@ sphinx-copybutton sphinx-rtd-theme>=0.5.1 sphinx-tabs==3.2.0 urllib3==2.0.7 +sphinxext-opengraph==0.9.0 From 49e257617e26af474bad00fc4d099e2a431bc5bd Mon Sep 17 00:00:00 2001 From: Laurence Isla Date: Thu, 7 Dec 2023 18:47:56 -0500 Subject: [PATCH 701/711] Priorize query parameters instead of headers in limits and pagination --- docs/references/api/pagination_count.rst | 38 ++++++++++++++---------- 1 file changed, 22 insertions(+), 16 deletions(-) diff --git a/docs/references/api/pagination_count.rst b/docs/references/api/pagination_count.rst index 30b0d0da2c..ee1a1cfea1 100644 --- a/docs/references/api/pagination_count.rst +++ b/docs/references/api/pagination_count.rst @@ -18,7 +18,28 @@ PostgREST uses HTTP range headers to describe the size of results. Every respons Here items zero through fourteen are returned. This information is available in every response and can help you render pagination controls on the client. This is an RFC7233-compliant solution that keeps the response JSON cleaner. -There are two ways to apply a limit and offset rows: through request headers or query parameters. When using headers you specify the range of rows desired. This request gets the first twenty people. +Query Parameters +~~~~~~~~~~~~~~~~ + +One way to request limits and offsets is by using query parameters. For example: + +.. tabs:: + + .. code-tab:: http + + GET /people?limit=15&offset=30 HTTP/1.1 + + .. code-tab:: bash Curl + + curl "http://localhost:3000/people?limit=15&offset=30" + +This method is also useful for embedded resources, which we will cover in another section. The server always responds with range headers even if you use query parameters to limit the query. + +Range Header +~~~~~~~~~~~~ + +You can use headers to specify the range of rows desired. +This request gets the first twenty people: .. tabs:: @@ -44,20 +65,6 @@ Note that the server may respond with fewer if unable to meet your request: You may also request open-ended ranges for an offset with no limit, e.g. :code:`Range: 10-`. -The other way to request a limit or offset is with query parameters. For example - -.. tabs:: - - .. code-tab:: http - - GET /people?limit=15&offset=30 HTTP/1.1 - - .. code-tab:: bash Curl - - curl "http://localhost:3000/people?limit=15&offset=30" - -This method is also useful for embedded resources, which we will cover in another section. The server always responds with range headers even if you use query parameters to limit the query. - .. _prefer_count: Counting @@ -179,4 +186,3 @@ If we make a similar request on ``bigtable``, which has 3573458 rows, we would g HTTP/1.1 206 Partial Content Content-Range: 0-24/3572000 - From 40e16bd4680adbc9ba2f5b9833043174035afd6e Mon Sep 17 00:00:00 2001 From: Laurence Isla Date: Mon, 18 Dec 2023 12:14:52 -0500 Subject: [PATCH 702/711] Add new sponsor --- docs/_static/tembo.png | Bin 0 -> 1743833 bytes docs/index.rst | 9 ++++++--- 2 files changed, 6 insertions(+), 3 deletions(-) create mode 100644 docs/_static/tembo.png diff --git a/docs/_static/tembo.png b/docs/_static/tembo.png new file mode 100644 index 0000000000000000000000000000000000000000..6fbfabf5162d632aaffb5f32514a4b1653ab56a9 GIT binary patch literal 1743833 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 z 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°GxasOQ3b8YR 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

      v}TL_~!ss)C(X&*_Rk=5#`a=wF%%wtIiC8q}T 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


      4mnNmal(C-nua{_)2P|&hHS$*(fHSCb#&z+8& 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

      s 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

      *JWIwW`f9j!##QHhRs^^Ui1WL^)Sy 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 JRf?a!{T~**;nM&B literal 0 HcmV?d00001 diff --git a/docs/index.rst b/docs/index.rst index c2b54bbc91..a3cc4e355c 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -48,15 +48,18 @@ Sponsors | + .. image:: _static/code-build.png + :target: https://code.build/?utm_source=sponsor&utm_campaign=postgrest + :width: 13em + .. image:: _static/supabase.png :target: https://supabase.com/?utm_source=postgrest%20backers&utm_medium=open%20source%20partner&utm_campaign=postgrest%20backers%20github&utm_term=homepage :width: 13em - .. image:: _static/code-build.png - :target: https://code.build/?utm_source=sponsor&utm_campaign=postgrest + .. image:: _static/tembo.png + :target: https://tembo.io/?utm_source=sponsor&utm_campaign=postgrest :width: 13em - .. The static/empty.png(created with `convert -size 320x95 xc:#fcfcfc empty.png`) is an ugly workaround to create space and center the logos. It's not easy to layout with restructuredText. From a7d2c8e6ad9d3c8af868349537318172ec4f2695 Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Mon, 18 Dec 2023 23:58:17 -0500 Subject: [PATCH 703/711] docs: soap how-to is outdated `*/*` can now be handled with media type handlers --- docs/how-tos/create-soap-endpoint.rst | 21 +-------------------- 1 file changed, 1 insertion(+), 20 deletions(-) diff --git a/docs/how-tos/create-soap-endpoint.rst b/docs/how-tos/create-soap-endpoint.rst index 8114d7cecb..1e481d37a1 100644 --- a/docs/how-tos/create-soap-endpoint.rst +++ b/docs/how-tos/create-soap-endpoint.rst @@ -77,25 +77,6 @@ and should roughly look like: -Unfortunately the ``Accept: text/xml`` header is currently mandatory concerning PostgREST, otherwise it will respond -with a ``Content-Type: application/json`` header and enclose the response with quotes. -(You can check the returned headers by adding ``-v`` to the curl call.) - -If your SOAP clients do not send the ``Accept: text/xml`` header, you can fix that in your nginx reverse proxy -by adding something like ... - -.. code-block:: nginx - - set $accept $http_accept; - if ($contentType ~ "^text/xml($|;)") { - set $accept "text/xml"; - } - proxy_set_header Accept $accept; - -to your ``location`` nginx configuration. -(The given example sets the ``Accept`` header for each request of Content-Type ``text/xml``.) - - A more elaborate example ------------------------ @@ -211,7 +192,7 @@ References For more information concerning PostgREST, cf. - :ref:`s_proc_single_unnamed` -- :ref:`custom_media`. See :ref:`any_handler`, if you need to support an ``application/soap+xml`` media type. +- :ref:`custom_media`. See :ref:`any_handler`, if you need to support an ``application/soap+xml`` media type or if you want to respond with XML without sending a media type. - :ref:`Nginx reverse proxy ` For SOAP reference, visit From cb501a90411036fd546918f046b5aa8efa2315f1 Mon Sep 17 00:00:00 2001 From: Laurence Isla Date: Tue, 19 Dec 2023 13:25:16 -0500 Subject: [PATCH 704/711] Add warning and fix to htmx how-to --- .../providing-html-content-using-htmx.rst | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/docs/how-tos/providing-html-content-using-htmx.rst b/docs/how-tos/providing-html-content-using-htmx.rst index d871c205bf..fd52815d87 100644 --- a/docs/how-tos/providing-html-content-using-htmx.rst +++ b/docs/how-tos/providing-html-content-using-htmx.rst @@ -11,6 +11,11 @@ Htmx expects an HTML response and uses it to replace an element inside the DOM ( .. image:: ../_static/how-tos/htmx-demo.gif +.. warning:: + + This is a proof of concept showing what can be achieved using both technologies. + We are working on `plmustache `_ which will further improve the HTML aspect of this how-to. + Preparatory Configuration ------------------------- @@ -69,9 +74,14 @@ Listing and Creating To-Dos --------------------------- Now, let's show a list of the to-dos already inserted in the database. +For that, we'll also need a function to help us sanitize the HTML content that may be present in the task. .. code-block:: postgres + create or replace function api.sanitize_html(text) returns text as $$ + select replace(replace(replace(replace(replace($1, '&', '&'), '"', '"'),'>', '>'),'<', '<'), '''', ''') + $$ language sql; + create or replace function api.html_todo(api.todos) returns text as $$ select format($html$

    1. @@ -82,7 +92,7 @@ Now, let's show a list of the to-dos already inserted in the database. $html$, $1.id, case when $1.done then 'line-through text-gray-400' else '' end, - $1.task + api.sanitize_html($1.task) ); $$ language sql stable; @@ -220,7 +230,7 @@ Now, let's modify ``api.html_todo`` and make it more functional. $html$, $1.id, case when $1.done then 'line-through text-gray-400' else '' end, - $1.task, + api.sanitize_html($1.task), (not $1.done)::text ); $$ language sql stable; @@ -269,7 +279,7 @@ That's why we create the ``api.html_editable_task`` function as an endpoint: $html$, id, - task + api.sanitize_html(task) ) from api.todos where id = _id; From f95c5127dfb5527208021ba4669246ad7dc8b759 Mon Sep 17 00:00:00 2001 From: Laurence Isla Date: Wed, 20 Dec 2023 19:16:48 -0500 Subject: [PATCH 705/711] Update sponsor image (#728) --- docs/_static/tembo.png | Bin 1743833 -> 45607 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/docs/_static/tembo.png b/docs/_static/tembo.png index 6fbfabf5162d632aaffb5f32514a4b1653ab56a9..c3a38751762a1883158a7f71706dc272bd03f66e 100644 GIT binary patch literal 45607 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 z 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°GxasOQ3b8YR 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

        v}TL_~!ss)C(X&*_Rk=5#`a=wF%%wtIiC8q}T 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


        4mnNmal(C-nua{_)2P|&hHS$*(fHSCb#&z+8& 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

        s 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

        *JWIwW`f9j!##QHhRs^^Ui1WL^)Sy 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 JRf?a!{T~**;nM&B From efcf36d97089a1a6dd47f73b166a191a840e94f3 Mon Sep 17 00:00:00 2001 From: Gabriel Miranda Date: Sun, 31 Dec 2023 00:17:04 -0300 Subject: [PATCH 706/711] Fix secret command to avoid non-ascii alphanumerics --- docs/tutorials/tut1.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/tutorials/tut1.rst b/docs/tutorials/tut1.rst index 634e47e3e1..b379de538e 100644 --- a/docs/tutorials/tut1.rst +++ b/docs/tutorials/tut1.rst @@ -41,7 +41,7 @@ Let's create a password and provide it to PostgREST. Think of a nice long one, o export LC_CTYPE=C # read random bytes and keep only alphanumerics - echo "jwt-secret = \"$(< /dev/urandom tr -dc A-Za-z0-9 | head -c32)\"" >> tutorial.conf + echo "jwt-secret = \"$(LC_ALL=C tr -dc 'A-Za-z0-9' > tutorial.conf check the :code:`tutorial.conf` (created in the previous tutorial) the line with the password: From 8605edcb6fef409d718709acb42cf6875b858354 Mon Sep 17 00:00:00 2001 From: Parashoe Date: Mon, 15 Jan 2024 17:18:20 -0800 Subject: [PATCH 707/711] Spelling correction (#740) Spell correct "callounter" to "callcounter" --- docs/references/transactions.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/references/transactions.rst b/docs/references/transactions.rst index dee915a593..85c6986882 100644 --- a/docs/references/transactions.rst +++ b/docs/references/transactions.rst @@ -34,7 +34,7 @@ Since the ``callcounter`` view modifies the sequence, calling it with GET or HEA .. code-tab:: http - GET /callounter HTTP/1.1 + GET /callcounter HTTP/1.1 .. code-tab:: bash Curl From 6962e41a3725bd06dc1d2d6d1bed0303be7d6064 Mon Sep 17 00:00:00 2001 From: Laurence Isla Date: Mon, 15 Jan 2024 20:09:54 -0500 Subject: [PATCH 708/711] Fix Sphinx version error in RTD (#739) --- .test | 0 requirements.txt | 6 +++--- 2 files changed, 3 insertions(+), 3 deletions(-) create mode 100644 .test diff --git a/.test b/.test new file mode 100644 index 0000000000..e69de29bb2 diff --git a/requirements.txt b/requirements.txt index 0dc8d6a2ab..48f39ed864 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,7 +1,7 @@ -docutils==0.16 -sphinx>=4.3.0 +docutils==0.17.1 +sphinx>=5.0.2 sphinx-copybutton sphinx-rtd-theme>=0.5.1 -sphinx-tabs==3.2.0 +sphinx-tabs>=3.2.0 urllib3==2.0.7 sphinxext-opengraph==0.9.0 From 867dc58ecc4212d7408e8626da4d4172f1a2a77a Mon Sep 17 00:00:00 2001 From: Laurence Isla Date: Mon, 15 Jan 2024 20:17:55 -0500 Subject: [PATCH 709/711] Update sponsor logo --- docs/_static/code-build.png | Bin 56151 -> 0 bytes docs/_static/code-build.webp | Bin 0 -> 18476 bytes docs/index.rst | 2 +- 3 files changed, 1 insertion(+), 1 deletion(-) delete mode 100644 docs/_static/code-build.png create mode 100644 docs/_static/code-build.webp diff --git a/docs/_static/code-build.png b/docs/_static/code-build.png deleted file mode 100644 index 5a2d3da5c4ddebf7d0459dda45a0376575b6c9ba..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 56151 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 SbnYJI8=7jm4@>XchW&pU>(9Rc diff --git a/docs/_static/code-build.webp b/docs/_static/code-build.webp new file mode 100644 index 0000000000000000000000000000000000000000..3024afc6b7a9618abbf67cdbfb8ed122e185eb2d GIT binary patch literal 18476 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 Date: Sat, 17 Feb 2024 12:53:41 +0100 Subject: [PATCH 710/711] chore: Prepare merge of postgrest-docs into postgrest main repo This avoids some merge conflicts to allow git blame to detect renames properly. --- .github/workflows/{ci.yaml => docs.yaml} | 14 +++++++------- .readthedocs.yaml | 2 +- .gitignore => docs/.gitignore | 2 +- README.md => docs/README.md | 0 {diagrams => docs/_diagrams}/README.md | 4 ++-- {diagrams => docs/_diagrams}/boxoffice.er | 0 {diagrams => docs/_diagrams}/db.tex | 0 {diagrams => docs/_diagrams}/employees.er | 0 {diagrams => docs/_diagrams}/film.er | 0 {diagrams => docs/_diagrams}/orders.er | 0 {diagrams => docs/_diagrams}/premieres.er | 0 {diagrams => docs/_diagrams}/presidents.er | 0 {diagrams => docs/_diagrams}/users.er | 0 default.nix => docs/default.nix | 13 +++++++++---- livereload_docs.py => docs/livereload_docs.py | 4 ++-- postgrest.dict => docs/postgrest.dict | 0 requirements.txt => docs/requirements.txt | 0 shell.nix => docs/shell.nix | 0 18 files changed, 22 insertions(+), 17 deletions(-) rename .github/workflows/{ci.yaml => docs.yaml} (77%) rename .gitignore => docs/.gitignore (79%) rename README.md => docs/README.md (100%) rename {diagrams => docs/_diagrams}/README.md (91%) rename {diagrams => docs/_diagrams}/boxoffice.er (100%) rename {diagrams => docs/_diagrams}/db.tex (100%) rename {diagrams => docs/_diagrams}/employees.er (100%) rename {diagrams => docs/_diagrams}/film.er (100%) rename {diagrams => docs/_diagrams}/orders.er (100%) rename {diagrams => docs/_diagrams}/premieres.er (100%) rename {diagrams => docs/_diagrams}/presidents.er (100%) rename {diagrams => docs/_diagrams}/users.er (100%) rename default.nix => docs/default.nix (80%) rename livereload_docs.py => docs/livereload_docs.py (61%) rename postgrest.dict => docs/postgrest.dict (100%) rename requirements.txt => docs/requirements.txt (100%) rename shell.nix => docs/shell.nix (100%) diff --git a/.github/workflows/ci.yaml b/.github/workflows/docs.yaml similarity index 77% rename from .github/workflows/ci.yaml rename to .github/workflows/docs.yaml index 54dbc6beb1..2e3eacc143 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/docs.yaml @@ -1,14 +1,14 @@ -name: CI +name: Docs on: push: branches: - main - - v* + - rel-* pull_request: branches: - main - - v* + - rel-* jobs: build: @@ -17,7 +17,7 @@ jobs: steps: - uses: actions/checkout@v4 - uses: cachix/install-nix-action@v23 - - run: nix-env -f default.nix -iA build + - run: nix-env -f docs/default.nix -iA build - run: postgrest-docs-build spellcheck: @@ -26,7 +26,7 @@ jobs: steps: - uses: actions/checkout@v4 - uses: cachix/install-nix-action@v23 - - run: nix-env -f default.nix -iA spellcheck + - run: nix-env -f docs/default.nix -iA spellcheck - run: postgrest-docs-spellcheck dictcheck: @@ -35,7 +35,7 @@ jobs: steps: - uses: actions/checkout@v4 - uses: cachix/install-nix-action@v23 - - run: nix-env -f default.nix -iA dictcheck + - run: nix-env -f docs/default.nix -iA dictcheck - run: postgrest-docs-dictcheck linkcheck: @@ -45,6 +45,6 @@ jobs: steps: - uses: actions/checkout@v4 - uses: cachix/install-nix-action@v23 - - run: nix-env -f default.nix -iA linkcheck + - run: nix-env -f docs/default.nix -iA linkcheck - run: postgrest-docs-linkcheck diff --git a/.readthedocs.yaml b/.readthedocs.yaml index 4690fde9d5..0d7162c8f7 100644 --- a/.readthedocs.yaml +++ b/.readthedocs.yaml @@ -3,7 +3,7 @@ sphinx: configuration: docs/conf.py python: install: - - requirements: requirements.txt + - requirements: docs/requirements.txt build: os: ubuntu-22.04 tools: diff --git a/.gitignore b/docs/.gitignore similarity index 79% rename from .gitignore rename to docs/.gitignore index bab47b52ea..503e5d5247 100644 --- a/.gitignore +++ b/docs/.gitignore @@ -2,7 +2,7 @@ _build Pipfile.lock *.aux *.log -diagrams/db.pdf +_diagrams/db.pdf misspellings unuseddict .history diff --git a/README.md b/docs/README.md similarity index 100% rename from README.md rename to docs/README.md diff --git a/diagrams/README.md b/docs/_diagrams/README.md similarity index 91% rename from diagrams/README.md rename to docs/_diagrams/README.md index fa4a1e7fe9..7014ae3780 100644 --- a/diagrams/README.md +++ b/docs/_diagrams/README.md @@ -5,7 +5,7 @@ The ER diagrams were created with https://github.com/BurntSushi/erd/. You can go download erd from https://github.com/BurntSushi/erd/releases and then do: ```bash -./erd_static-x86-64 -i diagrams/film.er -o docs/_static/film.png +./erd_static-x86-64 -i film.er -o ../_static/film.png ``` The fonts used belong to the GNU FreeFont family. You can download them here: http://ftp.gnu.org/gnu/freefont/ @@ -20,7 +20,7 @@ Then use this command to generate the png file. pdflatex --shell-escape -halt-on-error db.tex ## and move it to the static folder(it's not easy to do it in one go with the pdflatex) -mv db.png ../docs/_static/ +mv db.png ../_static/ ``` LaTeX is used because it's a tweakable plain text format. diff --git a/diagrams/boxoffice.er b/docs/_diagrams/boxoffice.er similarity index 100% rename from diagrams/boxoffice.er rename to docs/_diagrams/boxoffice.er diff --git a/diagrams/db.tex b/docs/_diagrams/db.tex similarity index 100% rename from diagrams/db.tex rename to docs/_diagrams/db.tex diff --git a/diagrams/employees.er b/docs/_diagrams/employees.er similarity index 100% rename from diagrams/employees.er rename to docs/_diagrams/employees.er diff --git a/diagrams/film.er b/docs/_diagrams/film.er similarity index 100% rename from diagrams/film.er rename to docs/_diagrams/film.er diff --git a/diagrams/orders.er b/docs/_diagrams/orders.er similarity index 100% rename from diagrams/orders.er rename to docs/_diagrams/orders.er diff --git a/diagrams/premieres.er b/docs/_diagrams/premieres.er similarity index 100% rename from diagrams/premieres.er rename to docs/_diagrams/premieres.er diff --git a/diagrams/presidents.er b/docs/_diagrams/presidents.er similarity index 100% rename from diagrams/presidents.er rename to docs/_diagrams/presidents.er diff --git a/diagrams/users.er b/docs/_diagrams/users.er similarity index 100% rename from diagrams/users.er rename to docs/_diagrams/users.er diff --git a/default.nix b/docs/default.nix similarity index 80% rename from default.nix rename to docs/default.nix index b19802c136..8da9118709 100644 --- a/default.nix +++ b/docs/default.nix @@ -24,17 +24,19 @@ rec { pkgs.writeShellScriptBin "postgrest-docs-build" '' set -euo pipefail + cd "$(${pkgs.git}/bin/git rev-parse --show-toplevel)/docs" # clean previous build, otherwise some errors might be supressed rm -rf _build - ${python}/bin/sphinx-build --color -W -b html -a -n docs _build + ${python}/bin/sphinx-build --color -W -b html -a -n . _build ''; serve = pkgs.writeShellScriptBin "postgrest-docs-serve" '' set -euo pipefail + cd "$(${pkgs.git}/bin/git rev-parse --show-toplevel)/docs" # livereload_docs.py needs to find "sphinx-build" PATH=${python}/bin:$PATH @@ -46,8 +48,9 @@ rec { pkgs.writeShellScriptBin "postgrest-docs-spellcheck" '' set -euo pipefail + cd "$(${pkgs.git}/bin/git rev-parse --show-toplevel)/docs" - FILES=$(find docs -type f -iname '*.rst' | tr '\n' ' ') + FILES=$(find . -type f -iname '*.rst' | tr '\n' ' ') cat $FILES \ | grep -v '^\(\.\.\| \)' \ @@ -63,8 +66,9 @@ rec { pkgs.writeShellScriptBin "postgrest-docs-dictcheck" '' set -euo pipefail + cd "$(${pkgs.git}/bin/git rev-parse --show-toplevel)/docs" - FILES=$(find docs -type f -iname '*.rst' | tr '\n' ' ') + FILES=$(find . -type f -iname '*.rst' | tr '\n' ' ') cat postgrest.dict \ | tail -n+2 \ @@ -79,8 +83,9 @@ rec { pkgs.writeShellScriptBin "postgrest-docs-linkcheck" '' set -euo pipefail + cd "$(${pkgs.git}/bin/git rev-parse --show-toplevel)/docs" - ${python}/bin/sphinx-build --color -b linkcheck docs _build + ${python}/bin/sphinx-build --color -b linkcheck . _build ''; check = diff --git a/livereload_docs.py b/docs/livereload_docs.py similarity index 61% rename from livereload_docs.py rename to docs/livereload_docs.py index 8dae165774..741633d43d 100755 --- a/livereload_docs.py +++ b/docs/livereload_docs.py @@ -2,9 +2,9 @@ from livereload import Server, shell from subprocess import call ## Build docs at startup -call(['sphinx-build', '-b', 'html', '-a', '-n', 'docs', '_build']) +call(['sphinx-build', '-b', 'html', '-a', '-n', '.', '_build']) server = Server() -server.watch('docs/**/*.rst', shell('sphinx-build -b html -a -n docs _build')) +server.watch('**/*.rst', shell('sphinx-build -b html -a -n . _build')) # For custom port and host # server.serve(root='_build/', host='192.168.1.2') server.serve(root='_build/') diff --git a/postgrest.dict b/docs/postgrest.dict similarity index 100% rename from postgrest.dict rename to docs/postgrest.dict diff --git a/requirements.txt b/docs/requirements.txt similarity index 100% rename from requirements.txt rename to docs/requirements.txt diff --git a/shell.nix b/docs/shell.nix similarity index 100% rename from shell.nix rename to docs/shell.nix From 7f410f3be0540450cfd1143b853a8a13866f0eeb Mon Sep 17 00:00:00 2001 From: Wolfgang Walther Date: Sat, 17 Feb 2024 12:57:18 +0100 Subject: [PATCH 711/711] chore: Run postgrest-style on docs files This prevents CI from failing after the merge. --- docs/conf.py | 169 ++++++++++++++++++++-------------------- docs/livereload_docs.py | 7 +- docs/shell.nix | 3 +- 3 files changed, 90 insertions(+), 89 deletions(-) diff --git a/docs/conf.py b/docs/conf.py index e663398911..494c1fca2b 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -18,91 +18,91 @@ # If extensions (or modules to document with autodoc) are in another directory, # add these directories to sys.path here. If the directory is relative to the # documentation root, use os.path.abspath to make it absolute, like shown here. -#sys.path.insert(0, os.path.abspath('.')) +# sys.path.insert(0, os.path.abspath('.')) # -- General configuration ------------------------------------------------ # If your documentation needs a minimal Sphinx version, state it here. -#needs_sphinx = '1.0' +# needs_sphinx = '1.0' # Add any Sphinx extension module names here, as strings. They can be # extensions coming with Sphinx (named 'sphinx.ext.*') or your custom # ones. extensions = [ - 'sphinx_tabs.tabs', - 'sphinx_copybutton', - 'sphinxext.opengraph', + "sphinx_tabs.tabs", + "sphinx_copybutton", + "sphinxext.opengraph", ] # Add any paths that contain templates here, relative to this directory. -templates_path = ['_templates'] +templates_path = ["_templates"] # The suffix(es) of source filenames. # You can specify multiple suffix as a list of string: # source_suffix = ['.rst', '.md'] -source_suffix = '.rst' +source_suffix = ".rst" # The encoding of source files. -#source_encoding = 'utf-8-sig' +# source_encoding = 'utf-8-sig' # The master toctree document. -master_doc = 'index' +master_doc = "index" # General information about the project. -project = u'PostgREST' -author = u'Joe Nelson, Steve Chavez' -copyright = u'2017, ' + author +project = "PostgREST" +author = "Joe Nelson, Steve Chavez" +copyright = "2017, " + author # The version info for the project you're documenting, acts as replacement for # |version| and |release|, also used in various other places throughout the # built documents. # # The short X.Y version. -version = u'12.0' +version = "12.0" # The full version, including alpha/beta/rc tags. -release = u'12.0.0' +release = "12.0.0" # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. # # This is also used if you do content translation via gettext catalogs. # Usually you set "language" from the command line for these cases. -language = 'en' +language = "en" # There are two options for replacing |today|: either, you set today to some # non-false value, then it is used: -#today = '' +# today = '' # Else, today_fmt is used as the format for a strftime call. -#today_fmt = '%B %d, %Y' +# today_fmt = '%B %d, %Y' # List of patterns, relative to source directory, that match files and # directories to ignore when looking for source files. # This patterns also effect to html_static_path and html_extra_path -exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store', 'shared/*.rst'] +exclude_patterns = ["_build", "Thumbs.db", ".DS_Store", "shared/*.rst"] # The reST default role (used for this markup: `text`) to use for all # documents. -#default_role = None +# default_role = None # If true, '()' will be appended to :func: etc. cross-reference text. -#add_function_parentheses = True +# add_function_parentheses = True # If true, the current module name will be prepended to all description # unit titles (such as .. function::). -#add_module_names = True +# add_module_names = True # If true, sectionauthor and moduleauthor directives will be shown in the # output. They are ignored by default. -#show_authors = False +# show_authors = False # The name of the Pygments (syntax highlighting) style to use. -pygments_style = 'sphinx' +pygments_style = "sphinx" # A list of ignored prefixes for module index sorting. -#modindex_common_prefix = [] +# modindex_common_prefix = [] # If true, keep warnings as "system message" paragraphs in the built documents. -#keep_warnings = False +# keep_warnings = False # If true, `todo` and `todoList` produce output, else they produce nothing. todo_include_todos = False @@ -112,158 +112,151 @@ # The theme to use for HTML and HTML Help pages. See the documentation for # a list of builtin themes. -html_theme = 'sphinx_rtd_theme' +html_theme = "sphinx_rtd_theme" # Theme options are theme-specific and customize the look and feel of a theme # further. For a list of options available for each theme, see the # documentation. -#html_theme_options = {} +# html_theme_options = {} # Add any paths that contain custom themes here, relative to this directory. -#html_theme_path = [] +# html_theme_path = [] # The name for this set of Sphinx documents. # " v documentation" by default. -#html_title = u'PostgREST v0.4.0.0' +# html_title = u'PostgREST v0.4.0.0' # A shorter title for the navigation bar. Default is the same as html_title. -#html_short_title = None +# html_short_title = None # The name of an image file (relative to this directory) to place at the top # of the sidebar. -#html_logo = None +# html_logo = None # The name of an image file (relative to this directory) to use as a favicon of # the docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32 # pixels large. -html_favicon = '_static/favicon.ico' +html_favicon = "_static/favicon.ico" # Add any paths that contain custom static files (such as style sheets) here, # relative to this directory. They are copied after the builtin static files, # so a file named "default.css" will overwrite the builtin "default.css". -html_static_path = ['_static'] +html_static_path = ["_static"] # Add any extra paths that contain custom files (such as robots.txt or # .htaccess) here, relative to this directory. These files are copied # directly to the root of the documentation. -#html_extra_path = [] +# html_extra_path = [] # If not None, a 'Last updated on:' timestamp is inserted at every page # bottom, using the given strftime format. # The empty string is equivalent to '%b %d, %Y'. -#html_last_updated_fmt = None +# html_last_updated_fmt = None # If true, SmartyPants will be used to convert quotes and dashes to # typographically correct entities. -#html_use_smartypants = True +# html_use_smartypants = True # Custom sidebar templates, maps document names to template names. -#html_sidebars = {} +# html_sidebars = {} # Additional templates that should be rendered to pages, maps page names to # template names. -#html_additional_pages = {} +# html_additional_pages = {} # If false, no module index is generated. -#html_domain_indices = True +# html_domain_indices = True # If false, no index is generated. -#html_use_index = True +# html_use_index = True # If true, the index is split into individual pages for each letter. -#html_split_index = False +# html_split_index = False # If true, links to the reST sources are added to the pages. -#html_show_sourcelink = True +# html_show_sourcelink = True # If true, "Created using Sphinx" is shown in the HTML footer. Default is True. -#html_show_sphinx = True +# html_show_sphinx = True # If true, "(C) Copyright ..." is shown in the HTML footer. Default is True. -#html_show_copyright = True +# html_show_copyright = True # If true, an OpenSearch description file will be output, and all pages will # contain a tag referring to it. The value of this option must be the # base URL from which the finished HTML is served. -#html_use_opensearch = '' +# html_use_opensearch = '' # This is the file name suffix for HTML files (e.g. ".xhtml"). -#html_file_suffix = None +# html_file_suffix = None # Language to be used for generating the HTML full-text search index. # Sphinx supports the following languages: # 'da', 'de', 'en', 'es', 'fi', 'fr', 'hu', 'it', 'ja' # 'nl', 'no', 'pt', 'ro', 'ru', 'sv', 'tr', 'zh' -#html_search_language = 'en' +# html_search_language = 'en' # A dictionary with options for the search language support, empty by default. # 'ja' uses this config value. # 'zh' user can custom change `jieba` dictionary path. -#html_search_options = {'type': 'default'} +# html_search_options = {'type': 'default'} # The name of a javascript file (relative to the configuration directory) that # implements a search results scorer. If empty, the default will be used. -#html_search_scorer = 'scorer.js' +# html_search_scorer = 'scorer.js' # Output file base name for HTML help builder. -htmlhelp_basename = 'PostgRESTdoc' +htmlhelp_basename = "PostgRESTdoc" # -- Options for LaTeX output --------------------------------------------- latex_elements = { -# The paper size ('letterpaper' or 'a4paper'). -#'papersize': 'letterpaper', - -# The font size ('10pt', '11pt' or '12pt'). -#'pointsize': '10pt', - -# Additional stuff for the LaTeX preamble. -#'preamble': '', - -# Latex figure (float) alignment -#'figure_align': 'htbp', + # The paper size ('letterpaper' or 'a4paper'). + #'papersize': 'letterpaper', + # The font size ('10pt', '11pt' or '12pt'). + #'pointsize': '10pt', + # Additional stuff for the LaTeX preamble. + #'preamble': '', + # Latex figure (float) alignment + #'figure_align': 'htbp', } # Grouping the document tree into LaTeX files. List of tuples # (source start file, target name, title, # author, documentclass [howto, manual, or own class]). latex_documents = [ - (master_doc, 'PostgREST.tex', u'PostgREST Documentation', - author, 'manual'), + (master_doc, "PostgREST.tex", "PostgREST Documentation", author, "manual"), ] # The name of an image file (relative to this directory) to place at the top of # the title page. -#latex_logo = None +# latex_logo = None # For "manual" documents, if this is true, then toplevel headings are parts, # not chapters. -#latex_use_parts = False +# latex_use_parts = False # If true, show page references after internal links. -#latex_show_pagerefs = False +# latex_show_pagerefs = False # If true, show URL addresses after external links. -#latex_show_urls = False +# latex_show_urls = False # Documents to append as an appendix to all manuals. -#latex_appendices = [] +# latex_appendices = [] # If false, no module index is generated. -#latex_domain_indices = True +# latex_domain_indices = True # -- Options for manual page output --------------------------------------- # One entry per manual page. List of tuples # (source start file, name, description, authors, manual section). -man_pages = [ - (master_doc, 'postgrest', u'PostgREST Documentation', - [author], 1) -] +man_pages = [(master_doc, "postgrest", "PostgREST Documentation", [author], 1)] # If true, show URL addresses after external links. -#man_show_urls = False +# man_show_urls = False # -- Options for Texinfo output ------------------------------------------- @@ -272,37 +265,45 @@ # (source start file, target name, title, author, # dir menu entry, description, category) texinfo_documents = [ - (master_doc, 'PostgREST', u'PostgREST Documentation', - author, 'PostgREST', 'REST API for any PostgreSQL database', - 'Web'), + ( + master_doc, + "PostgREST", + "PostgREST Documentation", + author, + "PostgREST", + "REST API for any PostgreSQL database", + "Web", + ), ] # Documents to append as an appendix to all manuals. -#texinfo_appendices = [] +# texinfo_appendices = [] # If false, no module index is generated. -#texinfo_domain_indices = True +# texinfo_domain_indices = True # How to display URL addresses: 'footnote', 'no', or 'inline'. -#texinfo_show_urls = 'footnote' +# texinfo_show_urls = 'footnote' # If true, do not generate a @detailmenu in the "Top" node's menu. -#texinfo_no_detailmenu = False +# texinfo_no_detailmenu = False # -- Custom setup --------------------------------------------------------- + def setup(app): - app.add_css_file('css/custom.css') + app.add_css_file("css/custom.css") + # taken from https://github.com/sphinx-doc/sphinx/blob/82dad44e5bd3776ecb6fd8ded656bc8151d0e63d/sphinx/util/requests.py#L42 -user_agent = 'Mozilla/5.0 (X11; Linux x86_64; rv:25.0) Gecko/20100101 Firefox/25.0' +user_agent = "Mozilla/5.0 (X11; Linux x86_64; rv:25.0) Gecko/20100101 Firefox/25.0" # sphinx-tabs configuration sphinx_tabs_disable_tab_closing = True # sphinxext-opengraph configuration -ogp_image = '_images/logo.png' +ogp_image = "_images/logo.png" ogp_use_first_image = True ogp_enable_meta_description = True ogp_description_length = 300 diff --git a/docs/livereload_docs.py b/docs/livereload_docs.py index 741633d43d..67a2165d66 100755 --- a/docs/livereload_docs.py +++ b/docs/livereload_docs.py @@ -1,10 +1,11 @@ #!/usr/bin/env python from livereload import Server, shell from subprocess import call + ## Build docs at startup -call(['sphinx-build', '-b', 'html', '-a', '-n', '.', '_build']) +call(["sphinx-build", "-b", "html", "-a", "-n", ".", "_build"]) server = Server() -server.watch('**/*.rst', shell('sphinx-build -b html -a -n . _build')) +server.watch("**/*.rst", shell("sphinx-build -b html -a -n . _build")) # For custom port and host # server.serve(root='_build/', host='192.168.1.2') -server.serve(root='_build/') +server.serve(root="_build/") diff --git a/docs/shell.nix b/docs/shell.nix index 2bb41b9287..d74d12a4d7 100644 --- a/docs/shell.nix +++ b/docs/shell.nix @@ -2,8 +2,7 @@ let docs = import ./default.nix; - pkgs = - docs.pkgs; + inherit (docs) pkgs; in pkgs.mkShell { name = "postgrest-docs";

        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⁢YIwgtf~QLGPKKE2i=o&CROP$qt5R+5RAIr6tIP&uwd<<(S!#c#KPa~vAQ6uQg}naGN4ZOD624@VcK&C|Vw!=AKcz$DwU>8GcXebvy5KT3 z{PpmAGZyXGsZJN2b@`f;!kl>|>}E*2Z{i z;p1$=Rb?pIx~T{Ip4fER=vdAZr5Sr$^#6}?S9x2EL5ql+nOyW z>ltDE6YV|ORWhp`k@h*O@nxE)LUXa5X^bJ|tlJS~!B~qyorhA-rxsRnGa05v3orEF zd~RI4s&LBGH%swXb*-t(lwL|Nlkc?a6Zoq&kap?mOHT}GnMB~wG2l$P_%_cK1~pkm ztDt1159@}qsH3ec&K+m;wm6Nap=#|wZE!amROp|Be9~bA9TyJ@$YE9Fe!_EDW-bg4t*b{z9$l-IGJCqzICeP+r!y~KZksb>^3*0QYmpP_QfE-k z&u7fIczs>GTlB)tzR)PvUa8Th^g6cK=kmJM_b1(&G78vP(~|Z@JiV-yzF#szLTMA z;z64Wt$hFbkjIU&V6NsG)@*A?`vQIEgZY1qz;`&nYA`=C)UF|H{qm)=D1=j?&DPcH zoQ$n2=-dnxY^qA;=8y?$|8btz$$Rdsyk#L!6t!(9U>1uEWJ>vmA|QF3c0?lkli_?| z75)ZkpaDsf1iXHjt_B4**LAA=+L8YYAX4Dsl`zU|K|414)NV%XEn%Ew#Sy(R3ELQB z^bh?^DVsj;viuiQd=XMUsQXClwo>P9L^N7lKl`+>%vffEHP$Jktkv~zh=6HT*VwRV zOSS*&E5GWJ&WJ_eHs%Q)tFl!IU`Di;{dF zNO@SV<>`tnYndhVLjILtp2laBsQziWf^p3#+uE0NVa zNf+98u2D8j{l_2k3$ipFugmqK za|B#AU*s>fX8xLvJ9Co5uM;jsp+*6|;%c2)-(?t(*eT@;$bI*0quknnULA@fwWaO{ zq=%fc2;}(V08O}zTwl3{^0p_-E{ZqnX1S_$%&@AMjCh^xxdbrIg?VZDboNUNtq`r) zruj!k6}QW)`0zFQWQ#u=*pDxw&Mp-7WK4mdHm!D1vaosQh!!A-if5&je0!U>{Q5ck zm#S9B*~JP5jLx#d7jua$<&hB$OMU9R;BKm?eD~qUK z(kL}cFZ$9A2J$Grnmpzj{m{$Y==@sfp_hD!e1%NZTLVfNm=Afy-LxmHIH4S(d8*dG1K?GD;%7tcU(*u*I#V8k2L3esC`+cJ%d~s_Q;h^W!vyp@ITr> zc(C4)x!ata$k=CCJa)x~x}VM(*wt^%eP21=omV`1BuE22x}}Br(M?TEOv1v=bdNMnyuiWNf^j?k!ZfQdfcTq?Xv&6J?*5O14sat08Acw zLC7Efd7=<_7jd+~b;ze>=$+uPPuWfDcIJ1W*YkD}1iUu|K|Um}54Q!{F3$tV<->1%C?Dro)aW zH(3hPHV<@Pdy0J=gpw}^vtrZJ=JHJzhi0cuRbzD`hlz_f5dVV-q!xS;t-zcnAqlCK zQ+5LW>Fxwb!ZI}rmY~%W$R9=-bFxz@?zBUB%6{FiDI6)ZIskYRzq8q4&F6}0Y%4o} z%^%(5ko?5oHvAFu&HVH5{Xr}^kjjyQ(iuDH%fUJB*IstFf3@QQw1{u{>w(#fe!K1g ze|cnPUPPzi(^IKIs1oE-NZc?3tuer4OaA{7JWys;FAa%FNhx=hw1W~OHjWr`rf#{r zzhd%UH=28mH_gF8UE@~8c;TvP>9~N*p_PO(ssJP|ooc z008=@LLI+>jAmXmXW(|$=1{@+9IH<>+2^R}{RtBp#NSgQv-g#P(p6AVa(I=e07O|3 z%j8#bG!jWKe&X|9ZI*Bl_t0GyXcDsA)PwzRB3Uk`>Ch_xMx+F*5urAcNPL%5co?ts zASp%(>{gU&Op4Er`XhvK=I1A3@+y2-E?58e1UaV}YQnlSD1$GD$<)qi(buo94d@@X z{oB~Pss$Bp$CzVEgfY=`M?BL62)wFbHJeI{#r*U-0C`)`0t6@V<{2rg{@Z{%Kn=d7 zo{6?&oeZ!hE3=SncSX5ml9E6nFU(3e$gg>>e)Z>3r{9?CVfLI{trRzsNek`+?dWdN#kr?N%bF5o?F!`$34OYHv?`Osq;|=JAeHG&SRSt>Ucs+7BQlqS&4rt7ha%rygyZ1 zVjL8L*tl@Lkk z9;9IyhLElyq)SkcMv?BAp<$%Ed*~Xv85%yG_uxH#|KHg@*oXVtYu(p3Z;1s+sQ zQcsF_UvUDwE~j_{E})lB1h}NutJo2l8x85lWxq{f_B)~GB}VQtpn>d+xA9*{HMO`J zdDS@#*)%O~x_j-BbD%%09XoZYAaN^=Y;)%xGJ?t^CaoUcnsnxop(}h*`R&}{yoQn9 z;A0ugOx;8QH`E+q;~wU9rg0EE3F^L2Df@absqOB{H@%|mp}VO<`rd$1dO1s` z`QGOE7`Av<^fXkw;CkHcbX(HHtE5EidE57lVaC6s8TzAk;i9g7>X0@NyI$~zZ__JY z7%?UjlQqfZtFjD3Utu~;@oW{pBGoSZ(w!}x8jdSJ2corY?R3R8k>AHBsG1}F|2?tT zy4%A@bAKnnB;~WoE@OOEgoUm#x+jfKx7Dd9XBFWlK)(RQCw!3-6knZQV@;wS6%xpf z<*_FGY*YMz=p64@EUw9zPme6IIGR`YOG?Pet}wb6?WU0V$PTKsK@2j_nf7v41TQdm zm+_4~t^x@kv_pwLE%7*YeemnXc*2>`fO};MP7Xqw93RJQC{zsy@uxQ{!7p{`kLt&- zoN%@x28`kF2~~aLYaYpYCp%PQ@R*e?=P+9j%2xm7V{1SgMC1W zPP5@<44HJuWdT3-$5mksOyXR0jeY|RY;vnl2dZgkAdNPz+uPoMRI)&V`m<**U1P?Z zQ}5B6Ke+#@M%p?@ehv3{6>xiHC{3`MhW$$!bGvY*0qf)Zf%vfgE0W!8I-Tso^SO64 zn7(JZ-D-+EebTigIgK}72+2}0YA+O2f99j^sTYJJ6WeXtSwNqLU%9(xvQlsR-_9x4 z@AN~aX5ORwmbN_9zC@~wV}Stucl%g@aE!S`I!Ewb)5}U7EV(fuZ2OP^u{jme(o*vo zK6|`PtxjeR+1ebn;~E=9Wn;VmLOhY+VZ#17GL2L{jvVn~zb<+xN=pCPrjLZ+!~H$D zteYdsC-SRt!t#6)JUN~2SBfhqYw#^y1ps1iJk0J@j>_}@nNquG-&z&^%$6*N{x)=> zR?gkddRTvY+Y7s_BXWwB6V8U_&#_AA-)c3@yOlwrBW1ilY@j+V<&S%BcsX^cU4mJE zIkE_B-DCCJKbaD@d@A+&OOq|TDu5S6{t3}uf4eHGcnyB1EmgFgJ&5?;%#&IR&1v_592YJqSOqxPpq}-&$7;aU1qbs%Uxy9`Sa08;gM+ek-J|BvRA#L-L!bzv8~uA!XXr)B9M3 z7_lDm^lMp<-&j3ZuX<`BIQ)3ZK7rtzEy^n+(S3cLUTwRUG)Cyclhu6 z<1-V880*nbx}^m1SyA(rnjtw`VJq7r*0G+>s4uz0R}3?x+hpznt<3v&of1`5!uJ=| zTdHQ*9vbhJsu#GYSF2Rz=eE?C__m*C+yB$iNt$!p+WNc9&|Q$2v#^>(^gd&R2}gW|$EvdYGsdnIC{T(9b5@v0;0i)_cv;oy7AMltG>! ztP!{7(5U^}W^1vxl;AzKP}LTi>pB!w z!Pqa~=XE>$sdO>YoQNekdzD%X?YhMNMU+a{-!ORtD^RN;U8$ym3?+G{frirD)vAm- zrCenyu*`Y=i>C8n=#-w{#C;dikn^{g7=m0o-6fn38}OO%T6_s<@6!i~)71wZp1f>l zLLf^PyOm-8%yglw|0GTy=)lxt`#LRHL*JT^#~hJ~5O*Jew*xELY zWF3K@7)+iQT|MAdPhazgEf*8sq{_6J*GGTn*BMnB{t0C}t!?UF+VC1XXTT{~|X4~e`*|5PfckWZ?&FEU{i7&qQB2}$n zgT9I2Dv3EEiMiTn;TuJp!^pKf^6O~((#Prz5x-+Ix7j{_ozTsSFCf{W1xVB%|TS$d(A-svouLHWp4PK=s9~_=OQGg zbm_cSn0^!;Hf@n1+E9+xNL<7C%Q3u0VSlw(_=J}ngo~Et=y|h}@zZ`Jr{PVBvK|ph zJZHLE!v4FI;~o6WDux}Qx<@l=6&XEw!}rGA z{O~on4TrDcFdAtIp5e0)Tr4lyVDiLLw0h{ydJHJ`gGIA2U)f)cMu^>z8>(55x%Knf05SAXV zXUvzC60SQCyUUmG0gTd**u>RDD)Cb-6neaIP=PEEL-C8C2Or6&)^t zn654VgU=mP_Ko|%7+47sTrFNYnWC~y;WT0>28JMYve5j-lwf+H?jjBb^QAQY>})61 z;gro{DqYc37U{Z{I}k}EV({F2z(kRP%$f^BkX47!e!D=iZfE)7+53zS8j^+h^ zj!#4d4p1EKwsW%r(X^`A&`Ba>dGT2ksQSm{1F1m?B45FGftwviET%d*)dW83c~g71 zYf46MxOG9tRywk$&h?>1f)3N8B(=FxyUf+*yzM|#oGNMn&!*EIDFQs-~ zA#!HaH+HQcqCci0*=`T{s95WI@v#K)=3wEEs zXGo+^a8f4jt93&=8>E0VzX~Mx22L%x^!#hoqe!nbM%KKt<;5}3_<|+Bur-F>36qQ( zr@h)QG`VB_Nr0EAh9?4f;Cd6Lbztb4i5)Yt-!&Kd;FNqBb;60QH{A{srJ*qqQoa(w z0Amj@A%Hqo@{@fI*ad%Yd^gd$T-3yw;zU1!n}wn z+HC#UWyzY_Q3-mL`TcgNxDDDan)Om+jOqz@udUX8J$RMR&G6zt_+aGCznR>JFc3I7 zWZT&pqa-)bh8PAR#cuYYgY58k!?02N4P!Lx&k+Y_A>cbq|C^z}jGW$I2rTpNd_Fjt z09MGtSu2Ay9z4nI3gd@iRh-S;MU0#&eTwl^^l3VqK?~xat?+%}84VuxKQphwr;3T>$|zTwvLqd-b38C`DP09C!XI0Rfaw~h(mv5cBQZTj4-~*)hCS}uSD&Tk zcYjmR`#~qAz$bNZxk4s(qr_PH20x@#D4696+E=bNZwuu8s66PVDo6<-Gu|4@x7s=;&Al zQS+5&#toEWt#}GMcp3-Z{dTjqF0$Mt#nYDH_Ou022k_z8*q>{Vw#Ugb9^)D6&P=Xw zAY8Qe8kXa|zbA3`E_s=N`!VE}I@?m?`GJaDs+;)IwD>Uw_Gf!$+aiO?xX5?TuHD|7 z>jE-arz~2$;>S9y+lFsv>`KZ^9geH9+H41^R*bhCC%@nH)pSiAaGn#vLt12hOVnij zKF$sf zgKF{>-&lU!$WISEE)FAaAM3L#1;%^Mi(+>shVGKuj$>sW|9^y#o1`h>+qf+8UoAeV z(zmBE$D@ZXv14s{_{mycDx-5?7Dw871b3tB31bt+i2r1p6@^nOC-$Sw#yK>xCU>9@ zv2~>?`t z*Iki|>)z`LWCcLqHPoVx8GrM6bgl#7ey&i0<#KU2I)(ZdQD%A>{0) zrogb(&9_tfVfNO-4dOAGY3&h8O5$^l#cwO!V(&&aE}G?R!<0*mJ%e6IrNld+nqU+S zj!6Z*kBC15)kxi{6?@2r*NIJkP1pDwbpFgysytRwVM(~;Bn6W#8!1abo$j1G2fpaO z$4RBSzG?~N)>wXUADgHrEOeE8oQJ@qNVVCfF#;l0f92k|?Ng;Q@1 zsCP0?vE!?fapN@etdk*`n3zP9fd&dPZ#R~rnPutzjj%*@Fu4}4B)yVIF>nooOOx2X zT#8@5)&H-9FG8}(2ob+~m}=ZPs)+C|2-z2IU|oBw`b0b8$DxuWUz?XCLg@@heJ9uC z&1VOM7ysQAQd38>$vAUq%a&FiOf6G*q~0<(_MJzp5H_ZH6fvdT*6VbZX!VW_cntv` zBJZdDIE-+wKW(A;+r-MQ&zr$_|EVsI_vkrY zeCf*#v~7@*0X+Yo$#uAYG_d(@jvg9Dq@Gt@;u!48o;y*(*qqqR8AGc1l>^YV=G3Uo zyGz%p9r@xx@EpuTLKrSpJ$iE4F^o9T1xs~JlIy8Ow~<2n>+<%}btW3#p&@BJpx=F76r2M~nr@Sci5`3W0i+96R<=&)Ro(E%+MA z!FRuWEJDh+`HNXWC&zBuy-%z=6dFBl1`VDs?SW_|_=W|~N`m}ahp184CA z3X*=HIUd@GR2%1h{$7W@G%mYcEEUlpnWS4#G8(R}L zUfOb7`7OF_L{?myU@SAWXtA&mm)**{d~@5@xKW#D$Yq%v_2C(+bTn?WVLAHrNnU~J zSgZ}w|5}l=m2t~8OOFSwNS2z&&9n+Fe))STn<^^pIe~vDXTtO9p=|m(I~BLAm{cci zh^5L!11bx>|0g)3JeW zAB>J4ohlr4Ch!ViHf~F(24#!X2}ikdVGNfnx}fV%!B{WC2>dabiNMbM2J?<_O~LWJ*(|D1lEQCB|8l}@wHqjQiei6m zd4}msiwpCjzqv(SE_pr-T}jyQKVCEr#i$$(B;Q^}L|js!4&sJ<4**c_^Ht(7f#1$? zi;Pu|%DU-U58kg^+yK!18)H+8N;fr<}*Cj5*^ z#-Qu6IatNG)%Mj9cuEl?;5k{T(PawkhRmwq+UXlw%1}TvjF;1K9=Qv7*8_I0GJDB2 zXFf7&5%u1vRabypZk$2h5&GX2@3txW(`Tp73+-K9=eQEnT2Gc+p{nPe~Wj`+bn5WcR zY`hcCtvR&ihfq;feM@!V6HxR2X)^KuzE;Q-@n1bJI{2Qn$>!vRV4W4Q6;%rk3<4i zCXk$hS&fDF>fy!>L+M1CW}R4el-`FImpF3L5CPiJox!npoc7B>A#q+yY!ltjL%^8BdL1C4W>emJn>A7af9j z6L)LrJQqqja;UDM`)u>iVH1n$$BwYBd#nJkJ17okCua_$EcN9Nam8k~)NZLV@hEeN zgUr&8uIkILiW|6~AWAIoC2S z2YrQ4Y2imc-I7P70N&iw6~XLV!T%-$ix8G~VMAqUC}`Culb{IpCSk~siwwa2WxYr4 z7d0*VK~J1b-ud|Wq!6DA`^A2vuEwDqOP!Dgsb;!Mu6BuQEA|gA((y@Pu9+yJ$ShUh zjdgWr)-AT(hf3c3P0k_()!k)ki`dFTw9?edqO=(c4KQ_r>|h=RA?ZDE)bXR~;Ws~! zH?pM%`wVbD>car%zuJ#p{>bD@vP%wB`3z@MuJpfyuw zmv~miBAVkqe8+|4VVwAe`@-8ngFl&;z;@Z!598!rU>*{BPxbt@u>G|u;vY@<%@A{R z^?5klhu8HxCd6(AOlY_4 zCI5f5`TzLvpM-_rb_kRbM&)9Nw8YB}^be_lNt*()HRL}nzODRnln{iUP=<7{S-n=* zk$*n=9B$iYPki}NanPld=)IIVeI#lYbg3AGda0E&WxR^1-&&Lo_DuYosi@8Kx_e)CtGg;?_O&^m57uA2AhG$yXAYLThd7_v zA#!+Hk*&|j=aQNz`AE+GE(zLTJ1$x6a4Dx`E~e*fL0swTzqp}Mj*2|!UR~1G5;~`% zDX4g|kiHZ5*W&udWUYCPU2jvzWzdW5)3QMp-GtGxLQi!@!pZ@;z|h~%;@p9ZbD@~6Tv zV-^Zwu!9nFtE6S1FEwtIn3<725HY#RW{CeKN?g7P31mrWS3|W#%vb@afvA0Xcx&Z# z@NL3aia~AsOzT(oY+GNl$xf<%N~?tt_H)uB)np)`;0?}U3ZC{>4oH`%Q1}S`Oc!b* zEJO0$PL&Q}%@B@Docl)}i%CXsH`IxT;;5t)&-!t*`sc{~59D7zuG=0YV_Wh!na0V; zFqdn67t!iX_x;=$T$u2f*^MJI08|p~`2+fk({*2l-t(kR!me>;Y&2ns$qj=CS#JPS zuXh#scpX<2wL-exAV(v1J~)2l;ZX6~&hYWpOXV@GE}FZ`po8lnAP?#ud7u9y-eV~- z;E7)PzZT|S|Ec=k;BgQA8Dox>koPgXibFeJq2Yx>vm>8v+=&0F0K{n%#YWgk58j`e zl*wO|vbU+bxrIB$2)}ElnPSIK`WN6V_m%APyCbG;ON4vyUt41{C)sT9aB}KrBr~NE zpVGTR$*yE=Oxgs|vbhG&i2yhhGe97U!&xg~RVavCcy45C)SOOp))1V=bQzBsFGFp>P5~y@IFn@1HVluCzi4LdC5ax z--+LXZ=i;9K@?)Decm-<5nOm5aC@)cR7$Lw=ty9GOthsR{T(VQK}xT}yKXx#{i}EV z0hY>UPSXR2=NY%hWAyK@4<`NLKP2dEHryPk=nEC`bz)V@y`{cCAkmamGYd?@U<$6lpvTKFz)goeMaGHlgLDwVk`1P za#we|P#o>i@E@}uGd6yAbZ+&`qJUMvNuGoM#5XHnF<3w@Vt-G zna+(--D*jIV|oV7xL?<5;HMh`cV(V-N4umv|4AVlfk)%&Mc@(V%-YRnoNAtIAi3>P z?#gSf>py>V)8$6R$Mox^z>6hK0YPb{Xu)o~Xhpnd`kX>=!ZdUY&PfGU@osPn=X_WBJ3;}#5o4bJU^=#*o-{@BbR8CNRvdyqye#Z{sZ9;wwi~}&P;z0DmQsyIkwpOUo0=%z8iH4TxQU~5pw9h0FCxbuO(8L_RQHC#3RnGKv z)!cKksprJlGPq@wvtYP%=gAh=Vu`W`usO>|1q{;(>S1+amx?LoSu~F+I6(_j#83kA zNe7TO!1pDJE#5=nvxUNhp!B@1Y7Us%vhdXRX#7TLM$w~e946^<4bh9z6wLRSvtokv zVyBCH=1fe1>53~$)@fBv3ZA7vL^E;1hNH3Wv*7)ly^rH3RWkR=LAY@d1es3tt$km~02mCj3gRi2rWk4pzZX(6yUE4Kf~W#wQY9n@X)h) zoJ*q*IPO!+RWHZy1klf9bM`>(KcXZOx~7YX={hrW^?birW*9FT^#y(=TR6?k1HY({ z8eMX@2?3f5TeZaEB$>IDvbeINa4@^8FkK8{;*GzPWCt1tAn!e?d}p)FM)7~EzGwce zK1Q^cw)?H+HS9a9zuYZQy*5xni(XX|FtSe5cJvOBa>2JWRpE}d?S6m7#sP)ZwN2DX zena*i_T-I{6wd_Io~k^Yvn<=OTmI80i;SJ zhqU^3U;e*nl~20PARInJwj*yht?bvg9WHdToS*A!2k=RRRh!tnFzW>ZM5R%PA%+!6 zTzfD9UbU(-R2^6?=l|g*(s1lA`>-Bny~rIu{&+D_gfm1rb63Qh4Nsm5R~`4!Iv?m6 zVr=onM&kA_2g#cw^y($4Gi;{hP9F9%O_nV}i?u*@Y_HmPkio6`B=lSN*^7VYKU;3z zGzt}QE)^6j=%OpuzB2Btv7UlD5ZS#O`6HvmCUmoO`-v@n#Cr-o@?bj^-9k*ZKlvK_ zN=0;0)&biFCu@{(Fa_USTbmni(Bn9vrmn{pEr66F>DA|w{g|elAurwvpyzXV9l3JI zKG?j;Fd@5rrrE6Lq{9CeF$BRB$ZYl_M7NCshV%P!q`uN(g^!G_{``VTR@qYnBDPzq z&aHDio}Lb?Tz+Rr+IzB^vy-~IGXv35l5u$NOSUb_JcDa>jaGKcx7^%B?$Dy3?yiR~ zadt-Xxb$eezkbB3Bc6fz2llS;6ptL9i^el-VgUg1MqB#*^_xAN8;{R53I2PJKQBy4 z<7q}*&JA;E#!e9TS8QWxDd4B=&@xVMS!Mz4V%D2{AIQ+5lLb~F2adomG~%i6#k*K9 zF84$Ji>9V%-kybvN~jK58sj@(500$+Wq(`lPYGi6BiZ_S#b;+-PBv%Z)aut>Ju6k{zvzOKc=6 zHJx%g=AJ6M6_9nAvSfNj18lWvv)p>=6c4>IdEJ_jA&@LagtfM7c`gqUs|KGA^bB4k zT`r%PdLG2it1pxd>es@hO7>WwB&ocisj>&NgzHOgu;0#%sEt4VA#P15&O^jniAinK zT~}-F9mEHAHRD=2KNZy{&RjbaUtxXGN*iiswq@B;9vxU9X(`4DsF(+e?RjjzBc`V+ zqQ2HLEH7&)L0Ob$+}D%a#=VHF`2CPs6hE^{ZFY1bb(hE6JU|WBoV?7@e>x|0A(R5p zBad8J>H{lH+U8YU(_RA#^!RF~l+27paK{H`FF<`q3z~tM9|ppM--;kSrqs(6s^^WQ zHD(BrI!!UTbwEuRio|=Fw~oG$OLKEx1kdkhr>B?I+|?n71?Gr(X5jEJbW;`95POa9 z@B0?FP2vmT4jnv_pLgX$6IDaIbZvBVzjyPb&_bQrWQ`lcc@Izd`b`_g-!svfhePK} zcM8$D=Z=9DPj?Kmd(=Vvcx_S|fMLrz^FyBlYLmySe`mb^`-(QqsR9C;GDNP&%}Nj} zS%-((-7LI`QPz;CHOA7H;mtl_Ea;!Bf~m3n>*P^l zL6?ZHRi0b%{?KheHf^=@e2r3{AoX^E-;Rn-H+< z-}Q1cPoafV;Sx3^?cNtD6lUGG#Ae8s|7IkmfCgteD`w`L^Klb9lt*-CzejB0O*v2B z$A}W7#atiXK5cL9Oz+sMueJ~B=$PToc8=vIx3uVN0p-TZ+}ymHdlJgQ^~dtG;Lq0k z>cSPR#$SfS%!ClYSP%MYq+wdQl2F(y`??F>Mb%$4kYPT3JLG=v5E--rq_I)bEh zJNbq!FdYpPT?3qsZ6nY@T?-4y&w%j1eolP`>gh;nFegO>Nca4UNbX`SuRLBfR*%Mg z@XVOtp5htJ%)A5HOyP|Hn&}K$h{n>R4U-=1UD95SiFoN-G>r0Jc}Gmf3uS@&FVZTA z`&wczP?q~;(n9l%!BTI+^PQW2JP+chcrd)+zM*knQ(*LPAl@%3y^R+g(>6L+FQ#Cc z>>4I0zkK=1c3p6GVqxWyrveb08r}G3AS1+S=iAVm-1#2HB|(~yy?XLK|7i_B*8gJ! z7y(5iPp&%26pa#af;4v&0Jq@D3zE`uELMWdeca2f8lEI?see# z*7{7=(X~S=!RnC&VLjn;?}1VUl-1&4(C@No3{Hc%$6CcS3@b*RiA}PdJB?6Y|(Yy)nir9 zUE5v5`%K^Ax5u{pF%ux$s$~A|tT2G@EZx_sEUG+MN=PEy$wrOWbrf$xUDq`ZCXlTY z?VMs5?M=jpvgs}*F3o~2#G7(@KOg3DW3IhK+{;yD$zg5#%nD9X@p>Q}dmzhuW8wg| zl{pMZMrxSAQ0CW{f>J-#Gv-~hthaZz)n4*OW`{b1D*Fs_sqNLb+bJt{6=KuV#shh)z zr8%sON|z4GqpnX)8&R*JVcz60C3>;>(Qw4Sl_n8p;51~ip+Nx$I5 zE}QY37Q5=WO)EDLoyZd?TG*r`in^-aRx7sGmGWrHqfa2;UEZMF(?6d6p#6ptB(K!8 zEV$@)cX!Ct@@m-|RofFN^k(gjqF~`5f8yGmcKAKuZk7ija#h#gV^d7INAkgx&sono!^5cRq|@Ah8>>CZa8l??(1e z|9dPhVC6;!JvUqG_ShwNQd+c-rAeJIx<(oDUZCL(IpMnKcYG&>%06^=cdQDrA!}Fp z$=@!JcP>5=?XTfe=(s>K1+oPTC%;O=jCjd^6E*%E(@Pt)Bnj2M(m^x$ZZ5_nAga@R zIzT5IuIEOc-1yqoAt=TJiL|p!M|W7o=z3m}XpOck$ZMcQfVp6jNe;1c5nWa-rz7im zf*BF{)P4?_U1Zms_XS&hP1j8Q49vf<@$t-e<2S_Ml9GC(x5AAZnUV!*W!-feTTQ5u z)B0+hMSu21=s<(7h7eNm(!kS1U$p>d8=P;wH9{^@$zQ{Lv5mQluy<@kyG7fjPc1!d zx`li|_X_R$J%$m$N&KrmE?b?jUmhLrBYCl8*>(15={iBr%;lDF#L1A7a6I} zN8__jZ`AAI$6jz5_g?^9O^v0bO^q#?q>FO~b^_hWuJk}k-&G7Rc22G(j@l-=75xDT zgW5~7>5YUOEmzIEY?ufs(W>a`KPoL;6-e0VOi4cIWF&ddndGwB)jj6Hbfem&z^7=Dqi*OgZiozbX&A*u%YM|A??)#KZO3ZAv~aty1W zmzVcpFG#3Kuz8G8!GG$CzcDB;Fu_s+l=q*9Ds2eIgRz*mSXRdGW zzptZLl+m?KXMGte4SZWyZq4U0z5K>Z)C_*yr)1cZvs!33?PGe*-m{jJeLXbu|Hp|l z$$m?_nLG2a?`wmy%Mh*9&6IaF7ejgTeWl06xHKPrix$zbgf6yJTFHeDlvcm=U-<*# zWs8`@pISAyO*cXO^E$jElTRbUB{rxs)cjpD6m~aD|HXnV#x6RH^|%h3(icCx>uh^9X|=ZUi-K_DMz%T@1(xwiL0j2LFzc98f_ zS+fvz5j*J!Fs7a!1PxATI>=3-*H9p-PH zX&UT**4Q#|$=)Yyb!q)`W3Gwz+95SHmtUraLE&`t4gNy!`n+E61?X!tcIJz2g-(G? zv70BOQF4%`(*e6&9pX}Ji@vQ_DHSv&STO3*Nk8)v*HUwz7|M7+v^?ckseEC75%0ZE zUDk5*6KAf`#(x1X4~(~YF!W?A4~twFQ7su;H>We z|Bg%=%>Ivd8GR^m?{9H?TDV5-M&qPvhY1H;ff3B4sq$^K*s)sr5Hyxt)CXkzw$*{t zf-jQkVLq*HvM0rA0~|aJ%AQwIs)e?p2GX*tUjSiH$6RF->Jt$rZLy=}#*&(mQnYd3 z(%exqV1JVTn8kc~=*`fx$N2Y}piSQ@;O>Q#w}&mj;}&|R^8SD9(G~7B&x^Q}uA$M_nG$nTpeI$X z05{ZExJCkQjP5UW^XTE9zKXf_=DXBc&Ig*j^*L6lv5!GTFDKaW640Zc{3ZI#!B-dG z#h;-3hk6*Dd#_aRAW1%9)9|a__VnC_kYz^m4z*|9jzYqYkP12(ZOm< zCU-<_%xTXU?(&uU(?OkAi1i)%_omwzc&{;^*2>xw0c?onbK@j_=^leuW7u_nluEWmGoHUg!c6k=F&*27 z-Y@fU4gE*C00z~c9h&=dO8>=T^XeYfmc2jREz;o=z%sZU%%CQ9tjh^6p;DOx9u#r< z{=FI5STS(J;UVRCazG%rNa9}lTdYf+0S{^r@=pm1QVXrQr;!btKRK-jiCy9?u%;=7 zsGCZfmEP{tzz&?$9<4immR+B}YTERy3IVzI)5Y@1=2D3Z{FPJji@@If%&I6`?+?Pg zDA2w)@xgYEpyp8G$p1coFs#Z>LIxejrK+~;=j%vF8AZM zO@##v0!~0l*VSAe)bY~K+B)E^g0aVE#(mTYFLHK+{BA6I;5(;;)Yq04joyph@G_zu z20HzQDRPJCKWcQYNn zLPw>@Yj?E`Nu|pHPv}yeHIHO#$?IbS`SWJ$Vljl^_v?skKl8)|+q-uL7i9qxq&v*E=j5*QsBDWR8NJrY=|86A5p^&wf0>D%k?IHF zHJ4G`SGswS-H5l%Rdvhlj0H(Tl{gmN%*KTRwLZ|E?&w~5r{OtzuV`}8#9GWladF1j zEX$q>g+NN|N3+;kYAd|EEspAD`S)49nAiV1H$#TP{{}LaAKxABrtnqUy}n9)79Z}< zupoI-j?F12+9R7N?p&YK{w-@v*7<5^(eNd%>;?<%@m)@LDcB2LxHGGYxc z2feT8SzM&m?~yADlTZ5|u1qc`zB)9Dbryx}s@5f7J=(BZK0H((o?9?gf_{Sk;6zT; z;ioXdcfF5LRhWE3s}rx<=GX<+l?w$r%Z%m_Ekjlc(LOhvE8X!zCBmvDx8Veavlwik z@j3Z4J6eW@_=lNLOflEjFO`xc$wz5ygGqAEa9$76Gkv{+y}oKP7k@V6Cp2&@!Cfxamg~k3p`%$#e z=Y6h{Czu?S@kO>ky(f>kg+;lMKK>R2Hp zLEp>JS{M%mzx4WEyu_7I8Go7{Qi_@2cYC?M{CKqaH1DEF6gs#xnNMeORJnmhN4-!3 z@4@qmqi3@-vZ;7EDK_9J{!%yXEV=`#Ys3Sk9~yRNB64F*9Np_TC61%2`9c@GY1?*d z&=0gHiug#ee?96tJD& z=R|up@cue9r_UQb?u_k+o8>Sw>qUNzebtaC(q^}xJLztvx zdKkq(eRCrJ?*q1an@WJxbv1D)r-bWgDu2njDQbkA?_R>c3{z;CYbGEG_@Yy$Z6VXL z4r(ejXO~@l)pSvnV2O6N1Bl`|^Z&`&GLat?e`yic;#kAMYxe}ExnX+z>B;neR4?Ug z{a8|md~7)rC`2nfAn`ACa@#dw+%2t9#cM6k&4c~9DC@T8Hqvi{4xM~S-Yd$y+xZEK z984BIQgeUEO{1BGJ*yfjVxT7?wOugF$qs8MGC7czLHhUhwOlSe?JlVg%ihVofC|Ig zU8k~?1KJo~*CK}i5o`p9ji@k>)xeFB5HS2;&=T8PC3AY||Ksc}*rIH|?{9{bMvxvt zkdOwYVE`2oX+=6lknYZ*k#6Z!O1g(`q`L-Y=o-3*j)(jAyn^rlIIdT4U31R4_u6ZJ zRx4=Agezt9VR0eM3j%Rzize%|(z&-Dx>?>G$aH`?YFIhn>Z^NZ|422FsCx*LjN!6^ zz^CNwKt2bO|MOm(5BtsZQv(k6)Zs>G*qGDIKbQX>X^@?%|dbuDj@b>PnGzcSD>=w;gL!^%h6-*CXg8A|5^w2BFantqSPgRpZd65h6>nk^m z_!5r(mOBr^kZTe*=3+vkWKh53eXR#psNS&7EJU}2yqU=V>RWzU>KboVtPUqRKJxkK zeA7bWl+JUQWkFP(oMWy!WfzTgU5`vW6gvH_SxGBlSXs6AUrYVVMpmYN@!N&pzEsHu z|L7kr1z(`x)d7#v3`~m0=|>QKWuFM=l$ROVInk+(3V+?LZwQ5om_~xLXoC5t#T#Sf z0;|z4YBD2G-!>O0SA1#VA<%2H5~Zpn;ZBMEwPqPw^hP~z^MmeIe2SZ*JGc~;@YYae zm&IYM)9941_-%y8ki6mz)kMTeRf@bDA9f|ou}MbP_9c?coEg#L?jz;%aL4`B@xpNvH7+VA6idN})Je%{fNeJ*QjDJn(C5*<%t?Ta%HQ4PmhNTUbPV@c1RH9eNXJ|_6^e0 zBB;)d`zwqI1J9)_Dx~Cu++}Qi7}HnW&tM;F&-)Wv^?YVa#~<1{9(e!%Q0R}J7h!yq z@>E*>8pnpw;f1EnV69x9Ik()oICtqkV(+{c#1_cv{XQ^4g5*`YHn`y5>#=Hlzfah; z#-!i4evh-JX;FtbYE4K$adCyfg<6+JOy9G_WnY13$GGDp2g04UD0<>;qME$S!ag;$ z0%kV&nnj6B){K;%#|q>$b=y&+9pJ`d_o08tB}+hx0^MB4mZlGu3c?iU{W*jtTCvY1 z>N+|_xq8pkGm|O}Gj}4hPHV*}yxllPK&z8Wv}ErH2=XS>1nJ`!nTZ79*vSYxY;Umv z!8cpS3v$U*ziQuovCI8x!_^PN?KlHk*gJg`pv80WYos+7#>PO)VSc8x68+DtGhokG zxHKNTjXC+YO$kF(Sr>by?QaElo6IJgfAB zqj^y6>XiS7+b^L*N%I(Q>4fTWU5VUL+v|gyrBAfs8}N{UWu+M}gZ&>R7r(zDi#DTt zPdjde{}uLemjP5b+YRMx?5__2)7q=NS=;9AE1_7*(Jibk9wkk?=YHqffQm>(7^E+*wl10GE*)_f*;yqE_2^tvitI-4L-4<)s6z(R7)?TYqFD zG@|y_iI|0uW?@izn2^arG*V|C)2)k7UfkTU)2#|yPqF`xjCGuld)8n%(!TG4BFDHE zE3A$sX{(S6C6SUuR!V#w;fhyKv{ogDW=H3*|RhP<_ z>5>@U{|$-L-a``ITsV>UdmZ6U3H}@uhIces=-;+UTT}bee{FUZlS19OFnH(#6ST?B zl5Zb(-7rFQTBm$CeA0TC^^MvK4Smi|tW^GYzSZxYuQ-vQr;lACpiP~yzsvVDD&4-D z4hzVtt?tOhda|-ph})TxJfQ0e%)M$Re-1~-mfRaI0dQ;Rb_$0-i}~2~#J=Jy7GBCwpC)b7>~yu~@S`=HAmX{IsXo_lQNM z+#VBi;KyTkLO^Wpgq9=d{!v>KOya>v2=n;&@4zrmcGxjkBan6nbcaJdM{ zNLZ<5iHOK z`1yMLNa>l22DD)pZ03J0vi}V2JZE)YStsg)`u*I~Er7usAgEkrEAb?jGkEef|AXNc ziP9%`)QmyyV_9DFFY}7o;Wjt0fB^Ly( zcIlF(?JntMS^cP!-DHDb31?c3G~%f>O3gNL@btO0v&;rFX3%80x9*-iFB!z1{$|$6 zP3_Wv=;sAx?ExtJ#x-H7V8A7No6d_vl7d(K)S6PL!g1F}8xm&gcT(wquxaCYI`U!X zck?y8OQ59)7t>50C!Y(3c!KiW@`BsairulA3*_=8`ZF74cL|BJLZo5wZ@p}kw?2ih zt5*L>KK36x>D32a{3PylXb*uPDkH&~EP5(Bse5l4u}gau*~WG9hXASOFTv|T=MiS| zcT;lo1k1sP7c%T(MUM&edeFkr4=m#jAMZV{6&oeoYa?nVWKO>U$n4?e%LF&&}N7xk{|qO4LDaIsri~s z2L>wL$lM~>>U7-L{0W6%eD)2XliDeHL99QY9TWn}->mSk620(v&S+LG3#{bY0=@Y3 zu|74Od;B%gCuP-vmG&30+DSrhzi^>}s2R5dS4*(a$ojNymq89=7_VBrrfc@g(fX78 z>=BiXsp!ro$mG>3DIb$iMq`3_8`8m;3fjDl+VXO`jfM6 zWK>_R`*kw}xvzvt!Nmfi1nY~mZy7^Gh zJ2`8o1(6RRM=L_${ss2A7WX z(aUyx8u6#9&ZaR?cW3*ID0Gz?gx2lLLiA_xhJ$k;!A>bhRf1(vk>_Z6Wpvk&cb>}@ zkA;JMEV}!i^Kbmd9m@ukaxC^=O`3*$7v{}F3(c`0?(s-do~yk5fgakN^c zA*=Bh0Ax$mt>mSDRW1PTJzo4fGZk?PUFf#DtX+bg)nO+HHDEhr?(5Yx-{gDpcqI-A zmP^1&t!4Pj2C9#f1^u*78bocJ<~Ji}yRW~}jNKA}Q7mUj7-ifCQ93dOkFQx1&HQa_Va`4saROe(fK9rO=xnDNw)g5Jd-h>KI$KC@0^iz%7L z(pP?5W?8lV6aK`NVh+JjggB?llV&Vh2JxYF)_anvm0&!h=gUO=>y;IlSsPmX-VUs* z?^u5Y?&bFrLP%SV_%&Mx_eEz>`3Y74{jxD}V|LT-Qm87LFQY8@tiGYCi?2DePXJXw zhjf)0+tfqV0FcU)qUTrRZJ+hA$XjtsYi^;h`fN=QUcqd{iCw82ttG+I<1U*1%T% zO?7|$EaqYLQRR|&Nd?XIU7^caCy}VXKp*5QW)OBu6H*0nlGH~FpIL&M{Y4N-*H0sV zC@bBH*9J41V$C_CZ0hNd=@@^=jkWGNt0FHgx3v6cYOD$Si@)-{9q!aPnN@rRcT~@9 zhIcBIv}Zj=8fQseg=M?5KT&WcCJzc*$uM>ir}daTI+N8rqHaE`%jf)0(Ah~ut}We zrKnK#4u+7s!0(m1i+2uEv*LoHq71#x7D$e6lqI1k%Ma_oGH$Pio#_(SRr=lxSWExW z-Gn%umb>{`vdl^{Mk2OD&u^;O0q8;0vEo|3Kv~vrwX)v`>vj7j9(a@#L(5N}0OG4U zv*65LLEumG`WZxR-3;R|EAgi;r7`IZd41OUo8xW@uWK9JwIH1NS*XoOR8~R4*L`R& z5@fhJoYT%E*DUpfzh>CTU;{E2y6*#FmhZ=-2TIz{HJ2by@8#)w|G$cUY^E(>NXZKu znR^&+Mv?t^eN6MKlCn1W@>HB9X_h0OlH5k4Cf{FN79mFIQ;$;Fz42JmE1d)QBt_QE z6C>=MZ85g^yKgz5wXWaXMzdWCq24t=x#j&EC)3qk3&bC66*Bb^+Pg?<5mHrS7gDNN0YCH&XqepgZK49g+)hk;QCseN`E;*O=XdY zJs!XgAQ{GNw@z}gg)*z)N}TlUr~Mw$U=}7NFtiAhh;2L*8F=gP3le{9UV|k^=IT;w z^?WQ+o3lXl2R7L4qTAUqJ!h4iG!#d-2HXP+Q&k>KBV*g?0A?bRlaYt|0 zXn8O+WC^MFg81Y^H&D1_2w-tww!<(9pf zrA0->rlV=~!eyXB8U*Jdn>}0@>O);wk_y^BdY`pcXi6rQCIG0tas9lheBO~@`}9yg z`&DOLBEXllBCdFyZs;)Unz#9CaMP!sXYkovcx_s(#D))3xm_Hk(z9x?E_ALjw0>03 z_^+fguWvZ1jYqsw(s5B481dt(O}(KO8j4z zpcc=E1kX~>Vu+|2&l!3-ivt+Kzx%+or$39jR-`l>y2L^wJY&0Ys2E+F{4$#}LN4CA zQ9f^YN2v|&+w-(NkhsL?YcE_r+8}+%hS-b;@I0h;Ed7~%WT*FAzxJ|b5J$Iii{OU? zFH618RZ82oioErVFx%grsU-?t4!Kla&Pp2>3y_S=-b}?lAa4dC#yFM+1S$QkWI3OEbw-7mgt523 z&LrIlh$RgDZJd?4vmLuXn8|3t7emnO$Z8SkkHJ*-rNLxu$F_g2%1=n8;14ziB&dlSZeFqz7xwh?T_)JondYNXuSa}W^t^xXUmDHV zy32KGU9OgoZeeXTYO~*I!F8e?6w+cLk?(KGTLkxh4Zwxv^q&Ve@|w10+*3?B8RpN_ zZsH5v#lM^4I9Tt>>0Rpd9JIQKy5q2(8*J-JB$8>XCz9qSuhb@y9;w6kZWyd$vi>q; zcK|B&F_Mrp9dJPzO5V46nA9h5voDM>k76HBUoXCdiC;l$B8}bbMC<9ByXXtpFyK}* zh2G2L_DC-JUO18_cPIm=`%rRyeKM)uK^3n}a>nbHI3Uu~T#>c|V1E=_7xEuPQ zuDU5wgR=(~5t;&r2$a$R+^4*GTthd6B$m65VQ>?^o3CN6vR~Via)f2AU96bndmxb% z-R>Uuwbgl#NyTI7{@(>mx!U~MpnQpDtG5n?tf7d(O~gyj^q=>{jmz}=hNS=F8a?~2 z+`DWY@Oi;0J2f-T^kt$=fNr3)F*;xQm(zd}b#zN88V7M&C<`m*ce-`gPA~2Xk5sG# zK@Q^RFv9UjrK>7Y6%%yB3v#`6?0RYyfv#bPv0G`n^cN{`R>t8!t>=qCZDWV`>NJ}y zHlNmq322*zvpP&dIK>&wx_ogK+*$q*@FpY(Sw>&XOh17jcqy)Wd3CO~@5rzm<3v-m z@DBuP#i_lH|02JmM}_d}H1r1Q*R$dDp1nmAoRZVka=^{1de<3_+3R_YAZ!LH(OAf0wpQ&v>rY2aNB=yj_8aG^e7W{Rn*WQNf?uQ8zI88dL(K+TiIZ7Q zdTv-5Ne75Np1Uafb{|tne7FfbSZ`Ior`!3AeCVx6#qAqA3rrD_A<#v55p^4y$lOBT zwkk>t;3mM(Ey|bi!CJdzkahbxcv?-W9BWz!&Gbs{aa)Sa>q0F$V^Fp}9mM#{J#hX< z82(uTxE+n%mhwVY#T8Fo@QArqyS@w#;A8HsM^9%rr5j$^2%7G`D8u^&QRJYg+=y3es9hA@nHQG*tcC!1cFv7^$<@F`#VXDBvIF9M zId1sr&wZL6ec@E$*E2e8!8bKmt2KqE%}0+KDCPi)qYZ~?m9Cr_ZiZVvz8kpdYNRv~ zSfcJE7<^b~SY{p3`=H6V_Roxa`3@e$Y;}9#NKcFRpv!5-=gy7j_+VRZw3 z*rd*dwYEuWVR2n{Fj$YSZl!Fzz%1T%D)*Dqyfs zTuw7V0-|R{wx?igm+i)oN_Xc|kaqZOk8Z!O&A%-&HiRbN6{65(Csa|-CIYXXQlbP! zVmMzg9s*Yu`!E_yLMFFK9v;+!1vkQ zD8jySWHI}~sFHJR&1H-Tm2RC;%oUkvZm?ZK$G%9Z_>&`VF%=O*&qt1S-b9$0Yr9p2 z&Aj3GBD)G}+#_<48i}eOW)n_ zpPjGXumVgphB4^n{*bmzAFx?#=M7o`67k=cYnP+yi`8MWjbc*&Smu1@Wnwvdoi0i) z?KV%1B(Cb{ZazYup)&O6nvPG#FUX{>pQ55Y<@1P5Z0W4vvEFggi8`a--%&q~ZdR3V zHX6SBTh8O+puBIQZr`X=?<43IlkUQe%;mPJsA6m(&n;7WH`12`vYh=yy|pEx-Bv(# z6~sL(S(0N$`0RBZq@o4-?A3DU+6gm31LaJlyo-$$YvKEtJ+UV())wl^WGOvXAK?#H z!R|CY#*@s^$UhhBg1udb-zd9;Im8CdQ`W|YJYRnK)6D70&9%kQoku_Cps7%wtQX=)RM*1TzJ#qO> zwE26AoMKakb!6Mn|7m_{J`V>l-|LG82)XFBXnU{m0kIfp$it=zc7d;I3+%d^=IA-X zoi%Jw-3w;{H^|?%xEgrv@5AWw(;FEYutg1LpP!S%-jrmI9k%og@f^&g@le|IWavAY zU&E4$C;_o1nXn08tG(;Q7%X9-Moc=yysy6yn2eKkJk%iawZ3Com3Hro_1dLM7$Sla zV=%a#J0>Jb-;DNd%Dv3 z!1BL)bbg!{VSRjDl)7wWW4%~%@CFNV}37Z2t7zg;=8B z54BtS9Yy0vop`Oq`y>x6rN`JIO9L2_+}5$QE+fZ7V~OH;jp6hSfiFf21WYK-YD18s zPZn)F(&^WC1181!sS*nHGz@)T9T8XdKQOVtWLgv0M}qW z^dWF_h?O2`x6yDg6a)m@+M!=VQ|p4B z+jTGh5ygIhJGG6OX`#Q(Y>Wbh=7&b=S3(L6rppxUU$362F~8nRrg$v|OnVzbyO-zX%n+>%;8Z`->%r&Rd5v^QaIzr_ zLk=xPLhiujFWCn#Zszi+qqlu7@7-<=sPLHR7C0TTak7VdXP*sPEY=G>(xwV7F`bXhJEz|i@j8e}PHk4ouwqx#*L25Jn+LxUvYwZ?udX&Cq(R*{kJ&N`CnN`Ib_G z_ZysJ?e4ekle60{ha>~2KHvTAvta>4dBdeNI)zw=Y?9q(+XGJfYU*XRb;?#3^Z<`7 z%aL!5X?vrVXB26nbE{HC`r3vy_6AmaWYewnK0jz(77*OJYS%RAbT(Y}#4hy&*JcZqCE8h0(tLA&{o$8i)jUL_zfO9# zWnzv~VQfzX#zOCnt+VRFjamrHyrkofHUZWzD^4Hm8+!b|&FkYP3Mr^0^V?}~ZUzGb zY!%_@|Eg{tZ(ogIo))hfp=;$2ToX1p^Qp6edt^FBf7JznRKTAdDl!V+_|=lB8gZ#d;r*XI^|ptx`AnV}<%1GdV{WB|vDpjS(q_V%#; z*klHNqSEvJp)IWfLRCo`_H;jHuMcw9kghxvx1LL$!po64&x>j3X3|; znE@q2rcTy)3;^@nnl=|mYu4J-V9rOL;kLP&o&%-R#X3A(d#Ja(ysd@&yL8WoKAkOA>U~v1^}8o=gt&CBH#X$VH<1g*c)q?fA`El3$x#z#jZV)JV*dv zD%7pOe){nq?@@&`_mQY>55I(;0;w*VH&)`&L|;-_Y&ez(eFN}uZ}yP~HAyRMCuH1} z>?n`<1~48`DG6dDB)_8PzTRb-I1u%5*A*PTG+3wM0Xm&&oN<(UF`fLuAK57x_w_u1 zRg}28XKdYbMA@%lQ;#}XO#S6<9(IOtR96FT--i}~&Nmjn6mKE^sb{Omg4G6_t?JOx zch|lgURyGtJFvgCY!pWMI$`9)9Ktu6EEGHk?<1fc+1PEpU)GJC3JisTdr#W|#xHi_ zUqrMTZt+O6HZQp0q8r`#uqBPA?A`1_?Wi44dt+Z5F3kfalGB-NH+3 z&{lN35A8jYDTf&Et#nyo2L_AX0(-T`0nihXTlsu{Q56R`9j(JomYs;Cb@s{_D!4{I zv03%_cqXZ8Z*%#nC4QJb|1W3eQZMUq2C-z)62!f=NtWYgE3g}&-ssY{J8rDL{~q|j zWhFVV2knSBRAG*h5mH&D%97j%3fyW=4}lGMAkDx-)!iZt$MLJd6b z&^|UBzWCqU`_I{y;B)8>j3uWY2YBW8F}>TxhIji=riiY^)XWap5e*@gKz~US3xzo5 z$UPTC+hX+lw+fUKuetk>u4rA3DZcR`H$8Utn8j}x$5{*gWdIY{s$})%!uD3icO~BC70i*MKDlTkdRUDs-8Ml*+$h)`akb;=;jWbZBe5P!hMo#XQFv*l2{7ppR#`RDB7R> z{S6SzvZrTT`|BRf4e%kuF0<*kuF0QgHddv(FB`b2*{0+MN4tF&B16he1UBz?>~S$P zrZ$cTy&MVo@P`cBqDlIFE&x?)PLflWRk$+%)jq{zhSg+GuS%1JgVe?o4l?b{Q3RtQ z_Gms3b(~n(?|-83;UVIyYUSEX_Sby3j1FLJSd^Sb?-^7>p6&Eeuk#5L`rvJr44VoVmo#BfR8 zo5dxnh1R=mrl0Oo*BScOOe)ywin39x`!6};Hy4|DD9c%s%;JE??m=HRagqWq{W-WTmkdEbuo)qmSjD5MRKc~yFFf?Pi6UH3lOpLPC?Qi!;T z5af!Oi4T}IkQzDCu$VfXB1vj)Dvz*9{MzX1Z3Zf4_<6ojLA??pxR!uL(2`Qy#T=9T zZD5`)<8y_hZaW}zNG_A^5T+1If=PHGdt-GztzasJ5R?$3A#u0(dV5IVvJYIh*7Ry) zjImOzo|BO?l}K`#=(F_-Yko|bhu7fymRRfwVfF@wl_IRXSKmF5(%Ni_K&RT)-coFM zbJI3jEN|Wczy5Cs3|TcPXGpRC1o5!X46X~=$jM;fN0rz1eV|wxUB-R1;iU0mNLLER z)K=^d7m0m;jjUJG zu3~eD!%OH$oX}c! z&JvpY6D#$qkgD~$^&|_6%tQ?{8x_2ASg2}=|L0q}1Tkuu8Gf3IJSsP4EZ|j)*itx! z)^&gNn+Cy-xs{OpC+$9~?LOvXBehgl&eIB`IPI4y8b!w2hlz&=msiOhQC1eep~>?3b2V`o2BP*KunfY1`G$CptA> z?q5{jbe##Zo@*X22+z-%!UI|rdvjC`HwEhd*qA3O?NyDLwSY?KY|eVpa%(*j3n@1b zoBORe3uEz{k8vQq4IPhl`nAb1KjxMU#+N70s9n_Q@BUk)EiBLWy+s+eK@uL)-OG+_ zN&_K;L-Hel*}X9{_-^wyI@ka)C@O22O**~`Rq=Nv?F2>?pgcYtaUBE{ln;WP9+;<0 zAeo@Z0yisHLy>lEeOWYz+2BTMkgOCn zL!?&|PT41VxXIO9LlJZ{T@Q`qo?&}L)*Ied|L^LZ@TqdKmVZR;0=*baHu5fUOcXcy->tNG!BMR22%4@}e%+et zX^=JCRv#1Bu7IsNEd=IB@Az*%Z28M{)^*cTvL1K?1@yFtNPRhv%8n1#s7N(a2kC$jy9C;cq0d> z;&QK^>7ex~6S}a89kuJ;b|rNHZrYkYopIuSS#8;9-yL)v7SMWfvsf)Sdp+-z*d=ZZ zJfyYqWTFYy*v;VlrzVz=l&$Gq*gjrgwBvtHz>XON0mCs&jls z^MZ$#qAxt{ogqZt5QtgmWRRiZ6p`*lRMa%50oPnsjHpHXv&fzZk}kJ--F{Vg9MdKF z?d@{ZUk>RjtrJYJX81A-_s`5XcWTsgsgno`P|e!9<$D#1k9VZ?QYEr!xl-8 zn7%OO@ya?uFOGWIHsxtI#sM>NU;Z$$>p-B+&Y-=TVJumO|A}()Q8- za5rO)NxOPTij#57{=xb*dW-dJU%I9NH6P&Pn?8F)Kk7q-c#zIi)@I67(0k>asG^q* z+9oy1CBtx0cg~P_kwqYxT5>R_Q{La)i0NZQUcRg4Qsr7!a8_Wn|lz zRA*qoWcJtRWy94VZw*`THBNh0uKRfJuEM4~ z)6ecEp!tfk5$_!D@9HUCKeg};Z@HCV|GqTV2gxe8#jp%0D}0qwJ6`uSJv#D)DwK;$ zS(i0sAF}SuS^o2TgBMhZtB^YZB$zkTFp^&6TkEH1Bnbp=j7#8QYKLDD_U8f|1tx`8 zy#3IIW&F_I#j=8#LnZ0!z(Pu&jgOzdZkMkuRH|;C{~=Z9eV}txcj@9r3+*W!cx=D* zEWiI!XIb{Gu4K23$mce0M_q@&Cs2Xl0Z;IhVU-7wbX99OB(c9&)H0H~7=ssG?mBuf z?~z_zZ}=`)Y{T&V!v4^J)M^>GGJ=z}{&~*kC++!k3Wj3Iim8=}A5yut>v8NC_3?J5 z0|HfBM>eYHwN}3-*PmR*-*zM3PkyZ3tJ3g#_sY2n4=U$h6rCdEoZ5a$Yv;4|T80Gk ze|yIAeGdI6xW*oS0Y`87K2d-*zK`}jIw>35V{-S7vlwJIeAW5!U7sTKJ?mK4q&U~G zEM$UA<5xLVXiwFv7cHcL*VH3H79rcBm|EO5ue8n9XY9X+QITC&j=+T!zUa@rcE#;k z?*+U%GbxAH`t|)H**jlMW8WZmi-L{?P%t#|G@hKQmxxQ7|LdNJmU-w| zkh*DqUzv#MGh?M-E3e@qsS(h4;psg`^^=1v#HA)6!Y)5k5jseu^zs0l>v#5vfC;(; zrH}B5#ZRHf$C3~qq?v9`HkB1ASyoK@fkZqr!(kW^8I*w3&c;}ivqpE-*a2u?==9`9 z_TwpQ`%CQ~{}>7t=^P;Y9rKL%DG-UBaeT=ZAQyw>?;6{D-#yVcJFE7Vu>)=fQfB&u z@3*jI$Q!L``KkFL+f6plt-PxGtL?3j2ltx+Q6iAx4bi?l<$|%gD>6n;7=f z_RhefSG=7gn?9^UUlW}ym z*2QLn<|A%;!LDqHp?_qZVtMtKmYG~A^jit`(fXE7CPtAp{e?%X=b#`M#Z8emYjn$l zn0~jxNf}(9#RNBWTnQ$_giKVhROqT~K%Oi^4M*H*vxd}6CX!>OUfGG1+^SJcgegKx zZMXM!6Zuy+rzY%bAq>3rq?|E`za~eSL*M*~t6VCS8lCo0e|)arM>H<8?N%LK(p#Nn z8JXkONnu~!#?0ILo*%m!($_oj&wkoyy1V8Vfk703j|-QZADAI|davJPPgr5fj4y}! zAk!;At@k&mYnLwtFAQO$5!#J%D2Gjo9C5Z_wX$7GS+$dv)4| z`<@#wUd~)rgxwFi9pnl-jS42Woi2O{RF}i|rvI6)VAA4Hio_oC;UGRY31EEozdc#H z04mAsmerv8_3RKz!((Gt`abj%n$K?fh?n1f<+8j`dPYRQTGh5*0Q6L>qtZg7br zGbUThRk<(wOcT| ziI{sZX`VSNp3(1Z{`5@iCXw&?Ju3rh#U5B)sld8<-1&`r0%va~4-aaQXhDy9RE`KMScs%l}WdI?CLj`)7 zZfR6Wzobkwe#uXtf-(OWMDr<)rolasLsy%=`|x#WRutEO18*Pl*7u?C?eevZUkKg1 zftfb{f`6u%1xvO#yiU=`bSr>zQvkR)zu5*929R17`w#gz}5 zGb&xQGt%loZi!(@w6FP)Ltnaht|j{0w6~%8Hjke_dP*!#EegX=Ct62l-d0n?`cLKc z;u5?q*$Ve3f9Efcu9+4ll7tcVU2G-8|CD(M5;oeBz_tfvev^MLx6J>wbURAip2+xq zaCOhG=TVK}7DFx#e^XNYUEyt^>yGm6Y~jf+Fz)fW&!PqM>><9P6-R!Cf`u-9*nO22 zFI;SMjp|gP(8d?0(`Dx8mtYEt@)x(2o_1nLo`IWNWLe8;w zE~GLEE#LFzVGFJD`ie}kp?y!O1Wk95{Bz)%-M3o`$vX4gFT*Xavr26XX{;{vR*rvi~k;-@75+Hu+a} zw~Z1WpYZTq+(S-P2)-M~>fsPm)@B6Qmu3A4*KGYqN30#^&oYZ}%$%NN(c)_L^xRf79xU-!c{Twv9 zSaB4S1h%$0W)(w`v$4Fp#5k-IoxQdHA7^jD76scyje-a$Wl_>dONmGfjR;6cOZU() z#0=en2uOFgbm!0^F*MRKbPWwd4K;9hzwewM@SNXpU;AErueJ8tYvb;LIMjs0pEpt# zbN+EM*H?WVQooICgG`79Q<2CD=FFAu3sc6{(kDj#t8NavDC=QlGVzj$FJX}BvKR_0 z=mJ&MddxJTvM^m{b1c|Yrtl))dpx5XSM8ve8Ab z#!k%wp9A{Fai>}`p3nD^$`iL(9O{KnBpY*HlA2%)Tf`12gZ1&6MnRB z$ghLD8^{Lvi*OI>ivTmrV^0pFZ=Xr5u+-ijG)LZ}`403@Yd##dSx5Y>8^NtCo%1T`* zBsWCl>sa~u7op|wO@ zHmtjN-uD)$`?@o^Grj=29S4nvS*X};Fto$F!`sCHodJUUoI>bxZI^+SE4P#-)hiIK z?winE$=_YB2ZULdbW|O-f23YVubx1MfAmhrdGFJa+0L|C1GcM@anS-l!l!c3<2ci; z;Gu!(5>hzBLlm?vt1<{gQ^BvW+}cLLQg0MDIJ1B6%i$Ne=W*uE(l|c^DI>hqom-t3 z8||5S!G>JCPtjE2no)^TKg;l`LfnHnD!^(Dc}u6e*v}Q~xZ^&H5%-7Ytz z#fk?e?UZ&Pv+f7A{v%$~J@c%%fV>FTj1Y+QBkS4hWihMc(^0Vq4lS$n#}Kf9V~S>k z!K+^m3`0&i?Beonlqi(om^vs@2?Frs&|}mZW5!~-((Gm&-Eq2uHVjl+<`CcHFu8ZbbgxB)$YyXx)y=y zR>ybs^p@xNiI*7~hJ)qcgD4lAbH!{hrx?`f8r{EU&1MOHD*x7NaY0L?#^Q^+u5T{) zz_Z2RU*>*41o)0ktOi@v32RsLBK-K@ax zwNDmwaJ}b$%<`GFfV_OObFuQV4eU=EsxYB+*BA5)(ngF-D! zsh0Vaq{iX`{qn{_9gp0TCcWXdZzQ~!P-^H@qF52=q z6>YnJ>*BF#X#3SO#sA?WQ>$uG3pZKA=DOZd9l|{M_?85*2v0DqxPb?9tqdJ z-$@+O#G1(MR$>X0T!m!6`3aSK)ht^dT;_eg3gnEQ+QC1Dp4 zMWw45Zqap1hjJa;3j8P``Y|3zi!iFDb$)wU3$%1W1-W6@xcSZK3#ubKuP@gRQgWkw zO-+~D;=Y50S+ykQ2I=afllTZ?IG*;`co-EDe&Fs}?Rj2Y}Au7}Saxn!2zb7QQ zs^eQT?l4`U$dSjAzpDHE`$aMzW!-$!{GwaUDLyMPDUYT)!6C2z#Med|7V_zx5q6vVhFbPu z?L;i;Q{C9u%W` zTAzL8-ABaNW+4itBFb?!N{Lk@`Sr%Q>;n+8TpebMa{~6h@g`5r-B-`kx5Ne# ziLf123|`bnrkHt;ZK(*Bn{udh{HhtCUSTAOXmRk;vz>z_exvfHwYz+2j2vhm))byh zG*bXxf)x4agOZ$VeG>1jX%e{W4N!M?CmpzpF9R}xZI=rVsLSv{?$d>Ya15-Q(<)l0 zG^5gdjuv(a=lo4wIUgVH+n}%o%T#@e9O_YJjqTRBeD>%%2Z{q)l*>p*tAqckSoJX` z+xCMfh7skRww(_vNa0Mge^&mK&%+=wJ!-(jr-hKKs%<@Zu61$U+~$**Yya6YrhXFM zJ2=w^RXMokkeh10@0g-piU53ShW!|JB0SR!=5+g=iFq@M>LA%#fYL&uT9z1uvW9{P zjmUyV8@T!u$_mX(^*iztlkmOXrM>W0b)faq(=+kHuiLDz?6u6dMwd5#lNq- zz~%y44|RgQs&IIuIqwWXlDO)b$@1P%lONjmFe%4;NURCoR2WvxmUOYHaT!QEj(8T3 z-Qm=R+MFk|S4O3QDCV|B=MlEtwcl2F9Hs%q2P_MBq|!`?N!`Mhf4`?(9?9B)T_sBV zXeXVP{2PNid7}#WWeu|C#qMNf{NL6G^pML|!S7@HNI$9NH zGd<16!%mEaTdtK53aJTO{qhGB1tq5jE~n6L_h5y@iwFT&(ZQ zB5`0^l{mINU39Pe%}Sw>>?}&6y7#t=WGaq{ci8jv;EIZSJ3JZmyMI@b06-XhLOH-YZJOiSs|${o6`iKRXXGDJHr@&ukKx!DIz?TYagd(} zNORM^AiZeJs5l+WclEFPn{O^zNKH_-f-PS@dE|}2JzvghldIRi)c%{yt__e>O>Dwp zXei9Umsr3BRc~Zla+94XR~&wiu9k`hU@G!cJZZM`(V!pZJl;f-6!9^AX>K@X{kDAI zaZTzl$9|o2)NKQFHfqA4bbIC!CT^PF2%SZO)xaBwWl@a-`YhMLbVqKc?SZ= zBWz#U0Nk(rDpokHbRb<~#OGRYB%I_;oV5qpnhkB*96XaS_mdaJVWVB=OmbU47pL!r zmXXaWw4{)oN%9-n=;s@uTBSRV0lG2JHyX>Z7t%KW@;NzgbCq-=aGBApuaN!8InHad3HE^gUi*J!n*{ zoW15Y+19I-IrnoY)L}lgHJ<92nH^sg)DW_8mkITbT4Qg%R^J|JJJe=iJzH9@fLIS$ zC&q1$iCmk(YPT0FsuNSIe@$55SNd))&^O^aYF}vjp}PEzkyLdqvhrn|uA@E~ob77D z;4yYfn&JZ=*5H0k*D$%7r2`T`?p48)}Z)8ez>euFN$p?H4 zP`&l)=jRw(;l@u~3|K!w4>)S7e?;}dR9SE z0}XQDcos>z5hqAhd%F27Ct1?~!NGo;)te2R$K`-k)_@y4-)6w!( zWN)l4L z_e?n+*)w>*6T-?36(Vmjdh>1}r)V7*p|Di6A|6XwsNfhobeUTN8Syg6t%qlD^~0F>$Y@m|T8kDPH?;X>afw79nbfm0hb*gtL|c zh?0D{%2$t+ANx&)L;FpPDwO==H3V}Pf%fRbr*5k|VkzvQsHy6@=Ctuy2 zQxH+$vjuL4(uEY)Opo%E`5T^vSp8#<+73<=``Ou|%Tw%euiEe*QtBTow7J%GAHFm_ zsa49N(r)WzToPAyy>Y8!nm^`5X*5W__7WMhq>Rhg^H$_r@!~n_h)z^5l6h)pV$M1ZeUU^JAHCDuS32E!3bmDmsvDWa5p;b(V zp!jjpIxw@7-KT7NlpFp#*wIOKh5<^kVe9Rb?K5*6pAeDqJXcjuH#DEz+a^(TbNCOC z;AC8K%Kr9Of2ON(@p&C-W8V~@Jm)`GnhCGbj&canX1Cd56?T^+`pQez5wZGtfgUzK z>@SiPw7wplfpt|nVoB6i3FHtA{MS|UOZk$2cjh5Ds=JDFnNv-OSt9bs>??s*i9!6m zR`1PNx=Rk-4jOMO!Z~Wa4PzlNXXh|xA&-L@YqkuPKbO)HQb?MDndPNE@rb??-*X{m zTzrL~`!e`tYZb6Y+FQkTK-oJWlUj^0@Xw08@MU9XG*2C4(iS>kVsyHy=Q z{{Ejxai^&o9ZyuNX4Jq26^-(xG^Z`5G)xT%)DZkLZ>l8dd{f+{i19JO(^^1cNQ^>n zbP`G>cwgMER?EaQBT_Mb6QgwKNMupq%PlkwrmVPv^dZQLZ;VV&u7Eq$UAer!aAGUk z`>xKvEcK1YEc4t8{Gav!eul=Q<_3olDmJ}!RPR{Zw@s1t-i^#q(cH2x6BtJSD?Fde zt)Mh%ZA^lwOuHs9QU|kAK)9hAY^1(A;m(b#s%{-5a;%FU&>~aN5-7$ z8g%2%+86cy#6D;Z(@nRu{g>rA)96PMz>Fkhu z`4nBg>$dED!8TqyyT72H_?KS*`@|zFZNK%KIpD-LeMKL{S5#}1R8_wMqBDDdmIv+* zS>M({$Dib-=Q5#N$`nw&E?g^%C4O)gXTeY^yJBLvF<+Y@b61>y%V!zD+2fGN1)&<(t$0f5U-~-BaVbP;1|BP3nqw>-d;SLMlCj z&tJh@$@OF$-nR#m9JbO?Ve%QyQDFaOd}5ySncCZ~^$oY*NSc!@!N;1tx4OL&L--Q5 z(N>m4Az114--xpGhI>UwSZlGqeZib4wF`zXF5ov4DAY85Nddhr#cf}mB83WneBU|E z#!R7Ze#=pkB~=r3s!l&iC1G9IPAlhnW1XF0pQ+?nE4$eGv$K`QG;<$q!1sP8DAT;H*M3YE+ zHhEk3Lb3bCDl$nqLBUNTNsGIDF%%i)G4E>JsGiFHm;@LB^&gp^dxv$do8V8%omtml z`GS`h;z7~montrV`~S z`pv(j6vz*nwe>X($ayMs%XfTx687eD(}w}zSi2Y!Igspt<~;y5#V^dZm#BnK!x3u( z+>husR&F1KWWQ-8sundEg_mdhDbV2eE*2noLZ|VZ`Fpk^$I`aKd}wo+oc)q7WQH@q z{8_dP3E0JcjdntuM4?OJ%4QS5RUxQW7VE|fqdz`8)Af;HA{4<%gR3iWH%aHW>E&Jw z#|Yp7e6e9@^sl(od2BfUTL(+8*3m`LW;VZG!&fzL>uQCl$x?+fee<$-p83?I^R*(> z*vfs}40IgR9F|D^8O<%fd^FyRB=uU{P&0mEtM+ygT*y_JrFJky-fwqcptIjE%~1#@ zLy2=N^L?9pjIz$-BwFy!(N*3d?wni5k-eko?fE{x#Eo2 zeo>5q`hqTOg==~n_uB5F{Py9MkNy=u+yATdHIVvr`5NV({XsTvnhxr%i{<~^I)!<1 zJYO8z{R9?$-hlq~)izL1O3}q=(yj{APvOn&xo^kXS!@fJLa3a489yyQE6-t5OqC>= z`5kVf;e%b}b$%Mp9{rBrS&4`N%$bkEtajHaeIrh@;I53^sh4lb8QvoIv3XAl<4@Dv zd(dt3I(#w2iCqg8F|{I7X7@r@3Bw7R@|KgQzC5yb^SMnEo28=BwZO{F>_hZ_2l)hy zaDJrssf@p9vbhMyUKz*Bs#x)!rm=3!VJJStAOnY6>64L!{Q1VFuF}_vZaGE(!|UOg zi=`_Is#TlQhNxp}SYM6_E{Z7kCmTMSv5sw6;GZ@Cz`JBKS-0@XpMfjrrqRS;C4aAE zU*hbv)dH&osfR@ctK}~&x`Qn&Xj}Lw$=vW=k&nYy(yyN5L51X+X#s8q^T58{Q06Dh z<+Cip63sous9f4eryW0m+^OpM9jldG1;mfyAda@a>p9Dx|$s)_A%1vddo5qQic?mx&8$F2`5~ECscHhyuE)4razdKk7%8F4C0J9pJ?Q!XDq>%Hv9fs9w546N z1?~Hizk;FlGl z7358`(U9~{Z5P-cJtAJ?n>M%ds>b)>Bi3IqlB0ZuG)wGu;ObG``Hz$!tuQ7z=w`#n z7x|6;h75-M-0HoaAJ`hxNW!D>jP~UcW6aYpf+tKr!gY+Tp<`wTt!X3kk5P%tq#FS4 zH+>f*0!1oD76>DN+}yv$8&%f}0!?{$LlJfrYG9sYXENc;B!I&-oHFNRfLr>9?y)~5 zW#~l+gyM~m9j|OFUbW`LQToJJULqo)K|zib&gC^sRzMIwESQ9%?FbSOZN7zm%a)@H zh*Wiu`pb%&M%mm)&Y7OQX1xUQ_vGywba9%CfN>;-VN8K7>FtXPIC6vY{K2!cF@Yq8 zJ)b4pxExb4ux-qdI6eo-Jhw^|xhP(B#0&5#k(O?~Lq^7EnCR@fNUG|Ub05R=At&4( z$0gZ$Yle-rAQl`gG9ro18e!7@YyS%&Gq;M;xgt{VCBg?sf4j3~}k zsn)2OL{)`Rc-G14vi41AaaW|Q^Xg9H7ixiH@2nN{jh}{pmf5Pww+6?6FnsLyNAv!4 zv>|yIVbpj``I8ps={^MDgCCJklxO%ubVW3PXT!Qps@_}Y^WY>^2)5=MKL7f8d+qPE z?!DZ~ewz`z0)%slZ56?ljv9Hoszi2{9$qPXK%eBFo?JZ@<%le_wojSZ7o&JV5m}9+ z^0%<+i{Ul$7pF-Wt#=Eyl|GO3kf#{a`NxEML(nd`_o~BrTB%t3rC8v zfpd%1E2fYQ@LHul!NA0!zE9Z&x-ov~mvY#T6pCm-L>5F9-Lz-u`6t8GCkmD8Yq!QJ zZhOW(dw5dxt4K+HK5>k9>&_-U!+T}uplJy*3%sIwR79Z_j}K+p;q1lSkv_M0YK#Bs zumjs*V3w-+J@72_UIk*%QPDE8V~yD;7Ln08{j_ODH3}xyATigl=_$&YRIz@UY_8`g zGNW6G83VCY-8PC`iB#hL(Rf0iv*1w}kih;&Cs#!E2tw7vQJvNAJLc(2x0YwHYA6Hb zs+L>G@0She%*R##m>Ntp#eBL_;@O4~gdg)@1xLp`{v6%aXx&2ru3vy)wPwo>gLsk3 z75^SzU_3SA8zNzLAihUi7H?;HS7@KY_FSmKV++!22ef?4E7+1n+v$3Y`&NodjjE|`G_~w` zCSE2p%K@96kbfdRvuHVl`VaJmM>|gOIX|{9F6URsA{A77#3e z??!hfM1zI{O|YyL2J{L_^x0PmUq}aMR)k$^fu8=aZQXwN<9%{Ja(@MfOQ({qeF zqx1KzMa9*qUg%FDFqF0s+`y>^u>Php+B@Y?$0v#3pBT3HIqG`Py=8*vrg>70(OEZ3 z6QUL&xZtod1gVbk<8su0b6BGbn=OuI4f?6)^|^dRNx3!h;`aCfdVXK)HnuxACcA6v zQb1TfB-A2WFvJyo=o$EW_T}a)cz%SYB3B8Ldc}s)UZLo1QTy~7yl)=Zt=Lebk(uIA zQH#|yl*Mb#MTb`CaQ)Z2;mY<%qkm6#V?-7H-bXrFa@1{5tb7;IYFYxldSHGmbM^56 z8GIi=@QIyulL64h~k9zovvqk{4ryB?uY=Fvdn+vIbR~dt5W!CWT zX#J)>u~g3EHD9`$UJ_vyr3CtV7R-erai0El$Yz0#=-*z`en=bh$w{1WjVR_+b@2&3 z28n!~2|Fyc6Px9ba7$BI!AQsp#HVeK!J&3jn z#sL2yp(T~!A+NFn7lDlxiD4Y^Cx2Os`qy=5TFa^qV)gk+08N%3Xmb_tkyr( z?qY64CYU=)dcdh;r9iO|J!I`cq^SxD1IuyfIqEjg{s-z-#yxPW75%siItPKS88OsOKBz{#pk z%I6IgsL29XS^aZZYa4?G*D7t0@+l_m%s7u`5hm%S(iBd_n=-L}VewU3zuPppVkggU zEDVRkr>yg^o*(8Y>s*W^_Gq0!KJ#B-EDmA!`5!Pvog@X}=T=9qSgFIA-ACNJ{RACj z(c}Fp@rWnz&3*<{dy$jcjWqTY)uqhmD$$B$*47sadi4<)enhsx_{3gjO*pkS=r0-p zIo@S`k|~JoLf8jqJDi^jeU(vK)%W*EVezLQC;~Fomq^o-&>>)x1~UCQE+#Dnqd6=1 zGgWK~7FMCc=AUm6-f@t;&8gHdxjEaXfF;Y#_`NXDj7kALf+WW#?zS%sj78s@m^4DI zl+wK(u#4iP0*Q9OiF6w7CG;S5v`Ohb25-JA!6Nm60D*T6E0kaH8{Vx1| zdK>Vw)2cJZw6E4CARw%G208>)PaTJIqnBVU_1As- zMi0~f<6Qn*DW6x9_>W6(1hN>_O0Dt4jzPIN*7b~63Z#;?cCm0N7)@Xs$UlDw!<jlU&0XvQ8Z*{|Q^6JwU!rsDQ&9@ywnSue@Mb`W;lhyu+0@fL2(tSaX4pHVuH?i+-|%8< zyJYTn^!_WzbEmM4FJ1Y`%n-MATcxGWYyAb?T=W)pnF9uEwYrYfO!$iZ!D_o&P9v;d zS~&KI`|#oki&FdbDPNk+ZenQ}mpP0p-{3vXl<4OR^*@;gx2_m@K-nRH3m3pTdgzM#gZIU>@Pr2e-;SqrXh&Om;wh?+;yQO&4 zOSeVg;EN1Gdx-A&%HuFm()m;G1h?2YKiazxG1*7jed@er zQ?H*UP!$JJAp9KW`-lkN<~{Hn!Ks^Pz-O$*4hEMPaVkUP_NKAYb(RtesSeH zYEA?7GZjPBikpV+w%c6}&J`i2g=!`nfgny7P{-n_?%uKO*mF&g3)e zD0rwR1IfDA$Q1GZ@!$LIdW>+c|99y2NTb3=g_5Q3(2Km-EH(Q}Ri(%Jy$=guT!Z7` zYIW`e!N~#9?+`=}%Uu6^0EDw;100Pol>kaI{VN6;yM$lmk0g*-w>6eQ zl|`@amus^TKr@<`vS=>mU#i#hiWQB9aNdWX`^h?3zc@=1lxtZ9DDd=_sXqf9ol88D z@n0$8^l!_pd7p3r=#=&8#4}S)dViH+g0|~ws0dEX&jtc7=6Fc^_RMi#(OwcMRc;B; z{K61kxu;di<$AfImk)2F$KfUovLy;_|L}F`L#mVWNcnKh2OLoXkSb~a0%VwIdy+?p zs8%S5N@Cxs6t&^-V0pLka0(yVE~;AJaCel5crD@`|5m4OEvxLJ2_uc#bC_}wAe27^ zqCFEm1)>@BG5%@n#lfuom6ST#K*5Gl8NZ}kF|*1tq5GG+M2yXmdfQK}JUikL5$i4C z|7K+Rq!1zrUHWJJiNFhoIql*t(FzL%=TPcc9^&lgV6_`&(_9RQFlNTiBk%qQ0Am?u z!%6d6{>ek$C811%J#aVi#UZdxDErTUGb2a12~9i%kVS~sQOxaJ`l{+E)3%x)rkwrK z@1(`Hkfw%Swb1}?OLk1ie3iRYeFjhnE`vu%>;T;B%Zx21_gT4sg(yFBWQ47;zYUXb86Td8XvlGF218Q>c zQGVQy%WWJvD)dnm=w~4d=v)N?T+@l{o z_s0X65!?4QA?+(KZPKz2=a&S5#R#BC(eaJTBFLHji;UnBXlkDzn2|4mSA@ z9^A+4bF_yZB}h5B*t)1M`!3=AGs%rFV8_ase-p_?c&K~~HW%yxkt50J;06TaI=hcH z%7MpTAzd|W-|L1W>BYvy?8@D+`hPdp%sd)v{vdy03j8#3AD3jIdP&6KQuQN2XWaf{ z!d%xd;cY?m8uqy{Th+_wDxs{z+Sd$n#xXLM)t)#snP3Um!Z)td^VnXl@1J9fXvzJJ zq|nrN+UjBCiVP_G>v61UC^?VQ%*=4c_R#a8hZOix&kWO2lUJydxGC3V3j6tL!{7YC zG#iiSexfl0))obXHKrah4BVJtr|3_@URLN9i3WBYQU@vZ4rhor&eAd7dd-3*?lW*6 zg4JDycUTd#*#b)`t+cEu8848?;@>+u^y)+6Uj4_{83+u~srtE~_+0!logn2w|oiCH63s=>8V% z7adSKLMUcORAZcw))@I1?c!&L)k&X$y{En!b)Nxj=}sg21po1+{LZQEZvkLkPmGZ3 z<>yz}Jky;7;G;#F*gdUq~xgrDl6|2&ykS6e=0wVTIb zf&36nXwW{KX?%CIr_kJPzMDe*UZBr%MLq{D(SQh9y8S@E} zE*tBH8}41x+7ZaMPHCLchDVP}X|SnK*_r25ScLP7%7*SKWA79^`+c@!i0~^HB2Y?4 zTl&{a>ZAyb^Bk34-qN8(JN^~4P1v|8*KN*;0oVtR^0my49pDl&GUh2@ytsHvuhxNJ zq+9mfs$99{LhsDCpoH2ZjMhQvE2ZkkPH%C&P10yONGb0QZ<~*({WeFN><&M;bZjjw z%H9v%+|7N_W4WpmF_mfnlkvlmqI%$mg}i@<6A$HWAa5TtN7V8+VGP|JWHr5;cZ=2i zWq+H@|Ij=CpVc*sdDnLym|;;XQ5YBvub8@)Eb4OE7f2BDD1J=H@dFm)>!lb8Kl3<) z!wVOOg0lEwh$i&LzJkt}uJ;7+lu`KR|^uX_1#G4$3eanGyriZpX3K3m?w+Z}aO2EM4 zL+o=|4(odu>_C}~-^I@RRh89$T$;(wBE%&3nYc^s2K0q-zoe|54E+}-{5NQg^21gj zzGr7Ti3ru|3(GNbLASEp=h}uYBu@`^)Kdr87hpg&`-^wO3jm5b5=09SsjGjR@^sN#1ri1h5ee08<*YyC3+Er$BnD)GDimci@M zZ%c|uclmX^$ER?0&mYfqs|j6Y zF2P@W`r=GN0RVmy!Eb%S>p1*2CkCU{E?43Ni-*sQ`BHsqn@4Vk`qG7usi=d<*{f9` z8n10moZgjMN|^I@y(m?V%Aa%13oIiIY z_Ps$&>ej{#Cerr-zLI-=^x}mceve`)XZglU7;+T`>}|Gts~ro#95&tX$5)x}O2b^8 zI^Vl`PD|on=5L8NS9jYq82*&stJO`MN*~Mh4%S&{1THNT%;hvh%^UVug96b6no44h+-) zRK~3rBP}sLdJQXI|35NXAsli)sCzKDelV#-m2_P#8Jtl{cIK{KPZ9;~8$_p{4sotf zedSCC*`r>I^tU9qa!tQJHXmhqmmfQJk-pki6S^GkXg7c5+|h7+0$g4wFwMFJC^SfJ zF|jr|g1jo!hkE(vFNN*<>X$Z(Y$<2SDeEV8b*U+*;1M`u)$9=PzQXp<4T+H4V=&|F zRo<|X?}J{UZxLXJXQ(*-z`n)g!IgDAvr+8lv5}rD;Bcr(zAhnW>w?|OH-r1NKFFXh z#qaWDOZ(Zpuzl;jd8Vt8yIXtwMVtJ!RLE$sSe+*&3VfpaiL1|>Qm+>(%UBpF+#ptV z&sFJ$41vUJbqg!3uBhDTi-Jn9kfsq37vems84V-ybwj zS!dm$EAL(9$C;s2gAE1w=u?FpGsy>#$wi)Ia_Nt`d+9PYLn6sSo(reT(CKz8KV!%^tY2?N zT=?8QtiS0Fd%Clk?deGW_bFT|9b{^3JgusUTckRN1LU9iPAY`uZg0=Tvm>(5ENwlK*AzdYs-j_KF28#{rEKo=u?4un-~Q z!gw==5{C(0!OFg-m_1RoSc_%GR-~@-e=^}Ja#z(@xzcQlia#d#6|Z?hJ_yO zU$}}PWNgbca=1^fABZr7o*|`nCxl|PWdngNQM(rzv?o#RNaX?gzxXrM+71dIAVVn3 zD6!Q!Tzy>_CVSo7ppAf#*_FSxdN6hEMn67z${TqO2LIlniUxIzUa77L9xM`Jk~V`M z!*&wecI=rCRfn^h$-TJmLF^(Pf4*^Nq1BA@8Ng19$!Y~fC)MfjsuZS*li8%dvFr{S zHb-%)HkgFtO~Fj$1!9pfp7>xFTwC2o51#3X{mgxo2;f!P`w!mN$onX%5XLd z>r51P6JiGmQhv0-#+@(Rr9xcFWC3fb0D8cD*nj|qt%^OA#op*_T}9m9LSEGRIcw8c z`=o6~vR)1K>y9G68|p;7i@+v1^?4M+5Xvs*q~rL_(j$_rQ>mER3b^fZBn z`xahH{FVI!qnZ)#33OcpX(*Gx`W3RnfCqtS*HHGm6}UrtqqUfU+0j|C-*MKzhVLb3 zZY?sIEY>crY1`5|_?}7?-i{|VMiEJI@kWKZSvqf5Ai-nlhrPZniQF5km!jqwQT+3( z^E4HesBzzhEvM>P#Drmw>>;XSCKINAn|@vTFf;3Sq3~Z>xTomhXPrCW{=Y4F-0qED zvVg8G94y0^hC{4u8YTpJEGEevth0#+C}8rGd|4 zz_d#*KZ{?o*vy#FlS@XOFeLf=mB8Td14116PxX7?x_oy7z}56kOfgenwP_Pj_A`C{;xn;Jr`n9#f}wK#Tx&<-52-vtU7eJ+v8O`X!ro;~&F1 zT7(&w>%e%Aod+9_;N;DTWmiT@et>Vmo8NhQycHx3h%~+|HRDgNDThxy3^lp%i@&~2 z#EE4#pQ<4eDWtVg!l$j4S^&3xvHxl^>+PTIkkyolC%5eI??YVl#+biJRCxu=XTOW( z1%8cfxv;!k;OOWp+F;nV@!^MHqJ7zPUc35V0Op~}oNl;2<+`z4AWj%$KKM27BV2rR zD&6Lt>GJjeGkfOOg1m=zNRKU}bIyY7w`D)GrQqLv9V3}iwC(hCeL^EbW%DJ5M|7)^ zR5I!*-8F11<@Nf(?7Z=qe$E(9q$_RzkhGUYB~}72&2L1(QYC`QpQB9-$1DGd<6sSm zsR6x?hG|v1weO*$&FGI}$1>nkf;N8n(HZxUE1$*qhF~4eR!imT%W%ieHc@(ffBV2e zSgub2QQb$^Nd$60x$W~~!Mmk?G_1xI+k_0C>~_*QHShIpo6DJ+Min>oGbdewwt$%z zBr>l9h94((gAIObwUj(g46ZF3iCAHJkm?@_vFpS8-%SO#iW#3=rsHiYyy}(yq!Y8! zOeejV(pA&5Z%A%2iV+Z-9lji>8C)tqstsiZ_2coyRJM z-!*4~B!e<)T*r%RbM;#+KzCa&+NTE(FVjpNd@ChDNt`(B!ZpY5^&z-LM)3EryluM{ zHY7ykyWqQU$IqgI5XICXnkz$>0P!KmWxN1WO-m)=53`n zJl2e8iIRYT>G5)U0r*W=N_h_BEQmCi>89`U)oo)Hr~7f1-4IG2RN6bAbN?7c z9S}ezoL*(4*ZtZM#O1!6kFZ=2yi8*6L4V{r+;SX8?Ml6MA6ABSca!~BoPTzc^4fnq ziNb;WPtbKf8HKTq$#@AinNGGb=LdquQva>rPm~nXW+$;!x5K&;=i4*1V*deg!&n{X z`@6s3c+TkU%{;lVfv-XH%%1@NQmPhKsr0ZK;5aTtv&Kf7S(Ym5tWLUg`46^k!SgO9Clg)$H)&(H)F$&iDrn{MluepPt%Jf|ZeLD4{FjZPg7L#J36cPIzPIYT zs@>ZIwDT$T*^Z8TIwWq1ZtGdi@4W24P%$Uj8`OK}PDZG)SX(%ct5_NQ=8dh?Wp4#2 zq^R39XLz1?67-?Ib9kzPOOg=-14xovo7DJh*(O{=%}(sJ`yQ_t+p1S$d1p_L=`8p^ zYIAOq>2->{waeG2FhYK^5WsMSujSr zcneV{Il2x!hk(ZRN%G^D3!-J>xn!XFM(+fU{6Xm(do;mj13vzu6=zk;>8{MH-)lvz zg~#0|H+;qL?CvLD;j9zs%vPm~E!{+xM)p*(c!#7W*kXj0id{-Y#a``o0;Flp2+~5+ zM(%$RWnp{fb#l<#t6~)NI5yGo(v_Y~HXvZD(2&$kdjW;X(B4WQN zAf0Z5+AA#l^Ag?9uW4}#Avg#D!HIi+XLvbldp$#>%xg?`B8V)&cXT`@lHr9+p%3IH zKTX&754uK?vQGizn(9!m22w{(GqedtF=-6N(?DU+cVTWB+V_lr4ubBPK72FozVv=P zgv~7q%ZT@wDpd14n6r-O2a#%OgVECCMj+VL=Z?L)>oE5~(iTTS-sDxg8Pfp3k6PDH zAG-lIO;_uEucZNU&_KP_@LOcHV)&qmYfgMioc!ICmqQxQ0`L2U#e7FnMpri?lLkl3 zqgNXO^kG`PEU2+goJ78=9Qdd9KWNISpxD2s(=wuim)EB-`Huzx4)6Uk!`V8JXdFtH969@Q2><0#u)^iGRwZD;Aa4%1C7qt zdwv?j68;w8qYKXB&NHkc&YDNtjI;yKDL2uR$T8GAC?|J8L~n4kY?^wr9ObQ*{jr^@ zgL5CvYik$X5y~JQ;a)Muf;qn8KGFdDSfXRSKXG-Bfh)OrNN913#mE)@;;Mb}S>O*8 z!nBawH}dBVK_of3&1smg*cQo2M$@CQk0=k3X0+hSiS$mSiv-<$SNT6HBF9+B*G=I> zaE`!D!k``Pz@7i~sN6$)q^u+wdaScz90VPPqg)`G>MOL=qgts{0wDvP6DN`ihwkJP z*(~-19(_EGI(WLf)u>^nbat^)p|1-wyFRG{+m|ML#h(PvZ(s_IE+fiA)_hC(5Gk;x z>`|^G?(gPVYUdl_!}gA}`~}g*&KsCGocs&3lLbg~0`^`>t5Qv~y> zE$PS-FX>sBaVOkx&DXw*5fX2gt5?`%9(~m4usY$gB`O&BbEXPD?bu3o1p-F$WK{Dy zRAK8zP+bn-(M}~YIEx>(cN^T^*mo1C4km`oh}3|(St#bOr4O~mD(|x_9n!g(FPvS^ zf}NBX{I|bB1I?F=+tlFV6pKPnN4~o?i)Fx(6qovaj{CB$O7VK&s7!A10+gs{P0*O; ze>=%lela*&^WNP^SA(1`>n7-}u}Hw0$(OW6o7S2@GN;F5|1iF_dg&qZi>|IKGI*=m z+graWi#v8r;}rtN-8=V;Oa76jr}>BL$MLRPVP)&+{6Lz`t+7DE)Mmd8?EbU(DG*{? z)lM05tv9FFb4s1zc5|+%i2vgaf6(K9Cr^sIzliga6r4f40_+?j`F(oX=L~(Qi~t$= zzhy)g3!huxxEN{L@J^{ZeHG?bP3cW!aqP>Z9EtsuNcX1$&jLry>8wpmSXmabg|u90 zLBLH-R*!?_l4yMWV?~&=Wv0iS^Aa)MOQe=d4ewb0K{Sh$SWW$ld0ev1l5TrKVDx|A&dbK&V>qoFo4*n+^JaA9 z|I^tgM*r)IDSNQoiw8t(@h1?8xPtF`DewEM#YWSX_5E@bDEamA3dQuxnLD?-jpw&0 zh8;>Qm+i{vkV3Ha9i_4fw?3zO@DGE$_!aARaXcxZM?^iZ#%$BvU?`cpQiH-@ByS0B z?OZ|BleT7um{(HuKwL{wuJ(Jj;SaJ8!v^D*n}#|^xR&h(5+NmSba84-5Yo{%o6cT1 zMJuOjNLgTW)j`d$BSBv{GZ!lmAWxzGkhGbURH6%1GHDV;d>6tGyA*%ue!zJVT*950NI?V9X(^`_p zCQd(^#5E$oqJZpcyh|M)%pg;$ZIY&E79k4xO9j#P=BHwnctaD(k%WYU0AobjSLUwh|{`npfBq`QZd<-|k z{wRqrLuRsP#+COHA6*qQ2YwLSiH@2`hUbnNvuQ6uoslC3nqJb@><-XNV?_z&keSQJ zHj@V591`seUlCFs!H(7M6_U!fGut`lO`SMSTZ58S$C{oQm|gX|hQ-`S94|ly-(-q! z>~EFyu(O6$cY7eIA2RA5AKDwbX1|yA%FsES1Z7(5^0oi(g-z?s8F1_6 zzFD-~*a?E1;MlFE{RVC>ewyn##>H{&t9yH*j;0Q7Vro{0v>A^y*jXkDPc$wAj-q0h zvKWAD7_zPWn(o}?)gC!pWy^%ZsT%q27XnOP(lEaz?XLl~+L>qR6JEEA>Fo3Lha4u0 zt5|s_ctLhSrvg@H2T-%e6m>C3D~3Ciw8*kt7D8;#GTlTNRYwUTvDHum`|V1rH$K&Yq1^b?ZM31{&TNT7b> zLjJY%otu>wk_R@xO)?`l0@0_k^UG#1Ev{u_OqtiY)erM$VizG-J!%a^+AJv{jQn?h z7ao*qQsKK|mK}%5=P!5E1;p}VQ@^w06dfw=J&Tw$c~O2R(|V0}nw8q2Au zW>W?WJ9FL!Zw3ce1EX+anD2y_r-;gIO z<{*rwdvG!|w33Bjo`T1!$IUwdj6Xh+a+5<(N0XWOy^~x=lz+A{meLkqN5n48$=5N? zA5M8_0u(CkYi?@yCp63UU~5SXhx0_#AE$Mb2;%Z-EY)3*kpU$pJ5&G^t6n8>My6I; z-ABXQ(KA$WJrmmy3i0LxGhD}C zD2zqOQ)FVj6HYI%ln<&~pQ*5v=?P1h71RoExKU0Xdt*rvaKEi-ItHD8~rr4RW#gHuqp+o8&!+KMcTHy1#<8%7y*BU*mt%42hy}?7AH< z`R9d~>ArD(cs81v^A~MyBHdXwHXZQ{O5pIGJdj|J`t^N}z9yD26%sHd0sC|Fblw_L z>TK<1G$b7{o>&JqIejaUk1*L5gKNOK-btL=k_{vKm~g@w@Wh5uvxrRs5ps`>Fe9|W zb!atMGc*-TdF6VqUGUj3jioe$19*_vhaSIsPW^Xf5tToaEdB&IMZDgH)`iNhUXi=2 zbkFX3?@50sa3=L0f+H1lGw!`*BxmtFvUL~z-DBX!aa2! zXIXP0{kReo1ie3ezhTy$vNz4p_-4pjvu)yi_oR8^c_u6^#u*?U_#pOgt0$U@ZsU>u zT=aA)sVVW;g|tIXd;6~BXJV7(JrBjHyMsckUpqm`l zx)Q{<6ZH(u47yeN&+Ga?D-@G!vNu=SKihkFjQpk!STQbb;|;e$iAd8(GY=aq`@hx@ zb@vbB|A;7*K@zW1{e@=G9RG=QU%{7&h!-&=r+{cy5P!iwFF`kWQZFpTa7zj&R7JR1 z6RDTCGXTjsv0QTg^kjBpv2O^d%dS*HQEkBf+G`;1l?}UzrFHq}b}K6u8Ya5$bpJ+w zOd<7Ydw=;VOT*n@RAN-);+!rkdJ!K+vm1YIWjE{obV*L{`ed@-um@K_1yBX_XBjp# z;ui27SHtSp!s3>O?KHmEC!Du=pP^G*0O`aZ8KyfKBo&~~p8+7~vXE4U${ktgyIRET z$Bby94{TTj)S1s1QVwsI`^PrElZ}6o(w$D2`5W48{hE|)DDp$Vg>)ekx^`0*UuiI9 z7`1yLSM8^HUESIFFG7=8)JlLH{VL_qOSj-GXRz$#*P-+o45)vWinP}V=NU_u?i2hu zHt>=#hGOcK2_OZJ-c&pXSG=%fWdf}qxL-{iCXM(u7h>`%0 zg@z`tD=V2i{yilOqpa|!Q;=6gxM*ZxWqo&Pk+1mazq{T{xmC~n|B;snPWpt z7MH@8FF77I*Zzsw6r%asn;Xq@-es)iik^T`CVDWte3flk?+$BTOP39LfAS2iZszbq zzfnqSfH98&du1hYuCohjQ@ZKOR$rSbNRo@t{YKgi9m|DJEfX>_O3VgIK01+6JTUl` zTgWzMykhFq%5p!RMq8d)G8fkb{7taq@Jwvg(I~wKS1g_=ii>vIS!z0_YfBpAe^mEr zRvozL^zK$T6Zdb1Bwz#qd%u8UmM^GZ zzSft%b~jeNdfOz(t%tZ;EACXgc$byjNlE|AxK)c8j-ft@lF0 zdl&U^aM3A2&LN_jCk{a1B+=1C_mv@Fa5jy^RkUAUhpgDXeixEcVGoe^DjGuibzpIr9=HxM>dBKD1FBA=lp~5_+A8IzOHJS~;D~<2M z=gJ#A#L1r;%Yw6eO zL0ag~B}7R$;uL)HJ?Q_wTO(O6x?6N)hwQF8S&lqxJ`oy{hROhF>G2OuV(xoWYA`C* zOsDyFHN^4lNF5^vH5;0T9-#DGIOvi>uR9vWHb?9il8D12AKs)$IeRF`x4wLGe-ve^EA@PfwU_P-${(czYsunJ(xsKJod?!K0#mKG`$J!lgecb)x={%|Q#3b%xy z(=H=m4}X^cyZOZnLm=gUh*-GuV@UP#lU?8qbiJ#SeU`$gG)T?~b1(=kKCQ;#q^>Qn zaa`ZcS<>@nOfomh%qekZn^a_Hw|aX-qJ`g0uilY7uKVZ6_lzL4)FE~#eWLqO(=V-| zY|gFKe&SXzhK;*{N)XPbQmVby_$|%}?YM3gn6)5j%;0F-!uSxFj}-Xp(qAby<^@n{ zvZn_k#On$#fzkHMM5$ohxvZK;-;6&B4ulR8B1ZlAZ?*p#cK)uQ`pQ?_OY_geZweDU{5|Pg+(z%VjmL#OHYc#&|{p*m*&aLmg}2h zNaPYq|6Hy(5$sDA$jGQ$t?X2r==w8+ED7N_VHc~Sqx2JoOirG$9ypmmDcSrOL7&(% zihD?}<7hizv58IuTu&Hblx@gkt`S*~DBD zn%nvXR~Pt2cCe#_#admoLaxa4vGNE{#3xjOJokJ=8jk1AB?sCuQN zM}VzELh=c|vOYuca1%5%(RFLg@u$v6tF*o+-}5``+Y1x25U%h!1{7}WP(}U4gRMDn zn*13_6zH);h0kFF_pkoeKNAloCL{R^$C6XuRHOSbQDZ9 zvQDL9) z&5a5VgSXDYi!t3NzJgX^`hLL0KQev=W8@vR!&l4|-f}5TC05oDb!uhG7etH8=EPL)dAX(&PTANFG<^%^eT(3Swm zvGKfyGYB4)7;@)Tf&+}6?Ucb8($_m{en)4IRR3)^@FE?E6TYYcu}^E=*Fzo{7~q4W&^?)Q-;YK~;dFCq?J#22zdIa``l#ViLp>y;k|yhY~#2 zF=dG)(-GX4bIn5|clnddW{a4u|AH(lMOR-lEjB(RbI3edfpyXhJ+3q-QJ-&Zt(I%U&8q#m^YO_^hJJulh?e-+f_Ba$ByY;et=Tz{3B8eRX* zZqa2QWP=|U=;}l!Bw8tsciM}nQ*};SfX?h@!2RB3>1!r2jkpMHOyJi zjWy+`q>sNQ_hpvMQ9f3)a|wKSkLin85H=l4!ZrzyxCux$4`Z!IlpsT@{B!t@&kPTK zqi#HkMn=DAgrF)YlW0VtWi=Z>ECpEyQTNX?A~+t27hKo(WY}kIAUguJ&obFIHjPK) zBdnkgq@4RpRVfK3HhSXRKLu6>wyDGhDrzRrNe5gmGKFmV9HhxZv4oWH5A7x}S$HzY z6i;f0d@g(b|H(guBJg9J0N*D|nL3at_+$G=Pqug?Av@tg{;I0}k_ryZ(RcW-Yd+oA z1^0~_eI0KNf!wO9ait&tC|adHJ8?ky&4gE79Vg6x1{xL6Gu!8^DU3H}EmiBLih5lM ze(hXT>1#!v;jLGQ{9-&&2=SxQ1n*CKbQZ5LM4+7!xjH8+9DPyjbU8tbbnWT*S<*Ff zjJ#*0-)NQcy!X7BTYTUS&OY;>lUsB!6!bYWXu2}<4~sHNDXern=*sRo zy79SAhHii0oDUlx~fvOC5l3~Usb*VQb zS2PV&gf~qeI3EA!vk|@hALQH#zZwt_ze(x{vX6$#XXLQ^WpAs-55zqhijPfO7Uza$Y^n zIq4F9y`?H-w7*F?C3oqBi7FcHWR@l-d*{kS;lYI?E^IOl@a9@uprU-xy=A{v8r7WL0q>;@WPu1-Sev1l} zBXY|#?l?Z_$;$G@e5m;9f=Ou~$UrJIDUQ`JHhutwcCHSuu{}m~*Bb5ei4@UJ{vCc( zPT(~`sI&Y-`sA$5xUyBs>(;MMLx>aOIXkoi3K=0D#eXgX`c{XRVIgCQC>1}PCJg^nEdHGY)yr-2VH=~8{Fr>f;kDRrY21G{ zzeuJ5qLKPZb0!aT4Xg8XF1ZeJymSBa&Gv6`I+=$f^0U?xDColaC2NLCkl6rT0M_Ca zoJfb*kCNj60;n-_TA&HD==kY4z+5M<*I$`6!BEs!C}R-$>3>T&p?&6J5DHKyYt@~| z#bvMcK^A+$^E*l9)`bbk-QoFo4nr@?Mn7HN)0))=+JHZZv1EO!o~tJr9ZxVa?=!z} z9m$djHyg*w<96TFMy{~s!fNhiO$eLg_%zS(aS|_hzecw}^ca(*B;oWhiU~`6f}#4*8#3}mQqV7!m-|3uL1-qBlhz0%6ceTfSJ9=YVdEq{Zav;da(bkdza2wsMw&_3^g4EGG9c z#RAhm8>U2&kLkQaG2`TYTN}Fw3UJX+FssTe60tf2msf%Uc3~S06WS;oRovOt;wkz} z{Ny7n#sPZdO=snPt1`fxL!Tu&?{Uj|(Wa{vgPU8|e-k>8^}7EBPkFr9rUy z9Ed1Ombio~sr4#jAn14P=hncTE11iCMEBXz;}W#XVd(~@uj%;Gm*n0?^zV?+w3dEa zcJvM0G2@C)WMSr#exO~XH@q(aJyF-b5giPv$$$K?%m}>b?!z9+*kwtzdgv> zFAws&mBcGvw?Ghv3c-{Q>2{YOa>eM68-ct=0P03hyT*CV$MhjJTkGY)%`iqRi?4~e zJHA6RUl zgVu5dwCnw5a_g=qj8VM)B?35r1DBcrGz~o}Fn4?h&J;@JU~T7SFsb`*D%XY6u>rcc z{YD@Q5zrsWCiThNMJca^?F(r@_N#>{BslTak0|6HEOn!d?EH5ViK08FLX>(RXJUnZ zBS;5cN_?Fp2R&~eTcKQHN`FcE8W7#zYSWIkkpAOq+|B#RC(?u7&#ZAtmB5;M#2jfy zW+^`+%b8sCUMz};GE;@P3FTfE0Wkb4nbG&3ig;+ z`|Q=|DjY;)3la9l+rIcl4^JZ^9+^B^eZ~&SB4 z*ge}(-U;)03{?ku?Qe*pS+8yG4-)|mSjbOuSGwk#T%>L2P!KnLrR35l5SPv49ol=1 z7M^O5RxPtcN^_E2!eq4-BMgi-+;}xnb-!P8yB%r_`)PdtGxgumnPl_c<;>0^6fKjn z*|pWgmuzVsIiaqGt+1h*SaSqUYTR@_2U`AfNv3?-!L=bJGo#XK z>XNA)!JXbHJI)r)nz~N5jd#Pc+$qAIxqawp{>qayy!; z6Q8_kyVV>qY|*=<-h;PxSoGR9Z#x>BGr_5vjS~|VKis^~Dh~dcXzo`V9Oin8FVQ5n zsf~g*Z_}6THI*$Ny58GWt87%}7&jBzWS!#YPV>Ex1)T!*w4N!gr)eGtW|Q zi$T(w4)CDH&Kj!6CFu%}pUqLEl>vjHF`H{;Sgrdi`Ea0e=2?kYB3!Ug)T`|nypqdD ze|BRj*nQ#@ltlR&wy+=dQu)xcz%BRO?nmBR%f!oNw6}|~K)0Ay)h17F>)tPM?oQGE zT>x$UoAy#Ynge(E%C}9+qU97;tzfW5RXnIMrp_8YXk>(C0o_lGl(-XeQ@7*O*xjgm z`{VYZppL9O)S|sxmcG+xdLT^@~J8!V}-!l zFr<9KNV{||ZNK3OeA&E)-F=R|2D|x3)BA6~Yj*~OLW(Js@Ks9W(TftX+H;nfj~y16 zL}ni4g z%U@+-P@_a5FOiqm8`*bJTw5K$U(LG1@si*10~{o_m{60H7nFyxFYH8|t!m><1*k-u zwXnCVKW0fo*z+v7?i9@XM2LpsM8#!X1Z$c!kUBx3#h<Q(@0c7 z!I57rj?djmFk*XL`|3Vom&9t9P{>DrvD-Jf68<4YcDYpLxjY$Q!NiLT($5wrglY$o(7T5Uq`Oa4EAbA2Yt?<1ZL|ozuXTo_^U~ z(Ek|&L^fR({vp&(<;35|VTjJSTq0IMIV@Z5f9I(Fl^L#c1ttBATbi+nLl z^EWpg?b4nRJ8#pk&Dg%>9SNcACE8z9D@Y9kgZxgT0Z90=BkI8MRLt+sY#-Pi_Y|;; z7DpSYfDA!FpH{{QIA)r0ZE9P_x_&fq5~H36^m!bn>UcAXzr(VotxR_t)9EFfJ_g7< zyHt-Zr-W8$!(@iPgqd6o=^aQiw}81*XDYP`uy@h5bQtUzX_a7#^?tsE z-o;|?qyeAl`vV*4RbDmWDGQ_#u@&o8qG#>I>dY9HVf-`q+@JMCF> zU+#0nykMQq9k60Z*HP3FZB9^xZ%+_Isk;K{yr)_u;u4h3lIwSO=JAzgw!O*>QAruB z4x!+Q?RJ;5eWD~P6F5xR)Y!U)?zskh-XtLssy?8z_5?ywd2dZub)VD2tDJ_s4EHhJ ze{DMHQ-A+Vs{n_wH>yRRXq_rSEz|2)_((s4XW26Kx)zeg)XvN)yhoZH$ME1}j_5m4 zgg#eFjvb;o(c1qnV%!VvB5ps%7`ClJe;?I<=yRDjInKl&j}b*9j_zk!n9C`MnYq-jUX$nQAnReJ)HRmGk!G0(O+Uh9 zvV`St)P9}$pXWWtc@AE1HP3g!xRk(U|6e!Uxdp+-6Ge4_1iti>Y(E@qk1a#xlHBnK zo4r^A`QA?ozvaaE?eItm*akc;4ejA4Epe)P4YhjL`y9uJ&@5F)vTONV*9Z;&*j`_* zNih9kvxZ66W=O$h*a3}DFM*+@SkfCLM08Z1aVvcsnCC*lDBbpjEW91I<7;^j{B@lA;u^@=eK%{ z4K-CnbcZr5J_=Q#v1Xbt_g@`yT9f3B(3h+se!E0i-r#C5J#z*u!Te;jo?>uBbrfbx zDtk(w37>bnAOG2B4fdP5IwVn)?OC)J8^x;a^qW)nztZ%h-l3(22T(|@fKb&O zGPSF-;_a)%+)_5C-D333RP-L~-Yg+bwAI&%Ns9Z;-tH0BNWxo zQY#sXD_DxhTp0LMl7S_#)%LaGxC+s91BZ!9gB42OY%=-|$nMF4hG5##kva4Xxc+u= z#GX$-*>lMlO*`Z}AH078HLvQs2S=X9*Cs9-f7H7+mh|zbmTGr*R=3{0%embgl2)6r zvss#Y@q=X!qvLOQ%sbBG8p8U-Rj{2ZpQw%A({d7y=fXAEsr`%l4y4@uoZATtqZqwU zhqyoRu&4Oa1xiM>hPpGwfs210S@uM%ani1-W%CJej|M86rOOMZyqi6ZKH1a(sE+a0v{>5?!DLkyTNWx3qd9*Txz>KP(s(nEBg^}coN-5GIH z#|pBfwzhirJJ$Neu3AP2u;|70c#oh>lqH*RtuY2O6s&J^(nUVtZ|%sPw-GdCd<&^} zQ^op8s>&pTn8c;Gq1dJ{sf*X+5I~76XwS}rF_5y0uFj6-b}gDDaJ{s#hKOaofkMTwINgFfgp{Bw|mK!h%&_%Y!H`(qhkK>w_yY^9(sqQc@oGR zEcADST))P#Xc}l1&oq7S1y7eIrtDAOqLdJf`~VoI2l;f7bzc{_M`UdKLVzug z+*sS?eb(rAQ+Bt(uvlbt;MIXdM3mU?Q)Eb?{g`aDY_=fjF>slT#TWqfOq)VmyLV6Y zUQ-)v_>_)uGTuvtzRoN7SyI^etpSle2}tND=`Zw1}tc5s-@jGSksN>&n&w4s7$RkJfK?-tJ1sR9l_Anaa}njrHfft03jl+gwyS{&Sz{8OP}O zxYir8K-Lx>efVLpWL1gjPX8W22*wI>PX^B)Z1fX8|BGO3ojgeopj(q)XW`U9>Fej8 zLDg*Xwz~UdH1CxC#;mS%CW|9^UcHPZ8D6~PLAf7b9Dnq32chY(qd+%pY#(xD*J|HA zz>6$J*v=AXTZvm7h%C|EKXA4?g0hS{7tklPKx)%;o7tVvW_9X<$vXfMqhm|Ax|b4_m}~y zdv@~j?(R706kB29=zq#7IaKJ>{JY?>0r^6511rn6^Jm!$jEQPGd?d!WYCO3F!bdjU z|JAv=@xyMpO77S_?8H~O#fi1JV{BwPCn)G=FRWc)T%%1)9X?m4%w&(gwA&7Z*((I5 zcNYh+?`bck#7Esg?b^mL0=kT;1`+d881cHBe6qaff9fz7LB!cS=WaK-T@8_nX9<6I zH_nQdh(MXLC*%C$=7pHV`mN5mk1RvUFM6Hj`&j$0wml&V`rnWBok!I-pwBbb*ho4& z|Fy4wWpW)Bk^Vdju&l(mYWvLyJO`pq4LE(z#cKxFo$E!ERo-;fM{W2A^!U0Q3Z zdJqg*K;)pm`d$1ApKVLZB0cK5JZp_oRUZfy>O1xBv#i0tGV~E5^mSGG&ivSC+TUNl z^^A;B9wUVG#dLUlFaaYt)&?;5B~*&g#Z~6)8h^t4>qln-!X!QYO&gj50ApM-@px=D zM)xrp^%U2eqXd)~rO!oDxx-n*EIIS|s2xURYLuJ+vfL$!JX4IgFiV;(n-Y2=;i1i> zp{tH5+fB_ucRLXYuE9pNx}lA}NPjJXOGKUB<0zu)q!8r3Q&GAH@YB@C-@%SyDkDTM znb(W&7B5^a9>?U#N*J)``N@1rCl7hY_xG!7QDKPj^d!k<*c8GR;m)1EIrq3Sx+B>c z4%c^gNJvn09+PBvi%c7az1Lt#-&u*1@9$Xeb}B19JJ$dD<&Kn~(xptkVzCDrJ=x`u zQi@`ZF9*=a)^VfqSg!quF?FPC(EZJUT1;A=HTD^G!ftY8y6JWW$qqYqkBMp;Z)*fZ zm-&piYnIIxI*d@;73*sIngvBp_`}=@txcvGK*6RZ=8~W~2<$e$_AVES@?~&t>VA{d z_RyE}bz>lCA?9EjL{=|)q4hnR!tp?hled}6w&o(}#u)DT56@NwHi9RmfiMvKnMTxR&@Qx?*SP9J5UYnU{ho8Ki7w!r zbNq1?-9*$LJqc0BGucTfJdiHOg2vTq?XA)d?+cSzCp>cuL zoF)}kIq;P(Fz%UFH@xG!GvGg*Bec(Ym}JTM`edDv_4td8{Zvdwuq(3luD=!ZTIYbz zu>o30a>Y^HX}Gkt7jRglsGY7NcE4OTl@e7McpKxtT(`mk{H%Bq*So*B!rv8JLI%HO z<;$dS6Xg>zZQ%R)4?j(zPd2%~=6_UQy$a}d(15|V{rj4%*K&dk73gBiR^x6Mz>{0k z6{z820UR}z@8F`)oA@fM)0+JwirK1T1>r=Dt<~SpqU@GaqK&qbE`=mz6R(5bgW3V-q9r(t0g0Ki4 zbALWvo*Q%p&V32I{;z{O2STB^l=%HrT$f##B1eY{Qc1-O3J-pIr1m@40lAGt#+gX_ zP7$vfCsRW?>ntBS8b?pn59PL7wM0fyNvI{!#&5(7p2P(y8MD(iqw&HNgkQBI>i0Rs z*8=Sw)Fw9S3lOYPtW%en7>ZkD(A6rR6hm1kJgwd5ujI)Naa+}R7HHj9MF}t7rmkgi zB@wb66jIvh$3@S{#fn{tZLiRr_TsTG|PaL$l6GvMe*Q1?rp_#Sl_->#y|;}5 zBx^io`VMPL;QjgHiZFWDbGCTu{i*Pg&wzQE$zi%{MVw^LV}vEOxOEH_V!tFlZFc;@ zJ5`G?4&n23me-dqzO!B(tc1_4V^2c6={Qe{1U%N~sPR>W(NS^aQO!GDMzY>HdqM*>$dy5sprQUzm(KMk?) zk!|}?&(22#RFzezLk+lhmMiVw(xr5Zz`vN*BRoFLH#wQ0MR z+b8{)b*y%qHm~qcGgwV4oo5{(2YZ&1@v1nSB-zn<|9F=U3y{&jZ92jy4`@0VmpkD$ zz6vkh{kv%oZg!g0C-*p!brS5VVyt{z9&mx6=KPuJ&|hDMR~0u#<2$hxXEvWbZ=$Wq z`-?uZB^xx~y=priD04Op9XDHgh6<%Zris9I%T004s^eN!5_9P`6suWefp+RAsdXXM z=F7l}COh9ul_LDS7J7UECc-8?gTSTS_-kRu(6KxCw`%zP_++w6yx-FUIqn>_>FM>d zbJxj?#7!}bXMb9mMYca>XCip|pS2EneB=KDu}gJI8YXm#gF+m27kA%fD@4%m1Q3?@ zE~TnfVBt+3WF-Z#LkZ0*+bsjj-637%vma^+&W^5|PbL>yz6DYRuo1ozo5S!1D!$U{3Bu_JiMeUVj!tuTu=**DzW{$}fKIUU+|#&yb6 zPzh2x*)9nuPx|qKj;$sRT|sT{)UsUn2DCL%&5N}XR#ZyF^~^>sZ#RzUo6~Q7>%5^Y zt=4Zxn?J4F1Y~eo8e}d9%#D8r#QoaML(vyDrEU4kIwW`PrQKG7*fb}mCOJRry?S{j z;n=oMQP&cSd!(xJ%~Ia)3-ULXPy_Cfc|L{|S@#Bsxu5VcvNH2pyHO`GKWjucZCjFF z-eI}z*A`mqKI%~w2J^K~I;~usv0n>@Ove5KJS4oX>v3BJKh6_SUiBuug3VixmZr>5 zPLHBw3*f|eP>!IZiS2imAI=8U#cA>KI=mkFcCB2u(Xc+7Bciny<{K#daG@V$Hfr3Z zgtgQW@&iOP40ku77W}+OA)b%m$If}7%XgMZBdz zcpmyEu_axN*ZA<{b9?8JtFkQnCO&}x60clhnyHP&r*$$KrwS?o^dmo4*ns@^TG7RU zxBDSr;WYT>CMcdn#GlMm@i-ga%&wUnemQ>ocK#Yz}%#KfY1 z9}X`Vt28eL!hdTR41eeO_zQPbjX9l@?QXX)dCpB+^|;Q%t2xRzhG74Ty;FKQ zq?M{yDR004IjppbKpXq6_AJ5hWa?e|y zI{H6O!MP57HrSfSK5OD92IhNLHoNZ_^JP4`MP3}{x5mmHn#2o#DUYZGin8+ikT@F* z$Fivu$01!R5_;Yer9o_&0#??N!9{0JSDE+6&rp!0v$MN|pRl0id8@$H$n$N`E#!aV z92EBWFHs_A?EdiN{J=Hv8v|Id_jHUbM@4Mq?#!;U>-3}wj0?t`Yb#Q2hC(`x))OKIyMM zO216!Je{>ftZ3&~p=f+UkqJNXued@O%@C|Z?g*r!FAVz-In6jXk*SF*;^mg_nFoFw zZf^(*I;a*HCSs%%;h`xf!6gy@Bn;QT!)Hq?OVGrZs9@Ydw}2M>jNd%B06gQ~RUneK ztge%>kbb%7M6|pxXi-s4V*+okx?1lY$1^CF20LR~vqTZH4B0}*>#`VU^_j`NU9Jh# z4itV3Z%(y20K)w%D=bNir=EjOgxGU-CTt({`A{c(s&?@+-+O;w~g zN;Z9Bn=lSAZQQs!eSdDNwcg?ynbK(*Lbu+onDV}#NLVC2Tb|WHwB?inD-I<}tEPIY zM)xZiohl{xzV6|UhBF6HwESL zmG5~Wb5?Q@J7g$izF9j`wW)kIIjImr2|T$iL5#BqF}Hojc6$xwr2L)w9#w@;0N>sZ zx2Hp0WZ_C4ur35U*iWOWxaredQ@l+VDdCdv+;$Q1hrJ&kj^pwsV%tjT2gP`egr~7t zyA7wuWbRvgv3B+h&4eMOrYi8UVRl-%93kb;JM;BaVD+Ad83!EvTf*hGIbol3R3IBq zJlr?2sj`l43!?z!NrfMhaSgJHfh8O6+o7@4=Iw8V0RWbphgT(qt9b*}jxIFYM&e$a{2S@l@)(2hIFE~I&OiRXVpv8B)CvpUvmG7K$jvhC$-Je$> z?ILGfm4zt9yJM?4xCJTCuXU9TeGgN2F*F`oiim_D6rO+P;Em2cBqW)+Zc~9VGj459 znLEz4;Zf}eR@JENw%muar1G~zPd}a{2L4HM6W_b;#6N4a|F0 zd_v(rK{#NO$$u1)iOg;!%2{Rac)D+XdZPHxt^6y;m&JSGe)@wr`1UI@@S?w;O4lXX zmepGQbv14Qp}WOL*D|gZ0afitUVIk*J=(d6aDlqEY6Sk}gJL5QAl-u!0&K6cFOMqm~T4ax*g6VyL^2uhr)X=#UkPy zrm+CLbQ(g^>cImc^Jl8oPU}?eX27@vZd7+P!P>96C+X^Z8o}|l_a|T^n=!6&wytYl zvpS)WazpvSJsA1r=m26IQlar{U-5a1HWjbO`S+3OaR8pT+^KQO$tm{j#^1p9z2w4Z zFToiEXwvoSqjXp81Ki$ee7fRQUAzk(VFwI zWCRiD*z!L8T#DsD*!a}0(5gfaaRBqtHZi+ho*&=i7flU?1e9385?iBP`yRzEz64!m zLo21J+V-w)S07)Pl_9qtaZ*wzylk3K7LBIIs0MK)#={z*!h@-5bH)Eh*?a%9`FQW+ zIu$K7ikdZBd+*g6wX61~HEL60&u&}nO=`p*CH8D>g4B$y5(Kd$i50$HpYK2LeCLPz z_uP-ib)R#tbDirVUppcEKAXa8R4Y{Apo7mqYk)JxpYzFa&_P|VujO4nuQ6}^bL!8w zFBmqHAsx2(FN2Hb7Ay;c$d;A?)?~&bK|w{$T0KWEx`=?cW57maM6O6iM#+$xU>TO= z$oL^x=mlQuePrw4B;UgB04N7jZdVVbMXRK3Cv+)ZC*by zhB@sJzZEYLsx%o;urPmXO|pYKm(x|}YHW*xmt0sIgt;Ir{`kPfDXG??wBeu|Q;k2? ztl}Q~75KhwNH30B=FA8mEm1$K0lEw=lsEoyK$3{G>hT5%0|Q#TZ~b~11m3><<@-DSxS46tE-F{!(--sVZ*O0LpKfJyq3PEg zDXC{f3cr!1%dS8B-~{D=hN;T!{$v!Au!QHFVQS)*+cN*sUF2cP9#=ngvOX)-!^kAc zo7P=y!YE7@t#Q>(z3ejgv@VnWNiHGhG4U_KDCw3@QG|&qf_-})6td=%swgji*-Y zu0WY^`*jS#f86xK(dB?4iDx@wF_B5`XfoCU@g`T1rh#Guc%^519a0;9HD(*3^?zgO zZbkrK^_!;tZs$>!ZK$Q{igdzRKOOJp*B5_7$nyBfznF0A^u%;tJ}A~W{*&-k#_^8^ z^CwZ-*3(aPjLF6i$9A9n%X&binW*)zlKGAO{l?i`(gT5?+h51*{vp(iNXkTI)&nJ% zhRMg|h$*AW>5O8j{1OU|wLnqLZ}drU@E&|-KM^=Q?ch3jVNk{2$fxqk-kPmjO1 z!#O(0?V8ISOUp?O30Ag4(>I(9-amZuNqRA;<;bheBnYffoLAO42Sg7b4?n zFLgY;+wh^{r!Om7d0q%@dxux(uNVbMB9h+1Xf1$rvk^eB`RCL>#r(>QSrq;;-%nSJMl4vDvo$V2jrq>0-vneIbq^)e%>Mh^>%Y~V=BCIuxXnZqS2 zI##cZ0ft0=^5YUxU7Sb((#GRq`Y4$Iy|~<(W~vJP8&@HAHx88T^zAKp=9W8vle$s0cW=0>y01{xM}F27N} zf@0cL?WGsy%^<+)TO$=m>vF|&OIF^@Mo$VC%rx5DMQ9(bY*p_B4H>TVVxUSLE2Rx2 z9%>7kmp|$U*$t{SC8~~Be4Ti1w6ptXuj}#Z=MA4abDy5p=L-Rd70`sRA@tRa$}He- ztJHnR@p1bh$zrf$_4WVGUIY3AYC~KSk^$b`n`D*OJ6vFb zh39I%Y7S~~&%;vLBQK4?a@mq9!wyc}lrvCMYAmx!jNo#$>< z+|MJw)KKYF_t}?__3Oo@`RMxSo%DP z>VO(K8am}YTktQPIiVvap_)Ff`Qdnx6dgnMG%?v1#ux1&wHmujF#cp=X5velf31!> zEQ(kX)(Le-^227sfCS60%)J7nh$g2oQ2d=0x2Kt}PmP*@x680~PZ5c&cXs7ywGD5L z61U(#T?x)^h8!FcuU_!^JoYAH9@GeY`pLL_csFyOWqh@9b4Xi`%6DDMH~cb^A-iTxs-n5~LGHwBkM(a4lKd38O)SYIXZK0| z?kz5ifLB5OCB2MtqPjLP{DHi9-0x41iZR6W?wTsWTSJJbV$EoT1_${(rt-i>#u)81 zvx4%ckWok-J#gB@$v7QY8&{gl)L7#cL*HmctNd`l#@ScZbGkCsyLx1l`s;oQtyo11 zd~uL`WkhKQX*OJOtLe;3mm&*+i@r9o^zEw|t7}b}@86JNQM_UwHDoJ1nwo8PnnsY_{_`*lQvpXVLsT+;g>N`ly4PlD*B0W0Z&|Vv{ z{eBE(-^tLPOM@~vMZ_)WgD0R(LbWKz9EiJ6hi4Y~04N0KF&PenP}?6YtY;Gy^2Xb+ z3Wt6$r>&4nmG-CSK>1CrUTB>tt76GkM?lvjXK~RluII!zG6q0G&>)M2l)&y;CXolr z?JfV>Bar=|4t1jc`jfx^__dN?{C?}*EU%R<^&hvTbJs7kh!`dNE= zA!yPkfSvp+Hw$#x=h$Hflr4ay!9@OBk3sR@s(vsn^Q2MjpN$Dx){LTs{2a65sCvgC zAa*2P<`U* zASb2iJ7B>hsp+31mGw}D`vEw`V3jT?oh(U)>n(4BWPGb;hQ09o`S>hos9C!L8)hgY z70(%!;6U9z5TCg_=*!X?xOhA%eY|$mycz7;zMK`tCh8(-$sG&{9(|qPVWm-ACFZYJ z7x?P<3{2%*owFyKkQ<_HN9DseH`w6|iEmZJfAy>AI0#dEP4tQNMQO;9$)rCDN}vLnB3hM#E(~%HV$D3+1|r6Ib6KvhzEd&5Y|L@Q zOv}kspcyn-PNQ`@t3U>(z7MQN8LOK9Jo9fVGA_EDCB0(_QBCq;M9BEp0)HJ6D(p}W zoJC`fq^!m6S;&n&{d)L@VJy_>O<~+VpdRjfXau^Oi2S|ASr@+kda~R3l|w$A;i-Xo z(zfL)VW-2d^m69k2uu~SbmSdgJl*TGlTwL(7EX-1l<}HUT3DwdgB?+_4#K61+R-=u z00M;MbIeQkas#F5I6uC`wDL3Y1 z({^zT3p=uhJ@Duj1`P`}#B}GzH4fs{#J#c*x->vHt$6*x)7{u-js&9^W~EL@mRYTK zI~Lk@*(#m~;*E+pzDdYp7V|^BAG*wjeF4*1@uin{8u*PI(4476j^*Q~Zoa5$rOaE@CGof^enRrSo6GOC-;IgI;cm z)j*^oW%t4=rkb($o89D^_mHleN`$NE@*nQazG|%sgqVo=$0A?FcIf~z3C$N;21Y3Z z0#f{?Mc>9c3+vyfanf1;Dz4;vdsa0ZvllGKMMZ^jR_}ONeyxTGHftk*LM)4FhC;?dV+O^BMVg9_S5sZ^QXI95v@yys zk|*91;=el&n5 zQza_Kxd`U9n{5dx4y&@R7+pW}v{zvE(2OZ)t|#5Ot4)bFne7Wdqm{}Opad`bes~R` z@mr9sz(1onYSgkAi}UybII>fy>pZZI(^Yw^G+ffmn~n1+ZC>PN*g z2$zpw8RB1iG!apApXV>c&fr_OV8{mxhpu*5uquMBxvv+K<|bzx!!(I1^W)J5u!46f z=dRNl<7yq%QGftC*azEE@JVB_UyYPoxoA(DMs4AT82uNNr+^u}Ao86mlkWIxf`O>8 zu?fY;bnEk+jbq3`+71g0A9{6Iz73Uk6t9o7h|_uK?phYqnTjj)iok5*KG}p|(i|^o zzd6G%8Aw4g;l_EsT}-ukQ6jP}xv<<6pDNEV$5k5|^V;$~Q3Y8&V8~^~(zK7d2ndQz zo>DR2GCr!sRy!t?{+rqRcxGi^rLEd|C1RHxAbh{n4fOox@846p?r#TmE;Tv5@v_|q zK{Eo=R_|tX+5~kCPeAx_59Fiwhw;yL<$koi+=jJ%J805G54NfQ+gLi!JtlB%9P}9U zM0Lad`sliFUU72-g{zGSI(6d&3pcS(RU4>fYBQJ>S)PlWbg1V*w3EK-I*d2|<;2ov zE!LV|*tRwWce(ezZqGMe3(26{+h4ux(Ic?m`mYc^B>yaYF4Br0CAM`exmaeN^jxN| zNj7I$s%AUiQMWd6S5A9OPT?09{l!|TK6>Z%K&fDsq)S7kugYpqjc-j4Rp)q(X;R~8 zcurz&lvaWz9W@=F zmfcW%(X5=R#YJ!K-oKsrHTKU5-VzeEP!b7LxJ~_6qy-!7Yi6WI^=#6Eq__8^rgoFj zJ+ZqMgPH8a9S4$tI?}U`UMj2|S>$FCnw?KfZ`)cZg~d5jzwvG;_x1U<`?2k7qaykZ z1)?0isqO#@brtbt6MOWkK7{j(y|X{81St8#VIjeD_duq;#RYgK#d$*ahc>^eU2aiWCgm8gD9zWP(G z_l<*Wxnw>4Je!+!zsPv{``}f_#rq;nfksz1iB!>rUtN(4CE#e{`+20~`qi_~NcQD*U5=-Ta8eB9$(bfLyrx^sZIajb}sQqfp+4sMEW`NNkT8$kQf zG?1F;AMwa`K7mNHrZM!F=XS_Nq#?eF)h`~Kr;;W?G0_#VU#Vre{@X}(LI=#>9}KH| zkBn1sHEODjNtqS0?AJQk2!qvZJ^LRnwlyS=lzd|rY7EC^BFbl>YEumTLos|!jM=4rGDmf>lzMHs-JF-?H_a; zbKJdl*7|u+UK+PBwHWy=3{~cIz2_!0k-D{@pK!zTOidIX7a!gxqlihUpYDmMZNyv}lE;$Y{E zaKL<>0^M!x8VP^IOTk(|Ljf;Ry>NWH^-czIx+^uVd9|zC&vE%rM&xSW80WsYAa%@q zN6)d4;ld}raV2=yA;A> zrz}&w2smLh;sT);cI>r$J)A-EUxEMW;MRkp)m!X~s4}!l8z*i-O(SqdU$QEwu-+!+ zUJ4&FhVDkDK5ym0Jtxs<9TOSbqFNPqT2P&7J9KZ*e^M1%!QwkXdZ6>%`aVPiTqnC= zY*E+atUwu?sF}7LQ-nbLT~gyxiK#%iM$cj6%|h9nS9-LZW;}xz>P3sItkeRi>}Yk{ z3BDqAZs!e;ZVckjTOSmtr{!ohI=%o_S5MlCP@Y72F~q6t%bUCw74|>=&)e1wH|BZ$0(cs`nq}Sv)W+6W8+9cOB9^7c z;OWg=m7Es+Tl>`}VvW%1jh=76CNFHb9foRUxYj~3VG;YitXGE@Bt(Z_*S~g2)Okq^ zH8#|bysf;Pp__!Xdy}J?;Z6yE`F}x-bwTvGBK>!y1A?B~?pK+V5IAlka7Qv+PlHW) zKi2*HCcPk3);?PAOx@pWR+295${8^iA{$!DB=e8!snPjhKNK25=^u8LoEnHiBZkEk z3|kwNMT8|x`wTgQjke}g96ZKI(&_|>{p}?VSkrqb3t4^E99VF~d>IWNLdT%w3|>0>qS1_%0+PV{v)P;*hUBrOTgs1Eiad8TEtxp2}vuXlkPir`YXV2QI_y$dv73ixDJ6TAnql;I@7#fq4 zVl1vkZ3>$a4r?@JanpYguCu&8`VyHWdXuk2-OIR1 zXj3rt+nC^|DJG>=4kq0iOjB+x8qtoK7QJe{D(k$x0EWR`Klb7t8+hWMvcQ%oh})tO zn(TeuF!30l^<{{t-FvalgyE_k(n8C?=)KfHUY}CLg?2u zO6~B74SgUrEsw{`v~9O$m?P{BPKF%2LmvbgGk6a6JFG1ZxnaDwlC9gvdE;;dX1#rt zgqo9x1w$$45aby9yuF*@z2Ai6*r~d)m@QwIq%50NM;J#A?Yx?@`*qG~Z5`L}c}ux( zP{Zkf*Cij|%9RZ3>8z$RP0>nY!T(xmfGq)sQOT^CbngBU`sHYM3o!FB=?A$;BeYx# zWMyM5Q&amHc*dJQal^U&5m0Rzzr%}1l2c8jW#)LeW+d<|^$uBq12BKX7d%&2a zz1MG+(@kiYvE@Z#i(kgFRB7CP#$2Ay~6JZ!9PUVuxcUv^x#7cY1Y zI*U3M*GWp%Ao$#NjLs*|os&cJ`Vp-H`0Mgxf5HIJa}hVF$J(tz^a-Df0$p70Nl8Um zk$TI+Q(7X?3)DVJiq$BrX01v z6jNk3@R7kDFc0(n*S_a)j7Cjy*ZbJn-A;iyhUb9!h*Q8@*G4XZ{0PxjkeVlUhr4<= zlf7gitfbz%$f^dy1q>lw^`SdEA@(0m3lN05EHhYccf5T{#zTPQ(n9S|a^OLBT!A}U z<3hki)V+&lxHCcGUOCmOb|eAQ9k!<(`DKtCQL#DrZ{F zyrHk8Bmxa~Tz#aB$sfK-1xFl4kM*C^te=)vx!A0BFz3wv1{`mlJIBJ@n2#(22h^}$ zRH{y(YxDeoM@(r?Lu_%g-*#9{ODhFDT5AieE`r+l@dIv_sDw0+xwZW7n572OpR#Wd zAx#-Bi;7q&+siG5+y52l|Ezyf2D)GM1DD&Lt9I)xllUNcFqJXd8SMhb;C4YfO7E|$ zfl7*A!F!LhX!K8-@Vzac-h#(mtHdfR7iyJJ+>}~$<7L{y;zItSdxHEXe2&KZUwMw# z^$QlQtr0qFJ?0KPxs&gne)uQ&+SsKsDstmA6SJU!v^*FFZ%8?CKFI$tvurl$c7IQuT|Hj+T?2{b29+X*TbcBi(5t!7 zzgO*?%Yy@$M#^^i5Ucrnle5C#11Ftvy&@F4Hd`g=@a^i-7Y?a7j_UaH?6WUYX?M__ zqN<(m?U}A6AmTY+W!K|fjqKW21Cs@?=1V%LlS4+^najK#S}7&0T*>y(qa-J{3fX$t zn9cBbQf%~~bNh>I6=CM1lfa@C|KN!Cg)cLd(cYjVqXaz9->QT$?sslkQhSWCD+WRC z4)GG1AMSej9aj70EReB6iQ`JqQDD zyElwv)7tb2U8r7fGm;c)v+85WhfxqR(c)==m(T}80X5>0QZm@E>KIv_VbwPMb+X^nKw^W1}qC>O5gA2 zs%Ko&{1*I0Jo3uAgK_XYpMslDC_~qBb20&bv0%AcC?&-D zmxG59A;vR1<#cxpScME(qx55nN$m9C8LX)oteq#{*--D}96SK_ZDZcqSSw~QU3Fms zUyxxhtAb=1)z6MvX5HYT>Vq{5zy)|wFf3Kh?;z;rE&M$O*tT3imGJ#eptUAKkFo8` ze>y;s76rKnV6MBb8Y28f2=@k1)RqzALz5umZ_HRrMZBQ##v^cr-UVe_b&~R z=lv8{?H_M)!u?>>wnqMHOQs6F90``DgU8HawPnd!nmdKC_+lemfbE7ERlfCUoS#M0#D^B8H#T^T%a z;CM3Ie7G64{dlmB&B{bi7_;(8Mf+pvrK>V6MVz%^@!zBlUJbz-7O|HAEU#WYJu?eX zZE^p(;EV77_?VPEhVicfi}sYNsKgk}GJ(y&jE%uuj9W+ddZG84fcspwVf>(6@7lv! z!Jmh5Zfqm;qjb9_E26fQZ~-6WLA7la!69Y8MLBcMVH4Ty!3UTvaf$=Zv_7&vj*6>Q zG6rYvQ+?>RwBQ4oqf$t62J1ZH{`|TX8}co3X?~MAQo)kAD>kWpI#VFtD`I0cQU0`M z#_o8Vz2n43kS)E%Q0M+w?5m3J++v*l3c^q1&~;<3bZGkqw4ZR+(%i-fPdu#~^gE0O zxzcCQV^tDm7DZLJ1B@+XY<&aSc=&HJy(=R;kLFhDFsxU5S$Uqx)sT@W-DF4XtTd2S z=i@Mo-}_y%+DU+0gCm)7t$au?Gi?cck_o-_+b}z3xCfBqK+@w}U{Mrer#C zlG(h44-2y-6UXVF4;U2HjmU z3(wtAwDV0YZ8TLaVJ;z1Ze4c0i+v$8KdZvMo8nm+iti8y$%u{v-edS#A0-1y^SBW&~MO4a(YO5S*p~o_eMYxq#F8NPKolZ2P zkRWTPWaGGz9VSRv%WFaH2)BD4KD>$Hz8L!8m1@|Lk$!J*R;1Pk3{~fS3RLmRkvbHKF%tWBLQ8OTyAk&+*4jh{n$gX_E2>mSmb7-bemJ z>-~dC%F>PTrxr|PucQ~Tv;g0@(X271>yn`*hpkjw-k)K0E>1o>6SgDXC*Lh=R?i>b zA_{-j0L9&EoWtw!$TxX~()Z!my2rm-Esczg1ZA1s+Np_iNv>E}5RK0ByH!wtq_77m zwYhixw2+Eysa1px`>QAXWdP35)yf-ZeO`ES78T#GAnd#JOQq3p0`&#HgT%ALy0$HBd|^X(!-z)!xi`kSqsS zM+4GoGuS}G0fU%`;t$+b!(9?e9~$p}=V4AvM!C|lWDQ8D=A&iW-Z+Dh+s!{5S>Ck# z>d2?d-h6pg0?DvUTg0@mriPa7RC8GUFIL4{9VP1i7AcO*_1*Cl~A6 zsFgNh=t(opf`Y;G9gBgpdj{dh9|ckkJ~rbs7n``e@JmtPWc-n4SVGzkk|Gd1UWC$R zL7HbXufe;!CQ@U0D{HXM7s^*;{$oe`^MAy>^uGDS->CT0M4Xtr>seu*QMwH%v^>uV zJ@&djS69R~?_aM&@BY{R`8PFD&sM;Y#3tRP!fLQ9=Py|=UDT%XBBGcSE<*8ryQ%JN zwxNkk9P7dl>-p3#Yy}B!lLR%j!Y8jYj(WjXu4MDzne`^b;V<8SinhCr9b})d3g-Mq z_vTc@ttA3;qQjR*4QQm!U4x=(C>Y&%4EY7dD&pbZS^a!23Zo9RB9Kgxw`%>On(l>! zqxT(7a;QnPhoOSsHlrTm12mKsRu$J9z~MWF zK9Wd=vnE2rm%q&$&RLMHrL=siW0~p-ZsAUxMW6gQN?Oxo0plfMAWJQYA{|Pz!D2p9 zRH7=7T6b>5FG(z@%UwQH!6lov-M*n}xLI9U9%j>B6UdXrJrb(^uy3c78-{!9A0XG9 z*>2=Gmulb$qu^u6NO;u#Gf(HC%?wuODIhKruPN_4+gMabHxn|7nZ5SNhL=^kJhetk z59DguhTR041QgYn43v0l)O@$5T}DXUmsFjz_6@VJ;ZABAubt{vdUdmjen@xnicmsg z>p%F&(=FCERd3adfLL=N1J)kQI5$7AK>sMruVV;BzNL75leK)ys5UyXvwQS=%Y%oQ zhk9WQj0wWHelfd*b_){lfC5$$M>@r8W0A9>slZ-`S=V^1w^31=olXEm8=>vSKcy>r zUzVbrw%;itAqV0>{Iose(}?ihbs)eR@H^Qasf-*ZZJllud!$Fgw!)kOc4SSvY)<$m zWpe=!9w=?}(sX;E*1-?{KDXM}CF~V{D)Do_sJJ6tvT!--BdzBEetmkoJ0ByNX?MWJ z&Xq7pez3R{W`pxGB`{&x#*Z#}EBlTsy3DGq>>tmk#doA*01Be`38~mdW}pb}OdhCD zInBDkfBtqS2T*OxB?e>@lCeGKbQJWCo?n>gM9bc{bL`8wG14O)k=m&QVn%L(`y@4z?VgwjbQn zahxh8e7&Wp9y=8)_6kL+G<-#fS`QU++-) zq%2s3b31>vR%M|a4bQWUH}Kr8Zt*vc;h#sNg)%k+*ivk@&pYReveHD^=D6t|w@Zht z8Ve#k(jV{Z#Lz302T@qYxA0^sD9sLD1@oxsIfhNoB z`HvwVzLW8*ktPu>qpje=)^}58?@c;3&@zmOXxt6pByG&{1%IbR<)jM`Dh%Dd({hc<|a1@U*T{4f{3oO-=`wWxL>j zqlr^FP=`A&;cdbhV4L@l-Pr$WeO!_!0*NAsCHV|J^!R5D(c(E!oJk3qV9bo_=%lHq zYJX&@Br&Yv;qpsn0&1PmEPyOv&uD@bS@G><{%+Img?PlvIm{w;p@E@@Z6`LtFWzpI zbqpPD;in5&xf?b+62wmQI|TOnCNZvQFRjBPD7W?dEX87qKn*LtqvmlgKKzOiCdTWx zrG%K7!FdF1RBwq|k!GNbC3pvWmv7GD+j6Hm8fx_p0=ZR}xJm+r4A}(j7A-(OO!8gk zgT?DA;@zfG?#dN^!^t;}e~dQndA7y8d{7-7&2O)^#Hhss0bQ^ zTicSOleSktHg383Q!SiY_1BIgQchjXnAIF~fcvyWIF%GANiCKj zMN-9s7Xa`ZnzeV5GxJy1QA=BiZU3aAFijtH^8X;)EI;+ZyW3%&hr7T9`bV{XGjf9BFKSX~vDrD}yAID3a&YYS&`g zl0`_5{2EjmGE>}2Tc)YKeowfuiTmZ_zl>t z+f)n{o8%Sy+Q-h@Sj9=5nDht!4o>o~IHd1P+9uPu20d27HWT>?3ZE83MRFnC5jHi!3*jv{Ld*exE^NfVgk2h9bdTf*0FJ8PqzLNd5 ziC0_4mGy$nS;-ml!&5(vLQ5^|kC$zY+kiAS?A#BgY`-rMl7hytH`_MIRP864tT{vD z->1WC9=Z7CAKbTNVK$Pg;~TL)uL_&)Gt>0`+}J!nYPVb0vh8y+QPQc}pFfjEYFIGz?Q+QP03#$zf}?(Ub`|FH6^gogBjf@%hP3% z{c^(O)@Ae|kGd+pz_YZ*l{~U9OQoXP)F-o9qWfxtXyMjT&@)LAzXboJv-13s6!!JA z34HMLjJg(VmlB|jV&z8p$Vy~+-E_-V(OGmNIs(^8)_)|;fTl?~pukd9tGnK8FfSk% zw#V`_l2Op{5)BZT1sdrwP1XMRIG$g#;mukKmbgWzPCsnErpnev#4bj02l&>+to!3< z=`JM>cn8&B2PUmb$wuN7Qmai6i#oFUc%vo)@aX9y7%;(KIo= zeOg{l&KOCrDF~B3IDD0VX+8ExFXsgaNQKN@90-#0fC&a;j&F71Hu=oGpYk4%Rkwn3 z@gksT|B&A;HM48*>5d>)ACUPDM%Fo8A%!*IGG=TuC-y$7qlz57UNIh zr&?#3M6<#|-UmLqLC8rer)o=Ar*zB|AFGwA{m7Y|-j5OeeeFhd5!F_UfL7uF5kU`1 z0l+s@S07VK$B%8C)Ad3Ih>M6w`gi}t4G#vq5sm%~-)RW%2yNKae4?;u!PDxJo$g#t zv6vvBZ!kN@-yk_~=5A&`*O|qtj-}Km3vyqi@lw2A|2ax?5gbUO*UmRc2i!mIc+TS% zrU8ble@$(R-aIHVQ&w0APCWqrQVBgcX$I?EE!$oXJy*J?FaBSl9SFS9q=fvO@Q)Z$ zscKF=BYd_7x9(|Yk;lzZemKdY+bRgd~kopWkR zzkemF~Yl577kh2E(ui>tsssF?=z2&^lu};da zdYVG7m2+oBnx;egdX@edXY+#H)F1q~22`;=;N$urW9+Bu2>+D3+fH8+D0qal)hT#`(fKT|_Wr819PJY;TMg|w@y60!DOWzyH*XFD3 za?0QUBpFtiB|TRQOBcE`Ci^v#sa4;3K1c3nt44MO-n?>^pCv;W`nI?-wC$0Kf5K;} ziZfp2?GFf8BEyb|z+xX4_)2DnKWJ6_N!Q2xbXF2?aXRxtU?{Ba)D>-@IyFkJFTU6T zIek$|);L;c)xw!8-V~c76>)-qMV$VR3R6(eUaAv#sD~ETKV$!DMHAG_SB`ckyf|Zn zcW*G*gx0z*N@P%H5PyQE2(Uasd8cA$OZ-45PhqKgS4ZyDm8)Ies$m2jfY%Ab(cTZC zz|mO7R$Sdyo#Q;+R={n3xkLkX7p0YXK(SRBx4Il3eea*q3&2LuSUjg*SVH6S zDw%G3SD8@$9T|#HzWp?~wsfq)^563ZA1)0p`$PZIEvuwHD@+Q!8rU$&H}oG{G2s?j zxH=E$T7O035~xUK-)k$0;II+g@zJv^{>;<%9$WI;n;;r5y1Btppi%jld84iY-FYlq zSYzQ7=kg>t=LCXN({i_|$sIYcqpZNF*#;)Wzd$V=&*QZkGMswdxUzg$@sOZ;&FxGN|CsXMbFr20{GtNqcSuRR#3{M6 z8X8=9$f4;ol&tI=f@vFvQ*k)mbZe|cZi!UdlgK#FlLg0L<&8-iCA_x%8-Gg#jGhAM zz2uK_V$*bMM#0^dEgz)&Ml6MXdF0+khaU~>=hlS>+q7)iD!gT}^D@YgfFG?I@eV^o zG_0PzS@&_kbhOefaLwENGJWCI3#;k z{sy$^ym8pwZS35%ob48te(X{aCkDgH5(@7LG3S zDTj?Y<%8=iy9|4VN~<^APxD}}#^G0x&a0P#-RBz}=>J;I^&OJ^?7BLMMCDxU5LKcfSGkHW6MK-jO6Oy zB*o_xM9=PG)0g7+lp}}Q`y#j|yJ-e!T_JQW&cp#KEPR#4IZv4YEF2bZ-FCFYXx*E0 zS9a^H^*yy%Nt>coh&G*sxz-p__Wlw%+$9tPiF5QqO_bj(* z^P9De!d3e!LF(OMpuukh@Oo~625m&<%IuKytv5m2yRik zk)&OGu}zG{M;snp-OzCVhq{0I3K0KWZgWM9H56OgeKepz6;!j_rkSxC^sXeiAc2dT zzO=Njs%882c8|5f`j5W_3DL)UOS(fI2z0vm+I6xB$2A=MnV}&Gy40WyvZga zzi55X4E?tt>GhfX7NesBHh;>#C?tk2Z>HBSs5O-p`ZV5;wWcc(i?>W!cb)Ui^`3TH z-sh>@D^m|xEFL1|P~(nH+CsnHnU}DP>t;Of^{%nqz(PWrv7+fG!WNA(G@daD`>}y- zR+n=#N~Oa6Gd(Ffy4OH9JE+^!Qt@k5MQASlozXrnDM7u>BwO@7wEUvEZF&tTG0(G=j8YJEBVF_FoLRnRKg`9pf36TdD`EWopQ#~fZEmZKotXyoSKn!>5GFFT{n$5EF#h?B_D2Z-+g}EBxMcR$r}k@ zjgF7itogytU^7sUQ83j7I?zDRa&agJzLz7K<(ATl z+nS<(Qw@z2ACRnBc@e;r9tnP)#gScuJu{3+7jPMkN`_~Xm4LINUf5S5HMB1*`!)gM z`M(U6zIPohWNdOrZ8n|#gREB$F{sGsL65$wu$wl#5+770MlC+6tARtQt{L#HFs$ER zpT4D=?JVFj3OC;0-2@}{s6xT(iIH_^6hk*t0~@j9*3aGGzLd#)iC&y3%>iYB$1qy4KSd|mt1xbf>L2A@-PPyBF@LSP+SB1NeFLigb zLM@+Oq}N~Fc=&FNBHC#9B9r~9`TfN9$Tow=3^%6eSk}kUzs6dOcIxV>X%=%*!}RBi z*TY+WnA!oSkLC`Rdi5^+S8B6UYv__&&A^Fr|-^Y7a_4Py?bjJll#9I5RtOY%ijTpUb6q&>jcE-_d zs_{NGfoo$A$JkS<`)&R|%HH#>$?W?cc66+aAVpBBprCZ=9hBaY(EA949uPvW7JBai zLXj?ALJcj7^cFEd2%$(9LJvtGKzR6kpMPL}_v>?A_p5dGK5MVFc7J|&zx}E=4gWvo zelj-&l{5HK%SG2uKo*%&s0|O_)T|2p^R~1$r{xV>KPU5sW@5Z^ zQ}&}KR%|L2`rJ}U$48zOFIycqP(Hb>DM!HgsBBbuCp9@@X%jXEHt(LP8V>GB4tySh zfCGag6?xnGCX+SZg*!I~v~TN-%-;J}n_7C?G- zIq7sZeB~I#$FZPWp6N70S2bj`g|HH?`{e{r&0)-X@`d=If?HFBNV$O{48}d*!v_G`Uf9H|DhcWwwoFEP%YYtujQBSQQcS4@n_zO6m z>UaC$`{wF~9Z5>3fPNLHhQYy2&U*odK3S0JFQPUZi_2-G@%y7{ACZ~6KHioRSugD7 zx`t`Ji@<3gNknqam-q6~-|-G6{xT9#z4_K%9{7(0%JYIKS~Fzw-E~ZiI&eNWgy}nW z>W~5Z_XCpu+0IO*nTv3v7A)4ZtZ1Y~Jb(6TUPdae+4+;k?#7oc{7!fvUqgEDI@7z?v*z&G4 z90q&92VZmw#Ce_Pti;8;JiL!Jj7YS~PossX8Th@K5wxwW8?U@dsON~LgNo7z(tAIC z|0s)mjmaW%0-Qse9s@efI#T0y$IR~NJsfk$3=+IJhI6)HI!G0wxsl20z1U$l=|Q2R zCZHrW-%uW5p^ZH>YccfXy{C1E-7Vq^pQna$V9H!6ax^n=2k*0C314Xv7)+7g{=}Lu z=N3b)*nn;*LfQmShxbX~;1aDZ-NCvOQ=HDpbr%+^Wg5+4_4^tiwrRh5FNx^d{i~-q zu0fH6i6B@0kHik8Ilqek3AsEzYPz@(4qL+`ugsXl=Dzc>t8u4YMzy8|DU$+Z0D^zd zhKuzW_ZH#uvBPmkogMoYtNQ_Dor7m(wrI`atCYw6Ume_7C0n=j`jvKY z8von)&vSV*Fhixz%5t5k>0UY2anp=!LFUKzFk{;oz~cm{t-(VOude@JwS@5>%a{}% zm2KP{^Z~qm&HN~^eQ?(2_eT#ZRZ#UDWy23P_gClFz*QkP_7xy5J-(>_SsgECxjRMh z9~gu3uFEVJ(T4?&!Pvjkf&rg!D`YN6Zq*KQZ@*=SgJcS#KL>(~+s3QL8KkXM=ek2n zMIjzvW{xB*h!c+G|aM9p}e?Gq;s%d_pODZKO?+*aM!`pGbBix;d;0 z_PdwR^|>-Rg#2;eqqnZXiKD*nl+w)D(P{CidT7>9n=2)|SxekO7atbK#w!ui@_j3m zT-<#+`gy;Ei;U5ds@UQ)cP1k*k)Xh4dQZ8A*3nida=~=(lE=^51Yo%~HyHrogSJ_S z4$mE`^ZoKvR^XKi*mJsDsM1QOG)Y)?ymuL-|KbG{`^V~+~NXu4Qx7X+~7D!kz z>~RSX8l9_#r#N0})I*22jdaI@FEe_IzzBz*>e?r*Eb))xy7NZXyXp0rJL3jT>CH#e9P8dAD_4Q+>O`RzVVlZur04UR4{u=Ma@L_R|P{!8`*KM!0 z)XnC=i;M#lu1r)>hhs(r?;qw7nN4ZgQCaIOB;C@sbuXCoQha1LqOXs54w0@p_H+Az zoX$ZvE?32!hDCI*IU8IqKD~DBMDg@EAz(kP?m6Ok5~+j$?Vh5@$8o4Zxo3EMKk1eq z+YEhXXX%mkbIZaH;j@g`4qH#7?jU6kjvw-a3Ux(U z)E;C}4r8&Pw$2;d0@U<&yI30cbtKIXKXU;u*G9g#YEIxm67oGNmKwjmbU%7zJ@I2r z+tYNkZuUv46eGBdG(GRO?ILLi-pBS=t$;MMZDytafmKv9>Q|NUaBV_#pYF(Hh?*(8 z>12y((FPf%Q76O&Fq+Z8+vU|8J3aKSfwVP6stk2S_A~kiX_=z>4fY=+vm?#CJZlj7 z*Sp%o3)vvM}8)iz;|H^5tbq3U~nZz%~`ei$S6y$E~VMd3e1Xo@8-uE+hncLIXm(Tztwf~&NPGeum5rn z4ucw6&SA<%KC2umyP<2C#R9~dJUCyy&AMcq)Q-0s^L}^)SM3cM<)oR29=_Se)3WiR z$<1-?2}i=ipOJq4wej)eYw~fRk=ru zv%)CkoTuOYn4AER8Pc$o-k}4jvB-j&;%}5lvLea^U8QJ7vdjOj!t>n8US2TiJjmX2 z%uv8>GAJ2orsBK%&j$jwFw-am3N+L1d|$ zUXs6nWXG~H{Uu)OP)1lUsg%fOf8frPm{PWdMAKk`cfn`!BEn+b8UrRMcv_idMLZ8w zNU7fU#^M!2E(1is@IN7IjrL(<{u6`aL?^H~`zc{P~;$8|02gU;>BE7=wC7^cDx zjttih`c9W9E1Ub))<3~xOiJKjQzeZHs_n!M0q|)^>}+9VkgdlB)zA@X;-X_h$f7W1 zVt+z``Uv??4DvnMhCZ~JI2S@33B3?T=yGV4(yEuddtG!4s6Uqc?qfrfNCUk9wJXFT^j z$BxxG5m&xudGdsdfa0qW&sIcp!OeY~nVj@E?aZ;goH1WVFf$x7Q@2N7jd3ZmN+RW;eM{2Qw< zk|2n4PD`c5r-j#!l09@cAM zYK86ZZg5Fwzr52(c)^V^q6l`iA&y`ZeA=`|!tY+!@(ovzqVMG{{G0iBb455dgH7oo#xVqK+y6l!%Y!3NKl&VZ>zl%5qcUeBXI8FWQwiz=1ihx3#h~P??F!=# z?=I<13w||oO8CZ{OYa3FU*9fAvkqrJeoVShLnqE1h+BbS4)8tQ?Q`!msfOVui4UQ= zR+G-qSj=-%JzW9Ur00Jr;7;bGEgoCN^r}p6E=ugi7#RD%ZbNIB1Oo}yBdHdHntgtb zihnjpO1KN90m)yq0sly`q@W_ulw+|7%JE;lF4q>H7Dnvh+m?t8zYbzB?NSC(8?NOU z1%}9^po@~x)YE>+CrqEd@P}3P2oBA)pW}8j8vJ^C()x&MMXNo^rt1;i6QsM1Cv)KW zRlI+fIa~;$o?(IRISbAUJD{8uHtiYnZXayc^wa)YA1i1W_d_fSjOUe-X@KV)g>VguvL!=qHx8O`pk`)51wk4S?I zAF7HAM?UoiAAE5?*PyOH)I!L4f`i5haLLnnVuRZzUxjzsg}MBM`A9hR{&uPu5G~mn zJQfh76PlvDi30_%&NWpAkgjO#!k0xsTYICG5WCj@mB({37~86Vj#Tm{-#@{id?KK+ z0cX(^dAk5rpFxJrTo4aCa||aHux;>aYLp`^FJ;B}GyEy*sDi1{pJ0;&Rjb zbCj+^bgy6xDE?Wdz@`arotqo-81jDCdN%OngKQ!t2hxRM8^I5qi zjo@`hrjeYg{`FCY!uI7-eWfRz0i%hLJhFnl4!LWCbl2?wnEJu-8v36p_osdDK&NSH z!m>?d7#AO}R6~X{<`g?aorbETN`I)7qvexUcr+)rYt@+++G#3b1tlP3$3~*4ny+ZFM%+0)_6bRMuzcs~-&ynsi}-2xhv)b0;alp>0#L zO4F)W#O~-+QdeE#YZg$nbWSa>dUa>!Y0_0kl`n02t!Sh)|BEhs>)hetefL_uyt~mM zHjphKqi`KbdGu_FZ7YmT)b-d&Y+{coz|&n}{23OwZa7}GJyY&Gc2&^jl-yT0z`r&D z2{`*5UVQyWcaA6BXVot(Yo9?i#rEXwaPu)r12U@9tfZPc9@Ix>5+W(hZl?y5J%BU} zPH0@_bV`;DwQy5mx4rGax|CDtXO$rCZh)Q=8F13ig3X)D8W(nt)wEv@-~0ug5T-h< zQaa=~pW510x{5pr>1FZ76Qhi*DSI_Py_FbwfRASwWFn zMUvnU!l-5T7~u5!M^WSaUoN(*JaZ9mHQ8d|Nb(x59ivf5KN!^*0i$0E$6Fn5tl#MH zK2)q;lj>hv->Va_!nvkcK7A;(PlEjP+z{34*;;4;)K`VAtjn{Z8+BI$M>SN`af@e9 z7S}tpT7_<())1zNtIza4P)$E{wyQW#*Y3jyi%&W%g+4X&8S{P8gp@r0*TU1kaq^*q zq*-QBC5#qLrBCaJY@JW{fQ6ZF ze&oiu)7E|YJ-&lfW8L*J;|1=>L;Eb|pSu(da$9~_lPG4*SMyf!c)_{jSCnmsQg5kd zZ@wpBom+2!X}+7U;*_8F2=W{vDc{4OWrgTx^ELYBnZ;rPyJ^3Iy#sYW?=P-Rw?Gl| z_*3OmilHLIEjq2jF)K(D1OR5t1>0%3z-dT9f;(piE*xq9eY_tVr3_FYnVt<-jAOdk zAb4{B_N~pCV`fxjOuhMY``9XjPcA6U ziHYwlZMpa_L*oRyuOG@hq{!}~hWro*8+yCd|@f{f;dCi9mR&Iizc zjyh?+Y{KHd+7K34+>;zMV^k(Iuo~4mA2o{dtlI-~HYL98n^Dc@XR+G<9?GOD%Kd?P zw#7FS>i!lM#{$&Z8wR^7ANeY@iqZ^~PnX{p!@&=&_uo=)wIVN^)LlE>1*Yo*VQ25| z)JI7{5#^p|V_Q~EC2j}!9+=K*i-PNh@8XI+a)Q*6*PYRh60mSB*_LoQyI|+v*m7#C zd?ys$*ecn1sRnkzF`u2u&g?V^%{8c$#?_Pj@7y!+zDi$84k=pP<$8v9uxSs%{U448 z^g7xvh;Mdq9Yg)^S*#w(t*uG;zdDlPKKz|@(GQr7pOs0bVR#M@A1gnE$;FTNN)q}D z72ckVDkKYaNJv(|(yICA19^chKe&bR&Qy9ndmY~Vr$eyz6xQ0cm=qtI>mTI*u=zIU zW98kdjc;m`lGMh!m%Lf6p^c6gjoub>U-yPH5fsm-5p>nvzAUmWRgd5zMXwe0ZTJJQkIvnkeW5Qdb@izm?CTC4Y@=T`tWVg zgn~Ro2y$w1#wda&s~rg)URbom9L)<`RMO$Xw)b;I4FUF5y?d51=mNxxcY9kkUlw>K zeHG~IO8gX=rDY$nDCU{v7Ugs(bNr9MQu$VC*AGwc1Gdx2*WvV>m6iZ(6&B4yXI{b(30M_R98! zycZ0y7m3w7V@>>T+r?NCrAqI0?^UxgD{B=Lj8bVNcHs-kQ%9fuV)PkFas>=s<$>w6 zPp7z#$os?J{-MNknW|(RO>i-TKu`Phj3?#>x0UTwtR?Sy)$Wa7|Eb>u)K;6oxMa7L zrQU@-Wtt4Awg=UqN1Mhu63k%4d|{}nr;#jE#_&^n^aD@RnVTz3mCvV_WH18D`O|nI zL1wo+*sx=!XwtemxLXCr_KT~Ekc5*o7*H!6McrgtY0F5Kt8BJ#3lSeqld_MqeV~rzqR~s zq_xaYOgH*PBvEqlmr(t}>B*o{_=O#1G~!h9uWNWh!@;z zvNY4vbvQ=iZvX0n&Pk7uV>M;U_q4iBFZ5>Ob}BDIGs?K)ph3Kt{qxTfxJQ-rN<7)YB3JeIi<#S) zk#jeVX`6tB$cN*$rBLoB%hlp?SB^+E^{&onY8BJG{++gd`R+|+RK*u-qvRNQ3)r3y z|DOFF-oPSUOM{gb)=+7JQ-_1y+chldq;9+v-{CbHBs!c$HN?)aI4;Eb> zLKJ%!ckH^`Aqd&UaHc!;fGsEX^0UXWe%_fd1C)YFeM`^tuM2{rg--NU7F7K6qhv++Y7 zPBiXzUc335F|0&iBcCniS(10xm#<@7Lq4CMfKSb``qgAe$#+NB3>i_k@+!@L6-cR8 z@d%lu@!mJA{o;adNFj%O*Lz_zysTJ}c@4UPY~Wxj%a{Foc!ncRF=fvBZ2Q-eeeT_= zW>tObzt~E4X`LEhR@_Zhz^?Fo*Shfq<|4d#-9pKg37qyMX3EO1KY!Su&W<|aj7i5X_HjZkvLI3bfM1NGD&|k#I?50a;P8mml z`7~HJDT zv*3;3hyj6EZmY2bHl0s5<$u)#dF&4} zF#Z{R#e+*Vfb~w-u@o-$Pwb2JnHrPe3sHu{a>H%vkV#uKTa?1n=>YS;C&0~y6At*> zZ~=I}KiFfLkqPhlXb=S~oiCd*egT!* znl@NKP;n~#SKwZwdY~Rr)O9hyB5aND#&fhnrDBDdK@j`Gf6MRL8a-hxTuIH@o;H~u zP~-ZOzNsKTd>PoC{QRa(T77y#rXJO-gRAF*8C>s86n8l^QriUgj#D6N-K!d7FBVG-9v(!ab4;oTmq)!J*pxg5W|cl|(oH<6L% ziF6A(cZH26ttwt&vy!at9T~$|xEv5az5Xuxv}5mHAZ*Ko*B5=p8$A_j9TDH!COqz} zZzQ+!`Y@l#K8rR*1SIL9m_4tiUMWMa^CCZ}DNVNO``Nw*i0b!O`kJ!UKF~dpwpS&` z$FSD`H5jf)U(a^%_>tKb9lL~4UL!y-N%|$wBVDb^2 zkf7}sDKeb}N4p<=q(bS(aj#chgv&5_0ieznU05prBB-3SmNF5^QlxvW&V9?AUz~I0 zvE=>j7b6>fQp@l)>x7Lj(c!ySujHp37bhtwuk%}xlULyMcouM6zjL)1d?_}~pjcUE z!)vfE)bhS6BK}qRIJQ1e^Ar~lf1>zZvGVt z-KO#vtDJAYiANT#8G@G(tYfIcK zAfPTmw$R^Qt;Cx62uP#DpHT+ikP|lV>J^%<4;vf$g<>~CVL)`Gs^qHtG0;!B zAEeF_s+myFT&AWzMUvl9tSS7wDZaUKsb;lF^4(mDg2n^&8`mhY4x(FUM7$;ii8wix zqfnM5I#!WMr!>Q8efRYrW?1g1C?nmEv-CN%bd;R-}{Qe(?h*7hs8iCGxE!>^89ir5O z)rh0{?_9D}7UG6(wCGxhqW_0?v%hqw@@O47xa&m=T$ap8m^LmrG2g zKb`2{lH%LJNlvhkRFymr@VCEH$i3xni`_`Tl{-Ur>Wa)J-GxgWrkeX14~`ErjVuJ> z=;GEE4Ktd>yjTGTvZ9qE(C}yUZYil9eZfue++9lqAe6mLLpR2-G0;UsQLt~5ldX*P z)qOyUgzyx&o~d&zI59@>OZbvGb6(~@Mp-r4S1f_ts-W}JeFw#__3*GUD-_{#)_PNH zeYwEPycBc(K)1KCC4+orD!3Vcg!cZWqP}cWa3>Vk&%4*n3H6kLUl~;lgwdDh8b#b> z4TSbp_}3jHDeTb~B%mYhq|?;X5?e{Lt&%3MvC~Ix7C@#u6Mpyp-pC_ z>5B%$`k$d1W8-&U)o}`Srq3cy=k`16IeW5Qo)TGRDs{DX1%R8~`-KL4{G|~i@fw{y zUd^9f88xt_A6(N7&(KedWtyJP6xrKfu2(>_yGtPW7iPTs=dNz=!W+MCi<$cG9t7)# zK7Zcypv!hcF6AgO+3S6-PmzPbp)GL5qEIIe5N*oa@DmE5`GfTeO$c8b;3%3S+_TrP z+#Jbvu$Pm52t_Au;3MKgMvVClwLL$XHn!G+Q$$gi!QiDKU!^)=m~i$dxy`l>k9$iu zj_tBMU~{%EZV3)XFVre_NRKpXS;LBlLNH}NVGdfC>j-BI@jF84Gu z1ZqlFm%SvDY?xf({(&_Frfx`rw@q^`aLk-%Z&y1Z=OpDF6J54`?ck>P4?Jl(nJSlD66}dFN42CD!1kBm zok#Q1if+lRKjS4@%DnIN$x{z&P6uoNZNBc<496=x_k8FtWtEsx)@kUrV?)^ih~sch z4#O%Q3jEswcU7E6$=Vd=RkOk7-}gg2&3U^2Ehr&e+k9QniRwGna!PmGuUv=eT1{AE zo@h;2crU;0JY)zNUaa9H0t=u0yl|vyDVxw67o?%}hCD)dI)$tUxQ1MO&oN9g5#5Bj zbX&|$U>;!ZPuU&k3@;4+Zaoa1oUI3u#kRO@#6e<}TP{K91qB6Gh%P`Q0kb~9^W6y~ zwVqpD;nn{{+R{x=!1<}2kOR+X*+PQ~nH}abA&1mm3ZraI&e$_2`iv`V3ruQBNVtWS zhCytSpJ>b{)v6FtxX0^xyhNLsFAzB6{MjqsH#9$dh8~q`(}+D3325#{X=7%=VjjrV zp8Z{@xA&+v@7ce!owM(T+63Q+Cyn12r^4n5sXW-TVWjVLwwsN-081H96w%8%PD?5Y zDV}^t`Jd%Ud2bCr@2Og%6|B?91y)o^%wXl%U)UtZX8Oz^Q0vBpFGvcJfpTo+VxJOGv~a)543dOTv5ulut$sU>)e!`Go6@!1}vhYxR`lj zYMd3m!(~S;2MsGdDsyI+#Hv0!X| zd<*8GV;6{f>GlHUp-Gi(hJNpPKC-t;_+MJ4SquN57kwx5 zK;X=eC1xn#dE`t_I|<7gQYHe+5^2oyeGQLHL;9_lD2C;g@}^`D(^UFtC6-^j%e7NL zn|KYbts0W&&qBQ4u6`kIn2vjiP=H;Uz;4f)nK;-ML!;IK5pBzE=C5`94El7&6B=pp zi>T=&%^+uZ&lnB`N2sDlZ+aD|)` zQb5gZR1IYwnHZsd9G_E{B zP9;}u@M8{)&qHMoqVyStF`zlH-9fK?i?M z8AuQ;h~W6q<6iDbJ4szZm-9YIWFq^NE8q8R%e`8gA+0U-bq|4}=VREq%82-D*Y@uU z`cDA2l0xJ;><8J4`}&}5oPI0;V+IwJVUvkggpN-uKQRHeKs z){5-RaZw4b5!{q1=7pr`C1gD>_GJUJ=m-Th5Q0NnQoQq4HE49aX>{%tLh`e3+q!&aw^3d_E?VMeGLiC7)WW#DptCvhp z^=DCoP>pSw^-um4!^5`;lk#S6P>sXUBTI)Q_fuU3@$thS#IOt_uy^1^{Md566d3CH zZ8cmMG#$4bGqGOGC^+a?<+XhaBAtCSYWY&HJP&o_gMZZvaL`ouS1a82(YAUegZ~#$ zUEBZbfjWXpK6EwdO!a8Hf1G7r@8kBK$r)RxyLoh*xHZsZwuWO?ZNyWx^bIRmJ7!qz z6V!%1Cc#ffa=N-B5u%&Iy>$SDh=$;KLa2vfZJlVSw{}HMj=642#b8eFE)#6+1}RTB z?EdXWLQ_Jjl=nj8u(8dX+Pv;eZs#OpuspN)LN9(V<$pPhsPFnyG-*F| zM$T7O*W|a@4qw8~J&H3fknM#=9HsV;zRzT2y^W^kzIBIu zIH2c`n6pEXVD9tF`RUoC15SnW0xbb)dt7;{sEf~kJr!%OJ!=^U_HmH1wOPdZN8KNkdoP2sjjBDFB+R)7TVUL z|D5a`txd)!s92~K@eEU^xLmqArTdpRZDj14{={H`gHI_H1ntKVx4c9cuRBA+U>*yJ z4Lp+fV`I-xy*GE0V^nYKiQaGNV$!9nY%(!#;nMBx!%;LNpQj$0ackNE8erAG5SHG) z8~V3vxDC+1B6G@65vl$e62hNXFM$DIGd1QJj@tU3>qW z+6%4tFY*R9t^5h%Dc)b1N#HS6&8|%?yS9u7k_RZ*ss$fmdQo!fItHhD8sE@)Al-HI zAq!F&7}2Btu*1zT%=#xoO;&38#b-54Bb4{C1&7gT;pq3q*V=cR%#?P29X%GEhHuPI zR8paRcKCbH;3qG$dB2tSR{7+y{(!foG6(J!D*1|$*iYZe$#W~8$F=R0_R*P=wB6fB z$MW=N1}h@icgLf+bhy;2yL}I`_QOGK3dg715>8xvOH86RnWE2g;Wp~|f7TZK4~4%K{+CSkAp{wE zV8YddWJ)^OxUaM$TWkEAarvulV^njHW}J<2jk1_vZNH3!-NF|Co`6^zlUYda7gghe zJ~!bB4w~xO$v%ltz(mSO8-oCPb&NJY`k65`gH3VdyhVXk_n)m<_4Gaav!(QJWLs@= z*V_`V_SR5dsLjqP;re1jU8{fm=Qy&ZM%c`tre9wHk317Ij8OlDliSCiS*L2E#qB7& zWLOVXC_AD%wR7G1=%tyUGEJq8q!t z?JhPIKj2MW*N{?nfJI#RrH{s}k?e|=>Z&@>8hgKBSpmiIr59w8&N{TIdf!BVx6hsK zAi8L3a9Pfpg|5JukbCl>xL4C?g#>Elqh@za$*%NfgAA{cbiSy3*2^}Lbzf`Dl2yH^ zFo@NQL1s#d5u&IkP9sz`6QYq~lS2*~J$V5fcKdQnL0iu>(o=u>teu~$+_TW&u2^cZ zKEt=!sz{QV6jDBz*L*(yqGS*it)-~NdsOJTO@ZI%Y+X0moU00l00;BtdLg^Yvx#vM zw+xESl{_+=?=cx#73OVbwlpZ-6e{dE-Cqh`W&Hmc6g|&Dy6Iz%2GWdmqDG;mXMPdm z$3cZcouj7yGJ(b)ZrDS4a-UkvNe3ea8Y#)CXm+OHwMW+d&D5DH`3|ch`NYDjjJf}Z z?_0>Vt6WvO`ID&n)2_hFI*K88kyA69+s~Ipc_5j!fIayAT(9=^=vaaNA3W7`8Hstf zCb+*@M#V4do{#dF)YsQPxD^r=43Y&hX;{!yRPAM}$O=Bo2+fPWH7zkydY%nfF*MLD zXv+MmZ4ut)_aqZ>x9LK7CgSYG`_Nkv%2@U|76 zIg*Pu-L{!q%82$1GwXB%<68+(pD!y=Qeg*yKs&(TUhRuubo+x8A9ju8+WCG0&f&o1 zvpbywgnK)w5?J@F$)F;X@VTwwG8^f~zTvp90lDs;P}%rqRV*geeEh?YMLE?zH)rPz zRT7wKFHq4Yh<5+WP>h~>Zt%Z0!n532#?Qd}hG&@72zP6;-DqEm|*;vTgD!Lep@%jeKE=KD{$e!lT-wF~0_i zO(vPGq^gn}AhbOTahSnngNJv8eMc&7s&|W^6`GbA)~$8ON_5XHaZ$Da&AOIor~ApN zP{MFV?af#l!1$b55tU-tSr@jpYxZ#wj=e!Iiy_GNicKTgQKYVB(%KXt=y%wa<_wnr#Gx?cA_mDpG0BL|4GiX8(vGQ$BnIq*~oSCyJO&CjA59STXMcu z-{&x4(1zLjH<-IKj%xV?QQMWm)sa%V%LnD+d9EGWFAAZ!%-mJW;mCo#n!GTb-iycU zU4EysVP{EZM3Z}L;Jp*(5%0i3zu|KceI)dE82l3%2f_Z#J*o)|CWWI1a`i{8Z6{cj zYTvSHV;~B2_8c1lbtFRpzoCbxp#p9k5GzimA#(0Sd?oU>+NJ|Ee6#oyA=5L0*bugB z@t^1B|HD{d@70`5h?5I3XLq_~rSfhRIuh|icqXdH^G^$sEKKE9%|~!hsTW|Ww3oFp zu@Ua5vIwLjCVwohE`M;3$Y(X_e*d*=M}nGK1D{fMs=WI$?;^aZdXS&a74igv2PnB; z4n+p4>;rfG(4LKdhXf@72-U{j=oK!H@ejlE0=}+7Y_0rFNS;8;K*PF8*f;~$}QhR|G7qm`=uOHl{e!ydvOQh6W3*g@R1HP@L6ng zk52xN8`6KHxfUM)x4y1TJGE~!MRA*KLTNrG)1pKx`a=YHm5dKtUEa@#K{X0#;$5r6 zG6Z`o>tmJz63)I2=5YU=>nJ)R6gGoZ>F%CcA(C$dpM*5LfhZc$`jFXv@G$#-hn4MM z=qj4jtjxaqx>x(Mi*7Rd05hta^j@(@&0J+44;PN2I)wx#cC4smRZIPZdVPfe%UqG{ z*M0mSiVt3Jz>S&2oH+oW;g|xRnoWRmCNnsmyCBO!zwthzjn&ULtvTk)&bzLK!* zZ&Q961|lBQUvAb|-j3EYxMJRDq=REhQ@vGKI zU&V^xdUotO{&%qK3*0_3Y~vGta~l-um%nKab_5DX6<%ps{`>d-`9J@wFqbQXo(uFC z%6qQ`0g4@DJ3iiOH*ETLGPrhPF}2Z?$J#%xDK7a(Ko(#@t8YG9(?GwUTlLpPYoAnrj%+S%sQOpGsZqycIJ3j@(CH9x ztI89T_UZT^D|8EzFP#z9)iH<0I*cG?6os^i-xF99T>ZK4$5mn3;e;M4kCd3hO_=|sx`dBhG=fZ;)f zzoTfm7;Y|2Cu%l`WlUTS=A=`QF6d>?BFSHxJUHdnwCQr^59VxaL(LPjZGUHt!8t_9 zWWf5on6r51bJ<9_P3&$uYJ6?+7r1}il!uygtKzauqHtVLuS(bi50A^+?Q_yMEX20D zx;UU`ZzY0k_{7{|cTgV`HrfYR8k2s;s%*>u;!zwZx9MzI8*0u8n7mUq&gDt8cEi#E z0Wb3i%}@g+o&T{&Oq5ph{foOcQh^=WYYKZzv5=G)+G*u@p}_Tj)BX-ofpb4<$XLs5 z>YbN3>CL%+uWmfSW+W)FDRe8hPDQyUP};3JD`Yx<)Egw>W9jo7`Ld92HtXPFrs;As zVm90VJ}{2oJ)Sw|>WZufIX?pvbd3zt%GG$~p7P=ClgIq^@lO%W+VK9#h;ng_E~-3N zeN|7t8pphi!l}a-mEB20Vepfz+ja$K&f^1&fl7X2?5!Mpz%L$ZuH(-NKnWvF*r`AJ$!QMvr)36Oua?%|}EO&33e9msty2^p*|t z2s}*iA_P{=&gEOo4EQQ0`U+fGPFq{FrQ$%k-oMDMGVd%}6N+mp5_G&66wIFe4oDbn)ARO{c%clbi`TjDY=}Rnsu1v;u~^A!Bsi49Is~&*Q1T4({F^ z?jgqs4%)}UKzl>)W}`KJ`bE|!IqIaxJdu=$sXg&k!&cph`DW36r&TNqhEn=PM{@F# zvheel(f6xuHx(^+?9&Xr2!8m~C;o-ah=9BvpmW&z^I{NgJ;DJkb*~Z3Tx^u;VTrT- zp89tad`b(vetnHS^2>>N0qzIWLYemVvx>+O1?;2e0f?sl#~%rtnR_vk?ugMW1+Vez z{%M6<%0Zcj69K%<{qqe>5PtV)Uqy?P@Jp}!r@x0$ox1(=f;W<;w(r1S$?QEY+~ep( zoxj4rCpbyAaJZkf*r`n@sOB^3WO-@ihXYrKr)8(hNu3mNdh?a>Qao)QylQ(_{rMF;J(!G^z6NFeJaZMuOj+5Xwu9d-8X?5;raj6vx6 zDn|szmE`JWsFj^$2xYTdURb(WptQC0>95W43FSOoLPD^^ZbqiU8Qz&X&J~f7S^G4f zY>TL?TsylVr*B=@&92mtq<4{3aGDiQ6*4jUOw6`AiS6E10=D@efC&V-(8#i)A3wyV zS=<3N2A;cXV2vqCf_0c)(z?e&*VL$)Z3Vg()vy>*p6m)w=O&iM(+mK^>ikX{ z;xtxY6S~@XMUw)K3o4;L)v7B@1@JmBe5uaRbmN%3bG0Sr2=xEfm3_SG$~=308xU7_ zl6Ov>@zvG^rEeT7|~v+%q(^Yo`! zUM;VE$~&sVrn?_a#sq{M^^GiouS8Tj5&gd!R^9Rc;^jNN4de$U-}JwCv3I1)SXF0K zH;}xmR65l&_x@|p3zMJutFAvrtK5@y+pA}cBds9+dK!1R71E3DIv)S1ET(Gx|0w&) zho<}Yd%X=5r9~P91f+&^4Ny`^0qG5-b0Ez~3y_xX?(P^VIeJnXjnoE=hEXGa+~40n z@VQ?P-jCi-uh%)(^}5bEyae?AFl`wyV7{oxlTFeD{l4n_>Mdw(Od)PDAfuTvW!>%; z-+Wl3n&ijgQrh5^GFd~Yc3$@V{3fBia0$~Oil%B_BS}DOn;9PrHbt5Yj{gJ^fk|dk6f1^AifA%=-=OGlyImL;lG_ zsT{d1slQ?GZ+9dol53fP!f!pXxN!fu=_0e(oeBqfZ9CS)hA0|qm(Nind$m<$HNuqN zZ1=vO2E)_(iM`d~hGQ$&G>1;1;&ISiBMq4&bgI*}^FMchn(C)l5Ff#IhZlN^C*NT* zRfW3J+Zdb#35Md2U5My9Sq>d_XzagKRl?^3 zR^@I$?&LH4w*fK|O@D&l87`1r{P8O)P3KawIR74{j3cdziC*E{sE9WWb>VLxCk$;E zNH(+#Q#aigY&&!Hiq}O292ux-r2@%ihANz{rQs0AIi`(Pt4w!kHSz;ikQm^o+8Zi` z3w@HCyPfPEhd%j)K)#L-a{^Fe>AA z4e@_JUpW5FR$+0vb(VSp=AF83D{R@|N^8%4wTLZMwb%Iw;yR#1sl>hiZcHg=oy|oo zq76!<*KP`$Pyh#r7=YZm!RhfK$;5#{q@LOxn_BF`-`ZX$HeDHpm~-i%g`Ss2mQGjZ z_L^3!w3z%13zU7aEo-ekV>=H5+UP>|I9e<_S%#z;AQkb8IqEaw122C}eZ)&V z&e~~iLq)J%B(pLl2I_$p5G9zop1uLV>hagc@eHE0(PHL^XX^Y-z4qeV-d#M}aP!OV z9F$>e>JNMVpeUsPRaB`vetyB%E=}5rJ%863qT6Q)XNL`+@2LjU3bjT^uFPiFsS{l`Rd%ej5c{MG2{hgZs z0(yE1wdi9$9bCN2@3M$5d^I~C`P>?mTcdQF5{VnamkL%s3IY@I#)?fSiMlPCIl4B` z7etQlc;`M0Q&Y_;OY|8&UqlA?H(I)?no^+bGkGJe?)4}Di`8A@IX%T|^%0y8nH7pg z%&Tv3*Lt?KDqO3(dDMI(p-KPDnix``+C9kXLfbXqAl=z*9aR2CEv7v2^eMcpr{R%D zbP1BbKn#D-#QNTM2I&gKWt#crYAV$N8>-Sv!c*sZ@lMwqGFP|8<@<~u?Xd~x-tX*dB<{)Nir0$hq=D$ECt zk?Z#^MvW?`t==dbtJGr=?K8gd-&YyE93+Sb*N8s1UxUSG8a1p}N~_Na3`Y5P@S5g^ zTD7GJlQlB_eJwO-d+~&pBfS^_|Am-@y4_})hE&E@%eL@KCb71gN|cxoujJ*M_S&$-mY1_wlU>OiO>8we(pD=@Q0BRIO4OXp04D@vOvHh-e_8 zQpq8a3w*=ui|$uhgb;B*J;O%t`?+PDsv}lt;x|XmfqBh=DPdIWpDJDH*ejYA>uX|6 zYoF+=5rWqHW13$(DcC)^7U>zi+HZhWSC!0nnOJ>$9iokldbXsP#S;5UwYOY^FfUX$ zUL#ni4D{F8$$IiLD_Xm(E8_*Ex!1jfTZbXN+I-*3N$tPl-JvuP&pIG{!L^P zHyM#6BU@lqFfw~`j!`s>YHMUAIQr64KD*L&up2`>ZjiW&Kz_Y&wUZ%;hl=#ZpA8I= z7r&V14J^zI!=hj_;gEuRi#>S#^+<4yeTmr-0@rThf8?p!Fr4d~xa+}LmlQX4zsu2G zm!$SXe~SCQ_9vh+tZF93HtnIS44MVoBu(klSWr%={IH=7%bc<3&pTBu z%LJH=;$Kryh=h3dSL+lwtXNV72kZMD!;)7(4;FiN1EX49pVq`{?*SF)@=DVy+P3?2 zqOygnfh8aDLXN9R`6_N&o76D>S#(xt6(p&}L8|Y)!nFC8;TD|UrY#L^6L;kruv~d- z#2DhzjM>CKn#hHTS zW9tI!`tY4IU&dm?WGL8J0btRv^wGU0>7u81K#x-TxP|y<`WmojA!2aR|50DpZ^a^(x8u~WYnw9$D2QAs8BRxMOxqrcJLOtf^Ci&|9THDr80^$t5gQ&NL172)v`nB@dKO7RuNjHB@{s ztEFnbB5P)Nu|;KZBgEKHr^E!L7vOIU3!7vcfQ>|hq2YFPGA?~wfmIAT1Hy&+*wvH@~1g@wBNQN)5h6kF@Fxv8Y?NGIxum7M? zGG9$()%r~DDw`#^XO69%>zJ2Z9CZ;IwXzXQ$lucH`7WyC2ofX8_)Ef1huqfRB=!Tz zSk8XcnaKFz^@J9H=D7-SwRM2|*q#;tJ`1hK@|qRPUtq%qEsS1}^K~K=bL2zrEikfU z8RxHKQx=>xgI+;nV@Ax&D-@9UdO%>L50s`7Bs2Ib&1Df3%bU-{_)L57CP*knTzGDc zT;pH`P~nz*{9N$+fL@qd+o1oADyJ}K{Tb+Kv|B@daB4)UPB*e7j^3UMZ%rwSy~=dA zF;l8YQqx^nALEK{5bp-x@=p;N7N!xoEqBolVd&Nvb*Xl`Uj=x+8Fy>Vm+?xV+y&58$IV+L-ui9XGN`QV2^7K;vxfNcx?Rg)1|FvP0%w0OZ*qC0f7a3e@i!EFef}A0 z_dA%Ajp-xP^_WfjYbGSOb7YMlr^`C{%3i8nlG%qHQ^1iiBP?K?K@M}}W!V`v(!VK3 z(<^cD@8NZ2!oV2t`uZh(uv+xRjL|a8%3#)f6nQeC5_P^<;F~$H+g!tuH{7NV623^| z>$sXtwAuPXvi_F(>*S@@&r$4RZGj$JyQTU$TH8jH%`B>eJtFFx;pow&fsH>O0ZI*@ zBUl{Iwp;%K#)oA9VWPKt7WT1++Jj^xD|NR!X$Doz%Xvv-R!sWtNhKCxa^&=O zd`GVJb-RJCj*{So96z1Dn)rC~TJUY!q4 z0dFWLxcO~nUFJYHxG9tMp%x*%oO8)zVk81ljdu|wSmy8}bN zkFpIv+ayIqqevx$5sA%3Bem>lW;?IY#kKSsQ@{{rK|iU65%6@3%l5c>xp?s8j|qP1 zLPSKD5l3{XfCN2@eS*ho^NFRrOx{qAtQwU})OIMQZzVg} ztIJpGXub?zMVn}tB2TMI#J%LyNq((%!@~>xz=5-@}|ia;Ctn| zOz4QI4YU`{em2cr?SY{4&f+8~&EG474i{dLT~ z1AJ;tXW2hX`gES>uhKt-ARO3d401p#EVIyDsCSXR)Pdz)pcL9Lq~kEYL+-6k^Y8>?`G#fM-o3y0npZxQA6ms8^ z33niRT7ONxY%*OnoECyw^s-F;sO|m{^QNsQuzhjVEgGS~JS#qj6?T7WpNM^f60>Ow z+7c0yVXDX2N;W%MM&z4d8-Yg^MA_dx+CY@)s6!X_hsKLcQ${3l9$UutqJckacED0X z7$uv4g_PLMM$u#hIR2hQQ6c@@k~zqKAPXux1#KDDG&uA*N8 zmO4(pGHG(~;9eHK(Gw&32!?U(8WMZC3|8m$G!DjdP^2Z1G#YAvzgXrhYfh&Skz^;e z#fj$+g1vk%W<-i})*gA+%CT1P_O=PNG~~EX4Q6ajYz^Yyf4Gh%8|HC2mVXiF1>(mSd7 z>VJIbnBx=%UF+Lpq7$Wv9aZkNqB*Fxi%20pvuWvoZ130^k9(@|ORK>}4$E1vW-moG zas9Q{11qQW$Akb4XXAPArA)v5zn%a08oGSz0q@(=AyDYAHz@H}aq`fiKlt3X_sD5I zOaIwwXe?c^caxA~w+W>w%0Jchj zaM9vY(8)z-I&)_hb&toLY=nUmGswJvT^DrTmBb`|KhtLzsIXm33Mr$hSTBnL8NIiy zQ%zN`U^?c-Xp2uS$G#H7>rbsLs;8Azt4743yhbfLfI+RgHi>#MhunQ2dyuC3C~h6= z)NztOenwv5)R+5HiU-x~qDSFs%O&W}>R-)CVE@PCKC%!JQB!(C3?G_@r21FSKPmbt9i&gX+0(ymU^^uZ^ z{FMhN;w`6S%i$dD8TIHi)JFv-lzo9dbkuYtnPEEVHbLya9F0e}JExYrQb(P7$>-8b z&0`O8&IK+8&@&|jj)4O2!!GS>l3pwB*_5SQmMJzfAgf7D+eB6|z z>gOe{<$=hq{jxOb&@(l)3I?q*M8GU0y(a@vD`T7Q5|SLKo7ePvCM&hfiFO#Y`=6CN zaYCODwkNlG$7I<`UmQfthjG|FK5b7C1IjlVm&Uzea}|U?S5{JKCS3LnpD%7qUY;la z4LVE_XG@>WxNtERx;xG`4rUoOLSLt4eIBMvt(D&ExflZg`o01zt=kq@3g!M7U6}3Z zw;$0$oLbe@bo#cneuou2(4m*Q43}dmU%wCrPtU0W=yO)w_Gi-VAFQySv?w{Yrkb5n2!u2fE84u?>7zN^W=B>%J_)*%xEJCN{k*NU-b5K#+OHw|KBL+z z4bbXXuy$;e#SeEorUrj8M5iEUT|`bn-n$pYBW!UAxoJsizRAtorv+yq=FG4{Z?%k( zXNNX9k6!n|5h(F(Fr;}g3d$_4=*MYoQtovO22@C0O`2TuU9;W}@;Dta_h$86{a(lV zjax6&8ISX@q-Q#Z4l9W#q5-*x6!)*?RLW&$9(iT4<}<&1+eZbgG8U?Ov_UwUHx2jC zX@~QJtAPm_YZ4=z4h5GkKc;PYT6BvQaxtl7a5gUhFn|??-cWfyIc+r|{Re zx|u&Q)`NvEnDStfje1ezF>Bh`fUj~VnKK;|@=TccdSJ z0ul%eT=J^DcFS8EdE?x}ZuFtfRsH;4!NN}S1GZ5NP8}8mH`D8Xj5d_lS&q`)tfspRqE?Yj(1|ejIWi*q6!;)q&IL$=9&YSq zcSgQbngU-pYetjJ-SBLNyLO<&njg35Ckv2y7^F<}$rYdCb>Ml~Aq z0j{*GT}Xy|hR|Qo;@uu?qMZs5q$OM@&ZY$Tc&u>-*{V|FrM6t1^wMCJ3l+aH1JCok zog?>HGP1()A98f~g+f$1!K!Lp^05L{{?7dMA#kZ5ql^*LXH-+sV>QT&9+I?ub^^wtw4@HvWQ3HK}+rv)!idsJl2F}VP=r0 zdQKJ2e+<9a`}I#LbxNghy==>$>Tvy^&%oO}%tLiRBbbOoCbL9BwyuZi>ZYG7P5mfu zWHx_D-IL4d-tOnCq!X?u1Lz=LQTm&}y6KBe77TM?!>Py8?PSC8lZdl96_?X?#)nbZ zre^eDxOv44urb-@R0eakXBvgo7dTC8GZQEldjE*2oM;60ghJ(^?=^WZkj6gIty6IB zD&V3+C7lfptl(=SgjtiB4pD22-1MhE$qM0RY=iG)>?BVh=5w5Kv_&s0bfVtuNblJ1 zY@!b+75ipOsUk`olz%?I{u3;H8w1Iqs2mJ|ck||TfRLYzGF&OF!g9+SpPd4QmGk`; zzS(|-urBd&(pg(R(}?1sKp2Naoqx>oQtuyg3<07qd~QK!y%i<`HEhtp11CV}aPEMdBf8RdEN3uuq@WFgPoW=fdB z0wtq)tRL=XiiADpLa-VE_Lc~5?*jaI?%5gX`aCo5?WpA7=JSI7_voMOVM%!jn(Tpp zZ4XtVxt!zzhJZ$0T|Hx{B`lu9t^hN=q*Mi@hbE*tYsq+01zUtKS|%M090i>-H|iieh<4`aLNcR zex9NxfKvPhx8Ctil&6To{v4i|*9Yu$>#luIW06XD7BVYu?#$^H&`}*)BCaG`%HBvd z=VuY4l1=(T*;zeOE4BRoavQho=X6dkO$!u>E=V-~JB1^%r1_W4R>2n@jmfSv=@J{c2R9tCVIpb^r zst-yLe!^n%3sa^zZe+_z@L z4vVbm_lHue9vAzV-ke)--B+{%q(itM@jRMIz3(k45r~5y`crbI2o{y{Or}H_1+=-wUa8 zeXorBBk(@^? zC6!kxJqQBJwomGHEQXnK*%xyInqZ~9!owlV1sCopS^bEzQt4`Y&j?m^3gPA-JU>G| zJ>x@6h>`Ee#b4I5RYv<=-*&tQlPJqb`OBgDLh#Jd|E>$Zt-t;Ix6!OS==$cr-<-lRG~-DYECIUe2q%wq1$ zfh=5cR?$Q)#FoXy&uN|Wkc?3xUfqcv%Ip$#kreCe{Fbv@)jdaEwU{J9)VOd+)EJdf znxv;{HUFT0_tWLgj89|6LJfC^efYT})7IaT8rLuEcVXG$3V$FQ?4)!vO(IQx3o&f{ z87JK9Qx|&inPUeC5IlLmFCallURN)x(?AA&B!+rpjDUmY02vuE9@Q?e$YLi(U3X2| zR7RVfKoQGz@>=IePM&mQgu+Doyi$3T!`?4_pO}~l_^D|7N$PE3M|E)h_?7u2%2VKI z$>k5O4;piN|La1T#*~y$2FKx72<3?^(MW2eQwMMK^SeuB9&^=rkFx!jv2+=e5b@^s z#coTIlB7FVA0A|OylhZ$9^;J*^SO<<3bYJ=$p4p`Qoc%zr7e$Y7dIzfdUk^8Ty&BY z=}$RUGdX$A=0u7IHvE-{N-h%=-SSd5x#sG0nJ6aJL9*8kA?=hE=O-Jh^^g@eb){aA zw%ho*VPQ$5QWNW9rj=j*XzZ_qsT5fKXb*|>1>oTe>`}|7V_w6>1ayAZd>WJJj?~o8 zMJYUdPVKxfQi>CROg+>{t8K~8YDP|QxEwryjSS(;wpItKb!t-)n(Ymxe(lC_91g1? z&{DG#c{(mp^Re}o@|#^qA2PcAMMF3np7s#J{DV~X(f|567k^`Vj0jnUT`hOpn@kEDvLt%7Bd33k)lt)AG4o)z0#0F%FjKri zcja?gV+h&&){8oNg^(mEW6I+fhKB$6{Na~XgL>47Oj5!)8ySPf-aXEc+SQtxGEyl= zSj_M^{mKkw?q~`(P=4C>kL#CCY@CT+A@4i&p;DS>r{5A{_BbUP9xdx?VTe){nU26x zU99a)*Hfs6JnR(I79;seZb?bM^#${HA2^Jdz^Yr)3_RDmtif`66#DhFoeJJ{Z2`>ERku33brI%Zoer8ZayukAUHWv*Dt=mlApXmQ$0eFVXCL=O4|3+Py61 zoef5LtahzBNokGxYgwJ-!1d`^moF3JcpRGu>r?0BReAYXV~&Y_2c8$W)sxR4#Z$6SCvwa5uvN?d-mPO_f9sO0e8ZL)4yFp2jJA1i2QtE zgr5PDK1p`TwJp>BZ)xQXx5))E;4(3g^l%U=a>JMnH_3c?c;P`+=Vaw4_oI+&$;VYL zgW!njuHk%Y%j2R@st{Y1$hIdCO_$xN7vqVR_hg0Zm)uv#auFAM^lxBdqAsx+CWoEH z7X6=1_MG8gt90;Ic0kW_H_I!`BWw#&Wy9kEq@5p7NO$s=Lavp z9Ye_6E8yCjMkAkQsXw^tw8Bf~r$fQl60s(i{#K*}b(BOaQPgF7C@}%Y&J%|rmdIj7 zzQd^NnWX{vd{XJP@1ne`dI_Sb*iu{P`4%sHA3FV)zNcz(#;gr;Bp9i)df|p|z*x~~ zcQn58bFxnate!bwt--xU1}!0ELza>cmug4vLN*$dAJ&zgipQq<%V6Dkt^J-}FUKAX zXhUS8QNCNlVuB>~?7L|9sp zCFHkNG7&11ZO?mfP)y`D7vKDP<|W$@C&h{PitIX%kyf?Z;uB;ktFMtn?_f4}>WI3W zK35&j_E)W|>5AAe{=RdY(wE(2Aw#g5$G?aRIh*qPu9n=s+ERba4oLje7%o9+*1XZy zGe|I3^V)T}E=aNR+lOadO67#IS!vBX8r%rmk3$|=OkrsrGd6NBySN_Amf3vrn}~Cl z8AU)%BkK-f+tY6GWT-pUncdo+emWtf*HdW>`vV`Gv;?Fr~j&Td94PcHKwcQ5Pv84@YXV)yHUq zL4Go${XZdevjgRMfnG7Fv=iU_m$MS}-u%iXy;yz{-eP)Y8D5Pd+Hy&O zM>@;n1qt`0twxTP(VN;#STozlUp}c#7MDJ?Hs{nyTB*UW@ns zqP4NfO=G~7k?bSrx^Jk-ht|^i!iQHcvd;!C;}7SXXFAmyj7Fq9%1&iBNCK+vux|V@ zV=|E#&UxsLBzUs4a=}>W{xKo=t3nw)zCf2DPPTiIGJXf$>d~+D9aLf)7z!l#N7f-bSM@9SlSN%~k=k1r9g-qoOv*T<)x&8#nN1jo77kIY7X}t`sSEVjs z-6VpRlY@^f?!OyO6byM=5!9=qUu1$AM`dpl(3H9<}Q$$;AW5vZ5L)l&nJ`Ykz= z*BpHRe4nCvW-!V*Ty5NEb?7F&hi*E3TvV#D21u>P&dwtjB$)y(!V#eV0#VTQ57bw# zD-$wT8r0eUB%Q5)G- z%Zf2XZ21BJReqCxXtF6WBYM#yTjD?(AejVC024zt-g280 zMtE)~2hW&??`*G$nTxCL@^~jt9F@sBaZN=AzH%xjTAh66$UUkHcQBHu?fDJJ#|@9fX^eH%7f=+_6J|=1>)nY;$A+OP%3*dBag}u@&qHKW&OQ-V1hBM z_wLa&eA9VtIhg=E_+Dt=Y&P0pKS4}$`X#P@XYsoX$arUE`?Uea<+Syp{`swkN3iS3 zlJ}A5zbG^&*Iq1#mDbVUrg4{<@V>JTk7+ejxZlt+3wwFGdHG}9FLqJJZK1CWd)js{ z^6k&&M-?rVTRsALJ!fPVyJ|R+pl#P^9hHU21B@(s54<5g&d6$Z#&{~l^Urdh=ME-= zc9lG(>~X&_woxfG`lxp8J{LgEbkq$J01AY~V@g8Vdi%oA$N^nLIF-Kx{?guW| zZy1`}d=={{1dl(}Sf(vk`sTi&NwvPrA#*lx`ua|EVURVS*y&3T6M};I%8s2R;8X`7 zF-9glKv62NroXyAVtr3~P9?4}wS6zL?NR*DJa`uFxe(d5(bW1^EJOQz`~3GI-%tZ( z`)f~6d)Z8}c2tW!=FjPWDGcT{O1Xc@+i3s}E92{nA3dAJ`jM`ETc;M(OSS9Q@H!p^iKW%F*Z*a z?r2=ueXi;Tm#>*aB|xF);#y-BsOp~yulM)OS)ctb2Rg7er*Wxx?_aNfAtlizj)k}ZE(kb`8acpzKyF6VmR~jlm#D=IDS)ZtS zQ0MteU@}x&{WMz*RxL|MJM^MHF4+kjp3E$a;*=(FZb$%0s?giT9MC>}E}v_N{ou>% zO`P`tpMVM|EK$;gmWjL++M3-d!SE)^Vq2v03poF}6?!;+Pj<)IzkE5f(l^1GcJg;h z>yD4Vxa_Np@r^-R`bDK^Qrbcnd0vey0o8x3GfKA6j+ZD?6QS zTnVT@K=XDsJ3>DB%lsjigD*N_GqyV3{)sXree1Zvi>Hha>l6!qQC+!~F6>db?s02G zH zUGJA+;lnZ!xlO?2kBW+D^4!(%n<>EIXRUagng57Vi=0aR`#O*}K~In^hYo4O=+&5k(L2)7O^0T}}A>{$`|RacGJ< zY7_%8@x(dB*lNTrp^S92p(!oG%lICrC;w~b^Y4HC+(BI%nXDqmBz;CsNx-LZTrIgJ z^0hk?6TjFBx zX~UnyAYi?`HF#njX({p1-bk<5Ta$HT5g^B!{&k)kn{^kpL>ya(S~0~o$+0Y$zkA@k z;WTkdKaK{H`i(F%!p)wzF3=@3FNd`;!KH=xbJ3d^`kqQzVqTYSSEb|WKA*RF_-$2#+4Co_N+@kLy=$|is6S=q4iTvhA3j1k?m+DF%z2iuEr4!jJ_%Yg zO?BTT%Rk>9;#l7p^g^m65#g?!tKdx#ag7(4N-I5MzUy>3sXLcsS?FfSET^qJ^lr{*Pc zi?%B_*R$F?jPN^mxduzC{je?ixXRS@fH10)y{(abynY5&wYlxWouof{smN4ye2Hr6 zK#jU$x3Vw$ll0HO^KSzfjDh#I)Tn0EkMACRSa%q@H*e1Od){-{tAnyLyUd=&zvhl( zuXv$B-*!yS=-UbuXyQ*_yE1p*aC=S_XpMl$kB@O~TlYE@At~XVoK;8T(*=L?wH_wL zc!Jr97uU}uTL#j1{LIb12B)tdiDctcsZ0cjgb6$tI1&s3G^~d1A!~PzMlPDc_SE+( zIAH_JBc6UGs^EgzbD@6T(HS+r*478|Xcg75j1p-YEI3`Z(jBmV>JpvCoAG~b&agG$ zKeahp|F$_fRyT;^FosIMDX=4_iu6>Lb{AcY1T1vDZ0=hfdo{y+|%^&c>jcxc-%U z+#7GJs-7W2^AQWXrYKDdy>0-wuKZy$&|BZoU)#a=vD9cohXm{Mv?5LfczuvuU=vbA znL9V2Ou7phP1fG4U5H@LaFxl6XZ4NNEBGvdu^P0T$Z{y1s2G1ORj>K?VDFWR5#S|N z>Z(LST9KCqvm2Uu==`FzGJUZ>TCqp`z;(x{g;bE>V*dr8KLfd}`n{5X3UqsElBh@T zZ}zIr9Jmp;@JI+{&>jf|aAtPA-vUFYf?Ic28Mmu7jZ0vU|WWcmzEV+!`JVEM%u z>ZUHJzeGk!o%w2iY=X7Ox+skTYYyX>rH5`Ia-XT9vT5q{MppWf_b6wz-fa;#s4u%j zVI74c@fiQ6n)0O<{*_JlcCPLqduxX7!>XL-`P0Nedl#DKw{5LT{`+I66%R!IHY&b2 zDIB`M&r(+`7S47`oXGPeUY|&3mK5?yJ9;kR9Hrc05~miKqNwV@*y`!9+5V&_w5Ie5?g0`xF=E|3qTR4F+|23tMpB}~kUM32$F3BR|fl4~=f9Ha~*e5Dl+_kS7Vh7E+BFZT(| zGW`i_)QJd=>O`A=%qng32kzhQ?X4``T~Tg(#7g$L&=jha^%9lJWzR}7mk>i-GN+eQA-n#{JACY zLz=FC{qs(uUI(Zf9R3U%G!JF}Q>QmtlR~IF!2kXos$6idTPE;tvVE!4yG*>!ubfHc zZ}0mPwC%tKLn^?JOVLOB4P8A7=g;a?lm`<*jgRVMp8c~=s+L%EdGMD^k}EP7rFz18 zn$Z2r@)pg?exU;JPM1Wt6=SHnSS-~M_1@9OJ(F~L6}$P5X!h)#L?1sHIxEwW)U-#m zD)};9?A-NwUD7}BNXtF_*=RCbP8TlFc3>EO)EEE2zr0OwuvDa5M)sxu5Jc>ucxSh}HY zX$nfS9db%lUkm)aH0e|9zhih)Tx|wxInuygO&%Zy5$*65eC#w1yCYV1+L*85SHoE> zWm`$H7ku6D-{xep{{qNS(%%~ulYsK_l9)v!(mJ(5W5Ul^zjhA>{pLz#I}EzPde7$yb-?UJn+GWnfn}{CZnUOQ=8YwGWny*J};uzT=5gR943a1H{{j!7O zCz(N*hQ+uf4|y?+!59HgGl{}fLLtc-8$Al>KgKWtQ(nspNIF8laMjdCIpwVZv?ODF zV(*56>64;K#p<88k%Fyo4OX+Koa@;DaH374;taV;*fT3OmEyGbrR>`DKlH+{7mqsr1W=lq)LBoZO5;MQtOhQ&7%uF z`VORQTgCXi;~#TA_l45yeow|87wnCzZMkHhS%^U@LR1nOcr3D4peVD3n~vn}K28e!j|m5^DM! z2Dc6P9{VS=ulC)KazczNyu2iLr4RFqS_f{~9BJaBt@r37>haQ$H7)DyTv@b*4#vM2 zYgydU`}p*m@#kdg^4nWeq#W(9^G;-e#rxOP)!WX^c9Ncg3<<#N+aWHA(~cMLI$YE*&}s>Mj$>uPJacb#eMtH? zv_#rzPW$XCd6=QWdd}-;DbIOld0O81wZ_HD!S?C~Y;vb%-k-`#ecrrFiUxanZn=KJ zhkoPW*IHSqBHe=cuk!%e+j#(8{3#q|ED9CVhS+4;VJD-%efk=!eOFI*A%-Y5?4#Om zPU{%iH@uy;p)p3l^udleW$vW9f{#>zj&|_68AhwH28rPTvhOO&JD(YnR7~IIQ{EV) zeYD5y2`CPDfxI@F^`5XT(1bU1aF1rgJVOsbW;+$ue6`9QTJ!X}HF3m+gFG&FtiJwI zOw8GlWj|8*dk4*$hiygz0V;3!W9XF<4|w9xe5*T0wqc|7A9D7JN$S#k__l0~k;x;% zBFZEjY+F(}nQ_Lc%VGk26}~D4hU=9N95(Q&Cq1zu2DA3F1i8`4E+_^qz0d504#7%6X$uwz=c{0l_n1NRuj%xd z1XQYt^U=`RO8sp<$DW=Y8(9qN)(K8W)3Q+!ag`MfFLVo8G`nySM zDtQWvx8X>Sms4_Z#Pme$!{Gt271v;8XU`sy5*m|Y))m4rXe9gPiuM-0Ph{L9pB|l5 z^|9<12;a;7EMA%Pg{U-qlDLp>XhQ(lrAw%C+-@l+qY?!&Y^QdOWNg2f?KoK2^FRF; zXJjK`qG-#~duj#G@#={u*k>7c?cku^!8WSjiXa(aReU)^yZ1pGaX^_Is>q$F#8LZ? z{0}{!#yVdZ-N;1;A7ea+je*7fyb+_He`w85?$o&QoVFH|nqmr9usV*Qv@`Yc2f*{;umKAK=3ogM)E z%w?{k<^K2b|i_v*Uz974ddS9Y}T57AwH)}^?zr%2~FQQf>2&&P-!=en=0{In?i zt*e}neo=Gu;W)OYOCWWVMK>XhFY|M3N}@4MgZ{IraYTYzE-C%6SBgC|A%dNxHWY4^ zHWfwJwHgdsAJ3 zL8qd=mW`oTPMy$*Siaq7w*+Pm%1oXUq=6_qPH_y zU`s0%oax@Wn)Fx5Y^MlsoqS8n5VLN8lvPYej>mxD?odW40ll#T%g$e)Pcm{bDUkPt zHf6FA(ejR}Mj^JAG2v^CALh)`t;%Mxdg|vVuVnH|ldjs3;h9nxfu1E-)mPwpow6-d zhlgK?exBtRtM3%s>AmjEV^1mX1YcFo`&3Iy#8HaC4gmTTC$^>K=lEAzIFld*+TSoM zPR*?-+-Pj@BUw7TJrhokLAp#ToK0IdlN|kKU5yaEPOrRD>Nr9?W?qY5shMh`Vr;+p zy{Z&Huy=L&P*H1O)dRv5o)1N&;#2JQqG31ojVQCtMW)*L-b=nVrv!_pfY>_?ezCJ8 z-R(x}?h%?*d+X=KYh8pfHY0f8cJH{4`GU;RGGr+3+!a}ze>FRl7D-xoN zyJ|SYz4dRABUzTGM_1H)g#V?A`nkW|&ff(0ZnjVXUhNT;ZMy_--USlZ<>K10=edDx zI}D04ZdO1A;MW11bKfptyb&kb#V{}xY5<#?RWe0urZH27>(D=s~B zB~F#@Dci$>>@Z@f1qnso_byM_*y^pyVJf2YTueqEA>tRI;_;~Qw=kjRi2j9`uiAXV z-gc$eNE4-F{+(K-6m~(~XNZ#k=DI$9`_T^TS|Z5#OqVW|KvRlin!Zv zM_y-LDZJs-vj*491^a&zDl=s_D=*^%RvUki9&Y_P7-?lgR6@(UMCRvQ{pqeKcSA7k zHbah!J}!>FJJL7^Vejt<-YYP|aPORQwrR4D?D!fs)$;M1QqFqADd0klxL!x1l)FslYbxlML1w4eKboV^8G6YLu|Y>Tu?NeYOH zzz~owr9(s-MoA+uYK#u0rMp8w8b)q3sKk&OxzWuAjBXh5?*Bet;JKf#a2?lqobjtY zS&|7)$D=@GeH=sXd^-#JO7nj3im`lNaXT%^xRbY6ND_k$`U`h0{QDEo90q>iDu6w% zdz##WOPnF>K3}$7wvA|o@a4t+xTR}nF}rSM0fu#0)&04 z(;@OatoxpFqCY;$R!G~!4kxaON!Z-+t~hCdfjsHIP?W=I<9E#-?^AW>$gI)4qL`{T zlTr}w3uL^INIoWac~*;Rv}k12g-7HsYtxP?K-oM{MXjpTrPr#c*@LCpAIi2qvRjPN zjL(y`(h}tjPxN2?8U_>&x+t`#vx5AQ?&}$To`_wO8MD9a-uBI4p2BDiDOJg#~)H#NZ5UlCNDN>osu5# z4u+;%NczptaK^eZ4D8bhmRLY}60y=3&tI9H2p0D7t@CAf0Q1+gJfc4`X^tNBo+foq zd6C&d10yNbRkzZuK5_1yCp0?BJkKKTwS|-w^iQXbfW0(Ue|lK-i@V;560sZ_`;-gWM{lY^O+_XbudG|AWsPzpKha?FeTNLLVQx( z2ua0mnyn-jLiADuRR%=NM%LQoG0lo@xoTrC#1(~JWT$W9e^yZ&Kq@t+D3TVhja0!| z(=7^^-jIWAf+0ZNj=`5ztFJJs!|CziGo37SSWsY~#2gSAWvxQZZ3I???HVH%`Z)F5_636OQd|#~TlUBD{xj?!)G= zYfb61FMbyFt$s4nQZOFHDi+Ps*?)qkvA%nWyYk9W90xX%CLN~+sg+?SA}k02r~@y{ z7~aJhsdlR8@_H!mMD=h=r6pi)WnJ~}iLkhxB* zoVdGeyP3jF;QNy&&-}YyP7grrvV9ED#sj#Pj+=Rw4)*^9vR2(9E(mz+`)1);Re(IA zGtIq<6F_#K=E4!{(V$gWXs30Q{)P-uZfAe;?SfT1=Lz1pqUi{JIhZO*8 zov1=|B1cAyFZ~N5S1s4&xHy9p>CspWcxBpHeT$RbeIaAJ51tZaAM^Ag4FYfKnykdu z4cKy;;Us{n?uX+wn7WK^qh?P)b0Y9=WfShSu768NH#+hGSOU;J2wS|V1J*erB&`<0 zzM}vrhe{Hh1)|lR|FfRjU;J0hu_zd{#Ca|mGU860H+bC6$1AD8gkhG8T{I(o)MS1h zyb`I}+L`T1batT4g=W>Me=;WNFI9D_ks&n_Rt*54{f9cKRDE_vw_nA(zz)c4yci0J zli({>WL#(y%K@~yd&L)=n;9e`wtP3GuAz0ja1)DPpAt21%0d)Riu)z>zagJ8tN2T$ zo%!vn1nNu5&=hG+{V%xa{p9osP9v0tt1PWmsG|R4S>U4#wDCsNE5AY2Mwd^dmfD#7`;zp(mHtINi;&RjF&P4^7r+QS*OtlGjWevyR`3P9Q{VgJIG)v^R;S zH^-&{vV_w_FcvX;j-MI;zA!a3HtIV6wkn+44p8kPwrX>oojdrW;vH6keW>FJ_{T!N zZs&RN1{#K#EIMbir~YlT!mW3?dy5c!Il zsVALQMQ}%|azxtpXo(36IheX<%;+kud;YuIJo1#VfV?^&MBUxn{#%7v^ZK?S$Hg8Rg@;jC>rrQ+>_jkRyb4w@RZ zk`=FJ^=zEvc3Se49*v@lO5jQziMH|djJZJSyxk_kL5xg(Mp0sHanwwCX-^_gl18@X z;M^OqAtXdscdY;6dA7wsoGvG0(qK*VpJ6tb;IgP#U1_i&F0C-w_2ugvslN8}ku3aLv?QU&UfxJMb_=tmnC{JL_Y<)!wyT?78mymbqca_1^&C-7~cWttK zdX9-|&bD50WVTxi+(}ELtD26#n&5EhE0xs}k(O=`37L+OjSbgF1pQ>%KReQ@p$K4f z?BV}2$c!*>CglQ|_O6rDPN)BJXxwZ(Gmt6Eky+NdUzsz*nJm6M`VS^Z{kDHWBKYeat|2-#ATrA}gmY4-DXzVY0pdamkf27o_$KmhrdIyshiy z@JR=i`Dr&4;4wtKJpY+VmJ83tTVH1L zM`zusUl~|;p;r?sQjcQ(GOGfD508`4{@caUR~!GM&~-<3OWU70|MWXFDeQibYq1-3 zC9|1A;~NJMZ`FZL99~Sk3oNDp0GHm{!y@hLzOxB+ zFt<2+u*&JIZip}YLSc}jE*3ZQLVnng0nK~RRRHG}ePFPka1rH`ezbi!e{J46Z!wM+ z6R!@L#Sl}hqjDTY2V&iM8n|=)DyR`~sC>#f%#R%4H4^b}(XK|lnI3BRP##DZb^ z!>-{9nPi9IE8#}?g=-ccNUT!9psje<95@v0aIz#_ zF2;8kOey=pnUg2{h+5QIfc@Ano{X%{D9V=HY899;L0ytQmUIVctw7SL)ld@u=tmyn zcnMb=BadXYeV3|%b8L>B_Y+%vSA$GfUvi^n=#&{Q`T5gru-GunBIE-F>+Ol9hA4uU zc?#GXfHYW#)-ONHNX!Ye_K?WIQtVk{!q}^B`n1s_>;LeAxBo#N;J79W7XbS)`x04o zl&*G1Hpxa| zYk}FcLD-Gfm(%@BWaL-VnK#Ebdkln<;UGX$XYT9%GJnL%46|q1EncmI%OZn4nl`L0 zoMUTY%}PJ~_m$-i$=BHyjo%w-C~w<&aqk{}ZD@$%EARS%6W2_dThTM%TEpHxRf-c( zY-t8YEM@(fTuMneC2BA-NMHsz@sJ>o(W{Q2U5F(f z%4^FWW>;IWP)Ih{KjSB!+kJZ*_q1kRE#RQ*ls0-p-eMk6E{xsxlfKse$eTgZR@#EB znLl#rpsE5rs@TsvwKAy~5dS+^nB1mPxXJ(Q70`Mp zs8;IQw|lTA|LfNu`rYDnP|`bk6&um`wejUD;sw(PPY$_n06vu4`KAtiO6?-0x?y`i zC+y^`+_EpCP`;V-C7{5i|4K6ff;7$dlOIY;*PNN8V{+UjtBt{ z>w1}>9yPfV9;FL3_KQeHPE`jyZNgz$B?D0V=YTV~9abTBm_Ma^D-2vV4LN(4a&}IS(rwXpjmcV!@R@)NsdJ{l ziG)_O9eF3uz=%1x`o_A!v zP@n@M7r?U?ZP#W$x=mJmO3sq9S45m+|9uaVxcJ--ZVERGP!pVO!pRh#FMRGW59WxnO3t@CW&(Q0z{-|Zi4F$640Qxhm&OZ(G) zGtz}yjk!*Hw=3M!CVw9o4CZ>h$c*!>C~5l%6qqC}?{F>zGVkJ3{^?5HIgqT5#i6Vh z+`u?p5+K_NhP+|77HwE=zrt^4o?z zDG+DR=_)GcOn^lxFF5Cfti$n0Fl$X%yE;k6*JBb@)CDegu-_CblZw#t8;kv$)%WBk z$EN(i`EDe3t!+EYl-d_yFjU?P;JjHZ*hTqb$>t=Ip19e(hJ0%Fb+?zi_Zr<05JXw- zU+=f!W3O0t*=&xZpS~DEQsW!p27cx@@EqE?3q-SlHOtJPz8uuc*ra(4gMs`o!*xhu zjX?WfJ^>D2pIWqJHmva@FSpL?XrpBDZK$OA)qmatwOC=Ctd#sNn4`8L-s8IA=8`2q z^*_~-zXAcky}v&eD}8GIY=S?>a-R@4yDKaQJ+u(h7O+mGZ)Gu4Ri|>i+n;;QDjg%SlcMG;HS*b(A9V%m=G#oq+JkqPgg4=_Fy#_VNnhrRh zXOkP|PYdOmOQNzmsnRHpYt~+TRZlG>ZJ3L$tY9F{OC##5#fG}8uyxL#T`IDy{;kmC zj8OC7tIc!xWKRTZ(S0eP~xQ{$TqXDU9Z0z{v-sO5@=eTm0a@|IhE=js|?y6 zIvv$Nn~?upkIT0dH>>2d{OTqO$4Au#>q=ulWJ9PO%UGqoCW{|D^`lLtoJyI;(=k6B zRuZoNgwA5jN#CHuQkWmE-nknrwaBMwM~iaowtJ12g1cKj_Q_=)npPFd&;98Z>AY1xik|+Am7K14&>R8SlJ+wgd5WP z9r)lp8O=wKLb~R`s+Y8QS~qv@<*JEgcZE%$VGVt19sv1l6kNMnz%dHP%HdlIkGwIQ z#hm>F*HQQi;9mP$w*7|;1L*yAUhP3l?Uuf9TyTyar`hv}z0IKN8GXvO`BeY>z>O%k;dACRimtU4KjR4jTS*B@taY%rN3 z93e0Jwi3r7ekefbse*bPN0=?*{&b^?Z+2*~x2--htVqIW3?sszmDPeM z3WbNxEfecjN``7iT|}g0c$>jkH*t>-zo(h>=yq{xUwcQM%R8}pzOb2@dV_5 zwtw0NN-Qo!9LObla`rxj>>EKNB|jz~)7Mslj2J~9%=DSF@J2Z8>cQ6@H)&Z$RwHm`P^QJ!yEO}-0rupe3;_P1yL%cY$1K!Cu4;HAP3dE%mzIJiVwX0ru#@*D@aTnrhH*mwt7i*W6suxB`J-g$X^Kv~5mMM=J3!`AAO{ZKGYsQ>_q z4^37i{RK|p*WryL3*0tvNUkpQ_rky;h*AWoy1y@q%c|f&_YxL<^I{GK)WSKJ;ZWLb z>mf~|iq`{DNEQJ+0|z1&nhP}u-H9((+=F_;CBth;1(KE=^2#TTGv`D^0AIf$nPLA18(Iq(d<8v!Mn0(3-%5t*alxs@WfxNX zSi*Vkcz;*0+W!6AdYy*(@vi^}Id7-VtI-RvUtd`0>@1A@0;ECJLPMq2&#~jcka*XE z(l}!wle-)4p6%UL=6(rzX1MUJY`-pCMy%1#wp zA2MTLq`d_&xTDI3+PvHdcTn`so>d-6rDI*_FFyZpx_nTKlun=^sO)oVGi1ZFhRQA@iyZbTtp-5Z*6q#p8Fc_Qn5Wc@PxeyeYd;POXB{ zA6aw^9~PSmGwQ4#+p{DWrU42^b&2OWDTY+aI4DzGsl1uWovuw)ijDUeidwur7Dv&p zB#s}YjOu;TvS;{w{}KoSrbONolTugDtvBHt+2WP^>+(^pLV@uiPs=F%Zhh~kb7#fX z?O&8WDY0n+^>14ODVt5xt7~_8WP}Xg1&W>|c-uJU1-=)J-+QRuE0UvO$%%fC7Dic!Rv9E8#GhT5^s!!W5$CUh42FEXxXn$SPmzyEvaH)G*xXcC)oP$wRd0vOUO<1yz52K z&!i5S?{L8#+1Cj@uT@qre}z9oZd;@PTAt-|Ri!18WcUc2kX}Jgiv=-`re^9$n&z0} zXeDngnnv15e)0-K@iUp&21HFj58Yw|U0I!{SU4}79FVI9SV4I^ZtXc&F8P)kfyqz3 z$2f9e;j#FK(&vuGPmkwg;~}vK4-MlXn>lYGl>c>^#Tj&_rsdH4X{WI$cSmKi5WbI5<;V1PD9ohG1f6S;Y&WEv%dKZQd zIt&!b%y0SAfLJu#(~|9kGCpZF_VgWer>sOb!`=$Kthscwtu5CG3-j(tu`dUsPT+pP zijdj#hE2kHo`ZWnumE<5-9<`Y4o7!!oHE5z3r>uhmmvhjfA}J{^obiMmc=sX7{Trm z76QSC&7|Kg$vB|AWKD%YAe+yV;!P&h%#w*EuSegc&OVTc-O^`P^=&0zUfI_tf|Ms# zf8}U9i~rG?DMKd`%HQBmK7SHDw9sIh*Z5aTAQ2~-<+jA+C|Hd_dLhJUC{PdIwlprt_2MpeRl*G|8D94V{pIkhXL>?MkDei zd#9@jQ$oxQK7vxl|K-*?A#Z43V0k9wXe|D?D4uO)nru_IuJ;D#AT*WfUQgC=O)g_q z(`K&PQbF%n6Y1Ib@MyfZD$GrfvOjVA>vo(oLxQn+g|Tjmd4E-8QqnW0@?@5ctgb7T z!rt;;`r2|jeu<&E?vmO;nyg(P#T&Lxve$o&@6EvxO^P*4Xm952thB&;;`A_I>nFAx z=!9bthix*)!Z}lBv|vE!{qm1tdrOD~WNe^p4}XYNy8q7#oN|MAEo`D=u{xy_Jo$<= z;5IJZXk``$@ zeTR-3-?@L>FcfP>b+3xL&+V`!#mz&-QgtJPZ1ps0zyQ8-99l^axQj>&`K4Xq_0#zs9t#!glijk+R zi!bbN*CZcJ2Gxy?&SXd=KKUwZQs;X_oid;DN!<&VUQmKNUw^@Sm=+ZGR>3fM!PUyJ z_;u!I*>u;lYgb3TQy|8nXY&L4_eyfmfM7hIenh{TN?bNLeRF}`HRs6&jq-}CAWMVw zlz!E{KZ{eea@d^N#9xT){p%mklueinYX!J8<^OMDyOPC-F6GnT5G zP!e9-YxQVzC}cKNW}r~oK^u9wVmz3NlTEjuHnN9SGIKK|6;l>{vX;9Hxo zG7G(wviB$oar~Cc{>m&O@T1+m#zNc&XZ4 zE7jp+5sdaJj16|m16o-1Xu@n`{w^T$c+UXBF5BQNGKQqbO%ww?gopYMHM45-?eDtj zyEnVi_#Q*YOs)^L-$aIW{gP9`29^3MIb$1`hj|V}&TZwCOopmqYMPr_I;&Jf4eu_T zR~+B*{0vq#fDo?A~tx29ed8lyw&405ggjRI#LC2m#YiRua_4&t(|j3PCa z`8TMau&={1|4gyPKVUL}E>~Ej=f+%}t#|6bXZ2?8be@w7D&G(YiN(C)#zjIkTatPq z`PPquPADKaSm5=}DCY&e@!6yH?$NlEifK*BXUm)PnMbGbu1eq_NME(zHLy49j?(c} zw?&NoB!bUcNHxf7vyM9SxybX5zk(7g^xzd6h>0{iK%MLv*b+#l78;LXFPdT-FgV-a zr5oAUn+Vl9@O3vboU%MAmx6{h(Rv0b?uNtMJ8z4&Y~mIK@RWe{@pTqRd>@s#jZ{py zo|%)#+zG$$h#M?Jm8koh~bg8Ix`6}N9TwMn92UTf(ZuZ%oI?XO)&_`R#A+B`_H#iA5K_OAXLDY12eR~l+18d$LzX8-SIQoaPZ{H$-9)G{?1s-~h4KSkgQSSUHm&e4N zLe&{l+x*p%m=?ap`>>7$-bz@O!!}m*>E**7oAC*}fAzI4V#mC;@?WHc7f#f8-|Vxj;08m8GjtGRkWli2vWj6JEy?E3!0)DSwM$jtsr zhlmu`=X#EkDP*_n?3D~dZ2{&AV~{Qzwlxg_&Lx)<-gPJ}yhh&WRHcsdkNa2}{1Pa@ zl9|JuPZpHwU6CAg-Xxa6Hg(V{zt!1|jCa`WmmhvfOP#S4WjVmP>Uanixn(SA3#ghy zY`UC|tKvtgFs7O_GyMpap5jssxTZ6&0K z5*eRp`-Ee?>4D!|=;tYJ&^ob+kk)rT1fBhk{Vbx{Q6@wD{AkQ501Bwreo$5k|LbL! zt#^EmT%ogx-KSzLDABm5HpQ;+%Klre*wSGOi|TFXhy^Wjru%kJ_h1qq|44ZP)>Xp< z&-0$E?fYW1d8OLwS?rCtfcf%+kPPJzm#zy5fp;pCP3Ik2S+kKv1HNx~L>hp?HC^V& z3?5V=wd-X#XMXHNUJbH7cb+4!>8WRntQKN>?b8yDikDY_DsUspCKnko@r>eo z`jSuUc!Y++q9yW-Pg~n#RqJA)%T_^P4u|%Dz|C0doRmu)JZB-ko>~3olPqd%tp#n+ z-Am_wszpKNzwqrF>||{g!*B7%@9^0FUHg!v@X1l5`g{8mZ5gqHD8YO4p1fuHA00PW zu9#m8O{PNPDnG-w|I{pe_BIy&Mo%U*cfPZ`x79?^;Lq^ViS;FJw(@CFGyGNRagkqQ zN_!Q+7;tR2rh47nshI2Ak&^bo$^Gz2$YC;nizvL!!M<1uAuV3N@{ZcmJRn~kH`OVG z!|R$Zio+LheNY!1O~XmcVwyQ_|U2Q3wWZ==-^=c+1|SB{wBA zc28B4HYPVKc|-gomda0xS;X}!m~n(Ev&1!}ijroU4N3apz+mHZ>1~Bc9oN1$dWUXQ z3W_KQ2r1CfAgcComi5d-Cpu z+&oynk?uY&%HOsoQ)5#4k}^mpEr8~JSeN2AM2ogvU#R-ujA2>+g|P$#nC4$2sx1TBR`si}DLDtga?xtY zx~I`ePfNPrKklWulQu!fzgJ2brw@VL9fA(U9A!V%Q>4HIm_JgnUQqUyXOvT4&k zNpRh#O#v0NT<|9!K@J*R0c_>));X>uuvfwd09rLWuhduVc`dBfSJlOPGUfNrBu@Vu z!{$7YKwRtpy(&)O)W*l7b+-}-`a7y7LCp*u^-rc3y6*!Zflxc@>;7rA9*qDhXX@su z8c3uZeAPSn!Ia@A-@@u3s5d145n;yjb!cRATcm#u5=?Vag5g;{@u%7}ff?zp)Rz>* z|2i3gIlDhr@o_XVv@Lnm;$?rX{|Ij8y|rHBPR`Tq{j$I7IM`ik`H(X1ed?E%JHvLp zpdmit5vv$vVdp4F35aBK+pV`8SOj(I_kF~X1wSBHvr`>2oHn2Pp}bj6A^s+ojc11Z zF(ECdGo1FYz}8QzR4~lmNM3iOSwbT5=-SRiQmmrBizdPLa78h^K+CSMFO z4!1}JV9r)rK4E)WLOseIea=RrUg#4ZmU3Rpl#q^n@(Rn1JvHe!zzjc8v4@_S2u@`I z?rR3aFA%dsL@Xbhzx-uuAyVZ`qOnyG zBZbykj#dEl2RpPyRz`?NQjbQ=Hq{7k7MTZ3a(LWy6neB)b%`TTD)%#Gh|d3xJ24(v zAXeF)oEWD445j0!0xLdio<%Q*}hlNqZTg4{6njR(B{g9sZy(?OE z@l)LXaav)n**l-0Fb3n@KRQzEZ>f|EdZ$uW_^NlbKG=~Wx$ANxIZl`dg34s_b13cg z!r1&+I-i-a%$eb68*g+GWquS$44#P)!Zmr#8en+qPFGWPB|R!e3{L*>V5&8Y%wvaK zIOnPvYO*}zgK!`x}x)ZRu8F*f$pMz>lO?2g;>ip_7blY#o{>}Al4yrv)r-4M#()hDs zPRhyA6O&yFPe!a9%BVzY1f^TtV`bQWB0BQ_;)m#an?Mt=db@hHf0DVRt)`_jU4LM# z5{RpvD7_Q1@{;qCY_Jrn2J3_RnsCs;g)TE-_q^bY{L^DUNX*x`3Eocp)=YWc;=ip+ z?zki=2rg59CNBN~f#cr1M>D!ND4rNuq?Diy5~xY8vI}iJG3z4rFZ^o7dR#r{e%FV{ z>sDxg(N%V;0R;Ip3f0r@_!Ps#;#Fi;LVwt*mKUIt{we`2ldT*JCQ22+3@HDLsPAoGj zC?{*Rny~E+MXo^#TpU)3A(H#7^g3?ino1!iL{SzFok3JdQ)DAi=oMnCR!6o!s6Pl1 zn<+C+*eA_Tvk}&`-*X?v&Rgl`=7fxiaQt+h^R!-}_w@s+iSdg&o$Y1;_;`>q|9F|*;B zR}^<&UK2aaS&Ua`LB7XmtjR&_%uA55ZQEx^MG4fDTh!`3bk*6JX?pH-UEBd6&;-7F z|J`splwEj$L)<^`7OJ51abA$=wxr&9)$V~1erdK~wW4Jd=7?X%GMKP7PlFAZhL7$2 z)}(J<{D!N`E%(}4bhS4TI@+|#LLZr9-c9%7dN2I^-akQpzVsxK(DNa0UTCrZ)hAsO zDz1(~^95(|3{f${2S7}zS+dlv5#>DF`c^GHsk<%OUSD#mb08)s@;q?4&swx(GQU+Q>4}>Z0v>H9w*5)Y9DNohuD|JdG^w(xcFlrN}m!a4s%$ z3r_M<>TA|DeAYNCfe{F;^|kV%t!FO2Gl@|p2lH{QuMC@HKYDvRo_l(_cISzz5+xUJ z%X{Gc7gMEzG4u~a`<7&fYDJ@inFOY!P?GP7dS!OrP=kqlsCj}O@C`AB(oNMGsfO->xV^k)3_LIu8l*VjV>M@$Eh?Sf>_B=-L#&4$%2ei z#f6g{wsxa7=eKJyOHXV+Y!o$r7VGwAb?V_@0?*|)#{~m)ZPvjmS+cHV=nfEC+DPPi zP_C%kpLzsYt@O-+J2QhY|Ij;K>#~9VWc;WPdHf=sdvN`QNNN(T78Nru`H+`;8fs{K z|LmT;ZDpeSclcsVLxg&rBqMrix2A%c7RY6C)BfmGMAmL6)mTYw#KSZ*q)L|uRL@P2 zkW2ghvsHc1f@E4dk0~KVxfu)9kPn2Qu=`<7mmxQ29s#EwECh*N$YfTpUvdBT`K52y zH7Pze1u!SlSG|i9%E7YNs+xbR`%hBBtG-HqV*?FlQE~DUR9b_=?OtJN74}g z13nv0o%NPFfCylt^m?™ZuUt>r&s&i7m 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%0Dc*kQZ7GEkTG|2GW{7B$ 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 K)?&Q9bDSutg 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%0DYW4fNtcx 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 Z4W|1XQ^{U2; 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 z

    2. 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⁢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%0D}0qwJ6`uSJv#D)DwK;$ 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™ZuUt>r&s&i7m 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%0Dc*kQZ7GEkTG|2GW{7B$ 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 K)?&Q9bDSutg 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%0DYW4fNtcx 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 Z4W|1XQ^{U2; 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 z