concurrency-fix #15
@@ -10,6 +10,8 @@ from typing import Sequence, Union
|
|||||||
from alembic import op
|
from alembic import op
|
||||||
import sqlalchemy as sa
|
import sqlalchemy as sa
|
||||||
|
|
||||||
|
from alpine_bits_python.const import WebhookStatus
|
||||||
|
|
||||||
|
|
||||||
# revision identifiers, used by Alembic.
|
# revision identifiers, used by Alembic.
|
||||||
revision: str = 'e7ee03d8f430'
|
revision: str = 'e7ee03d8f430'
|
||||||
@@ -66,13 +68,12 @@ def upgrade() -> None:
|
|||||||
sa.Column('payload_hash', sa.String(length=64), nullable=False),
|
sa.Column('payload_hash', sa.String(length=64), nullable=False),
|
||||||
sa.Column('webhook_endpoint_id', sa.Integer(), nullable=True),
|
sa.Column('webhook_endpoint_id', sa.Integer(), nullable=True),
|
||||||
sa.Column('hotel_id', sa.String(length=50), nullable=True),
|
sa.Column('hotel_id', sa.String(length=50), nullable=True),
|
||||||
sa.Column('status', sa.String(length=20), nullable=False, default='pending'),
|
sa.Column('status', sa.String(length=20), nullable=False, default=WebhookStatus.PENDING.value),
|
||||||
sa.Column('processing_started_at', sa.DateTime(timezone=True), nullable=True),
|
sa.Column('processing_started_at', sa.DateTime(timezone=True), nullable=True),
|
||||||
sa.Column('processing_completed_at', sa.DateTime(timezone=True), nullable=True),
|
sa.Column('processing_completed_at', sa.DateTime(timezone=True), nullable=True),
|
||||||
sa.Column('retry_count', sa.Integer(), nullable=True, default=0),
|
sa.Column('retry_count', sa.Integer(), nullable=True, default=0),
|
||||||
sa.Column('last_error', sa.String(length=2000), nullable=True),
|
sa.Column('last_error', sa.String(length=2000), nullable=True),
|
||||||
sa.Column('payload_json', sa.JSON(), nullable=True),
|
sa.Column('payload_json', sa.JSON(), nullable=True),
|
||||||
sa.Column('payload_size_bytes', sa.Integer(), nullable=True),
|
|
||||||
sa.Column('purged_at', sa.DateTime(timezone=True), nullable=True),
|
sa.Column('purged_at', sa.DateTime(timezone=True), nullable=True),
|
||||||
sa.Column('created_at', sa.DateTime(timezone=True), nullable=False),
|
sa.Column('created_at', sa.DateTime(timezone=True), nullable=False),
|
||||||
sa.Column('source_ip', sa.String(length=45), nullable=True),
|
sa.Column('source_ip', sa.String(length=45), nullable=True),
|
||||||
|
|||||||
@@ -4,6 +4,8 @@ import os
|
|||||||
from collections.abc import AsyncGenerator, Callable
|
from collections.abc import AsyncGenerator, Callable
|
||||||
from typing import TypeVar
|
from typing import TypeVar
|
||||||
|
|
||||||
|
from .const import WebhookStatus
|
||||||
|
|
||||||
from sqlalchemy import (
|
from sqlalchemy import (
|
||||||
JSON,
|
JSON,
|
||||||
Boolean,
|
Boolean,
|
||||||
@@ -751,8 +753,8 @@ class WebhookRequest(Base):
|
|||||||
hotel_id = Column(String(50), ForeignKey("hotels.hotel_id"), nullable=True, index=True)
|
hotel_id = Column(String(50), ForeignKey("hotels.hotel_id"), nullable=True, index=True)
|
||||||
|
|
||||||
# Processing tracking
|
# Processing tracking
|
||||||
status = Column(String(20), nullable=False, default='pending', index=True)
|
status = Column(String(20), nullable=False, default=WebhookStatus.PENDING.value, index=True)
|
||||||
# Status values: 'pending', 'processing', 'completed', 'failed'
|
# Status values: 'pending', 'processing', 'completed', 'failed' set by Enum WebhookStatus
|
||||||
|
|
||||||
processing_started_at = Column(DateTime(timezone=True), nullable=True)
|
processing_started_at = Column(DateTime(timezone=True), nullable=True)
|
||||||
processing_completed_at = Column(DateTime(timezone=True), nullable=True)
|
processing_completed_at = Column(DateTime(timezone=True), nullable=True)
|
||||||
@@ -763,7 +765,6 @@ class WebhookRequest(Base):
|
|||||||
|
|
||||||
# Payload storage
|
# Payload storage
|
||||||
payload_json = Column(JSON, nullable=True) # NULL after purge, kept for retries
|
payload_json = Column(JSON, nullable=True) # NULL after purge, kept for retries
|
||||||
payload_size_bytes = Column(Integer, nullable=True) # Track original size
|
|
||||||
purged_at = Column(DateTime(timezone=True), nullable=True) # When JSON was purged
|
purged_at = Column(DateTime(timezone=True), nullable=True) # When JSON was purged
|
||||||
|
|
||||||
# Metadata
|
# Metadata
|
||||||
|
|||||||
Reference in New Issue
Block a user