mirror of
https://github.com/Sea-Haven-Industries/shoc-backend.git
synced 2026-09-30 14:13:12 +00:00
The Elastic Beanstalk nginx proxy kept its 1 MB default body limit, so every media upload over ~1 MB got an nginx 413 before reaching the API. Ship a .platform nginx override (120M) in the bundle and assert it in the bundle contract. Apply the client-confirmed contract: photos up to 10 MB (JPEG/PNG/HEIC), videos up to 100 MB (MP4/MOV), at most 10 photos and 3 videos per work order, with stable generic rejection messages. The request ceiling (110 MB) sits between the per-kind caps and the proxy so oversize files get the generic message. The vendor portal accepts the same photo/video types and caps.
69 lines
2.1 KiB
Python
69 lines
2.1 KiB
Python
#!/usr/bin/env python3
|
|
"""Fail when a change set mixes Terraform with deployable application files.
|
|
|
|
Workflow, docs, and gate-script changes may travel with either side.
|
|
"""
|
|
|
|
from __future__ import annotations
|
|
|
|
import argparse
|
|
import sys
|
|
|
|
APP_SCRIPT_NAMES = {
|
|
"scripts/package-elastic-beanstalk.sh",
|
|
"scripts/validate-elastic-beanstalk-bundle.sh",
|
|
"scripts/smoke-elastic-beanstalk.sh",
|
|
}
|
|
|
|
APP_SUFFIXES = (".cs", ".csproj", ".razor")
|
|
|
|
|
|
def is_terraform_path(path: str) -> bool:
|
|
return path == "terraform" or path.startswith("terraform/")
|
|
|
|
|
|
def is_app_path(path: str) -> bool:
|
|
normalized = path.replace("\\", "/")
|
|
if normalized in APP_SCRIPT_NAMES:
|
|
return True
|
|
if normalized.startswith((".ebextensions/", ".platform/")):
|
|
return True
|
|
return normalized.endswith(APP_SUFFIXES)
|
|
|
|
|
|
def isolation_violation(paths: list[str]) -> tuple[list[str], list[str]] | None:
|
|
terraform_files = sorted({path for path in paths if is_terraform_path(path)})
|
|
app_files = sorted({path for path in paths if is_app_path(path)})
|
|
if terraform_files and app_files:
|
|
return terraform_files, app_files
|
|
return None
|
|
|
|
|
|
def main() -> int:
|
|
parser = argparse.ArgumentParser()
|
|
parser.add_argument(
|
|
"paths",
|
|
nargs="*",
|
|
help="Changed paths. Omit and pass newline-separated paths on stdin.",
|
|
)
|
|
args = parser.parse_args()
|
|
paths = list(args.paths)
|
|
if not paths and not sys.stdin.isatty():
|
|
paths = [line.strip() for line in sys.stdin if line.strip()]
|
|
violation = isolation_violation(paths)
|
|
if violation is None:
|
|
print("PASS: application and Terraform changes are isolated")
|
|
return 0
|
|
terraform_files, app_files = violation
|
|
print("FAIL: do not mix deployable application files with terraform/", file=sys.stderr)
|
|
print("terraform:", file=sys.stderr)
|
|
for path in terraform_files:
|
|
print(f" {path}", file=sys.stderr)
|
|
print("application:", file=sys.stderr)
|
|
for path in app_files:
|
|
print(f" {path}", file=sys.stderr)
|
|
return 1
|
|
|
|
|
|
if __name__ == "__main__":
|
|
raise SystemExit(main())
|