1+ import json
2+ import logging
3+ import dataclasses
4+ import typing
5+
6+ import azure .functions as func
7+
8+ from ... import _domain
9+ from ... import _infrastructure
10+
11+ _JSON_PATH = (
12+ 'time_entries/_infrastructure/_data_persistence/activities_data.json'
13+ )
14+
15+
16+ def create_activity (req : func .HttpRequest ) -> func .HttpResponse :
17+ activity_dao = _infrastructure .ActivitiesJsonDao (_JSON_PATH )
18+ activity_service = _domain .ActivityService (activity_dao )
19+ use_case = _domain ._use_cases .CreateActivityUseCase (activity_service )
20+
21+
22+ activity_data = req .get_json ()
23+
24+
25+ validation_errors = _validate_activity (activity_data )
26+ if validation_errors :
27+ return func .HttpResponse (
28+ body = validation_errors , status_code = 400 , mimetype = "application/json"
29+ )
30+
31+
32+ activity_to_create = _domain .Activity (
33+ id = None ,
34+ name = activity_data ['name' ],
35+ description = activity_data ['description' ],
36+ status = activity_data ['status' ],
37+ deleted = activity_data ['deleted' ],
38+ tenant_id = activity_data ['tenant_id' ]
39+ )
40+
41+
42+ created_activity = use_case .create_activity (activity_to_create .__dict__ )
43+ if not create_activity :
44+ return func .HttpResponse (
45+ body = {'error' : 'activity could not be created' },
46+ status_code = 500 ,
47+ mimetype = "application/json" ,
48+ )
49+ return func .HttpResponse (
50+ body = json .dumps (created_activity .__dict__ ),
51+ status_code = 201 ,
52+ mimetype = "application/json"
53+ )
54+
55+
56+ def _validate_activity (activity_data : dict ) -> typing .List [str ]:
57+ activity_fields = [field .name for field in dataclasses .fields (_domain .Activity )]
58+ missing_keys = [field for field in activity_fields if field not in activity_data ]
59+ return [
60+ f'The { missing_key } key is missing in the input data'
61+ for missing_key in missing_keys
62+ ]
0 commit comments