Skip to content

Commit d6fb0d6

Browse files
committed
Added filters and filtering conditions for Date and DateTime
1 parent 3031edf commit d6fb0d6

File tree

3 files changed

+63
-9
lines changed

3 files changed

+63
-9
lines changed

graphql-api-generator/generator.py

Lines changed: 25 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -49,8 +49,15 @@ def cmd(args):
4949

5050

5151
def run(schema: GraphQLSchema, config: dict):
52+
#Avoid some weird config combinations
53+
config.get('generation')['generate_datetime'] = config.get('generation').get('generate_datetime') or config.get('generation').get('field_for_creation_date') or config.get('generation').get('field_for_last_update_date')
54+
55+
# check if Date exists, or should be added
56+
# If it already exists (in the excpected way, we handle it as if we added it
57+
config.get('generation')['generate_date'] = date_control(schema, config.get('generation').get('generate_date'))
58+
5259
# check if DateTime exists, or should be added
53-
if config.get('generation').get('generate_datetime') or config.get('generation').get('field_for_creation_date') or config.get('generation').get('field_for_last_update_date'):
60+
if config.get('generation').get('generate_datetime'):
5461
datetime_control(schema)
5562

5663
# validate
@@ -95,8 +102,8 @@ def run(schema: GraphQLSchema, config: dict):
95102
schema = add_get_queries(schema)
96103
if config.get('generation').get('query_type_filter') or config.get('generation').get('query_list_of'):
97104
schema = add_enum_filters(schema)
98-
schema = add_scalar_filters(schema)
99-
schema = add_type_filters(schema)
105+
schema = add_scalar_filters(schema, config)
106+
schema = add_type_filters(schema, config.get('generation').get('field_for_creation_date'), config.get('generation').get('field_for_last_update_date'))
100107

101108
if config.get('generation').get('query_type_filter'):
102109
schema = add_object_type_filters(schema)
@@ -273,6 +280,21 @@ def datetime_control(schema):
273280
raise Exception('DateTime could not be added as scalar!')
274281

275282

283+
def date_control(schema, config: dict):
284+
type_names = set(schema.type_map.keys())
285+
if 'Date' in type_names:
286+
if not is_scalar_type(schema.type_map['Date']):
287+
raise Exception('Date exists but is not scalar type: ' + schema.type_map['Date'])
288+
return True
289+
elif config.get('generation').get('generate_date'):
290+
schema.type_map['Date'] = GraphQLScalarType('Date')
291+
if not is_scalar_type(schema.type_map['Date']):
292+
raise Exception('Date could not be added as scalar!')
293+
return True
294+
return False
295+
296+
297+
276298
if __name__ == '__main__':
277299
parser = argparse.ArgumentParser()
278300
parser.add_argument('--input', type=str, required=True,

graphql-api-generator/resources/config.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@ generation:
1212
add_mutation_type: true
1313
# add id field to all schema types
1414
field_for_id: true
15+
# add the Data scalar
16+
generate_date: false
1517
# add creation date and last update date field(s) to all schema types
1618
generate_datetime: false
1719
field_for_creation_date: false

graphql-api-generator/utils/utils.py

Lines changed: 36 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -412,13 +412,15 @@ def add_list_queries(schema: GraphQLSchema):
412412
return schema
413413

414414

415-
def add_scalar_filters(schema: GraphQLSchema):
415+
def add_scalar_filters(schema: GraphQLSchema, config: dict):
416416
"""
417417
Add filter inputs for GrahpQL types (Hasura-style).
418418
:param schema:
419419
:return:
420420
"""
421421
make = ''
422+
manually_handled_scalars = ['Int', 'Float', 'String', 'Boolean', 'ID']
423+
422424
# Numeric
423425
scalars = ['Int', 'Float']
424426
for scalar in scalars:
@@ -471,9 +473,37 @@ def add_scalar_filters(schema: GraphQLSchema):
471473
' _neq: Boolean ' \
472474
'} '
473475

476+
# Date
477+
if config.get('generation').get('generate_date'):
478+
manually_handled_scalars.append('Date')
479+
make += 'input _DateFilter {' \
480+
' _eq: Date ' \
481+
' _neq: Date ' \
482+
' _in: [Date] ' \
483+
' _nin: [Date] ' \
484+
' _gt: Date ' \
485+
' _egt: Date ' \
486+
' _lt: Date ' \
487+
' _elt: Date ' \
488+
'} '
489+
490+
# DateTime
491+
if config.get('generation').get('generate_datetime'):
492+
manually_handled_scalars.append('DateTime')
493+
make += 'input _DateTimeFilter {' \
494+
' _eq: DateTime ' \
495+
' _neq: DateTime ' \
496+
' _in: [DateTime] ' \
497+
' _nin: [DateTime] ' \
498+
' _gt: DateTime ' \
499+
' _egt: DateTime ' \
500+
' _lt: DateTime ' \
501+
' _elt: DateTime ' \
502+
'} '
503+
474504
# Schema-defined scalars
475505
for scalar_name, scalar in schema.type_map.items():
476-
if not is_scalar_type(scalar) or scalar_name in ['Int', 'Float', 'String', 'Boolean', 'ID']:
506+
if not is_scalar_type(scalar) or scalar_name in manually_handled_scalars:
477507
continue
478508

479509
make += f'input _{scalar_name}Filter {{' \
@@ -488,7 +518,7 @@ def add_scalar_filters(schema: GraphQLSchema):
488518
return schema
489519

490520

491-
def add_type_filters(schema: GraphQLSchema):
521+
def add_type_filters(schema: GraphQLSchema, field_for_creation_date, field_for_last_update_date):
492522
"""
493523
Add filter types (Hasura-style filters).
494524
:param schema: schema
@@ -505,7 +535,7 @@ def add_type_filters(schema: GraphQLSchema):
505535
f' _not: _FilterFor{_type.name} '
506536

507537
for field_name, field in _type.fields.items():
508-
if field_name[0] == '_':
538+
if field_name[0] == '_' and not (field_for_creation_date and field_name == '_creationDate') and not (field_for_last_update_date and field_name == '_lastUpdateDate'):
509539
continue
510540

511541
# remove outer required
@@ -565,9 +595,9 @@ def add_edge_objects(schema: GraphQLSchema, field_for_creation_date, field_for_l
565595
creation_date_string = ''
566596
last_update_date_string = ''
567597
if field_for_creation_date:
568-
creation_date_string = '_creationDate: Date!'
598+
creation_date_string = '_creationDate: DateTime!'
569599
if field_for_last_update_date:
570-
last_update_date_string = '_lastUpdateDate: Date'
600+
last_update_date_string = '_lastUpdateDate: DateTime'
571601
for _type in schema.type_map.values():
572602
if not is_schema_defined_type(_type) or is_interface_type(_type):
573603
continue

0 commit comments

Comments
 (0)