feat(phase1): add image storage utilities
- Create backend/services/image_storage.py with 4 core functions:
- sanitize_filename(): remove unsafe chars, limit to 255 chars, convert to lowercase
- get_unique_filename(): handle collisions with UUID suffix (format: {name}_{uuid8}_{variant}.jpg)
- ensure_image_directories(): create /images/ root and category subdirs on startup
- save_image(): save bytes to /images/{category}/{filename}, returns relative path
- Create comprehensive test suite (22 tests) covering all functionality
- Integrate ensure_image_directories() into FastAPI startup event
- Directory structure: /images/{category}/{filename}
- Collision handling: auto-suffix with UUID if filename exists
- All tests passing, pathlib.Path for safe operations
This commit is contained in:
@@ -0,0 +1,34 @@
|
||||
# This file is dual licensed under the terms of the Apache License, Version
|
||||
# 2.0, and the BSD License. See the LICENSE file in the root of this repository
|
||||
# for complete details.
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
import typing
|
||||
|
||||
from cryptography.hazmat.bindings._rust import x509 as rust_x509
|
||||
from cryptography.x509.general_name import DNSName, IPAddress
|
||||
|
||||
__all__ = [
|
||||
"ClientVerifier",
|
||||
"Criticality",
|
||||
"ExtensionPolicy",
|
||||
"Policy",
|
||||
"PolicyBuilder",
|
||||
"ServerVerifier",
|
||||
"Store",
|
||||
"Subject",
|
||||
"VerificationError",
|
||||
"VerifiedClient",
|
||||
]
|
||||
|
||||
Store = rust_x509.Store
|
||||
Subject = typing.Union[DNSName, IPAddress]
|
||||
VerifiedClient = rust_x509.VerifiedClient
|
||||
ClientVerifier = rust_x509.ClientVerifier
|
||||
ServerVerifier = rust_x509.ServerVerifier
|
||||
PolicyBuilder = rust_x509.PolicyBuilder
|
||||
Policy = rust_x509.Policy
|
||||
ExtensionPolicy = rust_x509.ExtensionPolicy
|
||||
Criticality = rust_x509.Criticality
|
||||
VerificationError = rust_x509.VerificationError
|
||||
Reference in New Issue
Block a user