Skip to content

Commit b505523

Browse files
Added relationship compatibility
1 parent e487be7 commit b505523

File tree

10 files changed

+248
-196
lines changed

10 files changed

+248
-196
lines changed

Hawaii-Cli/.gitignore

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,4 +11,6 @@
1111
.localhistory/
1212
.vs/
1313
*.code-workspace
14-
/nupkg/*-alpha.nupkg
14+
15+
# Nuget package
16+
/nupkg

Hawaii-Cli/.vscode/launch.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,14 +11,14 @@
1111
"preLaunchTask": "build",
1212
// If you have changed target frameworks, make sure to update the program path.
1313
"program": "${workspaceFolder}/bin/Debug/net6.0/hawaii-cli.dll",
14-
// "args": ["init", "-n", "dev-test", "--database_type", "mysql", "--connection_string", "sadasdasdas"],
14+
"args": ["init", "-n", "dev-test", "--database-type", "mysql", "--connection-string", "sadasdasdas"],
1515
// "args": ["add", "todo", "-n", "dev-test", "--source", "s001.todo", "--rest", "todo", "--graphql", "todo", "--permissions", "anonymous:*"],
1616
// "args": ["add", "category", "-n", "dev-test", "--source", "s001.category", "--rest", "category", "--graphql", "category", "--permissions", "anonymous:create,read,update"],
1717
// "args": ["add", "books", "-n", "dev-test", "--source", "s001.books", "--rest", "books", "--graphql", "books", "--permissions", "anonymous:create,read,update", "--fields.include", "id,type,review"],
1818
// "args": ["add", "review", "-n", "dev-test", "--source", "s001.review", "--rest", "true", "--graphql", "review", "--permissions", "anonymous:update", "--fields.exclude", "id,time"],
1919
// "args": ["update", "review", "-n", "dev-test", "--source", "s001.reviews", "--rest", "review", "--graphql", "review", "--permissions", "authenticate:create", "--fields.include", "content,rating"],
2020
// "args": ["update", "books", "-n", "dev-test", "--source", "s001.books", "--rest", "books", "--graphql", "books", "--permissions", "anonymous:update,delete", "--fields.include", "content,rating"],
21-
"args": ["update", "books", "-n", "dev-test", "--permissions", "anonymous:update", "--fields.exclude", "id,content,rating"],
21+
// "args": ["update", "books", "-n", "dev-test", "--permissions", "anonymous:update", "--fields.exclude", "id,content,rating"],
2222
// "args": ["--help"],
2323
"cwd": "${workspaceFolder}",
2424
// For more information about the 'console' field, see https://aka.ms/VSCode-CS-LaunchJson-Console

Hawaii-Cli/Classes/CommandLineOptions.cs

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,10 @@ public sealed class CommandLineOptions
88
[Option('n', "name", Required = false, HelpText = "file name")]
99
public String? name { get; set; }
1010

11-
[Option("database_type", Required = false, HelpText = "Type of database to connect")]
11+
[Option("database-type", Required = false, HelpText = "Type of database to connect")]
1212
public String? databaseType { get; set; }
1313

14-
[Option("connection_string", Required = false, HelpText = "Connection details to connect to database")]
14+
[Option("connection-string", Required = false, HelpText = "Connection details to connect to database")]
1515
public String? connectionString { get; set; }
1616

1717
//TODO: Link options with Specidied commands
@@ -27,15 +27,27 @@ public sealed class CommandLineOptions
2727
[Option("graphql", Required = false, HelpText = "Type of graphQL")]
2828
public String? graphQLType { get; set; }
2929

30-
[Option("permissions", Required = false, HelpText = "permission required to acess source table")]
31-
public String? permissions { get; set; }
30+
[Option("permission", Required = false, HelpText = "permission required to acess source table")]
31+
public String? permission { get; set; }
3232

3333
[Option("fields.include", Required = false, HelpText = "fields that are allowed access to permission")]
3434
public String? fieldsToInclude { get; set; }
3535

3636
[Option("fields.exclude", Required = false, HelpText = "fields that are excluded from the action lists")]
3737
public String? fieldsToExclude { get; set; }
3838

39+
[Option("relationship", Required = false, HelpText = "specify relationship between two entities")]
40+
public String? relationship { get; set; }
41+
42+
[Option("target.entity", Required = false, HelpText = "specify relationship between two entities")]
43+
public String? targetEntity { get; set; }
44+
45+
[Option("cardinality", Required = false, HelpText = "specify relationship between two entities")]
46+
public String? cardinality { get; set; }
47+
48+
[Option("mapping.fields", Required = false, HelpText = "specify relationship between two entities")]
49+
public String? mappingFields { get; set; }
50+
3951
[Option(Default = false, HelpText = "Prints all messages to standard output.")]
4052
public bool Verbose { get; set; }
4153

Hawaii-Cli/Classes/ConfigGenerator.cs

Lines changed: 88 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,8 @@ public static bool GenerateConfig(string fileName, string database_type, string
1616

1717
string schema = Directory.GetCurrentDirectory().Replace("\\", "/") + "/" + file;
1818

19-
RuntimeConfig runtimeConfig = new RuntimeConfig(schema, dataSource, null, null, null, null, null, new Dictionary<string, Entity>());
19+
20+
RuntimeConfig runtimeConfig = new RuntimeConfig(schema, dataSource, null, null, null, null, GetDefaultGlobalSettings(), new Dictionary<string, Entity>());
2021

2122
string JSONresult = JsonSerializer.Serialize(runtimeConfig, GetSerializationOptions());
2223

@@ -28,10 +29,11 @@ public static bool GenerateConfig(string fileName, string database_type, string
2829
}
2930

3031
public static bool AddEntitiesToConfig(string fileName, string entity,
31-
object source, string permissions,
32-
object? rest, object? graphQL, string? fieldsToInclude, string? fieldsToExclude)
32+
object source, string permissions,
33+
object? rest, object? graphQL,
34+
string? fieldsToInclude, string? fieldsToExclude)
3335
{
34-
string file = fileName + ".json";
36+
string file = $"{fileName}.json";
3537

3638
if (!File.Exists(file))
3739
{
@@ -56,15 +58,17 @@ public static bool AddEntitiesToConfig(string fileName, string entity,
5658
}
5759

5860
runtimeConfig.Entities.Add(entity, entity_details);
59-
Console.WriteLine(runtimeConfig.ToString());
6061
string JSONresult = JsonSerializer.Serialize(runtimeConfig, options);
6162
File.WriteAllText(file, JSONresult);
6263
return true;
6364
}
6465

6566
public static bool UpdateEntity(string fileName, string entity,
66-
object? source, string? permissions,
67-
object? rest, object? graphQL, string? fieldsToInclude, string? fieldsToExclude) {
67+
object? source, string? permissions,
68+
object? rest, object? graphQL,
69+
string? fieldsToInclude, string? fieldsToExclude,
70+
string? relationship, string? targetEntity,
71+
string? cardinality, string? mappingFields) {
6872

6973
string file = fileName + ".json";
7074
string jsonString = File.ReadAllText(file);
@@ -89,7 +93,7 @@ public static bool UpdateEntity(string fileName, string entity,
8993
if(permissions!=null) {
9094
string[] permission_array = permissions.Split(":");
9195
string new_role = permission_array[0];
92-
string new_action = permission_array[1]; //TODO: make sure action is a single item here
96+
string new_action = permission_array[1];
9397
var dict = Array.Find(updatedEntity.Permissions, item => item.Role == new_role);
9498
PermissionSetting[] updatedPermissions;
9599
List<PermissionSetting> permissionSettingsList = new List<PermissionSetting>();
@@ -137,9 +141,6 @@ public static bool UpdateEntity(string fileName, string entity,
137141
if(new_action_element.Equals(operation)) {
138142
action_list.Add(Action.GetAction(operation, fieldsToInclude, fieldsToExclude));
139143
} else {
140-
// if(JsonValueKind.String.Equals(action_element.ValueKind)) {
141-
// return Action.GetAction(element.ToString(), null);
142-
// }
143144
action_list.Add(action_element);
144145
}
145146
}
@@ -159,6 +160,82 @@ public static bool UpdateEntity(string fileName, string entity,
159160
return true;
160161
}
161162
}
163+
if(relationship!=null) {
164+
//if it's an existing relation
165+
if(updatedEntity.Relationships!=null && updatedEntity.Relationships.ContainsKey(relationship)) {
166+
Relationship currentRelationship = updatedEntity.Relationships[relationship];
167+
Dictionary<string, Relationship> relationship_mapping = new Dictionary<string, Relationship>();
168+
Relationship updatedRelationship = currentRelationship;
169+
if(cardinality!=null) {
170+
Cardinality cardinalityType;
171+
try
172+
{
173+
cardinalityType = GetCardinalityTypeFromString(cardinality);
174+
}
175+
catch (System.NotSupportedException)
176+
{
177+
Console.WriteLine($"Given Cardinality: {cardinality} not supported. Currently supported options: one or many.");
178+
return false;
179+
}
180+
updatedRelationship = new Relationship(cardinalityType, updatedRelationship.TargetEntity, updatedRelationship.SourceFields, updatedRelationship.TargetFields, updatedRelationship.LinkingObject, updatedRelationship.LinkingSourceFields, updatedRelationship.LinkingTargetFields);
181+
}
182+
if(targetEntity!=null) {
183+
updatedRelationship = new Relationship(updatedRelationship.Cardinality, targetEntity, updatedRelationship.SourceFields, updatedRelationship.TargetFields, updatedRelationship.LinkingObject, updatedRelationship.LinkingSourceFields, updatedRelationship.LinkingTargetFields);
184+
}
185+
if(mappingFields!=null) {
186+
string[]? sourceAndTargetFields = null;
187+
string[]? sourceFields = null;
188+
string[]? targetFields = null;
189+
try
190+
{
191+
sourceAndTargetFields = mappingFields.Split(":");
192+
sourceFields = sourceAndTargetFields[0].Split(",");
193+
targetFields = sourceAndTargetFields[1].Split(",");
194+
}
195+
catch (System.Exception)
196+
{
197+
Console.WriteLine($"ERROR: Please use correct format for --mappings.fields, It should be \"<<source.fields>>:<<target.fields>>\".");
198+
return false;
199+
}
200+
updatedRelationship = new Relationship(updatedRelationship.Cardinality, updatedRelationship.TargetEntity, sourceFields, targetFields, updatedRelationship.LinkingObject, updatedRelationship.LinkingSourceFields, updatedRelationship.LinkingTargetFields);
201+
updatedEntity.Relationships[relationship] = updatedRelationship;
202+
}
203+
} else { // if it's a new relationship
204+
if(cardinality!=null && targetEntity!=null && mappingFields!=null) {
205+
Dictionary<string, Relationship> relationship_mapping = updatedEntity.Relationships==null ? new Dictionary<string, Relationship>(): updatedEntity.Relationships;
206+
Cardinality cardinalityType;
207+
try
208+
{
209+
cardinalityType = GetCardinalityTypeFromString(cardinality);
210+
}
211+
catch (System.NotSupportedException)
212+
{
213+
Console.WriteLine($"Given Cardinality: {cardinality} not supported. Currently supported options: one or many.");
214+
return false;
215+
}
216+
string[]? sourceAndTargetFields = null;
217+
string[]? sourceFields = null;
218+
string[]? targetFields = null;
219+
try
220+
{
221+
sourceAndTargetFields = mappingFields.Split(":");
222+
sourceFields = sourceAndTargetFields[0].Split(",");
223+
targetFields = sourceAndTargetFields[1].Split(",");
224+
}
225+
catch (System.Exception)
226+
{
227+
Console.WriteLine($"ERROR: Please use correct format for --mappings.fields, It should be \"<<source.fields>>:<<target.fields>>\".");
228+
return false;
229+
}
230+
231+
relationship_mapping.Add(relationship, new Relationship(cardinalityType, targetEntity, sourceFields, targetFields, null, null, null));
232+
updatedEntity = new Entity(updatedEntity.Source, updatedEntity.Rest, updatedEntity.GraphQL, updatedEntity.Permissions, relationship_mapping, updatedEntity.Mappings);
233+
} else {
234+
Console.WriteLine($"ERROR: For adding a new relationship following options are mandatory: --relationship, --cardinality, --target.entity, --mappings.field.");
235+
return false;
236+
}
237+
}
238+
}
162239

163240
runtimeConfig.Entities[entity] = updatedEntity;
164241
string JSONresult = JsonSerializer.Serialize(runtimeConfig, options);

Hawaii-Cli/Classes/Operations.cs

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ public static void Init(CommandLineOptions options)
2323
if (databaseType == null || connectionString == null)
2424
{
2525
Console.WriteLine(@"Please check if any required arguments are not missing.
26-
Required options: --database_type, --connection_string");
26+
Required options: --database-type, --connection-string");
2727
return;
2828
}
2929
bool isSuccess = ConfigGenerator.GenerateConfig(fileName, databaseType, connectionString);
@@ -41,7 +41,7 @@ public static void Add(string entity, CommandLineOptions options)
4141
var source = options.source;
4242
var rest = options.restRoute;
4343
var graphQL = options.graphQLType;
44-
var permissions = options.permissions;
44+
var permissions = options.permission;
4545
var fieldsToInclude = options.fieldsToInclude;
4646
var fieldsToExclude = options.fieldsToExclude;
4747

@@ -72,15 +72,19 @@ public static void Update(string entity, CommandLineOptions options)
7272
var source = options.source;
7373
var rest = options.restRoute;
7474
var graphQL = options.graphQLType;
75-
var permissions = options.permissions;
75+
var permission = options.permission;
7676
var fieldsToInclude = options.fieldsToInclude;
7777
var fieldsToExclude = options.fieldsToExclude;
78+
var relationship = options.relationship;
79+
var targetEntity = options.targetEntity;
80+
var cardinality = options.cardinality;
81+
var mappingFields = options.mappingFields;
7882

7983
if(fileName == null) {
8084
Console.WriteLine("Using default file hawaii-config");
8185
fileName = DEFAULT_CONFIG_FILENAME;
8286
}
83-
bool isSuccess = ConfigGenerator.UpdateEntity(fileName, entity, source, permissions, rest, graphQL, fieldsToInclude, fieldsToExclude);
87+
bool isSuccess = ConfigGenerator.UpdateEntity(fileName, entity, source, permission, rest, graphQL, fieldsToInclude, fieldsToExclude, relationship, targetEntity, cardinality, mappingFields);
8488
if(isSuccess) {
8589
Console.WriteLine($"Updated entity:{entity} in the config.");
8690
} else {

Hawaii-Cli/Classes/Utils.cs

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,9 @@ public static Boolean IsBooleanValue(string str) {
9090

9191
public static object[] CreateActions(string actions, string? fieldsToInclude, string? fieldsToExclude) {
9292
object[] action_items;
93+
if(fieldsToInclude==null && fieldsToExclude==null) {
94+
return actions.Split(",");
95+
}
9396
if("*".Equals(actions)){
9497
action_items = new object[]{Action.GetAction(actions, fieldsToInclude, fieldsToExclude)};
9598
} else {
@@ -123,6 +126,7 @@ public static PermissionSetting[] AddNewPermissions(PermissionSetting[] currentP
123126
public static JsonSerializerOptions GetSerializationOptions() {
124127
JsonSerializerOptions options = new JsonSerializerOptions { WriteIndented = true, DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull };
125128
options.Converters.Add(new JsonStringEnumConverter());
129+
// options.Converters.Add(new )
126130

127131
return options;
128132
}
@@ -144,24 +148,20 @@ public static string GetCRUDOperation(JsonElement op) {
144148
return (Action.ToObject(op)).action;
145149
}
146150

147-
// public static Boolean IsString(JsonElement action) {
148-
149-
// }
150-
151-
// public static Boolean IsOneOfCRUDOperation(JsonElement action) {
152-
// if((JsonValueKind.String.Equals(action.ValueKind)) && ("create".Equals(action.ToString()) || "read".Equals(action.ToString()) || "update".Equals(action.ToString()) || "delete".Equals(action.ToString()))) {
153-
// return true;
154-
// }
155-
// return false;
156-
// }
151+
public static Cardinality GetCardinalityTypeFromString(string cardinality) {
152+
if("one".Equals(cardinality, StringComparison.OrdinalIgnoreCase)) return Cardinality.One;
153+
else if("many".Equals(cardinality, StringComparison.OrdinalIgnoreCase)) return Cardinality.Many;
154+
else {
155+
throw new NotSupportedException();
156+
}
157+
}
157158

158-
// public static Action ToObject(JsonElement element)
159-
// {
160-
// if(JsonValueKind.String.Equals(element.ValueKind)) {
161-
// return Action.GetAction(element.ToString(), new Dictionary<string, string[]>());
162-
// }
163-
// var json = element.GetRawText();
164-
// return JsonSerializer.Deserialize<Action>(json);
165-
// }
159+
public static Dictionary<GlobalSettingsType, object> GetDefaultGlobalSettings() {
160+
Dictionary<GlobalSettingsType, object> defaultGlobalSettings = new ();
161+
defaultGlobalSettings.Add(GlobalSettingsType.Rest, new RestGlobalSettings());
162+
defaultGlobalSettings.Add(GlobalSettingsType.GraphQL, new GraphQLGlobalSettings());
163+
defaultGlobalSettings.Add(GlobalSettingsType.Host, new HostGlobalSettings());
164+
return defaultGlobalSettings;
165+
}
166166
}
167167
}

Hawaii-Cli/Program.cs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
11
using Hawaii.Cli.Classes;
22

3-
var command = args.AsQueryable().FirstOrDefault();
4-
53
Console.WriteLine("Welcome to Hawaii.Cli");
64
CommandLineHelp.ParseArguments(args);
75

0 commit comments

Comments
 (0)