diff --git a/.gitignore b/.gitignore
index 44ae0c94f..9672f5877 100644
--- a/.gitignore
+++ b/.gitignore
@@ -50,3 +50,4 @@ _Chutzpah.*
# Others
~$*
+Thumbs.db
diff --git a/BusinessObjects/Models/ElementCell.cs b/BusinessObjects/Models/ElementCell.cs
index edd7e1e9d..0d24b4269 100644
--- a/BusinessObjects/Models/ElementCell.cs
+++ b/BusinessObjects/Models/ElementCell.cs
@@ -64,24 +64,6 @@ public UserElementCell UserElementCell
#region - Methods -
- public ElementCell ClearValue()
- {
- return ClearValue(null);
- }
-
- public ElementCell ClearValue(User user)
- {
- FixedValueValidation(user);
-
- var fixedValue = ElementField.UseFixedValue.GetValueOrDefault(true);
- if (fixedValue)
- ClearFixedValues();
- else
- RemoveUserCell(user);
-
- return this;
- }
-
public ElementCell SetValue(string value)
{
SetValueHelper(ElementFieldDataType.String, null);
@@ -171,9 +153,6 @@ void ClearFixedValues()
UserElementCell AddUserCell()
{
- // Validations.ArgumentNullOrDefault(user, "user");
-
- //if (UserElementCellSet.Any(item => item.User == user))
if (UserElementCell != null)
throw new Exception("An element cell can't have more than one user element cell for the same user.");
@@ -181,41 +160,13 @@ UserElementCell AddUserCell()
if (userCell.User != null)
userCell.User.UserElementCellSet.Add(userCell);
- //user.UserElementCellSet.Add(userCell);
UserElementCellSet.Add(userCell);
- return userCell;
- }
-
- ElementCell RemoveUserCell(User user)
- {
- Validations.ArgumentNullOrDefault(user, "user");
-
- var userCell = UserElementCellSet.SingleOrDefault(item => item.User == user);
- if (userCell != null)
- {
- user.UserElementCellSet.Remove(userCell);
- UserElementCellSet.Remove(userCell);
- }
- return this;
- }
-
- UserElementCell GetUserCell()
- {
- // Validations.ArgumentNullOrDefault(user, "user");
-
- // var userCell = UserElementCellSet.SingleOrDefault(item => item.User == user);
- var userCell = UserElementCell;
- if (userCell == null)
- userCell = AddUserCell();
return userCell;
}
- UserElementCell GetUserCell(User user)
+ UserElementCell GetUserCell()
{
- Validations.ArgumentNullOrDefault(user, "user");
-
- // var userCell = UserElementCellSet.SingleOrDefault(item => item.User == user);
var userCell = UserElementCell;
if (userCell == null)
userCell = AddUserCell();
diff --git a/BusinessObjects/Models/ElementItem.cs b/BusinessObjects/Models/ElementItem.cs
index 6e2c64e43..af89db6e2 100644
--- a/BusinessObjects/Models/ElementItem.cs
+++ b/BusinessObjects/Models/ElementItem.cs
@@ -10,8 +10,6 @@ namespace forCrowd.WealthEconomy.BusinessObjects
// [ODataControllerAuthorization("Administrator")]
public class ElementItem : BaseEntity
{
- string _name;
-
[Obsolete("Parameterless constructors used by OData & EF. Make them private when possible.")]
public ElementItem()
{
diff --git a/BusinessObjects/Models/ResourcePool.cs b/BusinessObjects/Models/ResourcePool.cs
index 5c6340e88..3314aa26a 100644
--- a/BusinessObjects/Models/ResourcePool.cs
+++ b/BusinessObjects/Models/ResourcePool.cs
@@ -40,6 +40,7 @@ public ResourcePool(User user, string name, string key)
[Index("UX_ResourcePool_UserId_Key", 1, IsUnique = true)]
public int UserId { get; set; }
+ [Required]
[StringLength(250)]
[Index("UX_ResourcePool_UserId_Key", 2, IsUnique = true)]
public string Key
diff --git a/BusinessObjects/Models/UserElementCell.cs b/BusinessObjects/Models/UserElementCell.cs
index dff53fadf..dcb129177 100644
--- a/BusinessObjects/Models/UserElementCell.cs
+++ b/BusinessObjects/Models/UserElementCell.cs
@@ -98,42 +98,10 @@ public DateTime? DateTimeValue
}
}
- //public decimal Rating { get; set; }
-
public virtual User User { get; set; }
public virtual ElementCell ElementCell { get; set; }
- //public decimal Value
- //{
- // get
- // {
- // var fieldType = (ElementFieldDataType)ElementCell.ElementField.DataType;
-
- // switch (fieldType)
- // {
- // case ElementFieldDataType.Boolean:
- // return Convert.ToDecimal(BooleanValue.GetValueOrDefault());
- // case ElementFieldDataType.Integer:
- // return Convert.ToDecimal(IntegerValue.GetValueOrDefault());
- // case ElementFieldDataType.Decimal:
- // // TODO This calculation is the same as Decimal type? Are we using the types in a wrong way?
- // case ElementFieldDataType.ResourcePool:
- // case ElementFieldDataType.Multiplier:
- // return DecimalValue.GetValueOrDefault();
- // case ElementFieldDataType.DateTime:
- // // TODO Check GetValueOrDefault() method for this type
- // return Convert.ToDecimal(DateTimeValue.GetValueOrDefault());
- // case ElementFieldDataType.String:
- // case ElementFieldDataType.Element:
- // // TODO At least for now
- // throw new InvalidOperationException("Value property is not available for this field type");
- // default:
- // throw new ArgumentOutOfRangeException();
- // }
- // }
- //}
-
#region - Methods -
// TODO Validations for SetValue() methods?
diff --git a/CHANGELOG.md b/CHANGELOG.md
index e96fbd617..59ae9166c 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,36 @@
### Changelog
+**0.52.0**
+
+* Send an exception to server in 404 case
+https://github.com/forCrowd/WealthEconomy/issues/53
+* Post correct binding models to server
+https://github.com/forCrowd/WealthEconomy/issues/54
+* Use breeze's z-validate directive for entity validation errors
+https://github.com/forCrowd/WealthEconomy/issues/55
+* OData controller error - No HTTP resource was found that matches the request URI
+https://github.com/forCrowd/WealthEconomy/issues/56
+* Create validate model filter
+https://github.com/forCrowd/WealthEconomy/issues/58
+* Improve OData validation
+https://github.com/forCrowd/WealthEconomy/issues/59
+* angular dependencies alphabetical order
+* Todo.md cleanup
+
+**0.51.2**
+
+* ResourcePoolListController.js - $location is not defined
+https://github.com/forCrowd/WealthEconomy/issues/57
+
+**0.51.1**
+
+* OData controller error - No HTTP resource was found that matches the request URI
+https://github.com/forCrowd/WealthEconomy/issues/56
+* Fixes for initial setup
+ * -ExecutionPolicy Unrestricted was added for WebApiWarmup.ps1 call in post build
+ * WebApi targets path fix
+* Sketch.pptx file
+
**0.51.0**
* Add username to account
diff --git a/DataObjects/DataObjects.csproj b/DataObjects/DataObjects.csproj
index 2d12a790a..7cc646890 100644
--- a/DataObjects/DataObjects.csproj
+++ b/DataObjects/DataObjects.csproj
@@ -98,13 +98,13 @@
Repository.tt
-
-
- 201603162043163_Initial.cs
+
+
+ 201603261149374_Initial.cs
-
-
- 201603162043304_Initial_Manual.cs
+
+
+ 201603261149481_Initial_Manual.cs
@@ -162,11 +162,11 @@
-
- 201603162043163_Initial.cs
+
+ 201603261149374_Initial.cs
-
- 201603162043304_Initial_Manual.cs
+
+ 201603261149481_Initial_Manual.cs
diff --git a/DataObjects/Migrations/201603162043163_Initial.resx b/DataObjects/Migrations/201603162043163_Initial.resx
deleted file mode 100644
index 2f52926e7..000000000
--- a/DataObjects/Migrations/201603162043163_Initial.resx
+++ /dev/null
@@ -1,126 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- text/microsoft-resx
-
-
- 2.0
-
-
- System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- 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
-
-
- dbo
-
-
\ No newline at end of file
diff --git a/DataObjects/Migrations/201603162043304_Initial_Manual.resx b/DataObjects/Migrations/201603162043304_Initial_Manual.resx
deleted file mode 100644
index 2f52926e7..000000000
--- a/DataObjects/Migrations/201603162043304_Initial_Manual.resx
+++ /dev/null
@@ -1,126 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- text/microsoft-resx
-
-
- 2.0
-
-
- System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- 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
-
-
- dbo
-
-
\ No newline at end of file
diff --git a/DataObjects/Migrations/201603162043163_Initial.Designer.cs b/DataObjects/Migrations/201603261149374_Initial.Designer.cs
similarity index 93%
rename from DataObjects/Migrations/201603162043163_Initial.Designer.cs
rename to DataObjects/Migrations/201603261149374_Initial.Designer.cs
index fd5046eff..fe3ec29f8 100644
--- a/DataObjects/Migrations/201603162043163_Initial.Designer.cs
+++ b/DataObjects/Migrations/201603261149374_Initial.Designer.cs
@@ -13,7 +13,7 @@ public sealed partial class Initial : IMigrationMetadata
string IMigrationMetadata.Id
{
- get { return "201603162043163_Initial"; }
+ get { return "201603261149374_Initial"; }
}
string IMigrationMetadata.Source
diff --git a/DataObjects/Migrations/201603162043163_Initial.cs b/DataObjects/Migrations/201603261149374_Initial.cs
similarity index 99%
rename from DataObjects/Migrations/201603162043163_Initial.cs
rename to DataObjects/Migrations/201603261149374_Initial.cs
index 327239f0d..a02c755b5 100644
--- a/DataObjects/Migrations/201603162043163_Initial.cs
+++ b/DataObjects/Migrations/201603261149374_Initial.cs
@@ -188,7 +188,7 @@ public override void Up()
{
Id = c.Int(nullable: false, identity: true),
UserId = c.Int(nullable: false),
- Key = c.String(maxLength: 250),
+ Key = c.String(nullable: false, maxLength: 250),
Name = c.String(nullable: false, maxLength: 250),
InitialValue = c.Decimal(nullable: false, precision: 18, scale: 2),
UseFixedResourcePoolRate = c.Boolean(nullable: false),
diff --git a/DataObjects/Migrations/201603261149374_Initial.resx b/DataObjects/Migrations/201603261149374_Initial.resx
new file mode 100644
index 000000000..debe35231
--- /dev/null
+++ b/DataObjects/Migrations/201603261149374_Initial.resx
@@ -0,0 +1,126 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ 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
+
+
+ dbo
+
+
\ No newline at end of file
diff --git a/DataObjects/Migrations/201603162043304_Initial_Manual.Designer.cs b/DataObjects/Migrations/201603261149481_Initial_Manual.Designer.cs
similarity index 92%
rename from DataObjects/Migrations/201603162043304_Initial_Manual.Designer.cs
rename to DataObjects/Migrations/201603261149481_Initial_Manual.Designer.cs
index a2270a5d8..b72b383af 100644
--- a/DataObjects/Migrations/201603162043304_Initial_Manual.Designer.cs
+++ b/DataObjects/Migrations/201603261149481_Initial_Manual.Designer.cs
@@ -13,7 +13,7 @@ public sealed partial class Initial_Manual : IMigrationMetadata
string IMigrationMetadata.Id
{
- get { return "201603162043304_Initial_Manual"; }
+ get { return "201603261149481_Initial_Manual"; }
}
string IMigrationMetadata.Source
diff --git a/DataObjects/Migrations/201603162043304_Initial_Manual.cs b/DataObjects/Migrations/201603261149481_Initial_Manual.cs
similarity index 100%
rename from DataObjects/Migrations/201603162043304_Initial_Manual.cs
rename to DataObjects/Migrations/201603261149481_Initial_Manual.cs
diff --git a/DataObjects/Migrations/201603261149481_Initial_Manual.resx b/DataObjects/Migrations/201603261149481_Initial_Manual.resx
new file mode 100644
index 000000000..debe35231
--- /dev/null
+++ b/DataObjects/Migrations/201603261149481_Initial_Manual.resx
@@ -0,0 +1,126 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ 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
+
+
+ dbo
+
+
\ No newline at end of file
diff --git a/Facade/UserManager.cs b/Facade/UserManager.cs
index 814794717..c1fc75f10 100644
--- a/Facade/UserManager.cs
+++ b/Facade/UserManager.cs
@@ -307,6 +307,7 @@ public async Task SendResetPasswordEmailAsync(int userId)
sbBody.AppendLine("
");
sbBody.AppendLine(" Wealth Economy - Reset Your Password ");
sbBody.AppendLine(" ");
+ sbBody.AppendFormat(" Username: {0} ", user.UserName);
sbBody.AppendFormat(" Email: {0} ", user.Email);
sbBody.AppendLine(" ");
sbBody.AppendLine(" Please click the following link to reset your email password ");
diff --git a/SolutionItems/Documents/Content Notes.txt b/SolutionItems/Documents/Content Notes.txt
index 1e2f25efd..4c1d4e28f 100644
--- a/SolutionItems/Documents/Content Notes.txt
+++ b/SolutionItems/Documents/Content Notes.txt
@@ -16,6 +16,8 @@ crowd: individuals that work on a certain subject..
. TEDs
http://www.ted.com/talks/audrey_choi_how_to_make_a_profit_while_making_a_difference - not very strong but..
. Review google docs
+. Candy crush revenue
+. Non profit ironing (and many others) service
# Description
Alt: Measuring the goodness
@@ -47,6 +49,10 @@ differences between current & new
. owner oriented, contribution oriented
---
+* sales price is actually not correct in CMRP samples?
+should it show sales price including cmrp tax instead? it's not clear where the money comes from..?
+or it doesn't matter at the moment? at least mention it in CMRP Rate: The Fountain section?
+
* should samples details need to be mentioned? all organizations are equal except the indexes, they all have to have same number of sales etc.
* dynamic pricing - low price is good but can't be zero because then it's not sustainable as well?
diff --git a/SolutionItems/Documents/Design.md b/SolutionItems/Documents/Design.md
new file mode 100644
index 000000000..297b68871
--- /dev/null
+++ b/SolutionItems/Documents/Design.md
@@ -0,0 +1,29 @@
+Agbs - Ali Tugrul
+alitugrul@agbs.com.tr
+533 654 3834 http://www.agbsyazilim.com/Home/Index/#intro
+
+Uğur Erbaş
+544 6850727
+ugurerbas@outlook.com
+
+Şerif Ali Ünal - Kasım's
+553 979 0520
+saunal@gmail.com
+
+Sencer's?
+
+---
+1. Çalıştığım projenin websitesinin tasarımı: https://wealth.forcrowd.org
+a. Genel tasarım, menü eklenmesi, iç sayfaların elden geçirilmesi (kullanıcı profili, kayıt olma, kullanıcı girişi vb. sayfalar)
+b. "ResourcePoolEditor": Sayfadaki başlıkların altında bulunan, organizasyon isimlerinin olduğu, kullanıcıların rating girebildiği kısım.
+Bunu daha user- friendly hale getirebilir miyiz vb. Örnek: https://wealth.forcrowd.org/sample/Billion-Dollar-Question
+c. Opsiyonel: Bazı bölümleri grafik ve/veya video ile anlatabilmeyi istiyorum, bu konuda da neler yapabiliriz diye bakabiliriz.
+
+2. Organizasyonun sitesinin tasarımı: http://www.forcrowd.org
+Kimiz, ne yapıyoruz, iletişim vb. bilgilerin bulunacağı ana site.
+Şuna benzer bir çalışma olabilir: http://osfund.co/
+
+3. Logo revizyon: Varolan logoya bir göz atıyor olabiliriz.
+
+. bootstrap
+. Süre, maliyet
diff --git a/SolutionItems/Documents/Feedback.md b/SolutionItems/Documents/Feedback.md
index 616ccedf5..a819b2629 100644
--- a/SolutionItems/Documents/Feedback.md
+++ b/SolutionItems/Documents/Feedback.md
@@ -17,8 +17,9 @@ Nadia - 02 Mar. '16
. Value proposition
. Gaming the system
-Cuneyt Kizilelma - 16 Mar. '16
-.
+Cuneyt Kizilelma - 16 Mar. '16 - 15 May '16
+. Also Susan & Prof.
+. Lack of clarification: what to do and target audience?
Kaan
. Rating UI
diff --git a/SolutionItems/Documents/General Notes.txt b/SolutionItems/Documents/General Notes.txt
new file mode 100644
index 000000000..8d374f76f
--- /dev/null
+++ b/SolutionItems/Documents/General Notes.txt
@@ -0,0 +1,21 @@
+tasarim
+ali tugrul 533 654 3834 http://www.agbsyazilim.com/Home/Index/#intro
+https://bionluk.com/liste/grafik-tasarim | http://foundry.mediumra.re/variant/builder.html
+logo + forcrowd.org + wealth general layout + menu + editor (ratings ui)
+http://osfund.co/
+
+alpha + gitter
+Gitter - ExhibitArts 19:47 If anyone needs a good logo for their non-profit project let me know.
+
+extend globalsign ssl + smarteraspnet static ip
+
+---
+upforgrabs - first timer only
+https://github.com/formly-js/angular-formly/blob/master/CONTRIBUTING.md
+https://github.com/blog/1184-contributing-guidelines
+http://up-for-grabs.net/#/
+
+---
+git rebase -i HEAD~3
+git push origin --force
+doesnt work with notepad++ ?
diff --git a/SolutionItems/Documents/Remarks.md b/SolutionItems/Documents/Remarks.md
new file mode 100644
index 000000000..0ad202b20
--- /dev/null
+++ b/SolutionItems/Documents/Remarks.md
@@ -0,0 +1,18 @@
+Remarks about the projects, external libraries etc.
+
+* ng-show / if: if it will be on/off frequently (and takes time to render), use show
+if it will be drawn once based on a certain condition and probably it will not change its state, use if?
+* aspnet 5: It seems it's not ready or at least not easy to publish at the moment / coni2k - 28 Jan. '16
+* webApi auth: Cookieauth was necessary to use browser to reach auth pages - elmah.axd for instance and /api/..
+* google analytics: Apparently ignoring localhost + test filters only works for future visits?
+* source-map: original position name & column props are null
+* server-side controller: return Ok(string.Empty); With just Ok(), it return the response with no content-type. Apparetnly Firefox default for no content-type is xml and logs 'no element found' message on console.
+* client-side entities: set initial values (userElementSet[] etc.) to prevent !== 'undefined' checks! - breeze doens't allow this
+* breeze: dataContext.js - Don't forget to update these lines batches.push(manager.getEntities(['Element'], [breeze.EntityState.Deleted]));
+* breeze: fetchEntityByKey 'User' - EntityQuery.from 'Users'
+* breeze save queuing for concurrent saves http://www.getbreezenow.com/documentation/concurrent-saves
+ tried this but should be improved. Before calling saveChanges function, we set each modified entities'
+ RowVersion property in prepareSaveBatches function in dataContext.js. And this function is getting
+ called before queuing operation, which means it stores outdated (invalid RowVersion) entities
+ (normally after save operation it was updating local entity with RowVersion that comes from the server)
+ and in the second call it returns 'Conflict' error message.
diff --git a/SolutionItems/Documents/Skecthes.pptx b/SolutionItems/Documents/Skecthes.pptx
new file mode 100644
index 000000000..a73873e9b
Binary files /dev/null and b/SolutionItems/Documents/Skecthes.pptx differ
diff --git a/SolutionItems/Documents/Social.txt b/SolutionItems/Documents/Social.txt
index d8ad3bd00..796290c0c 100644
--- a/SolutionItems/Documents/Social.txt
+++ b/SolutionItems/Documents/Social.txt
@@ -1,4 +1,4 @@
-alpha team - ceren, cucu?
+alpha team
gitter
personal dev network https://www.facebook.com/lists/10151319136553665
social network - Emin Pamucak
@@ -18,6 +18,14 @@ https://www.braintreepayments.com/features/marketplace
https://www.citizensbank.com/
live broadcast? younow? haai? https://www.livecoding.tv/
+---
+grants
+https://www.coreinfrastructure.org/programs/census-project
+https://wiki.mozilla.org/MOSS
+http://www.numfocus.org/
+https://www.google.com.tr/search?q=eu+grants+open+source&ie=utf-8&oe=utf-8&gws_rd=cr&ei=f6X2Vt-iK-rB6AS8x7PwBQ
+https://stripe.com/blog/open-source-retreat-2016-grantees
+
---
Hello everyone!
I've been working on a open source project for a while.
diff --git a/SolutionItems/Documents/Todo.md b/SolutionItems/Documents/Todo.md
index 8d5797b15..c1665004a 100644
--- a/SolutionItems/Documents/Todo.md
+++ b/SolutionItems/Documents/Todo.md
@@ -1,30 +1,24 @@
*** HOT ***
-send exception to server in 404 case?
-
-viewModel - bindingModel - namingConvention fix (send correct objects to server - not vm from controller?)
-
-angular dependency order alphabetically
-
-check this out; http://breeze.github.io/doc-breeze-labs/directives-validation.html
-check this out: https://github.com/mmanela/chutzpah/wiki/Chutzpah.json-Settings-File
-
-content for editor? new content or new resourcepool - content in a content? or page as a new entity?
-
-cmrp list? -> search?
-
-item.numberOfSales / element.numberOfSales
-
-redirect www.forcrowd.org to wealth.forcrowd.org?
-
-Check the grants from Nadia's F18 slides
+* dataContext.create new cmrp - always check existing ones and don't create duplicate; New-CMRP
+Save failed! Key 'New-CMRP' already exists Error: Conflict
+* field - rating edit in manage.html?
+* warmup script for live?!
+* content for forcrowd - story + team
+* content for wealth - articles
+* cmrp list? -> search page
+* content for editor? new content or new resourcepool - content in a content? or page as a new entity?
+* route update (_system/)
+* samples with sample user? (to prevent edit link)
+
+* expand('User' - brings all user info ?!?!?
+http://stackoverflow.com/questions/10781309/asp-net-mvc-4-webapi-manually-handle-odata-queries
+http://stackoverflow.com/questions/33126251/webapi-odata-pre-filtering-expand-queries
-how to use modals! is there any resolve? controllers + views into separate files?
+* UseFixedValue doesn't work at all! fix it! also check resourcePool.UseFixedResourcePoolRate case!
-samples with sample user? (to prevent edit link)
+* number of sales fix - item.numberOfSales / element.numberOfSales - Total Cost Index
----
-Total Cost Index
Low sales vs high sale case - is this correct?
Org1 price 100 sales 5
Org2 price 150 sales 100
@@ -32,149 +26,178 @@ Org3 price 200 sales 100
Org4 price 300 sales 5
still Org1 gets the most?
-*** UNSORTED ***
-
-Identity / Account:
-. client side user session expire case - expires property to calculate?!
-. refresh tokens
-. Invalidating tokens http://stackoverflow.com/questions/22755700/revoke-token-generated-by-usertokenprovider-in-asp-net-identity-2-0/22767286#22767286
-. before sending any email to user, check whether it's confirmed?
-. Two factor auth.
-. Account lockout
-. rememberMe - register user auto login: false - external login vm.rememberMe?
-
---
-check the routes again!
-/_system/account ?
-/_system/content/about ... ?
-/_system/articles/?
-/_system/register
-/_system/login
-_sys|_|~|.|-|.sys|.s|.i|_int|
-ALPHA / DIGIT / "-" / "." / "_" / "~"
-
-expand('User' - brings all user info ?!?!?
-http://stackoverflow.com/questions/10781309/asp-net-mvc-4-webapi-manually-handle-odata-queries
-http://stackoverflow.com/questions/33126251/webapi-odata-pre-filtering-expand-queries
-
-odata validation
-https://blogs.msdn.microsoft.com/webdev/2013/02/06/protect-your-queryable-api-with-the-validation-feature-in-asp-net-web-api-odata/
-
-fix these; basics - new model - update elementcellnumericvalue? - NOT CLEAR?
+After Therion
+get backup of pubxml files (app.min.js addition to publish) and other files in gitignore + unsynced
+gpg keys? https://help.github.com/articles/checking-for-existing-gpg-keys/
+remove forCrowd/breeze.js repository?
+check this item - fix these; basics - new model - update elementcellnumericvalue? - probably this about 'keep displaying login/register modal on each click?'
-rating UI: Current ratings are from 0 to 100, could to 5, 10 or 1000 as well?
+---
+* Busines Rules
+ * possible error; if one child element will have 2 indexes, UI is not going to work correctly?
+ * directincome type must use fixed value
+ * multiplier cannot use fixed value
+ * one element can't be selected by multiple fields?
+ * elementfield - selectedelement validations + test?
+ * ElementField SortOrder field validations - Check various scenarios, it shouldn't contain duplicate values for instance, what should happen then? Create test cases
+ * field restrictions, one multiplier, one incomefield - server side validation?
+Currently direct income & multiplier field types can only be added once per element (or resource pool)? If this is true, apply validations & tests
-IMPORTANT BUT LATER!
+* ngClient - Entities & Factories
+ * elementField.js - DataType prop uses 'broadcast' and dataContext handles this event to create the actual event
+seems nice, and it could be used in other cases.
+however it doesn't return the newly created entity to the caller, which probably is not suitable for most cases?
+how about using $injector.get('dataContext') in these cases, instead of broadcast?
+ * try to use pure entities, instead of breeze versions? then demo resource pools wouldn't need isTemp?
+resourcePoolFactory.js - // Locally created CMRPs (isTemp) - TODO !
+ * use createEntity in addX cases!
+ * // TODO Most of these functions are related with userService.js - updateX functions
+// Try to merge these two - Actually try to handle these actions within the related entity / SH - 27 Nov. '15
+function updateCache() {
+ * move saveElementField fixes under elementfield.js datatype prop!
+ * try to use enums + js entities in add functions + tests
+ * angularjs 404 case? https://prerender.io/documentation/best-practices
+ * IMPORTANT BUT LATER!
do we correctly update RatingCount (probably yes..)?
but do we update other computed values (resourcepooltotal, count, numericvaluetotal, count, fieldratingtotal, count) correctly?
in case the owner edits them?
after save it only calls update cache.. shouldn't be enough?
+* complete Index Enabled property - try to use IndexEnabled to prevent unnecessary calculations
-try to use pure entities, instead of breeze versions? then demo resource pools wouldn't need isTemp?
-
-Navigate away confirmation in isEditing
+* ngClient - Testing
+ * celltests.js is okay, apply the same approach to others
+ * create a generic cmrp function in commons.js to replace most of the test preparation code?
+ * Check and try to remove these; // TODO Manually update?!
+In most cases, it should only call cell.numericValue() etc. (most basic one) and then the rest should be done like a domino
-review odatacontroller;
+* WebApi
+ * review odatacontroller;
userId check, rowVersion check, try catch blocks, unique key checks - before or after, validation or exception, 400 or 409?
resourcepoolcontroller patch (and others?) is missing userId check?
put methdods need to be updated based on 'post' & 'patch'
+ * Controller Put & Patch returns Ok, instead of Updated? Because Updated() doesn't return the server-side updates, why?
+ * check return conflict() blocks, there's something wrong with them!
+ * enum data type didnt work with odata? or api?
+ * Odata - Find a better way for readonly props (edmbuilder)?
+ * Merge OData & WebApi? So WebApi can go forever?
+ * validateantiforgerytoken + bind attributes in odata controller? AntiForgery.GetTokens
+ * Controller validation - unified approach?
+SequenceEqual check is only in Patch method, in on Post & Put
+DbUpdateConcurrencyException is only in Post & Put, in on Patch
+Delete doesn't have any Concurrency check?
+ * odata - paging (also filters?)
+X-InlineCount - X-Pagination
+querayable vs enablequerysupport
+[Queryable(PageSize=10)]
+var queryAttribute = new QueryableAttribute() { AllowedQueryOptions = AllowedQueryOptions.Top | AllowedQueryOptions.Skip, MaxTop = 100 };
+config.EnableQuerySupport(queryAttribute);
+* Admin auth. - Only for admins didnt work - resourcepool etc.?
+any user should be able to access them but only the owners and admins can update them?
+according to this, normal user may not use post action for instance? check these rules later on
----
-ng-show / if: if it will be on/off frequently (and takes time to render), use show
-if it will be drawn once based on a certain condition and probably it will not change its state, use if?
-
-elementField.js - DataType prop uses 'broadcast' and dataContext handles this event to create the actual event
-seems nice, and it could be used in other cases.
-however it doesn't return the newly created entity to the caller, which probably is not suitable for most cases?
-how about using $injector.get('dataContext') in these cases, instead of broadcast?
-
-use createEntity in addX cases!
-
-// TODO Most of these functions are related with userService.js - updateX functions
-// Try to merge these two - Actually try to handle these actions within the related entity / SH - 27 Nov. '15
-function updateCache() {
-
-move saveElementField fixes under elementfield.js datatype prop!
-
-UseFixedValue doesn't work at all! fix it!
-also check resourcePool.UseFixedResourcePoolRate case!
-
-objects vs entities
-
-add newly created cmrps to fetchedList in cmrpfactory - and don't use newlyCreated flag
-
-resourcePoolFactory.js - // Locally created CMRPs (isTemp) - TODO !
-
-resourcepool - resourcepoolratetotal, count, ratingcount never null
+* BL / DAL
+ * resourcepool - resourcepoolratetotal, count, ratingcount never null
elementfiel - indexratingtotal, count never null
elementcell - numericvaluecount never null - ONLY numericvaluetotal CAN BE NULL? which can be changed to NOT NULL!
+elementfield - indexcalculationtype + indexsortype should have null value?
+ * move enums to their related class?
+ * complete security.permissions on business objects
+ * implement soft delete
+ * find vs deleted records? - findlive? or don't retrieve dead records at all?
+ * IAuditableEntity - entity createdby, modifiedby, deletedby properties
+ * extend dbcontext validation errors - check spaanjaars sample and use them in webapp with modelstate blocks?
+ * how about disabling proxy classes? what will be the difference exactly?
+ * Learn when and how to use IDisposable. Currently are there any object that should implement and/or call Dispose, repository + unitofwork + context + controllers?
+ * calling saveChanges in dispose of unitofwork?
+ * template pattern for elementfield + fieldtype classes!
+ * Find method
+public IEnumerable[t] FindBy(System.Linq.Expressions.Expression[func[T, bool]] predicate)
+{ IEnumerable[T] query = _dbset.Where(predicate).AsEnumerable(); return query; }
+ * check whether unit of work classes (and also Controllers) need merging
+however, in the current structure, every entity will have a unitofwork + controller by default?
+be careful about different contexts entities - license.resourcepool = sampleResourcePool was creating new resource pools!
+either work with Ids, or try to work on merging unitofwork classes
+* UserAware remark: ResourcePool has UserId but doesn't use UserAware attribute, so any user can retrieve someone else's CMRP
+But is this correct approach? And how about updating it, does it allow other users to update?
+With UserAware, should we also mention which actions are allowed?
+* In case you need to set UserId explicitly, do these actions under methods that can only be called by Admins!
+* When the user logs out, how to clear existing related data from context? Or is this an issue?
+
+* Identity / Account:
+ * client side user session expire case - expires property to calculate?!
+ * refresh tokens
+ * Invalidating tokens http://stackoverflow.com/questions/22755700/revoke-token-generated-by-usertokenprovider-in-asp-net-identity-2-0/22767286#22767286
+ * before sending any email to user, check whether it's confirmed?
+ * Two factor auth.
+ * Account lockout
+ * rememberMe - register user auto login: false - external login vm.rememberMe?
+
+* Glimpse
+ * find a way to log sql queries! glimpse?
+ * glimpse webapi (trace for instance) doesn't work for the moment - check it again later
+ * elmah for glimpse. necessary?
+ * Remote server? http://blog.getglimpse.com/2013/12/09/protect-glimpse-axd-with-your-custom-runtime-policy/
+
+* ngClient - UI
+ * my ratings / show all users' ratings should be applied each section separately (cmrp rate, field rating, element cell value)
+ * Navigate away confirmation in isEditing
+ * angular material - https://material.angularjs.org/latest/
+ * blur admin https://github.com/akveo/blur-admin?utm_content=buffera7574&utm_medium=twitter&utm_source=changelog&utm_campaign=buffer
+ * Better ratings UI https://angular-ui.github.io/bootstrap/#/getting_started
+ * improve password validation https://docs.angularjs.org/guide/forms
+ * copy from an existing cmrp / template? how to handle user level data - only copy computed ones?
+ * html form novalidate attribute?
+ * toastr has a jquery dependency - without it, jquery can be removed?
+ * Rating UI: Current ratings are from 0 to 100, could to 5, 10 or 1000 as well?
+ * HighCharts - using texbox to update chart data didn't work, it breaks the chart?
+ * moving menu (fixed to top of the screen)
+ * update editor size accordingly (with menu, it doesn't fit to screen)
+ * info tooltips hover, won't work on mobiles?
+ * cmrp rate visibility or resourcepool has it?
+ * (total) resource pool field incl. CMRP Add. field visibility?
+ * scroll directive (scrollToItem - requires jQuery); http://stackoverflow.com/questions/17284005/scrollto-function-in-angularjs
+ * selecting the current item in the menu / updating url?
+ * navigating to the current item on initial load?
+ * Handling concurrency can be improved;
+Load the new record from the server and let the user update it's record accordingly
+Or in some cases, it should do it automatically (like in resourcePoolEditor samples?)
+ * Auto retry for certain (concurrency etc.) when it fails to read or write to server?
-rules
-directincome type must use fixed value
-multiplier cannot use fixed value
-
-try to use enums + js entities in add functions + tests
-
-move enums to their related class?
-
-copy from an existing cmrp / template?
-how to handle user level data - only copy computed ones?
-
-check return conflict() blocks, there's something wrong with them!
-
-. check these notes - too old? - Calcuation Notes & Questions
-Sample user doesn't have to have ratings and therefore no need to copy them to new users.
-Sample user will only be the owner of sample CMRPs
-User rating will only be created if he/she interacts with it?
-
-. elementfield - indexcalculationtype + indexsortype should have null value?
-
-. field restrictions, one multiplier, one incomefield - server side validation?
-Currently direct income & multiplier field types can only be added once per element (or resource pool)? If this is true, apply validations & tests
-
-. info tooltips hover, won't work on mobiles?
+* Server Side Testing
+ * enable auto test for appveyor - currently it fails probably because it can't create the db?
+ * http://www.asp.net/web-api/overview/testing-and-debugging/mocking-entity-framework-when-unit-testing-aspnet-web-api-2
+ * dependecy injection necessary? - Autofac, Ninject, Unity or ? Check their websites - Check Asp.Net Identity as a sample
-. Better ratings UI https://angular-ui.github.io/bootstrap/#/getting_started
-. angular material - https://material.angularjs.org/latest/
+* New Features
-. toastr has a jquery dependency - without it, jquery can be removed?
-. source-map - original position name & column props are null
+* Misc
+ * permissions - instead of enableresourcepooladdition field to control whether user can enter userresourcepoolrate, handle it with permissions - if the user has a right to enter or not? same goes for FieldIndex ratings
+ * Database performance: Suggests to create a separate username field with index http://blogs.msdn.com/b/webdev/archive/2015/02/11/improve-performance-by-optimizing-queries-for-asp-net-identity-and-other-membership-providers.aspx
+ * __migrationhistory createdon field error - it seems there is not much to do, it also might be about glimpse?
+ * Convert batch files to PowerShell scripts - to get used to Powershell
----
-blank project (User / Environment Ignorant)
+ * blank project (User / Environment Ignorant)
Try to remove static configurations from the application, so the users can use the application with their own settings.
-The list of projects & files that have static connectionStrings;
-All .tt files
-Facade.Tests
-Dataobjects.Tests
-Dataobjects
-Local_db command scripts
+ * The list of projects & files that have static connectionStrings;
+All .tt files - Facade.Tests - Dataobjects.Tests - Dataobjects - Local_db command scripts
----
-an async issue?
-RowVersion property of the entity cannot be null
at forCrowd.WealthEconomy.WebApi.Controllers.OData.BaseUserElementCellController.<Patch>d__9.MoveNext() in D:\Development\Projects\GitHub\forCrowd\WealthEconomy\WebApi\Controllers\OData\Generated\UserElementCellController.cs:line 133
-throw new InvalidOperationException("RowVersion property of the entity cannot be null");
-
-* naming updates
+ * naming updates
referenceRatingMultiplied -> aggressiveRatingBase ?
-Repository -> Store
-UnitOfWork -> Manager
-Db table names -> [Table]Set? - So using "User" table wouldn't be a problem?
-
-* html form novalidate attribute?
-
-* apply "// Set otherUsers' properties" section in custom resourcepoolservice.js to all getResourcePool options?
-
-* sales price is actually not correct in CMRP samples?
-should it show sales price including cmrp tax instead? it's not clear where the money comes from..?
-or it doesn't matter at the moment? at least mention it in CMRP Rate: The Fountain section?
+Repository -> Store - UnitOfWork -> Manager - Db table names -> [Table]Set? - So using "User" table wouldn't be a problem?
-* don't make cmrp rate updateable? then the user will be affected other user's cmrp ratings?
-
-* complete Index Enabled property - try to use IndexEnabled to prevent unnecessary calculations
+ * check the routes again!
+/_system/account
+/_system/about | /_system/content/about ?
+/_system/articles/?
+/_system/register
+/_system/login
+/_system/search
+_sys|_|~|.|-|.sys|.s|.i|_int|
+ALPHA / DIGIT / "-" / "." / "_" / "~"
-* MAP - Update this list!
+ * MAP - Update this list!
most of 'updateRelated' blocks & IndexEnabled check on ElementCell.js became obsolete!
cell.numericValueAverage | cell.currentUserNumericValue
cell.numericValue | item.multiplier
@@ -187,553 +210,38 @@ field.numericValueMultiplied
. cell.aggressiveRatingPercentage
. cell.indexIncome
-* token binding protocol? HTTP/2 Support?
-
-* was there any problem of calculating otherusersresourcepoolratetotal - because of it was retrieving all the users (related with multitenancy?)
-try to do it again? otherwise, after loading the data from the server, it should calculate this on the client-side only once?
-
-TEST RELATED
-* celltests.js is okay, apply the same approach to others
-* create a generic cmrp function in commons.js to replace most of the test preparation code?
-* Check and try to remove these; // TODO Manually update?!
-In most cases, it should only call cell.numericValue() etc. (most basic one) and then the rest should be done like a domino
-* Unit testing for controllers + unitofwork etc.?
-
----
-* datasets endpoints? https://github.com/datasets/gdp/blob/master/data/gdp.csv
-
-* Remark: cookieauth was necessary to use browser to reach auth pages - elmah.axd for instance and /api/..
-
-* check validation cases - null is okay but how about Id check - Id > 0?
-
-* check whether unit of work classes (and also Controllers) need merging
-however, in the current structure, every entity will have a unitofwork + controller by default?
-be careful about different contexts entities - license.resourcepool = sampleResourcePool was creating new resource pools!
-either work with Ids, or try to work on merging unitofwork classes
-
-* authorize only for admins didnt work - resourcepool etc.?
-any user should be able to access them but only the owners and admins can update them?
-according to this, normal user may not use post action for instance? check these rules later on
-
-* angularjs 404 case? https://prerender.io/documentation/best-practices
-* object level validation IValidatableObject
-* glimpse webapi (trace for instance) doesn't work for the moment - check it again later
-* glimpse on remote server? http://blog.getglimpse.com/2013/12/09/protect-glimpse-axd-with-your-custom-runtime-policy/
-* implement soft delete
-* find vs deleted records? - findlive? or don't retrieve dead records at all?
-* enum data type didnt work with odata? or api?
-* using texbox to update chart data didn't work, it breaks the chart?
-* automate .tt scripts with afterbuild?
-* enable auto test for appveyor - currently it fails probably because it can't create the db?
-* __migrationhistory createdon field error - it seems there is not much to do, it also might be about glimpse?
-* code contracts?
-* Install-Package DynamicQuery?
-* http://www.hanselman.com/blog/crossbrowserdebuggingintegratedintovisualstudiowithbrowserstack.aspx
-* https://www.runscope.com/signup
-* html minifier: https://github.com/deanhume/html-minifier | https://www.npmjs.com/package/gulp-minify-html
-* web api throttling!
-* request validation -> html agility pack?
-* coded ui test or canopy or ..? web iu testers?
-* http://www.postsharp.net/aspects#examples
-* elastic search?
-* https://github.com/hazzik/DelegateDecompiler
-* Generalizing Validation via Custom Validation Filter Attribute -> general filter for ModelState.IsValid check! http://www.dotnetcurry.com/showarticle.aspx?ID=927
-* validateantiforgerytoken + bind attributes in odata controller?
-* template pattern for elementfield + fieldtype classes!
-* calling saveChanges in dispose of unitofwork?
-* Learn when and how to use IDisposable. Currently are there any object that should implement and/or call Dispose, repository + unitofwork + context + controllers?
-* extend dbcontext validation errors - check spaanjaars sample and use them in webapp with modelstate blocks?
-* result of datetime (ticks) index is bit useless? need reference a start or end date as a reference?
-* how about disabling proxy classes? what will be the difference exactly?
-* elmah for glimpse. necessary?
-* automapper - useful library, do we need it?
-* Convert batch files to PowerShell scripts - to get used to Powershell
-* ElementField SortOrder field validations - Check various scenarios, it shouldn't contain duplicate values for instance, what should happen then? Create test cases
-
-* aspnet 5 - it seems it's not ready or at least easy to publish at the moment / coni2k - 28 Jan. '16
-
-* google analytics filters - apparently ignoring localhost + test only works for future visits?
-
-* angularjs conventions; https://github.com/mgechev/angularjs-style-guide
-
-* breeze save queuing - is this useful?
-http://www.getbreezenow.com/documentation/concurrent-saves
-tried this but should be improved. Before calling saveChanges function, we set each modified entities' RowVersion property in prepareSaveBatches function in dataContext.js. And this function is getting called before queuing operation, which means it stores outdated (invalid RowVersion) entities (normally after save operation it was updating local entity with RowVersion that comes from the server) and in the second call it returns 'Conflict' error message.
-
-* breeze remark: fetchEntityByKey 'User' - EntityQuery.from 'Users'
-
-* dataContext - What to do these lines; batches.push(manager.getEntities(['License'], [breeze.EntityState.Deleted]));
-
-* unified approach for controller validations;
-SequenceEqual check is only in Patch method, in on Post & Put
-DbUpdateConcurrencyException is only in Post & Put, in on Patch
-Delete doesn't have any Concurrency check?
-
-* Handling concurrency can be improved;
-Load the new record from the server and let the user update it's record accordingly
-Or in some cases, it should do it automatically (like in resourcePoolEditor samples?)
-* Auto retry for certain (concurrency etc.) when it fails to read or write to server?
-
-* Controller Put & Patch returns Ok, instead of Updated? Because Updated() doesn't return the server-side updates, why?
-
-* find method
-public IEnumerable[t] FindBy(System.Linq.Expressions.Expression[func[T, bool]] predicate)
-{ IEnumerable[T] query = _dbset.Where(predicate).AsEnumerable();
-return query; }
-
-* odata - paging (also filters?)
-querayable vs enablequerysupport
-[Queryable(PageSize=10)]
-var queryAttribute = new QueryableAttribute() { AllowedQueryOptions = AllowedQueryOptions.Top | AllowedQueryOptions.Skip, MaxTop = 100 };
-config.EnableQuerySupport(queryAttribute);
-
----
-* elementfield - selectedelement validations + test?
-
-* cmrp rate visibility or resourcepool has it?
-(total) resource pool field incl. CMRP Add. field visibility?
-
-* try to make stores (repositories), managers and controllers (also business objects) testable?
-what are the dependencies? work on separation of concerns.
-where to create memorydbcontext? on dbobjects or business objects? also do we need IoC framework? ninject looks quite easy but is it necessary?
-instead of dataobjects, it should be dataobjects.EF?
-
-* dependecy injection
-Autofac, Ninject, Unity or ? Check their websites - Check Asp.Net Identity as a sample
-And do we need it?
-
-* http://www.asp.net/web-api/overview/testing-and-debugging/mocking-entity-framework-when-unit-testing-aspnet-web-api-2
-
-* Check EF conventions for possible use; rowversion, datetime, id etc?
-
----
-. addfield method should create new elementcells for this new field for the existing items! - ALREADY OK?
-
-. one element can't be selected by multiple fields?
-
-. breeze entities - initial values - to prevent !== 'undefined' checks! - THIS WON'T WORK
-. element.js - in objects, create their inner arrays userElementSet[] etc. - THIS WON'T WORK
-
-. Odata - Find a better way for readonly props (edmbuilder)?
-Also AccountController methods? So WebApi can go forever?
-
-. multitenancy; no need to set User props but handle validation issue
-how about user entity itself?
-test - what if the user not logged in or not auth.! then what happens to interceptors?
-test - userqueryvisitor with filter!
-
-. complete security.permissions on business objects
-
-. ? http://blogs.msdn.com/b/webdev/archive/2015/02/11/improve-performance-by-optimizing-queries-for-asp-net-identity-and-other-membership-providers.aspx
-
-. What to test on BL?
-
-* possible error; if one child element will have 2 indexes, UI is not going to work correctly?
-
-* find a way to log sql queries! glimpse?
-
-* who has a right to enter a rating for cmrp rate + index + element item rating (cell)
-if the current user has no right to enter a rating for that area, then it must use ALL USERS' RATING - no need to show 'Your Own Ratings' option
-
-* user level notes;
-1. try to handle all the actions by using authenticated user, shouldn't be necessary to pass user variable - THIS SHOULD ALREADY BE OK
-2. in case you need to set UserId explicitly, do these actions under methods that can only be called by Admins!
-3. when the user logs out, how to clear existing related data from context?
-
-* sitemaps for google search console
-
-* how breeze react in case of querying expanded + expandedwithuser from local..? does it say it's there or not?
-
-* creative commons?
-
-* http://namevine.com/#/forcrowd
-
-* shields.io for badges
-
-* Nice tool: http://www.mail-tester.com/
-
-* users, user metadata check!
-
-* improve password validation https://docs.angularjs.org/guide/forms
-
-* permissions - instead of enableresourcepooladdition field to control whether user can enter userresourcepoolrate, handle it with permissions - if the user has a right to enter or not? same goes for FieldIndex ratings
-
-* user aware is not enough anymore
-we should also be able to mention which actions are allowed
-userresourcepool + userx is okay, but resourcepool will also be under user now but other users can retrieve it this time, while other actions are still not permitted
-
-* element cell - user element cell - user cleanup
-
-* refresh tokens?
-
-* X-InlineCount - X-Pagination
-
-* anti forgery: AntiForgery.GetTokens
-
-* scroll directive (scrollToItem - requires jQuery);
-http://stackoverflow.com/questions/17284005/scrollto-function-in-angularjs
-moving menu (fixed to top of the screen)
-selecting the current item in the menu / updating url?
-navigating to the current item on initial load?
-prevent re-render
-update editor size accordingly (with menu, it doesn't fit to screen)
-check, use anchorScrollTest project?
-
-* // TODO With just Ok(), it return the response with no content-type.
-// Apparetnly Firefox default for no content-type is xml and logs 'no element found' message on console.
-// return Ok();
-return Ok(string.Empty);
-
----
-public class CountryController : Controller
- {
- //initialize service object
- ICountryService _CountryService;
-
- public CountryController(ICountryService CountryService)
- {
- }
- }
-
-public interface IContext
- {
- IDbSet Persons { get; set; }
- IDbSet Countries { get; set; }
-
- DbSet Set() where TEntity : class;
- DbEntityEntry Entry(TEntity entity) where TEntity : class;
-
- int SaveChanges();
- }
-
-
- public class SampleArchContext : DbContext, IContext
- {
-
- public SampleArchContext()
- : base("Name=SampleArchContext")
- {
- //this.Configuration.LazyLoadingEnabled = false;
- }
-
- public IDbSet Persons { get; set; }
- public IDbSet Countries { get; set; }
-
- protected override void OnModelCreating(DbModelBuilder modelBuilder)
- {
- modelBuilder.Conventions.Remove();
- base.OnModelCreating(modelBuilder);
- }
-
- public override int SaveChanges()
- {
- var modifiedEntries = ChangeTracker.Entries()
- .Where(x => x.Entity is IAuditableEntity
- && (x.State == System.Data.Entity.EntityState.Added || x.State == System.Data.Entity.EntityState.Modified));
-
- foreach (var entry in modifiedEntries)
- {
- IAuditableEntity entity = entry.Entity as IAuditableEntity;
- if (entity != null)
- {
- string identityName = Thread.CurrentPrincipal.Identity.Name;
- DateTime now = DateTime.UtcNow;
-
- if (entry.State == System.Data.Entity.EntityState.Added)
- {
- entity.CreatedBy = identityName;
- entity.CreatedDate = now;
- }
- else {
- base.Entry(entity).Property(x => x.CreatedBy).IsModified = false;
- base.Entry(entity).Property(x => x.CreatedDate).IsModified = false;
- }
-
- entity.UpdatedBy = identityName;
- entity.UpdatedDate = now;
- }
- }
-
- return base.SaveChanges();
- }
- }
-
----
+ * FieldType notes
string - n/a
-
bool - indexable (fixed / user (only current - rating average))
int - indexable (fixed / user (only current - rating average))
decimal - indexable (fixed / user (only current - rating average)) - resource pool (fixed) - multiplier (user - only current)
datetime - indexable (fixed / user (only current - rating average))
-
element - n/a
resource - ~decimal
multiplier - n/a
-
-*** ERRORS ***
-
-System.Web.HttpUnhandledException (0x80004005): Exception of type 'System.Web.HttpUnhandledException' was thrown. ---> forCrowd.WealthEconomy.WebApi.Controllers.Api.AngularException: Cannot read property 'Id' of undefined
-Caused by: N/A
-Url: /account/login
-Stack: TypeError: Cannot read property 'Id' of undefined
- at mainController.isAuthenticated (https://wealth.forcrowd.org/app/controllers/content/mainController.js?v=0.41.3:88:61)
- at Object.fn [as get] (eval at (https://wealth.forcrowd.org/bower_components/angular/angular.min.js?v=0.42:213:110), :4:242)
- at r.$digest (https://wealth.forcrowd.org/bower_components/angular/angular.min.js?v=0.42:131:14)
- at https://wealth.forcrowd.org/bower_components/angular/angular.min.js?v=0.42:133:400
- at e (https://wealth.forcrowd.org/bower_components/angular/angular.min.js?v=0.42:43:305)
- at https://wealth.forcrowd.org/bower_components/angular/angular.min.js?v=0.42:46:181
-
----
-System.Web.HttpUnhandledException (0x80004005): Exception of type 'System.Web.HttpUnhandledException' was thrown. ---> forCrowd.WealthEconomy.WebApi.Controllers.Api.AngularException: Cannot read property 'isAuthenticated' of undefined
-Caused by: N/A
-Url: /account/login
-Stack: TypeError: Cannot read property 'isAuthenticated' of undefined
- at https://wealth.forcrowd.org/app/route.js?v=0.41.3:110:36
- at https://wealth.forcrowd.org/bower_components/angular/angular.min.js?v=0.42:119:129
- at r.$eval (https://wealth.forcrowd.org/bower_components/angular/angular.min.js?v=0.42:133:313)
- at r.$digest (https://wealth.forcrowd.org/bower_components/angular/angular.min.js?v=0.42:130:412)
- at https://wealth.forcrowd.org/bower_components/angular/angular.min.js?v=0.42:133:400
- at e (https://wealth.forcrowd.org/bower_components/angular/angular.min.js?v=0.42:43:305)
- at https://wealth.forcrowd.org/bower_components/angular/angular.min.js?v=0.42:46:181
-
----
-forCrowd.WealthEconomy.WebApi.Controllers.Api.AngularException: vm.currentUser is undefined Caused by: N/A Url: /account/externalLogin
-Stack: isAuthenticated@https://wealth.forcrowd.org/app/controllers/content/mainController.js?v=0.41.3:88:13 anonymous/fn@https://wealth.forcrowd.org/bower_components/angular/angular.min.js?v=0.42 line 213 > Function:2:239 lf/this.$get forCrowd.WealthEconomy.WebApi.Controllers.Api.AngularException: vm.currentUser is undefined
-Caused by: N/A
-Url: /account/externalLogin
-Stack: isAuthenticated@https://wealth.forcrowd.org/app/controllers/content/mainController.js?v=0.41.3:88:13
-anonymous/fn@https://wealth.forcrowd.org/bower_components/angular/angular.min.js?v=0.42 line 213 > Function:2:239
-lf/this.$get forCrowd.WealthEconomy.WebApi.Controllers.Api.AngularException: scope.resourcePool is undefined
-Caused by: N/A
-Url: /account/login
-Stack: getResourcePool/<@https://wealth.forcrowd.org/app/directives/resourcePoolEditor/resourcePoolEditor.js?v=0.41.3:165:1
-f/<@https://wealth.forcrowd.org/bower_components/angular/angular.min.js?v=0.42:119:129
-lf/this.$get html agility pack?
+ * coded ui test or canopy or ..? web iu testers?
+ * http://www.postsharp.net/aspects#examples
+ * elastic search?
+ * https://github.com/hazzik/DelegateDecompiler
+ * datasets endpoints? https://github.com/datasets/gdp/blob/master/data/gdp.csv
+ * code contracts?
+ * Install-Package DynamicQuery?
+ * http://www.hanselman.com/blog/crossbrowserdebuggingintegratedintovisualstudiowithbrowserstack.aspx
+ * https://www.runscope.com/signup
diff --git a/SolutionItems/Properties/AssemblyInfo.cs b/SolutionItems/Properties/AssemblyInfo.cs
index 724821b27..cd8c71582 100644
--- a/SolutionItems/Properties/AssemblyInfo.cs
+++ b/SolutionItems/Properties/AssemblyInfo.cs
@@ -30,5 +30,5 @@
//
// AssemblyFileVersion is not in use for the moment
//
-[assembly: AssemblyVersion("0.51.0")]
+[assembly: AssemblyVersion("0.52.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]
diff --git a/SolutionItems/SolutionItems.csproj b/SolutionItems/SolutionItems.csproj
index 235fb820c..31e9f6970 100644
--- a/SolutionItems/SolutionItems.csproj
+++ b/SolutionItems/SolutionItems.csproj
@@ -36,6 +36,7 @@
+
@@ -54,9 +55,12 @@
Documents\CHANGELOG.md
+
+
+
diff --git a/WebApi/App_Start/FilterConfig.cs b/WebApi/App_Start/FilterConfig.cs
index aa8c69244..c353e9415 100644
--- a/WebApi/App_Start/FilterConfig.cs
+++ b/WebApi/App_Start/FilterConfig.cs
@@ -14,6 +14,9 @@ public static void RegisterFilters(HttpFilterCollection filters)
// DataServiceVersion header
filters.Add(new Filters.DataServiceVersionHeaderAttribute());
+
+ // ValidateModel filter
+ filters.Add(new Filters.ValidateModelAttribute());
}
}
}
\ No newline at end of file
diff --git a/WebApi/App_Start/ODataConfig.cs b/WebApi/App_Start/ODataConfig.cs
index fbb761657..2ec336d61 100644
--- a/WebApi/App_Start/ODataConfig.cs
+++ b/WebApi/App_Start/ODataConfig.cs
@@ -1,20 +1,34 @@
namespace forCrowd.WealthEconomy.WebApi
{
- using System.Web.Http;
using Facade;
using forCrowd.WealthEconomy.WebApi.RoutingConventions;
+ using System.Web.Http;
using System.Web.Http.OData;
+ using System.Web.Http.OData.Batch;
using System.Web.Http.OData.Extensions;
- using System.Web.Http.OData.Routing.Conventions;
+ using System.Web.Http.OData.Query;
using System.Web.Http.OData.Routing;
- using System.Web.Http.OData.Batch;
+ using System.Web.Http.OData.Routing.Conventions;
public class ODataConfig
{
public static void RegisterOData(HttpConfiguration config)
{
// Query support
- var odataFilter = new EnableQueryAttribute() { MaxExpansionDepth = 4 };
+ var odataFilter = new EnableQueryAttribute() {
+ AllowedArithmeticOperators = AllowedArithmeticOperators.None,
+ AllowedFunctions = AllowedFunctions.None,
+ AllowedLogicalOperators = AllowedLogicalOperators.And |
+ AllowedLogicalOperators.Equal |
+ AllowedLogicalOperators.Or,
+ AllowedQueryOptions = AllowedQueryOptions.Expand |
+ AllowedQueryOptions.Filter |
+ AllowedQueryOptions.Skip |
+ AllowedQueryOptions.Top,
+ MaxExpansionDepth = 4,
+ MaxNodeCount = 20,
+ PageSize = 100
+ };
config.AddODataQueryFilter(odataFilter);
// Add the CompositeKeyRoutingConvention
diff --git a/WebApi/Controllers/Api/AccountController.cs b/WebApi/Controllers/Api/AccountController.cs
index afec114f9..0d29ceabf 100644
--- a/WebApi/Controllers/Api/AccountController.cs
+++ b/WebApi/Controllers/Api/AccountController.cs
@@ -31,11 +31,6 @@ public AccountController(ISecureDataFormat accessTokenForm
// POST api/Account/AddPassword
public async Task AddPassword(AddPasswordBindingModel model)
{
- if (!ModelState.IsValid)
- {
- return BadRequest(ModelState);
- }
-
var currentUser = await UserManager.FindByIdAsync(this.GetCurrentUserId().Value);
var result = await UserManager.AddPasswordAsync(currentUser.Id, model.Password);
var errorResult = GetErrorResult(result);
@@ -51,11 +46,6 @@ public async Task AddPassword(AddPasswordBindingModel model)
// POST api/Account/ChangeEmail
public async Task ChangeEmail(ChangeEmailBindingModel model)
{
- if (!ModelState.IsValid)
- {
- return BadRequest(ModelState);
- }
-
// Get the user
var currentUser = await UserManager.FindByIdAsync(this.GetCurrentUserId().Value);
var result = await UserManager.SetEmailAsync(currentUser.Id, model.Email);
@@ -72,11 +62,6 @@ public async Task ChangeEmail(ChangeEmailBindingModel model)
// POST api/Account/ChangePassword
public async Task ChangePassword(ChangePasswordBindingModel model)
{
- if (!ModelState.IsValid)
- {
- return BadRequest(ModelState);
- }
-
var currentUser = await UserManager.FindByIdAsync(this.GetCurrentUserId().Value);
var result = await UserManager.ChangePasswordAsync(currentUser.Id, model.CurrentPassword, model.NewPassword);
var errorResult = GetErrorResult(result);
@@ -92,11 +77,6 @@ public async Task ChangePassword(ChangePasswordBindingModel m
// POST api/Account/ChangeUserName
public async Task ChangeUserName(ChangeUserNameBindingModel model)
{
- if (!ModelState.IsValid)
- {
- return BadRequest(ModelState);
- }
-
// Get the user
var currentUser = await UserManager.FindByIdAsync(this.GetCurrentUserId().Value);
var result = await UserManager.ChangeUserName(currentUser.Id, model.UserName);
@@ -113,11 +93,6 @@ public async Task ChangeUserName(ChangeUserNameBindingModel m
// POST api/Account/ConfirmEmail
public async Task ConfirmEmail(ConfirmEmailBindingModel model)
{
- if (!ModelState.IsValid)
- {
- return BadRequest(ModelState);
- }
-
var currentUser = await UserManager.FindByIdAsync(this.GetCurrentUserId().Value);
var result = await UserManager.ConfirmEmailAsync(currentUser.Id, model.Token);
var errorResult = GetErrorResult(result);
@@ -135,11 +110,6 @@ public async Task ConfirmEmail(ConfirmEmailBindingModel model
[AllowAnonymous]
public IHttpActionResult ExternalLogin(string provider, string clientReturnUrl)
{
- if (!ModelState.IsValid)
- {
- return BadRequest(ModelState);
- }
-
// Request a redirect to the external login provider
var callBackUrl = string.Format("/api/Account/ExternalLoginCallback?clientReturnUrl={0}", clientReturnUrl);
return new ChallengeResult(Request, provider, callBackUrl);
@@ -250,11 +220,6 @@ public async Task ExternalLoginCallback(string clientReturnUr
[AllowAnonymous]
public async Task Register(RegisterBindingModel model)
{
- if (!ModelState.IsValid)
- {
- return BadRequest(ModelState);
- }
-
var user = new User(model.UserName, model.Email)
{
IsAnonymous = false
@@ -276,11 +241,6 @@ public async Task Register(RegisterBindingModel model)
[AllowAnonymous]
public async Task RegisterAnonymous(RegisterAnonymousBindingModel model)
{
- if (!ModelState.IsValid)
- {
- return BadRequest(ModelState);
- }
-
var user = new User(model.UserName, model.Email)
{
IsAnonymous = true
@@ -311,11 +271,6 @@ public async Task ResendConfirmationEmail()
[AllowAnonymous]
public async Task ResetPassword(ResetPasswordBindingModel model)
{
- if (!ModelState.IsValid)
- {
- return BadRequest(ModelState);
- }
-
var currentUser = await UserManager.FindByEmailAsync(model.Email);
var result = await UserManager.ResetPasswordAsync(currentUser.Id, model.Token, model.NewPassword);
var errorResult = GetErrorResult(result);
@@ -331,11 +286,6 @@ public async Task ResetPassword(ResetPasswordBindingModel mod
[AllowAnonymous]
public async Task ResetPasswordRequest(ResetPasswordRequestBindingModel model)
{
- if (!ModelState.IsValid)
- {
- return BadRequest(ModelState);
- }
-
var currentUser = await UserManager.FindByEmailAsync(model.Email);
await UserManager.SendResetPasswordEmailAsync(currentUser.Id);
diff --git a/WebApi/Controllers/OData/Generated/ElementCellController.cs b/WebApi/Controllers/OData/Generated/ElementCellController.cs
index 7d652e2bd..f22973c84 100644
--- a/WebApi/Controllers/OData/Generated/ElementCellController.cs
+++ b/WebApi/Controllers/OData/Generated/ElementCellController.cs
@@ -40,20 +40,15 @@ public virtual IQueryable Get()
// GET odata/ElementCell(5)
//[Queryable]
- public virtual SingleResult Get([FromODataUri] int id)
+ public virtual SingleResult Get([FromODataUri] int key)
{
- return SingleResult.Create(MainUnitOfWork.AllLive.Where(elementCell => elementCell.Id == id));
+ return SingleResult.Create(MainUnitOfWork.AllLive.Where(elementCell => elementCell.Id == key));
}
// PUT odata/ElementCell(5)
- public virtual async Task Put([FromODataUri] int id, ElementCell elementCell)
+ public virtual async Task Put([FromODataUri] int key, ElementCell elementCell)
{
- if (!ModelState.IsValid)
- {
- return BadRequest(ModelState);
- }
-
- if (id != elementCell.Id)
+ if (key != elementCell.Id)
{
return BadRequest();
}
@@ -80,11 +75,6 @@ public virtual async Task Put([FromODataUri] int id, ElementC
// POST odata/ElementCell
public virtual async Task Post(ElementCell elementCell)
{
- if (!ModelState.IsValid)
- {
- return BadRequest(ModelState);
- }
-
try
{
await MainUnitOfWork.InsertAsync(elementCell);
@@ -103,14 +93,9 @@ public virtual async Task Post(ElementCell elementCell)
// PATCH odata/ElementCell(5)
[AcceptVerbs("PATCH", "MERGE")]
- public virtual async Task Patch([FromODataUri] int id, Delta patch)
+ public virtual async Task Patch([FromODataUri] int key, Delta patch)
{
- if (!ModelState.IsValid)
- {
- return BadRequest(ModelState);
- }
-
- var elementCell = await MainUnitOfWork.AllLive.SingleOrDefaultAsync(item => item.Id == id);
+ var elementCell = await MainUnitOfWork.AllLive.SingleOrDefaultAsync(item => item.Id == key);
if (elementCell == null)
{
return NotFound();
@@ -118,9 +103,10 @@ public virtual async Task Patch([FromODataUri] int id, Delta<
var patchEntity = patch.GetEntity();
- // TODO How is passed ModelState.IsValid?
if (patchEntity.RowVersion == null)
+ {
throw new InvalidOperationException("RowVersion property of the entity cannot be null");
+ }
if (!elementCell.RowVersion.SequenceEqual(patchEntity.RowVersion))
{
@@ -137,12 +123,12 @@ public virtual async Task Patch([FromODataUri] int id, Delta<
{
if (patch.GetChangedPropertyNames().Any(item => item == "Id"))
{
- object idObject = null;
- patch.TryGetPropertyValue("Id", out idObject);
+ object keyObject = null;
+ patch.TryGetPropertyValue("Id", out keyObject);
- if (idObject != null && await MainUnitOfWork.All.AnyAsync(item => item.Id == (int)idObject))
+ if (keyObject != null && await MainUnitOfWork.All.AnyAsync(item => item.Id == (int)keyObject))
{
- return new UniqueKeyConflictResult(Request, "Id", idObject.ToString());
+ return new UniqueKeyConflictResult(Request, "Id", keyObject.ToString());
}
else throw;
}
@@ -153,9 +139,9 @@ public virtual async Task Patch([FromODataUri] int id, Delta<
}
// DELETE odata/ElementCell(5)
- public virtual async Task Delete([FromODataUri] int id)
+ public virtual async Task Delete([FromODataUri] int key)
{
- var elementCell = await MainUnitOfWork.AllLive.SingleOrDefaultAsync(item => item.Id == id);
+ var elementCell = await MainUnitOfWork.AllLive.SingleOrDefaultAsync(item => item.Id == key);
if (elementCell == null)
{
return NotFound();
diff --git a/WebApi/Controllers/OData/Generated/ElementController.cs b/WebApi/Controllers/OData/Generated/ElementController.cs
index 0b421b5e7..3e7615215 100644
--- a/WebApi/Controllers/OData/Generated/ElementController.cs
+++ b/WebApi/Controllers/OData/Generated/ElementController.cs
@@ -40,20 +40,15 @@ public virtual IQueryable Get()
// GET odata/Element(5)
//[Queryable]
- public virtual SingleResult Get([FromODataUri] int id)
+ public virtual SingleResult Get([FromODataUri] int key)
{
- return SingleResult.Create(MainUnitOfWork.AllLive.Where(element => element.Id == id));
+ return SingleResult.Create(MainUnitOfWork.AllLive.Where(element => element.Id == key));
}
// PUT odata/Element(5)
- public virtual async Task Put([FromODataUri] int id, Element element)
+ public virtual async Task Put([FromODataUri] int key, Element element)
{
- if (!ModelState.IsValid)
- {
- return BadRequest(ModelState);
- }
-
- if (id != element.Id)
+ if (key != element.Id)
{
return BadRequest();
}
@@ -80,11 +75,6 @@ public virtual async Task Put([FromODataUri] int id, Element
// POST odata/Element
public virtual async Task Post(Element element)
{
- if (!ModelState.IsValid)
- {
- return BadRequest(ModelState);
- }
-
try
{
await MainUnitOfWork.InsertAsync(element);
@@ -103,14 +93,9 @@ public virtual async Task Post(Element element)
// PATCH odata/Element(5)
[AcceptVerbs("PATCH", "MERGE")]
- public virtual async Task Patch([FromODataUri] int id, Delta patch)
+ public virtual async Task Patch([FromODataUri] int key, Delta patch)
{
- if (!ModelState.IsValid)
- {
- return BadRequest(ModelState);
- }
-
- var element = await MainUnitOfWork.AllLive.SingleOrDefaultAsync(item => item.Id == id);
+ var element = await MainUnitOfWork.AllLive.SingleOrDefaultAsync(item => item.Id == key);
if (element == null)
{
return NotFound();
@@ -118,9 +103,10 @@ public virtual async Task Patch([FromODataUri] int id, Delta<
var patchEntity = patch.GetEntity();
- // TODO How is passed ModelState.IsValid?
if (patchEntity.RowVersion == null)
+ {
throw new InvalidOperationException("RowVersion property of the entity cannot be null");
+ }
if (!element.RowVersion.SequenceEqual(patchEntity.RowVersion))
{
@@ -137,12 +123,12 @@ public virtual async Task Patch([FromODataUri] int id, Delta<
{
if (patch.GetChangedPropertyNames().Any(item => item == "Id"))
{
- object idObject = null;
- patch.TryGetPropertyValue("Id", out idObject);
+ object keyObject = null;
+ patch.TryGetPropertyValue("Id", out keyObject);
- if (idObject != null && await MainUnitOfWork.All.AnyAsync(item => item.Id == (int)idObject))
+ if (keyObject != null && await MainUnitOfWork.All.AnyAsync(item => item.Id == (int)keyObject))
{
- return new UniqueKeyConflictResult(Request, "Id", idObject.ToString());
+ return new UniqueKeyConflictResult(Request, "Id", keyObject.ToString());
}
else throw;
}
@@ -153,9 +139,9 @@ public virtual async Task Patch([FromODataUri] int id, Delta<
}
// DELETE odata/Element(5)
- public virtual async Task Delete([FromODataUri] int id)
+ public virtual async Task Delete([FromODataUri] int key)
{
- var element = await MainUnitOfWork.AllLive.SingleOrDefaultAsync(item => item.Id == id);
+ var element = await MainUnitOfWork.AllLive.SingleOrDefaultAsync(item => item.Id == key);
if (element == null)
{
return NotFound();
diff --git a/WebApi/Controllers/OData/Generated/ElementFieldController.cs b/WebApi/Controllers/OData/Generated/ElementFieldController.cs
index 5be7c2399..b3735051c 100644
--- a/WebApi/Controllers/OData/Generated/ElementFieldController.cs
+++ b/WebApi/Controllers/OData/Generated/ElementFieldController.cs
@@ -40,20 +40,15 @@ public virtual IQueryable Get()
// GET odata/ElementField(5)
//[Queryable]
- public virtual SingleResult Get([FromODataUri] int id)
+ public virtual SingleResult Get([FromODataUri] int key)
{
- return SingleResult.Create(MainUnitOfWork.AllLive.Where(elementField => elementField.Id == id));
+ return SingleResult.Create(MainUnitOfWork.AllLive.Where(elementField => elementField.Id == key));
}
// PUT odata/ElementField(5)
- public virtual async Task Put([FromODataUri] int id, ElementField elementField)
+ public virtual async Task Put([FromODataUri] int key, ElementField elementField)
{
- if (!ModelState.IsValid)
- {
- return BadRequest(ModelState);
- }
-
- if (id != elementField.Id)
+ if (key != elementField.Id)
{
return BadRequest();
}
@@ -80,11 +75,6 @@ public virtual async Task Put([FromODataUri] int id, ElementF
// POST odata/ElementField
public virtual async Task Post(ElementField elementField)
{
- if (!ModelState.IsValid)
- {
- return BadRequest(ModelState);
- }
-
try
{
await MainUnitOfWork.InsertAsync(elementField);
@@ -103,14 +93,9 @@ public virtual async Task Post(ElementField elementField)
// PATCH odata/ElementField(5)
[AcceptVerbs("PATCH", "MERGE")]
- public virtual async Task Patch([FromODataUri] int id, Delta patch)
+ public virtual async Task Patch([FromODataUri] int key, Delta patch)
{
- if (!ModelState.IsValid)
- {
- return BadRequest(ModelState);
- }
-
- var elementField = await MainUnitOfWork.AllLive.SingleOrDefaultAsync(item => item.Id == id);
+ var elementField = await MainUnitOfWork.AllLive.SingleOrDefaultAsync(item => item.Id == key);
if (elementField == null)
{
return NotFound();
@@ -118,9 +103,10 @@ public virtual async Task Patch([FromODataUri] int id, Delta<
var patchEntity = patch.GetEntity();
- // TODO How is passed ModelState.IsValid?
if (patchEntity.RowVersion == null)
+ {
throw new InvalidOperationException("RowVersion property of the entity cannot be null");
+ }
if (!elementField.RowVersion.SequenceEqual(patchEntity.RowVersion))
{
@@ -137,12 +123,12 @@ public virtual async Task Patch([FromODataUri] int id, Delta<
{
if (patch.GetChangedPropertyNames().Any(item => item == "Id"))
{
- object idObject = null;
- patch.TryGetPropertyValue("Id", out idObject);
+ object keyObject = null;
+ patch.TryGetPropertyValue("Id", out keyObject);
- if (idObject != null && await MainUnitOfWork.All.AnyAsync(item => item.Id == (int)idObject))
+ if (keyObject != null && await MainUnitOfWork.All.AnyAsync(item => item.Id == (int)keyObject))
{
- return new UniqueKeyConflictResult(Request, "Id", idObject.ToString());
+ return new UniqueKeyConflictResult(Request, "Id", keyObject.ToString());
}
else throw;
}
@@ -153,9 +139,9 @@ public virtual async Task Patch([FromODataUri] int id, Delta<
}
// DELETE odata/ElementField(5)
- public virtual async Task Delete([FromODataUri] int id)
+ public virtual async Task Delete([FromODataUri] int key)
{
- var elementField = await MainUnitOfWork.AllLive.SingleOrDefaultAsync(item => item.Id == id);
+ var elementField = await MainUnitOfWork.AllLive.SingleOrDefaultAsync(item => item.Id == key);
if (elementField == null)
{
return NotFound();
diff --git a/WebApi/Controllers/OData/Generated/ElementItemController.cs b/WebApi/Controllers/OData/Generated/ElementItemController.cs
index 00353fef5..71a6cfb86 100644
--- a/WebApi/Controllers/OData/Generated/ElementItemController.cs
+++ b/WebApi/Controllers/OData/Generated/ElementItemController.cs
@@ -40,20 +40,15 @@ public virtual IQueryable Get()
// GET odata/ElementItem(5)
//[Queryable]
- public virtual SingleResult Get([FromODataUri] int id)
+ public virtual SingleResult Get([FromODataUri] int key)
{
- return SingleResult.Create(MainUnitOfWork.AllLive.Where(elementItem => elementItem.Id == id));
+ return SingleResult.Create(MainUnitOfWork.AllLive.Where(elementItem => elementItem.Id == key));
}
// PUT odata/ElementItem(5)
- public virtual async Task Put([FromODataUri] int id, ElementItem elementItem)
+ public virtual async Task Put([FromODataUri] int key, ElementItem elementItem)
{
- if (!ModelState.IsValid)
- {
- return BadRequest(ModelState);
- }
-
- if (id != elementItem.Id)
+ if (key != elementItem.Id)
{
return BadRequest();
}
@@ -80,11 +75,6 @@ public virtual async Task Put([FromODataUri] int id, ElementI
// POST odata/ElementItem
public virtual async Task Post(ElementItem elementItem)
{
- if (!ModelState.IsValid)
- {
- return BadRequest(ModelState);
- }
-
try
{
await MainUnitOfWork.InsertAsync(elementItem);
@@ -103,14 +93,9 @@ public virtual async Task Post(ElementItem elementItem)
// PATCH odata/ElementItem(5)
[AcceptVerbs("PATCH", "MERGE")]
- public virtual async Task Patch([FromODataUri] int id, Delta patch)
+ public virtual async Task Patch([FromODataUri] int key, Delta patch)
{
- if (!ModelState.IsValid)
- {
- return BadRequest(ModelState);
- }
-
- var elementItem = await MainUnitOfWork.AllLive.SingleOrDefaultAsync(item => item.Id == id);
+ var elementItem = await MainUnitOfWork.AllLive.SingleOrDefaultAsync(item => item.Id == key);
if (elementItem == null)
{
return NotFound();
@@ -118,9 +103,10 @@ public virtual async Task Patch([FromODataUri] int id, Delta<
var patchEntity = patch.GetEntity();
- // TODO How is passed ModelState.IsValid?
if (patchEntity.RowVersion == null)
+ {
throw new InvalidOperationException("RowVersion property of the entity cannot be null");
+ }
if (!elementItem.RowVersion.SequenceEqual(patchEntity.RowVersion))
{
@@ -137,12 +123,12 @@ public virtual async Task Patch([FromODataUri] int id, Delta<
{
if (patch.GetChangedPropertyNames().Any(item => item == "Id"))
{
- object idObject = null;
- patch.TryGetPropertyValue("Id", out idObject);
+ object keyObject = null;
+ patch.TryGetPropertyValue("Id", out keyObject);
- if (idObject != null && await MainUnitOfWork.All.AnyAsync(item => item.Id == (int)idObject))
+ if (keyObject != null && await MainUnitOfWork.All.AnyAsync(item => item.Id == (int)keyObject))
{
- return new UniqueKeyConflictResult(Request, "Id", idObject.ToString());
+ return new UniqueKeyConflictResult(Request, "Id", keyObject.ToString());
}
else throw;
}
@@ -153,9 +139,9 @@ public virtual async Task Patch([FromODataUri] int id, Delta<
}
// DELETE odata/ElementItem(5)
- public virtual async Task Delete([FromODataUri] int id)
+ public virtual async Task Delete([FromODataUri] int key)
{
- var elementItem = await MainUnitOfWork.AllLive.SingleOrDefaultAsync(item => item.Id == id);
+ var elementItem = await MainUnitOfWork.AllLive.SingleOrDefaultAsync(item => item.Id == key);
if (elementItem == null)
{
return NotFound();
diff --git a/WebApi/Controllers/OData/Generated/ODataController.tt b/WebApi/Controllers/OData/Generated/ODataController.tt
index 6799a444b..17464456a 100644
--- a/WebApi/Controllers/OData/Generated/ODataController.tt
+++ b/WebApi/Controllers/OData/Generated/ODataController.tt
@@ -50,7 +50,7 @@ foreach (var entitySet in container.BaseEntitySets.OfType())
}
}
- var primaryKeyVariable = codeStringGenerator.GetCamelCase(primaryKey.Name);
+ var primaryKeyVariable = entityType.KeyMembers.Count == 1 ? "key" : codeStringGenerator.GetCamelCase(primaryKey.Name);
var primaryKeyObjectVariable = string.Format("{0}Object", primaryKeyVariable);
var primaryKeyTypeName = typeMapper.GetTypeName(primaryKey.TypeUsage);
@@ -118,11 +118,6 @@ namespace forCrowd.WealthEconomy.WebApi.Controllers.OData
// PUT <#= routePrefix #>(5)
public virtual async Task Put([FromODataUri] <#= primaryKeyTypeName #> <#= primaryKeyVariable #>, <#= entityTypeName #> <#= entityVariable #>)
{
- if (!ModelState.IsValid)
- {
- return BadRequest(ModelState);
- }
-
if (<#= primaryKeyVariable #> != <#= entityVariable #>.<#= primaryKey #>)
{
return BadRequest();
@@ -150,11 +145,6 @@ namespace forCrowd.WealthEconomy.WebApi.Controllers.OData
// POST <#= routePrefix #>
public virtual async Task Post(<#= entityTypeName #> <#= entityVariable #>)
{
- if (!ModelState.IsValid)
- {
- return BadRequest(ModelState);
- }
-
try
{
await MainUnitOfWork.InsertAsync(<#= entityVariable #>);
@@ -175,11 +165,6 @@ namespace forCrowd.WealthEconomy.WebApi.Controllers.OData
[AcceptVerbs("PATCH", "MERGE")]
public virtual async Task Patch([FromODataUri] <#= primaryKeyTypeName #> <#= primaryKeyVariable #>, Delta<<#= entityTypeName #>> patch)
{
- if (!ModelState.IsValid)
- {
- return BadRequest(ModelState);
- }
-
var <#= entityVariable #> = await MainUnitOfWork.AllLive.SingleOrDefaultAsync(item => item.<#= primaryKey #> == <#= primaryKeyVariable #>);
if (<#= entityVariable #> == null)
{
@@ -188,9 +173,10 @@ namespace forCrowd.WealthEconomy.WebApi.Controllers.OData
var patchEntity = patch.GetEntity();
- // TODO How is passed ModelState.IsValid?
if (patchEntity.RowVersion == null)
+ {
throw new InvalidOperationException("RowVersion property of the entity cannot be null");
+ }
if (!<#= entityVariable #>.RowVersion.SequenceEqual(patchEntity.RowVersion))
{
diff --git a/WebApi/Controllers/OData/Generated/ResourcePoolController.cs b/WebApi/Controllers/OData/Generated/ResourcePoolController.cs
index 6056fd887..ea6b659ef 100644
--- a/WebApi/Controllers/OData/Generated/ResourcePoolController.cs
+++ b/WebApi/Controllers/OData/Generated/ResourcePoolController.cs
@@ -46,20 +46,15 @@ public virtual IQueryable Get()
// GET odata/ResourcePool(5)
//[Queryable]
- public virtual SingleResult Get([FromODataUri] int id)
+ public virtual SingleResult Get([FromODataUri] int key)
{
- return SingleResult.Create(MainUnitOfWork.AllLive.Where(resourcePool => resourcePool.Id == id));
+ return SingleResult.Create(MainUnitOfWork.AllLive.Where(resourcePool => resourcePool.Id == key));
}
// PUT odata/ResourcePool(5)
- public virtual async Task Put([FromODataUri] int id, ResourcePool resourcePool)
+ public virtual async Task Put([FromODataUri] int key, ResourcePool resourcePool)
{
- if (!ModelState.IsValid)
- {
- return BadRequest(ModelState);
- }
-
- if (id != resourcePool.Id)
+ if (key != resourcePool.Id)
{
return BadRequest();
}
@@ -86,11 +81,6 @@ public virtual async Task Put([FromODataUri] int id, Resource
// POST odata/ResourcePool
public virtual async Task Post(ResourcePool resourcePool)
{
- if (!ModelState.IsValid)
- {
- return BadRequest(ModelState);
- }
-
try
{
await MainUnitOfWork.InsertAsync(resourcePool);
@@ -109,14 +99,9 @@ public virtual async Task Post(ResourcePool resourcePool)
// PATCH odata/ResourcePool(5)
[AcceptVerbs("PATCH", "MERGE")]
- public virtual async Task Patch([FromODataUri] int id, Delta patch)
+ public virtual async Task Patch([FromODataUri] int key, Delta patch)
{
- if (!ModelState.IsValid)
- {
- return BadRequest(ModelState);
- }
-
- var resourcePool = await MainUnitOfWork.AllLive.SingleOrDefaultAsync(item => item.Id == id);
+ var resourcePool = await MainUnitOfWork.AllLive.SingleOrDefaultAsync(item => item.Id == key);
if (resourcePool == null)
{
return NotFound();
@@ -124,9 +109,10 @@ public virtual async Task Patch([FromODataUri] int id, Delta<
var patchEntity = patch.GetEntity();
- // TODO How is passed ModelState.IsValid?
if (patchEntity.RowVersion == null)
+ {
throw new InvalidOperationException("RowVersion property of the entity cannot be null");
+ }
if (!resourcePool.RowVersion.SequenceEqual(patchEntity.RowVersion))
{
@@ -143,12 +129,12 @@ public virtual async Task Patch([FromODataUri] int id, Delta<
{
if (patch.GetChangedPropertyNames().Any(item => item == "Id"))
{
- object idObject = null;
- patch.TryGetPropertyValue("Id", out idObject);
+ object keyObject = null;
+ patch.TryGetPropertyValue("Id", out keyObject);
- if (idObject != null && await MainUnitOfWork.All.AnyAsync(item => item.Id == (int)idObject))
+ if (keyObject != null && await MainUnitOfWork.All.AnyAsync(item => item.Id == (int)keyObject))
{
- return new UniqueKeyConflictResult(Request, "Id", idObject.ToString());
+ return new UniqueKeyConflictResult(Request, "Id", keyObject.ToString());
}
else throw;
}
@@ -159,9 +145,9 @@ public virtual async Task Patch([FromODataUri] int id, Delta<
}
// DELETE odata/ResourcePool(5)
- public virtual async Task Delete([FromODataUri] int id)
+ public virtual async Task Delete([FromODataUri] int key)
{
- var resourcePool = await MainUnitOfWork.AllLive.SingleOrDefaultAsync(item => item.Id == id);
+ var resourcePool = await MainUnitOfWork.AllLive.SingleOrDefaultAsync(item => item.Id == key);
if (resourcePool == null)
{
return NotFound();
diff --git a/WebApi/Controllers/OData/Generated/RolesController.cs b/WebApi/Controllers/OData/Generated/RolesController.cs
index 95b897d62..db9963743 100644
--- a/WebApi/Controllers/OData/Generated/RolesController.cs
+++ b/WebApi/Controllers/OData/Generated/RolesController.cs
@@ -40,20 +40,15 @@ public virtual IQueryable Get()
// GET odata/Role(5)
//[Queryable]
- public virtual SingleResult Get([FromODataUri] int id)
+ public virtual SingleResult Get([FromODataUri] int key)
{
- return SingleResult.Create(MainUnitOfWork.AllLive.Where(role => role.Id == id));
+ return SingleResult.Create(MainUnitOfWork.AllLive.Where(role => role.Id == key));
}
// PUT odata/Role(5)
- public virtual async Task Put([FromODataUri] int id, Role role)
+ public virtual async Task Put([FromODataUri] int key, Role role)
{
- if (!ModelState.IsValid)
- {
- return BadRequest(ModelState);
- }
-
- if (id != role.Id)
+ if (key != role.Id)
{
return BadRequest();
}
@@ -80,11 +75,6 @@ public virtual async Task Put([FromODataUri] int id, Role rol
// POST odata/Role
public virtual async Task Post(Role role)
{
- if (!ModelState.IsValid)
- {
- return BadRequest(ModelState);
- }
-
try
{
await MainUnitOfWork.InsertAsync(role);
@@ -103,14 +93,9 @@ public virtual async Task Post(Role role)
// PATCH odata/Role(5)
[AcceptVerbs("PATCH", "MERGE")]
- public virtual async Task Patch([FromODataUri] int id, Delta patch)
+ public virtual async Task Patch([FromODataUri] int key, Delta patch)
{
- if (!ModelState.IsValid)
- {
- return BadRequest(ModelState);
- }
-
- var role = await MainUnitOfWork.AllLive.SingleOrDefaultAsync(item => item.Id == id);
+ var role = await MainUnitOfWork.AllLive.SingleOrDefaultAsync(item => item.Id == key);
if (role == null)
{
return NotFound();
@@ -118,9 +103,10 @@ public virtual async Task Patch([FromODataUri] int id, Delta<
var patchEntity = patch.GetEntity();
- // TODO How is passed ModelState.IsValid?
if (patchEntity.RowVersion == null)
+ {
throw new InvalidOperationException("RowVersion property of the entity cannot be null");
+ }
if (!role.RowVersion.SequenceEqual(patchEntity.RowVersion))
{
@@ -137,12 +123,12 @@ public virtual async Task Patch([FromODataUri] int id, Delta<
{
if (patch.GetChangedPropertyNames().Any(item => item == "Id"))
{
- object idObject = null;
- patch.TryGetPropertyValue("Id", out idObject);
+ object keyObject = null;
+ patch.TryGetPropertyValue("Id", out keyObject);
- if (idObject != null && await MainUnitOfWork.All.AnyAsync(item => item.Id == (int)idObject))
+ if (keyObject != null && await MainUnitOfWork.All.AnyAsync(item => item.Id == (int)keyObject))
{
- return new UniqueKeyConflictResult(Request, "Id", idObject.ToString());
+ return new UniqueKeyConflictResult(Request, "Id", keyObject.ToString());
}
else throw;
}
@@ -153,9 +139,9 @@ public virtual async Task Patch([FromODataUri] int id, Delta<
}
// DELETE odata/Role(5)
- public virtual async Task Delete([FromODataUri] int id)
+ public virtual async Task Delete([FromODataUri] int key)
{
- var role = await MainUnitOfWork.AllLive.SingleOrDefaultAsync(item => item.Id == id);
+ var role = await MainUnitOfWork.AllLive.SingleOrDefaultAsync(item => item.Id == key);
if (role == null)
{
return NotFound();
diff --git a/WebApi/Controllers/OData/Generated/UserClaimsController.cs b/WebApi/Controllers/OData/Generated/UserClaimsController.cs
index 185ddc4eb..ef51360f9 100644
--- a/WebApi/Controllers/OData/Generated/UserClaimsController.cs
+++ b/WebApi/Controllers/OData/Generated/UserClaimsController.cs
@@ -46,20 +46,15 @@ public virtual IQueryable Get()
// GET odata/UserClaim(5)
//[Queryable]
- public virtual SingleResult Get([FromODataUri] int id)
+ public virtual SingleResult Get([FromODataUri] int key)
{
- return SingleResult.Create(MainUnitOfWork.AllLive.Where(userClaim => userClaim.Id == id));
+ return SingleResult.Create(MainUnitOfWork.AllLive.Where(userClaim => userClaim.Id == key));
}
// PUT odata/UserClaim(5)
- public virtual async Task Put([FromODataUri] int id, UserClaim userClaim)
+ public virtual async Task Put([FromODataUri] int key, UserClaim userClaim)
{
- if (!ModelState.IsValid)
- {
- return BadRequest(ModelState);
- }
-
- if (id != userClaim.Id)
+ if (key != userClaim.Id)
{
return BadRequest();
}
@@ -86,11 +81,6 @@ public virtual async Task Put([FromODataUri] int id, UserClai
// POST odata/UserClaim
public virtual async Task Post(UserClaim userClaim)
{
- if (!ModelState.IsValid)
- {
- return BadRequest(ModelState);
- }
-
try
{
await MainUnitOfWork.InsertAsync(userClaim);
@@ -109,14 +99,9 @@ public virtual async Task Post(UserClaim userClaim)
// PATCH odata/UserClaim(5)
[AcceptVerbs("PATCH", "MERGE")]
- public virtual async Task Patch([FromODataUri] int id, Delta patch)
+ public virtual async Task Patch([FromODataUri] int key, Delta patch)
{
- if (!ModelState.IsValid)
- {
- return BadRequest(ModelState);
- }
-
- var userClaim = await MainUnitOfWork.AllLive.SingleOrDefaultAsync(item => item.Id == id);
+ var userClaim = await MainUnitOfWork.AllLive.SingleOrDefaultAsync(item => item.Id == key);
if (userClaim == null)
{
return NotFound();
@@ -124,9 +109,10 @@ public virtual async Task Patch([FromODataUri] int id, Delta<
var patchEntity = patch.GetEntity();
- // TODO How is passed ModelState.IsValid?
if (patchEntity.RowVersion == null)
+ {
throw new InvalidOperationException("RowVersion property of the entity cannot be null");
+ }
if (!userClaim.RowVersion.SequenceEqual(patchEntity.RowVersion))
{
@@ -143,12 +129,12 @@ public virtual async Task Patch([FromODataUri] int id, Delta<
{
if (patch.GetChangedPropertyNames().Any(item => item == "Id"))
{
- object idObject = null;
- patch.TryGetPropertyValue("Id", out idObject);
+ object keyObject = null;
+ patch.TryGetPropertyValue("Id", out keyObject);
- if (idObject != null && await MainUnitOfWork.All.AnyAsync(item => item.Id == (int)idObject))
+ if (keyObject != null && await MainUnitOfWork.All.AnyAsync(item => item.Id == (int)keyObject))
{
- return new UniqueKeyConflictResult(Request, "Id", idObject.ToString());
+ return new UniqueKeyConflictResult(Request, "Id", keyObject.ToString());
}
else throw;
}
@@ -159,9 +145,9 @@ public virtual async Task Patch([FromODataUri] int id, Delta<
}
// DELETE odata/UserClaim(5)
- public virtual async Task Delete([FromODataUri] int id)
+ public virtual async Task Delete([FromODataUri] int key)
{
- var userClaim = await MainUnitOfWork.AllLive.SingleOrDefaultAsync(item => item.Id == id);
+ var userClaim = await MainUnitOfWork.AllLive.SingleOrDefaultAsync(item => item.Id == key);
if (userClaim == null)
{
return NotFound();
diff --git a/WebApi/Controllers/OData/Generated/UserElementCellController.cs b/WebApi/Controllers/OData/Generated/UserElementCellController.cs
index 9f7f92d0c..894c3a957 100644
--- a/WebApi/Controllers/OData/Generated/UserElementCellController.cs
+++ b/WebApi/Controllers/OData/Generated/UserElementCellController.cs
@@ -54,11 +54,6 @@ public virtual SingleResult Get([FromODataUri] int elementCellI
// PUT odata/UserElementCell(5)
public virtual async Task Put([FromODataUri] int elementCellId, UserElementCell userElementCell)
{
- if (!ModelState.IsValid)
- {
- return BadRequest(ModelState);
- }
-
if (elementCellId != userElementCell.ElementCellId)
{
return BadRequest();
@@ -86,11 +81,6 @@ public virtual async Task Put([FromODataUri] int elementCellI
// POST odata/UserElementCell
public virtual async Task Post(UserElementCell userElementCell)
{
- if (!ModelState.IsValid)
- {
- return BadRequest(ModelState);
- }
-
try
{
await MainUnitOfWork.InsertAsync(userElementCell);
@@ -111,11 +101,6 @@ public virtual async Task Post(UserElementCell userElementCel
[AcceptVerbs("PATCH", "MERGE")]
public virtual async Task Patch([FromODataUri] int elementCellId, Delta patch)
{
- if (!ModelState.IsValid)
- {
- return BadRequest(ModelState);
- }
-
var userElementCell = await MainUnitOfWork.AllLive.SingleOrDefaultAsync(item => item.ElementCellId == elementCellId);
if (userElementCell == null)
{
@@ -124,9 +109,10 @@ public virtual async Task Patch([FromODataUri] int elementCel
var patchEntity = patch.GetEntity();
- // TODO How is passed ModelState.IsValid?
if (patchEntity.RowVersion == null)
+ {
throw new InvalidOperationException("RowVersion property of the entity cannot be null");
+ }
if (!userElementCell.RowVersion.SequenceEqual(patchEntity.RowVersion))
{
diff --git a/WebApi/Controllers/OData/Generated/UserElementFieldController.cs b/WebApi/Controllers/OData/Generated/UserElementFieldController.cs
index c2d6ac5b1..784e34939 100644
--- a/WebApi/Controllers/OData/Generated/UserElementFieldController.cs
+++ b/WebApi/Controllers/OData/Generated/UserElementFieldController.cs
@@ -54,11 +54,6 @@ public virtual SingleResult Get([FromODataUri] int elementFiel
// PUT odata/UserElementField(5)
public virtual async Task Put([FromODataUri] int elementFieldId, UserElementField userElementField)
{
- if (!ModelState.IsValid)
- {
- return BadRequest(ModelState);
- }
-
if (elementFieldId != userElementField.ElementFieldId)
{
return BadRequest();
@@ -86,11 +81,6 @@ public virtual async Task Put([FromODataUri] int elementField
// POST odata/UserElementField
public virtual async Task Post(UserElementField userElementField)
{
- if (!ModelState.IsValid)
- {
- return BadRequest(ModelState);
- }
-
try
{
await MainUnitOfWork.InsertAsync(userElementField);
@@ -111,11 +101,6 @@ public virtual async Task Post(UserElementField userElementFi
[AcceptVerbs("PATCH", "MERGE")]
public virtual async Task Patch([FromODataUri] int elementFieldId, Delta patch)
{
- if (!ModelState.IsValid)
- {
- return BadRequest(ModelState);
- }
-
var userElementField = await MainUnitOfWork.AllLive.SingleOrDefaultAsync(item => item.ElementFieldId == elementFieldId);
if (userElementField == null)
{
@@ -124,9 +109,10 @@ public virtual async Task Patch([FromODataUri] int elementFie
var patchEntity = patch.GetEntity();
- // TODO How is passed ModelState.IsValid?
if (patchEntity.RowVersion == null)
+ {
throw new InvalidOperationException("RowVersion property of the entity cannot be null");
+ }
if (!userElementField.RowVersion.SequenceEqual(patchEntity.RowVersion))
{
diff --git a/WebApi/Controllers/OData/Generated/UserLoginsController.cs b/WebApi/Controllers/OData/Generated/UserLoginsController.cs
index 9676f9228..47786b128 100644
--- a/WebApi/Controllers/OData/Generated/UserLoginsController.cs
+++ b/WebApi/Controllers/OData/Generated/UserLoginsController.cs
@@ -54,11 +54,6 @@ public virtual SingleResult Get([FromODataUri] string providerKey)
// PUT odata/UserLogin(5)
public virtual async Task Put([FromODataUri] string providerKey, UserLogin userLogin)
{
- if (!ModelState.IsValid)
- {
- return BadRequest(ModelState);
- }
-
if (providerKey != userLogin.ProviderKey)
{
return BadRequest();
@@ -86,11 +81,6 @@ public virtual async Task Put([FromODataUri] string providerK
// POST odata/UserLogin
public virtual async Task Post(UserLogin userLogin)
{
- if (!ModelState.IsValid)
- {
- return BadRequest(ModelState);
- }
-
try
{
await MainUnitOfWork.InsertAsync(userLogin);
@@ -111,11 +101,6 @@ public virtual async Task Post(UserLogin userLogin)
[AcceptVerbs("PATCH", "MERGE")]
public virtual async Task Patch([FromODataUri] string providerKey, Delta patch)
{
- if (!ModelState.IsValid)
- {
- return BadRequest(ModelState);
- }
-
var userLogin = await MainUnitOfWork.AllLive.SingleOrDefaultAsync(item => item.ProviderKey == providerKey);
if (userLogin == null)
{
@@ -124,9 +109,10 @@ public virtual async Task Patch([FromODataUri] string provide
var patchEntity = patch.GetEntity();
- // TODO How is passed ModelState.IsValid?
if (patchEntity.RowVersion == null)
+ {
throw new InvalidOperationException("RowVersion property of the entity cannot be null");
+ }
if (!userLogin.RowVersion.SequenceEqual(patchEntity.RowVersion))
{
diff --git a/WebApi/Controllers/OData/Generated/UserResourcePoolController.cs b/WebApi/Controllers/OData/Generated/UserResourcePoolController.cs
index 38a45e260..f0d96cf5a 100644
--- a/WebApi/Controllers/OData/Generated/UserResourcePoolController.cs
+++ b/WebApi/Controllers/OData/Generated/UserResourcePoolController.cs
@@ -54,11 +54,6 @@ public virtual SingleResult Get([FromODataUri] int resourcePoo
// PUT odata/UserResourcePool(5)
public virtual async Task Put([FromODataUri] int resourcePoolId, UserResourcePool userResourcePool)
{
- if (!ModelState.IsValid)
- {
- return BadRequest(ModelState);
- }
-
if (resourcePoolId != userResourcePool.ResourcePoolId)
{
return BadRequest();
@@ -86,11 +81,6 @@ public virtual async Task Put([FromODataUri] int resourcePool
// POST odata/UserResourcePool
public virtual async Task Post(UserResourcePool userResourcePool)
{
- if (!ModelState.IsValid)
- {
- return BadRequest(ModelState);
- }
-
try
{
await MainUnitOfWork.InsertAsync(userResourcePool);
@@ -111,11 +101,6 @@ public virtual async Task Post(UserResourcePool userResourceP
[AcceptVerbs("PATCH", "MERGE")]
public virtual async Task Patch([FromODataUri] int resourcePoolId, Delta patch)
{
- if (!ModelState.IsValid)
- {
- return BadRequest(ModelState);
- }
-
var userResourcePool = await MainUnitOfWork.AllLive.SingleOrDefaultAsync(item => item.ResourcePoolId == resourcePoolId);
if (userResourcePool == null)
{
@@ -124,9 +109,10 @@ public virtual async Task Patch([FromODataUri] int resourcePo
var patchEntity = patch.GetEntity();
- // TODO How is passed ModelState.IsValid?
if (patchEntity.RowVersion == null)
+ {
throw new InvalidOperationException("RowVersion property of the entity cannot be null");
+ }
if (!userResourcePool.RowVersion.SequenceEqual(patchEntity.RowVersion))
{
diff --git a/WebApi/Controllers/OData/Generated/UserRolesController.cs b/WebApi/Controllers/OData/Generated/UserRolesController.cs
index 77b922017..a29012734 100644
--- a/WebApi/Controllers/OData/Generated/UserRolesController.cs
+++ b/WebApi/Controllers/OData/Generated/UserRolesController.cs
@@ -54,11 +54,6 @@ public virtual SingleResult Get([FromODataUri] int roleId)
// PUT odata/UserRole(5)
public virtual async Task Put([FromODataUri] int roleId, UserRole userRole)
{
- if (!ModelState.IsValid)
- {
- return BadRequest(ModelState);
- }
-
if (roleId != userRole.RoleId)
{
return BadRequest();
@@ -86,11 +81,6 @@ public virtual async Task Put([FromODataUri] int roleId, User
// POST odata/UserRole
public virtual async Task Post(UserRole userRole)
{
- if (!ModelState.IsValid)
- {
- return BadRequest(ModelState);
- }
-
try
{
await MainUnitOfWork.InsertAsync(userRole);
@@ -111,11 +101,6 @@ public virtual async Task Post(UserRole userRole)
[AcceptVerbs("PATCH", "MERGE")]
public virtual async Task Patch([FromODataUri] int roleId, Delta patch)
{
- if (!ModelState.IsValid)
- {
- return BadRequest(ModelState);
- }
-
var userRole = await MainUnitOfWork.AllLive.SingleOrDefaultAsync(item => item.RoleId == roleId);
if (userRole == null)
{
@@ -124,9 +109,10 @@ public virtual async Task Patch([FromODataUri] int roleId, De
var patchEntity = patch.GetEntity();
- // TODO How is passed ModelState.IsValid?
if (patchEntity.RowVersion == null)
+ {
throw new InvalidOperationException("RowVersion property of the entity cannot be null");
+ }
if (!userRole.RowVersion.SequenceEqual(patchEntity.RowVersion))
{
diff --git a/WebApi/Controllers/OData/Generated/UsersController.cs b/WebApi/Controllers/OData/Generated/UsersController.cs
index e4197bb61..4e5134421 100644
--- a/WebApi/Controllers/OData/Generated/UsersController.cs
+++ b/WebApi/Controllers/OData/Generated/UsersController.cs
@@ -40,20 +40,15 @@ public virtual IQueryable Get()
// GET odata/User(5)
//[Queryable]
- public virtual SingleResult Get([FromODataUri] int id)
+ public virtual SingleResult Get([FromODataUri] int key)
{
- return SingleResult.Create(MainUnitOfWork.AllLive.Where(user => user.Id == id));
+ return SingleResult.Create(MainUnitOfWork.AllLive.Where(user => user.Id == key));
}
// PUT odata/User(5)
- public virtual async Task Put([FromODataUri] int id, User user)
+ public virtual async Task Put([FromODataUri] int key, User user)
{
- if (!ModelState.IsValid)
- {
- return BadRequest(ModelState);
- }
-
- if (id != user.Id)
+ if (key != user.Id)
{
return BadRequest();
}
@@ -80,11 +75,6 @@ public virtual async Task Put([FromODataUri] int id, User use
// POST odata/User
public virtual async Task Post(User user)
{
- if (!ModelState.IsValid)
- {
- return BadRequest(ModelState);
- }
-
try
{
await MainUnitOfWork.InsertAsync(user);
@@ -103,14 +93,9 @@ public virtual async Task Post(User user)
// PATCH odata/User(5)
[AcceptVerbs("PATCH", "MERGE")]
- public virtual async Task Patch([FromODataUri] int id, Delta patch)
+ public virtual async Task Patch([FromODataUri] int key, Delta patch)
{
- if (!ModelState.IsValid)
- {
- return BadRequest(ModelState);
- }
-
- var user = await MainUnitOfWork.AllLive.SingleOrDefaultAsync(item => item.Id == id);
+ var user = await MainUnitOfWork.AllLive.SingleOrDefaultAsync(item => item.Id == key);
if (user == null)
{
return NotFound();
@@ -118,9 +103,10 @@ public virtual async Task Patch([FromODataUri] int id, Delta<
var patchEntity = patch.GetEntity();
- // TODO How is passed ModelState.IsValid?
if (patchEntity.RowVersion == null)
+ {
throw new InvalidOperationException("RowVersion property of the entity cannot be null");
+ }
if (!user.RowVersion.SequenceEqual(patchEntity.RowVersion))
{
@@ -137,12 +123,12 @@ public virtual async Task Patch([FromODataUri] int id, Delta<
{
if (patch.GetChangedPropertyNames().Any(item => item == "Id"))
{
- object idObject = null;
- patch.TryGetPropertyValue("Id", out idObject);
+ object keyObject = null;
+ patch.TryGetPropertyValue("Id", out keyObject);
- if (idObject != null && await MainUnitOfWork.All.AnyAsync(item => item.Id == (int)idObject))
+ if (keyObject != null && await MainUnitOfWork.All.AnyAsync(item => item.Id == (int)keyObject))
{
- return new UniqueKeyConflictResult(Request, "Id", idObject.ToString());
+ return new UniqueKeyConflictResult(Request, "Id", keyObject.ToString());
}
else throw;
}
@@ -153,9 +139,9 @@ public virtual async Task Patch([FromODataUri] int id, Delta<
}
// DELETE odata/User(5)
- public virtual async Task Delete([FromODataUri] int id)
+ public virtual async Task Delete([FromODataUri] int key)
{
- var user = await MainUnitOfWork.AllLive.SingleOrDefaultAsync(item => item.Id == id);
+ var user = await MainUnitOfWork.AllLive.SingleOrDefaultAsync(item => item.Id == key);
if (user == null)
{
return NotFound();
diff --git a/WebApi/Controllers/OData/ResourcePoolController.cs b/WebApi/Controllers/OData/ResourcePoolController.cs
index a2e9aa318..8977a40bb 100644
--- a/WebApi/Controllers/OData/ResourcePoolController.cs
+++ b/WebApi/Controllers/OData/ResourcePoolController.cs
@@ -21,9 +21,9 @@ public override IQueryable Get()
}
[AllowAnonymous]
- public override SingleResult Get(int id)
+ public override SingleResult Get([FromODataUri] int key)
{
- var result = base.Get(id);
+ var result = base.Get(key);
return result;
}
@@ -47,11 +47,11 @@ public override async Task Post(ResourcePool resourcePool)
}
}
- public override async Task Patch([FromODataUri] int id, Delta patch)
+ public override async Task Patch([FromODataUri] int key, Delta patch)
{
try
{
- return await base.Patch(id, patch);
+ return await base.Patch(key, patch);
}
catch (DbUpdateException)
{
diff --git a/WebApi/Controllers/OData/UsersController.cs b/WebApi/Controllers/OData/UsersController.cs
index c1e751607..12e13e6cf 100644
--- a/WebApi/Controllers/OData/UsersController.cs
+++ b/WebApi/Controllers/OData/UsersController.cs
@@ -35,24 +35,24 @@ public override IQueryable Get()
return list;
}
- public new async Task> Get(int id)
+ public new async Task> Get([FromODataUri] int key)
{
var currentUser = await GetCurrentUserAsync();
var isAdmin = this.GetCurrentUserIsAdmin();
- if (id != currentUser.Id && !isAdmin)
+ if (key != currentUser.Id && !isAdmin)
throw new HttpResponseException(HttpStatusCode.Unauthorized);
- return base.Get(id);
+ return base.Get(key);
}
// PUT odata/User(5)
- public override async Task Put([FromODataUri] int id, User user)
+ public override async Task Put([FromODataUri] int key, User user)
{
var currentUser = await GetCurrentUserAsync();
var isAdmin = this.GetCurrentUserIsAdmin();
if (user.Id != currentUser.Id && !isAdmin)
return Unauthorized();
- return await base.Put(id, user);
+ return await base.Put(key, user);
}
// POST odata/User
diff --git a/WebApi/Filters/ValidateModelAttribute.cs b/WebApi/Filters/ValidateModelAttribute.cs
new file mode 100644
index 000000000..13700f05d
--- /dev/null
+++ b/WebApi/Filters/ValidateModelAttribute.cs
@@ -0,0 +1,32 @@
+namespace forCrowd.WealthEconomy.WebApi.Filters
+{
+ using System.Net;
+ using System.Net.Http;
+ using System.Threading;
+ using System.Threading.Tasks;
+ using System.Web.Http.Controllers;
+ using System.Web.Http.Filters;
+
+ public class ValidateModelAttribute : ActionFilterAttribute
+ {
+ public override void OnActionExecuting(HttpActionContext actionContext)
+ {
+ OnActionExecutingInternal(actionContext);
+ base.OnActionExecuting(actionContext);
+ }
+
+ public override Task OnActionExecutingAsync(HttpActionContext actionContext, CancellationToken cancellationToken)
+ {
+ OnActionExecutingInternal(actionContext);
+ return base.OnActionExecutingAsync(actionContext, cancellationToken);
+ }
+
+ void OnActionExecutingInternal(HttpActionContext actionContext)
+ {
+ if (!actionContext.ModelState.IsValid)
+ {
+ actionContext.Response = actionContext.Request.CreateErrorResponse(HttpStatusCode.BadRequest, actionContext.ModelState);
+ }
+ }
+ }
+}
diff --git a/WebApi/Results/ChallengeResult.cs b/WebApi/Results/ChallengeResult.cs
index 5478fccab..be62ad754 100644
--- a/WebApi/Results/ChallengeResult.cs
+++ b/WebApi/Results/ChallengeResult.cs
@@ -29,8 +29,7 @@ public Task ExecuteAsync(CancellationToken cancellationToke
Request.GetOwinContext().Authentication.Challenge(properties, LoginProvider);
- var response = new HttpResponseMessage(HttpStatusCode.Unauthorized);
- response.RequestMessage = Request;
+ var response = Request.CreateResponse(HttpStatusCode.Unauthorized);
return Task.FromResult(response);
}
}
diff --git a/WebApi/Results/UniqueKeyConflictResult.cs b/WebApi/Results/UniqueKeyConflictResult.cs
index 6f523778b..63c12130e 100644
--- a/WebApi/Results/UniqueKeyConflictResult.cs
+++ b/WebApi/Results/UniqueKeyConflictResult.cs
@@ -31,10 +31,9 @@ public Task ExecuteAsync(CancellationToken cancellationToke
public HttpResponseMessage Execute()
{
- var response = new HttpResponseMessage(HttpStatusCode.Conflict);
+ var response = Request.CreateResponse(HttpStatusCode.Conflict);
var message = string.Format("{0} '{1}' already exists", Field, Value);
response.Content = new StringContent(message);
- response.RequestMessage = Request;
return response;
}
}
diff --git a/WebApi/WebApi.csproj b/WebApi/WebApi.csproj
index ba4d95991..439ef18a4 100644
--- a/WebApi/WebApi.csproj
+++ b/WebApi/WebApi.csproj
@@ -287,6 +287,7 @@
+
@@ -300,7 +301,9 @@
-
+
+ Designer
+
@@ -316,7 +319,9 @@
Designer
-
+
+ Designer
+
@@ -370,7 +375,7 @@
-
+
@@ -394,7 +399,7 @@
- powershell.exe -file "$(SolutionDir)SolutionItems\Scripts\Build\WebApiWarmUp.ps1"
+ powershell.exe -ExecutionPolicy Unrestricted -file "$(SolutionDir)SolutionItems\Scripts\Build\WebApiWarmUp.ps1"
-
-
-
-
- The page you were looking for appears to have been moved, deleted or does not exist.
- Wanna go back to our home page?
-
-
-
diff --git a/ngClient/_system/views/content/notFound.html b/ngClient/_system/views/content/notFound.html
new file mode 100644
index 000000000..3518266b4
--- /dev/null
+++ b/ngClient/_system/views/content/notFound.html
@@ -0,0 +1,13 @@
+
+
+
Are you lost?
+
+
+
+
+ The page you were looking for appears to have been moved, deleted or does not exist.
+ Wanna go back to our home page?
+