Skip to content

Commit

Permalink
Dev to Main 20241217 (#224)
Browse files Browse the repository at this point in the history
See pull request for a full list of changes

* Refactor Github OAuth logic

* Add and enhance documentation
* Combine `/login-with-github` and `/create-user-with-github` into a single `/login-with-github` endpoint
* Enhance integration tests, remove redundant tests

* Fix bugs after merge

* Fix bugs in `data_sources` model:
* `tags` and `agency_aggregation` now accurately reflect their database types.

* Create `get_record_type_id_by_name` method

* Update `DataSourcesPutSchema` to exclude `id` and `data_source_request`

* Update `update_data_source_wrapper` function to optionally swap `record_type_name` with corresponding `record_type_id` key and value

* Enhance `test_data_sources_by_id_put`: test for all editable parameters now

* Add logic for linking/unlinking data requests with locations; add `location_id` to `typeahead/locations` logic

* Rename `get_api_key_for_user` to `create_api_key_for_user`

* Reorganize API key logic; remove redundant tests.

* Add API logic to encrypt API keys with SHA256 hash

* feat: miscellaneous client search updates (#150)

* feat: miscellaneous client search updates

* fix: use replace for swipe nav

* Add test for checking duplicate user creation logic.

* Remove `required` status from some schema fields

* Standardize `/refresh-session` response to align with `/login`. Update test and internal logic accordingly.

* Update `/data-requests` `PUT` logic and tests

* format with black (#156)

* Update JWT Token to include both user_id and user_email in the token

* Revise existing tests relating to JWTs

* feat: Github auth integration with client (#158)

* fix: trailing slash (#159)

* Change Github Access Token to JWT with Expiry of 5 minutes.

* Add JWT_SECRET_KEY environment variable

* * Adjust logic to account for removed data_sources.record_download_option_provided column
* Add test for update_broken_source_url_as_of

* Update Integration tests to include all possible inputs

* Correct erroneous `POST` and `PUT` schemas

* Rate limit `GET-BY-ID` endpoints to 50 per minute

* Rate limit `GET-BY-ID` endpoints to 50 per minute, 250 per hour.

* Fix Request Password Reset Bug

* Update requirements.txt

* Update pluggy library to 1.5.0

* Correct type hinting

* Rebuild `/data-sources-map`

* Re-added `python tests/test_schema_validation.py`

* Temporarily remove other tests to more quickly test `test_schema_validation.py`

* Re-add other tests

* Fix missing authorization bug

* refactor: miscellaneous client organization (#170)

* chore: bump design sys

* refactor: remove bespoke loading UI per button

* refactor: miscellaneous client updates

* fix: tests

* Update reset password flow
* Update `/reset-password` flow
* Update related tests
* Refactor access info logic.

* Add RESET_PASSWORD_SECRET_KET to env

* Increase create_date modification to 15 minutes from `datetime.now()`.

* refactor: update password reset flow (#172)

* fix: miscellaneous search functionality

* refactor: reset password stuff

* Initial draft

* Update typeahead_location tests and correct minor bugs

* * Update `/data-sources` `POST` to enable linking agency ids.
* Updatet corresponding tests
* LIBTYFI: Correct bug in `DatabaseClient.get_data_sources_for_map()`

* Modify the format of the reset password link

* fix: reset password redirect (#176)

* fix: search

* Create `/user/<user_id>` `GET` endpoint and associated logic/tests/documentation

* Change `/data-sources` `POST` Authentication to standard JWT, from Admin-only

* Fix bugs related to test data creation and amanagement

* Disable variable column permission checking for post logic

* Update test for `/data-sources` `POST` to have user executing post be standard user

* Add logic for automatically specifying last approval editor

* Add last_approval_editor_old to SQLAlchemy model

* Add last_approval_editor_old to data sources schema

* Excluding `last_approval_editor_old` from test data schema generation

* Enhanced `/agencies` `GET` methods and tests to include linked data sources

LIBTYFI:
* Reorganized and refactored some schemas
* Refactored some SQLAlchemy models
* Refactored `test_select_subquery_relation`
* Refactored some subquery relation logic

* Ensure all three primary endpoints have subquery logic

* Update tests for all three endpoints accordingly
* Fix bugs in SQLAlchemy causing issues with relationships
* Refactor some SQLAlchemy models to reduce redundancy

* Begin work on refining sorting tests

* Add previously removed columns to agencies data source subquery

* Refine sorting tests, fix sorting logic where needed

* feat: new data source route (#184)

* refactor(pages): update request create route

* refactor: move data source func to data-source store

* feat: data source create route
also updates search typeahead just slightly

* fix: final removal of typeahead caching

* fix: update data source id route

* fix: update location typeahead

* refactor: little improvements to request and search

* refactor: data source create

* chore(deps): add vue3-toastify

* feat: add toast messages with vue3-toastify

* feat: add toast to create routes

* Update login logic to provide unauthorized response for invalid email and password

* Create endpoint for withdrawing data requests

* Move data sources map endpoint to `/map/data-sources`

* Refactor reset tokens to use `user_id` rather than `email` as user identifier.

* Install pre-commit and run pre-commit `black` on repository

* Test pre-commit via refactor

* Upgrade Python version to 3.12

* Remove space

* Update Python version in README

* feat: use dark mode for inputs (#192)

bump design-system,
update typeahead

* Remove select packages from requirements.txt

* fix: data source id animation on swipe

* Update request reset password message

* Remove references to `DEV_DB_CONN`

* Remove references to `DEV_DB_CONN`

* Add `/auth/signup` and associated logic, refactor access info logic

* Reformat with black

* Add VALIDATE_EMAIL_SECRET_KEY to Github Action and Readme.

* Refactor user email/user id logic.

* feat: data source enhancements and follow searches (#199)

* chore(deps): bump design-system

* fix: record type and ds by id

* fix: auth issues with redirect

* fix: misc auth fixes around sign in redirect

* feat: add not found slot support for typeahead

* feat: create data source advanced properties

* feat: follow searches

* fix: add not found functionality to data source create

* fix: already exists logic

* fix: warning toast for existing url

* refactor: clean up agencies UI and logic

* Begin updating change password endpoint

* Begin updating change password endpoint

* Update url for signup web app link

* Finish update to reset password

* LIBTYFI: Get rid of unused table arguments

* refactor: use range date inputs and ds create cleanup (#201)

* refactor: use range date picker ds post

* refactor: use date picker in request

* fix: data source agency originated logic

* fix: v-if -> v-show - to preserve input vals

* fix: miscellaneous ds create fixes

* fix: search results error handling

* fix: search results erroring

* refactor: move signup to auth, rename funcs

* feat: updated authentication flow

* fix: token validation granularity

* fix: miscellaneous results -> auth -> results fixes

* fix: little problem with route getter

* Remove `/user` endpoint
* Endpoint and related test logic removed
* Helper test logic which created users has been moved to a solution which interfaces directly with the database
* Consolidated test functions, eliminated redundant functions
* Removed unused imports in test functions

* Add Josh bcc for signup link

* Refactor EndpointInfo
* Replace existing endpoints which used the old `endpoint_info` decorator with `endpoint_info_2`
* Once every endpoint is thus replaced, remove the old `endpoint_info` and rename `endpoint_info_2` to `endpoint_info`
* Update endpoint schema configs to accomodate this change.
* Adjust some tests accordingly

* Remove unused code

* Refactor to make more DRY

* Begin updating models to Pydantic

* Complete updating models to Pydantic

* Begin adding comprehensive tests

LIBTYFI
- Update `/archives` endpoint to align with current best practices for endpoint documentation and access logic
- Update `/permissions` endpoint to align with current best practices for endpoint documentation and access logic
- Clarify authorization checks to exit earlier on malformed requests
- Add full `test_bad_request_authorization` and `test_http_not_allowed`

* Update `annotated-types` requirement to `0.7.0`

* Remove unused import

* Refactor Access Logic:
* Improve standardization of access token creation and parsing
* Remove redundant logic
* Improve standardization of error responses when parsing access tokens
* Extract some logic to separate functions
Add `test_bad_request_api_key_not_allowed`
Add `test_bad_request_jwt_not_allowed`
Add logic for getting specific authorization header
Rename `test_bad_request_authorization` to `test_bad_request_malformed_header`
Complete `test_bad_request_missing_header`
Add `test_bad_request_endpoints_with_headers_have_bad_request_response_spec`
Standardize response info to `/refresh-session`, `/user-profile`, `/validate-email`
Remove unused modules and imports

* Add logic to automatically indicate when an endpoint requires Admin permissions.

* Create description for API documentation.

* Add MAX_CONTENT_LENGTH to Flask App Configuration

* Remove unused models

* Add file source mapping to `SourceMappingEnum`

* Remove unused models

* Refactor error checking logic

* Update `_get_source_getting_function`

* Add TODO comment

* Begin draft work on batch development

* Work `/api-key` to accept JWT authorization rather than email and login.

* Miscellaneous refactors

* Continue draft for CSV import logic

* Continue draft development

* Continue draft for CSV import logic

* Continue draft for CSV import logic

* Complete development of mass import logic

* Reformat with black

* Remove unneeded code

* Remove unneeded code

* Set up CSV Export Logic

* Begin work on agencies matching endpoint

* Continue work on agencies matching endpoint

* Complete draft of agencies match endpoint

* Fix test_permissions_manager_init_user_not_found

* Fix test_permissions_manager_init_user_not_found

* Reorganize namespaces

* feat: use new footer and donor box API

* docs: update readme

* chore(deps): bump design-system

* Change Update Password Route to `/user/update-password`

* refactor: api, auth, client data caching (#218)

* fix: miscellaneous little tweaks

* refactor: move async fetching out of stores

* refactor: client search caching

* refactor: add caching to data source by id

* feat: typeahead caching

* fix: broken typeahead on request routes

* Correct bug in nomenclature for GetManySchemas

* Correct bug in nomenclature for GetManySchemas

* refactor: miscellaneous client cleanup

* Replace state/county/location search parameters with location_id as search parameter

* Add location id to `/search/follow` `GET`

* Begin draft of work

* fix: update location logic per API changes

* Create filter for multiple statuses for `/data-requests` `GET`

* fix: broken search form

* Create Locations namespace

* Update description of fields to include default if default is provided

* fix: search with categories

* Add aliasing logic to subquery parameters and DB client logic; update `/data-requests/{id} to utilize`

* feat(client): data requests
Add location requests to results,
Add data-request/id route

* fix: data requests get

* fix: miscellaneous client cleanup

* fix: broken build

* fix: fetch all requests

* fix: location text formatting

* Hotfix: Add Basic Support for `/locations/{id}/data-requests`

* fix: get requests by location
and miscellaneous other fixes

* Standardize location information. Add location info to data requests returned by `/locations/{id}/data-requests`

* Fix broken tests

* fix: location text

* correct API intro link (#227)

* fix: nvmrc and update pack-lock

* fix: client build

* Update email template for signup link.

* fix: search results

* fix: search results take 2

* Reformat with black

---------

Co-authored-by: Joshua Graber <[email protected]>
Co-authored-by: Josh <[email protected]>
Co-authored-by: Joshua Graber <[email protected]>
  • Loading branch information
4 people authored Dec 19, 2024
1 parent b31da4e commit c78cb82
Show file tree
Hide file tree
Showing 281 changed files with 14,487 additions and 7,971 deletions.
2 changes: 1 addition & 1 deletion .github/workflows/bandit.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ jobs:
- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: '3.11'
python-version: '3.12'

- name: Install dependencies
run: |
Expand Down
4 changes: 2 additions & 2 deletions .github/workflows/pull.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ jobs:
- uses: actions/checkout@v4
- uses: actions/setup-python@v4
with:
python-version: '3.11'
python-version: '3.12'
- name: Install dependencies
run: |
python -m pip install --upgrade pip
Expand All @@ -38,7 +38,7 @@ jobs:
- uses: actions/checkout@v4
- uses: actions/setup-python@v4
with:
python-version: '3.11'
python-version: '3.12'

- name: Install dependencies
run: |
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/python_checks.yml
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ jobs:
- name: Set up Python environment
uses: actions/setup-python@v5
with:
python-version: "3.11"
python-version: "3.12"
- run: pip install flake8 flake8-docstrings flake8-simplify flake8-unused-arguments flake8-annotations
- name: flake8 Lint with Reviewdog
uses: reviewdog/action-flake8@v3
Expand Down
8 changes: 5 additions & 3 deletions .github/workflows/run_pytest.yml
Original file line number Diff line number Diff line change
Expand Up @@ -7,22 +7,23 @@ jobs:
run_tests:
env:
FLASK_APP_COOKIE_ENCRYPTION_KEY: ${{ secrets.SECRET_KEY }}
DEV_DB_CONN_STRING: ${{secrets.DEV_DB_CONN_STRING}}
DO_DATABASE_URL: ${{secrets.DEV_DB_CONN_STRING}} # TODO: Ideally, won't need both for testing, but this is for safety for now
GH_CLIENT_ID: ${{secrets.GH_CLIENT_ID}}
GH_CLIENT_SECRET: ${{secrets.GH_CLIENT_SECRET}}
JWT_SECRET_KEY: "TestSecretKey"
RESET_PASSWORD_SECRET_KEY: "resetTokenSecretKey"
VALIDATE_EMAIL_SECRET_KEY: "validateEmailSecretKey"
name: Run Pytest
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v4
with:
python-version: '3.11'
python-version: '3.12'
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install -r requirements.txt
python -m spacy download en_core_web_sm
pip install pytest pytest-cov
- name: Run tests
run: |
Expand All @@ -33,5 +34,6 @@ jobs:
pytest tests/test_database_client.py
pytest tests/test_database.py
pytest tests/test_schema_aligned_with_db_table.py
pytest tests/test_schema_validation.py
11 changes: 11 additions & 0 deletions .pre-commit-config.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
repos:
# Using this mirror lets us use mypyc-compiled black, which is about 2x faster
- repo: https://github.com/psf/black-pre-commit-mirror
rev: 24.10.0
hooks:
- id: black
# It is recommended to specify the latest version of Python
# supported by your project here, or alternatively use
# pre-commit's default_language_version, see
# https://pre-commit.com/#top_level-default_language_version
language_version: python3.12
35 changes: 30 additions & 5 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@ Login information for users can be obtained through environment variables provid

### Running Tests Locally

A connection string will need to be input into the `DEV_DB_CONN_STRING` and `DO_DATABASE_URL` environment variables for your local copy of [data\_sources\_app ](https://github.com/Police-Data-Accessibility-Project/data-sources-app). This connection string will take the following form:
A connection string will need to be input into the `DO_DATABASE_URL` environment variables for your local copy of [data\_sources\_app ](https://github.com/Police-Data-Accessibility-Project/data-sources-app). This connection string will take the following form:

`postgresql://user:password@server:port/dbname?sslmod=require`

Expand All @@ -65,10 +65,35 @@ Full pytest documentation can be found [here](https://docs.pytest.org/en/stable/

## Client App

A few things to know:
The client app is a Vue 3 SPA, styled with Tailwind. Feel free to use either the options or composition API.

- We use Vue3. This allows for using either the options or composition APIs. Feel free to use whichever you are most fluent in.
- We use `pinia` for state management. This works much better with the composition API than with options, so it is recommended to use the composition API if you need data from one of the `pinia` stores.
### State management
We use `pinia` for global state management. Check out [the docs](https://pinia.vuejs.org/).

Some implementation details specific to the PDAP application
- Pinia is for storing state. Async fetching is defined separately. While you _can_ define async actions in pinia stores, we have made the decision to decouple the fetching logic from the state management.
- Many of the stores are set up for caching certain responses. Eventually, we'd like to move the caching logic to its own store, and make it more robust. But for now, if caching is needed, follow the pattern in [search](./client/src/stores/search.js).

### Code organization
- [async fetching logic](./client/src/api) in the `src/api` directory.
- [data stores](./client/src/stores) in the `src/stores` directory.
- [UI components](./client/src/components) in the `src/components` directory.
- [routes](./client/src/pages) in the `src/pages` directory.
- [utilities](./client/src/util) in the `src/util` directory.

### Routing

Routing is handled by `unplugin-vue-router`. Everything in the `.../pages` directory becomes a route (i.e. `pages/data-source/create.vue` becomes `/data-source/create`, and`pages/search/results.vue` becomes `/search/results`), with the exception of a couple of special rules for files named index, dynamic route parameters, catchall routes, and such things as you can [read more about in the docs](https://uvr.esm.is/introduction).

There are two exceptions to the routing rules that are both defined by our configuration, rather than features of `unplugin-vue-router` itself.
- if a directory or route is prefixed with an "_", we ignore its name (and all of the names of its contents) in the route tree at build time. See `...src/pages/data-source/_components` for an example.
- Anything in the `.../pages/test/` directory is also ignored in the route tree in production builds of the application.

### Testing
TODO: After implementing e2e tests.

### Scripts
TODO: make nice in a little table...

### Compiles and minifies for production
```
Expand All @@ -77,7 +102,7 @@ npm run build

### Serves production build locally
```
npm run preview
npm run serve
```

### Lints files
Expand Down
14 changes: 11 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
![Python Version](https://img.shields.io/badge/python-3.11-blue?style=for-the-badge&logo=python&logoColor=ffdd54)
![Python Version](https://img.shields.io/badge/python-3.12-blue?style=for-the-badge&logo=python&logoColor=ffdd54)

# data-sources-app-v2

Expand Down Expand Up @@ -50,6 +50,12 @@ source venv/bin/activate
```
pip install -r requirements.txt
pip install "psycopg[binary,pool]"
pre-commit install
# To optionally run the pre-commit against all files (as pre-commit usually only runs on changed files)
pre-commit run --all-files
```

Expand All @@ -63,35 +69,37 @@ Reach out to [email protected] or make noise in Discord if you'd like access to th

The environment variables are as follows:
* DO_DATABASE_URL: Used to connect to the database.
* DEV_DB_CONN_STRING: Used to connect to the dev database.
* VITE_VUE_API_BASE_URL: The base URL for the API
* VITE_VUE_APP_BASE_URL: The base URL for the UI
* VITE_ADMIN_API_KEY: Used as the `Basic` auth token for the web client. Must be in `/client` directory `.env` file.
* GH_CLIENT_ID: Used to authenticate with GitHub via OAuth. Must correspond to the `client_id` provided by GitHub.
* GH_CLIENT_SECRET: Used to authenticate with GitHub via OAuth. Must correspond to the `client_secret` provided by GitHub.
* JWT_SECRET_KEY: Used to sign and verify JWT tokens. Used to identify that any JWT tokens produced are recognizable by this version of the app and no other. Can be customized for local development.
* RESET_PASSWORD_SECRET_KEY: Used to sign and verify JWT tokens for the reset password feature. Used to identify that any JWT tokens for the reset password feature produced are recognizable by this version of the app and no other.
* FLASK_APP_COOKIE_ENCRYPTION_KEY: Used to create signed cookies to prevent CSRF attacks. Used to identify that any cookies produced are recognizable by this version of the app and no other. Can be customized for local development.
* DEVELOPMENT_PASSWORD: Used to create a test user with elevated permissions for the purposes of testing. Developers must provide this password when using the `/dev/create-test-user-with-elevated-permissions` endpoint. Can be customized for local development.
* GH_API_ACCESS_TOKEN: Used to authenticate with GitHub when adding or getting information about Github Issues. Must correspond to the `access_token` provided by GitHub.
* GH_ISSUE_REPO_NAME: Identifies the repository, in `<github-username>/<github-repo-name>` format, where the issue will be created, and where information about issues will be retrieved. Can be customized for local development.
* VALIDATE_EMAIL_SECRET_KEY: Used to sign and verify JWT tokens for the validate email feature. Used to identify that any JWT tokens for the validate email feature produced are recognizable by this version of the app and no other.


#### .env Example
```
# .env
DO_DATABASE_URL="postgres://data_sources_app:<password>@db-postgresql-nyc3-38355-do-user-8463429-0.c.db.ondigitalocean.com:25060/defaultdb"
DEV_DB_CONN_STRING="postgresql://data_sources_app_v2:<password>@pdap-db-dev-do-user-8463429-0.c.db.ondigitalocean.com:25060/pdap_dev_db?sslmode=require"
VITE_VUE_API_BASE_URL="http://localhost:5000"
VITE_VUE_APP_BASE_URL="http://localhost:8888"
VITE_ADMIN_API_KEY="1234abcd"
GH_CLIENT_ID="GithubProvidedClientId"
GH_CLIENT_SECRET="GithubProvidedClientSecret"
FLASK_APP_COOKIE_ENCRYPTION_KEY="myCustomFlaskAppSecretKey"
JWT_SECRET_KEY="myCustomJwtSecretKey"
RESET_PASSWORD_SECRET_KEY="myCustomResetPasswordSecretKey"
DEVELOPMENT_PASSWORD="myCustomDevelopmentPassword"
GH_API_ACCESS_TOKEN="GithubProvidedAccessToken"
GH_ISSUE_REPO_NAME="github-username/github-repo-name"
VALIDATE_EMAIL_SECRET_KEY="myCustomValidateEmailSecretKey"
```

#### Shell Example
Expand Down
34 changes: 28 additions & 6 deletions app.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,15 +6,20 @@
from flask_cors import CORS

from middleware.util import get_env_variable
from resources.Batch import namespace_bulk
from resources.Callback import namespace_auth
from resources.DataRequests import namespace_data_requests
from resources.GithubDataRequests import namespace_github
from resources.HomepageSearchCache import namespace_homepage_search_cache
from resources.LinkToGithub import namespace_link_to_github
from resources.Locations import namespace_locations
from resources.LoginWithGithub import namespace_login_with_github
from resources.Map import namespace_map
from resources.Match import namespace_match
from resources.Notifications import namespace_notifications
from resources.OAuth import namespace_oauth
from resources.Permissions import namespace_permissions
from resources.Search import namespace_search
from resources.Signup import namespace_signup
from resources.TypeaheadSuggestions import (
namespace_typeahead_suggestions,
)
Expand All @@ -32,14 +37,13 @@
from resources.ResetPassword import namespace_reset_password
from resources.ResetTokenValidation import namespace_reset_token_validation
from resources.UniqueURLChecker import namespace_url_checker
from resources.User import namespace_user_old
from resources.CreateTestUserWithElevatedPermissions import namespace_create_test_user
from resources.UserProfile import namespace_user

NAMESPACES = [
namespace_api_key,
namespace_request_reset_password,
namespace_user_old,
namespace_oauth,
namespace_reset_token_validation,
namespace_archives,
namespace_agencies,
Expand All @@ -61,6 +65,11 @@
namespace_user,
namespace_github,
namespace_notifications,
namespace_map,
namespace_signup,
namespace_bulk,
namespace_match,
namespace_locations,
]

MY_PREFIX = "/api"
Expand Down Expand Up @@ -105,9 +114,7 @@ def default(self, o):
def create_app() -> Flask:
psycopg2_connection = initialize_psycopg_connection()
config.connection = psycopg2_connection
api = Api()
for namespace in NAMESPACES:
api.add_namespace(namespace)
api = get_api_with_namespaces()
app = Flask(__name__)
app.json = UpdatedJSONProvider(app)

Expand All @@ -116,6 +123,9 @@ def create_app() -> Flask:
app.config["JWT_ACCESS_TOKEN_EXPIRES"] = timedelta(minutes=15)
app.config["JWT_REFRESH_TOKEN_EXPIRES"] = timedelta(days=30)

# Other configuration settings
app.config["MAX_CONTENT_LENGTH"] = 16 * 1024 * 1024

app.secret_key = get_flask_app_cookie_encryption_key()
app.wsgi_app = ReverseProxied(app.wsgi_app)
CORS(app)
Expand All @@ -128,6 +138,18 @@ def create_app() -> Flask:
return app


def get_api_with_namespaces():
api = Api(
version="2.0",
title="PDAP Data Sources API",
description="The following is the API documentation for the PDAP Data Sources API."
"\n\nFor information on how to get started, consult [our getting started guide.](https://docs.pdap.io/api/introduction)",
)
for namespace in NAMESPACES:
api.add_namespace(namespace)
return api


if __name__ == "__main__":
app = create_app()
app.run(host=os.getenv("FLASK_RUN_HOST", "127.0.0.1"))
4 changes: 2 additions & 2 deletions client/.eslintrc.json
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,8 @@
"import/core-modules": ["vue-router/auto-routes"]
},
"rules": {
"vue/multi-word-component-names": ["error", {
"ignores": ["login", "index", "search", "search.results", "request"]
"vue/multi-word-component-names": ["warn", {
"ignores": ["login", "index", "search", "search.results", "request", "profile", "[id]", "results", "create", "validate.email"]
}]
}
}
1 change: 1 addition & 0 deletions client/.nvmrc
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
v20.9.0
Loading

0 comments on commit c78cb82

Please sign in to comment.