Skip to content

Commit

Permalink
Merge branch hotfix to master.
Browse files Browse the repository at this point in the history
  • Loading branch information
makosovic committed Oct 20, 2015
2 parents e157d14 + 6f47a26 commit 5e02efd
Show file tree
Hide file tree
Showing 92 changed files with 726 additions and 222 deletions.
30 changes: 26 additions & 4 deletions DreamFactory.AddressBook/Controllers/ContactController.cs
Original file line number Diff line number Diff line change
Expand Up @@ -57,8 +57,21 @@ public async Task<ActionResult> List(int? groupId, int offset = 0, int limit = 1

contacts = result.Records.Select(x => x.Contact);

ViewBag.GroupName = result.Records.Select(x => x.ContactGroup.Name).FirstOrDefault();
ViewBag.TotalResults = result.Meta.Count;
if (result.Records.Any())
{
ViewBag.GroupName = result.Records.Select(x => x.ContactGroup.Name).FirstOrDefault();
}
else
{
query = new SqlQuery
{
Filter = "id = " + groupId
};

DatabaseResourceWrapper<ContactGroup> contactGroupResult = await databaseApi.GetRecordsAsync<ContactGroup>("contact_group", query);
ViewBag.GroupName = contactGroupResult.Records.Select(x => x.Name).FirstOrDefault();
}
}
else
{
Expand Down Expand Up @@ -106,7 +119,11 @@ public async Task<ActionResult> Create(ContactCreateViewModel model)
return View(model);
}

model.Contact.ImageUrl = await UploadImage(model.ImageUpload) ?? model.Contact.ImageUrl;
string result = await UploadImage(model.ImageUpload);
if (result != null)
{
model.Contact.ImageUrl = DreamFactoryContext.BaseAddress + "/files/" + result;
}

IEnumerable<Contact> records = new List<Contact> { model.Contact };
records = (await databaseApi.CreateRecordsAsync("contact", records, new SqlQuery())).Records;
Expand Down Expand Up @@ -170,7 +187,12 @@ public async Task<ActionResult> Edit(ContactViewModel model)
return View(model);
}

model.Contact.ImageUrl = await UploadImage(model.ImageUpload) ?? model.Contact.ImageUrl;
string result = await UploadImage(model.ImageUpload);
if (result != null)
{
model.Contact.ImageUrl = DreamFactoryContext.BaseAddress + "/files/" + result;
}

await databaseApi.UpdateRecordsAsync("contact", new List<Contact> { model.Contact }, new SqlQuery());

return RedirectToAction("List", Request.QueryString.ToRouteValues(new { GroupId = model.GroupId }));
Expand All @@ -189,7 +211,7 @@ public async Task<ActionResult> Details(int id)
string imageData = string.Empty;
if (!string.IsNullOrEmpty(contact.ImageUrl))
{
imageData = await filesApi.GetTextFileAsync(contact.ImageUrl);
imageData = await filesApi.GetTextFileAsync(contact.ImageUrl.Split('/').Last());
}

ContactViewModel model = new ContactViewModel
Expand Down
7 changes: 7 additions & 0 deletions DreamFactory.AddressBook/Models/Entities/Contact.cs
Original file line number Diff line number Diff line change
Expand Up @@ -7,28 +7,35 @@

public class Contact
{
[JsonProperty(PropertyName = "id")]
public int? Id { get; set; }

[JsonProperty(PropertyName = "first_name")]
[Display(Name = "First name")]
[Required(ErrorMessageResourceType = typeof(Resources), ErrorMessageResourceName = "ErrorMessage_Required", ErrorMessage = null)]
[MaxLength(40, ErrorMessageResourceType = typeof(Resources), ErrorMessageResourceName = "ErrorMessage_MaxLength", ErrorMessage = null)]
public string FirstName { get; set; }

[JsonProperty(PropertyName = "last_name")]
[Display(Name = "Last name")]
[Required(ErrorMessageResourceType = typeof(Resources), ErrorMessageResourceName = "ErrorMessage_Required", ErrorMessage = null)]
[MaxLength(40, ErrorMessageResourceType = typeof(Resources), ErrorMessageResourceName = "ErrorMessage_MaxLength", ErrorMessage = null)]
public string LastName { get; set; }

[JsonProperty(PropertyName = "image_url")]
public string ImageUrl { get; set; }

[JsonProperty(PropertyName = "twitter")]
[Display(Name = "Twitter handle")]
[MaxLength(18, ErrorMessageResourceType = typeof(Resources), ErrorMessageResourceName = "ErrorMessage_MaxLength", ErrorMessage = null)]
public string Twitter { get; set; }

[JsonProperty(PropertyName = "skype")]
[Display(Name = "Skype name")]
[MaxLength(255, ErrorMessageResourceType = typeof(Resources), ErrorMessageResourceName = "ErrorMessage_MaxLength", ErrorMessage = null)]
public string Skype { get; set; }

[JsonProperty(PropertyName = "notes")]
[Display(Name = "Notes")]
public string Notes { get; set; }

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,13 @@

public class ContactContactGroup
{
[JsonProperty(PropertyName = "id")]
public int? Id { get; set; }

[JsonProperty(PropertyName = "contact_id")]
public int? ContactId { get; set; }

[JsonProperty(PropertyName = "contact_group_id")]
public int? ContactGroupId { get; set; }

[JsonProperty(PropertyName = "contact_by_contact_id")]
Expand Down
2 changes: 2 additions & 0 deletions DreamFactory.AddressBook/Models/Entities/ContactGroup.cs
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,10 @@

public class ContactGroup
{
[JsonProperty(PropertyName = "id")]
public int? Id { get; set; }

[JsonProperty(PropertyName = "name")]
[Display(Name = "Name")]
[Required(ErrorMessageResourceType = typeof(Resources), ErrorMessageResourceName = "ErrorMessage_Required", ErrorMessage = null)]
[MaxLength(128, ErrorMessageResourceType = typeof(Resources), ErrorMessageResourceName = "ErrorMessage_MaxLength", ErrorMessage = null)]
Expand Down
11 changes: 11 additions & 0 deletions DreamFactory.AddressBook/Models/Entities/ContactInfo.cs
Original file line number Diff line number Diff line change
Expand Up @@ -6,45 +6,56 @@

public class ContactInfo
{
[JsonProperty(PropertyName = "id")]
public int? Id { get; set; }

[JsonProperty(PropertyName = "ordinal")]
public int? Ordinal { get; set; }

[JsonProperty(PropertyName = "contact_id")]
[Required(ErrorMessageResourceType = typeof(Resources), ErrorMessageResourceName = "ErrorMessage_Required", ErrorMessage = null)]
public int? ContactId { get; set; }

[JsonProperty(PropertyName = "info_type")]
public string InfoType { get; set; }

[JsonProperty(PropertyName = "phone")]
[Display(Name = "Phone")]
[Required(ErrorMessageResourceType = typeof(Resources), ErrorMessageResourceName = "ErrorMessage_Required", ErrorMessage = null)]
[MaxLength(32, ErrorMessageResourceType = typeof(Resources), ErrorMessageResourceName = "ErrorMessage_MaxLength", ErrorMessage = null)]
public string Phone { get; set; }

[JsonProperty(PropertyName = "email")]
[Display(Name = "Email")]
[Required(ErrorMessageResourceType = typeof(Resources), ErrorMessageResourceName = "ErrorMessage_Required", ErrorMessage = null)]
[MaxLength(255, ErrorMessageResourceType = typeof(Resources), ErrorMessageResourceName = "ErrorMessage_MaxLength", ErrorMessage = null)]
public string Email { get; set; }

[JsonProperty(PropertyName = "address")]
[Display(Name = "Address")]
[Required(ErrorMessageResourceType = typeof(Resources), ErrorMessageResourceName = "ErrorMessage_Required", ErrorMessage = null)]
[MaxLength(255, ErrorMessageResourceType = typeof(Resources), ErrorMessageResourceName = "ErrorMessage_MaxLength", ErrorMessage = null)]
public string Address { get; set; }

[JsonProperty(PropertyName = "city")]
[Display(Name = "City")]
[Required(ErrorMessageResourceType = typeof(Resources), ErrorMessageResourceName = "ErrorMessage_Required", ErrorMessage = null)]
[MaxLength(64, ErrorMessageResourceType = typeof(Resources), ErrorMessageResourceName = "ErrorMessage_MaxLength", ErrorMessage = null)]
public string City { get; set; }

[JsonProperty(PropertyName = "state")]
[Display(Name = "State")]
[Required(ErrorMessageResourceType = typeof(Resources), ErrorMessageResourceName = "ErrorMessage_Required", ErrorMessage = null)]
[MaxLength(64, ErrorMessageResourceType = typeof(Resources), ErrorMessageResourceName = "ErrorMessage_MaxLength", ErrorMessage = null)]
public string State { get; set; }

[JsonProperty(PropertyName = "zip")]
[Display(Name = "Zip")]
[Required(ErrorMessageResourceType = typeof(Resources), ErrorMessageResourceName = "ErrorMessage_Required", ErrorMessage = null)]
[MaxLength(16, ErrorMessageResourceType = typeof(Resources), ErrorMessageResourceName = "ErrorMessage_MaxLength", ErrorMessage = null)]
public string Zip { get; set; }

[JsonProperty(PropertyName = "country")]
[Display(Name = "Country")]
[Required(ErrorMessageResourceType = typeof(Resources), ErrorMessageResourceName = "ErrorMessage_Required", ErrorMessage = null)]
[MaxLength(64, ErrorMessageResourceType = typeof(Resources), ErrorMessageResourceName = "ErrorMessage_MaxLength", ErrorMessage = null)]
Expand Down
4 changes: 2 additions & 2 deletions DreamFactory.Demo/Demo/DatabaseDemo.cs
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@ public async Task RunAsync(IRestContext context)
firstRecord.FirstName = "Andrei 2";
await databaseApi.UpdateRecordsAsync(TableName, records, new SqlQuery());

SqlQuery query = new SqlQuery { Filter = "age > 30", Order = "age", Fields = "*" };
SqlQuery query = new SqlQuery { Filter = "Age > 30", Order = "Age", Fields = "*" };
IEnumerable<StaffRecord> selection = (await databaseApi.GetRecordsAsync<StaffRecord>(TableName, query)).Records;
string ages = selection.Select(x => x.Age.ToString(CultureInfo.InvariantCulture)).ToStringList();
Console.WriteLine("Get records with SqlQuery: ages={0}", ages);
Expand Down Expand Up @@ -85,7 +85,7 @@ private static IEnumerable<StaffRecord> CreateStaffRecords()
private static TableSchema CreateTestTableSchema()
{
ITableSchemaBuilder builder = new TableSchemaBuilder();
return builder.WithName(TableName).WithFieldsFrom<StaffRecord>().WithKeyField("uid").Build();
return builder.WithName(TableName).WithFieldsFrom<StaffRecord>().WithKeyField("Uid").Build();
}

internal class StaffRecord
Expand Down
11 changes: 10 additions & 1 deletion DreamFactory.Tests/Api/DatabaseApiTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
using DreamFactory.Rest;
using DreamFactory.Serialization;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using Newtonsoft.Json;
using Shouldly;

[TestClass]
Expand Down Expand Up @@ -331,7 +332,7 @@ private static IDatabaseApi CreateDatabaseApi(string alt = null)
private static TableSchema CreateTestTableSchema()
{
ITableSchemaBuilder builder = new TableSchemaBuilder();
return builder.WithName("staff").WithFieldsFrom<StaffRecord>().WithKeyField("uid").Build();
return builder.WithName("staff").WithFieldsFrom<StaffRecord>().WithKeyField("Uid").Build();
}

private static IEnumerable<StaffRecord> CreateStaffRecords()
Expand All @@ -343,17 +344,25 @@ private static IEnumerable<StaffRecord> CreateStaffRecords()

internal class StaffRecord
{
[JsonProperty(PropertyName = "uid")]
public int Uid { get; set; }
[JsonProperty(PropertyName = "first_name")]
public string FirstName { get; set; }
[JsonProperty(PropertyName = "last_name")]
public string LastName { get; set; }
[JsonProperty(PropertyName = "age")]
public int Age { get; set; }
[JsonProperty(PropertyName = "active")]
public bool Active { get; set; }
}

internal class ProcResponse
{
[JsonProperty(PropertyName = "dataset")]
public List<StaffRecord> Dataset { get; set; }
[JsonProperty(PropertyName = "foo")]
public int Foo { get; set; }
[JsonProperty(PropertyName = "bar")]
public string Bar { get; set; }
}
}
Expand Down
1 change: 0 additions & 1 deletion DreamFactory.Tests/DreamFactory.Tests.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -92,7 +92,6 @@
<Compile Include="Rest\RestContextTests.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="Rest\ServiceFactoryTests.cs" />
<Compile Include="Serialization\SnakeCasePropertyNameResolverTests.cs" />
<Compile Include="Serialization\JsonContentSerializerTests.cs" />
<Compile Include="TestDataHttpFacade.cs" />
<None Include="app.config" />
Expand Down
8 changes: 4 additions & 4 deletions DreamFactory.Tests/Model/TableSchemaBuilderTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -66,10 +66,10 @@ public void ShouldBuildWithFieldsFromRecord()

// Assert
schema.Field.Count.ShouldBe(4);
schema.Field.Single(x => x.Name == "id").Type.ShouldBe("id");
schema.Field.Single(x => x.Name == "name").Type.ShouldBe("string");
schema.Field.Single(x => x.Name == "age").Type.ShouldBe("integer");
schema.Field.Single(x => x.Name == "active").Type.ShouldBe("boolean");
schema.Field.Single(x => x.Name == "Id").Type.ShouldBe("id");
schema.Field.Single(x => x.Name == "Name").Type.ShouldBe("string");
schema.Field.Single(x => x.Name == "Age").Type.ShouldBe("integer");
schema.Field.Single(x => x.Name == "Active").Type.ShouldBe("boolean");
}

private class Record
Expand Down
2 changes: 1 addition & 1 deletion DreamFactory.Tests/Rest/RestContextTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -171,7 +171,7 @@ public void ShouldThrowIfAnyArgumentsAreNull()
private static IRestContext CreateRestContext()
{
IHttpFacade httpFacade = new TestDataHttpFacade();
IRestContext context = new RestContext("http://base_address", "app_name", "app_api_key", null, httpFacade, new JsonContentSerializer());
IRestContext context = new RestContext("http://base_address", "app_name", "app_api_key", null, httpFacade, new JsonContentSerializer(), RestApiVersion.V1);
return context;
}
}
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
@@ -1 +1 @@
{"resource":[{"name":"staff","field":[{"name":"uid","type":"integer","required":false},{"name":"first_name","type":"string","required":false},{"name":"last_name","type":"string","required":false},{"name":"age","type":"integer","required":false},{"name":"active","type":"boolean","required":false},{"name":"uid","type":"id","required":true,"auto_increment":true,"is_primary_key":true}]}]}
{"resource":[{"name":"staff","field":[{"name":"Uid","type":"id","required":true,"auto_increment":true,"is_primary_key":true},{"name":"FirstName","type":"string","required":false},{"name":"LastName","type":"string","required":false},{"name":"Age","type":"integer","required":false},{"name":"Active","type":"boolean","required":false}]}]}
Original file line number Diff line number Diff line change
@@ -1 +1 @@
{"resource":[{"name":"staff","field":[{"name":"uid","type":"integer","required":false},{"name":"first_name","type":"string","required":false},{"name":"last_name","type":"string","required":false},{"name":"age","type":"integer","required":false},{"name":"active","type":"boolean","required":false},{"name":"uid","type":"id","required":true,"auto_increment":true,"is_primary_key":true}]}]}
{"resource":[{"name":"staff","field":[{"name":"Uid","type":"id","required":true,"auto_increment":true,"is_primary_key":true},{"name":"FirstName","type":"string","required":false},{"name":"LastName","type":"string","required":false},{"name":"Age","type":"integer","required":false},{"name":"Active","type":"boolean","required":false}]}]}
26 changes: 13 additions & 13 deletions DreamFactory/Api/BaseApi.cs
Original file line number Diff line number Diff line change
Expand Up @@ -387,19 +387,6 @@ internal IHttpAddress BuildAddress(string[] resourceParts, SqlQuery query)
return address;
}

/// <summary>
/// Executes given IHttpRequest and returns response body.
/// </summary>
/// <param name="request">Request to be executed.</param>
/// <returns>Response body.</returns>
/// <exception cref="DreamFactoryException">Thrown when there was an error executing request.</exception>
internal async Task<string> ExecuteRequest(IHttpRequest request)
{
IHttpResponse response = await HttpFacade.RequestAsync(request);
HttpUtils.ThrowOnBadStatus(response, ContentSerializer);
return response.Body;
}

/// <summary>
/// Executes given IHttpRequest and returns deserialized response body.
/// </summary>
Expand All @@ -413,5 +400,18 @@ internal async Task<TResponse> ExecuteRequest<TResponse>(IHttpRequest request)
string body = await ExecuteRequest(request);
return ContentSerializer.Deserialize<TResponse>(body);
}

/// <summary>
/// Executes given IHttpRequest and returns response body.
/// </summary>
/// <param name="request">Request to be executed.</param>
/// <returns>Response body.</returns>
/// <exception cref="DreamFactoryException">Thrown when there was an error executing request.</exception>
internal async Task<string> ExecuteRequest(IHttpRequest request)
{
IHttpResponse response = await HttpFacade.RequestAsync(request);
HttpUtils.ThrowOnBadStatus(response, ContentSerializer);
return response.Body;
}
}
}
3 changes: 0 additions & 3 deletions DreamFactory/DreamFactory.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -180,10 +180,7 @@
<Compile Include="Rest\RestContext.cs" />
<Compile Include="Rest\ServiceFactory.cs" />
<Compile Include="Serialization\IContentSerializer.cs" />
<Compile Include="Serialization\IPropertyNameResolver.cs" />
<Compile Include="Serialization\JsonContentSerializer.cs" />
<Compile Include="Serialization\SnakeCaseContractResolver.cs" />
<Compile Include="Serialization\SnakeCasePropertyNameResolver.cs" />
</ItemGroup>
<ItemGroup>
<Reference Include="Microsoft.Threading.Tasks, Version=1.0.12.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
Expand Down
8 changes: 4 additions & 4 deletions DreamFactory/Http/HttpUtils.cs
Original file line number Diff line number Diff line change
Expand Up @@ -126,11 +126,11 @@ private static string TryGetErrorMessage(IHttpResponse response, IContentSeriali
try
{
string message = @default;
var error = new { error = new List<Error>() };
error = serializer.Deserialize(response.Body, error);
if (error != null && error.error != null)
var body = new { error = new Error() };
body = serializer.Deserialize(response.Body, body);
if (body != null && body.error != null)
{
message = error.error.First().Message;
message = body.error.Message;
}

return string.Format("{0} - {1}", response.Code, message);
Expand Down
Loading

0 comments on commit 5e02efd

Please sign in to comment.