remove archived and expired
This commit is contained in:
@@ -26,7 +26,7 @@ dyn = DynamoDBPersistenceLayer(ENROLLMENT_TABLE, dynamodb_client)
|
|||||||
def postback():
|
def postback():
|
||||||
json_body = app.current_event.json_body
|
json_body = app.current_event.json_body
|
||||||
|
|
||||||
status = json_body['status']
|
event_name = json_body['event_name']
|
||||||
score = round(Decimal(json_body['APROVEITAMENTO']), 2)
|
score = round(Decimal(json_body['APROVEITAMENTO']), 2)
|
||||||
progress = round(Decimal(json_body['ANDAMENTO']), 2)
|
progress = round(Decimal(json_body['ANDAMENTO']), 2)
|
||||||
enrollment_id = dyn.collection.get_item(
|
enrollment_id = dyn.collection.get_item(
|
||||||
@@ -34,16 +34,29 @@ def postback():
|
|||||||
# Post-migration: uncomment the following line
|
# Post-migration: uncomment the following line
|
||||||
# pk='KONVIVA',
|
# pk='KONVIVA',
|
||||||
pk='konviva',
|
pk='konviva',
|
||||||
sk=SortKey(json_body['ID_MATRICULA'], path_spec='enrollment_id'),
|
sk=SortKey(
|
||||||
|
json_body['ID_MATRICULA'],
|
||||||
|
path_spec='enrollment_id',
|
||||||
|
),
|
||||||
),
|
),
|
||||||
exc_cls=EnrollmentNotFoundError,
|
exc_cls=EnrollmentNotFoundError,
|
||||||
)
|
)
|
||||||
|
|
||||||
if status == 'IN_PROGRESS':
|
# Make sure webhooks send the correct event names
|
||||||
update_progress(enrollment_id, progress, dynamodb_persistence_layer=dyn)
|
match event_name:
|
||||||
|
case 'UPDATING':
|
||||||
if status == 'COMPLETED':
|
update_progress(
|
||||||
set_score(enrollment_id, score, progress, dynamodb_persistence_layer=dyn)
|
enrollment_id,
|
||||||
|
progress,
|
||||||
|
dynamodb_persistence_layer=dyn,
|
||||||
|
)
|
||||||
|
case 'COMPLETED':
|
||||||
|
set_score(
|
||||||
|
enrollment_id,
|
||||||
|
score,
|
||||||
|
progress,
|
||||||
|
dynamodb_persistence_layer=dyn,
|
||||||
|
)
|
||||||
|
|
||||||
return Response(status_code=HTTPStatus.NO_CONTENT)
|
return Response(status_code=HTTPStatus.NO_CONTENT)
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
from datetime import datetime, timedelta
|
|
||||||
from decimal import Decimal
|
from decimal import Decimal
|
||||||
|
|
||||||
from aws_lambda_powertools.event_handler.exceptions import (
|
from aws_lambda_powertools.event_handler.exceptions import (
|
||||||
@@ -7,7 +6,7 @@ from aws_lambda_powertools.event_handler.exceptions import (
|
|||||||
)
|
)
|
||||||
from botocore.args import logger
|
from botocore.args import logger
|
||||||
from glom import glom
|
from glom import glom
|
||||||
from layercake.dateutils import fromisoformat, now, ttl
|
from layercake.dateutils import now, ttl
|
||||||
from layercake.dynamodb import DynamoDBPersistenceLayer, KeyPair, SortKey, TransactKey
|
from layercake.dynamodb import DynamoDBPersistenceLayer, KeyPair, SortKey, TransactKey
|
||||||
from layercake.strutils import md5_hash
|
from layercake.strutils import md5_hash
|
||||||
|
|
||||||
@@ -124,56 +123,34 @@ def set_score(
|
|||||||
rename_key='dedup_window_offset_days',
|
rename_key='dedup_window_offset_days',
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
now_ = now()
|
|
||||||
user_id = enrollment['user']['id']
|
user_id = enrollment['user']['id']
|
||||||
course_id = glom(enrollment, 'course.id')
|
course_id = glom(enrollment, 'course.id')
|
||||||
created_at: datetime = fromisoformat(enrollment['created_at']) # type: ignore
|
|
||||||
access_period = created_at + timedelta(
|
|
||||||
days=int(glom(enrollment, 'metadata__course.access_period'))
|
|
||||||
)
|
|
||||||
|
|
||||||
try:
|
try:
|
||||||
match score >= 70, now_ > access_period:
|
if score >= 70:
|
||||||
case True, True:
|
# Got a score of 70 or higher
|
||||||
# Got a score of 70 or higher, but the access period has expired
|
return _set_status_as_completed(
|
||||||
return _set_status_as_archived(
|
id,
|
||||||
id,
|
score,
|
||||||
dynamodb_persistence_layer=dynamodb_persistence_layer,
|
progress=progress,
|
||||||
)
|
user_id=user_id,
|
||||||
case True, False:
|
course_id=course_id,
|
||||||
# Got a score of 70 or higher, and still within the access period
|
cert_exp_interval=int(
|
||||||
return _set_status_as_completed(
|
glom(enrollment, 'metadata__course.cert.exp_interval', default=0)
|
||||||
id,
|
),
|
||||||
score,
|
dedup_window_offset_days=int(enrollment['dedup_window_offset_days']),
|
||||||
progress=progress,
|
dynamodb_persistence_layer=dynamodb_persistence_layer,
|
||||||
user_id=user_id,
|
)
|
||||||
course_id=course_id,
|
|
||||||
cert_exp_interval=int(
|
# Got a score below 70
|
||||||
glom(
|
return _set_status_as_failed(
|
||||||
enrollment, 'metadata__course.cert.exp_interval', default=0
|
id,
|
||||||
)
|
score,
|
||||||
),
|
progress=progress,
|
||||||
dedup_window_offset_days=int(
|
user_id=user_id,
|
||||||
enrollment['dedup_window_offset_days']
|
course_id=course_id,
|
||||||
),
|
dynamodb_persistence_layer=dynamodb_persistence_layer,
|
||||||
dynamodb_persistence_layer=dynamodb_persistence_layer,
|
)
|
||||||
)
|
|
||||||
case False, True:
|
|
||||||
# Got a score below 70, and the access period has expired
|
|
||||||
return _set_status_as_expired(
|
|
||||||
id,
|
|
||||||
dynamodb_persistence_layer=dynamodb_persistence_layer,
|
|
||||||
)
|
|
||||||
case _:
|
|
||||||
# Got a score below 70, and still within the access period
|
|
||||||
return _set_status_as_failed(
|
|
||||||
id,
|
|
||||||
score,
|
|
||||||
progress=progress,
|
|
||||||
user_id=user_id,
|
|
||||||
course_id=course_id,
|
|
||||||
dynamodb_persistence_layer=dynamodb_persistence_layer,
|
|
||||||
)
|
|
||||||
except EnrollmentConflictError as err:
|
except EnrollmentConflictError as err:
|
||||||
logger.exception(err)
|
logger.exception(err)
|
||||||
raise
|
raise
|
||||||
@@ -193,15 +170,15 @@ def _set_status_as_completed(
|
|||||||
) -> bool:
|
) -> bool:
|
||||||
now_ = now()
|
now_ = now()
|
||||||
lock_hash = md5_hash(f'{user_id}{course_id}')
|
lock_hash = md5_hash(f'{user_id}{course_id}')
|
||||||
archive_ttl = ttl(
|
cert_exp_ttl = ttl(
|
||||||
start_dt=now_,
|
start_dt=now_,
|
||||||
days=cert_exp_interval,
|
days=cert_exp_interval,
|
||||||
)
|
)
|
||||||
cert_expiration_reminder_ttl = ttl(
|
cert_exp_reminder_ttl = ttl(
|
||||||
start_dt=now_,
|
start_dt=now_,
|
||||||
days=cert_exp_interval - 30,
|
days=cert_exp_interval - 30,
|
||||||
)
|
)
|
||||||
deduplication_lock_ttl = ttl(
|
dedup_lock_ttl = ttl(
|
||||||
start_dt=now_,
|
start_dt=now_,
|
||||||
days=cert_exp_interval - dedup_window_offset_days,
|
days=cert_exp_interval - dedup_window_offset_days,
|
||||||
)
|
)
|
||||||
@@ -209,8 +186,10 @@ def _set_status_as_completed(
|
|||||||
with dynamodb_persistence_layer.transact_writer() as transact:
|
with dynamodb_persistence_layer.transact_writer() as transact:
|
||||||
transact.update(
|
transact.update(
|
||||||
key=KeyPair(pk=id, sk='0'),
|
key=KeyPair(pk=id, sk='0'),
|
||||||
update_expr='SET #status = :completed, progress = :progress, \
|
update_expr='SET #status = :completed, \
|
||||||
score = :score, updated_at = :updated_at',
|
progress = :progress, \
|
||||||
|
score = :score, \
|
||||||
|
updated_at = :updated_at',
|
||||||
cond_expr='#status = :in_progress',
|
cond_expr='#status = :in_progress',
|
||||||
expr_attr_names={'#status': 'status'},
|
expr_attr_names={'#status': 'status'},
|
||||||
expr_attr_values={
|
expr_attr_values={
|
||||||
@@ -236,15 +215,15 @@ def _set_status_as_completed(
|
|||||||
item={
|
item={
|
||||||
'id': id,
|
'id': id,
|
||||||
'sk': 'SCHEDULE#REMINDER_CERT_EXPIRATION_BEFORE_30_DAYS',
|
'sk': 'SCHEDULE#REMINDER_CERT_EXPIRATION_BEFORE_30_DAYS',
|
||||||
'ttl': cert_expiration_reminder_ttl,
|
'ttl': cert_exp_ttl,
|
||||||
'created_at': now_,
|
'created_at': now_,
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
transact.put(
|
transact.put(
|
||||||
item={
|
item={
|
||||||
'id': id,
|
'id': id,
|
||||||
'sk': 'SCHEDULE#SET_AS_ARCHIVED',
|
'sk': 'SCHEDULE#SET_CERT_EXPIRED',
|
||||||
'ttl': archive_ttl,
|
'ttl': cert_exp_reminder_ttl,
|
||||||
'created_at': now_,
|
'created_at': now_,
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
@@ -252,7 +231,7 @@ def _set_status_as_completed(
|
|||||||
item={
|
item={
|
||||||
'id': id,
|
'id': id,
|
||||||
'sk': 'LOCK',
|
'sk': 'LOCK',
|
||||||
'ttl': deduplication_lock_ttl,
|
'ttl': dedup_lock_ttl,
|
||||||
'hash': lock_hash,
|
'hash': lock_hash,
|
||||||
'created_at': now_,
|
'created_at': now_,
|
||||||
}
|
}
|
||||||
@@ -262,7 +241,7 @@ def _set_status_as_completed(
|
|||||||
'id': 'LOCK',
|
'id': 'LOCK',
|
||||||
'sk': lock_hash,
|
'sk': lock_hash,
|
||||||
'enrollment_id': id,
|
'enrollment_id': id,
|
||||||
'ttl': deduplication_lock_ttl,
|
'ttl': dedup_lock_ttl,
|
||||||
'created_at': now_,
|
'created_at': now_,
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
@@ -274,12 +253,6 @@ def _set_status_as_completed(
|
|||||||
sk='CANCEL_POLICY',
|
sk='CANCEL_POLICY',
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
transact.delete(
|
|
||||||
key=KeyPair(
|
|
||||||
pk=id,
|
|
||||||
sk='SCHEDULE#SET_AS_EXPIRED',
|
|
||||||
)
|
|
||||||
)
|
|
||||||
transact.delete(
|
transact.delete(
|
||||||
key=KeyPair(
|
key=KeyPair(
|
||||||
pk=id,
|
pk=id,
|
||||||
@@ -312,8 +285,11 @@ def _set_status_as_failed(
|
|||||||
with dynamodb_persistence_layer.transact_writer() as transact:
|
with dynamodb_persistence_layer.transact_writer() as transact:
|
||||||
transact.update(
|
transact.update(
|
||||||
key=KeyPair(pk=id, sk='0'),
|
key=KeyPair(pk=id, sk='0'),
|
||||||
update_expr='SET #status = :failed, progress = :progress, \
|
update_expr='SET #status = :failed, \
|
||||||
score = :score, updated_at = :updated_at',
|
progress = :progress, \
|
||||||
|
score = :score, \
|
||||||
|
access_expired = :access_expired, \
|
||||||
|
updated_at = :updated_at',
|
||||||
cond_expr='#status = :in_progress',
|
cond_expr='#status = :in_progress',
|
||||||
expr_attr_names={'#status': 'status'},
|
expr_attr_names={'#status': 'status'},
|
||||||
expr_attr_values={
|
expr_attr_values={
|
||||||
@@ -321,6 +297,7 @@ def _set_status_as_failed(
|
|||||||
':in_progress': 'IN_PROGRESS',
|
':in_progress': 'IN_PROGRESS',
|
||||||
':score': score,
|
':score': score,
|
||||||
':progress': progress,
|
':progress': progress,
|
||||||
|
':access_expired': True,
|
||||||
':updated_at': now_,
|
':updated_at': now_,
|
||||||
},
|
},
|
||||||
exc_cls=EnrollmentConflictError,
|
exc_cls=EnrollmentConflictError,
|
||||||
@@ -343,7 +320,7 @@ def _set_status_as_failed(
|
|||||||
transact.delete(
|
transact.delete(
|
||||||
key=KeyPair(
|
key=KeyPair(
|
||||||
pk=id,
|
pk=id,
|
||||||
sk='SCHEDULE#SET_AS_EXPIRED',
|
sk='SCHEDULE#SET_ACCESS_EXPIRED',
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
transact.delete(
|
transact.delete(
|
||||||
@@ -369,90 +346,6 @@ def _set_status_as_failed(
|
|||||||
return True
|
return True
|
||||||
|
|
||||||
|
|
||||||
def _set_status_as_archived(
|
|
||||||
id: str,
|
|
||||||
*,
|
|
||||||
dynamodb_persistence_layer: DynamoDBPersistenceLayer,
|
|
||||||
):
|
|
||||||
now_ = now()
|
|
||||||
with dynamodb_persistence_layer.transact_writer() as transact:
|
|
||||||
transact.update(
|
|
||||||
key=KeyPair(pk=id, sk='0'),
|
|
||||||
update_expr='SET #status = :archived, updated_at = :updated_at',
|
|
||||||
cond_expr='#status = :completed',
|
|
||||||
expr_attr_names={'#status': 'status'},
|
|
||||||
expr_attr_values={
|
|
||||||
':archived': 'ARCHIVED',
|
|
||||||
':completed': 'COMPLETED',
|
|
||||||
':updated_at': now_,
|
|
||||||
},
|
|
||||||
exc_cls=EnrollmentConflictError,
|
|
||||||
)
|
|
||||||
transact.put(
|
|
||||||
item={
|
|
||||||
'id': id,
|
|
||||||
'sk': 'ARCHIVED',
|
|
||||||
'archived_at': now_,
|
|
||||||
},
|
|
||||||
cond_expr='attribute_not_exists(sk)',
|
|
||||||
)
|
|
||||||
# Remove events that no longer apply
|
|
||||||
transact.delete(
|
|
||||||
key=KeyPair(
|
|
||||||
pk=id,
|
|
||||||
sk='SCHEDULE#SET_AS_ARCHIVED',
|
|
||||||
)
|
|
||||||
)
|
|
||||||
|
|
||||||
return True
|
|
||||||
|
|
||||||
|
|
||||||
def _set_status_as_expired(
|
|
||||||
id: str,
|
|
||||||
*,
|
|
||||||
dynamodb_persistence_layer: DynamoDBPersistenceLayer,
|
|
||||||
):
|
|
||||||
now_ = now()
|
|
||||||
|
|
||||||
with dynamodb_persistence_layer.transact_writer() as transact:
|
|
||||||
transact.update(
|
|
||||||
key=KeyPair(pk=id, sk='0'),
|
|
||||||
update_expr='SET #status = :expired, updated_at = :updated_at',
|
|
||||||
cond_expr='#status = :in_progress OR #status = :pending',
|
|
||||||
expr_attr_names={
|
|
||||||
'#status': 'status',
|
|
||||||
},
|
|
||||||
expr_attr_values={
|
|
||||||
':pending': 'PENDING',
|
|
||||||
':in_progress': 'IN_PROGRESS',
|
|
||||||
':expired': 'EXPIRED',
|
|
||||||
':updated_at': now_,
|
|
||||||
},
|
|
||||||
exc_cls=EnrollmentConflictError,
|
|
||||||
)
|
|
||||||
transact.put(
|
|
||||||
item={
|
|
||||||
'id': id,
|
|
||||||
'sk': 'EXPIRED',
|
|
||||||
'expired_at': now_,
|
|
||||||
},
|
|
||||||
cond_expr='attribute_not_exists(sk)',
|
|
||||||
)
|
|
||||||
# Remove events and policies that no longer apply
|
|
||||||
transact.delete(
|
|
||||||
key=KeyPair(
|
|
||||||
pk=id,
|
|
||||||
sk='CANCEL_POLICY',
|
|
||||||
),
|
|
||||||
)
|
|
||||||
transact.delete(
|
|
||||||
key=KeyPair(
|
|
||||||
pk=id,
|
|
||||||
sk='SCHEDULE#SET_AS_EXPIRED',
|
|
||||||
)
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
class EnrollmentNotFoundError(NotFoundError):
|
class EnrollmentNotFoundError(NotFoundError):
|
||||||
def __init__(self, *_):
|
def __init__(self, *_):
|
||||||
super().__init__('Enrollment not found')
|
super().__init__('Enrollment not found')
|
||||||
|
|||||||
@@ -11,14 +11,14 @@ from boto3clients import dynamodb_client
|
|||||||
from config import ENROLLMENT_TABLE
|
from config import ENROLLMENT_TABLE
|
||||||
|
|
||||||
logger = Logger(__name__)
|
logger = Logger(__name__)
|
||||||
enrollment_layer = DynamoDBPersistenceLayer(ENROLLMENT_TABLE, dynamodb_client)
|
dyn = DynamoDBPersistenceLayer(ENROLLMENT_TABLE, dynamodb_client)
|
||||||
|
|
||||||
|
|
||||||
@event_source(data_class=EventBridgeEvent)
|
@event_source(data_class=EventBridgeEvent)
|
||||||
@logger.inject_lambda_context
|
@logger.inject_lambda_context
|
||||||
def lambda_handler(event: EventBridgeEvent, context: LambdaContext) -> bool:
|
def lambda_handler(event: EventBridgeEvent, context: LambdaContext) -> bool:
|
||||||
new_image = event.detail['new_image']
|
new_image = event.detail['new_image']
|
||||||
data = enrollment_layer.get_item(KeyPair(new_image['id'], 'konviva'))
|
data = dyn.get_item(KeyPair(new_image['id'], 'konviva'))
|
||||||
|
|
||||||
try:
|
try:
|
||||||
result = konviva.cancel_enrollment(data['enrollment_id'])
|
result = konviva.cancel_enrollment(data['enrollment_id'])
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ from boto3clients import dynamodb_client
|
|||||||
from config import USER_TABLE
|
from config import USER_TABLE
|
||||||
|
|
||||||
logger = Logger(__name__)
|
logger = Logger(__name__)
|
||||||
user_layer = DynamoDBPersistenceLayer(USER_TABLE, dynamodb_client)
|
dyn = DynamoDBPersistenceLayer(USER_TABLE, dynamodb_client)
|
||||||
|
|
||||||
|
|
||||||
class UserNotFoundError(Exception): ...
|
class UserNotFoundError(Exception): ...
|
||||||
@@ -43,7 +43,7 @@ def lambda_handler(event: EventBridgeEvent, context: LambdaContext) -> bool:
|
|||||||
except Exception:
|
except Exception:
|
||||||
raise
|
raise
|
||||||
|
|
||||||
with user_layer.transact_writer() as transact:
|
with dyn.transact_writer() as transact:
|
||||||
transact.update(
|
transact.update(
|
||||||
key=KeyPair(new_image['id'], '0'),
|
key=KeyPair(new_image['id'], '0'),
|
||||||
update_expr='SET metadata__konviva_user_id = :user_id, \
|
update_expr='SET metadata__konviva_user_id = :user_id, \
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ from boto3clients import dynamodb_client
|
|||||||
from config import ENROLLMENT_TABLE
|
from config import ENROLLMENT_TABLE
|
||||||
|
|
||||||
logger = Logger(__name__)
|
logger = Logger(__name__)
|
||||||
enrollment_layer = DynamoDBPersistenceLayer(ENROLLMENT_TABLE, dynamodb_client)
|
dyn = DynamoDBPersistenceLayer(ENROLLMENT_TABLE, dynamodb_client)
|
||||||
|
|
||||||
|
|
||||||
@event_source(data_class=EventBridgeEvent)
|
@event_source(data_class=EventBridgeEvent)
|
||||||
@@ -32,7 +32,7 @@ def lambda_handler(event: EventBridgeEvent, context: LambdaContext) -> bool:
|
|||||||
logger.exception(err)
|
logger.exception(err)
|
||||||
return False
|
return False
|
||||||
|
|
||||||
with enrollment_layer.transact_writer() as transact:
|
with dyn.transact_writer() as transact:
|
||||||
transact.update(
|
transact.update(
|
||||||
key=KeyPair(new_image['id'], 'konviva'),
|
key=KeyPair(new_image['id'], 'konviva'),
|
||||||
update_expr='SET enrollment_id = :enrollment_id',
|
update_expr='SET enrollment_id = :enrollment_id',
|
||||||
|
|||||||
@@ -4,14 +4,10 @@ from aws_lambda_powertools.utilities.data_classes import (
|
|||||||
event_source,
|
event_source,
|
||||||
)
|
)
|
||||||
from aws_lambda_powertools.utilities.typing import LambdaContext
|
from aws_lambda_powertools.utilities.typing import LambdaContext
|
||||||
from layercake.dynamodb import DynamoDBPersistenceLayer
|
|
||||||
|
|
||||||
import konviva
|
import konviva
|
||||||
from boto3clients import dynamodb_client
|
|
||||||
from config import ENROLLMENT_TABLE
|
|
||||||
|
|
||||||
logger = Logger(__name__)
|
logger = Logger(__name__)
|
||||||
enrollment_layer = DynamoDBPersistenceLayer(ENROLLMENT_TABLE, dynamodb_client)
|
|
||||||
|
|
||||||
|
|
||||||
@event_source(data_class=EventBridgeEvent)
|
@event_source(data_class=EventBridgeEvent)
|
||||||
|
|||||||
@@ -14,7 +14,7 @@
|
|||||||
{"id": "6c7e3d9b-f5d1-4da4-9e55-0825bb6ff2b8", "sk": "METADATA#COURSE", "access_period": 360, "cert": {"exp_interval": 365}, "created_at": "2025-04-06T11:07:32.762178-03:00"}
|
{"id": "6c7e3d9b-f5d1-4da4-9e55-0825bb6ff2b8", "sk": "METADATA#COURSE", "access_period": 360, "cert": {"exp_interval": 365}, "created_at": "2025-04-06T11:07:32.762178-03:00"}
|
||||||
{"id": "6c7e3d9b-f5d1-4da4-9e55-0825bb6ff2b8", "sk": "METADATA#DEDUPLICATION_WINDOW", "offset_days": 90, "created_at": "2025-04-06T11:07:32.762178-03:00"}
|
{"id": "6c7e3d9b-f5d1-4da4-9e55-0825bb6ff2b8", "sk": "METADATA#DEDUPLICATION_WINDOW", "offset_days": 90, "created_at": "2025-04-06T11:07:32.762178-03:00"}
|
||||||
{"id": "6c7e3d9b-f5d1-4da4-9e55-0825bb6ff2b8", "sk": "SCHEDULE#REMINDER_ACCESS_PERIOD_BEFORE_30_DAYS"}
|
{"id": "6c7e3d9b-f5d1-4da4-9e55-0825bb6ff2b8", "sk": "SCHEDULE#REMINDER_ACCESS_PERIOD_BEFORE_30_DAYS"}
|
||||||
{"id": "6c7e3d9b-f5d1-4da4-9e55-0825bb6ff2b8", "sk": "SCHEDULE#SET_AS_EXPIRED"}
|
{"id": "6c7e3d9b-f5d1-4da4-9e55-0825bb6ff2b8", "sk": "SCHEDULE#SET_ACCESS_EXPIRED"}
|
||||||
|
|
||||||
{"id": "cc2c3bce-c34a-4e82-aa6c-1a19e70ec5ae", "sk": "0", "progress": 109, "status": "COMPLETED", "user": {"id": "321", "name": "Chester Bennington"}, "course": {"id": "432", "name": "pytest"}, "created_at": "2022-04-06T11:07:32.762178-03:00"}
|
{"id": "cc2c3bce-c34a-4e82-aa6c-1a19e70ec5ae", "sk": "0", "progress": 109, "status": "COMPLETED", "user": {"id": "321", "name": "Chester Bennington"}, "course": {"id": "432", "name": "pytest"}, "created_at": "2022-04-06T11:07:32.762178-03:00"}
|
||||||
{"id": "cc2c3bce-c34a-4e82-aa6c-1a19e70ec5ae", "sk": "METADATA#COURSE", "access_period": 360, "cert": {"exp_interval": 365}, "created_at": "2025-04-06T11:07:32.762178-03:00"}
|
{"id": "cc2c3bce-c34a-4e82-aa6c-1a19e70ec5ae", "sk": "METADATA#COURSE", "access_period": 360, "cert": {"exp_interval": 365}, "created_at": "2025-04-06T11:07:32.762178-03:00"}
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
|
import pprint
|
||||||
from http import HTTPMethod, HTTPStatus
|
from http import HTTPMethod, HTTPStatus
|
||||||
|
|
||||||
from layercake.dateutils import now
|
from layercake.dateutils import now
|
||||||
@@ -22,7 +23,7 @@ def test_start_progress(
|
|||||||
'ID_MATRICULA': '123',
|
'ID_MATRICULA': '123',
|
||||||
'APROVEITAMENTO': '23.152173913043477',
|
'APROVEITAMENTO': '23.152173913043477',
|
||||||
'ANDAMENTO': '38.888888888888886',
|
'ANDAMENTO': '38.888888888888886',
|
||||||
'status': 'IN_PROGRESS',
|
'event_name': 'UPDATING',
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
lambda_context,
|
lambda_context,
|
||||||
@@ -57,8 +58,7 @@ def test_update_progress(
|
|||||||
'ID_MATRICULA': '456',
|
'ID_MATRICULA': '456',
|
||||||
'APROVEITAMENTO': '23.152173913043477',
|
'APROVEITAMENTO': '23.152173913043477',
|
||||||
'ANDAMENTO': '12.888888888888886',
|
'ANDAMENTO': '12.888888888888886',
|
||||||
'status': 'IN_PROGRESS',
|
'event_name': 'UPDATING',
|
||||||
'event': 'Matrícula - atualização de conteúdo',
|
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
lambda_context,
|
lambda_context,
|
||||||
@@ -99,7 +99,7 @@ def test_set_as_completed(
|
|||||||
'ID_MATRICULA': '567',
|
'ID_MATRICULA': '567',
|
||||||
'APROVEITAMENTO': '89.152173913043477',
|
'APROVEITAMENTO': '89.152173913043477',
|
||||||
'ANDAMENTO': '100',
|
'ANDAMENTO': '100',
|
||||||
'status': 'COMPLETED',
|
'event_name': 'COMPLETED',
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
lambda_context,
|
lambda_context,
|
||||||
@@ -111,14 +111,14 @@ def test_set_as_completed(
|
|||||||
PartitionKey('6c7e3d9b-f5d1-4da4-9e55-0825bb6ff2b8')
|
PartitionKey('6c7e3d9b-f5d1-4da4-9e55-0825bb6ff2b8')
|
||||||
)
|
)
|
||||||
|
|
||||||
assert len(r['items']) == 7
|
assert len(r['items']) == 8
|
||||||
assert any(item.get('sk') == 'COMPLETED' for item in r['items'])
|
assert any(item.get('sk') == 'COMPLETED' for item in r['items'])
|
||||||
assert any(item.get('sk') == 'LOCK' for item in r['items'])
|
assert any(item.get('sk') == 'LOCK' for item in r['items'])
|
||||||
assert any(
|
assert any(
|
||||||
item.get('sk') == 'SCHEDULE#REMINDER_CERT_EXPIRATION_BEFORE_30_DAYS'
|
item.get('sk') == 'SCHEDULE#REMINDER_CERT_EXPIRATION_BEFORE_30_DAYS'
|
||||||
for item in r['items']
|
for item in r['items']
|
||||||
)
|
)
|
||||||
assert any(item.get('sk') == 'SCHEDULE#SET_AS_ARCHIVED' for item in r['items'])
|
assert any(item.get('sk') == 'SCHEDULE#SET_CERT_EXPIRED' for item in r['items'])
|
||||||
|
|
||||||
r = dynamodb_persistence_layer.collection.query(PartitionKey('LOCK'))
|
r = dynamodb_persistence_layer.collection.query(PartitionKey('LOCK'))
|
||||||
assert len(r['items']) == 1
|
assert len(r['items']) == 1
|
||||||
@@ -147,7 +147,7 @@ def test_set_as_failed(
|
|||||||
'ID_MATRICULA': '567',
|
'ID_MATRICULA': '567',
|
||||||
'APROVEITAMENTO': '12.152173913043477',
|
'APROVEITAMENTO': '12.152173913043477',
|
||||||
'ANDAMENTO': '100',
|
'ANDAMENTO': '100',
|
||||||
'status': 'COMPLETED',
|
'event_name': 'COMPLETED',
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
lambda_context,
|
lambda_context,
|
||||||
@@ -161,63 +161,63 @@ def test_set_as_failed(
|
|||||||
assert any(item.get('sk') == 'FAILED' for item in r['items'])
|
assert any(item.get('sk') == 'FAILED' for item in r['items'])
|
||||||
|
|
||||||
|
|
||||||
def test_set_as_archived(
|
# def test_set_as_archived(
|
||||||
app,
|
# app,
|
||||||
seeds,
|
# seeds,
|
||||||
dynamodb_persistence_layer: DynamoDBPersistenceLayer,
|
# dynamodb_persistence_layer: DynamoDBPersistenceLayer,
|
||||||
http_api_proxy: HttpApiProxy,
|
# http_api_proxy: HttpApiProxy,
|
||||||
lambda_context: LambdaContext,
|
# lambda_context: LambdaContext,
|
||||||
):
|
# ):
|
||||||
# This data was added from seeds
|
# # This data was added from seeds
|
||||||
r = app.lambda_handler(
|
# r = app.lambda_handler(
|
||||||
http_api_proxy(
|
# http_api_proxy(
|
||||||
raw_path='/',
|
# raw_path='/',
|
||||||
method=HTTPMethod.POST,
|
# method=HTTPMethod.POST,
|
||||||
body={
|
# body={
|
||||||
'ID_MATRICULA': '899',
|
# 'ID_MATRICULA': '899',
|
||||||
'APROVEITAMENTO': '70',
|
# 'APROVEITAMENTO': '70',
|
||||||
'ANDAMENTO': '100',
|
# 'ANDAMENTO': '100',
|
||||||
'status': 'COMPLETED',
|
# 'status': 'COMPLETED',
|
||||||
},
|
# },
|
||||||
),
|
# ),
|
||||||
lambda_context,
|
# lambda_context,
|
||||||
)
|
# )
|
||||||
assert r['statusCode'] == HTTPStatus.NO_CONTENT
|
# assert r['statusCode'] == HTTPStatus.NO_CONTENT
|
||||||
|
|
||||||
# Check `seeds.jsonl` for sample data related to this query
|
# # Check `seeds.jsonl` for sample data related to this query
|
||||||
r = dynamodb_persistence_layer.collection.query(
|
# r = dynamodb_persistence_layer.collection.query(
|
||||||
PartitionKey('cc2c3bce-c34a-4e82-aa6c-1a19e70ec5ae')
|
# PartitionKey('cc2c3bce-c34a-4e82-aa6c-1a19e70ec5ae')
|
||||||
)
|
# )
|
||||||
assert any(item.get('sk') == 'ARCHIVED' for item in r['items'])
|
# assert any(item.get('sk') == 'ARCHIVED' for item in r['items'])
|
||||||
assert len(r['items']) == 4
|
# assert len(r['items']) == 4
|
||||||
|
|
||||||
|
|
||||||
def test_set_as_expired(
|
# def test_set_as_expired(
|
||||||
app,
|
# app,
|
||||||
seeds,
|
# seeds,
|
||||||
dynamodb_persistence_layer: DynamoDBPersistenceLayer,
|
# dynamodb_persistence_layer: DynamoDBPersistenceLayer,
|
||||||
http_api_proxy: HttpApiProxy,
|
# http_api_proxy: HttpApiProxy,
|
||||||
lambda_context: LambdaContext,
|
# lambda_context: LambdaContext,
|
||||||
):
|
# ):
|
||||||
# This data was added from seeds
|
# # This data was added from seeds
|
||||||
r = app.lambda_handler(
|
# r = app.lambda_handler(
|
||||||
http_api_proxy(
|
# http_api_proxy(
|
||||||
raw_path='/',
|
# raw_path='/',
|
||||||
method=HTTPMethod.POST,
|
# method=HTTPMethod.POST,
|
||||||
body={
|
# body={
|
||||||
'ID_MATRICULA': '221',
|
# 'ID_MATRICULA': '221',
|
||||||
'APROVEITAMENTO': '69',
|
# 'APROVEITAMENTO': '69',
|
||||||
'ANDAMENTO': '100',
|
# 'ANDAMENTO': '100',
|
||||||
'status': 'COMPLETED',
|
# 'status': 'COMPLETED',
|
||||||
},
|
# },
|
||||||
),
|
# ),
|
||||||
lambda_context,
|
# lambda_context,
|
||||||
)
|
# )
|
||||||
assert r['statusCode'] == HTTPStatus.NO_CONTENT
|
# assert r['statusCode'] == HTTPStatus.NO_CONTENT
|
||||||
|
|
||||||
# Check `seeds.jsonl` for sample data related to this query
|
# # Check `seeds.jsonl` for sample data related to this query
|
||||||
r = dynamodb_persistence_layer.collection.query(
|
# r = dynamodb_persistence_layer.collection.query(
|
||||||
PartitionKey('5db53b35-0bae-4907-afda-a213cb5bf651')
|
# PartitionKey('5db53b35-0bae-4907-afda-a213cb5bf651')
|
||||||
)
|
# )
|
||||||
assert any(item.get('sk') == 'EXPIRED' for item in r['items'])
|
# assert any(item.get('sk') == 'EXPIRED' for item in r['items'])
|
||||||
assert len(r['items']) == 3
|
# assert len(r['items']) == 3
|
||||||
|
|||||||
Reference in New Issue
Block a user