Skip to content

Commit 2e0cd2d

Browse files
committed
rebuilt app from app2 developments
1 parent 079f0ff commit 2e0cd2d

File tree

576 files changed

+13129
-24163
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

576 files changed

+13129
-24163
lines changed

.flake8

Lines changed: 0 additions & 3 deletions
This file was deleted.

.github/workflows/ci.yml

Lines changed: 38 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,9 @@ name: CI
22

33
on:
44
push:
5-
branches: [ "prod" ]
5+
branches: [ "main" ]
66
pull_request:
7-
branches: [ "prod" ]
7+
branches: [ "main" ]
88
workflow_dispatch:
99

1010
jobs:
@@ -18,68 +18,69 @@ jobs:
1818
fail-fast: true
1919
matrix:
2020
os: ["ubuntu-latest"]
21-
python-version: ["3.11"]
21+
python-version: ["3.12"]
2222
env:
2323
API_MODE: "test"
2424
ENVIRONMENT: "pytest"
2525
CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}
2626
SENTRY_DSN: ${{ secrets.SENTRY_DSN }}
27+
# core
2728
API_ALLOWED_CORS: ${{ secrets.API_ALLOWED_CORS }}
2829
API_RSA_PRIVATE_KEY: ${{ secrets.API_RSA_PRIVATE_KEY }}
2930
API_RSA_PUBLIC_KEY: ${{ secrets.API_RSA_PUBLIC_KEY }}
3031
API_SECRET_KEY: ${{ secrets.API_SECRET_KEY }}
3132
API_CSRF_KEY: ${{ secrets.API_CSRF_KEY }}
3233
API_ENCRYPTION_KEY: ${{ secrets.API_ENCRYPTION_KEY }}
3334
API_ENCRYPTION_SALT: ${{ secrets.API_ENCRYPTION_SALT }}
35+
# limits
3436
API_QUERY_LIMIT_OFFSET_DEFAULT: ${{ secrets.API_QUERY_LIMIT_OFFSET_DEFAULT }}
3537
API_QUERY_LIMIT_ROWS_DEFAULT: ${{ secrets.API_QUERY_LIMIT_ROWS_DEFAULT }}
3638
API_QUERY_LIMIT_ROWS_MAX: ${{ secrets.API_QUERY_LIMIT_ROWS_MAX }}
37-
AUTH0_DOMAIN: ${{ secrets.AUTH0_DOMAIN }}
38-
AUTH0_API_AUDIENCE: ${{ secrets.AUTH0_API_AUDIENCE }}
39-
AUTH0_SPA_CLIENT_ID: ${{ secrets.AUTH0_SPA_CLIENT_ID }}
40-
AUTH0_SPA_CLIENT_SECRET: ${{ secrets.AUTH0_SPA_CLIENT_SECRET }}
41-
AUTH0_M2M_CLIENT_ID: ${{ secrets.AUTH0_M2M_CLIENT_ID }}
42-
AUTH0_M2M_CLIENT_SECRET: ${{ secrets.AUTH0_M2M_CLIENT_SECRET }}
43-
AUTH0_FIRST_ADMIN_AUTH_ID: ${{ secrets.AUTH0_FIRST_ADMIN_AUTH_ID }}
44-
AUTH0_FIRST_ADMIN: ${{ secrets.AUTH0_FIRST_ADMIN }}
45-
AUTH0_FIRST_ADMIN_PASSWORD: ${{ secrets.AUTH0_FIRST_ADMIN_PASSWORD }}
46-
AUTH0_FIRST_ADMIN_PICTURE: ${{ secrets.AUTH0_FIRST_ADMIN_PICTURE }}
47-
AUTH0_FIRST_MANAGER_AUTH_ID: ${{ secrets.AUTH0_FIRST_MANAGER_AUTH_ID }}
48-
AUTH0_FIRST_MANAGER: ${{ secrets.AUTH0_FIRST_MANAGER }}
49-
AUTH0_FIRST_MANAGER_PASSWORD: ${{ secrets.AUTH0_FIRST_MANAGER_PASSWORD }}
50-
AUTH0_FIRST_MANAGER_PICTURE: ${{ secrets.AUTH0_FIRST_MANAGER_PICTURE }}
51-
AUTH0_FIRST_EMPLOYEE_AUTH_ID: ${{ secrets.AUTH0_FIRST_EMPLOYEE_AUTH_ID }}
52-
AUTH0_FIRST_EMPLOYEE: ${{ secrets.AUTH0_FIRST_EMPLOYEE }}
53-
AUTH0_FIRST_EMPLOYEE_PASSWORD: ${{ secrets.AUTH0_FIRST_EMPLOYEE_PASSWORD }}
54-
AUTH0_FIRST_EMPLOYEE_PICTURE: ${{ secrets.AUTH0_FIRST_EMPLOYEE_PICTURE }}
55-
AUTH0_FIRST_CLIENT_A_AUTH_ID: ${{ secrets.AUTH0_FIRST_CLIENT_A_AUTH_ID }}
56-
AUTH0_FIRST_CLIENT_A: ${{ secrets.AUTH0_FIRST_CLIENT_A }}
57-
AUTH0_FIRST_CLIENT_A_PASSWORD: ${{ secrets.AUTH0_FIRST_CLIENT_A_PASSWORD }}
58-
AUTH0_FIRST_CLIENT_A_PICTURE: ${{ secrets.AUTH0_FIRST_CLIENT_A_PICTURE }}
59-
AUTH0_FIRST_CLIENT_B_AUTH_ID: ${{ secrets.AUTH0_FIRST_CLIENT_B_AUTH_ID }}
60-
AUTH0_FIRST_CLIENT_B: ${{ secrets.AUTH0_FIRST_CLIENT_B }}
61-
AUTH0_FIRST_CLIENT_B_PASSWORD: ${{ secrets.AUTH0_FIRST_CLIENT_B_PASSWORD }}
62-
AUTH0_FIRST_CLIENT_B_PICTURE: ${{ secrets.AUTH0_FIRST_CLIENT_B_PICTURE }}
63-
AUTH0_FIRST_USER_VERIFIED_AUTH_ID: ${{ secrets.AUTH0_FIRST_USER_VERIFIED_AUTH_ID }}
64-
AUTH0_FIRST_USER_VERIFIED: ${{ secrets.AUTH0_FIRST_USER_VERIFIED }}
65-
AUTH0_FIRST_USER_VERIFIED_PASSWORD: ${{ secrets.AUTH0_FIRST_USER_VERIFIED_PASSWORD }}
66-
AUTH0_FIRST_USER_UNVERIFIED_AUTH_ID: ${{ secrets.AUTH0_FIRST_USER_UNVERIFIED_AUTH_ID }}
67-
AUTH0_FIRST_USER_UNVERIFIED: ${{ secrets.AUTH0_FIRST_USER_UNVERIFIED }}
68-
AUTH0_FIRST_USER_UNVERIFIED_PASSWORD: ${{ secrets.AUTH0_FIRST_USER_UNVERIFIED_PASSWORD }}
39+
# auth
40+
AUTH_RULE_NAMESPACE: ${{ secrets.AUTH_RULE_NAMESPACE }}
41+
AUTH_DOMAIN: ${{ secrets.AUTH_DOMAIN }}
42+
AUTH_API_AUDIENCE: ${{ secrets.AUTH_API_AUDIENCE }}
43+
AUTH_SPA_CLIENT_ID: ${{ secrets.AUTH_SPA_CLIENT_ID }}
44+
AUTH_SPA_CLIENT_SECRET: ${{ secrets.AUTH_SPA_CLIENT_SECRET }}
45+
AUTH_M2M_CLIENT_ID: ${{ secrets.AUTH_M2M_CLIENT_ID }}
46+
AUTH_M2M_CLIENT_SECRET: ${{ secrets.AUTH_M2M_CLIENT_SECRET }}
47+
# users
48+
AUTH_FIRST_ADMIN_AUTH_ID: ${{ secrets.AUTH_FIRST_ADMIN_AUTH_ID }}
49+
AUTH_FIRST_ADMIN: ${{ secrets.AUTH_FIRST_ADMIN }}
50+
AUTH_FIRST_ADMIN_PASSWORD: ${{ secrets.AUTH_FIRST_ADMIN_PASSWORD }}
51+
AUTH_FIRST_MANAGER_AUTH_ID: ${{ secrets.AUTH_FIRST_MANAGER_AUTH_ID }}
52+
AUTH_FIRST_MANAGER: ${{ secrets.AUTH_FIRST_MANAGER }}
53+
AUTH_FIRST_MANAGER_PASSWORD: ${{ secrets.AUTH_FIRST_MANAGER_PASSWORD }}
54+
AUTH_FIRST_EMPLOYEE_AUTH_ID: ${{ secrets.AUTH_FIRST_EMPLOYEE_AUTH_ID }}
55+
AUTH_FIRST_EMPLOYEE: ${{ secrets.AUTH_FIRST_EMPLOYEE }}
56+
AUTH_FIRST_EMPLOYEE_PASSWORD: ${{ secrets.AUTH_FIRST_EMPLOYEE_PASSWORD }}
57+
AUTH_FIRST_CLIENT_A_AUTH_ID: ${{ secrets.AUTH_FIRST_CLIENT_A_AUTH_ID }}
58+
AUTH_FIRST_CLIENT_A: ${{ secrets.AUTH_FIRST_CLIENT_A }}
59+
AUTH_FIRST_CLIENT_A_PASSWORD: ${{ secrets.AUTH_FIRST_CLIENT_A_PASSWORD }}
60+
AUTH_FIRST_CLIENT_B_AUTH_ID: ${{ secrets.AUTH_FIRST_CLIENT_B_AUTH_ID }}
61+
AUTH_FIRST_CLIENT_B: ${{ secrets.AUTH_FIRST_CLIENT_B }}
62+
AUTH_FIRST_CLIENT_B_PASSWORD: ${{ secrets.AUTH_FIRST_CLIENT_B_PASSWORD }}
63+
AUTH_FIRST_USER_VERIFIED_AUTH_ID: ${{ secrets.AUTH_FIRST_USER_VERIFIED_AUTH_ID }}
64+
AUTH_FIRST_USER_VERIFIED: ${{ secrets.AUTH_FIRST_USER_VERIFIED }}
65+
AUTH_FIRST_USER_VERIFIED_PASSWORD: ${{ secrets.AUTH_FIRST_USER_VERIFIED_PASSWORD }}
66+
AUTH_FIRST_USER_UNVERIFIED_AUTH_ID: ${{ secrets.AUTH_FIRST_USER_UNVERIFIED_AUTH_ID }}
67+
AUTH_FIRST_USER_UNVERIFIED: ${{ secrets.AUTH_FIRST_USER_UNVERIFIED }}
68+
AUTH_FIRST_USER_UNVERIFIED_PASSWORD: ${{ secrets.AUTH_FIRST_USER_UNVERIFIED_PASSWORD }}
69+
# email
6970
EMAIL_ENABLED: ${{ secrets.EMAIL_ENABLED }}
7071
EMAIL_FROM_EMAIL: ${{ secrets.EMAIL_FROM_EMAIL }}
7172
EMAIL_FROM_NAME: ${{ secrets.EMAIL_FROM_NAME }}
7273
EMAIL_PROVIDER_RESTRICTION: ${{ secrets.EMAIL_PROVIDER_RESTRICTION }}
7374
EMAIL_ALLOWED_PROVIDERS: ${{ secrets.EMAIL_ALLOWED_PROVIDERS }}
7475
EMAIL_ALLOWED_FROM_EMAILS: ${{ secrets.EMAIL_ALLOWED_FROM_EMAILS }}
7576
EMAIL_TEST_USER: ${{ secrets.EMAIL_TEST_USER }}
77+
# cloudkeys
7678
CLOUDKEY_IPINFO: ${{ secrets.CLOUDKEY_IPINFO }}
7779
CLOUDKEY_GOOGLE_API: ${{ secrets.CLOUDKEY_GOOGLE_API }}
7880
CLOUDKEY_AWS_ACCESS_KEY_ID: ${{ secrets.CLOUDKEY_AWS_ACCESS_KEY_ID }}
7981
CLOUDKEY_AWS_SECRET_ACCESS_KEY: ${{ secrets.CLOUDKEY_AWS_SECRET_ACCESS_KEY }}
8082
CLOUDKEY_AWS_DEFAULT_REGION: ${{ secrets.CLOUDKEY_AWS_DEFAULT_REGION }}
8183
CLOUDKEY_AWS_S3_DEFAULT_BUCKET: ${{ secrets.CLOUDKEY_AWS_S3_DEFAULT_BUCKET }}
82-
AWS_GITHUB_OIDC_ROLE_ARN: ${{ secrets.AWS_GITHUB_OIDC_ROLE_ARN }}
8384
AWS_ACCESS_KEY_ID: ${{ secrets.CLOUDKEY_AWS_ACCESS_KEY_ID }}
8485
AWS_SECRET_ACCESS_KEY: ${{ secrets.CLOUDKEY_AWS_SECRET_ACCESS_KEY }}
8586
AWS_DEFAULT_REGION: ${{ secrets.CLOUDKEY_AWS_S3_DEFAULT_BUCKET }}
@@ -101,9 +102,7 @@ jobs:
101102
- name: Install Dependencies
102103
run: |
103104
python -m pip install --upgrade pip \
104-
&& python -m pip install poetry \
105-
&& poetry config virtualenvs.create false \
106-
&& poetry install --no-root
105+
&& python -m pip install -r requirements.txt
107106
- name: Run Python Tests
108107
run: |
109108
bash ./scripts/test-cov.sh

.pre-commit-config.yaml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,14 +7,14 @@ repos:
77
hooks:
88
- id: format-code
99
name: format-code
10-
entry: ./scripts/format.sh
10+
entry: ./scripts/ruff-check.sh
1111
language: script
1212
pass_filenames: false
1313
- repo: local
1414
hooks:
1515
- id: lint-code
1616
name: lint-code
17-
entry: ./scripts/lint.sh
17+
entry: ./scripts/ruff-fix.sh
1818
language: script
1919
pass_filenames: false
2020
# - repo: local

.python-version

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
3.12.7

README.md

Lines changed: 36 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
[![CodeQL](https://github.com/joeygrable94/GCAPI-Backend/actions/workflows/codeql.yml/badge.svg)](https://github.com/joeygrable94/GCAPI-Backend/actions/workflows/codeql.yml) [![GitHub CI](https://github.com/joeygrable94/GCAPI-Backend/actions/workflows/ci.yml/badge.svg)](https://github.com/joeygrable94/GCAPI-Backend/actions/workflows/ci.yml) [![codecov](https://codecov.io/gh/joeygrable94/GCAPI-Backend/branch/main/graph/badge.svg?token=8FCB50574D)](https://codecov.io/gh/joeygrable94/GCAPI-Backend)
44

55
- [GCAPI Backend](#gcapi-backend)
6+
- [Pytest](#pytest)
67
- [Getting Started](#getting-started)
78
- [Application Structure](#application-structure)
89
- [Security Resources](#security-resources)
@@ -14,13 +15,31 @@
1415
- [Commands](#commands)
1516
- [SQLAlchemy ORM](#sqlalchemy-orm)
1617
- [Pagination](#pagination)
17-
- [PyTest](#pytest)
18+
- [PyTest](#pytest-1)
1819
- [PyTest Commands](#pytest-commands)
1920
- [PyTest Resources](#pytest-resources)
2021
- [External Resources](#external-resources)
22+
- [Useful Commands](#useful-commands)
2123

2224
---
2325

26+
## Pytest
27+
28+
```bash
29+
crud
30+
31+
core/pagination/core
32+
core/security/auth/exceptions
33+
core/security/csrf/core
34+
core/security/csrf/csrf_config
35+
core/security/csrf/exceptions
36+
core/security/permissions/exceptions
37+
38+
api/deps
39+
api/exceptions
40+
api/v1/endpoints
41+
```
42+
2443
## Getting Started
2544

2645
First check to ensure Python 3.11 is installed and is the current version in use.
@@ -185,3 +204,19 @@ pytest tests/api/api_v1/test_websites.py
185204
## External Resources
186205

187206
- [IPInfo.io](https://ipinfo.io/)
207+
208+
---
209+
210+
## Useful Commands
211+
212+
Delete DS_Store files
213+
214+
```bash
215+
find . -name '.DS_Store' -type f -delete
216+
```
217+
218+
Delete all python cache files
219+
220+
```bash
221+
find . | grep -E "(/__pycache__$|\.pyc$|\.pyo$)" | xargs rm -rf
222+
```

alembic/env.py

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,11 @@
55
import sys
66
from logging.config import fileConfig
77

8-
from alembic import context
98
from dotenv import load_dotenv
10-
from pydantic_core import Url
119
from sqlalchemy import URL, engine_from_config, pool
1210

11+
from alembic import context
12+
1313
load_dotenv()
1414

1515
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
@@ -40,10 +40,12 @@
4040
# my_important_option = config.get_main_option("my_important_option")
4141
# ... etc.
4242

43+
4344
# database uri
4445
def get_url() -> str | URL:
4546
return settings.db.uri
4647

48+
4749
def get_async_url() -> str | URL:
4850
return settings.db.uri_async
4951

@@ -81,7 +83,9 @@ def run_migrations_online():
8183
assert configuration
8284
configuration["sqlalchemy.url"] = str(url)
8385
connectable = engine_from_config(
84-
configuration, prefix="sqlalchemy.", poolclass=pool.NullPool,
86+
configuration,
87+
prefix="sqlalchemy.",
88+
poolclass=pool.NullPool,
8589
)
8690

8791
with connectable.connect() as connection:

alembic/versions/06ebefa81a2b_updated_hotspot_content.py

Lines changed: 18 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -5,32 +5,38 @@
55
Create Date: 2024-10-29 22:36:24.996539
66
77
"""
8+
89
import sqlalchemy as sa
9-
from alembic import op
10-
from sqlalchemy.dialects import mysql
1110

11+
from alembic import op
1212
from app.db.custom_types.longtext import LongText
1313

1414
# revision identifiers, used by Alembic.
15-
revision = '06ebefa81a2b'
16-
down_revision = 'b7f0de526452'
15+
revision = "06ebefa81a2b"
16+
down_revision = "b7f0de526452"
1717
branch_labels = None
1818
depends_on = None
1919

2020

2121
def upgrade() -> None:
2222
# ### commands auto generated by Alembic - please adjust! ###
23-
op.alter_column('gcft_snap_hotspotclick', 'hotspot_content',
24-
existing_type=sa.BLOB(),
25-
type_=LongText(),
26-
existing_nullable=True)
23+
op.alter_column(
24+
"gcft_snap_hotspotclick",
25+
"hotspot_content",
26+
existing_type=sa.BLOB(),
27+
type_=LongText(),
28+
existing_nullable=True,
29+
)
2730
# ### end Alembic commands ###
2831

2932

3033
def downgrade() -> None:
3134
# ### commands auto generated by Alembic - please adjust! ###
32-
op.alter_column('gcft_snap_hotspotclick', 'hotspot_content',
33-
existing_type=LongText(),
34-
type_=sa.BLOB(),
35-
existing_nullable=True)
35+
op.alter_column(
36+
"gcft_snap_hotspotclick",
37+
"hotspot_content",
38+
existing_type=LongText(),
39+
type_=sa.BLOB(),
40+
existing_nullable=True,
41+
)
3642
# ### end Alembic commands ###

alembic/versions/1bc48e91aa39_added_styleguide_column_to_clients_table.py

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,25 +5,26 @@
55
Create Date: 2024-09-18 13:00:17.957395
66
77
"""
8+
89
import sqlalchemy as sa
9-
from alembic import op
10-
from sqlalchemy.dialects import mysql
1110
from sqlalchemy_utils.types.json import JSONType
1211

12+
from alembic import op
13+
1314
# revision identifiers, used by Alembic.
14-
revision = '1bc48e91aa39'
15-
down_revision = '7a61307f0405'
15+
revision = "1bc48e91aa39"
16+
down_revision = "7a61307f0405"
1617
branch_labels = None
1718
depends_on = None
1819

1920

2021
def upgrade() -> None:
2122
# ### commands auto generated by Alembic - please adjust! ###
22-
op.add_column('client', sa.Column('style_guide', JSONType(), nullable=True))
23+
op.add_column("client", sa.Column("style_guide", JSONType(), nullable=True))
2324
# ### end Alembic commands ###
2425

2526

2627
def downgrade() -> None:
2728
# ### commands auto generated by Alembic - please adjust! ###
28-
op.drop_column('client', 'style_guide')
29+
op.drop_column("client", "style_guide")
2930
# ### end Alembic commands ###

0 commit comments

Comments
 (0)