From bc0a691ef19d1f8ce536f7cce6d7289ea026adf2 Mon Sep 17 00:00:00 2001 From: "binodnp@outlook.com" Date: Thu, 30 Nov 2017 21:59:22 +0545 Subject: [PATCH 01/18] Updated dashboard theme. Reporting engine refactoring. --- .../Frapid.Dashboard/Themes/frapid/contents/dashboard.css | 4 ++-- src/Frapid.Web/Areas/Frapid.Reports/Frapid.Reports.csproj | 3 ++- .../{ToOpenOfficeSpreadSheet.cs => FakeExcelConverter.cs} | 0 .../Areas/Frapid.Reports/HtmlConverters/HtmlWriter.cs | 2 +- .../Areas/Frapid.Reports/HtmlConverters/ToOpenOfficeWord.cs | 2 +- .../Areas/Frapid.Reports/HtmlConverters/WkHtmlToPdf.cs | 2 +- 6 files changed, 7 insertions(+), 6 deletions(-) rename src/Frapid.Web/Areas/Frapid.Reports/HtmlConverters/{ToOpenOfficeSpreadSheet.cs => FakeExcelConverter.cs} (100%) diff --git a/src/Frapid.Web/Areas/Frapid.Dashboard/Overrides/Frapid.Dashboard/Themes/frapid/contents/dashboard.css b/src/Frapid.Web/Areas/Frapid.Dashboard/Overrides/Frapid.Dashboard/Themes/frapid/contents/dashboard.css index 9667e094..c810c719 100644 --- a/src/Frapid.Web/Areas/Frapid.Dashboard/Overrides/Frapid.Dashboard/Themes/frapid/contents/dashboard.css +++ b/src/Frapid.Web/Areas/Frapid.Dashboard/Overrides/Frapid.Dashboard/Themes/frapid/contents/dashboard.css @@ -608,11 +608,11 @@ input[data-feature-search] { color: #A67261 !important; } -.ui.table a { +.ui.table a:not(.button) { color: #888 !important; } - .ui.table a:hover { + .ui.table a:not(.button):hover { color: #333 !important; } diff --git a/src/Frapid.Web/Areas/Frapid.Reports/Frapid.Reports.csproj b/src/Frapid.Web/Areas/Frapid.Reports/Frapid.Reports.csproj index e3168f1a..fbc2259b 100644 --- a/src/Frapid.Web/Areas/Frapid.Reports/Frapid.Reports.csproj +++ b/src/Frapid.Web/Areas/Frapid.Reports/Frapid.Reports.csproj @@ -24,6 +24,7 @@ + true @@ -181,7 +182,7 @@ - + diff --git a/src/Frapid.Web/Areas/Frapid.Reports/HtmlConverters/ToOpenOfficeSpreadSheet.cs b/src/Frapid.Web/Areas/Frapid.Reports/HtmlConverters/FakeExcelConverter.cs similarity index 100% rename from src/Frapid.Web/Areas/Frapid.Reports/HtmlConverters/ToOpenOfficeSpreadSheet.cs rename to src/Frapid.Web/Areas/Frapid.Reports/HtmlConverters/FakeExcelConverter.cs diff --git a/src/Frapid.Web/Areas/Frapid.Reports/HtmlConverters/HtmlWriter.cs b/src/Frapid.Web/Areas/Frapid.Reports/HtmlConverters/HtmlWriter.cs index 671473a4..7440e4a7 100644 --- a/src/Frapid.Web/Areas/Frapid.Reports/HtmlConverters/HtmlWriter.cs +++ b/src/Frapid.Web/Areas/Frapid.Reports/HtmlConverters/HtmlWriter.cs @@ -10,7 +10,7 @@ public static void WriteHtml(string path, string html) { var destination = new FileInfo(PathMapper.MapPath(path)); - if (!destination.Directory.Exists) + if (destination.Directory != null && !destination.Directory.Exists) { destination.Directory.Create(); } diff --git a/src/Frapid.Web/Areas/Frapid.Reports/HtmlConverters/ToOpenOfficeWord.cs b/src/Frapid.Web/Areas/Frapid.Reports/HtmlConverters/ToOpenOfficeWord.cs index d43902e3..8b59c4f6 100644 --- a/src/Frapid.Web/Areas/Frapid.Reports/HtmlConverters/ToOpenOfficeWord.cs +++ b/src/Frapid.Web/Areas/Frapid.Reports/HtmlConverters/ToOpenOfficeWord.cs @@ -25,7 +25,7 @@ public string Export(string tenant, string html, string fileName, string destina var file = new FileInfo(PathMapper.MapPath(destination)); - if (!file.Directory.Exists) + if (file.Directory != null && !file.Directory.Exists) { file.Directory.Create(); } diff --git a/src/Frapid.Web/Areas/Frapid.Reports/HtmlConverters/WkHtmlToPdf.cs b/src/Frapid.Web/Areas/Frapid.Reports/HtmlConverters/WkHtmlToPdf.cs index 775bb74c..850a36a9 100644 --- a/src/Frapid.Web/Areas/Frapid.Reports/HtmlConverters/WkHtmlToPdf.cs +++ b/src/Frapid.Web/Areas/Frapid.Reports/HtmlConverters/WkHtmlToPdf.cs @@ -24,7 +24,7 @@ public string Export(string tenant, string html, string fileName, string destina var file = new FileInfo(PathMapper.MapPath(destination)); - if (!file.Directory.Exists) + if (file.Directory != null && !file.Directory.Exists) { file.Directory.Create(); } From e29459788793728636772f37462ce8971ce51281 Mon Sep 17 00:00:00 2001 From: "binodnp@outlook.com" Date: Fri, 15 Dec 2017 21:59:05 +0545 Subject: [PATCH 02/18] Frapid Reports: Fixed a bug related to checkbox/boolean. --- src/Frapid.Web/Areas/Frapid.Reports/Views/Index.cshtml | 4 ++-- src/Frapid.Web/Areas/Frapid.Reports/scripts/reports.js | 8 +++++++- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/src/Frapid.Web/Areas/Frapid.Reports/Views/Index.cshtml b/src/Frapid.Web/Areas/Frapid.Reports/Views/Index.cshtml index 2f8d8d80..37da1f99 100644 --- a/src/Frapid.Web/Areas/Frapid.Reports/Views/Index.cshtml +++ b/src/Frapid.Web/Areas/Frapid.Reports/Views/Index.cshtml @@ -74,8 +74,8 @@ break; case "BOOL": case "BOOLEAN": -
- +
+
break; diff --git a/src/Frapid.Web/Areas/Frapid.Reports/scripts/reports.js b/src/Frapid.Web/Areas/Frapid.Reports/scripts/reports.js index 6191c8b8..a73abfeb 100644 --- a/src/Frapid.Web/Areas/Frapid.Reports/scripts/reports.js +++ b/src/Frapid.Web/Areas/Frapid.Reports/scripts/reports.js @@ -92,7 +92,11 @@ $("#ShowButton").off("click").on("click", function () { $.each(otherEls, function () { const el = $(this); const parameter = el.attr("data-paramter"); - const value = el.val(); + var value = el.val(); + + if (el.is("input[type='checkbox']")) { + value = el.is(":checked"); + }; const id = el.attr("id"); @@ -413,3 +417,5 @@ if (top.parent) { top.parent.removeToolbar(); }; }; + +$("input[type='checkbox'][data-checked='true']").prop("checked", true); \ No newline at end of file From a14fc82086f9b07680d7cbcbe2d83a84e100dec5 Mon Sep 17 00:00:00 2001 From: "binodnp@outlook.com" Date: Sun, 17 Dec 2017 19:50:09 +0545 Subject: [PATCH 03/18] Fixed null reference exception bug in reporting engine. --- src/Frapid.Web/Areas/Frapid.Reports/Views/Index.cshtml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Frapid.Web/Areas/Frapid.Reports/Views/Index.cshtml b/src/Frapid.Web/Areas/Frapid.Reports/Views/Index.cshtml index 37da1f99..2b6cf4e1 100644 --- a/src/Frapid.Web/Areas/Frapid.Reports/Views/Index.cshtml +++ b/src/Frapid.Web/Areas/Frapid.Reports/Views/Index.cshtml @@ -75,7 +75,7 @@ case "BOOL": case "BOOLEAN":
- +
break; From 413d70667edee68e03412aa55475086bb4d69fef Mon Sep 17 00:00:00 2001 From: "binodnp@outlook.com" Date: Wed, 7 Mar 2018 23:05:52 +0545 Subject: [PATCH 04/18] Updated codebase to display user friendly database error messages. --- .../account.complete_reset.sql | 40 +++ .../account.complete_reset.sql | 66 ++++ .../modules/scrud-factory/form/form-save.js | 2 +- .../modules/scrud-factory/view/filters.js | 2 +- .../modules/scrud-factory/view/import.js | 2 +- .../Frapid.DataAccess/DataAccessException.cs | 4 + .../Frapid.DataAccess/DbErrorParser.cs | 79 +++++ .../Errors/PostgreSQL/UniqueKeyViolation.cs | 28 ++ .../Errors/SqlServer/UniqueKeyViolation.cs | 28 ++ .../Frapid.DataAccess.csproj | 5 + .../Frapid.DataAccess/IDbErrorMessage.cs | 13 + .../DataAccess/FilterRepository.cs | 50 ++- .../DataAccess/FormRepository.cs | 326 +++++++++++++++--- .../DataAccess/KanbanRepository.cs | 11 +- .../DataAccess/ViewRepository.cs | 136 +++++++- 15 files changed, 720 insertions(+), 72 deletions(-) create mode 100644 src/Frapid.Web/Areas/Frapid.Account/db/PostgreSQL/1.1.update/src/06.functions-and-logic/account.complete_reset.sql create mode 100644 src/Frapid.Web/Areas/Frapid.Account/db/SQL Server/1.1.update/src/06.functions-and-logic/account.complete_reset.sql create mode 100644 src/Libraries/Frapid.DataAccess/DbErrorParser.cs create mode 100644 src/Libraries/Frapid.DataAccess/Errors/PostgreSQL/UniqueKeyViolation.cs create mode 100644 src/Libraries/Frapid.DataAccess/Errors/SqlServer/UniqueKeyViolation.cs create mode 100644 src/Libraries/Frapid.DataAccess/IDbErrorMessage.cs diff --git a/src/Frapid.Web/Areas/Frapid.Account/db/PostgreSQL/1.1.update/src/06.functions-and-logic/account.complete_reset.sql b/src/Frapid.Web/Areas/Frapid.Account/db/PostgreSQL/1.1.update/src/06.functions-and-logic/account.complete_reset.sql new file mode 100644 index 00000000..c96b0a97 --- /dev/null +++ b/src/Frapid.Web/Areas/Frapid.Account/db/PostgreSQL/1.1.update/src/06.functions-and-logic/account.complete_reset.sql @@ -0,0 +1,40 @@ +DROP FUNCTION IF EXISTS account.complete_reset +( + _request_id uuid, + _password text +); + +CREATE FUNCTION account.complete_reset +( + _request_id uuid, + _password text +) +RETURNS void +AS +$$ + DECLARE _user_id integer; + DECLARE _email text; +BEGIN + SELECT + account.users.user_id, + account.users.email + INTO + _user_id, + _email + FROM account.reset_requests + INNER JOIN account.users + ON account.users.user_id = account.reset_requests.user_id + WHERE account.reset_requests.request_id = _request_id + AND expires_on >= NOW(); + + UPDATE account.users + SET + password = _password + WHERE user_id = _user_id; + + UPDATE account.reset_requests + SET confirmed = true, confirmed_on = NOW() + WHERE account.reset_requests.request_id = _request_id; +END +$$ +LANGUAGE plpgsql; diff --git a/src/Frapid.Web/Areas/Frapid.Account/db/SQL Server/1.1.update/src/06.functions-and-logic/account.complete_reset.sql b/src/Frapid.Web/Areas/Frapid.Account/db/SQL Server/1.1.update/src/06.functions-and-logic/account.complete_reset.sql new file mode 100644 index 00000000..0bc204b6 --- /dev/null +++ b/src/Frapid.Web/Areas/Frapid.Account/db/SQL Server/1.1.update/src/06.functions-and-logic/account.complete_reset.sql @@ -0,0 +1,66 @@ +IF OBJECT_ID('account.complete_reset') IS NOT NULL +DROP PROCEDURE account.complete_reset; + +GO + +CREATE PROCEDURE account.complete_reset +( + @request_id uniqueidentifier, + @password national character varying(500) +) +AS +BEGIN + SET NOCOUNT ON; + SET XACT_ABORT ON; + + DECLARE @user_id integer; + DECLARE @email national character varying(500); + + BEGIN TRY + DECLARE @tran_count int = @@TRANCOUNT; + + IF(@tran_count= 0) + BEGIN + BEGIN TRANSACTION + END; + + SELECT + @user_id = account.users.user_id, + @email = account.users.email + FROM account.reset_requests + INNER JOIN account.users + ON account.users.user_id = account.reset_requests.user_id + WHERE account.reset_requests.request_id = @request_id + AND expires_on >= getutcdate() + AND account.reset_requests.deleted = 0; + + + UPDATE account.users + SET + password = @password + WHERE user_id = @user_id; + + UPDATE account.reset_requests + SET confirmed = 1, confirmed_on = getutcdate() + WHERE account.reset_requests.request_id = @request_id; + + IF(@tran_count = 0) + BEGIN + COMMIT TRANSACTION; + END; + END TRY + BEGIN CATCH + IF(XACT_STATE() <> 0 AND @tran_count = 0) + BEGIN + ROLLBACK TRANSACTION; + END; + + DECLARE @ErrorMessage national character varying(4000) = ERROR_MESSAGE(); + DECLARE @ErrorSeverity int = ERROR_SEVERITY(); + DECLARE @ErrorState int = ERROR_STATE(); + RAISERROR (@ErrorMessage, @ErrorSeverity, @ErrorState); + END CATCH; +END; + + +GO \ No newline at end of file diff --git a/src/Frapid.Web/scripts/modules/scrud-factory/form/form-save.js b/src/Frapid.Web/scripts/modules/scrud-factory/form/form-save.js index 387f0489..bdc7b9c1 100644 --- a/src/Frapid.Web/scripts/modules/scrud-factory/form/form-save.js +++ b/src/Frapid.Web/scripts/modules/scrud-factory/form/form-save.js @@ -63,7 +63,7 @@ val = null; } else { if (wholeNumbers.indexOf(type) > -1) { - val = window.parseInt(val); + val = window.parseInt2(val); } else if (decimalNumber.indexOf(type) > -1) { val = window.parseFloat2(val); } else if (dateTypes.indexOf(type) > -1) { diff --git a/src/Frapid.Web/scripts/modules/scrud-factory/view/filters.js b/src/Frapid.Web/scripts/modules/scrud-factory/view/filters.js index 3d207383..4d667ede 100644 --- a/src/Frapid.Web/scripts/modules/scrud-factory/view/filters.js +++ b/src/Frapid.Web/scripts/modules/scrud-factory/view/filters.js @@ -51,7 +51,7 @@ var getQuerystringFilters = function () { val = null; } else { if (wholeNumbers.indexOf(type) > -1) { - val = window.parseInt(val); + val = window.parseInt2(val); } else if (decimalNumber.indexOf(type) > -1) { val = window.parseFloat2(val); } else if (dateTypes.indexOf(type) > -1) { diff --git a/src/Frapid.Web/scripts/modules/scrud-factory/view/import.js b/src/Frapid.Web/scripts/modules/scrud-factory/view/import.js index ff2aea22..bd07187e 100644 --- a/src/Frapid.Web/scripts/modules/scrud-factory/view/import.js +++ b/src/Frapid.Web/scripts/modules/scrud-factory/view/import.js @@ -11,7 +11,7 @@ val = null; } else { if (wholeNumbers.indexOf(type) > -1) { - val = window.parseInt(val); + val = window.parseInt2(val); } else if (decimalNumber.indexOf(type) > -1) { val = window.parseFloat2(val); } else if (dateTypes.indexOf(type) > -1) { diff --git a/src/Libraries/Frapid.DataAccess/DataAccessException.cs b/src/Libraries/Frapid.DataAccess/DataAccessException.cs index 7271fdf1..7c303a92 100644 --- a/src/Libraries/Frapid.DataAccess/DataAccessException.cs +++ b/src/Libraries/Frapid.DataAccess/DataAccessException.cs @@ -19,6 +19,10 @@ public DataAccessException([Localizable(true)] string message, Exception excepti { } + public DataAccessException(string database, [Localizable(true)] string message, Exception exception) : base(DbErrorParser.GetException(database, message, exception), exception) + { + } + protected DataAccessException(SerializationInfo info, StreamingContext context) : base(info, context) { } diff --git a/src/Libraries/Frapid.DataAccess/DbErrorParser.cs b/src/Libraries/Frapid.DataAccess/DbErrorParser.cs new file mode 100644 index 00000000..dd6f5a2e --- /dev/null +++ b/src/Libraries/Frapid.DataAccess/DbErrorParser.cs @@ -0,0 +1,79 @@ +using System; +using System.Data.Common; +using System.Data.SqlClient; +using System.Globalization; +using System.Linq; +using Frapid.Configuration.Db; +using Frapid.Framework.Extensions; +using Frapid.Mapper.Database; +using Npgsql; + +namespace Frapid.DataAccess +{ + public static class DbErrorParser + { + public static string GetException(string database, string message, Exception exception) + { + if (!(exception is DbException ex)) + { + return message; + } + + string identifier = string.Empty; + DatabaseType dbType; + + using (var db = DbProvider.GetDatabase(database)) + { + dbType = db.DatabaseType; + + switch (dbType) + { + case DatabaseType.PostgreSQL: + identifier = GetPostgreSQLErrorCode(ex); + break; + case DatabaseType.SqlServer: + identifier = GetSqlServerErrorCode(ex); + break; + } + } + + if (string.IsNullOrWhiteSpace(identifier)) + { + return message; + } + + var type = typeof(IDbErrorMessage); + var members = type.GetTypeMembersNotAbstract(); + + foreach (var candidate in members.Where(x => x.DatabaseType == dbType && x.Identifiers.Contains(identifier))) + { + return candidate.Parse(ex); + } + + return message; + } + + private static string GetPostgreSQLErrorCode(DbException ex) + { + if (!(ex is PostgresException inner)) + { + return string.Empty; + } + + string identifier = inner.SqlState; + return identifier; + } + + private static string GetSqlServerErrorCode(DbException ex) + { + if (!(ex is SqlException inner)) + { + return string.Empty; + } + + //SELECT * FROM sys.sysmessages + //will return all error numbers + return inner.Number.ToString(CultureInfo.InvariantCulture); + } + } +} \ No newline at end of file diff --git a/src/Libraries/Frapid.DataAccess/Errors/PostgreSQL/UniqueKeyViolation.cs b/src/Libraries/Frapid.DataAccess/Errors/PostgreSQL/UniqueKeyViolation.cs new file mode 100644 index 00000000..3dfb4677 --- /dev/null +++ b/src/Libraries/Frapid.DataAccess/Errors/PostgreSQL/UniqueKeyViolation.cs @@ -0,0 +1,28 @@ +using System; +using System.ComponentModel; +using System.Data.Common; +using Frapid.Mapper.Database; +using Npgsql; + +namespace Frapid.DataAccess.Errors.PostgreSQL +{ + public sealed class UniqueKeyViolation : IDbErrorMessage + { + [Localizable(true)] + public string ErrorMessage { get; } = "Duplicate entry. Please recheck the form and try again."; + + public DatabaseType DatabaseType { get; } = DatabaseType.PostgreSQL; + public string[] Identifiers { get; } = {"23505"}; + + public string Parse(DbException ex) + { + if (!(ex is PostgresException inner)) + { + return ex.Message; + } + + + return this.ErrorMessage + Environment.NewLine + inner.Detail; + } + } +} \ No newline at end of file diff --git a/src/Libraries/Frapid.DataAccess/Errors/SqlServer/UniqueKeyViolation.cs b/src/Libraries/Frapid.DataAccess/Errors/SqlServer/UniqueKeyViolation.cs new file mode 100644 index 00000000..66f8c68a --- /dev/null +++ b/src/Libraries/Frapid.DataAccess/Errors/SqlServer/UniqueKeyViolation.cs @@ -0,0 +1,28 @@ +using System; +using System.ComponentModel; +using System.Data.Common; +using System.Data.SqlClient; +using Frapid.Mapper.Database; + +namespace Frapid.DataAccess.Errors.SqlServer +{ + public sealed class UniqueKeyViolation : IDbErrorMessage + { + [Localizable(true)] + public string ErrorMessage { get; } = "Duplicate entry. Please recheck the form and try again."; + + public DatabaseType DatabaseType { get; } = DatabaseType.SqlServer; + public string[] Identifiers { get; } = {"2601", "2627"}; + + public string Parse(DbException ex) + { + if (!(ex is SqlException inner)) + { + return ex.Message; + } + + + return this.ErrorMessage + Environment.NewLine + inner.Message; + } + } +} \ No newline at end of file diff --git a/src/Libraries/Frapid.DataAccess/Frapid.DataAccess.csproj b/src/Libraries/Frapid.DataAccess/Frapid.DataAccess.csproj index 1ca5a583..65c30349 100644 --- a/src/Libraries/Frapid.DataAccess/Frapid.DataAccess.csproj +++ b/src/Libraries/Frapid.DataAccess/Frapid.DataAccess.csproj @@ -56,8 +56,11 @@ + + + @@ -78,6 +81,7 @@ + @@ -101,6 +105,7 @@ Frapid.Mapper + -->-- src/Frapid.Web/Areas/Frapid.Account/db/PostgreSQL/1.1.update/src/05.scrud-views/empty.sql --<--<-- +-->-->-- src/Frapid.Web/Areas/Frapid.Account/db/PostgreSQL/1.1.update/src/06.functions-and-logic/account.complete_reset.sql --<--<-- +DROP FUNCTION IF EXISTS account.complete_reset +( + _request_id uuid, + _password text +); + +CREATE FUNCTION account.complete_reset +( + _request_id uuid, + _password text +) +RETURNS void +AS +$$ + DECLARE _user_id integer; + DECLARE _email text; +BEGIN + SELECT + account.users.user_id, + account.users.email + INTO + _user_id, + _email + FROM account.reset_requests + INNER JOIN account.users + ON account.users.user_id = account.reset_requests.user_id + WHERE account.reset_requests.request_id = _request_id + AND expires_on >= NOW(); + + UPDATE account.users + SET + password = _password + WHERE user_id = _user_id; + + UPDATE account.reset_requests + SET confirmed = true, confirmed_on = NOW() + WHERE account.reset_requests.request_id = _request_id; +END +$$ +LANGUAGE plpgsql; + + -->-->-- src/Frapid.Web/Areas/Frapid.Account/db/PostgreSQL/1.1.update/src/06.functions-and-logic/empty.sql --<--<-- diff --git a/src/Frapid.Web/Areas/Frapid.Account/db/PostgreSQL/1.x/1.0/account-blank.sql b/src/Frapid.Web/Areas/Frapid.Account/db/PostgreSQL/1.x/1.0/account-blank.sql index dacecfee..9ddde522 100644 --- a/src/Frapid.Web/Areas/Frapid.Account/db/PostgreSQL/1.x/1.0/account-blank.sql +++ b/src/Frapid.Web/Areas/Frapid.Account/db/PostgreSQL/1.x/1.0/account-blank.sql @@ -366,7 +366,8 @@ BEGIN WHERE user_id = _user_id; UPDATE account.reset_requests - SET confirmed = true, confirmed_on = NOW(); + SET confirmed = true, confirmed_on = NOW() + WHERE user_id = _user_id; END $$ LANGUAGE plpgsql; diff --git a/src/Frapid.Web/Areas/Frapid.Account/db/PostgreSQL/1.x/1.0/src/02.functions-and-logic/account.complete_reset.sql b/src/Frapid.Web/Areas/Frapid.Account/db/PostgreSQL/1.x/1.0/src/02.functions-and-logic/account.complete_reset.sql index adade7e4..ddc8b91a 100644 --- a/src/Frapid.Web/Areas/Frapid.Account/db/PostgreSQL/1.x/1.0/src/02.functions-and-logic/account.complete_reset.sql +++ b/src/Frapid.Web/Areas/Frapid.Account/db/PostgreSQL/1.x/1.0/src/02.functions-and-logic/account.complete_reset.sql @@ -33,7 +33,8 @@ BEGIN WHERE user_id = _user_id; UPDATE account.reset_requests - SET confirmed = true, confirmed_on = NOW(); + SET confirmed = true, confirmed_on = NOW() + WHERE user_id = _user_id; END $$ LANGUAGE plpgsql; diff --git a/src/Frapid.Web/Areas/Frapid.Account/db/PostgreSQL/account-blank-1.1.update.sql b/src/Frapid.Web/Areas/Frapid.Account/db/PostgreSQL/account-blank-1.1.update.sql index 17ed2a25..b3c2f75a 100644 --- a/src/Frapid.Web/Areas/Frapid.Account/db/PostgreSQL/account-blank-1.1.update.sql +++ b/src/Frapid.Web/Areas/Frapid.Account/db/PostgreSQL/account-blank-1.1.update.sql @@ -7,6 +7,49 @@ -->-->-- src/Frapid.Web/Areas/Frapid.Account/db/PostgreSQL/1.1.update/src/05.scrud-views/empty.sql --<--<-- +-->-->-- src/Frapid.Web/Areas/Frapid.Account/db/PostgreSQL/1.1.update/src/06.functions-and-logic/account.complete_reset.sql --<--<-- +DROP FUNCTION IF EXISTS account.complete_reset +( + _request_id uuid, + _password text +); + +CREATE FUNCTION account.complete_reset +( + _request_id uuid, + _password text +) +RETURNS void +AS +$$ + DECLARE _user_id integer; + DECLARE _email text; +BEGIN + SELECT + account.users.user_id, + account.users.email + INTO + _user_id, + _email + FROM account.reset_requests + INNER JOIN account.users + ON account.users.user_id = account.reset_requests.user_id + WHERE account.reset_requests.request_id = _request_id + AND expires_on >= NOW(); + + UPDATE account.users + SET + password = _password + WHERE user_id = _user_id; + + UPDATE account.reset_requests + SET confirmed = true, confirmed_on = NOW() + WHERE account.reset_requests.request_id = _request_id; +END +$$ +LANGUAGE plpgsql; + + -->-->-- src/Frapid.Web/Areas/Frapid.Account/db/PostgreSQL/1.1.update/src/06.functions-and-logic/empty.sql --<--<-- diff --git a/src/Frapid.Web/Areas/Frapid.Account/db/PostgreSQL/account-blank.sql b/src/Frapid.Web/Areas/Frapid.Account/db/PostgreSQL/account-blank.sql index dacecfee..9ddde522 100644 --- a/src/Frapid.Web/Areas/Frapid.Account/db/PostgreSQL/account-blank.sql +++ b/src/Frapid.Web/Areas/Frapid.Account/db/PostgreSQL/account-blank.sql @@ -366,7 +366,8 @@ BEGIN WHERE user_id = _user_id; UPDATE account.reset_requests - SET confirmed = true, confirmed_on = NOW(); + SET confirmed = true, confirmed_on = NOW() + WHERE user_id = _user_id; END $$ LANGUAGE plpgsql; diff --git a/src/Frapid.Web/Areas/Frapid.Account/db/SQL Server/1.1.update/account-blank-1.1.update.sql b/src/Frapid.Web/Areas/Frapid.Account/db/SQL Server/1.1.update/account-blank-1.1.update.sql index 0191af1a..4c701b7a 100644 --- a/src/Frapid.Web/Areas/Frapid.Account/db/SQL Server/1.1.update/account-blank-1.1.update.sql +++ b/src/Frapid.Web/Areas/Frapid.Account/db/SQL Server/1.1.update/account-blank-1.1.update.sql @@ -7,6 +7,74 @@ -->-->-- src/Frapid.Web/Areas/Frapid.Account/db/SQL Server/1.1.update/src/05.scrud-views/empty.sql --<--<-- +-->-->-- src/Frapid.Web/Areas/Frapid.Account/db/SQL Server/1.1.update/src/06.functions-and-logic/account.complete_reset.sql --<--<-- +IF OBJECT_ID('account.complete_reset') IS NOT NULL +DROP PROCEDURE account.complete_reset; + +GO + +CREATE PROCEDURE account.complete_reset +( + @request_id uniqueidentifier, + @password national character varying(500) +) +AS +BEGIN + SET NOCOUNT ON; + SET XACT_ABORT ON; + + DECLARE @user_id integer; + DECLARE @email national character varying(500); + + BEGIN TRY + DECLARE @tran_count int = @@TRANCOUNT; + + IF(@tran_count= 0) + BEGIN + BEGIN TRANSACTION + END; + + SELECT + @user_id = account.users.user_id, + @email = account.users.email + FROM account.reset_requests + INNER JOIN account.users + ON account.users.user_id = account.reset_requests.user_id + WHERE account.reset_requests.request_id = @request_id + AND expires_on >= getutcdate() + AND account.reset_requests.deleted = 0; + + + UPDATE account.users + SET + password = @password + WHERE user_id = @user_id; + + UPDATE account.reset_requests + SET confirmed = 1, confirmed_on = getutcdate() + WHERE account.reset_requests.request_id = @request_id; + + IF(@tran_count = 0) + BEGIN + COMMIT TRANSACTION; + END; + END TRY + BEGIN CATCH + IF(XACT_STATE() <> 0 AND @tran_count = 0) + BEGIN + ROLLBACK TRANSACTION; + END; + + DECLARE @ErrorMessage national character varying(4000) = ERROR_MESSAGE(); + DECLARE @ErrorSeverity int = ERROR_SEVERITY(); + DECLARE @ErrorState int = ERROR_STATE(); + RAISERROR (@ErrorMessage, @ErrorSeverity, @ErrorState); + END CATCH; +END; + + +GO + -->-->-- src/Frapid.Web/Areas/Frapid.Account/db/SQL Server/1.1.update/src/06.functions-and-logic/empty.sql --<--<-- diff --git a/src/Frapid.Web/Areas/Frapid.Account/db/SQL Server/1.x/1.0/account-blank.sql b/src/Frapid.Web/Areas/Frapid.Account/db/SQL Server/1.x/1.0/account-blank.sql index cbc9b2bc..4cba7d3e 100644 --- a/src/Frapid.Web/Areas/Frapid.Account/db/SQL Server/1.x/1.0/account-blank.sql +++ b/src/Frapid.Web/Areas/Frapid.Account/db/SQL Server/1.x/1.0/account-blank.sql @@ -381,7 +381,8 @@ BEGIN WHERE user_id = @user_id; UPDATE account.reset_requests - SET confirmed = 1, confirmed_on = getutcdate(); + SET confirmed = 1, confirmed_on = getutcdate() + WHERE user_id = @user_id; IF(@tran_count = 0) BEGIN diff --git a/src/Frapid.Web/Areas/Frapid.Account/db/SQL Server/1.x/1.0/src/02.functions-and-logic/account.complete_reset.sql b/src/Frapid.Web/Areas/Frapid.Account/db/SQL Server/1.x/1.0/src/02.functions-and-logic/account.complete_reset.sql index 70ecee0a..7ae3f866 100644 --- a/src/Frapid.Web/Areas/Frapid.Account/db/SQL Server/1.x/1.0/src/02.functions-and-logic/account.complete_reset.sql +++ b/src/Frapid.Web/Areas/Frapid.Account/db/SQL Server/1.x/1.0/src/02.functions-and-logic/account.complete_reset.sql @@ -41,7 +41,8 @@ BEGIN WHERE user_id = @user_id; UPDATE account.reset_requests - SET confirmed = 1, confirmed_on = getutcdate(); + SET confirmed = 1, confirmed_on = getutcdate() + WHERE user_id = @user_id; IF(@tran_count = 0) BEGIN diff --git a/src/Frapid.Web/Areas/Frapid.Account/db/SQL Server/account-blank-1.1.update.sql b/src/Frapid.Web/Areas/Frapid.Account/db/SQL Server/account-blank-1.1.update.sql index 0191af1a..4c701b7a 100644 --- a/src/Frapid.Web/Areas/Frapid.Account/db/SQL Server/account-blank-1.1.update.sql +++ b/src/Frapid.Web/Areas/Frapid.Account/db/SQL Server/account-blank-1.1.update.sql @@ -7,6 +7,74 @@ -->-->-- src/Frapid.Web/Areas/Frapid.Account/db/SQL Server/1.1.update/src/05.scrud-views/empty.sql --<--<-- +-->-->-- src/Frapid.Web/Areas/Frapid.Account/db/SQL Server/1.1.update/src/06.functions-and-logic/account.complete_reset.sql --<--<-- +IF OBJECT_ID('account.complete_reset') IS NOT NULL +DROP PROCEDURE account.complete_reset; + +GO + +CREATE PROCEDURE account.complete_reset +( + @request_id uniqueidentifier, + @password national character varying(500) +) +AS +BEGIN + SET NOCOUNT ON; + SET XACT_ABORT ON; + + DECLARE @user_id integer; + DECLARE @email national character varying(500); + + BEGIN TRY + DECLARE @tran_count int = @@TRANCOUNT; + + IF(@tran_count= 0) + BEGIN + BEGIN TRANSACTION + END; + + SELECT + @user_id = account.users.user_id, + @email = account.users.email + FROM account.reset_requests + INNER JOIN account.users + ON account.users.user_id = account.reset_requests.user_id + WHERE account.reset_requests.request_id = @request_id + AND expires_on >= getutcdate() + AND account.reset_requests.deleted = 0; + + + UPDATE account.users + SET + password = @password + WHERE user_id = @user_id; + + UPDATE account.reset_requests + SET confirmed = 1, confirmed_on = getutcdate() + WHERE account.reset_requests.request_id = @request_id; + + IF(@tran_count = 0) + BEGIN + COMMIT TRANSACTION; + END; + END TRY + BEGIN CATCH + IF(XACT_STATE() <> 0 AND @tran_count = 0) + BEGIN + ROLLBACK TRANSACTION; + END; + + DECLARE @ErrorMessage national character varying(4000) = ERROR_MESSAGE(); + DECLARE @ErrorSeverity int = ERROR_SEVERITY(); + DECLARE @ErrorState int = ERROR_STATE(); + RAISERROR (@ErrorMessage, @ErrorSeverity, @ErrorState); + END CATCH; +END; + + +GO + -->-->-- src/Frapid.Web/Areas/Frapid.Account/db/SQL Server/1.1.update/src/06.functions-and-logic/empty.sql --<--<-- diff --git a/src/Frapid.Web/Areas/Frapid.Account/db/SQL Server/account-blank.sql b/src/Frapid.Web/Areas/Frapid.Account/db/SQL Server/account-blank.sql index cbc9b2bc..4cba7d3e 100644 --- a/src/Frapid.Web/Areas/Frapid.Account/db/SQL Server/account-blank.sql +++ b/src/Frapid.Web/Areas/Frapid.Account/db/SQL Server/account-blank.sql @@ -381,7 +381,8 @@ BEGIN WHERE user_id = @user_id; UPDATE account.reset_requests - SET confirmed = 1, confirmed_on = getutcdate(); + SET confirmed = 1, confirmed_on = getutcdate() + WHERE user_id = @user_id; IF(@tran_count = 0) BEGIN diff --git a/src/Frapid.Web/scripts/frapid/core/libraries/notify.js b/src/Frapid.Web/scripts/frapid/core/libraries/notify.js index ff7e2841..d14e3b01 100644 --- a/src/Frapid.Web/scripts/frapid/core/libraries/notify.js +++ b/src/Frapid.Web/scripts/frapid/core/libraries/notify.js @@ -63,7 +63,7 @@ function displayNotification(message, type, alwaysDisplay){ spacing: 20, //number px theme: "default", //default | dark-theme autoHide: !alwaysDisplay, //true | false - delay: 3000, //number ms + delay: 10000, //number ms onShow: null, //function onClick: null, //function onHide: null, //function diff --git a/src/Frapid.Web/scripts/frapid/utilities/searchable.js b/src/Frapid.Web/scripts/frapid/utilities/searchable.js index 3ba533f2..a92277bc 100644 --- a/src/Frapid.Web/scripts/frapid/utilities/searchable.js +++ b/src/Frapid.Web/scripts/frapid/utilities/searchable.js @@ -89,25 +89,35 @@ template.modal('setting', 'transition', 'scale').modal("show"); }; + + $("select").keyup(function (e) { + function bindEvents(el){ + var id = el.attr("id"); + + if (!id) { + id = "Select" + (3000 + Math.floor(Math.random() * 600000)); + el.attr("id", id); + }; + + const label = el.parent().find("label").text(); + + displaySearchableModal(el, id, label); + }; + e = e || window.event; const keyCode = e.keyCode || e.which; const arrow = { left: 37, up: 38, right: 39, down: 40 }; + const el = $(this); if (e.ctrlKey) { if (keyCode === arrow.up || keyCode === arrow.right) { - const el = $(this); - var id = el.attr("id"); - - if (!id) { - id = "Select" + (3000 + Math.floor(Math.random() * 600000)); - el.attr("id", id); - }; - - const label = el.parent().find("label").text(); - - displaySearchableModal(el, id, label); + bindEvents(el); }; }; + + if(e.which === 68 && e.ctrlKey && e.shiftKey ){ + bindEvents(el); + }; }); }; diff --git a/src/Frapid.Web/scripts/modules/scrud-factory/shared/conversion.js b/src/Frapid.Web/scripts/modules/scrud-factory/shared/conversion.js index 433a4121..372b8a75 100644 --- a/src/Frapid.Web/scripts/modules/scrud-factory/shared/conversion.js +++ b/src/Frapid.Web/scripts/modules/scrud-factory/shared/conversion.js @@ -1,6 +1,6 @@ var stringTypes = ["varchar", "text", "nvarchar"]; var wholeNumbers = ["_bigint", "_int2", "_int4", "int", "_int8", "_integer", "_integer_strict", "_integer_strict2", "_serial4", "_serial8", "_smallint", "bigint", "bigint[]", "int2", "int2[]", "int4", "int4[]", "int8", "int8[]", "integer", "integer[]", "integer_strict", "integer_strict2", "integer_strict2[]", "integer_strict[]", "serial4", "serial4[]", "serial8", "serial8[]", "smallint", "smallint[]"]; -var decimalNumber = ["_decimal_strict", "_decimal_strict2", "_float4", "_float8", "_money", "_money_strict", "_money_strict2", "_numeric", "decimal_strict", "decimal_strict2", "decimal_strict2[]", "decimal_strict[]", "float4", "float4[]", "float8", "float8[]", "money", "money[]", "money_strict", "money_strict2", "money_strict2[]", "money_strict[]", "numeric", "numeric[]", "decimal"]; +var decimalNumber = ["_decimal_strict", "_decimal_strict2", "_float4", "_float8", "_money", "_money_strict", "_money_strict2", "_numeric", "decimal_strict", "decimal_strict2", "decimal_strict2[]", "decimal_strict[]", "float4", "float4[]", "float8", "float8[]", "money", "money[]", "money_strict", "money_strict2", "money_strict2[]", "money_strict[]", "numeric", "numeric[]", "decimal", "decimal?"]; var booleans = ["bit", "bool", "bool?", "System.Boolean", "System.Boolean?"]; var dateTypes = ["System.DateTime", "System.DateTime?", "datetimeoffset", "datetime", "timestamp", "timestamptz", "date"]; diff --git a/src/Libraries/Frapid.Framework/Extensions/RequestExtensions.cs b/src/Libraries/Frapid.Framework/Extensions/RequestExtensions.cs index 15f8eb30..af869011 100644 --- a/src/Libraries/Frapid.Framework/Extensions/RequestExtensions.cs +++ b/src/Libraries/Frapid.Framework/Extensions/RequestExtensions.cs @@ -130,6 +130,14 @@ public static string GetBearerToken(this HttpRequestMessage request) //ASP.net MVC public static string GetClientToken(this HttpRequestBase request) { + var authHead = request.Headers["Authorization"]; + var token = authHead?.ToString().Replace("Bearer ", "") ?? string.Empty; + + if (!string.IsNullOrWhiteSpace(token)) + { + return token; + } + if (!request.Cookies.AllKeys.Contains("access_token")) { return string.Empty; From 6e5c710ebd2e458a993acd570c9f652abe35bf43 Mon Sep 17 00:00:00 2001 From: "binodnp@outlook.com" Date: Tue, 19 Jun 2018 15:52:16 +0545 Subject: [PATCH 08/18] Routine development. --- .../Areas/ElasticEmail/ElasticEmail.csproj | 4 +- .../Frapid.Account/Frapid.Account.csproj | 4 +- .../1.1.update/accounr-blank-1.1.update.sql | 80 +++ .../account.sign_in.sql | 78 +++ .../PostgreSQL/account-blank-1.1.update.sql | 80 +++ .../Frapid.AddressBook.csproj | 4 +- .../Frapid.Authorization.csproj | 4 +- .../Frapid.Calendar/Frapid.Calendar.csproj | 4 +- .../Areas/Frapid.Config/Frapid.Config.csproj | 4 +- .../Frapid.Dashboard/Frapid.Dashboard.csproj | 4 +- .../Frapid.Dashboard/Themes/frapid/custom.js | 4 +- .../Frapid.Reports/Frapid.Reports.csproj | 4 +- .../Frapid.SchemaUpdater.csproj | 4 +- .../Frapid.WebsiteBuilder.csproj | 4 +- src/Frapid.Web/Areas/Google/Google.csproj | 4 +- .../Areas/MixERP.Social/MixERP.Social.csproj | 4 +- .../Areas/SendGridMail/SendGridMail.csproj | 4 +- .../Areas/SparkPostMail/SparkPostMail.csproj | 4 +- src/Frapid.Web/Frapid.Web - Copy.csproj | 558 ++++++++++++++++++ src/Frapid.Web/Frapid.Web.csproj | 4 +- src/Frapid.Web/Packages/i18n/ar.yaml | 12 +- src/Frapid.Web/Packages/i18n/de.yaml | 12 +- src/Frapid.Web/Packages/i18n/en.yaml | 12 +- src/Frapid.Web/Packages/i18n/es.yaml | 12 +- src/Frapid.Web/Packages/i18n/fr.yaml | 12 +- src/Frapid.Web/Packages/i18n/ne.yaml | 14 +- src/Frapid.Web/Packages/i18n/ru.yaml | 12 +- .../modules/scrud-factory/view/filters.js | 3 + src/Templates/MVCProject/MVCProject.csproj | 4 +- 29 files changed, 897 insertions(+), 56 deletions(-) create mode 100644 src/Frapid.Web/Areas/Frapid.Account/db/PostgreSQL/1.1.update/src/06.functions-and-logic/account.sign_in.sql create mode 100644 src/Frapid.Web/Frapid.Web - Copy.csproj diff --git a/src/Frapid.Web/Areas/ElasticEmail/ElasticEmail.csproj b/src/Frapid.Web/Areas/ElasticEmail/ElasticEmail.csproj index f88f3e44..88b0670b 100644 --- a/src/Frapid.Web/Areas/ElasticEmail/ElasticEmail.csproj +++ b/src/Frapid.Web/Areas/ElasticEmail/ElasticEmail.csproj @@ -176,8 +176,8 @@ $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - - + diff --git a/src/Frapid.Web/Areas/Frapid.Account/Frapid.Account.csproj b/src/Frapid.Web/Areas/Frapid.Account/Frapid.Account.csproj index fc6c455f..603ba408 100644 --- a/src/Frapid.Web/Areas/Frapid.Account/Frapid.Account.csproj +++ b/src/Frapid.Web/Areas/Frapid.Account/Frapid.Account.csproj @@ -258,8 +258,8 @@ $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - - + diff --git a/src/Frapid.Web/Areas/Frapid.Account/db/PostgreSQL/1.1.update/accounr-blank-1.1.update.sql b/src/Frapid.Web/Areas/Frapid.Account/db/PostgreSQL/1.1.update/accounr-blank-1.1.update.sql index b3c2f75a..07480c33 100644 --- a/src/Frapid.Web/Areas/Frapid.Account/db/PostgreSQL/1.1.update/accounr-blank-1.1.update.sql +++ b/src/Frapid.Web/Areas/Frapid.Account/db/PostgreSQL/1.1.update/accounr-blank-1.1.update.sql @@ -50,6 +50,86 @@ $$ LANGUAGE plpgsql; +-->-->-- src/Frapid.Web/Areas/Frapid.Account/db/PostgreSQL/1.1.update/src/06.functions-and-logic/account.sign_in.sql --<--<-- +DROP FUNCTION IF EXISTS account.sign_in +( + _email text, + _office_id integer, + _browser text, + _ip_address text, + _culture text +); + +CREATE FUNCTION account.sign_in +( + _email text, + _office_id integer, + _browser text, + _ip_address text, + _culture text +) +RETURNS TABLE +( + login_id bigint, + status boolean, + message text +) +AS +$$ + DECLARE _login_id bigint; + DECLARE _user_id integer; +BEGIN + IF(COALESCE(_office_id, 0) = 0) THEN + IF(SELECT COUNT(*) = 1 FROM core.offices) THEN + SELECT office_id INTO _office_id + FROM core.offices; + END IF; + END IF; + + IF account.is_restricted_user(_email) THEN + RETURN QUERY + SELECT NULL::bigint, false, 'Access is denied'::text; + + RETURN; + END IF; + + SELECT user_id INTO _user_id + FROM account.users + WHERE email = _email; + + IF NOT EXISTS + ( + SELECT * + FROM account.users + WHERE user_id = _user_id + AND _office_id IN (SELECT * FROM core.get_office_ids(account.users.office_id)) + + ) THEN + RETURN QUERY + SELECT NULL::bigint, false, 'Access is denied, you are not allowed to login to this branch office.'::text; + + RETURN; + END IF; + + + UPDATE account.logins + SET is_active = false + WHERE user_id=_user_id + AND office_id = _office_id + AND browser = _browser + AND ip_address = _ip_address; + + INSERT INTO account.logins(user_id, office_id, browser, ip_address, login_timestamp, culture) + SELECT _user_id, _office_id, _browser, _ip_address, NOW(), COALESCE(_culture, '') + RETURNING account.logins.login_id INTO _login_id; + + RETURN QUERY + SELECT _login_id, true, 'Welcome'::text; + RETURN; +END +$$ +LANGUAGE plpgsql; + -->-->-- src/Frapid.Web/Areas/Frapid.Account/db/PostgreSQL/1.1.update/src/06.functions-and-logic/empty.sql --<--<-- diff --git a/src/Frapid.Web/Areas/Frapid.Account/db/PostgreSQL/1.1.update/src/06.functions-and-logic/account.sign_in.sql b/src/Frapid.Web/Areas/Frapid.Account/db/PostgreSQL/1.1.update/src/06.functions-and-logic/account.sign_in.sql new file mode 100644 index 00000000..b49812c8 --- /dev/null +++ b/src/Frapid.Web/Areas/Frapid.Account/db/PostgreSQL/1.1.update/src/06.functions-and-logic/account.sign_in.sql @@ -0,0 +1,78 @@ +DROP FUNCTION IF EXISTS account.sign_in +( + _email text, + _office_id integer, + _browser text, + _ip_address text, + _culture text +); + +CREATE FUNCTION account.sign_in +( + _email text, + _office_id integer, + _browser text, + _ip_address text, + _culture text +) +RETURNS TABLE +( + login_id bigint, + status boolean, + message text +) +AS +$$ + DECLARE _login_id bigint; + DECLARE _user_id integer; +BEGIN + IF(COALESCE(_office_id, 0) = 0) THEN + IF(SELECT COUNT(*) = 1 FROM core.offices) THEN + SELECT office_id INTO _office_id + FROM core.offices; + END IF; + END IF; + + IF account.is_restricted_user(_email) THEN + RETURN QUERY + SELECT NULL::bigint, false, 'Access is denied'::text; + + RETURN; + END IF; + + SELECT user_id INTO _user_id + FROM account.users + WHERE email = _email; + + IF NOT EXISTS + ( + SELECT * + FROM account.users + WHERE user_id = _user_id + AND _office_id IN (SELECT * FROM core.get_office_ids(account.users.office_id)) + + ) THEN + RETURN QUERY + SELECT NULL::bigint, false, 'Access is denied, you are not allowed to login to this branch office.'::text; + + RETURN; + END IF; + + + UPDATE account.logins + SET is_active = false + WHERE user_id=_user_id + AND office_id = _office_id + AND browser = _browser + AND ip_address = _ip_address; + + INSERT INTO account.logins(user_id, office_id, browser, ip_address, login_timestamp, culture) + SELECT _user_id, _office_id, _browser, _ip_address, NOW(), COALESCE(_culture, '') + RETURNING account.logins.login_id INTO _login_id; + + RETURN QUERY + SELECT _login_id, true, 'Welcome'::text; + RETURN; +END +$$ +LANGUAGE plpgsql; \ No newline at end of file diff --git a/src/Frapid.Web/Areas/Frapid.Account/db/PostgreSQL/account-blank-1.1.update.sql b/src/Frapid.Web/Areas/Frapid.Account/db/PostgreSQL/account-blank-1.1.update.sql index b3c2f75a..07480c33 100644 --- a/src/Frapid.Web/Areas/Frapid.Account/db/PostgreSQL/account-blank-1.1.update.sql +++ b/src/Frapid.Web/Areas/Frapid.Account/db/PostgreSQL/account-blank-1.1.update.sql @@ -50,6 +50,86 @@ $$ LANGUAGE plpgsql; +-->-->-- src/Frapid.Web/Areas/Frapid.Account/db/PostgreSQL/1.1.update/src/06.functions-and-logic/account.sign_in.sql --<--<-- +DROP FUNCTION IF EXISTS account.sign_in +( + _email text, + _office_id integer, + _browser text, + _ip_address text, + _culture text +); + +CREATE FUNCTION account.sign_in +( + _email text, + _office_id integer, + _browser text, + _ip_address text, + _culture text +) +RETURNS TABLE +( + login_id bigint, + status boolean, + message text +) +AS +$$ + DECLARE _login_id bigint; + DECLARE _user_id integer; +BEGIN + IF(COALESCE(_office_id, 0) = 0) THEN + IF(SELECT COUNT(*) = 1 FROM core.offices) THEN + SELECT office_id INTO _office_id + FROM core.offices; + END IF; + END IF; + + IF account.is_restricted_user(_email) THEN + RETURN QUERY + SELECT NULL::bigint, false, 'Access is denied'::text; + + RETURN; + END IF; + + SELECT user_id INTO _user_id + FROM account.users + WHERE email = _email; + + IF NOT EXISTS + ( + SELECT * + FROM account.users + WHERE user_id = _user_id + AND _office_id IN (SELECT * FROM core.get_office_ids(account.users.office_id)) + + ) THEN + RETURN QUERY + SELECT NULL::bigint, false, 'Access is denied, you are not allowed to login to this branch office.'::text; + + RETURN; + END IF; + + + UPDATE account.logins + SET is_active = false + WHERE user_id=_user_id + AND office_id = _office_id + AND browser = _browser + AND ip_address = _ip_address; + + INSERT INTO account.logins(user_id, office_id, browser, ip_address, login_timestamp, culture) + SELECT _user_id, _office_id, _browser, _ip_address, NOW(), COALESCE(_culture, '') + RETURNING account.logins.login_id INTO _login_id; + + RETURN QUERY + SELECT _login_id, true, 'Welcome'::text; + RETURN; +END +$$ +LANGUAGE plpgsql; + -->-->-- src/Frapid.Web/Areas/Frapid.Account/db/PostgreSQL/1.1.update/src/06.functions-and-logic/empty.sql --<--<-- diff --git a/src/Frapid.Web/Areas/Frapid.AddressBook/Frapid.AddressBook.csproj b/src/Frapid.Web/Areas/Frapid.AddressBook/Frapid.AddressBook.csproj index bdb675c9..9e0c5052 100644 --- a/src/Frapid.Web/Areas/Frapid.AddressBook/Frapid.AddressBook.csproj +++ b/src/Frapid.Web/Areas/Frapid.AddressBook/Frapid.AddressBook.csproj @@ -184,8 +184,8 @@ $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - - + diff --git a/src/Frapid.Web/Areas/Frapid.Authorization/Frapid.Authorization.csproj b/src/Frapid.Web/Areas/Frapid.Authorization/Frapid.Authorization.csproj index d65d9381..95b70970 100644 --- a/src/Frapid.Web/Areas/Frapid.Authorization/Frapid.Authorization.csproj +++ b/src/Frapid.Web/Areas/Frapid.Authorization/Frapid.Authorization.csproj @@ -182,8 +182,8 @@ $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - - + diff --git a/src/Frapid.Web/Areas/Frapid.Calendar/Frapid.Calendar.csproj b/src/Frapid.Web/Areas/Frapid.Calendar/Frapid.Calendar.csproj index 5ae93d57..2464f552 100644 --- a/src/Frapid.Web/Areas/Frapid.Calendar/Frapid.Calendar.csproj +++ b/src/Frapid.Web/Areas/Frapid.Calendar/Frapid.Calendar.csproj @@ -231,8 +231,8 @@ $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - - + diff --git a/src/Frapid.Web/Areas/Frapid.Config/Frapid.Config.csproj b/src/Frapid.Web/Areas/Frapid.Config/Frapid.Config.csproj index 357321d4..dba98710 100644 --- a/src/Frapid.Web/Areas/Frapid.Config/Frapid.Config.csproj +++ b/src/Frapid.Web/Areas/Frapid.Config/Frapid.Config.csproj @@ -185,8 +185,8 @@ $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - - + diff --git a/src/Frapid.Web/Areas/Frapid.Dashboard/Frapid.Dashboard.csproj b/src/Frapid.Web/Areas/Frapid.Dashboard/Frapid.Dashboard.csproj index f2f4dc50..17259d70 100644 --- a/src/Frapid.Web/Areas/Frapid.Dashboard/Frapid.Dashboard.csproj +++ b/src/Frapid.Web/Areas/Frapid.Dashboard/Frapid.Dashboard.csproj @@ -210,8 +210,8 @@ $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - - + diff --git a/src/Frapid.Web/Areas/Frapid.Dashboard/Overrides/Frapid.Dashboard/Themes/frapid/custom.js b/src/Frapid.Web/Areas/Frapid.Dashboard/Overrides/Frapid.Dashboard/Themes/frapid/custom.js index 6011d315..46a4c68f 100644 --- a/src/Frapid.Web/Areas/Frapid.Dashboard/Overrides/Frapid.Dashboard/Themes/frapid/custom.js +++ b/src/Frapid.Web/Areas/Frapid.Dashboard/Overrides/Frapid.Dashboard/Themes/frapid/custom.js @@ -289,7 +289,7 @@ $(definition.style).appendTo("head"); var popunder = $('.ui.bikram.sambat.date.popunder'); - popunder.find("input.year, input.day, select.month").off("change").on("change", function () { + popunder.find("input.year, input.day, select.month").on("change", function () { bsDateEventTrigger(this); }); @@ -449,7 +449,7 @@ const input = container.find("input.date.hasDatepicker"); - input.off("keyup blur").on("keyup blur", function () { + input.on("keyup blur", function () { displayBsDate(container); }); diff --git a/src/Frapid.Web/Areas/Frapid.Reports/Frapid.Reports.csproj b/src/Frapid.Web/Areas/Frapid.Reports/Frapid.Reports.csproj index fbc2259b..b06445c6 100644 --- a/src/Frapid.Web/Areas/Frapid.Reports/Frapid.Reports.csproj +++ b/src/Frapid.Web/Areas/Frapid.Reports/Frapid.Reports.csproj @@ -253,8 +253,8 @@ $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - - + diff --git a/src/Frapid.Web/Areas/Frapid.SchemaUpdater/Frapid.SchemaUpdater.csproj b/src/Frapid.Web/Areas/Frapid.SchemaUpdater/Frapid.SchemaUpdater.csproj index 7f20c697..9f88a0dd 100644 --- a/src/Frapid.Web/Areas/Frapid.SchemaUpdater/Frapid.SchemaUpdater.csproj +++ b/src/Frapid.Web/Areas/Frapid.SchemaUpdater/Frapid.SchemaUpdater.csproj @@ -216,8 +216,8 @@ $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - - + diff --git a/src/Frapid.Web/Areas/Frapid.WebsiteBuilder/Frapid.WebsiteBuilder.csproj b/src/Frapid.Web/Areas/Frapid.WebsiteBuilder/Frapid.WebsiteBuilder.csproj index beda033a..8898e780 100644 --- a/src/Frapid.Web/Areas/Frapid.WebsiteBuilder/Frapid.WebsiteBuilder.csproj +++ b/src/Frapid.Web/Areas/Frapid.WebsiteBuilder/Frapid.WebsiteBuilder.csproj @@ -369,8 +369,8 @@ $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - - + diff --git a/src/Frapid.Web/Areas/Google/Google.csproj b/src/Frapid.Web/Areas/Google/Google.csproj index e11e1c02..c123a7dc 100644 --- a/src/Frapid.Web/Areas/Google/Google.csproj +++ b/src/Frapid.Web/Areas/Google/Google.csproj @@ -162,8 +162,8 @@ $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - - + diff --git a/src/Frapid.Web/Areas/MixERP.Social/MixERP.Social.csproj b/src/Frapid.Web/Areas/MixERP.Social/MixERP.Social.csproj index 4f413dab..5a491d34 100644 --- a/src/Frapid.Web/Areas/MixERP.Social/MixERP.Social.csproj +++ b/src/Frapid.Web/Areas/MixERP.Social/MixERP.Social.csproj @@ -194,8 +194,8 @@ $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - - + diff --git a/src/Frapid.Web/Areas/SendGridMail/SendGridMail.csproj b/src/Frapid.Web/Areas/SendGridMail/SendGridMail.csproj index d5ee80a5..b2d57a86 100644 --- a/src/Frapid.Web/Areas/SendGridMail/SendGridMail.csproj +++ b/src/Frapid.Web/Areas/SendGridMail/SendGridMail.csproj @@ -183,8 +183,8 @@ $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - - + diff --git a/src/Frapid.Web/Areas/SparkPostMail/SparkPostMail.csproj b/src/Frapid.Web/Areas/SparkPostMail/SparkPostMail.csproj index 1789adc9..e1fd9434 100644 --- a/src/Frapid.Web/Areas/SparkPostMail/SparkPostMail.csproj +++ b/src/Frapid.Web/Areas/SparkPostMail/SparkPostMail.csproj @@ -174,8 +174,8 @@ $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - - + diff --git a/src/Frapid.Web/Frapid.Web - Copy.csproj b/src/Frapid.Web/Frapid.Web - Copy.csproj new file mode 100644 index 00000000..2cf42cce --- /dev/null +++ b/src/Frapid.Web/Frapid.Web - Copy.csproj @@ -0,0 +1,558 @@ + + + + + + + Debug + AnyCPU + + + 2.0 + {77C7D586-FEE9-40E2-A1C4-699EF4B0A1F3} + {349c5851-65df-11da-9384-00065b846f21};{fae04ec0-301f-11d3-bf4b-00c04f79efbc} + Library + Properties + Frapid.Web + Frapid.Web + v4.6 + false + true + + + + + + + + + + + true + full + false + bin\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\ + TRACE + prompt + 4 + + + + ..\packages\Antlr.3.5.0.2\lib\Antlr3.Runtime.dll + True + + + ..\packages\Common.Logging.3.3.1\lib\net40\Common.Logging.dll + True + + + ..\packages\Common.Logging.Core.3.3.1\lib\net40\Common.Logging.Core.dll + True + + + False + ..\packages\MvcDonutCaching.1.3.0\lib\net40\DevTrends.MvcDonutCaching.dll + + + ..\packages\EcmaScript.Net.1.0.1.0\lib\net20\EcmaScript.NET.dll + True + + + ..\packages\Microsoft.AspNet.Identity.Core.2.2.1\lib\net45\Microsoft.AspNet.Identity.Core.dll + True + + + ..\packages\Microsoft.AspNet.Identity.Owin.2.2.1\lib\net45\Microsoft.AspNet.Identity.Owin.dll + True + + + ..\packages\Microsoft.AspNet.SignalR.Core.2.2.1\lib\net45\Microsoft.AspNet.SignalR.Core.dll + True + + + ..\packages\Microsoft.AspNet.SignalR.SystemWeb.2.2.1\lib\net45\Microsoft.AspNet.SignalR.SystemWeb.dll + True + + + ..\packages\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.1.0.2\lib\net45\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.dll + True + + + + ..\packages\Microsoft.IdentityModel.Logging.1.1.0\lib\net451\Microsoft.IdentityModel.Logging.dll + True + + + ..\packages\Microsoft.IdentityModel.Tokens.5.1.0\lib\net451\Microsoft.IdentityModel.Tokens.dll + True + + + ..\packages\Microsoft.Owin.3.0.1\lib\net45\Microsoft.Owin.dll + True + + + ..\packages\Microsoft.Owin.Cors.3.0.1\lib\net45\Microsoft.Owin.Cors.dll + True + + + ..\packages\Microsoft.Owin.Host.SystemWeb.3.0.1\lib\net45\Microsoft.Owin.Host.SystemWeb.dll + True + + + ..\packages\Microsoft.Owin.Security.3.0.1\lib\net45\Microsoft.Owin.Security.dll + True + + + ..\packages\Microsoft.Owin.Security.Cookies.3.0.1\lib\net45\Microsoft.Owin.Security.Cookies.dll + True + + + ..\packages\Microsoft.Owin.Security.Facebook.3.0.1\lib\net45\Microsoft.Owin.Security.Facebook.dll + True + + + ..\packages\Microsoft.Owin.Security.Google.3.0.1\lib\net45\Microsoft.Owin.Security.Google.dll + True + + + ..\packages\Microsoft.Owin.Security.Jwt.3.0.1\lib\net45\Microsoft.Owin.Security.Jwt.dll + True + + + ..\packages\Microsoft.Owin.Security.MicrosoftAccount.3.0.1\lib\net45\Microsoft.Owin.Security.MicrosoftAccount.dll + True + + + ..\packages\Microsoft.Owin.Security.OAuth.3.0.1\lib\net45\Microsoft.Owin.Security.OAuth.dll + True + + + ..\packages\Microsoft.Owin.Security.Twitter.3.0.1\lib\net45\Microsoft.Owin.Security.Twitter.dll + True + + + ..\packages\Microsoft.Web.Infrastructure.1.0.0.0\lib\net40\Microsoft.Web.Infrastructure.dll + True + + + ..\packages\Newtonsoft.Json.10.0.3\lib\net45\Newtonsoft.Json.dll + True + + + ..\packages\Owin.1.0\lib\net40\Owin.dll + True + + + ..\packages\Quartz.2.4.1\lib\net40\Quartz.dll + True + + + ..\packages\Serilog.2.3.0\lib\net46\Serilog.dll + True + + + ..\packages\Serilog.Sinks.File.3.1.1\lib\net45\Serilog.Sinks.File.dll + True + + + ..\packages\Serilog.Sinks.RollingFile.3.2.0\lib\net45\Serilog.Sinks.RollingFile.dll + True + + + ..\packages\StackExchange.Redis.StrongName.1.1.608\lib\net46\StackExchange.Redis.StrongName.dll + True + + + + + + + + + + + ..\packages\System.IdentityModel.Tokens.Jwt.4.0.2.206221351\lib\net45\System.IdentityModel.Tokens.Jwt.dll + True + + + + + ..\packages\Microsoft.AspNet.WebApi.Client.5.2.3\lib\net45\System.Net.Http.Formatting.dll + True + + + + + + ..\packages\Microsoft.AspNet.Cors.5.2.3\lib\net45\System.Web.Cors.dll + True + + + ..\packages\Microsoft.AspNet.WebPages.3.2.3\lib\net45\System.Web.Helpers.dll + True + + + ..\packages\Microsoft.AspNet.WebApi.Core.5.2.3\lib\net45\System.Web.Http.dll + True + + + ..\packages\Microsoft.AspNet.WebApi.Owin.5.2.3\lib\net45\System.Web.Http.Owin.dll + True + + + ..\packages\Microsoft.AspNet.WebApi.WebHost.5.2.3\lib\net45\System.Web.Http.WebHost.dll + True + + + ..\packages\Microsoft.AspNet.Mvc.5.2.3\lib\net45\System.Web.Mvc.dll + True + + + ..\packages\Microsoft.AspNet.Web.Optimization.1.1.3\lib\net40\System.Web.Optimization.dll + True + + + ..\packages\Microsoft.AspNet.Razor.3.2.3\lib\net45\System.Web.Razor.dll + True + + + ..\packages\Microsoft.AspNet.WebPages.3.2.3\lib\net45\System.Web.WebPages.dll + True + + + ..\packages\Microsoft.AspNet.WebPages.3.2.3\lib\net45\System.Web.WebPages.Deployment.dll + True + + + ..\packages\Microsoft.AspNet.WebPages.3.2.3\lib\net45\System.Web.WebPages.Razor.dll + True + + + + + + + + + + + + + ..\packages\WebGrease.1.6.0\lib\WebGrease.dll + True + + + ..\packages\YUICompressor.NET.2.7.0.0\lib\NET20\Yahoo.Yui.Compressor.dll + True + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Designer + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Designer + + + Web.config + + + Web.config + + + + + + + + + + {ef3d84f8-3d64-45d7-9050-3ae204f5aa72} + Frapid.ApplicationState + + + {0361910A-7773-4EE9-861B-FFC5636D82D1} + Frapid.Areas + + + {4e863154-9d48-4023-bb76-8405a98bcaff} + Frapid.AssetBundling + + + {8993ad31-c303-4ca0-92d9-c100585a78e5} + Frapid.Backups + + + {ca3c3d39-6775-4234-b343-38f0724adcf8} + Frapid.Configuration + + + {9BEA3809-B6D5-4025-AE7E-868E5E7E9C76} + Frapid.DataAccess + + + {e2c5690c-ef80-4afa-8107-5e58a936b15f} + Frapid.DbPolicy + + + {a4dee358-3203-425c-80e9-8eba0a01b73f} + Frapid.Framework + + + {88DFDF57-A52B-4D71-A0C4-BEF1A3839506} + Frapid.i18n + + + {BFFE76A6-7E9D-42FA-AB3A-108BD2125923} + Frapid.Installer + + + {9408fede-8a04-460d-8fd9-1c710c1baaeb} + Frapid.Messaging + + + {EF3BDE7C-A3D5-493A-8817-BF47DF9CAE47} + Frapid.TokenManager + + + {BA48911F-16A7-4CC7-A04C-6559BAE1F89F} + Frapid.WebApi + + + + 10.0 + $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) + + + + + + + + + + + False + True + 51255 + / + http://localhost:51255/ + False + True + https://localhost + False + + + + + + + + + + + + This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. + + + + + + \ No newline at end of file diff --git a/src/Frapid.Web/Frapid.Web.csproj b/src/Frapid.Web/Frapid.Web.csproj index 0eed4fdf..2cf42cce 100644 --- a/src/Frapid.Web/Frapid.Web.csproj +++ b/src/Frapid.Web/Frapid.Web.csproj @@ -515,8 +515,8 @@ $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - - + diff --git a/src/Frapid.Web/Packages/i18n/ar.yaml b/src/Frapid.Web/Packages/i18n/ar.yaml index 6874b891..663f9f8f 100644 --- a/src/Frapid.Web/Packages/i18n/ar.yaml +++ b/src/Frapid.Web/Packages/i18n/ar.yaml @@ -228,6 +228,7 @@ BomCannotBeItsOwnChild: "A BOM cannot be its own child." BomCode: "Bom Code" BomComponentId: "Bom Component Id" BomComponents: "BOM Components" +BomFinishedGoodId: "Bom Finished Good Id" BomFinishGoodId: "Bom Finish Good Id" BomId: "Bom Id" BomName: "Bom Name" @@ -252,6 +253,7 @@ Browser: "Browser" BrowserBasedApp: "Browser Based App" BulkEmail: "Bulk Email" BulkSms: "Bulk SMS" +ByCash: "By Cash" Calendar: "Calendar" CalendarNotificationEmailSubject: "Calendar Event Reminder: {0} at {1}" Cancel: "إلغاء" @@ -483,7 +485,7 @@ CostCenters: "مراكز التكلفة" CostFactor: "Cost Factor" CostFactorCannotGreterThanHundred: "Cost factor cannot be greter than 100." CostFactorMustHundred: "Cost factor must be 100." -CostFactorTotalProductionCostDivideIntoFinishedGoods: "Cost factor is total production cost to be divide(in percentage) into finished goods." +CostFactorTotalProductionCostDivideIntoFinishedGoods: "Cost factor is total production cost to be divided (in percentage) into finished goods." CostOfGoodsSold: "Cost Of Goods Sold" CostOfGoodsSoldAccountId: "معرف الحساب COGS" CostOfSaleId: "Cost Of Sale Id" @@ -926,7 +928,6 @@ FinishedGoods: "Finished Goods" FinishedGoodsStore: "مخزن الانتاج التام" FinishedGoodStore: "Finished Good Store" FinishedGoodStoreId: "Finished Good Store Id" -FinishGoodStore: "Finish Good Store" First: "الاول" FirstName: "الاسم الأول" FiscalHalfEndDate: "Fiscal Half End Date" @@ -1418,7 +1419,7 @@ NoDocumentFound: "No document(s) found." NoDontDeleteThisTheme: "No, Don't Delete This Theme" NoEmailProcessorDefined: "No email processor defined." NoFileWasUploaded: "No file was uploaded." -NoFinishGoodsDefined: "No finish good(s) defined." +NoFinishedGoodsDefined: "No finished good(s) defined." NoFormFound: "لم يتم العثور على مثيل النموذج." NoMoreStoriesToDisplay: "No more stories to display." None: "لا شيء" @@ -1461,6 +1462,7 @@ OK: "موافق" Okay: "Okay" OldPassword: "Old Password" On: "On" +OnCredit: "On Credit" One: "1" OneHundred: "100" OneThousand: "1000" @@ -1939,6 +1941,7 @@ SalesReturns: "Sales Returns" SalesReturnVerification: "Sales Return Verification" SalesTaxAccountId: "Sales Tax Account Id" SalesTaxRate: "Sales Tax Rate" +SalesTicket: "Sales Ticket" SalesTransactionId: "Sales Transaction Id" SalesVerification: "Sales Verification" Saturday: "السبت" @@ -2297,6 +2300,7 @@ TransactionDetailId: "Transaction Detail Id" TransactionId: "Transaction Id" TransactionMasterId: "Transaction Master Id" TransactionPostedSuccessfully: "تم ترحيل الحركة بنجاح." +TransactionSummary: "Transaction Summary" TransactionTimestamp: "Transaction Timestamp" TransactionTs: "الطابع الزمني للحركة" TransactionType: "نوع المعاملة" @@ -2374,6 +2378,7 @@ UserName: "User Name" UserPolicy: "User Policy" Users: "المستخدمين" UsesWheelchair: "يستخدم كرسي متحرك" +UsingGiftCard: "Using Gift Card" Validate: "Validate" ValidateReturns: "Validate Returns" ValidFrom: "Valid From" @@ -2417,6 +2422,7 @@ VerifyResignations: "تحقق من الاستقالات" VerifyTermination: "Verify Termination" VerifyTerminations: "تحقق الإنهاءات" VersionNumber: "Version Number" +ViaCheck: "Via Check" VideoFormatCode: "Video Format Code" VideoFormatId: "Video Format Id" VideoFormatName: "Video Format Name" diff --git a/src/Frapid.Web/Packages/i18n/de.yaml b/src/Frapid.Web/Packages/i18n/de.yaml index 48b1b054..4eae45bb 100644 --- a/src/Frapid.Web/Packages/i18n/de.yaml +++ b/src/Frapid.Web/Packages/i18n/de.yaml @@ -228,6 +228,7 @@ BomCannotBeItsOwnChild: "A BOM cannot be its own child." BomCode: "Bom Code" BomComponentId: "Bom Component Id" BomComponents: "BOM Components" +BomFinishedGoodId: "Bom Finished Good Id" BomFinishGoodId: "Bom Finish Good Id" BomId: "Bom Id" BomName: "Bom Name" @@ -252,6 +253,7 @@ Browser: "Browser" BrowserBasedApp: "Browser Based App" BulkEmail: "Bulk Email" BulkSms: "Bulk SMS" +ByCash: "By Cash" Calendar: "Calendar" CalendarNotificationEmailSubject: "Calendar Event Reminder: {0} at {1}" Cancel: "Abbrechen" @@ -483,7 +485,7 @@ CostCenters: "Kostenstellen" CostFactor: "Cost Factor" CostFactorCannotGreterThanHundred: "Cost factor cannot be greter than 100." CostFactorMustHundred: "Cost factor must be 100." -CostFactorTotalProductionCostDivideIntoFinishedGoods: "Cost factor is total production cost to be divide(in percentage) into finished goods." +CostFactorTotalProductionCostDivideIntoFinishedGoods: "Cost factor is total production cost to be divided (in percentage) into finished goods." CostOfGoodsSold: "Cost Of Goods Sold" CostOfGoodsSoldAccountId: "Konto Verkaufsartikel-Produktkosten Id" CostOfSaleId: "Cost Of Sale Id" @@ -926,7 +928,6 @@ FinishedGoods: "Finished Goods" FinishedGoodsStore: "Finished Goods Store" FinishedGoodStore: "Finished Good Store" FinishedGoodStoreId: "Finished Good Store Id" -FinishGoodStore: "Finish Good Store" First: "Erstes" FirstName: "Vorname" FiscalHalfEndDate: "Fiscal Half End Date" @@ -1418,7 +1419,7 @@ NoDocumentFound: "No document(s) found." NoDontDeleteThisTheme: "No, Don't Delete This Theme" NoEmailProcessorDefined: "No email processor defined." NoFileWasUploaded: "No file was uploaded." -NoFinishGoodsDefined: "No finish good(s) defined." +NoFinishedGoodsDefined: "No finished good(s) defined." NoFormFound: "Keine Form dieser Art gefunden." NoMoreStoriesToDisplay: "No more stories to display." None: "Keine" @@ -1461,6 +1462,7 @@ OK: "OK" Okay: "Okay" OldPassword: "Old Password" On: "On" +OnCredit: "On Credit" One: "1" OneHundred: "100" OneThousand: "1000" @@ -1939,6 +1941,7 @@ SalesReturns: "Sales Returns" SalesReturnVerification: "Sales Return Verification" SalesTaxAccountId: "Sales Tax Account Id" SalesTaxRate: "Sales Tax Rate" +SalesTicket: "Sales Ticket" SalesTransactionId: "Sales Transaction Id" SalesVerification: "Sales Verification" Saturday: "Samstag" @@ -2297,6 +2300,7 @@ TransactionDetailId: "Transaction Detail Id" TransactionId: "Transaction Id" TransactionMasterId: "Transaction Master Id" TransactionPostedSuccessfully: "Die Transaktion wurde erfolgreich gebucht." +TransactionSummary: "Transaction Summary" TransactionTimestamp: "Transaction Timestamp" TransactionTs: "Transaktionszeitstempel" TransactionType: "Transaktionsart" @@ -2374,6 +2378,7 @@ UserName: "User Name" UserPolicy: "User Policy" Users: "Benutzer" UsesWheelchair: "Benutzt Rollstuhl" +UsingGiftCard: "Using Gift Card" Validate: "Validate" ValidateReturns: "Validate Returns" ValidFrom: "Valid From" @@ -2417,6 +2422,7 @@ VerifyResignations: "Kündigungen verifizieren" VerifyTermination: "Verify Termination" VerifyTerminations: "Beendigungen Verifizieren" VersionNumber: "Version Number" +ViaCheck: "Via Check" VideoFormatCode: "Video Format Code" VideoFormatId: "Video Format Id" VideoFormatName: "Video Format Name" diff --git a/src/Frapid.Web/Packages/i18n/en.yaml b/src/Frapid.Web/Packages/i18n/en.yaml index 30d4159e..c5404671 100644 --- a/src/Frapid.Web/Packages/i18n/en.yaml +++ b/src/Frapid.Web/Packages/i18n/en.yaml @@ -228,6 +228,7 @@ BomCannotBeItsOwnChild: "A BOM cannot be its own child." BomCode: "Bom Code" BomComponentId: "Bom Component Id" BomComponents: "BOM Components" +BomFinishedGoodId: "Bom Finished Good Id" BomFinishGoodId: "Bom Finish Good Id" BomId: "Bom Id" BomName: "Bom Name" @@ -252,6 +253,7 @@ Browser: "Browser" BrowserBasedApp: "Browser Based App" BulkEmail: "Bulk Email" BulkSms: "Bulk SMS" +ByCash: "By Cash" Calendar: "Calendar" CalendarNotificationEmailSubject: "Calendar Event Reminder: {0} at {1}" Cancel: "Cancel" @@ -484,7 +486,7 @@ CostCenters: "Cost Centers" CostFactor: "Cost Factor" CostFactorCannotGreterThanHundred: "Cost factor cannot be greter than 100." CostFactorMustHundred: "Cost factor must be 100." -CostFactorTotalProductionCostDivideIntoFinishedGoods: "Cost factor is total production cost to be divide(in percentage) into finished goods." +CostFactorTotalProductionCostDivideIntoFinishedGoods: "Cost factor is total production cost to be divided (in percentage) into finished goods." CostOfGoodsSold: "Cost Of Goods Sold" CostOfGoodsSoldAccountId: "Cost Of Goods Sold Account Id" CostOfSaleId: "Cost Of Sale Id" @@ -928,7 +930,6 @@ FinishedGoods: "Finished Goods" FinishedGoodsStore: "Finished Goods Store" FinishedGoodStore: "Finished Good Store" FinishedGoodStoreId: "Finished Good Store Id" -FinishGoodStore: "Finish Good Store" First: "First" FirstName: "First Name" FiscalHalfEndDate: "Fiscal Half End Date" @@ -1420,7 +1421,7 @@ NoDocumentFound: "No document(s) found." NoDontDeleteThisTheme: "No, Don't Delete This Theme" NoEmailProcessorDefined: "No email processor defined." NoFileWasUploaded: "No file was uploaded." -NoFinishGoodsDefined: "No finish good(s) defined." +NoFinishedGoodsDefined: "No finished good(s) defined." NoFormFound: "No instance of form was found." NoMoreStoriesToDisplay: "No more stories to display." None: "None" @@ -1463,6 +1464,7 @@ OK: "OK" Okay: "Okay" OldPassword: "Old Password" On: "On" +OnCredit: "On Credit" One: "1" OneHundred: "100" OneThousand: "1000" @@ -1941,6 +1943,7 @@ SalesReturns: "Sales Returns" SalesReturnVerification: "Sales Return Verification" SalesTaxAccountId: "Sales Tax Account Id" SalesTaxRate: "Sales Tax Rate" +SalesTicket: "Sales Ticket" SalesTransactionId: "Sales Transaction Id" SalesVerification: "Sales Verification" Saturday: "Saturday" @@ -2299,6 +2302,7 @@ TransactionDetailId: "Transaction Detail Id" TransactionId: "Transaction Id" TransactionMasterId: "Transaction Master Id" TransactionPostedSuccessfully: "The transaction was posted successfully." +TransactionSummary: "Transaction Summary" TransactionTimestamp: "Transaction Timestamp" TransactionTs: "Transaction Ts" TransactionType: "Transaction Type" @@ -2376,6 +2380,7 @@ UserName: "User Name" UserPolicy: "User Policy" Users: "Users" UsesWheelchair: "Uses Wheelchair" +UsingGiftCard: "Using Gift Card" Validate: "Validate" ValidateReturns: "Validate Returns" ValidFrom: "Valid From" @@ -2419,6 +2424,7 @@ VerifyResignations: "Verify Resignations" VerifyTermination: "Verify Termination" VerifyTerminations: "Verify Terminations" VersionNumber: "Version Number" +ViaCheck: "Via Check" VideoFormatCode: "Video Format Code" VideoFormatId: "Video Format Id" VideoFormatName: "Video Format Name" diff --git a/src/Frapid.Web/Packages/i18n/es.yaml b/src/Frapid.Web/Packages/i18n/es.yaml index 2e9b935c..cf841841 100644 --- a/src/Frapid.Web/Packages/i18n/es.yaml +++ b/src/Frapid.Web/Packages/i18n/es.yaml @@ -228,6 +228,7 @@ BomCannotBeItsOwnChild: "A BOM cannot be its own child." BomCode: "Bom Code" BomComponentId: "Bom Component Id" BomComponents: "BOM Components" +BomFinishedGoodId: "Bom Finished Good Id" BomFinishGoodId: "Bom Finish Good Id" BomId: "Bom Id" BomName: "Bom Name" @@ -252,6 +253,7 @@ Browser: "Browser" BrowserBasedApp: "Browser Based App" BulkEmail: "Bulk Email" BulkSms: "Bulk SMS" +ByCash: "By Cash" Calendar: "Calendar" CalendarNotificationEmailSubject: "Calendar Event Reminder: {0} at {1}" Cancel: "cancelar" @@ -483,7 +485,7 @@ CostCenters: "Centros de costes" CostFactor: "Cost Factor" CostFactorCannotGreterThanHundred: "Cost factor cannot be greter than 100." CostFactorMustHundred: "Cost factor must be 100." -CostFactorTotalProductionCostDivideIntoFinishedGoods: "Cost factor is total production cost to be divide(in percentage) into finished goods." +CostFactorTotalProductionCostDivideIntoFinishedGoods: "Cost factor is total production cost to be divided (in percentage) into finished goods." CostOfGoodsSold: "Cost Of Goods Sold" CostOfGoodsSoldAccountId: "Identificador Cuenta costo de ventas" CostOfSaleId: "Cost Of Sale Id" @@ -926,7 +928,6 @@ FinishedGoods: "Finished Goods" FinishedGoodsStore: "Finished Goods Store" FinishedGoodStore: "Finished Good Store" FinishedGoodStoreId: "Finished Good Store Id" -FinishGoodStore: "Finish Good Store" First: "First" FirstName: "Primer Nombre" FiscalHalfEndDate: "Fiscal Half End Date" @@ -1418,7 +1419,7 @@ NoDocumentFound: "No document(s) found." NoDontDeleteThisTheme: "No, Don't Delete This Theme" NoEmailProcessorDefined: "No email processor defined." NoFileWasUploaded: "No file was uploaded." -NoFinishGoodsDefined: "No finish good(s) defined." +NoFinishedGoodsDefined: "No finished good(s) defined." NoFormFound: "No instance of form was found." NoMoreStoriesToDisplay: "No more stories to display." None: "ninguno" @@ -1461,6 +1462,7 @@ OK: "Okay" Okay: "Okay" OldPassword: "Old Password" On: "On" +OnCredit: "On Credit" One: "1" OneHundred: "100" OneThousand: "1000" @@ -1939,6 +1941,7 @@ SalesReturns: "Sales Returns" SalesReturnVerification: "Sales Return Verification" SalesTaxAccountId: "Sales Tax Account Id" SalesTaxRate: "Sales Tax Rate" +SalesTicket: "Sales Ticket" SalesTransactionId: "Sales Transaction Id" SalesVerification: "Sales Verification" Saturday: "Saturday" @@ -2297,6 +2300,7 @@ TransactionDetailId: "Transaction Detail Id" TransactionId: "Transaction Id" TransactionMasterId: "Transaction Master Id" TransactionPostedSuccessfully: "La transacción se registró con éxito." +TransactionSummary: "Transaction Summary" TransactionTimestamp: "Transaction Timestamp" TransactionTs: "Marca de tiempo de transacción" TransactionType: "Tipo Transacción" @@ -2374,6 +2378,7 @@ UserName: "User Name" UserPolicy: "User Policy" Users: "Usuarios" UsesWheelchair: "Uses Wheelchair" +UsingGiftCard: "Using Gift Card" Validate: "Validate" ValidateReturns: "Validate Returns" ValidFrom: "Valid From" @@ -2417,6 +2422,7 @@ VerifyResignations: "Verify Resignations" VerifyTermination: "Verify Termination" VerifyTerminations: "Verify Terminations" VersionNumber: "Version Number" +ViaCheck: "Via Check" VideoFormatCode: "Video Format Code" VideoFormatId: "Video Format Id" VideoFormatName: "Video Format Name" diff --git a/src/Frapid.Web/Packages/i18n/fr.yaml b/src/Frapid.Web/Packages/i18n/fr.yaml index 994bfaf8..cd577ee0 100644 --- a/src/Frapid.Web/Packages/i18n/fr.yaml +++ b/src/Frapid.Web/Packages/i18n/fr.yaml @@ -228,6 +228,7 @@ BomCannotBeItsOwnChild: "A BOM cannot be its own child." BomCode: "Bom Code" BomComponentId: "Bom Component Id" BomComponents: "BOM Components" +BomFinishedGoodId: "Bom Finished Good Id" BomFinishGoodId: "Bom Finish Good Id" BomId: "Bom Id" BomName: "Bom Name" @@ -252,6 +253,7 @@ Browser: "Browser" BrowserBasedApp: "Browser Based App" BulkEmail: "Bulk Email" BulkSms: "Bulk SMS" +ByCash: "By Cash" Calendar: "Calendar" CalendarNotificationEmailSubject: "Calendar Event Reminder: {0} at {1}" Cancel: "Annuler" @@ -483,7 +485,7 @@ CostCenters: "Centres de coûts" CostFactor: "Cost Factor" CostFactorCannotGreterThanHundred: "Cost factor cannot be greter than 100." CostFactorMustHundred: "Cost factor must be 100." -CostFactorTotalProductionCostDivideIntoFinishedGoods: "Cost factor is total production cost to be divide(in percentage) into finished goods." +CostFactorTotalProductionCostDivideIntoFinishedGoods: "Cost factor is total production cost to be divided (in percentage) into finished goods." CostOfGoodsSold: "Cost Of Goods Sold" CostOfGoodsSoldAccountId: "Compte CMV Id" CostOfSaleId: "Cost Of Sale Id" @@ -926,7 +928,6 @@ FinishedGoods: "Finished Goods" FinishedGoodsStore: "Magasin de produits finis" FinishedGoodStore: "Finished Good Store" FinishedGoodStoreId: "Finished Good Store Id" -FinishGoodStore: "Finish Good Store" First: "Premier" FirstName: "Prénom" FiscalHalfEndDate: "Fiscal Half End Date" @@ -1418,7 +1419,7 @@ NoDocumentFound: "No document(s) found." NoDontDeleteThisTheme: "No, Don't Delete This Theme" NoEmailProcessorDefined: "No email processor defined." NoFileWasUploaded: "No file was uploaded." -NoFinishGoodsDefined: "No finish good(s) defined." +NoFinishedGoodsDefined: "No finished good(s) defined." NoFormFound: "Aucune instance de formulaire a été trouvé." NoMoreStoriesToDisplay: "No more stories to display." None: "Aucun" @@ -1461,6 +1462,7 @@ OK: "d'aCCORD" Okay: "Okay" OldPassword: "Old Password" On: "On" +OnCredit: "On Credit" One: "1" OneHundred: "100" OneThousand: "1000" @@ -1939,6 +1941,7 @@ SalesReturns: "Sales Returns" SalesReturnVerification: "Sales Return Verification" SalesTaxAccountId: "Sales Tax Account Id" SalesTaxRate: "Sales Tax Rate" +SalesTicket: "Sales Ticket" SalesTransactionId: "Sales Transaction Id" SalesVerification: "Sales Verification" Saturday: "Samedi" @@ -2297,6 +2300,7 @@ TransactionDetailId: "Transaction Detail Id" TransactionId: "Transaction Id" TransactionMasterId: "Transaction Master Id" TransactionPostedSuccessfully: "La transaction a été validée avec succès." +TransactionSummary: "Transaction Summary" TransactionTimestamp: "Transaction Timestamp" TransactionTs: "Horodatage de la transaction" TransactionType: "Type de transaction" @@ -2374,6 +2378,7 @@ UserName: "User Name" UserPolicy: "User Policy" Users: "utilisateurs" UsesWheelchair: "Utilise le fauteuil roulant" +UsingGiftCard: "Using Gift Card" Validate: "Validate" ValidateReturns: "Validate Returns" ValidFrom: "Valid From" @@ -2417,6 +2422,7 @@ VerifyResignations: "Vérifier les démissions" VerifyTermination: "Verify Termination" VerifyTerminations: "Vérifier les terminaisons" VersionNumber: "Version Number" +ViaCheck: "Via Check" VideoFormatCode: "Video Format Code" VideoFormatId: "Video Format Id" VideoFormatName: "Video Format Name" diff --git a/src/Frapid.Web/Packages/i18n/ne.yaml b/src/Frapid.Web/Packages/i18n/ne.yaml index fd1de607..855f57bc 100644 --- a/src/Frapid.Web/Packages/i18n/ne.yaml +++ b/src/Frapid.Web/Packages/i18n/ne.yaml @@ -228,6 +228,7 @@ BomCannotBeItsOwnChild: "A BOM cannot be its own child." BomCode: "Bom Code" BomComponentId: "Bom Component Id" BomComponents: "BOM Components" +BomFinishedGoodId: "Bom Finished Good Id" BomFinishGoodId: "Bom Finish Good Id" BomId: "Bom Id" BomName: "Bom Name" @@ -252,6 +253,7 @@ Browser: "Browser" BrowserBasedApp: "Browser Based App" BulkEmail: "Bulk Email" BulkSms: "Bulk SMS" +ByCash: "By Cash" Calendar: "Calendar" CalendarNotificationEmailSubject: "Calendar Event Reminder: {0} at {1}" Cancel: "रद्द गर्नुहोस" @@ -483,7 +485,7 @@ CostCenters: "लागत केन्द्र" CostFactor: "Cost Factor" CostFactorCannotGreterThanHundred: "Cost factor cannot be greter than 100." CostFactorMustHundred: "Cost factor must be 100." -CostFactorTotalProductionCostDivideIntoFinishedGoods: "Cost factor is total production cost to be divide(in percentage) into finished goods." +CostFactorTotalProductionCostDivideIntoFinishedGoods: "Cost factor is total production cost to be divided (in percentage) into finished goods." CostOfGoodsSold: "Cost Of Goods Sold" CostOfGoodsSoldAccountId: "COGS खाता Id" CostOfSaleId: "Cost Of Sale Id" @@ -765,7 +767,7 @@ EmployeeIdentificationDetailId: "कर्मचारी पहिचान व EmployeeInfo: "Employee Info" EmployeeName: "कर्मचारीको नाम" EmployeeQualificationId: "कर्मचारी योग्यता Id" -Employees: "काउन्टर Id" +Employees: "कर्मचारीहरु" EmployeeSocialNetworkDetailId: "कर्मचारी सामाजिक सञ्जाल विवरण Id" EmployeeType: "कर्मचारी प्रकार Id" EmployeeTypeCode: "कर्मचारी प्रकार कोड" @@ -926,7 +928,6 @@ FinishedGoods: "Finished Goods" FinishedGoodsStore: "सम्झौता प्रमाणित गर्नुहोस्" FinishedGoodStore: "Finished Good Store" FinishedGoodStoreId: "Finished Good Store Id" -FinishGoodStore: "Finish Good Store" First: "पहिलो चरण" FirstName: "पहिलो नाम" FiscalHalfEndDate: "Fiscal Half End Date" @@ -1418,7 +1419,7 @@ NoDocumentFound: "No document(s) found." NoDontDeleteThisTheme: "No, Don't Delete This Theme" NoEmailProcessorDefined: "No email processor defined." NoFileWasUploaded: "No file was uploaded." -NoFinishGoodsDefined: "No finish good(s) defined." +NoFinishedGoodsDefined: "No finished good(s) defined." NoFormFound: "No instance of form was found." NoMoreStoriesToDisplay: "No more stories to display." None: "कुनै पनि हैन" @@ -1461,6 +1462,7 @@ OK: "ठिक छ" Okay: "Okay" OldPassword: "Old Password" On: "On" +OnCredit: "On Credit" One: "1" OneHundred: "100" OneThousand: "1000" @@ -1939,6 +1941,7 @@ SalesReturns: "Sales Returns" SalesReturnVerification: "Sales Return Verification" SalesTaxAccountId: "Sales Tax Account Id" SalesTaxRate: "Sales Tax Rate" +SalesTicket: "Sales Ticket" SalesTransactionId: "Sales Transaction Id" SalesVerification: "Sales Verification" Saturday: "शनिबार" @@ -2297,6 +2300,7 @@ TransactionDetailId: "Transaction Detail Id" TransactionId: "Transaction Id" TransactionMasterId: "Transaction Master Id" TransactionPostedSuccessfully: "लेनदेन सफलतापूर्वक पोस्ट भएको थियो।" +TransactionSummary: "Transaction Summary" TransactionTimestamp: "Transaction Timestamp" TransactionTs: "कारोबार समय" TransactionType: "कारोबारको प्रकार" @@ -2374,6 +2378,7 @@ UserName: "User Name" UserPolicy: "User Policy" Users: "प्रयोगकर्ताहरु" UsesWheelchair: "ह्वीलचेयर प्रयोग गर्छ?" +UsingGiftCard: "Using Gift Card" Validate: "Validate" ValidateReturns: "Validate Returns" ValidFrom: "Valid From" @@ -2417,6 +2422,7 @@ VerifyResignations: "राजीनामा प्रमाणित गर् VerifyTermination: "Verify Termination" VerifyTerminations: "निलम्बनहरू प्रमाणित गर्नुहोस्" VersionNumber: "Version Number" +ViaCheck: "Via Check" VideoFormatCode: "Video Format Code" VideoFormatId: "Video Format Id" VideoFormatName: "Video Format Name" diff --git a/src/Frapid.Web/Packages/i18n/ru.yaml b/src/Frapid.Web/Packages/i18n/ru.yaml index 26731b06..97025c8d 100644 --- a/src/Frapid.Web/Packages/i18n/ru.yaml +++ b/src/Frapid.Web/Packages/i18n/ru.yaml @@ -228,6 +228,7 @@ BomCannotBeItsOwnChild: "A BOM cannot be its own child." BomCode: "Bom Code" BomComponentId: "Bom Component Id" BomComponents: "BOM Components" +BomFinishedGoodId: "Bom Finished Good Id" BomFinishGoodId: "Bom Finish Good Id" BomId: "Bom Id" BomName: "Bom Name" @@ -252,6 +253,7 @@ Browser: "Browser" BrowserBasedApp: "Browser Based App" BulkEmail: "Bulk Email" BulkSms: "Bulk SMS" +ByCash: "By Cash" Calendar: "Calendar" CalendarNotificationEmailSubject: "Calendar Event Reminder: {0} at {1}" Cancel: "отменить" @@ -483,7 +485,7 @@ CostCenters: "Центр Стоимость" CostFactor: "Cost Factor" CostFactorCannotGreterThanHundred: "Cost factor cannot be greter than 100." CostFactorMustHundred: "Cost factor must be 100." -CostFactorTotalProductionCostDivideIntoFinishedGoods: "Cost factor is total production cost to be divide(in percentage) into finished goods." +CostFactorTotalProductionCostDivideIntoFinishedGoods: "Cost factor is total production cost to be divided (in percentage) into finished goods." CostOfGoodsSold: "Cost Of Goods Sold" CostOfGoodsSoldAccountId: "Себестоимость проданных товаров аккаунт Идентификатор" CostOfSaleId: "Cost Of Sale Id" @@ -926,7 +928,6 @@ FinishedGoods: "Finished Goods" FinishedGoodsStore: "Finished Goods Store" FinishedGoodStore: "Finished Good Store" FinishedGoodStoreId: "Finished Good Store Id" -FinishGoodStore: "Finish Good Store" First: "First" FirstName: "Имя" FiscalHalfEndDate: "Fiscal Half End Date" @@ -1418,7 +1419,7 @@ NoDocumentFound: "No document(s) found." NoDontDeleteThisTheme: "No, Don't Delete This Theme" NoEmailProcessorDefined: "No email processor defined." NoFileWasUploaded: "No file was uploaded." -NoFinishGoodsDefined: "No finish good(s) defined." +NoFinishedGoodsDefined: "No finished good(s) defined." NoFormFound: "No instance of form was found." NoMoreStoriesToDisplay: "No more stories to display." None: "Ни один" @@ -1461,6 +1462,7 @@ OK: "хОРОШО" Okay: "Okay" OldPassword: "Old Password" On: "On" +OnCredit: "On Credit" One: "1" OneHundred: "100" OneThousand: "1000" @@ -1939,6 +1941,7 @@ SalesReturns: "Sales Returns" SalesReturnVerification: "Sales Return Verification" SalesTaxAccountId: "Sales Tax Account Id" SalesTaxRate: "Sales Tax Rate" +SalesTicket: "Sales Ticket" SalesTransactionId: "Sales Transaction Id" SalesVerification: "Sales Verification" Saturday: "Saturday" @@ -2297,6 +2300,7 @@ TransactionDetailId: "Transaction Detail Id" TransactionId: "Transaction Id" TransactionMasterId: "Transaction Master Id" TransactionPostedSuccessfully: "Сделка была успешно размещена." +TransactionSummary: "Transaction Summary" TransactionTimestamp: "Transaction Timestamp" TransactionTs: "сделка Отметка времени" TransactionType: "тип операции" @@ -2374,6 +2378,7 @@ UserName: "User Name" UserPolicy: "User Policy" Users: "пользователи" UsesWheelchair: "Uses Wheelchair" +UsingGiftCard: "Using Gift Card" Validate: "Validate" ValidateReturns: "Validate Returns" ValidFrom: "Valid From" @@ -2417,6 +2422,7 @@ VerifyResignations: "Verify Resignations" VerifyTermination: "Verify Termination" VerifyTerminations: "Verify Terminations" VersionNumber: "Version Number" +ViaCheck: "Via Check" VideoFormatCode: "Video Format Code" VideoFormatId: "Video Format Id" VideoFormatName: "Video Format Name" diff --git a/src/Frapid.Web/scripts/modules/scrud-factory/view/filters.js b/src/Frapid.Web/scripts/modules/scrud-factory/view/filters.js index 4d667ede..bcfa40ec 100644 --- a/src/Frapid.Web/scripts/modules/scrud-factory/view/filters.js +++ b/src/Frapid.Web/scripts/modules/scrud-factory/view/filters.js @@ -38,6 +38,8 @@ var getQuerystringFilters = function () { function isString(propertyName) { var type = getType(propertyName); + console.log(propertyName); + if (stringTypes.indexOf(type) > -1) { return true; }; @@ -289,6 +291,7 @@ function getSelectedFilter() { $.each(els, function () { var el = $(this); + var columnName = el.attr("data-column-name"); var dataType = el.attr("data-type"); var filterCondition = el.attr("data-filter-condition"); diff --git a/src/Templates/MVCProject/MVCProject.csproj b/src/Templates/MVCProject/MVCProject.csproj index 84d613e4..7879b017 100644 --- a/src/Templates/MVCProject/MVCProject.csproj +++ b/src/Templates/MVCProject/MVCProject.csproj @@ -155,9 +155,9 @@ $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - + From 45e62b4cf437c7d3c78a1258ced3fbd4f56a86f3 Mon Sep 17 00:00:00 2001 From: Binod Nirvan Date: Fri, 3 May 2019 18:20:58 +0100 Subject: [PATCH 09/18] Removed ghost directory --- src/Frapid.Web/Areas/InitiativeNepal | 1 - 1 file changed, 1 deletion(-) delete mode 160000 src/Frapid.Web/Areas/InitiativeNepal diff --git a/src/Frapid.Web/Areas/InitiativeNepal b/src/Frapid.Web/Areas/InitiativeNepal deleted file mode 160000 index a0e97b7c..00000000 --- a/src/Frapid.Web/Areas/InitiativeNepal +++ /dev/null @@ -1 +0,0 @@ -Subproject commit a0e97b7c242be13466ad3dfc18207fc37e3fc537 From 309b28a27f7b3bd20b1ef6525f21f19ab1e6834b Mon Sep 17 00:00:00 2001 From: bi od Date: Sat, 11 May 2019 15:03:00 +0545 Subject: [PATCH 10/18] - Updated ownership.sql to fix a bug introduced by a breaking change in PostgreSQL 11. - Rebundled all SQL files. --- .../1.1.update/accounr-blank-1.1.update.sql | 75 +++++++++++++------ .../1.1.update/src/99.ownership.sql | 75 +++++++++++++------ .../db/PostgreSQL/1.x/1.0/account-blank.sql | 75 +++++++++++++------ .../PostgreSQL/1.x/1.0/src/99.ownership.sql | 75 +++++++++++++------ .../PostgreSQL/account-blank-1.1.update.sql | 75 +++++++++++++------ .../db/PostgreSQL/account-blank.sql | 75 +++++++++++++------ .../PostgreSQL/2.x/2.0/addressbook-blank.sql | 75 +++++++++++++------ .../PostgreSQL/2.x/2.0/src/99.ownership.sql | 75 +++++++++++++------ .../db/PostgreSQL/addressbook-blank.sql | 75 +++++++++++++------ .../db/PostgreSQL/1.x/1.0/auth-blank.sql | 75 +++++++++++++------ .../PostgreSQL/1.x/1.0/src/99.ownership.sql | 75 +++++++++++++------ .../db/PostgreSQL/auth-blank.sql | 75 +++++++++++++------ .../db/PostgreSQL/2.x/2.0/calendar-blank.sql | 75 +++++++++++++------ .../PostgreSQL/2.x/2.0/src/99.ownership.sql | 75 +++++++++++++------ .../db/PostgreSQL/calendar-blank.sql | 75 +++++++++++++------ .../db/PostgreSQL/1.x/1.0/config.sql | 75 +++++++++++++------ .../PostgreSQL/1.x/1.0/src/99.ownership.sql | 75 +++++++++++++------ .../Frapid.Config/db/PostgreSQL/config.sql | 75 +++++++++++++------ .../PostgreSQL/1.x/1.0/src/99.ownership.sql | 75 +++++++++++++------ .../db/PostgreSQL/1.x/1.0/updater.sql | 75 +++++++++++++------ .../db/PostgreSQL/updater.sql | 75 +++++++++++++------ .../PostgreSQL/1.x/1.0/src/99.ownership.sql | 75 +++++++++++++------ .../db/PostgreSQL/1.x/1.0/website-blank.sql | 75 +++++++++++++------ .../db/PostgreSQL/website-blank.sql | 75 +++++++++++++------ .../db/PostgreSQL/2.x/2.0/social-blank.sql | 75 +++++++++++++------ .../PostgreSQL/2.x/2.0/src/99.ownership.sql | 75 +++++++++++++------ .../db/PostgreSQL/social-blank.sql | 75 +++++++++++++------ .../1.1.update/core-blank-1.1.update.sql | 75 +++++++++++++------ .../1.1.update/src/99.ownership.sql | 75 +++++++++++++------ .../db/PostgreSQL/1.x/1.0/core-blank.sql | 75 +++++++++++++------ .../PostgreSQL/1.x/1.0/src/99.ownership.sql | 75 +++++++++++++------ .../db/PostgreSQL/core-blank-1.1.update.sql | 75 +++++++++++++------ src/Frapid.Web/db/PostgreSQL/core-blank.sql | 75 +++++++++++++------ 33 files changed, 1749 insertions(+), 726 deletions(-) diff --git a/src/Frapid.Web/Areas/Frapid.Account/db/PostgreSQL/1.1.update/accounr-blank-1.1.update.sql b/src/Frapid.Web/Areas/Frapid.Account/db/PostgreSQL/1.1.update/accounr-blank-1.1.update.sql index 07480c33..bdf81de5 100644 --- a/src/Frapid.Web/Areas/Frapid.Account/db/PostgreSQL/1.1.update/accounr-blank-1.1.update.sql +++ b/src/Frapid.Web/Areas/Frapid.Account/db/PostgreSQL/1.1.update/accounr-blank-1.1.update.sql @@ -178,27 +178,43 @@ LANGUAGE plpgsql; DO $$ DECLARE this record; + DECLARE _version_number integer = current_setting('server_version_num')::integer; BEGIN IF(CURRENT_USER = 'frapid_db_user') THEN RETURN; END IF; - FOR this IN - SELECT 'ALTER ' - || CASE WHEN p.proisagg THEN 'AGGREGATE ' ELSE 'FUNCTION ' END - || quote_ident(n.nspname) || '.' || quote_ident(p.proname) || '(' - || pg_catalog.pg_get_function_identity_arguments(p.oid) || ') OWNER TO frapid_db_user;' AS sql - FROM pg_catalog.pg_proc p - JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace - WHERE NOT n.nspname = ANY(ARRAY['pg_catalog', 'information_schema']) - LOOP - EXECUTE this.sql; - END LOOP; + IF(_version_number < 110000) THEN + FOR this IN + SELECT 'ALTER ' + || CASE WHEN p.proisagg THEN 'AGGREGATE ' ELSE 'FUNCTION ' END + || quote_ident(n.nspname) || '.' || quote_ident(p.proname) || '(' + || pg_catalog.pg_get_function_identity_arguments(p.oid) || ') OWNER TO frapid_db_user;' AS sql + FROM pg_catalog.pg_proc p + JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace + WHERE NOT n.nspname = ANY(ARRAY['pg_catalog', 'information_schema']) + LOOP + EXECUTE this.sql; + END LOOP; + ELSE + FOR this IN + SELECT 'ALTER ' + || CASE p.prokind WHEN 'a' THEN 'AGGREGATE ' ELSE 'FUNCTION ' END + || quote_ident(n.nspname) || '.' || quote_ident(p.proname) || '(' + || pg_catalog.pg_get_function_identity_arguments(p.oid) || ') OWNER TO frapid_db_user;' AS sql + FROM pg_catalog.pg_proc p + JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace + WHERE NOT n.nspname = ANY(ARRAY['pg_catalog', 'information_schema']) + LOOP + EXECUTE this.sql; + END LOOP; + END IF; END $$ LANGUAGE plpgsql; + DO $$ DECLARE this record; @@ -305,22 +321,37 @@ LANGUAGE plpgsql; DO $$ DECLARE this record; + DECLARE _version_number integer = current_setting('server_version_num')::integer; BEGIN IF(CURRENT_USER = 'report_user') THEN RETURN; END IF; - FOR this IN - SELECT 'GRANT EXECUTE ON ' - || CASE WHEN p.proisagg THEN 'AGGREGATE ' ELSE 'FUNCTION ' END - || quote_ident(n.nspname) || '.' || quote_ident(p.proname) || '(' - || pg_catalog.pg_get_function_identity_arguments(p.oid) || ') TO report_user;' AS sql - FROM pg_catalog.pg_proc p - JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace - WHERE NOT n.nspname = ANY(ARRAY['pg_catalog', 'information_schema']) - LOOP - EXECUTE this.sql; - END LOOP; + IF(_version_number < 110000) THEN + FOR this IN + SELECT 'GRANT EXECUTE ON ' + || CASE WHEN p.proisagg THEN 'AGGREGATE ' ELSE 'FUNCTION ' END + || quote_ident(n.nspname) || '.' || quote_ident(p.proname) || '(' + || pg_catalog.pg_get_function_identity_arguments(p.oid) || ') TO report_user;' AS sql + FROM pg_catalog.pg_proc p + JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace + WHERE NOT n.nspname = ANY(ARRAY['pg_catalog', 'information_schema']) + LOOP + EXECUTE this.sql; + END LOOP; + ELSE + FOR this IN + SELECT 'GRANT EXECUTE ON ' + || CASE p.prokind WHEN 'a' THEN 'AGGREGATE ' ELSE 'FUNCTION ' END + || quote_ident(n.nspname) || '.' || quote_ident(p.proname) || '(' + || pg_catalog.pg_get_function_identity_arguments(p.oid) || ') TO report_user;' AS sql + FROM pg_catalog.pg_proc p + JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace + WHERE NOT n.nspname = ANY(ARRAY['pg_catalog', 'information_schema']) + LOOP + EXECUTE this.sql; + END LOOP; + END IF; END $$ LANGUAGE plpgsql; diff --git a/src/Frapid.Web/Areas/Frapid.Account/db/PostgreSQL/1.1.update/src/99.ownership.sql b/src/Frapid.Web/Areas/Frapid.Account/db/PostgreSQL/1.1.update/src/99.ownership.sql index ccd67abd..c9f618ad 100644 --- a/src/Frapid.Web/Areas/Frapid.Account/db/PostgreSQL/1.1.update/src/99.ownership.sql +++ b/src/Frapid.Web/Areas/Frapid.Account/db/PostgreSQL/1.1.update/src/99.ownership.sql @@ -39,27 +39,43 @@ LANGUAGE plpgsql; DO $$ DECLARE this record; + DECLARE _version_number integer = current_setting('server_version_num')::integer; BEGIN IF(CURRENT_USER = 'frapid_db_user') THEN RETURN; END IF; - FOR this IN - SELECT 'ALTER ' - || CASE WHEN p.proisagg THEN 'AGGREGATE ' ELSE 'FUNCTION ' END - || quote_ident(n.nspname) || '.' || quote_ident(p.proname) || '(' - || pg_catalog.pg_get_function_identity_arguments(p.oid) || ') OWNER TO frapid_db_user;' AS sql - FROM pg_catalog.pg_proc p - JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace - WHERE NOT n.nspname = ANY(ARRAY['pg_catalog', 'information_schema']) - LOOP - EXECUTE this.sql; - END LOOP; + IF(_version_number < 110000) THEN + FOR this IN + SELECT 'ALTER ' + || CASE WHEN p.proisagg THEN 'AGGREGATE ' ELSE 'FUNCTION ' END + || quote_ident(n.nspname) || '.' || quote_ident(p.proname) || '(' + || pg_catalog.pg_get_function_identity_arguments(p.oid) || ') OWNER TO frapid_db_user;' AS sql + FROM pg_catalog.pg_proc p + JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace + WHERE NOT n.nspname = ANY(ARRAY['pg_catalog', 'information_schema']) + LOOP + EXECUTE this.sql; + END LOOP; + ELSE + FOR this IN + SELECT 'ALTER ' + || CASE p.prokind WHEN 'a' THEN 'AGGREGATE ' ELSE 'FUNCTION ' END + || quote_ident(n.nspname) || '.' || quote_ident(p.proname) || '(' + || pg_catalog.pg_get_function_identity_arguments(p.oid) || ') OWNER TO frapid_db_user;' AS sql + FROM pg_catalog.pg_proc p + JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace + WHERE NOT n.nspname = ANY(ARRAY['pg_catalog', 'information_schema']) + LOOP + EXECUTE this.sql; + END LOOP; + END IF; END $$ LANGUAGE plpgsql; + DO $$ DECLARE this record; @@ -166,22 +182,37 @@ LANGUAGE plpgsql; DO $$ DECLARE this record; + DECLARE _version_number integer = current_setting('server_version_num')::integer; BEGIN IF(CURRENT_USER = 'report_user') THEN RETURN; END IF; - FOR this IN - SELECT 'GRANT EXECUTE ON ' - || CASE WHEN p.proisagg THEN 'AGGREGATE ' ELSE 'FUNCTION ' END - || quote_ident(n.nspname) || '.' || quote_ident(p.proname) || '(' - || pg_catalog.pg_get_function_identity_arguments(p.oid) || ') TO report_user;' AS sql - FROM pg_catalog.pg_proc p - JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace - WHERE NOT n.nspname = ANY(ARRAY['pg_catalog', 'information_schema']) - LOOP - EXECUTE this.sql; - END LOOP; + IF(_version_number < 110000) THEN + FOR this IN + SELECT 'GRANT EXECUTE ON ' + || CASE WHEN p.proisagg THEN 'AGGREGATE ' ELSE 'FUNCTION ' END + || quote_ident(n.nspname) || '.' || quote_ident(p.proname) || '(' + || pg_catalog.pg_get_function_identity_arguments(p.oid) || ') TO report_user;' AS sql + FROM pg_catalog.pg_proc p + JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace + WHERE NOT n.nspname = ANY(ARRAY['pg_catalog', 'information_schema']) + LOOP + EXECUTE this.sql; + END LOOP; + ELSE + FOR this IN + SELECT 'GRANT EXECUTE ON ' + || CASE p.prokind WHEN 'a' THEN 'AGGREGATE ' ELSE 'FUNCTION ' END + || quote_ident(n.nspname) || '.' || quote_ident(p.proname) || '(' + || pg_catalog.pg_get_function_identity_arguments(p.oid) || ') TO report_user;' AS sql + FROM pg_catalog.pg_proc p + JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace + WHERE NOT n.nspname = ANY(ARRAY['pg_catalog', 'information_schema']) + LOOP + EXECUTE this.sql; + END LOOP; + END IF; END $$ LANGUAGE plpgsql; diff --git a/src/Frapid.Web/Areas/Frapid.Account/db/PostgreSQL/1.x/1.0/account-blank.sql b/src/Frapid.Web/Areas/Frapid.Account/db/PostgreSQL/1.x/1.0/account-blank.sql index 9ddde522..53b78240 100644 --- a/src/Frapid.Web/Areas/Frapid.Account/db/PostgreSQL/1.x/1.0/account-blank.sql +++ b/src/Frapid.Web/Areas/Frapid.Account/db/PostgreSQL/1.x/1.0/account-blank.sql @@ -1366,27 +1366,43 @@ LANGUAGE plpgsql; DO $$ DECLARE this record; + DECLARE _version_number integer = current_setting('server_version_num')::integer; BEGIN IF(CURRENT_USER = 'frapid_db_user') THEN RETURN; END IF; - FOR this IN - SELECT 'ALTER ' - || CASE WHEN p.proisagg THEN 'AGGREGATE ' ELSE 'FUNCTION ' END - || quote_ident(n.nspname) || '.' || quote_ident(p.proname) || '(' - || pg_catalog.pg_get_function_identity_arguments(p.oid) || ') OWNER TO frapid_db_user;' AS sql - FROM pg_catalog.pg_proc p - JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace - WHERE NOT n.nspname = ANY(ARRAY['pg_catalog', 'information_schema']) - LOOP - EXECUTE this.sql; - END LOOP; + IF(_version_number < 110000) THEN + FOR this IN + SELECT 'ALTER ' + || CASE WHEN p.proisagg THEN 'AGGREGATE ' ELSE 'FUNCTION ' END + || quote_ident(n.nspname) || '.' || quote_ident(p.proname) || '(' + || pg_catalog.pg_get_function_identity_arguments(p.oid) || ') OWNER TO frapid_db_user;' AS sql + FROM pg_catalog.pg_proc p + JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace + WHERE NOT n.nspname = ANY(ARRAY['pg_catalog', 'information_schema']) + LOOP + EXECUTE this.sql; + END LOOP; + ELSE + FOR this IN + SELECT 'ALTER ' + || CASE p.prokind WHEN 'a' THEN 'AGGREGATE ' ELSE 'FUNCTION ' END + || quote_ident(n.nspname) || '.' || quote_ident(p.proname) || '(' + || pg_catalog.pg_get_function_identity_arguments(p.oid) || ') OWNER TO frapid_db_user;' AS sql + FROM pg_catalog.pg_proc p + JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace + WHERE NOT n.nspname = ANY(ARRAY['pg_catalog', 'information_schema']) + LOOP + EXECUTE this.sql; + END LOOP; + END IF; END $$ LANGUAGE plpgsql; + DO $$ DECLARE this record; @@ -1493,22 +1509,37 @@ LANGUAGE plpgsql; DO $$ DECLARE this record; + DECLARE _version_number integer = current_setting('server_version_num')::integer; BEGIN IF(CURRENT_USER = 'report_user') THEN RETURN; END IF; - FOR this IN - SELECT 'GRANT EXECUTE ON ' - || CASE WHEN p.proisagg THEN 'AGGREGATE ' ELSE 'FUNCTION ' END - || quote_ident(n.nspname) || '.' || quote_ident(p.proname) || '(' - || pg_catalog.pg_get_function_identity_arguments(p.oid) || ') TO report_user;' AS sql - FROM pg_catalog.pg_proc p - JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace - WHERE NOT n.nspname = ANY(ARRAY['pg_catalog', 'information_schema']) - LOOP - EXECUTE this.sql; - END LOOP; + IF(_version_number < 110000) THEN + FOR this IN + SELECT 'GRANT EXECUTE ON ' + || CASE WHEN p.proisagg THEN 'AGGREGATE ' ELSE 'FUNCTION ' END + || quote_ident(n.nspname) || '.' || quote_ident(p.proname) || '(' + || pg_catalog.pg_get_function_identity_arguments(p.oid) || ') TO report_user;' AS sql + FROM pg_catalog.pg_proc p + JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace + WHERE NOT n.nspname = ANY(ARRAY['pg_catalog', 'information_schema']) + LOOP + EXECUTE this.sql; + END LOOP; + ELSE + FOR this IN + SELECT 'GRANT EXECUTE ON ' + || CASE p.prokind WHEN 'a' THEN 'AGGREGATE ' ELSE 'FUNCTION ' END + || quote_ident(n.nspname) || '.' || quote_ident(p.proname) || '(' + || pg_catalog.pg_get_function_identity_arguments(p.oid) || ') TO report_user;' AS sql + FROM pg_catalog.pg_proc p + JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace + WHERE NOT n.nspname = ANY(ARRAY['pg_catalog', 'information_schema']) + LOOP + EXECUTE this.sql; + END LOOP; + END IF; END $$ LANGUAGE plpgsql; diff --git a/src/Frapid.Web/Areas/Frapid.Account/db/PostgreSQL/1.x/1.0/src/99.ownership.sql b/src/Frapid.Web/Areas/Frapid.Account/db/PostgreSQL/1.x/1.0/src/99.ownership.sql index ccd67abd..c9f618ad 100644 --- a/src/Frapid.Web/Areas/Frapid.Account/db/PostgreSQL/1.x/1.0/src/99.ownership.sql +++ b/src/Frapid.Web/Areas/Frapid.Account/db/PostgreSQL/1.x/1.0/src/99.ownership.sql @@ -39,27 +39,43 @@ LANGUAGE plpgsql; DO $$ DECLARE this record; + DECLARE _version_number integer = current_setting('server_version_num')::integer; BEGIN IF(CURRENT_USER = 'frapid_db_user') THEN RETURN; END IF; - FOR this IN - SELECT 'ALTER ' - || CASE WHEN p.proisagg THEN 'AGGREGATE ' ELSE 'FUNCTION ' END - || quote_ident(n.nspname) || '.' || quote_ident(p.proname) || '(' - || pg_catalog.pg_get_function_identity_arguments(p.oid) || ') OWNER TO frapid_db_user;' AS sql - FROM pg_catalog.pg_proc p - JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace - WHERE NOT n.nspname = ANY(ARRAY['pg_catalog', 'information_schema']) - LOOP - EXECUTE this.sql; - END LOOP; + IF(_version_number < 110000) THEN + FOR this IN + SELECT 'ALTER ' + || CASE WHEN p.proisagg THEN 'AGGREGATE ' ELSE 'FUNCTION ' END + || quote_ident(n.nspname) || '.' || quote_ident(p.proname) || '(' + || pg_catalog.pg_get_function_identity_arguments(p.oid) || ') OWNER TO frapid_db_user;' AS sql + FROM pg_catalog.pg_proc p + JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace + WHERE NOT n.nspname = ANY(ARRAY['pg_catalog', 'information_schema']) + LOOP + EXECUTE this.sql; + END LOOP; + ELSE + FOR this IN + SELECT 'ALTER ' + || CASE p.prokind WHEN 'a' THEN 'AGGREGATE ' ELSE 'FUNCTION ' END + || quote_ident(n.nspname) || '.' || quote_ident(p.proname) || '(' + || pg_catalog.pg_get_function_identity_arguments(p.oid) || ') OWNER TO frapid_db_user;' AS sql + FROM pg_catalog.pg_proc p + JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace + WHERE NOT n.nspname = ANY(ARRAY['pg_catalog', 'information_schema']) + LOOP + EXECUTE this.sql; + END LOOP; + END IF; END $$ LANGUAGE plpgsql; + DO $$ DECLARE this record; @@ -166,22 +182,37 @@ LANGUAGE plpgsql; DO $$ DECLARE this record; + DECLARE _version_number integer = current_setting('server_version_num')::integer; BEGIN IF(CURRENT_USER = 'report_user') THEN RETURN; END IF; - FOR this IN - SELECT 'GRANT EXECUTE ON ' - || CASE WHEN p.proisagg THEN 'AGGREGATE ' ELSE 'FUNCTION ' END - || quote_ident(n.nspname) || '.' || quote_ident(p.proname) || '(' - || pg_catalog.pg_get_function_identity_arguments(p.oid) || ') TO report_user;' AS sql - FROM pg_catalog.pg_proc p - JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace - WHERE NOT n.nspname = ANY(ARRAY['pg_catalog', 'information_schema']) - LOOP - EXECUTE this.sql; - END LOOP; + IF(_version_number < 110000) THEN + FOR this IN + SELECT 'GRANT EXECUTE ON ' + || CASE WHEN p.proisagg THEN 'AGGREGATE ' ELSE 'FUNCTION ' END + || quote_ident(n.nspname) || '.' || quote_ident(p.proname) || '(' + || pg_catalog.pg_get_function_identity_arguments(p.oid) || ') TO report_user;' AS sql + FROM pg_catalog.pg_proc p + JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace + WHERE NOT n.nspname = ANY(ARRAY['pg_catalog', 'information_schema']) + LOOP + EXECUTE this.sql; + END LOOP; + ELSE + FOR this IN + SELECT 'GRANT EXECUTE ON ' + || CASE p.prokind WHEN 'a' THEN 'AGGREGATE ' ELSE 'FUNCTION ' END + || quote_ident(n.nspname) || '.' || quote_ident(p.proname) || '(' + || pg_catalog.pg_get_function_identity_arguments(p.oid) || ') TO report_user;' AS sql + FROM pg_catalog.pg_proc p + JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace + WHERE NOT n.nspname = ANY(ARRAY['pg_catalog', 'information_schema']) + LOOP + EXECUTE this.sql; + END LOOP; + END IF; END $$ LANGUAGE plpgsql; diff --git a/src/Frapid.Web/Areas/Frapid.Account/db/PostgreSQL/account-blank-1.1.update.sql b/src/Frapid.Web/Areas/Frapid.Account/db/PostgreSQL/account-blank-1.1.update.sql index 07480c33..bdf81de5 100644 --- a/src/Frapid.Web/Areas/Frapid.Account/db/PostgreSQL/account-blank-1.1.update.sql +++ b/src/Frapid.Web/Areas/Frapid.Account/db/PostgreSQL/account-blank-1.1.update.sql @@ -178,27 +178,43 @@ LANGUAGE plpgsql; DO $$ DECLARE this record; + DECLARE _version_number integer = current_setting('server_version_num')::integer; BEGIN IF(CURRENT_USER = 'frapid_db_user') THEN RETURN; END IF; - FOR this IN - SELECT 'ALTER ' - || CASE WHEN p.proisagg THEN 'AGGREGATE ' ELSE 'FUNCTION ' END - || quote_ident(n.nspname) || '.' || quote_ident(p.proname) || '(' - || pg_catalog.pg_get_function_identity_arguments(p.oid) || ') OWNER TO frapid_db_user;' AS sql - FROM pg_catalog.pg_proc p - JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace - WHERE NOT n.nspname = ANY(ARRAY['pg_catalog', 'information_schema']) - LOOP - EXECUTE this.sql; - END LOOP; + IF(_version_number < 110000) THEN + FOR this IN + SELECT 'ALTER ' + || CASE WHEN p.proisagg THEN 'AGGREGATE ' ELSE 'FUNCTION ' END + || quote_ident(n.nspname) || '.' || quote_ident(p.proname) || '(' + || pg_catalog.pg_get_function_identity_arguments(p.oid) || ') OWNER TO frapid_db_user;' AS sql + FROM pg_catalog.pg_proc p + JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace + WHERE NOT n.nspname = ANY(ARRAY['pg_catalog', 'information_schema']) + LOOP + EXECUTE this.sql; + END LOOP; + ELSE + FOR this IN + SELECT 'ALTER ' + || CASE p.prokind WHEN 'a' THEN 'AGGREGATE ' ELSE 'FUNCTION ' END + || quote_ident(n.nspname) || '.' || quote_ident(p.proname) || '(' + || pg_catalog.pg_get_function_identity_arguments(p.oid) || ') OWNER TO frapid_db_user;' AS sql + FROM pg_catalog.pg_proc p + JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace + WHERE NOT n.nspname = ANY(ARRAY['pg_catalog', 'information_schema']) + LOOP + EXECUTE this.sql; + END LOOP; + END IF; END $$ LANGUAGE plpgsql; + DO $$ DECLARE this record; @@ -305,22 +321,37 @@ LANGUAGE plpgsql; DO $$ DECLARE this record; + DECLARE _version_number integer = current_setting('server_version_num')::integer; BEGIN IF(CURRENT_USER = 'report_user') THEN RETURN; END IF; - FOR this IN - SELECT 'GRANT EXECUTE ON ' - || CASE WHEN p.proisagg THEN 'AGGREGATE ' ELSE 'FUNCTION ' END - || quote_ident(n.nspname) || '.' || quote_ident(p.proname) || '(' - || pg_catalog.pg_get_function_identity_arguments(p.oid) || ') TO report_user;' AS sql - FROM pg_catalog.pg_proc p - JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace - WHERE NOT n.nspname = ANY(ARRAY['pg_catalog', 'information_schema']) - LOOP - EXECUTE this.sql; - END LOOP; + IF(_version_number < 110000) THEN + FOR this IN + SELECT 'GRANT EXECUTE ON ' + || CASE WHEN p.proisagg THEN 'AGGREGATE ' ELSE 'FUNCTION ' END + || quote_ident(n.nspname) || '.' || quote_ident(p.proname) || '(' + || pg_catalog.pg_get_function_identity_arguments(p.oid) || ') TO report_user;' AS sql + FROM pg_catalog.pg_proc p + JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace + WHERE NOT n.nspname = ANY(ARRAY['pg_catalog', 'information_schema']) + LOOP + EXECUTE this.sql; + END LOOP; + ELSE + FOR this IN + SELECT 'GRANT EXECUTE ON ' + || CASE p.prokind WHEN 'a' THEN 'AGGREGATE ' ELSE 'FUNCTION ' END + || quote_ident(n.nspname) || '.' || quote_ident(p.proname) || '(' + || pg_catalog.pg_get_function_identity_arguments(p.oid) || ') TO report_user;' AS sql + FROM pg_catalog.pg_proc p + JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace + WHERE NOT n.nspname = ANY(ARRAY['pg_catalog', 'information_schema']) + LOOP + EXECUTE this.sql; + END LOOP; + END IF; END $$ LANGUAGE plpgsql; diff --git a/src/Frapid.Web/Areas/Frapid.Account/db/PostgreSQL/account-blank.sql b/src/Frapid.Web/Areas/Frapid.Account/db/PostgreSQL/account-blank.sql index 9ddde522..53b78240 100644 --- a/src/Frapid.Web/Areas/Frapid.Account/db/PostgreSQL/account-blank.sql +++ b/src/Frapid.Web/Areas/Frapid.Account/db/PostgreSQL/account-blank.sql @@ -1366,27 +1366,43 @@ LANGUAGE plpgsql; DO $$ DECLARE this record; + DECLARE _version_number integer = current_setting('server_version_num')::integer; BEGIN IF(CURRENT_USER = 'frapid_db_user') THEN RETURN; END IF; - FOR this IN - SELECT 'ALTER ' - || CASE WHEN p.proisagg THEN 'AGGREGATE ' ELSE 'FUNCTION ' END - || quote_ident(n.nspname) || '.' || quote_ident(p.proname) || '(' - || pg_catalog.pg_get_function_identity_arguments(p.oid) || ') OWNER TO frapid_db_user;' AS sql - FROM pg_catalog.pg_proc p - JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace - WHERE NOT n.nspname = ANY(ARRAY['pg_catalog', 'information_schema']) - LOOP - EXECUTE this.sql; - END LOOP; + IF(_version_number < 110000) THEN + FOR this IN + SELECT 'ALTER ' + || CASE WHEN p.proisagg THEN 'AGGREGATE ' ELSE 'FUNCTION ' END + || quote_ident(n.nspname) || '.' || quote_ident(p.proname) || '(' + || pg_catalog.pg_get_function_identity_arguments(p.oid) || ') OWNER TO frapid_db_user;' AS sql + FROM pg_catalog.pg_proc p + JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace + WHERE NOT n.nspname = ANY(ARRAY['pg_catalog', 'information_schema']) + LOOP + EXECUTE this.sql; + END LOOP; + ELSE + FOR this IN + SELECT 'ALTER ' + || CASE p.prokind WHEN 'a' THEN 'AGGREGATE ' ELSE 'FUNCTION ' END + || quote_ident(n.nspname) || '.' || quote_ident(p.proname) || '(' + || pg_catalog.pg_get_function_identity_arguments(p.oid) || ') OWNER TO frapid_db_user;' AS sql + FROM pg_catalog.pg_proc p + JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace + WHERE NOT n.nspname = ANY(ARRAY['pg_catalog', 'information_schema']) + LOOP + EXECUTE this.sql; + END LOOP; + END IF; END $$ LANGUAGE plpgsql; + DO $$ DECLARE this record; @@ -1493,22 +1509,37 @@ LANGUAGE plpgsql; DO $$ DECLARE this record; + DECLARE _version_number integer = current_setting('server_version_num')::integer; BEGIN IF(CURRENT_USER = 'report_user') THEN RETURN; END IF; - FOR this IN - SELECT 'GRANT EXECUTE ON ' - || CASE WHEN p.proisagg THEN 'AGGREGATE ' ELSE 'FUNCTION ' END - || quote_ident(n.nspname) || '.' || quote_ident(p.proname) || '(' - || pg_catalog.pg_get_function_identity_arguments(p.oid) || ') TO report_user;' AS sql - FROM pg_catalog.pg_proc p - JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace - WHERE NOT n.nspname = ANY(ARRAY['pg_catalog', 'information_schema']) - LOOP - EXECUTE this.sql; - END LOOP; + IF(_version_number < 110000) THEN + FOR this IN + SELECT 'GRANT EXECUTE ON ' + || CASE WHEN p.proisagg THEN 'AGGREGATE ' ELSE 'FUNCTION ' END + || quote_ident(n.nspname) || '.' || quote_ident(p.proname) || '(' + || pg_catalog.pg_get_function_identity_arguments(p.oid) || ') TO report_user;' AS sql + FROM pg_catalog.pg_proc p + JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace + WHERE NOT n.nspname = ANY(ARRAY['pg_catalog', 'information_schema']) + LOOP + EXECUTE this.sql; + END LOOP; + ELSE + FOR this IN + SELECT 'GRANT EXECUTE ON ' + || CASE p.prokind WHEN 'a' THEN 'AGGREGATE ' ELSE 'FUNCTION ' END + || quote_ident(n.nspname) || '.' || quote_ident(p.proname) || '(' + || pg_catalog.pg_get_function_identity_arguments(p.oid) || ') TO report_user;' AS sql + FROM pg_catalog.pg_proc p + JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace + WHERE NOT n.nspname = ANY(ARRAY['pg_catalog', 'information_schema']) + LOOP + EXECUTE this.sql; + END LOOP; + END IF; END $$ LANGUAGE plpgsql; diff --git a/src/Frapid.Web/Areas/Frapid.AddressBook/db/PostgreSQL/2.x/2.0/addressbook-blank.sql b/src/Frapid.Web/Areas/Frapid.AddressBook/db/PostgreSQL/2.x/2.0/addressbook-blank.sql index 7ab76841..5dbf60e2 100644 --- a/src/Frapid.Web/Areas/Frapid.AddressBook/db/PostgreSQL/2.x/2.0/addressbook-blank.sql +++ b/src/Frapid.Web/Areas/Frapid.AddressBook/db/PostgreSQL/2.x/2.0/addressbook-blank.sql @@ -145,27 +145,43 @@ LANGUAGE plpgsql; DO $$ DECLARE this record; + DECLARE _version_number integer = current_setting('server_version_num')::integer; BEGIN IF(CURRENT_USER = 'frapid_db_user') THEN RETURN; END IF; - FOR this IN - SELECT 'ALTER ' - || CASE WHEN p.proisagg THEN 'AGGREGATE ' ELSE 'FUNCTION ' END - || quote_ident(n.nspname) || '.' || quote_ident(p.proname) || '(' - || pg_catalog.pg_get_function_identity_arguments(p.oid) || ') OWNER TO frapid_db_user;' AS sql - FROM pg_catalog.pg_proc p - JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace - WHERE NOT n.nspname = ANY(ARRAY['pg_catalog', 'information_schema']) - LOOP - EXECUTE this.sql; - END LOOP; + IF(_version_number < 110000) THEN + FOR this IN + SELECT 'ALTER ' + || CASE WHEN p.proisagg THEN 'AGGREGATE ' ELSE 'FUNCTION ' END + || quote_ident(n.nspname) || '.' || quote_ident(p.proname) || '(' + || pg_catalog.pg_get_function_identity_arguments(p.oid) || ') OWNER TO frapid_db_user;' AS sql + FROM pg_catalog.pg_proc p + JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace + WHERE NOT n.nspname = ANY(ARRAY['pg_catalog', 'information_schema']) + LOOP + EXECUTE this.sql; + END LOOP; + ELSE + FOR this IN + SELECT 'ALTER ' + || CASE p.prokind WHEN 'a' THEN 'AGGREGATE ' ELSE 'FUNCTION ' END + || quote_ident(n.nspname) || '.' || quote_ident(p.proname) || '(' + || pg_catalog.pg_get_function_identity_arguments(p.oid) || ') OWNER TO frapid_db_user;' AS sql + FROM pg_catalog.pg_proc p + JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace + WHERE NOT n.nspname = ANY(ARRAY['pg_catalog', 'information_schema']) + LOOP + EXECUTE this.sql; + END LOOP; + END IF; END $$ LANGUAGE plpgsql; + DO $$ DECLARE this record; @@ -272,22 +288,37 @@ LANGUAGE plpgsql; DO $$ DECLARE this record; + DECLARE _version_number integer = current_setting('server_version_num')::integer; BEGIN IF(CURRENT_USER = 'report_user') THEN RETURN; END IF; - FOR this IN - SELECT 'GRANT EXECUTE ON ' - || CASE WHEN p.proisagg THEN 'AGGREGATE ' ELSE 'FUNCTION ' END - || quote_ident(n.nspname) || '.' || quote_ident(p.proname) || '(' - || pg_catalog.pg_get_function_identity_arguments(p.oid) || ') TO report_user;' AS sql - FROM pg_catalog.pg_proc p - JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace - WHERE NOT n.nspname = ANY(ARRAY['pg_catalog', 'information_schema']) - LOOP - EXECUTE this.sql; - END LOOP; + IF(_version_number < 110000) THEN + FOR this IN + SELECT 'GRANT EXECUTE ON ' + || CASE WHEN p.proisagg THEN 'AGGREGATE ' ELSE 'FUNCTION ' END + || quote_ident(n.nspname) || '.' || quote_ident(p.proname) || '(' + || pg_catalog.pg_get_function_identity_arguments(p.oid) || ') TO report_user;' AS sql + FROM pg_catalog.pg_proc p + JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace + WHERE NOT n.nspname = ANY(ARRAY['pg_catalog', 'information_schema']) + LOOP + EXECUTE this.sql; + END LOOP; + ELSE + FOR this IN + SELECT 'GRANT EXECUTE ON ' + || CASE p.prokind WHEN 'a' THEN 'AGGREGATE ' ELSE 'FUNCTION ' END + || quote_ident(n.nspname) || '.' || quote_ident(p.proname) || '(' + || pg_catalog.pg_get_function_identity_arguments(p.oid) || ') TO report_user;' AS sql + FROM pg_catalog.pg_proc p + JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace + WHERE NOT n.nspname = ANY(ARRAY['pg_catalog', 'information_schema']) + LOOP + EXECUTE this.sql; + END LOOP; + END IF; END $$ LANGUAGE plpgsql; diff --git a/src/Frapid.Web/Areas/Frapid.AddressBook/db/PostgreSQL/2.x/2.0/src/99.ownership.sql b/src/Frapid.Web/Areas/Frapid.AddressBook/db/PostgreSQL/2.x/2.0/src/99.ownership.sql index ccd67abd..c9f618ad 100644 --- a/src/Frapid.Web/Areas/Frapid.AddressBook/db/PostgreSQL/2.x/2.0/src/99.ownership.sql +++ b/src/Frapid.Web/Areas/Frapid.AddressBook/db/PostgreSQL/2.x/2.0/src/99.ownership.sql @@ -39,27 +39,43 @@ LANGUAGE plpgsql; DO $$ DECLARE this record; + DECLARE _version_number integer = current_setting('server_version_num')::integer; BEGIN IF(CURRENT_USER = 'frapid_db_user') THEN RETURN; END IF; - FOR this IN - SELECT 'ALTER ' - || CASE WHEN p.proisagg THEN 'AGGREGATE ' ELSE 'FUNCTION ' END - || quote_ident(n.nspname) || '.' || quote_ident(p.proname) || '(' - || pg_catalog.pg_get_function_identity_arguments(p.oid) || ') OWNER TO frapid_db_user;' AS sql - FROM pg_catalog.pg_proc p - JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace - WHERE NOT n.nspname = ANY(ARRAY['pg_catalog', 'information_schema']) - LOOP - EXECUTE this.sql; - END LOOP; + IF(_version_number < 110000) THEN + FOR this IN + SELECT 'ALTER ' + || CASE WHEN p.proisagg THEN 'AGGREGATE ' ELSE 'FUNCTION ' END + || quote_ident(n.nspname) || '.' || quote_ident(p.proname) || '(' + || pg_catalog.pg_get_function_identity_arguments(p.oid) || ') OWNER TO frapid_db_user;' AS sql + FROM pg_catalog.pg_proc p + JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace + WHERE NOT n.nspname = ANY(ARRAY['pg_catalog', 'information_schema']) + LOOP + EXECUTE this.sql; + END LOOP; + ELSE + FOR this IN + SELECT 'ALTER ' + || CASE p.prokind WHEN 'a' THEN 'AGGREGATE ' ELSE 'FUNCTION ' END + || quote_ident(n.nspname) || '.' || quote_ident(p.proname) || '(' + || pg_catalog.pg_get_function_identity_arguments(p.oid) || ') OWNER TO frapid_db_user;' AS sql + FROM pg_catalog.pg_proc p + JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace + WHERE NOT n.nspname = ANY(ARRAY['pg_catalog', 'information_schema']) + LOOP + EXECUTE this.sql; + END LOOP; + END IF; END $$ LANGUAGE plpgsql; + DO $$ DECLARE this record; @@ -166,22 +182,37 @@ LANGUAGE plpgsql; DO $$ DECLARE this record; + DECLARE _version_number integer = current_setting('server_version_num')::integer; BEGIN IF(CURRENT_USER = 'report_user') THEN RETURN; END IF; - FOR this IN - SELECT 'GRANT EXECUTE ON ' - || CASE WHEN p.proisagg THEN 'AGGREGATE ' ELSE 'FUNCTION ' END - || quote_ident(n.nspname) || '.' || quote_ident(p.proname) || '(' - || pg_catalog.pg_get_function_identity_arguments(p.oid) || ') TO report_user;' AS sql - FROM pg_catalog.pg_proc p - JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace - WHERE NOT n.nspname = ANY(ARRAY['pg_catalog', 'information_schema']) - LOOP - EXECUTE this.sql; - END LOOP; + IF(_version_number < 110000) THEN + FOR this IN + SELECT 'GRANT EXECUTE ON ' + || CASE WHEN p.proisagg THEN 'AGGREGATE ' ELSE 'FUNCTION ' END + || quote_ident(n.nspname) || '.' || quote_ident(p.proname) || '(' + || pg_catalog.pg_get_function_identity_arguments(p.oid) || ') TO report_user;' AS sql + FROM pg_catalog.pg_proc p + JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace + WHERE NOT n.nspname = ANY(ARRAY['pg_catalog', 'information_schema']) + LOOP + EXECUTE this.sql; + END LOOP; + ELSE + FOR this IN + SELECT 'GRANT EXECUTE ON ' + || CASE p.prokind WHEN 'a' THEN 'AGGREGATE ' ELSE 'FUNCTION ' END + || quote_ident(n.nspname) || '.' || quote_ident(p.proname) || '(' + || pg_catalog.pg_get_function_identity_arguments(p.oid) || ') TO report_user;' AS sql + FROM pg_catalog.pg_proc p + JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace + WHERE NOT n.nspname = ANY(ARRAY['pg_catalog', 'information_schema']) + LOOP + EXECUTE this.sql; + END LOOP; + END IF; END $$ LANGUAGE plpgsql; diff --git a/src/Frapid.Web/Areas/Frapid.AddressBook/db/PostgreSQL/addressbook-blank.sql b/src/Frapid.Web/Areas/Frapid.AddressBook/db/PostgreSQL/addressbook-blank.sql index 7ab76841..5dbf60e2 100644 --- a/src/Frapid.Web/Areas/Frapid.AddressBook/db/PostgreSQL/addressbook-blank.sql +++ b/src/Frapid.Web/Areas/Frapid.AddressBook/db/PostgreSQL/addressbook-blank.sql @@ -145,27 +145,43 @@ LANGUAGE plpgsql; DO $$ DECLARE this record; + DECLARE _version_number integer = current_setting('server_version_num')::integer; BEGIN IF(CURRENT_USER = 'frapid_db_user') THEN RETURN; END IF; - FOR this IN - SELECT 'ALTER ' - || CASE WHEN p.proisagg THEN 'AGGREGATE ' ELSE 'FUNCTION ' END - || quote_ident(n.nspname) || '.' || quote_ident(p.proname) || '(' - || pg_catalog.pg_get_function_identity_arguments(p.oid) || ') OWNER TO frapid_db_user;' AS sql - FROM pg_catalog.pg_proc p - JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace - WHERE NOT n.nspname = ANY(ARRAY['pg_catalog', 'information_schema']) - LOOP - EXECUTE this.sql; - END LOOP; + IF(_version_number < 110000) THEN + FOR this IN + SELECT 'ALTER ' + || CASE WHEN p.proisagg THEN 'AGGREGATE ' ELSE 'FUNCTION ' END + || quote_ident(n.nspname) || '.' || quote_ident(p.proname) || '(' + || pg_catalog.pg_get_function_identity_arguments(p.oid) || ') OWNER TO frapid_db_user;' AS sql + FROM pg_catalog.pg_proc p + JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace + WHERE NOT n.nspname = ANY(ARRAY['pg_catalog', 'information_schema']) + LOOP + EXECUTE this.sql; + END LOOP; + ELSE + FOR this IN + SELECT 'ALTER ' + || CASE p.prokind WHEN 'a' THEN 'AGGREGATE ' ELSE 'FUNCTION ' END + || quote_ident(n.nspname) || '.' || quote_ident(p.proname) || '(' + || pg_catalog.pg_get_function_identity_arguments(p.oid) || ') OWNER TO frapid_db_user;' AS sql + FROM pg_catalog.pg_proc p + JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace + WHERE NOT n.nspname = ANY(ARRAY['pg_catalog', 'information_schema']) + LOOP + EXECUTE this.sql; + END LOOP; + END IF; END $$ LANGUAGE plpgsql; + DO $$ DECLARE this record; @@ -272,22 +288,37 @@ LANGUAGE plpgsql; DO $$ DECLARE this record; + DECLARE _version_number integer = current_setting('server_version_num')::integer; BEGIN IF(CURRENT_USER = 'report_user') THEN RETURN; END IF; - FOR this IN - SELECT 'GRANT EXECUTE ON ' - || CASE WHEN p.proisagg THEN 'AGGREGATE ' ELSE 'FUNCTION ' END - || quote_ident(n.nspname) || '.' || quote_ident(p.proname) || '(' - || pg_catalog.pg_get_function_identity_arguments(p.oid) || ') TO report_user;' AS sql - FROM pg_catalog.pg_proc p - JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace - WHERE NOT n.nspname = ANY(ARRAY['pg_catalog', 'information_schema']) - LOOP - EXECUTE this.sql; - END LOOP; + IF(_version_number < 110000) THEN + FOR this IN + SELECT 'GRANT EXECUTE ON ' + || CASE WHEN p.proisagg THEN 'AGGREGATE ' ELSE 'FUNCTION ' END + || quote_ident(n.nspname) || '.' || quote_ident(p.proname) || '(' + || pg_catalog.pg_get_function_identity_arguments(p.oid) || ') TO report_user;' AS sql + FROM pg_catalog.pg_proc p + JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace + WHERE NOT n.nspname = ANY(ARRAY['pg_catalog', 'information_schema']) + LOOP + EXECUTE this.sql; + END LOOP; + ELSE + FOR this IN + SELECT 'GRANT EXECUTE ON ' + || CASE p.prokind WHEN 'a' THEN 'AGGREGATE ' ELSE 'FUNCTION ' END + || quote_ident(n.nspname) || '.' || quote_ident(p.proname) || '(' + || pg_catalog.pg_get_function_identity_arguments(p.oid) || ') TO report_user;' AS sql + FROM pg_catalog.pg_proc p + JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace + WHERE NOT n.nspname = ANY(ARRAY['pg_catalog', 'information_schema']) + LOOP + EXECUTE this.sql; + END LOOP; + END IF; END $$ LANGUAGE plpgsql; diff --git a/src/Frapid.Web/Areas/Frapid.Authorization/db/PostgreSQL/1.x/1.0/auth-blank.sql b/src/Frapid.Web/Areas/Frapid.Authorization/db/PostgreSQL/1.x/1.0/auth-blank.sql index 6048dec8..8518bff5 100644 --- a/src/Frapid.Web/Areas/Frapid.Authorization/db/PostgreSQL/1.x/1.0/auth-blank.sql +++ b/src/Frapid.Web/Areas/Frapid.Authorization/db/PostgreSQL/1.x/1.0/auth-blank.sql @@ -995,27 +995,43 @@ LANGUAGE plpgsql; DO $$ DECLARE this record; + DECLARE _version_number integer = current_setting('server_version_num')::integer; BEGIN IF(CURRENT_USER = 'frapid_db_user') THEN RETURN; END IF; - FOR this IN - SELECT 'ALTER ' - || CASE WHEN p.proisagg THEN 'AGGREGATE ' ELSE 'FUNCTION ' END - || quote_ident(n.nspname) || '.' || quote_ident(p.proname) || '(' - || pg_catalog.pg_get_function_identity_arguments(p.oid) || ') OWNER TO frapid_db_user;' AS sql - FROM pg_catalog.pg_proc p - JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace - WHERE NOT n.nspname = ANY(ARRAY['pg_catalog', 'information_schema']) - LOOP - EXECUTE this.sql; - END LOOP; + IF(_version_number < 110000) THEN + FOR this IN + SELECT 'ALTER ' + || CASE WHEN p.proisagg THEN 'AGGREGATE ' ELSE 'FUNCTION ' END + || quote_ident(n.nspname) || '.' || quote_ident(p.proname) || '(' + || pg_catalog.pg_get_function_identity_arguments(p.oid) || ') OWNER TO frapid_db_user;' AS sql + FROM pg_catalog.pg_proc p + JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace + WHERE NOT n.nspname = ANY(ARRAY['pg_catalog', 'information_schema']) + LOOP + EXECUTE this.sql; + END LOOP; + ELSE + FOR this IN + SELECT 'ALTER ' + || CASE p.prokind WHEN 'a' THEN 'AGGREGATE ' ELSE 'FUNCTION ' END + || quote_ident(n.nspname) || '.' || quote_ident(p.proname) || '(' + || pg_catalog.pg_get_function_identity_arguments(p.oid) || ') OWNER TO frapid_db_user;' AS sql + FROM pg_catalog.pg_proc p + JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace + WHERE NOT n.nspname = ANY(ARRAY['pg_catalog', 'information_schema']) + LOOP + EXECUTE this.sql; + END LOOP; + END IF; END $$ LANGUAGE plpgsql; + DO $$ DECLARE this record; @@ -1122,22 +1138,37 @@ LANGUAGE plpgsql; DO $$ DECLARE this record; + DECLARE _version_number integer = current_setting('server_version_num')::integer; BEGIN IF(CURRENT_USER = 'report_user') THEN RETURN; END IF; - FOR this IN - SELECT 'GRANT EXECUTE ON ' - || CASE WHEN p.proisagg THEN 'AGGREGATE ' ELSE 'FUNCTION ' END - || quote_ident(n.nspname) || '.' || quote_ident(p.proname) || '(' - || pg_catalog.pg_get_function_identity_arguments(p.oid) || ') TO report_user;' AS sql - FROM pg_catalog.pg_proc p - JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace - WHERE NOT n.nspname = ANY(ARRAY['pg_catalog', 'information_schema']) - LOOP - EXECUTE this.sql; - END LOOP; + IF(_version_number < 110000) THEN + FOR this IN + SELECT 'GRANT EXECUTE ON ' + || CASE WHEN p.proisagg THEN 'AGGREGATE ' ELSE 'FUNCTION ' END + || quote_ident(n.nspname) || '.' || quote_ident(p.proname) || '(' + || pg_catalog.pg_get_function_identity_arguments(p.oid) || ') TO report_user;' AS sql + FROM pg_catalog.pg_proc p + JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace + WHERE NOT n.nspname = ANY(ARRAY['pg_catalog', 'information_schema']) + LOOP + EXECUTE this.sql; + END LOOP; + ELSE + FOR this IN + SELECT 'GRANT EXECUTE ON ' + || CASE p.prokind WHEN 'a' THEN 'AGGREGATE ' ELSE 'FUNCTION ' END + || quote_ident(n.nspname) || '.' || quote_ident(p.proname) || '(' + || pg_catalog.pg_get_function_identity_arguments(p.oid) || ') TO report_user;' AS sql + FROM pg_catalog.pg_proc p + JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace + WHERE NOT n.nspname = ANY(ARRAY['pg_catalog', 'information_schema']) + LOOP + EXECUTE this.sql; + END LOOP; + END IF; END $$ LANGUAGE plpgsql; diff --git a/src/Frapid.Web/Areas/Frapid.Authorization/db/PostgreSQL/1.x/1.0/src/99.ownership.sql b/src/Frapid.Web/Areas/Frapid.Authorization/db/PostgreSQL/1.x/1.0/src/99.ownership.sql index ccd67abd..c9f618ad 100644 --- a/src/Frapid.Web/Areas/Frapid.Authorization/db/PostgreSQL/1.x/1.0/src/99.ownership.sql +++ b/src/Frapid.Web/Areas/Frapid.Authorization/db/PostgreSQL/1.x/1.0/src/99.ownership.sql @@ -39,27 +39,43 @@ LANGUAGE plpgsql; DO $$ DECLARE this record; + DECLARE _version_number integer = current_setting('server_version_num')::integer; BEGIN IF(CURRENT_USER = 'frapid_db_user') THEN RETURN; END IF; - FOR this IN - SELECT 'ALTER ' - || CASE WHEN p.proisagg THEN 'AGGREGATE ' ELSE 'FUNCTION ' END - || quote_ident(n.nspname) || '.' || quote_ident(p.proname) || '(' - || pg_catalog.pg_get_function_identity_arguments(p.oid) || ') OWNER TO frapid_db_user;' AS sql - FROM pg_catalog.pg_proc p - JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace - WHERE NOT n.nspname = ANY(ARRAY['pg_catalog', 'information_schema']) - LOOP - EXECUTE this.sql; - END LOOP; + IF(_version_number < 110000) THEN + FOR this IN + SELECT 'ALTER ' + || CASE WHEN p.proisagg THEN 'AGGREGATE ' ELSE 'FUNCTION ' END + || quote_ident(n.nspname) || '.' || quote_ident(p.proname) || '(' + || pg_catalog.pg_get_function_identity_arguments(p.oid) || ') OWNER TO frapid_db_user;' AS sql + FROM pg_catalog.pg_proc p + JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace + WHERE NOT n.nspname = ANY(ARRAY['pg_catalog', 'information_schema']) + LOOP + EXECUTE this.sql; + END LOOP; + ELSE + FOR this IN + SELECT 'ALTER ' + || CASE p.prokind WHEN 'a' THEN 'AGGREGATE ' ELSE 'FUNCTION ' END + || quote_ident(n.nspname) || '.' || quote_ident(p.proname) || '(' + || pg_catalog.pg_get_function_identity_arguments(p.oid) || ') OWNER TO frapid_db_user;' AS sql + FROM pg_catalog.pg_proc p + JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace + WHERE NOT n.nspname = ANY(ARRAY['pg_catalog', 'information_schema']) + LOOP + EXECUTE this.sql; + END LOOP; + END IF; END $$ LANGUAGE plpgsql; + DO $$ DECLARE this record; @@ -166,22 +182,37 @@ LANGUAGE plpgsql; DO $$ DECLARE this record; + DECLARE _version_number integer = current_setting('server_version_num')::integer; BEGIN IF(CURRENT_USER = 'report_user') THEN RETURN; END IF; - FOR this IN - SELECT 'GRANT EXECUTE ON ' - || CASE WHEN p.proisagg THEN 'AGGREGATE ' ELSE 'FUNCTION ' END - || quote_ident(n.nspname) || '.' || quote_ident(p.proname) || '(' - || pg_catalog.pg_get_function_identity_arguments(p.oid) || ') TO report_user;' AS sql - FROM pg_catalog.pg_proc p - JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace - WHERE NOT n.nspname = ANY(ARRAY['pg_catalog', 'information_schema']) - LOOP - EXECUTE this.sql; - END LOOP; + IF(_version_number < 110000) THEN + FOR this IN + SELECT 'GRANT EXECUTE ON ' + || CASE WHEN p.proisagg THEN 'AGGREGATE ' ELSE 'FUNCTION ' END + || quote_ident(n.nspname) || '.' || quote_ident(p.proname) || '(' + || pg_catalog.pg_get_function_identity_arguments(p.oid) || ') TO report_user;' AS sql + FROM pg_catalog.pg_proc p + JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace + WHERE NOT n.nspname = ANY(ARRAY['pg_catalog', 'information_schema']) + LOOP + EXECUTE this.sql; + END LOOP; + ELSE + FOR this IN + SELECT 'GRANT EXECUTE ON ' + || CASE p.prokind WHEN 'a' THEN 'AGGREGATE ' ELSE 'FUNCTION ' END + || quote_ident(n.nspname) || '.' || quote_ident(p.proname) || '(' + || pg_catalog.pg_get_function_identity_arguments(p.oid) || ') TO report_user;' AS sql + FROM pg_catalog.pg_proc p + JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace + WHERE NOT n.nspname = ANY(ARRAY['pg_catalog', 'information_schema']) + LOOP + EXECUTE this.sql; + END LOOP; + END IF; END $$ LANGUAGE plpgsql; diff --git a/src/Frapid.Web/Areas/Frapid.Authorization/db/PostgreSQL/auth-blank.sql b/src/Frapid.Web/Areas/Frapid.Authorization/db/PostgreSQL/auth-blank.sql index 6048dec8..8518bff5 100644 --- a/src/Frapid.Web/Areas/Frapid.Authorization/db/PostgreSQL/auth-blank.sql +++ b/src/Frapid.Web/Areas/Frapid.Authorization/db/PostgreSQL/auth-blank.sql @@ -995,27 +995,43 @@ LANGUAGE plpgsql; DO $$ DECLARE this record; + DECLARE _version_number integer = current_setting('server_version_num')::integer; BEGIN IF(CURRENT_USER = 'frapid_db_user') THEN RETURN; END IF; - FOR this IN - SELECT 'ALTER ' - || CASE WHEN p.proisagg THEN 'AGGREGATE ' ELSE 'FUNCTION ' END - || quote_ident(n.nspname) || '.' || quote_ident(p.proname) || '(' - || pg_catalog.pg_get_function_identity_arguments(p.oid) || ') OWNER TO frapid_db_user;' AS sql - FROM pg_catalog.pg_proc p - JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace - WHERE NOT n.nspname = ANY(ARRAY['pg_catalog', 'information_schema']) - LOOP - EXECUTE this.sql; - END LOOP; + IF(_version_number < 110000) THEN + FOR this IN + SELECT 'ALTER ' + || CASE WHEN p.proisagg THEN 'AGGREGATE ' ELSE 'FUNCTION ' END + || quote_ident(n.nspname) || '.' || quote_ident(p.proname) || '(' + || pg_catalog.pg_get_function_identity_arguments(p.oid) || ') OWNER TO frapid_db_user;' AS sql + FROM pg_catalog.pg_proc p + JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace + WHERE NOT n.nspname = ANY(ARRAY['pg_catalog', 'information_schema']) + LOOP + EXECUTE this.sql; + END LOOP; + ELSE + FOR this IN + SELECT 'ALTER ' + || CASE p.prokind WHEN 'a' THEN 'AGGREGATE ' ELSE 'FUNCTION ' END + || quote_ident(n.nspname) || '.' || quote_ident(p.proname) || '(' + || pg_catalog.pg_get_function_identity_arguments(p.oid) || ') OWNER TO frapid_db_user;' AS sql + FROM pg_catalog.pg_proc p + JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace + WHERE NOT n.nspname = ANY(ARRAY['pg_catalog', 'information_schema']) + LOOP + EXECUTE this.sql; + END LOOP; + END IF; END $$ LANGUAGE plpgsql; + DO $$ DECLARE this record; @@ -1122,22 +1138,37 @@ LANGUAGE plpgsql; DO $$ DECLARE this record; + DECLARE _version_number integer = current_setting('server_version_num')::integer; BEGIN IF(CURRENT_USER = 'report_user') THEN RETURN; END IF; - FOR this IN - SELECT 'GRANT EXECUTE ON ' - || CASE WHEN p.proisagg THEN 'AGGREGATE ' ELSE 'FUNCTION ' END - || quote_ident(n.nspname) || '.' || quote_ident(p.proname) || '(' - || pg_catalog.pg_get_function_identity_arguments(p.oid) || ') TO report_user;' AS sql - FROM pg_catalog.pg_proc p - JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace - WHERE NOT n.nspname = ANY(ARRAY['pg_catalog', 'information_schema']) - LOOP - EXECUTE this.sql; - END LOOP; + IF(_version_number < 110000) THEN + FOR this IN + SELECT 'GRANT EXECUTE ON ' + || CASE WHEN p.proisagg THEN 'AGGREGATE ' ELSE 'FUNCTION ' END + || quote_ident(n.nspname) || '.' || quote_ident(p.proname) || '(' + || pg_catalog.pg_get_function_identity_arguments(p.oid) || ') TO report_user;' AS sql + FROM pg_catalog.pg_proc p + JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace + WHERE NOT n.nspname = ANY(ARRAY['pg_catalog', 'information_schema']) + LOOP + EXECUTE this.sql; + END LOOP; + ELSE + FOR this IN + SELECT 'GRANT EXECUTE ON ' + || CASE p.prokind WHEN 'a' THEN 'AGGREGATE ' ELSE 'FUNCTION ' END + || quote_ident(n.nspname) || '.' || quote_ident(p.proname) || '(' + || pg_catalog.pg_get_function_identity_arguments(p.oid) || ') TO report_user;' AS sql + FROM pg_catalog.pg_proc p + JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace + WHERE NOT n.nspname = ANY(ARRAY['pg_catalog', 'information_schema']) + LOOP + EXECUTE this.sql; + END LOOP; + END IF; END $$ LANGUAGE plpgsql; diff --git a/src/Frapid.Web/Areas/Frapid.Calendar/db/PostgreSQL/2.x/2.0/calendar-blank.sql b/src/Frapid.Web/Areas/Frapid.Calendar/db/PostgreSQL/2.x/2.0/calendar-blank.sql index b6f7ecf8..e15ca534 100644 --- a/src/Frapid.Web/Areas/Frapid.Calendar/db/PostgreSQL/2.x/2.0/calendar-blank.sql +++ b/src/Frapid.Web/Areas/Frapid.Calendar/db/PostgreSQL/2.x/2.0/calendar-blank.sql @@ -157,27 +157,43 @@ LANGUAGE plpgsql; DO $$ DECLARE this record; + DECLARE _version_number integer = current_setting('server_version_num')::integer; BEGIN IF(CURRENT_USER = 'frapid_db_user') THEN RETURN; END IF; - FOR this IN - SELECT 'ALTER ' - || CASE WHEN p.proisagg THEN 'AGGREGATE ' ELSE 'FUNCTION ' END - || quote_ident(n.nspname) || '.' || quote_ident(p.proname) || '(' - || pg_catalog.pg_get_function_identity_arguments(p.oid) || ') OWNER TO frapid_db_user;' AS sql - FROM pg_catalog.pg_proc p - JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace - WHERE NOT n.nspname = ANY(ARRAY['pg_catalog', 'information_schema']) - LOOP - EXECUTE this.sql; - END LOOP; + IF(_version_number < 110000) THEN + FOR this IN + SELECT 'ALTER ' + || CASE WHEN p.proisagg THEN 'AGGREGATE ' ELSE 'FUNCTION ' END + || quote_ident(n.nspname) || '.' || quote_ident(p.proname) || '(' + || pg_catalog.pg_get_function_identity_arguments(p.oid) || ') OWNER TO frapid_db_user;' AS sql + FROM pg_catalog.pg_proc p + JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace + WHERE NOT n.nspname = ANY(ARRAY['pg_catalog', 'information_schema']) + LOOP + EXECUTE this.sql; + END LOOP; + ELSE + FOR this IN + SELECT 'ALTER ' + || CASE p.prokind WHEN 'a' THEN 'AGGREGATE ' ELSE 'FUNCTION ' END + || quote_ident(n.nspname) || '.' || quote_ident(p.proname) || '(' + || pg_catalog.pg_get_function_identity_arguments(p.oid) || ') OWNER TO frapid_db_user;' AS sql + FROM pg_catalog.pg_proc p + JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace + WHERE NOT n.nspname = ANY(ARRAY['pg_catalog', 'information_schema']) + LOOP + EXECUTE this.sql; + END LOOP; + END IF; END $$ LANGUAGE plpgsql; + DO $$ DECLARE this record; @@ -284,22 +300,37 @@ LANGUAGE plpgsql; DO $$ DECLARE this record; + DECLARE _version_number integer = current_setting('server_version_num')::integer; BEGIN IF(CURRENT_USER = 'report_user') THEN RETURN; END IF; - FOR this IN - SELECT 'GRANT EXECUTE ON ' - || CASE WHEN p.proisagg THEN 'AGGREGATE ' ELSE 'FUNCTION ' END - || quote_ident(n.nspname) || '.' || quote_ident(p.proname) || '(' - || pg_catalog.pg_get_function_identity_arguments(p.oid) || ') TO report_user;' AS sql - FROM pg_catalog.pg_proc p - JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace - WHERE NOT n.nspname = ANY(ARRAY['pg_catalog', 'information_schema']) - LOOP - EXECUTE this.sql; - END LOOP; + IF(_version_number < 110000) THEN + FOR this IN + SELECT 'GRANT EXECUTE ON ' + || CASE WHEN p.proisagg THEN 'AGGREGATE ' ELSE 'FUNCTION ' END + || quote_ident(n.nspname) || '.' || quote_ident(p.proname) || '(' + || pg_catalog.pg_get_function_identity_arguments(p.oid) || ') TO report_user;' AS sql + FROM pg_catalog.pg_proc p + JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace + WHERE NOT n.nspname = ANY(ARRAY['pg_catalog', 'information_schema']) + LOOP + EXECUTE this.sql; + END LOOP; + ELSE + FOR this IN + SELECT 'GRANT EXECUTE ON ' + || CASE p.prokind WHEN 'a' THEN 'AGGREGATE ' ELSE 'FUNCTION ' END + || quote_ident(n.nspname) || '.' || quote_ident(p.proname) || '(' + || pg_catalog.pg_get_function_identity_arguments(p.oid) || ') TO report_user;' AS sql + FROM pg_catalog.pg_proc p + JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace + WHERE NOT n.nspname = ANY(ARRAY['pg_catalog', 'information_schema']) + LOOP + EXECUTE this.sql; + END LOOP; + END IF; END $$ LANGUAGE plpgsql; diff --git a/src/Frapid.Web/Areas/Frapid.Calendar/db/PostgreSQL/2.x/2.0/src/99.ownership.sql b/src/Frapid.Web/Areas/Frapid.Calendar/db/PostgreSQL/2.x/2.0/src/99.ownership.sql index ccd67abd..c9f618ad 100644 --- a/src/Frapid.Web/Areas/Frapid.Calendar/db/PostgreSQL/2.x/2.0/src/99.ownership.sql +++ b/src/Frapid.Web/Areas/Frapid.Calendar/db/PostgreSQL/2.x/2.0/src/99.ownership.sql @@ -39,27 +39,43 @@ LANGUAGE plpgsql; DO $$ DECLARE this record; + DECLARE _version_number integer = current_setting('server_version_num')::integer; BEGIN IF(CURRENT_USER = 'frapid_db_user') THEN RETURN; END IF; - FOR this IN - SELECT 'ALTER ' - || CASE WHEN p.proisagg THEN 'AGGREGATE ' ELSE 'FUNCTION ' END - || quote_ident(n.nspname) || '.' || quote_ident(p.proname) || '(' - || pg_catalog.pg_get_function_identity_arguments(p.oid) || ') OWNER TO frapid_db_user;' AS sql - FROM pg_catalog.pg_proc p - JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace - WHERE NOT n.nspname = ANY(ARRAY['pg_catalog', 'information_schema']) - LOOP - EXECUTE this.sql; - END LOOP; + IF(_version_number < 110000) THEN + FOR this IN + SELECT 'ALTER ' + || CASE WHEN p.proisagg THEN 'AGGREGATE ' ELSE 'FUNCTION ' END + || quote_ident(n.nspname) || '.' || quote_ident(p.proname) || '(' + || pg_catalog.pg_get_function_identity_arguments(p.oid) || ') OWNER TO frapid_db_user;' AS sql + FROM pg_catalog.pg_proc p + JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace + WHERE NOT n.nspname = ANY(ARRAY['pg_catalog', 'information_schema']) + LOOP + EXECUTE this.sql; + END LOOP; + ELSE + FOR this IN + SELECT 'ALTER ' + || CASE p.prokind WHEN 'a' THEN 'AGGREGATE ' ELSE 'FUNCTION ' END + || quote_ident(n.nspname) || '.' || quote_ident(p.proname) || '(' + || pg_catalog.pg_get_function_identity_arguments(p.oid) || ') OWNER TO frapid_db_user;' AS sql + FROM pg_catalog.pg_proc p + JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace + WHERE NOT n.nspname = ANY(ARRAY['pg_catalog', 'information_schema']) + LOOP + EXECUTE this.sql; + END LOOP; + END IF; END $$ LANGUAGE plpgsql; + DO $$ DECLARE this record; @@ -166,22 +182,37 @@ LANGUAGE plpgsql; DO $$ DECLARE this record; + DECLARE _version_number integer = current_setting('server_version_num')::integer; BEGIN IF(CURRENT_USER = 'report_user') THEN RETURN; END IF; - FOR this IN - SELECT 'GRANT EXECUTE ON ' - || CASE WHEN p.proisagg THEN 'AGGREGATE ' ELSE 'FUNCTION ' END - || quote_ident(n.nspname) || '.' || quote_ident(p.proname) || '(' - || pg_catalog.pg_get_function_identity_arguments(p.oid) || ') TO report_user;' AS sql - FROM pg_catalog.pg_proc p - JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace - WHERE NOT n.nspname = ANY(ARRAY['pg_catalog', 'information_schema']) - LOOP - EXECUTE this.sql; - END LOOP; + IF(_version_number < 110000) THEN + FOR this IN + SELECT 'GRANT EXECUTE ON ' + || CASE WHEN p.proisagg THEN 'AGGREGATE ' ELSE 'FUNCTION ' END + || quote_ident(n.nspname) || '.' || quote_ident(p.proname) || '(' + || pg_catalog.pg_get_function_identity_arguments(p.oid) || ') TO report_user;' AS sql + FROM pg_catalog.pg_proc p + JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace + WHERE NOT n.nspname = ANY(ARRAY['pg_catalog', 'information_schema']) + LOOP + EXECUTE this.sql; + END LOOP; + ELSE + FOR this IN + SELECT 'GRANT EXECUTE ON ' + || CASE p.prokind WHEN 'a' THEN 'AGGREGATE ' ELSE 'FUNCTION ' END + || quote_ident(n.nspname) || '.' || quote_ident(p.proname) || '(' + || pg_catalog.pg_get_function_identity_arguments(p.oid) || ') TO report_user;' AS sql + FROM pg_catalog.pg_proc p + JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace + WHERE NOT n.nspname = ANY(ARRAY['pg_catalog', 'information_schema']) + LOOP + EXECUTE this.sql; + END LOOP; + END IF; END $$ LANGUAGE plpgsql; diff --git a/src/Frapid.Web/Areas/Frapid.Calendar/db/PostgreSQL/calendar-blank.sql b/src/Frapid.Web/Areas/Frapid.Calendar/db/PostgreSQL/calendar-blank.sql index b6f7ecf8..e15ca534 100644 --- a/src/Frapid.Web/Areas/Frapid.Calendar/db/PostgreSQL/calendar-blank.sql +++ b/src/Frapid.Web/Areas/Frapid.Calendar/db/PostgreSQL/calendar-blank.sql @@ -157,27 +157,43 @@ LANGUAGE plpgsql; DO $$ DECLARE this record; + DECLARE _version_number integer = current_setting('server_version_num')::integer; BEGIN IF(CURRENT_USER = 'frapid_db_user') THEN RETURN; END IF; - FOR this IN - SELECT 'ALTER ' - || CASE WHEN p.proisagg THEN 'AGGREGATE ' ELSE 'FUNCTION ' END - || quote_ident(n.nspname) || '.' || quote_ident(p.proname) || '(' - || pg_catalog.pg_get_function_identity_arguments(p.oid) || ') OWNER TO frapid_db_user;' AS sql - FROM pg_catalog.pg_proc p - JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace - WHERE NOT n.nspname = ANY(ARRAY['pg_catalog', 'information_schema']) - LOOP - EXECUTE this.sql; - END LOOP; + IF(_version_number < 110000) THEN + FOR this IN + SELECT 'ALTER ' + || CASE WHEN p.proisagg THEN 'AGGREGATE ' ELSE 'FUNCTION ' END + || quote_ident(n.nspname) || '.' || quote_ident(p.proname) || '(' + || pg_catalog.pg_get_function_identity_arguments(p.oid) || ') OWNER TO frapid_db_user;' AS sql + FROM pg_catalog.pg_proc p + JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace + WHERE NOT n.nspname = ANY(ARRAY['pg_catalog', 'information_schema']) + LOOP + EXECUTE this.sql; + END LOOP; + ELSE + FOR this IN + SELECT 'ALTER ' + || CASE p.prokind WHEN 'a' THEN 'AGGREGATE ' ELSE 'FUNCTION ' END + || quote_ident(n.nspname) || '.' || quote_ident(p.proname) || '(' + || pg_catalog.pg_get_function_identity_arguments(p.oid) || ') OWNER TO frapid_db_user;' AS sql + FROM pg_catalog.pg_proc p + JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace + WHERE NOT n.nspname = ANY(ARRAY['pg_catalog', 'information_schema']) + LOOP + EXECUTE this.sql; + END LOOP; + END IF; END $$ LANGUAGE plpgsql; + DO $$ DECLARE this record; @@ -284,22 +300,37 @@ LANGUAGE plpgsql; DO $$ DECLARE this record; + DECLARE _version_number integer = current_setting('server_version_num')::integer; BEGIN IF(CURRENT_USER = 'report_user') THEN RETURN; END IF; - FOR this IN - SELECT 'GRANT EXECUTE ON ' - || CASE WHEN p.proisagg THEN 'AGGREGATE ' ELSE 'FUNCTION ' END - || quote_ident(n.nspname) || '.' || quote_ident(p.proname) || '(' - || pg_catalog.pg_get_function_identity_arguments(p.oid) || ') TO report_user;' AS sql - FROM pg_catalog.pg_proc p - JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace - WHERE NOT n.nspname = ANY(ARRAY['pg_catalog', 'information_schema']) - LOOP - EXECUTE this.sql; - END LOOP; + IF(_version_number < 110000) THEN + FOR this IN + SELECT 'GRANT EXECUTE ON ' + || CASE WHEN p.proisagg THEN 'AGGREGATE ' ELSE 'FUNCTION ' END + || quote_ident(n.nspname) || '.' || quote_ident(p.proname) || '(' + || pg_catalog.pg_get_function_identity_arguments(p.oid) || ') TO report_user;' AS sql + FROM pg_catalog.pg_proc p + JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace + WHERE NOT n.nspname = ANY(ARRAY['pg_catalog', 'information_schema']) + LOOP + EXECUTE this.sql; + END LOOP; + ELSE + FOR this IN + SELECT 'GRANT EXECUTE ON ' + || CASE p.prokind WHEN 'a' THEN 'AGGREGATE ' ELSE 'FUNCTION ' END + || quote_ident(n.nspname) || '.' || quote_ident(p.proname) || '(' + || pg_catalog.pg_get_function_identity_arguments(p.oid) || ') TO report_user;' AS sql + FROM pg_catalog.pg_proc p + JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace + WHERE NOT n.nspname = ANY(ARRAY['pg_catalog', 'information_schema']) + LOOP + EXECUTE this.sql; + END LOOP; + END IF; END $$ LANGUAGE plpgsql; diff --git a/src/Frapid.Web/Areas/Frapid.Config/db/PostgreSQL/1.x/1.0/config.sql b/src/Frapid.Web/Areas/Frapid.Config/db/PostgreSQL/1.x/1.0/config.sql index b478673b..a8e6075a 100644 --- a/src/Frapid.Web/Areas/Frapid.Config/db/PostgreSQL/1.x/1.0/config.sql +++ b/src/Frapid.Web/Areas/Frapid.Config/db/PostgreSQL/1.x/1.0/config.sql @@ -582,27 +582,43 @@ LANGUAGE plpgsql; DO $$ DECLARE this record; + DECLARE _version_number integer = current_setting('server_version_num')::integer; BEGIN IF(CURRENT_USER = 'frapid_db_user') THEN RETURN; END IF; - FOR this IN - SELECT 'ALTER ' - || CASE WHEN p.proisagg THEN 'AGGREGATE ' ELSE 'FUNCTION ' END - || quote_ident(n.nspname) || '.' || quote_ident(p.proname) || '(' - || pg_catalog.pg_get_function_identity_arguments(p.oid) || ') OWNER TO frapid_db_user;' AS sql - FROM pg_catalog.pg_proc p - JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace - WHERE NOT n.nspname = ANY(ARRAY['pg_catalog', 'information_schema']) - LOOP - EXECUTE this.sql; - END LOOP; + IF(_version_number < 110000) THEN + FOR this IN + SELECT 'ALTER ' + || CASE WHEN p.proisagg THEN 'AGGREGATE ' ELSE 'FUNCTION ' END + || quote_ident(n.nspname) || '.' || quote_ident(p.proname) || '(' + || pg_catalog.pg_get_function_identity_arguments(p.oid) || ') OWNER TO frapid_db_user;' AS sql + FROM pg_catalog.pg_proc p + JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace + WHERE NOT n.nspname = ANY(ARRAY['pg_catalog', 'information_schema']) + LOOP + EXECUTE this.sql; + END LOOP; + ELSE + FOR this IN + SELECT 'ALTER ' + || CASE p.prokind WHEN 'a' THEN 'AGGREGATE ' ELSE 'FUNCTION ' END + || quote_ident(n.nspname) || '.' || quote_ident(p.proname) || '(' + || pg_catalog.pg_get_function_identity_arguments(p.oid) || ') OWNER TO frapid_db_user;' AS sql + FROM pg_catalog.pg_proc p + JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace + WHERE NOT n.nspname = ANY(ARRAY['pg_catalog', 'information_schema']) + LOOP + EXECUTE this.sql; + END LOOP; + END IF; END $$ LANGUAGE plpgsql; + DO $$ DECLARE this record; @@ -709,22 +725,37 @@ LANGUAGE plpgsql; DO $$ DECLARE this record; + DECLARE _version_number integer = current_setting('server_version_num')::integer; BEGIN IF(CURRENT_USER = 'report_user') THEN RETURN; END IF; - FOR this IN - SELECT 'GRANT EXECUTE ON ' - || CASE WHEN p.proisagg THEN 'AGGREGATE ' ELSE 'FUNCTION ' END - || quote_ident(n.nspname) || '.' || quote_ident(p.proname) || '(' - || pg_catalog.pg_get_function_identity_arguments(p.oid) || ') TO report_user;' AS sql - FROM pg_catalog.pg_proc p - JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace - WHERE NOT n.nspname = ANY(ARRAY['pg_catalog', 'information_schema']) - LOOP - EXECUTE this.sql; - END LOOP; + IF(_version_number < 110000) THEN + FOR this IN + SELECT 'GRANT EXECUTE ON ' + || CASE WHEN p.proisagg THEN 'AGGREGATE ' ELSE 'FUNCTION ' END + || quote_ident(n.nspname) || '.' || quote_ident(p.proname) || '(' + || pg_catalog.pg_get_function_identity_arguments(p.oid) || ') TO report_user;' AS sql + FROM pg_catalog.pg_proc p + JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace + WHERE NOT n.nspname = ANY(ARRAY['pg_catalog', 'information_schema']) + LOOP + EXECUTE this.sql; + END LOOP; + ELSE + FOR this IN + SELECT 'GRANT EXECUTE ON ' + || CASE p.prokind WHEN 'a' THEN 'AGGREGATE ' ELSE 'FUNCTION ' END + || quote_ident(n.nspname) || '.' || quote_ident(p.proname) || '(' + || pg_catalog.pg_get_function_identity_arguments(p.oid) || ') TO report_user;' AS sql + FROM pg_catalog.pg_proc p + JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace + WHERE NOT n.nspname = ANY(ARRAY['pg_catalog', 'information_schema']) + LOOP + EXECUTE this.sql; + END LOOP; + END IF; END $$ LANGUAGE plpgsql; diff --git a/src/Frapid.Web/Areas/Frapid.Config/db/PostgreSQL/1.x/1.0/src/99.ownership.sql b/src/Frapid.Web/Areas/Frapid.Config/db/PostgreSQL/1.x/1.0/src/99.ownership.sql index ccd67abd..c9f618ad 100644 --- a/src/Frapid.Web/Areas/Frapid.Config/db/PostgreSQL/1.x/1.0/src/99.ownership.sql +++ b/src/Frapid.Web/Areas/Frapid.Config/db/PostgreSQL/1.x/1.0/src/99.ownership.sql @@ -39,27 +39,43 @@ LANGUAGE plpgsql; DO $$ DECLARE this record; + DECLARE _version_number integer = current_setting('server_version_num')::integer; BEGIN IF(CURRENT_USER = 'frapid_db_user') THEN RETURN; END IF; - FOR this IN - SELECT 'ALTER ' - || CASE WHEN p.proisagg THEN 'AGGREGATE ' ELSE 'FUNCTION ' END - || quote_ident(n.nspname) || '.' || quote_ident(p.proname) || '(' - || pg_catalog.pg_get_function_identity_arguments(p.oid) || ') OWNER TO frapid_db_user;' AS sql - FROM pg_catalog.pg_proc p - JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace - WHERE NOT n.nspname = ANY(ARRAY['pg_catalog', 'information_schema']) - LOOP - EXECUTE this.sql; - END LOOP; + IF(_version_number < 110000) THEN + FOR this IN + SELECT 'ALTER ' + || CASE WHEN p.proisagg THEN 'AGGREGATE ' ELSE 'FUNCTION ' END + || quote_ident(n.nspname) || '.' || quote_ident(p.proname) || '(' + || pg_catalog.pg_get_function_identity_arguments(p.oid) || ') OWNER TO frapid_db_user;' AS sql + FROM pg_catalog.pg_proc p + JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace + WHERE NOT n.nspname = ANY(ARRAY['pg_catalog', 'information_schema']) + LOOP + EXECUTE this.sql; + END LOOP; + ELSE + FOR this IN + SELECT 'ALTER ' + || CASE p.prokind WHEN 'a' THEN 'AGGREGATE ' ELSE 'FUNCTION ' END + || quote_ident(n.nspname) || '.' || quote_ident(p.proname) || '(' + || pg_catalog.pg_get_function_identity_arguments(p.oid) || ') OWNER TO frapid_db_user;' AS sql + FROM pg_catalog.pg_proc p + JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace + WHERE NOT n.nspname = ANY(ARRAY['pg_catalog', 'information_schema']) + LOOP + EXECUTE this.sql; + END LOOP; + END IF; END $$ LANGUAGE plpgsql; + DO $$ DECLARE this record; @@ -166,22 +182,37 @@ LANGUAGE plpgsql; DO $$ DECLARE this record; + DECLARE _version_number integer = current_setting('server_version_num')::integer; BEGIN IF(CURRENT_USER = 'report_user') THEN RETURN; END IF; - FOR this IN - SELECT 'GRANT EXECUTE ON ' - || CASE WHEN p.proisagg THEN 'AGGREGATE ' ELSE 'FUNCTION ' END - || quote_ident(n.nspname) || '.' || quote_ident(p.proname) || '(' - || pg_catalog.pg_get_function_identity_arguments(p.oid) || ') TO report_user;' AS sql - FROM pg_catalog.pg_proc p - JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace - WHERE NOT n.nspname = ANY(ARRAY['pg_catalog', 'information_schema']) - LOOP - EXECUTE this.sql; - END LOOP; + IF(_version_number < 110000) THEN + FOR this IN + SELECT 'GRANT EXECUTE ON ' + || CASE WHEN p.proisagg THEN 'AGGREGATE ' ELSE 'FUNCTION ' END + || quote_ident(n.nspname) || '.' || quote_ident(p.proname) || '(' + || pg_catalog.pg_get_function_identity_arguments(p.oid) || ') TO report_user;' AS sql + FROM pg_catalog.pg_proc p + JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace + WHERE NOT n.nspname = ANY(ARRAY['pg_catalog', 'information_schema']) + LOOP + EXECUTE this.sql; + END LOOP; + ELSE + FOR this IN + SELECT 'GRANT EXECUTE ON ' + || CASE p.prokind WHEN 'a' THEN 'AGGREGATE ' ELSE 'FUNCTION ' END + || quote_ident(n.nspname) || '.' || quote_ident(p.proname) || '(' + || pg_catalog.pg_get_function_identity_arguments(p.oid) || ') TO report_user;' AS sql + FROM pg_catalog.pg_proc p + JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace + WHERE NOT n.nspname = ANY(ARRAY['pg_catalog', 'information_schema']) + LOOP + EXECUTE this.sql; + END LOOP; + END IF; END $$ LANGUAGE plpgsql; diff --git a/src/Frapid.Web/Areas/Frapid.Config/db/PostgreSQL/config.sql b/src/Frapid.Web/Areas/Frapid.Config/db/PostgreSQL/config.sql index b478673b..a8e6075a 100644 --- a/src/Frapid.Web/Areas/Frapid.Config/db/PostgreSQL/config.sql +++ b/src/Frapid.Web/Areas/Frapid.Config/db/PostgreSQL/config.sql @@ -582,27 +582,43 @@ LANGUAGE plpgsql; DO $$ DECLARE this record; + DECLARE _version_number integer = current_setting('server_version_num')::integer; BEGIN IF(CURRENT_USER = 'frapid_db_user') THEN RETURN; END IF; - FOR this IN - SELECT 'ALTER ' - || CASE WHEN p.proisagg THEN 'AGGREGATE ' ELSE 'FUNCTION ' END - || quote_ident(n.nspname) || '.' || quote_ident(p.proname) || '(' - || pg_catalog.pg_get_function_identity_arguments(p.oid) || ') OWNER TO frapid_db_user;' AS sql - FROM pg_catalog.pg_proc p - JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace - WHERE NOT n.nspname = ANY(ARRAY['pg_catalog', 'information_schema']) - LOOP - EXECUTE this.sql; - END LOOP; + IF(_version_number < 110000) THEN + FOR this IN + SELECT 'ALTER ' + || CASE WHEN p.proisagg THEN 'AGGREGATE ' ELSE 'FUNCTION ' END + || quote_ident(n.nspname) || '.' || quote_ident(p.proname) || '(' + || pg_catalog.pg_get_function_identity_arguments(p.oid) || ') OWNER TO frapid_db_user;' AS sql + FROM pg_catalog.pg_proc p + JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace + WHERE NOT n.nspname = ANY(ARRAY['pg_catalog', 'information_schema']) + LOOP + EXECUTE this.sql; + END LOOP; + ELSE + FOR this IN + SELECT 'ALTER ' + || CASE p.prokind WHEN 'a' THEN 'AGGREGATE ' ELSE 'FUNCTION ' END + || quote_ident(n.nspname) || '.' || quote_ident(p.proname) || '(' + || pg_catalog.pg_get_function_identity_arguments(p.oid) || ') OWNER TO frapid_db_user;' AS sql + FROM pg_catalog.pg_proc p + JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace + WHERE NOT n.nspname = ANY(ARRAY['pg_catalog', 'information_schema']) + LOOP + EXECUTE this.sql; + END LOOP; + END IF; END $$ LANGUAGE plpgsql; + DO $$ DECLARE this record; @@ -709,22 +725,37 @@ LANGUAGE plpgsql; DO $$ DECLARE this record; + DECLARE _version_number integer = current_setting('server_version_num')::integer; BEGIN IF(CURRENT_USER = 'report_user') THEN RETURN; END IF; - FOR this IN - SELECT 'GRANT EXECUTE ON ' - || CASE WHEN p.proisagg THEN 'AGGREGATE ' ELSE 'FUNCTION ' END - || quote_ident(n.nspname) || '.' || quote_ident(p.proname) || '(' - || pg_catalog.pg_get_function_identity_arguments(p.oid) || ') TO report_user;' AS sql - FROM pg_catalog.pg_proc p - JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace - WHERE NOT n.nspname = ANY(ARRAY['pg_catalog', 'information_schema']) - LOOP - EXECUTE this.sql; - END LOOP; + IF(_version_number < 110000) THEN + FOR this IN + SELECT 'GRANT EXECUTE ON ' + || CASE WHEN p.proisagg THEN 'AGGREGATE ' ELSE 'FUNCTION ' END + || quote_ident(n.nspname) || '.' || quote_ident(p.proname) || '(' + || pg_catalog.pg_get_function_identity_arguments(p.oid) || ') TO report_user;' AS sql + FROM pg_catalog.pg_proc p + JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace + WHERE NOT n.nspname = ANY(ARRAY['pg_catalog', 'information_schema']) + LOOP + EXECUTE this.sql; + END LOOP; + ELSE + FOR this IN + SELECT 'GRANT EXECUTE ON ' + || CASE p.prokind WHEN 'a' THEN 'AGGREGATE ' ELSE 'FUNCTION ' END + || quote_ident(n.nspname) || '.' || quote_ident(p.proname) || '(' + || pg_catalog.pg_get_function_identity_arguments(p.oid) || ') TO report_user;' AS sql + FROM pg_catalog.pg_proc p + JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace + WHERE NOT n.nspname = ANY(ARRAY['pg_catalog', 'information_schema']) + LOOP + EXECUTE this.sql; + END LOOP; + END IF; END $$ LANGUAGE plpgsql; diff --git a/src/Frapid.Web/Areas/Frapid.SchemaUpdater/db/PostgreSQL/1.x/1.0/src/99.ownership.sql b/src/Frapid.Web/Areas/Frapid.SchemaUpdater/db/PostgreSQL/1.x/1.0/src/99.ownership.sql index ccd67abd..c9f618ad 100644 --- a/src/Frapid.Web/Areas/Frapid.SchemaUpdater/db/PostgreSQL/1.x/1.0/src/99.ownership.sql +++ b/src/Frapid.Web/Areas/Frapid.SchemaUpdater/db/PostgreSQL/1.x/1.0/src/99.ownership.sql @@ -39,27 +39,43 @@ LANGUAGE plpgsql; DO $$ DECLARE this record; + DECLARE _version_number integer = current_setting('server_version_num')::integer; BEGIN IF(CURRENT_USER = 'frapid_db_user') THEN RETURN; END IF; - FOR this IN - SELECT 'ALTER ' - || CASE WHEN p.proisagg THEN 'AGGREGATE ' ELSE 'FUNCTION ' END - || quote_ident(n.nspname) || '.' || quote_ident(p.proname) || '(' - || pg_catalog.pg_get_function_identity_arguments(p.oid) || ') OWNER TO frapid_db_user;' AS sql - FROM pg_catalog.pg_proc p - JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace - WHERE NOT n.nspname = ANY(ARRAY['pg_catalog', 'information_schema']) - LOOP - EXECUTE this.sql; - END LOOP; + IF(_version_number < 110000) THEN + FOR this IN + SELECT 'ALTER ' + || CASE WHEN p.proisagg THEN 'AGGREGATE ' ELSE 'FUNCTION ' END + || quote_ident(n.nspname) || '.' || quote_ident(p.proname) || '(' + || pg_catalog.pg_get_function_identity_arguments(p.oid) || ') OWNER TO frapid_db_user;' AS sql + FROM pg_catalog.pg_proc p + JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace + WHERE NOT n.nspname = ANY(ARRAY['pg_catalog', 'information_schema']) + LOOP + EXECUTE this.sql; + END LOOP; + ELSE + FOR this IN + SELECT 'ALTER ' + || CASE p.prokind WHEN 'a' THEN 'AGGREGATE ' ELSE 'FUNCTION ' END + || quote_ident(n.nspname) || '.' || quote_ident(p.proname) || '(' + || pg_catalog.pg_get_function_identity_arguments(p.oid) || ') OWNER TO frapid_db_user;' AS sql + FROM pg_catalog.pg_proc p + JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace + WHERE NOT n.nspname = ANY(ARRAY['pg_catalog', 'information_schema']) + LOOP + EXECUTE this.sql; + END LOOP; + END IF; END $$ LANGUAGE plpgsql; + DO $$ DECLARE this record; @@ -166,22 +182,37 @@ LANGUAGE plpgsql; DO $$ DECLARE this record; + DECLARE _version_number integer = current_setting('server_version_num')::integer; BEGIN IF(CURRENT_USER = 'report_user') THEN RETURN; END IF; - FOR this IN - SELECT 'GRANT EXECUTE ON ' - || CASE WHEN p.proisagg THEN 'AGGREGATE ' ELSE 'FUNCTION ' END - || quote_ident(n.nspname) || '.' || quote_ident(p.proname) || '(' - || pg_catalog.pg_get_function_identity_arguments(p.oid) || ') TO report_user;' AS sql - FROM pg_catalog.pg_proc p - JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace - WHERE NOT n.nspname = ANY(ARRAY['pg_catalog', 'information_schema']) - LOOP - EXECUTE this.sql; - END LOOP; + IF(_version_number < 110000) THEN + FOR this IN + SELECT 'GRANT EXECUTE ON ' + || CASE WHEN p.proisagg THEN 'AGGREGATE ' ELSE 'FUNCTION ' END + || quote_ident(n.nspname) || '.' || quote_ident(p.proname) || '(' + || pg_catalog.pg_get_function_identity_arguments(p.oid) || ') TO report_user;' AS sql + FROM pg_catalog.pg_proc p + JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace + WHERE NOT n.nspname = ANY(ARRAY['pg_catalog', 'information_schema']) + LOOP + EXECUTE this.sql; + END LOOP; + ELSE + FOR this IN + SELECT 'GRANT EXECUTE ON ' + || CASE p.prokind WHEN 'a' THEN 'AGGREGATE ' ELSE 'FUNCTION ' END + || quote_ident(n.nspname) || '.' || quote_ident(p.proname) || '(' + || pg_catalog.pg_get_function_identity_arguments(p.oid) || ') TO report_user;' AS sql + FROM pg_catalog.pg_proc p + JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace + WHERE NOT n.nspname = ANY(ARRAY['pg_catalog', 'information_schema']) + LOOP + EXECUTE this.sql; + END LOOP; + END IF; END $$ LANGUAGE plpgsql; diff --git a/src/Frapid.Web/Areas/Frapid.SchemaUpdater/db/PostgreSQL/1.x/1.0/updater.sql b/src/Frapid.Web/Areas/Frapid.SchemaUpdater/db/PostgreSQL/1.x/1.0/updater.sql index 0fce2fdc..44f9bfb4 100644 --- a/src/Frapid.Web/Areas/Frapid.SchemaUpdater/db/PostgreSQL/1.x/1.0/updater.sql +++ b/src/Frapid.Web/Areas/Frapid.SchemaUpdater/db/PostgreSQL/1.x/1.0/updater.sql @@ -52,27 +52,43 @@ LANGUAGE plpgsql; DO $$ DECLARE this record; + DECLARE _version_number integer = current_setting('server_version_num')::integer; BEGIN IF(CURRENT_USER = 'frapid_db_user') THEN RETURN; END IF; - FOR this IN - SELECT 'ALTER ' - || CASE WHEN p.proisagg THEN 'AGGREGATE ' ELSE 'FUNCTION ' END - || quote_ident(n.nspname) || '.' || quote_ident(p.proname) || '(' - || pg_catalog.pg_get_function_identity_arguments(p.oid) || ') OWNER TO frapid_db_user;' AS sql - FROM pg_catalog.pg_proc p - JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace - WHERE NOT n.nspname = ANY(ARRAY['pg_catalog', 'information_schema']) - LOOP - EXECUTE this.sql; - END LOOP; + IF(_version_number < 110000) THEN + FOR this IN + SELECT 'ALTER ' + || CASE WHEN p.proisagg THEN 'AGGREGATE ' ELSE 'FUNCTION ' END + || quote_ident(n.nspname) || '.' || quote_ident(p.proname) || '(' + || pg_catalog.pg_get_function_identity_arguments(p.oid) || ') OWNER TO frapid_db_user;' AS sql + FROM pg_catalog.pg_proc p + JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace + WHERE NOT n.nspname = ANY(ARRAY['pg_catalog', 'information_schema']) + LOOP + EXECUTE this.sql; + END LOOP; + ELSE + FOR this IN + SELECT 'ALTER ' + || CASE p.prokind WHEN 'a' THEN 'AGGREGATE ' ELSE 'FUNCTION ' END + || quote_ident(n.nspname) || '.' || quote_ident(p.proname) || '(' + || pg_catalog.pg_get_function_identity_arguments(p.oid) || ') OWNER TO frapid_db_user;' AS sql + FROM pg_catalog.pg_proc p + JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace + WHERE NOT n.nspname = ANY(ARRAY['pg_catalog', 'information_schema']) + LOOP + EXECUTE this.sql; + END LOOP; + END IF; END $$ LANGUAGE plpgsql; + DO $$ DECLARE this record; @@ -179,22 +195,37 @@ LANGUAGE plpgsql; DO $$ DECLARE this record; + DECLARE _version_number integer = current_setting('server_version_num')::integer; BEGIN IF(CURRENT_USER = 'report_user') THEN RETURN; END IF; - FOR this IN - SELECT 'GRANT EXECUTE ON ' - || CASE WHEN p.proisagg THEN 'AGGREGATE ' ELSE 'FUNCTION ' END - || quote_ident(n.nspname) || '.' || quote_ident(p.proname) || '(' - || pg_catalog.pg_get_function_identity_arguments(p.oid) || ') TO report_user;' AS sql - FROM pg_catalog.pg_proc p - JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace - WHERE NOT n.nspname = ANY(ARRAY['pg_catalog', 'information_schema']) - LOOP - EXECUTE this.sql; - END LOOP; + IF(_version_number < 110000) THEN + FOR this IN + SELECT 'GRANT EXECUTE ON ' + || CASE WHEN p.proisagg THEN 'AGGREGATE ' ELSE 'FUNCTION ' END + || quote_ident(n.nspname) || '.' || quote_ident(p.proname) || '(' + || pg_catalog.pg_get_function_identity_arguments(p.oid) || ') TO report_user;' AS sql + FROM pg_catalog.pg_proc p + JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace + WHERE NOT n.nspname = ANY(ARRAY['pg_catalog', 'information_schema']) + LOOP + EXECUTE this.sql; + END LOOP; + ELSE + FOR this IN + SELECT 'GRANT EXECUTE ON ' + || CASE p.prokind WHEN 'a' THEN 'AGGREGATE ' ELSE 'FUNCTION ' END + || quote_ident(n.nspname) || '.' || quote_ident(p.proname) || '(' + || pg_catalog.pg_get_function_identity_arguments(p.oid) || ') TO report_user;' AS sql + FROM pg_catalog.pg_proc p + JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace + WHERE NOT n.nspname = ANY(ARRAY['pg_catalog', 'information_schema']) + LOOP + EXECUTE this.sql; + END LOOP; + END IF; END $$ LANGUAGE plpgsql; diff --git a/src/Frapid.Web/Areas/Frapid.SchemaUpdater/db/PostgreSQL/updater.sql b/src/Frapid.Web/Areas/Frapid.SchemaUpdater/db/PostgreSQL/updater.sql index 0fce2fdc..44f9bfb4 100644 --- a/src/Frapid.Web/Areas/Frapid.SchemaUpdater/db/PostgreSQL/updater.sql +++ b/src/Frapid.Web/Areas/Frapid.SchemaUpdater/db/PostgreSQL/updater.sql @@ -52,27 +52,43 @@ LANGUAGE plpgsql; DO $$ DECLARE this record; + DECLARE _version_number integer = current_setting('server_version_num')::integer; BEGIN IF(CURRENT_USER = 'frapid_db_user') THEN RETURN; END IF; - FOR this IN - SELECT 'ALTER ' - || CASE WHEN p.proisagg THEN 'AGGREGATE ' ELSE 'FUNCTION ' END - || quote_ident(n.nspname) || '.' || quote_ident(p.proname) || '(' - || pg_catalog.pg_get_function_identity_arguments(p.oid) || ') OWNER TO frapid_db_user;' AS sql - FROM pg_catalog.pg_proc p - JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace - WHERE NOT n.nspname = ANY(ARRAY['pg_catalog', 'information_schema']) - LOOP - EXECUTE this.sql; - END LOOP; + IF(_version_number < 110000) THEN + FOR this IN + SELECT 'ALTER ' + || CASE WHEN p.proisagg THEN 'AGGREGATE ' ELSE 'FUNCTION ' END + || quote_ident(n.nspname) || '.' || quote_ident(p.proname) || '(' + || pg_catalog.pg_get_function_identity_arguments(p.oid) || ') OWNER TO frapid_db_user;' AS sql + FROM pg_catalog.pg_proc p + JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace + WHERE NOT n.nspname = ANY(ARRAY['pg_catalog', 'information_schema']) + LOOP + EXECUTE this.sql; + END LOOP; + ELSE + FOR this IN + SELECT 'ALTER ' + || CASE p.prokind WHEN 'a' THEN 'AGGREGATE ' ELSE 'FUNCTION ' END + || quote_ident(n.nspname) || '.' || quote_ident(p.proname) || '(' + || pg_catalog.pg_get_function_identity_arguments(p.oid) || ') OWNER TO frapid_db_user;' AS sql + FROM pg_catalog.pg_proc p + JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace + WHERE NOT n.nspname = ANY(ARRAY['pg_catalog', 'information_schema']) + LOOP + EXECUTE this.sql; + END LOOP; + END IF; END $$ LANGUAGE plpgsql; + DO $$ DECLARE this record; @@ -179,22 +195,37 @@ LANGUAGE plpgsql; DO $$ DECLARE this record; + DECLARE _version_number integer = current_setting('server_version_num')::integer; BEGIN IF(CURRENT_USER = 'report_user') THEN RETURN; END IF; - FOR this IN - SELECT 'GRANT EXECUTE ON ' - || CASE WHEN p.proisagg THEN 'AGGREGATE ' ELSE 'FUNCTION ' END - || quote_ident(n.nspname) || '.' || quote_ident(p.proname) || '(' - || pg_catalog.pg_get_function_identity_arguments(p.oid) || ') TO report_user;' AS sql - FROM pg_catalog.pg_proc p - JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace - WHERE NOT n.nspname = ANY(ARRAY['pg_catalog', 'information_schema']) - LOOP - EXECUTE this.sql; - END LOOP; + IF(_version_number < 110000) THEN + FOR this IN + SELECT 'GRANT EXECUTE ON ' + || CASE WHEN p.proisagg THEN 'AGGREGATE ' ELSE 'FUNCTION ' END + || quote_ident(n.nspname) || '.' || quote_ident(p.proname) || '(' + || pg_catalog.pg_get_function_identity_arguments(p.oid) || ') TO report_user;' AS sql + FROM pg_catalog.pg_proc p + JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace + WHERE NOT n.nspname = ANY(ARRAY['pg_catalog', 'information_schema']) + LOOP + EXECUTE this.sql; + END LOOP; + ELSE + FOR this IN + SELECT 'GRANT EXECUTE ON ' + || CASE p.prokind WHEN 'a' THEN 'AGGREGATE ' ELSE 'FUNCTION ' END + || quote_ident(n.nspname) || '.' || quote_ident(p.proname) || '(' + || pg_catalog.pg_get_function_identity_arguments(p.oid) || ') TO report_user;' AS sql + FROM pg_catalog.pg_proc p + JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace + WHERE NOT n.nspname = ANY(ARRAY['pg_catalog', 'information_schema']) + LOOP + EXECUTE this.sql; + END LOOP; + END IF; END $$ LANGUAGE plpgsql; diff --git a/src/Frapid.Web/Areas/Frapid.WebsiteBuilder/db/PostgreSQL/1.x/1.0/src/99.ownership.sql b/src/Frapid.Web/Areas/Frapid.WebsiteBuilder/db/PostgreSQL/1.x/1.0/src/99.ownership.sql index ccd67abd..c9f618ad 100644 --- a/src/Frapid.Web/Areas/Frapid.WebsiteBuilder/db/PostgreSQL/1.x/1.0/src/99.ownership.sql +++ b/src/Frapid.Web/Areas/Frapid.WebsiteBuilder/db/PostgreSQL/1.x/1.0/src/99.ownership.sql @@ -39,27 +39,43 @@ LANGUAGE plpgsql; DO $$ DECLARE this record; + DECLARE _version_number integer = current_setting('server_version_num')::integer; BEGIN IF(CURRENT_USER = 'frapid_db_user') THEN RETURN; END IF; - FOR this IN - SELECT 'ALTER ' - || CASE WHEN p.proisagg THEN 'AGGREGATE ' ELSE 'FUNCTION ' END - || quote_ident(n.nspname) || '.' || quote_ident(p.proname) || '(' - || pg_catalog.pg_get_function_identity_arguments(p.oid) || ') OWNER TO frapid_db_user;' AS sql - FROM pg_catalog.pg_proc p - JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace - WHERE NOT n.nspname = ANY(ARRAY['pg_catalog', 'information_schema']) - LOOP - EXECUTE this.sql; - END LOOP; + IF(_version_number < 110000) THEN + FOR this IN + SELECT 'ALTER ' + || CASE WHEN p.proisagg THEN 'AGGREGATE ' ELSE 'FUNCTION ' END + || quote_ident(n.nspname) || '.' || quote_ident(p.proname) || '(' + || pg_catalog.pg_get_function_identity_arguments(p.oid) || ') OWNER TO frapid_db_user;' AS sql + FROM pg_catalog.pg_proc p + JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace + WHERE NOT n.nspname = ANY(ARRAY['pg_catalog', 'information_schema']) + LOOP + EXECUTE this.sql; + END LOOP; + ELSE + FOR this IN + SELECT 'ALTER ' + || CASE p.prokind WHEN 'a' THEN 'AGGREGATE ' ELSE 'FUNCTION ' END + || quote_ident(n.nspname) || '.' || quote_ident(p.proname) || '(' + || pg_catalog.pg_get_function_identity_arguments(p.oid) || ') OWNER TO frapid_db_user;' AS sql + FROM pg_catalog.pg_proc p + JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace + WHERE NOT n.nspname = ANY(ARRAY['pg_catalog', 'information_schema']) + LOOP + EXECUTE this.sql; + END LOOP; + END IF; END $$ LANGUAGE plpgsql; + DO $$ DECLARE this record; @@ -166,22 +182,37 @@ LANGUAGE plpgsql; DO $$ DECLARE this record; + DECLARE _version_number integer = current_setting('server_version_num')::integer; BEGIN IF(CURRENT_USER = 'report_user') THEN RETURN; END IF; - FOR this IN - SELECT 'GRANT EXECUTE ON ' - || CASE WHEN p.proisagg THEN 'AGGREGATE ' ELSE 'FUNCTION ' END - || quote_ident(n.nspname) || '.' || quote_ident(p.proname) || '(' - || pg_catalog.pg_get_function_identity_arguments(p.oid) || ') TO report_user;' AS sql - FROM pg_catalog.pg_proc p - JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace - WHERE NOT n.nspname = ANY(ARRAY['pg_catalog', 'information_schema']) - LOOP - EXECUTE this.sql; - END LOOP; + IF(_version_number < 110000) THEN + FOR this IN + SELECT 'GRANT EXECUTE ON ' + || CASE WHEN p.proisagg THEN 'AGGREGATE ' ELSE 'FUNCTION ' END + || quote_ident(n.nspname) || '.' || quote_ident(p.proname) || '(' + || pg_catalog.pg_get_function_identity_arguments(p.oid) || ') TO report_user;' AS sql + FROM pg_catalog.pg_proc p + JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace + WHERE NOT n.nspname = ANY(ARRAY['pg_catalog', 'information_schema']) + LOOP + EXECUTE this.sql; + END LOOP; + ELSE + FOR this IN + SELECT 'GRANT EXECUTE ON ' + || CASE p.prokind WHEN 'a' THEN 'AGGREGATE ' ELSE 'FUNCTION ' END + || quote_ident(n.nspname) || '.' || quote_ident(p.proname) || '(' + || pg_catalog.pg_get_function_identity_arguments(p.oid) || ') TO report_user;' AS sql + FROM pg_catalog.pg_proc p + JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace + WHERE NOT n.nspname = ANY(ARRAY['pg_catalog', 'information_schema']) + LOOP + EXECUTE this.sql; + END LOOP; + END IF; END $$ LANGUAGE plpgsql; diff --git a/src/Frapid.Web/Areas/Frapid.WebsiteBuilder/db/PostgreSQL/1.x/1.0/website-blank.sql b/src/Frapid.Web/Areas/Frapid.WebsiteBuilder/db/PostgreSQL/1.x/1.0/website-blank.sql index d2686b4e..b779418c 100644 --- a/src/Frapid.Web/Areas/Frapid.WebsiteBuilder/db/PostgreSQL/1.x/1.0/website-blank.sql +++ b/src/Frapid.Web/Areas/Frapid.WebsiteBuilder/db/PostgreSQL/1.x/1.0/website-blank.sql @@ -649,27 +649,43 @@ LANGUAGE plpgsql; DO $$ DECLARE this record; + DECLARE _version_number integer = current_setting('server_version_num')::integer; BEGIN IF(CURRENT_USER = 'frapid_db_user') THEN RETURN; END IF; - FOR this IN - SELECT 'ALTER ' - || CASE WHEN p.proisagg THEN 'AGGREGATE ' ELSE 'FUNCTION ' END - || quote_ident(n.nspname) || '.' || quote_ident(p.proname) || '(' - || pg_catalog.pg_get_function_identity_arguments(p.oid) || ') OWNER TO frapid_db_user;' AS sql - FROM pg_catalog.pg_proc p - JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace - WHERE NOT n.nspname = ANY(ARRAY['pg_catalog', 'information_schema']) - LOOP - EXECUTE this.sql; - END LOOP; + IF(_version_number < 110000) THEN + FOR this IN + SELECT 'ALTER ' + || CASE WHEN p.proisagg THEN 'AGGREGATE ' ELSE 'FUNCTION ' END + || quote_ident(n.nspname) || '.' || quote_ident(p.proname) || '(' + || pg_catalog.pg_get_function_identity_arguments(p.oid) || ') OWNER TO frapid_db_user;' AS sql + FROM pg_catalog.pg_proc p + JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace + WHERE NOT n.nspname = ANY(ARRAY['pg_catalog', 'information_schema']) + LOOP + EXECUTE this.sql; + END LOOP; + ELSE + FOR this IN + SELECT 'ALTER ' + || CASE p.prokind WHEN 'a' THEN 'AGGREGATE ' ELSE 'FUNCTION ' END + || quote_ident(n.nspname) || '.' || quote_ident(p.proname) || '(' + || pg_catalog.pg_get_function_identity_arguments(p.oid) || ') OWNER TO frapid_db_user;' AS sql + FROM pg_catalog.pg_proc p + JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace + WHERE NOT n.nspname = ANY(ARRAY['pg_catalog', 'information_schema']) + LOOP + EXECUTE this.sql; + END LOOP; + END IF; END $$ LANGUAGE plpgsql; + DO $$ DECLARE this record; @@ -776,22 +792,37 @@ LANGUAGE plpgsql; DO $$ DECLARE this record; + DECLARE _version_number integer = current_setting('server_version_num')::integer; BEGIN IF(CURRENT_USER = 'report_user') THEN RETURN; END IF; - FOR this IN - SELECT 'GRANT EXECUTE ON ' - || CASE WHEN p.proisagg THEN 'AGGREGATE ' ELSE 'FUNCTION ' END - || quote_ident(n.nspname) || '.' || quote_ident(p.proname) || '(' - || pg_catalog.pg_get_function_identity_arguments(p.oid) || ') TO report_user;' AS sql - FROM pg_catalog.pg_proc p - JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace - WHERE NOT n.nspname = ANY(ARRAY['pg_catalog', 'information_schema']) - LOOP - EXECUTE this.sql; - END LOOP; + IF(_version_number < 110000) THEN + FOR this IN + SELECT 'GRANT EXECUTE ON ' + || CASE WHEN p.proisagg THEN 'AGGREGATE ' ELSE 'FUNCTION ' END + || quote_ident(n.nspname) || '.' || quote_ident(p.proname) || '(' + || pg_catalog.pg_get_function_identity_arguments(p.oid) || ') TO report_user;' AS sql + FROM pg_catalog.pg_proc p + JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace + WHERE NOT n.nspname = ANY(ARRAY['pg_catalog', 'information_schema']) + LOOP + EXECUTE this.sql; + END LOOP; + ELSE + FOR this IN + SELECT 'GRANT EXECUTE ON ' + || CASE p.prokind WHEN 'a' THEN 'AGGREGATE ' ELSE 'FUNCTION ' END + || quote_ident(n.nspname) || '.' || quote_ident(p.proname) || '(' + || pg_catalog.pg_get_function_identity_arguments(p.oid) || ') TO report_user;' AS sql + FROM pg_catalog.pg_proc p + JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace + WHERE NOT n.nspname = ANY(ARRAY['pg_catalog', 'information_schema']) + LOOP + EXECUTE this.sql; + END LOOP; + END IF; END $$ LANGUAGE plpgsql; diff --git a/src/Frapid.Web/Areas/Frapid.WebsiteBuilder/db/PostgreSQL/website-blank.sql b/src/Frapid.Web/Areas/Frapid.WebsiteBuilder/db/PostgreSQL/website-blank.sql index d2686b4e..b779418c 100644 --- a/src/Frapid.Web/Areas/Frapid.WebsiteBuilder/db/PostgreSQL/website-blank.sql +++ b/src/Frapid.Web/Areas/Frapid.WebsiteBuilder/db/PostgreSQL/website-blank.sql @@ -649,27 +649,43 @@ LANGUAGE plpgsql; DO $$ DECLARE this record; + DECLARE _version_number integer = current_setting('server_version_num')::integer; BEGIN IF(CURRENT_USER = 'frapid_db_user') THEN RETURN; END IF; - FOR this IN - SELECT 'ALTER ' - || CASE WHEN p.proisagg THEN 'AGGREGATE ' ELSE 'FUNCTION ' END - || quote_ident(n.nspname) || '.' || quote_ident(p.proname) || '(' - || pg_catalog.pg_get_function_identity_arguments(p.oid) || ') OWNER TO frapid_db_user;' AS sql - FROM pg_catalog.pg_proc p - JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace - WHERE NOT n.nspname = ANY(ARRAY['pg_catalog', 'information_schema']) - LOOP - EXECUTE this.sql; - END LOOP; + IF(_version_number < 110000) THEN + FOR this IN + SELECT 'ALTER ' + || CASE WHEN p.proisagg THEN 'AGGREGATE ' ELSE 'FUNCTION ' END + || quote_ident(n.nspname) || '.' || quote_ident(p.proname) || '(' + || pg_catalog.pg_get_function_identity_arguments(p.oid) || ') OWNER TO frapid_db_user;' AS sql + FROM pg_catalog.pg_proc p + JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace + WHERE NOT n.nspname = ANY(ARRAY['pg_catalog', 'information_schema']) + LOOP + EXECUTE this.sql; + END LOOP; + ELSE + FOR this IN + SELECT 'ALTER ' + || CASE p.prokind WHEN 'a' THEN 'AGGREGATE ' ELSE 'FUNCTION ' END + || quote_ident(n.nspname) || '.' || quote_ident(p.proname) || '(' + || pg_catalog.pg_get_function_identity_arguments(p.oid) || ') OWNER TO frapid_db_user;' AS sql + FROM pg_catalog.pg_proc p + JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace + WHERE NOT n.nspname = ANY(ARRAY['pg_catalog', 'information_schema']) + LOOP + EXECUTE this.sql; + END LOOP; + END IF; END $$ LANGUAGE plpgsql; + DO $$ DECLARE this record; @@ -776,22 +792,37 @@ LANGUAGE plpgsql; DO $$ DECLARE this record; + DECLARE _version_number integer = current_setting('server_version_num')::integer; BEGIN IF(CURRENT_USER = 'report_user') THEN RETURN; END IF; - FOR this IN - SELECT 'GRANT EXECUTE ON ' - || CASE WHEN p.proisagg THEN 'AGGREGATE ' ELSE 'FUNCTION ' END - || quote_ident(n.nspname) || '.' || quote_ident(p.proname) || '(' - || pg_catalog.pg_get_function_identity_arguments(p.oid) || ') TO report_user;' AS sql - FROM pg_catalog.pg_proc p - JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace - WHERE NOT n.nspname = ANY(ARRAY['pg_catalog', 'information_schema']) - LOOP - EXECUTE this.sql; - END LOOP; + IF(_version_number < 110000) THEN + FOR this IN + SELECT 'GRANT EXECUTE ON ' + || CASE WHEN p.proisagg THEN 'AGGREGATE ' ELSE 'FUNCTION ' END + || quote_ident(n.nspname) || '.' || quote_ident(p.proname) || '(' + || pg_catalog.pg_get_function_identity_arguments(p.oid) || ') TO report_user;' AS sql + FROM pg_catalog.pg_proc p + JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace + WHERE NOT n.nspname = ANY(ARRAY['pg_catalog', 'information_schema']) + LOOP + EXECUTE this.sql; + END LOOP; + ELSE + FOR this IN + SELECT 'GRANT EXECUTE ON ' + || CASE p.prokind WHEN 'a' THEN 'AGGREGATE ' ELSE 'FUNCTION ' END + || quote_ident(n.nspname) || '.' || quote_ident(p.proname) || '(' + || pg_catalog.pg_get_function_identity_arguments(p.oid) || ') TO report_user;' AS sql + FROM pg_catalog.pg_proc p + JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace + WHERE NOT n.nspname = ANY(ARRAY['pg_catalog', 'information_schema']) + LOOP + EXECUTE this.sql; + END LOOP; + END IF; END $$ LANGUAGE plpgsql; diff --git a/src/Frapid.Web/Areas/MixERP.Social/db/PostgreSQL/2.x/2.0/social-blank.sql b/src/Frapid.Web/Areas/MixERP.Social/db/PostgreSQL/2.x/2.0/social-blank.sql index cb76d2ca..a73a6c63 100644 --- a/src/Frapid.Web/Areas/MixERP.Social/db/PostgreSQL/2.x/2.0/social-blank.sql +++ b/src/Frapid.Web/Areas/MixERP.Social/db/PostgreSQL/2.x/2.0/social-blank.sql @@ -518,27 +518,43 @@ LANGUAGE plpgsql; DO $$ DECLARE this record; + DECLARE _version_number integer = current_setting('server_version_num')::integer; BEGIN IF(CURRENT_USER = 'frapid_db_user') THEN RETURN; END IF; - FOR this IN - SELECT 'ALTER ' - || CASE WHEN p.proisagg THEN 'AGGREGATE ' ELSE 'FUNCTION ' END - || quote_ident(n.nspname) || '.' || quote_ident(p.proname) || '(' - || pg_catalog.pg_get_function_identity_arguments(p.oid) || ') OWNER TO frapid_db_user;' AS sql - FROM pg_catalog.pg_proc p - JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace - WHERE NOT n.nspname = ANY(ARRAY['pg_catalog', 'information_schema']) - LOOP - EXECUTE this.sql; - END LOOP; + IF(_version_number < 110000) THEN + FOR this IN + SELECT 'ALTER ' + || CASE WHEN p.proisagg THEN 'AGGREGATE ' ELSE 'FUNCTION ' END + || quote_ident(n.nspname) || '.' || quote_ident(p.proname) || '(' + || pg_catalog.pg_get_function_identity_arguments(p.oid) || ') OWNER TO frapid_db_user;' AS sql + FROM pg_catalog.pg_proc p + JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace + WHERE NOT n.nspname = ANY(ARRAY['pg_catalog', 'information_schema']) + LOOP + EXECUTE this.sql; + END LOOP; + ELSE + FOR this IN + SELECT 'ALTER ' + || CASE p.prokind WHEN 'a' THEN 'AGGREGATE ' ELSE 'FUNCTION ' END + || quote_ident(n.nspname) || '.' || quote_ident(p.proname) || '(' + || pg_catalog.pg_get_function_identity_arguments(p.oid) || ') OWNER TO frapid_db_user;' AS sql + FROM pg_catalog.pg_proc p + JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace + WHERE NOT n.nspname = ANY(ARRAY['pg_catalog', 'information_schema']) + LOOP + EXECUTE this.sql; + END LOOP; + END IF; END $$ LANGUAGE plpgsql; + DO $$ DECLARE this record; @@ -645,22 +661,37 @@ LANGUAGE plpgsql; DO $$ DECLARE this record; + DECLARE _version_number integer = current_setting('server_version_num')::integer; BEGIN IF(CURRENT_USER = 'report_user') THEN RETURN; END IF; - FOR this IN - SELECT 'GRANT EXECUTE ON ' - || CASE WHEN p.proisagg THEN 'AGGREGATE ' ELSE 'FUNCTION ' END - || quote_ident(n.nspname) || '.' || quote_ident(p.proname) || '(' - || pg_catalog.pg_get_function_identity_arguments(p.oid) || ') TO report_user;' AS sql - FROM pg_catalog.pg_proc p - JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace - WHERE NOT n.nspname = ANY(ARRAY['pg_catalog', 'information_schema']) - LOOP - EXECUTE this.sql; - END LOOP; + IF(_version_number < 110000) THEN + FOR this IN + SELECT 'GRANT EXECUTE ON ' + || CASE WHEN p.proisagg THEN 'AGGREGATE ' ELSE 'FUNCTION ' END + || quote_ident(n.nspname) || '.' || quote_ident(p.proname) || '(' + || pg_catalog.pg_get_function_identity_arguments(p.oid) || ') TO report_user;' AS sql + FROM pg_catalog.pg_proc p + JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace + WHERE NOT n.nspname = ANY(ARRAY['pg_catalog', 'information_schema']) + LOOP + EXECUTE this.sql; + END LOOP; + ELSE + FOR this IN + SELECT 'GRANT EXECUTE ON ' + || CASE p.prokind WHEN 'a' THEN 'AGGREGATE ' ELSE 'FUNCTION ' END + || quote_ident(n.nspname) || '.' || quote_ident(p.proname) || '(' + || pg_catalog.pg_get_function_identity_arguments(p.oid) || ') TO report_user;' AS sql + FROM pg_catalog.pg_proc p + JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace + WHERE NOT n.nspname = ANY(ARRAY['pg_catalog', 'information_schema']) + LOOP + EXECUTE this.sql; + END LOOP; + END IF; END $$ LANGUAGE plpgsql; diff --git a/src/Frapid.Web/Areas/MixERP.Social/db/PostgreSQL/2.x/2.0/src/99.ownership.sql b/src/Frapid.Web/Areas/MixERP.Social/db/PostgreSQL/2.x/2.0/src/99.ownership.sql index ccd67abd..c9f618ad 100644 --- a/src/Frapid.Web/Areas/MixERP.Social/db/PostgreSQL/2.x/2.0/src/99.ownership.sql +++ b/src/Frapid.Web/Areas/MixERP.Social/db/PostgreSQL/2.x/2.0/src/99.ownership.sql @@ -39,27 +39,43 @@ LANGUAGE plpgsql; DO $$ DECLARE this record; + DECLARE _version_number integer = current_setting('server_version_num')::integer; BEGIN IF(CURRENT_USER = 'frapid_db_user') THEN RETURN; END IF; - FOR this IN - SELECT 'ALTER ' - || CASE WHEN p.proisagg THEN 'AGGREGATE ' ELSE 'FUNCTION ' END - || quote_ident(n.nspname) || '.' || quote_ident(p.proname) || '(' - || pg_catalog.pg_get_function_identity_arguments(p.oid) || ') OWNER TO frapid_db_user;' AS sql - FROM pg_catalog.pg_proc p - JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace - WHERE NOT n.nspname = ANY(ARRAY['pg_catalog', 'information_schema']) - LOOP - EXECUTE this.sql; - END LOOP; + IF(_version_number < 110000) THEN + FOR this IN + SELECT 'ALTER ' + || CASE WHEN p.proisagg THEN 'AGGREGATE ' ELSE 'FUNCTION ' END + || quote_ident(n.nspname) || '.' || quote_ident(p.proname) || '(' + || pg_catalog.pg_get_function_identity_arguments(p.oid) || ') OWNER TO frapid_db_user;' AS sql + FROM pg_catalog.pg_proc p + JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace + WHERE NOT n.nspname = ANY(ARRAY['pg_catalog', 'information_schema']) + LOOP + EXECUTE this.sql; + END LOOP; + ELSE + FOR this IN + SELECT 'ALTER ' + || CASE p.prokind WHEN 'a' THEN 'AGGREGATE ' ELSE 'FUNCTION ' END + || quote_ident(n.nspname) || '.' || quote_ident(p.proname) || '(' + || pg_catalog.pg_get_function_identity_arguments(p.oid) || ') OWNER TO frapid_db_user;' AS sql + FROM pg_catalog.pg_proc p + JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace + WHERE NOT n.nspname = ANY(ARRAY['pg_catalog', 'information_schema']) + LOOP + EXECUTE this.sql; + END LOOP; + END IF; END $$ LANGUAGE plpgsql; + DO $$ DECLARE this record; @@ -166,22 +182,37 @@ LANGUAGE plpgsql; DO $$ DECLARE this record; + DECLARE _version_number integer = current_setting('server_version_num')::integer; BEGIN IF(CURRENT_USER = 'report_user') THEN RETURN; END IF; - FOR this IN - SELECT 'GRANT EXECUTE ON ' - || CASE WHEN p.proisagg THEN 'AGGREGATE ' ELSE 'FUNCTION ' END - || quote_ident(n.nspname) || '.' || quote_ident(p.proname) || '(' - || pg_catalog.pg_get_function_identity_arguments(p.oid) || ') TO report_user;' AS sql - FROM pg_catalog.pg_proc p - JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace - WHERE NOT n.nspname = ANY(ARRAY['pg_catalog', 'information_schema']) - LOOP - EXECUTE this.sql; - END LOOP; + IF(_version_number < 110000) THEN + FOR this IN + SELECT 'GRANT EXECUTE ON ' + || CASE WHEN p.proisagg THEN 'AGGREGATE ' ELSE 'FUNCTION ' END + || quote_ident(n.nspname) || '.' || quote_ident(p.proname) || '(' + || pg_catalog.pg_get_function_identity_arguments(p.oid) || ') TO report_user;' AS sql + FROM pg_catalog.pg_proc p + JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace + WHERE NOT n.nspname = ANY(ARRAY['pg_catalog', 'information_schema']) + LOOP + EXECUTE this.sql; + END LOOP; + ELSE + FOR this IN + SELECT 'GRANT EXECUTE ON ' + || CASE p.prokind WHEN 'a' THEN 'AGGREGATE ' ELSE 'FUNCTION ' END + || quote_ident(n.nspname) || '.' || quote_ident(p.proname) || '(' + || pg_catalog.pg_get_function_identity_arguments(p.oid) || ') TO report_user;' AS sql + FROM pg_catalog.pg_proc p + JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace + WHERE NOT n.nspname = ANY(ARRAY['pg_catalog', 'information_schema']) + LOOP + EXECUTE this.sql; + END LOOP; + END IF; END $$ LANGUAGE plpgsql; diff --git a/src/Frapid.Web/Areas/MixERP.Social/db/PostgreSQL/social-blank.sql b/src/Frapid.Web/Areas/MixERP.Social/db/PostgreSQL/social-blank.sql index cb76d2ca..a73a6c63 100644 --- a/src/Frapid.Web/Areas/MixERP.Social/db/PostgreSQL/social-blank.sql +++ b/src/Frapid.Web/Areas/MixERP.Social/db/PostgreSQL/social-blank.sql @@ -518,27 +518,43 @@ LANGUAGE plpgsql; DO $$ DECLARE this record; + DECLARE _version_number integer = current_setting('server_version_num')::integer; BEGIN IF(CURRENT_USER = 'frapid_db_user') THEN RETURN; END IF; - FOR this IN - SELECT 'ALTER ' - || CASE WHEN p.proisagg THEN 'AGGREGATE ' ELSE 'FUNCTION ' END - || quote_ident(n.nspname) || '.' || quote_ident(p.proname) || '(' - || pg_catalog.pg_get_function_identity_arguments(p.oid) || ') OWNER TO frapid_db_user;' AS sql - FROM pg_catalog.pg_proc p - JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace - WHERE NOT n.nspname = ANY(ARRAY['pg_catalog', 'information_schema']) - LOOP - EXECUTE this.sql; - END LOOP; + IF(_version_number < 110000) THEN + FOR this IN + SELECT 'ALTER ' + || CASE WHEN p.proisagg THEN 'AGGREGATE ' ELSE 'FUNCTION ' END + || quote_ident(n.nspname) || '.' || quote_ident(p.proname) || '(' + || pg_catalog.pg_get_function_identity_arguments(p.oid) || ') OWNER TO frapid_db_user;' AS sql + FROM pg_catalog.pg_proc p + JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace + WHERE NOT n.nspname = ANY(ARRAY['pg_catalog', 'information_schema']) + LOOP + EXECUTE this.sql; + END LOOP; + ELSE + FOR this IN + SELECT 'ALTER ' + || CASE p.prokind WHEN 'a' THEN 'AGGREGATE ' ELSE 'FUNCTION ' END + || quote_ident(n.nspname) || '.' || quote_ident(p.proname) || '(' + || pg_catalog.pg_get_function_identity_arguments(p.oid) || ') OWNER TO frapid_db_user;' AS sql + FROM pg_catalog.pg_proc p + JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace + WHERE NOT n.nspname = ANY(ARRAY['pg_catalog', 'information_schema']) + LOOP + EXECUTE this.sql; + END LOOP; + END IF; END $$ LANGUAGE plpgsql; + DO $$ DECLARE this record; @@ -645,22 +661,37 @@ LANGUAGE plpgsql; DO $$ DECLARE this record; + DECLARE _version_number integer = current_setting('server_version_num')::integer; BEGIN IF(CURRENT_USER = 'report_user') THEN RETURN; END IF; - FOR this IN - SELECT 'GRANT EXECUTE ON ' - || CASE WHEN p.proisagg THEN 'AGGREGATE ' ELSE 'FUNCTION ' END - || quote_ident(n.nspname) || '.' || quote_ident(p.proname) || '(' - || pg_catalog.pg_get_function_identity_arguments(p.oid) || ') TO report_user;' AS sql - FROM pg_catalog.pg_proc p - JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace - WHERE NOT n.nspname = ANY(ARRAY['pg_catalog', 'information_schema']) - LOOP - EXECUTE this.sql; - END LOOP; + IF(_version_number < 110000) THEN + FOR this IN + SELECT 'GRANT EXECUTE ON ' + || CASE WHEN p.proisagg THEN 'AGGREGATE ' ELSE 'FUNCTION ' END + || quote_ident(n.nspname) || '.' || quote_ident(p.proname) || '(' + || pg_catalog.pg_get_function_identity_arguments(p.oid) || ') TO report_user;' AS sql + FROM pg_catalog.pg_proc p + JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace + WHERE NOT n.nspname = ANY(ARRAY['pg_catalog', 'information_schema']) + LOOP + EXECUTE this.sql; + END LOOP; + ELSE + FOR this IN + SELECT 'GRANT EXECUTE ON ' + || CASE p.prokind WHEN 'a' THEN 'AGGREGATE ' ELSE 'FUNCTION ' END + || quote_ident(n.nspname) || '.' || quote_ident(p.proname) || '(' + || pg_catalog.pg_get_function_identity_arguments(p.oid) || ') TO report_user;' AS sql + FROM pg_catalog.pg_proc p + JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace + WHERE NOT n.nspname = ANY(ARRAY['pg_catalog', 'information_schema']) + LOOP + EXECUTE this.sql; + END LOOP; + END IF; END $$ LANGUAGE plpgsql; diff --git a/src/Frapid.Web/db/PostgreSQL/1.1.update/core-blank-1.1.update.sql b/src/Frapid.Web/db/PostgreSQL/1.1.update/core-blank-1.1.update.sql index 57aebaf8..b6b20fa6 100644 --- a/src/Frapid.Web/db/PostgreSQL/1.1.update/core-blank-1.1.update.sql +++ b/src/Frapid.Web/db/PostgreSQL/1.1.update/core-blank-1.1.update.sql @@ -80,27 +80,43 @@ LANGUAGE plpgsql; DO $$ DECLARE this record; + DECLARE _version_number integer = current_setting('server_version_num')::integer; BEGIN IF(CURRENT_USER = 'frapid_db_user') THEN RETURN; END IF; - FOR this IN - SELECT 'ALTER ' - || CASE WHEN p.proisagg THEN 'AGGREGATE ' ELSE 'FUNCTION ' END - || quote_ident(n.nspname) || '.' || quote_ident(p.proname) || '(' - || pg_catalog.pg_get_function_identity_arguments(p.oid) || ') OWNER TO frapid_db_user;' AS sql - FROM pg_catalog.pg_proc p - JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace - WHERE NOT n.nspname = ANY(ARRAY['pg_catalog', 'information_schema']) - LOOP - EXECUTE this.sql; - END LOOP; + IF(_version_number < 110000) THEN + FOR this IN + SELECT 'ALTER ' + || CASE WHEN p.proisagg THEN 'AGGREGATE ' ELSE 'FUNCTION ' END + || quote_ident(n.nspname) || '.' || quote_ident(p.proname) || '(' + || pg_catalog.pg_get_function_identity_arguments(p.oid) || ') OWNER TO frapid_db_user;' AS sql + FROM pg_catalog.pg_proc p + JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace + WHERE NOT n.nspname = ANY(ARRAY['pg_catalog', 'information_schema']) + LOOP + EXECUTE this.sql; + END LOOP; + ELSE + FOR this IN + SELECT 'ALTER ' + || CASE p.prokind WHEN 'a' THEN 'AGGREGATE ' ELSE 'FUNCTION ' END + || quote_ident(n.nspname) || '.' || quote_ident(p.proname) || '(' + || pg_catalog.pg_get_function_identity_arguments(p.oid) || ') OWNER TO frapid_db_user;' AS sql + FROM pg_catalog.pg_proc p + JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace + WHERE NOT n.nspname = ANY(ARRAY['pg_catalog', 'information_schema']) + LOOP + EXECUTE this.sql; + END LOOP; + END IF; END $$ LANGUAGE plpgsql; + DO $$ DECLARE this record; @@ -207,22 +223,37 @@ LANGUAGE plpgsql; DO $$ DECLARE this record; + DECLARE _version_number integer = current_setting('server_version_num')::integer; BEGIN IF(CURRENT_USER = 'report_user') THEN RETURN; END IF; - FOR this IN - SELECT 'GRANT EXECUTE ON ' - || CASE WHEN p.proisagg THEN 'AGGREGATE ' ELSE 'FUNCTION ' END - || quote_ident(n.nspname) || '.' || quote_ident(p.proname) || '(' - || pg_catalog.pg_get_function_identity_arguments(p.oid) || ') TO report_user;' AS sql - FROM pg_catalog.pg_proc p - JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace - WHERE NOT n.nspname = ANY(ARRAY['pg_catalog', 'information_schema']) - LOOP - EXECUTE this.sql; - END LOOP; + IF(_version_number < 110000) THEN + FOR this IN + SELECT 'GRANT EXECUTE ON ' + || CASE WHEN p.proisagg THEN 'AGGREGATE ' ELSE 'FUNCTION ' END + || quote_ident(n.nspname) || '.' || quote_ident(p.proname) || '(' + || pg_catalog.pg_get_function_identity_arguments(p.oid) || ') TO report_user;' AS sql + FROM pg_catalog.pg_proc p + JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace + WHERE NOT n.nspname = ANY(ARRAY['pg_catalog', 'information_schema']) + LOOP + EXECUTE this.sql; + END LOOP; + ELSE + FOR this IN + SELECT 'GRANT EXECUTE ON ' + || CASE p.prokind WHEN 'a' THEN 'AGGREGATE ' ELSE 'FUNCTION ' END + || quote_ident(n.nspname) || '.' || quote_ident(p.proname) || '(' + || pg_catalog.pg_get_function_identity_arguments(p.oid) || ') TO report_user;' AS sql + FROM pg_catalog.pg_proc p + JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace + WHERE NOT n.nspname = ANY(ARRAY['pg_catalog', 'information_schema']) + LOOP + EXECUTE this.sql; + END LOOP; + END IF; END $$ LANGUAGE plpgsql; diff --git a/src/Frapid.Web/db/PostgreSQL/1.1.update/src/99.ownership.sql b/src/Frapid.Web/db/PostgreSQL/1.1.update/src/99.ownership.sql index ccd67abd..c9f618ad 100644 --- a/src/Frapid.Web/db/PostgreSQL/1.1.update/src/99.ownership.sql +++ b/src/Frapid.Web/db/PostgreSQL/1.1.update/src/99.ownership.sql @@ -39,27 +39,43 @@ LANGUAGE plpgsql; DO $$ DECLARE this record; + DECLARE _version_number integer = current_setting('server_version_num')::integer; BEGIN IF(CURRENT_USER = 'frapid_db_user') THEN RETURN; END IF; - FOR this IN - SELECT 'ALTER ' - || CASE WHEN p.proisagg THEN 'AGGREGATE ' ELSE 'FUNCTION ' END - || quote_ident(n.nspname) || '.' || quote_ident(p.proname) || '(' - || pg_catalog.pg_get_function_identity_arguments(p.oid) || ') OWNER TO frapid_db_user;' AS sql - FROM pg_catalog.pg_proc p - JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace - WHERE NOT n.nspname = ANY(ARRAY['pg_catalog', 'information_schema']) - LOOP - EXECUTE this.sql; - END LOOP; + IF(_version_number < 110000) THEN + FOR this IN + SELECT 'ALTER ' + || CASE WHEN p.proisagg THEN 'AGGREGATE ' ELSE 'FUNCTION ' END + || quote_ident(n.nspname) || '.' || quote_ident(p.proname) || '(' + || pg_catalog.pg_get_function_identity_arguments(p.oid) || ') OWNER TO frapid_db_user;' AS sql + FROM pg_catalog.pg_proc p + JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace + WHERE NOT n.nspname = ANY(ARRAY['pg_catalog', 'information_schema']) + LOOP + EXECUTE this.sql; + END LOOP; + ELSE + FOR this IN + SELECT 'ALTER ' + || CASE p.prokind WHEN 'a' THEN 'AGGREGATE ' ELSE 'FUNCTION ' END + || quote_ident(n.nspname) || '.' || quote_ident(p.proname) || '(' + || pg_catalog.pg_get_function_identity_arguments(p.oid) || ') OWNER TO frapid_db_user;' AS sql + FROM pg_catalog.pg_proc p + JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace + WHERE NOT n.nspname = ANY(ARRAY['pg_catalog', 'information_schema']) + LOOP + EXECUTE this.sql; + END LOOP; + END IF; END $$ LANGUAGE plpgsql; + DO $$ DECLARE this record; @@ -166,22 +182,37 @@ LANGUAGE plpgsql; DO $$ DECLARE this record; + DECLARE _version_number integer = current_setting('server_version_num')::integer; BEGIN IF(CURRENT_USER = 'report_user') THEN RETURN; END IF; - FOR this IN - SELECT 'GRANT EXECUTE ON ' - || CASE WHEN p.proisagg THEN 'AGGREGATE ' ELSE 'FUNCTION ' END - || quote_ident(n.nspname) || '.' || quote_ident(p.proname) || '(' - || pg_catalog.pg_get_function_identity_arguments(p.oid) || ') TO report_user;' AS sql - FROM pg_catalog.pg_proc p - JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace - WHERE NOT n.nspname = ANY(ARRAY['pg_catalog', 'information_schema']) - LOOP - EXECUTE this.sql; - END LOOP; + IF(_version_number < 110000) THEN + FOR this IN + SELECT 'GRANT EXECUTE ON ' + || CASE WHEN p.proisagg THEN 'AGGREGATE ' ELSE 'FUNCTION ' END + || quote_ident(n.nspname) || '.' || quote_ident(p.proname) || '(' + || pg_catalog.pg_get_function_identity_arguments(p.oid) || ') TO report_user;' AS sql + FROM pg_catalog.pg_proc p + JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace + WHERE NOT n.nspname = ANY(ARRAY['pg_catalog', 'information_schema']) + LOOP + EXECUTE this.sql; + END LOOP; + ELSE + FOR this IN + SELECT 'GRANT EXECUTE ON ' + || CASE p.prokind WHEN 'a' THEN 'AGGREGATE ' ELSE 'FUNCTION ' END + || quote_ident(n.nspname) || '.' || quote_ident(p.proname) || '(' + || pg_catalog.pg_get_function_identity_arguments(p.oid) || ') TO report_user;' AS sql + FROM pg_catalog.pg_proc p + JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace + WHERE NOT n.nspname = ANY(ARRAY['pg_catalog', 'information_schema']) + LOOP + EXECUTE this.sql; + END LOOP; + END IF; END $$ LANGUAGE plpgsql; diff --git a/src/Frapid.Web/db/PostgreSQL/1.x/1.0/core-blank.sql b/src/Frapid.Web/db/PostgreSQL/1.x/1.0/core-blank.sql index fab8674f..b7c7ae68 100644 --- a/src/Frapid.Web/db/PostgreSQL/1.x/1.0/core-blank.sql +++ b/src/Frapid.Web/db/PostgreSQL/1.x/1.0/core-blank.sql @@ -1365,27 +1365,43 @@ LANGUAGE plpgsql; DO $$ DECLARE this record; + DECLARE _version_number integer = current_setting('server_version_num')::integer; BEGIN IF(CURRENT_USER = 'frapid_db_user') THEN RETURN; END IF; - FOR this IN - SELECT 'ALTER ' - || CASE WHEN p.proisagg THEN 'AGGREGATE ' ELSE 'FUNCTION ' END - || quote_ident(n.nspname) || '.' || quote_ident(p.proname) || '(' - || pg_catalog.pg_get_function_identity_arguments(p.oid) || ') OWNER TO frapid_db_user;' AS sql - FROM pg_catalog.pg_proc p - JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace - WHERE NOT n.nspname = ANY(ARRAY['pg_catalog', 'information_schema']) - LOOP - EXECUTE this.sql; - END LOOP; + IF(_version_number < 110000) THEN + FOR this IN + SELECT 'ALTER ' + || CASE WHEN p.proisagg THEN 'AGGREGATE ' ELSE 'FUNCTION ' END + || quote_ident(n.nspname) || '.' || quote_ident(p.proname) || '(' + || pg_catalog.pg_get_function_identity_arguments(p.oid) || ') OWNER TO frapid_db_user;' AS sql + FROM pg_catalog.pg_proc p + JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace + WHERE NOT n.nspname = ANY(ARRAY['pg_catalog', 'information_schema']) + LOOP + EXECUTE this.sql; + END LOOP; + ELSE + FOR this IN + SELECT 'ALTER ' + || CASE p.prokind WHEN 'a' THEN 'AGGREGATE ' ELSE 'FUNCTION ' END + || quote_ident(n.nspname) || '.' || quote_ident(p.proname) || '(' + || pg_catalog.pg_get_function_identity_arguments(p.oid) || ') OWNER TO frapid_db_user;' AS sql + FROM pg_catalog.pg_proc p + JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace + WHERE NOT n.nspname = ANY(ARRAY['pg_catalog', 'information_schema']) + LOOP + EXECUTE this.sql; + END LOOP; + END IF; END $$ LANGUAGE plpgsql; + DO $$ DECLARE this record; @@ -1492,22 +1508,37 @@ LANGUAGE plpgsql; DO $$ DECLARE this record; + DECLARE _version_number integer = current_setting('server_version_num')::integer; BEGIN IF(CURRENT_USER = 'report_user') THEN RETURN; END IF; - FOR this IN - SELECT 'GRANT EXECUTE ON ' - || CASE WHEN p.proisagg THEN 'AGGREGATE ' ELSE 'FUNCTION ' END - || quote_ident(n.nspname) || '.' || quote_ident(p.proname) || '(' - || pg_catalog.pg_get_function_identity_arguments(p.oid) || ') TO report_user;' AS sql - FROM pg_catalog.pg_proc p - JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace - WHERE NOT n.nspname = ANY(ARRAY['pg_catalog', 'information_schema']) - LOOP - EXECUTE this.sql; - END LOOP; + IF(_version_number < 110000) THEN + FOR this IN + SELECT 'GRANT EXECUTE ON ' + || CASE WHEN p.proisagg THEN 'AGGREGATE ' ELSE 'FUNCTION ' END + || quote_ident(n.nspname) || '.' || quote_ident(p.proname) || '(' + || pg_catalog.pg_get_function_identity_arguments(p.oid) || ') TO report_user;' AS sql + FROM pg_catalog.pg_proc p + JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace + WHERE NOT n.nspname = ANY(ARRAY['pg_catalog', 'information_schema']) + LOOP + EXECUTE this.sql; + END LOOP; + ELSE + FOR this IN + SELECT 'GRANT EXECUTE ON ' + || CASE p.prokind WHEN 'a' THEN 'AGGREGATE ' ELSE 'FUNCTION ' END + || quote_ident(n.nspname) || '.' || quote_ident(p.proname) || '(' + || pg_catalog.pg_get_function_identity_arguments(p.oid) || ') TO report_user;' AS sql + FROM pg_catalog.pg_proc p + JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace + WHERE NOT n.nspname = ANY(ARRAY['pg_catalog', 'information_schema']) + LOOP + EXECUTE this.sql; + END LOOP; + END IF; END $$ LANGUAGE plpgsql; diff --git a/src/Frapid.Web/db/PostgreSQL/1.x/1.0/src/99.ownership.sql b/src/Frapid.Web/db/PostgreSQL/1.x/1.0/src/99.ownership.sql index ccd67abd..c9f618ad 100644 --- a/src/Frapid.Web/db/PostgreSQL/1.x/1.0/src/99.ownership.sql +++ b/src/Frapid.Web/db/PostgreSQL/1.x/1.0/src/99.ownership.sql @@ -39,27 +39,43 @@ LANGUAGE plpgsql; DO $$ DECLARE this record; + DECLARE _version_number integer = current_setting('server_version_num')::integer; BEGIN IF(CURRENT_USER = 'frapid_db_user') THEN RETURN; END IF; - FOR this IN - SELECT 'ALTER ' - || CASE WHEN p.proisagg THEN 'AGGREGATE ' ELSE 'FUNCTION ' END - || quote_ident(n.nspname) || '.' || quote_ident(p.proname) || '(' - || pg_catalog.pg_get_function_identity_arguments(p.oid) || ') OWNER TO frapid_db_user;' AS sql - FROM pg_catalog.pg_proc p - JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace - WHERE NOT n.nspname = ANY(ARRAY['pg_catalog', 'information_schema']) - LOOP - EXECUTE this.sql; - END LOOP; + IF(_version_number < 110000) THEN + FOR this IN + SELECT 'ALTER ' + || CASE WHEN p.proisagg THEN 'AGGREGATE ' ELSE 'FUNCTION ' END + || quote_ident(n.nspname) || '.' || quote_ident(p.proname) || '(' + || pg_catalog.pg_get_function_identity_arguments(p.oid) || ') OWNER TO frapid_db_user;' AS sql + FROM pg_catalog.pg_proc p + JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace + WHERE NOT n.nspname = ANY(ARRAY['pg_catalog', 'information_schema']) + LOOP + EXECUTE this.sql; + END LOOP; + ELSE + FOR this IN + SELECT 'ALTER ' + || CASE p.prokind WHEN 'a' THEN 'AGGREGATE ' ELSE 'FUNCTION ' END + || quote_ident(n.nspname) || '.' || quote_ident(p.proname) || '(' + || pg_catalog.pg_get_function_identity_arguments(p.oid) || ') OWNER TO frapid_db_user;' AS sql + FROM pg_catalog.pg_proc p + JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace + WHERE NOT n.nspname = ANY(ARRAY['pg_catalog', 'information_schema']) + LOOP + EXECUTE this.sql; + END LOOP; + END IF; END $$ LANGUAGE plpgsql; + DO $$ DECLARE this record; @@ -166,22 +182,37 @@ LANGUAGE plpgsql; DO $$ DECLARE this record; + DECLARE _version_number integer = current_setting('server_version_num')::integer; BEGIN IF(CURRENT_USER = 'report_user') THEN RETURN; END IF; - FOR this IN - SELECT 'GRANT EXECUTE ON ' - || CASE WHEN p.proisagg THEN 'AGGREGATE ' ELSE 'FUNCTION ' END - || quote_ident(n.nspname) || '.' || quote_ident(p.proname) || '(' - || pg_catalog.pg_get_function_identity_arguments(p.oid) || ') TO report_user;' AS sql - FROM pg_catalog.pg_proc p - JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace - WHERE NOT n.nspname = ANY(ARRAY['pg_catalog', 'information_schema']) - LOOP - EXECUTE this.sql; - END LOOP; + IF(_version_number < 110000) THEN + FOR this IN + SELECT 'GRANT EXECUTE ON ' + || CASE WHEN p.proisagg THEN 'AGGREGATE ' ELSE 'FUNCTION ' END + || quote_ident(n.nspname) || '.' || quote_ident(p.proname) || '(' + || pg_catalog.pg_get_function_identity_arguments(p.oid) || ') TO report_user;' AS sql + FROM pg_catalog.pg_proc p + JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace + WHERE NOT n.nspname = ANY(ARRAY['pg_catalog', 'information_schema']) + LOOP + EXECUTE this.sql; + END LOOP; + ELSE + FOR this IN + SELECT 'GRANT EXECUTE ON ' + || CASE p.prokind WHEN 'a' THEN 'AGGREGATE ' ELSE 'FUNCTION ' END + || quote_ident(n.nspname) || '.' || quote_ident(p.proname) || '(' + || pg_catalog.pg_get_function_identity_arguments(p.oid) || ') TO report_user;' AS sql + FROM pg_catalog.pg_proc p + JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace + WHERE NOT n.nspname = ANY(ARRAY['pg_catalog', 'information_schema']) + LOOP + EXECUTE this.sql; + END LOOP; + END IF; END $$ LANGUAGE plpgsql; diff --git a/src/Frapid.Web/db/PostgreSQL/core-blank-1.1.update.sql b/src/Frapid.Web/db/PostgreSQL/core-blank-1.1.update.sql index 57aebaf8..b6b20fa6 100644 --- a/src/Frapid.Web/db/PostgreSQL/core-blank-1.1.update.sql +++ b/src/Frapid.Web/db/PostgreSQL/core-blank-1.1.update.sql @@ -80,27 +80,43 @@ LANGUAGE plpgsql; DO $$ DECLARE this record; + DECLARE _version_number integer = current_setting('server_version_num')::integer; BEGIN IF(CURRENT_USER = 'frapid_db_user') THEN RETURN; END IF; - FOR this IN - SELECT 'ALTER ' - || CASE WHEN p.proisagg THEN 'AGGREGATE ' ELSE 'FUNCTION ' END - || quote_ident(n.nspname) || '.' || quote_ident(p.proname) || '(' - || pg_catalog.pg_get_function_identity_arguments(p.oid) || ') OWNER TO frapid_db_user;' AS sql - FROM pg_catalog.pg_proc p - JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace - WHERE NOT n.nspname = ANY(ARRAY['pg_catalog', 'information_schema']) - LOOP - EXECUTE this.sql; - END LOOP; + IF(_version_number < 110000) THEN + FOR this IN + SELECT 'ALTER ' + || CASE WHEN p.proisagg THEN 'AGGREGATE ' ELSE 'FUNCTION ' END + || quote_ident(n.nspname) || '.' || quote_ident(p.proname) || '(' + || pg_catalog.pg_get_function_identity_arguments(p.oid) || ') OWNER TO frapid_db_user;' AS sql + FROM pg_catalog.pg_proc p + JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace + WHERE NOT n.nspname = ANY(ARRAY['pg_catalog', 'information_schema']) + LOOP + EXECUTE this.sql; + END LOOP; + ELSE + FOR this IN + SELECT 'ALTER ' + || CASE p.prokind WHEN 'a' THEN 'AGGREGATE ' ELSE 'FUNCTION ' END + || quote_ident(n.nspname) || '.' || quote_ident(p.proname) || '(' + || pg_catalog.pg_get_function_identity_arguments(p.oid) || ') OWNER TO frapid_db_user;' AS sql + FROM pg_catalog.pg_proc p + JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace + WHERE NOT n.nspname = ANY(ARRAY['pg_catalog', 'information_schema']) + LOOP + EXECUTE this.sql; + END LOOP; + END IF; END $$ LANGUAGE plpgsql; + DO $$ DECLARE this record; @@ -207,22 +223,37 @@ LANGUAGE plpgsql; DO $$ DECLARE this record; + DECLARE _version_number integer = current_setting('server_version_num')::integer; BEGIN IF(CURRENT_USER = 'report_user') THEN RETURN; END IF; - FOR this IN - SELECT 'GRANT EXECUTE ON ' - || CASE WHEN p.proisagg THEN 'AGGREGATE ' ELSE 'FUNCTION ' END - || quote_ident(n.nspname) || '.' || quote_ident(p.proname) || '(' - || pg_catalog.pg_get_function_identity_arguments(p.oid) || ') TO report_user;' AS sql - FROM pg_catalog.pg_proc p - JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace - WHERE NOT n.nspname = ANY(ARRAY['pg_catalog', 'information_schema']) - LOOP - EXECUTE this.sql; - END LOOP; + IF(_version_number < 110000) THEN + FOR this IN + SELECT 'GRANT EXECUTE ON ' + || CASE WHEN p.proisagg THEN 'AGGREGATE ' ELSE 'FUNCTION ' END + || quote_ident(n.nspname) || '.' || quote_ident(p.proname) || '(' + || pg_catalog.pg_get_function_identity_arguments(p.oid) || ') TO report_user;' AS sql + FROM pg_catalog.pg_proc p + JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace + WHERE NOT n.nspname = ANY(ARRAY['pg_catalog', 'information_schema']) + LOOP + EXECUTE this.sql; + END LOOP; + ELSE + FOR this IN + SELECT 'GRANT EXECUTE ON ' + || CASE p.prokind WHEN 'a' THEN 'AGGREGATE ' ELSE 'FUNCTION ' END + || quote_ident(n.nspname) || '.' || quote_ident(p.proname) || '(' + || pg_catalog.pg_get_function_identity_arguments(p.oid) || ') TO report_user;' AS sql + FROM pg_catalog.pg_proc p + JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace + WHERE NOT n.nspname = ANY(ARRAY['pg_catalog', 'information_schema']) + LOOP + EXECUTE this.sql; + END LOOP; + END IF; END $$ LANGUAGE plpgsql; diff --git a/src/Frapid.Web/db/PostgreSQL/core-blank.sql b/src/Frapid.Web/db/PostgreSQL/core-blank.sql index fab8674f..b7c7ae68 100644 --- a/src/Frapid.Web/db/PostgreSQL/core-blank.sql +++ b/src/Frapid.Web/db/PostgreSQL/core-blank.sql @@ -1365,27 +1365,43 @@ LANGUAGE plpgsql; DO $$ DECLARE this record; + DECLARE _version_number integer = current_setting('server_version_num')::integer; BEGIN IF(CURRENT_USER = 'frapid_db_user') THEN RETURN; END IF; - FOR this IN - SELECT 'ALTER ' - || CASE WHEN p.proisagg THEN 'AGGREGATE ' ELSE 'FUNCTION ' END - || quote_ident(n.nspname) || '.' || quote_ident(p.proname) || '(' - || pg_catalog.pg_get_function_identity_arguments(p.oid) || ') OWNER TO frapid_db_user;' AS sql - FROM pg_catalog.pg_proc p - JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace - WHERE NOT n.nspname = ANY(ARRAY['pg_catalog', 'information_schema']) - LOOP - EXECUTE this.sql; - END LOOP; + IF(_version_number < 110000) THEN + FOR this IN + SELECT 'ALTER ' + || CASE WHEN p.proisagg THEN 'AGGREGATE ' ELSE 'FUNCTION ' END + || quote_ident(n.nspname) || '.' || quote_ident(p.proname) || '(' + || pg_catalog.pg_get_function_identity_arguments(p.oid) || ') OWNER TO frapid_db_user;' AS sql + FROM pg_catalog.pg_proc p + JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace + WHERE NOT n.nspname = ANY(ARRAY['pg_catalog', 'information_schema']) + LOOP + EXECUTE this.sql; + END LOOP; + ELSE + FOR this IN + SELECT 'ALTER ' + || CASE p.prokind WHEN 'a' THEN 'AGGREGATE ' ELSE 'FUNCTION ' END + || quote_ident(n.nspname) || '.' || quote_ident(p.proname) || '(' + || pg_catalog.pg_get_function_identity_arguments(p.oid) || ') OWNER TO frapid_db_user;' AS sql + FROM pg_catalog.pg_proc p + JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace + WHERE NOT n.nspname = ANY(ARRAY['pg_catalog', 'information_schema']) + LOOP + EXECUTE this.sql; + END LOOP; + END IF; END $$ LANGUAGE plpgsql; + DO $$ DECLARE this record; @@ -1492,22 +1508,37 @@ LANGUAGE plpgsql; DO $$ DECLARE this record; + DECLARE _version_number integer = current_setting('server_version_num')::integer; BEGIN IF(CURRENT_USER = 'report_user') THEN RETURN; END IF; - FOR this IN - SELECT 'GRANT EXECUTE ON ' - || CASE WHEN p.proisagg THEN 'AGGREGATE ' ELSE 'FUNCTION ' END - || quote_ident(n.nspname) || '.' || quote_ident(p.proname) || '(' - || pg_catalog.pg_get_function_identity_arguments(p.oid) || ') TO report_user;' AS sql - FROM pg_catalog.pg_proc p - JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace - WHERE NOT n.nspname = ANY(ARRAY['pg_catalog', 'information_schema']) - LOOP - EXECUTE this.sql; - END LOOP; + IF(_version_number < 110000) THEN + FOR this IN + SELECT 'GRANT EXECUTE ON ' + || CASE WHEN p.proisagg THEN 'AGGREGATE ' ELSE 'FUNCTION ' END + || quote_ident(n.nspname) || '.' || quote_ident(p.proname) || '(' + || pg_catalog.pg_get_function_identity_arguments(p.oid) || ') TO report_user;' AS sql + FROM pg_catalog.pg_proc p + JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace + WHERE NOT n.nspname = ANY(ARRAY['pg_catalog', 'information_schema']) + LOOP + EXECUTE this.sql; + END LOOP; + ELSE + FOR this IN + SELECT 'GRANT EXECUTE ON ' + || CASE p.prokind WHEN 'a' THEN 'AGGREGATE ' ELSE 'FUNCTION ' END + || quote_ident(n.nspname) || '.' || quote_ident(p.proname) || '(' + || pg_catalog.pg_get_function_identity_arguments(p.oid) || ') TO report_user;' AS sql + FROM pg_catalog.pg_proc p + JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace + WHERE NOT n.nspname = ANY(ARRAY['pg_catalog', 'information_schema']) + LOOP + EXECUTE this.sql; + END LOOP; + END IF; END $$ LANGUAGE plpgsql; From fd4180230a9ca2ad26623d89195511896c4987dd Mon Sep 17 00:00:00 2001 From: bi od Date: Sat, 11 May 2019 18:49:55 +0545 Subject: [PATCH 11/18] Update for automated builds using VS 2019 - Updated MsBuild.exe path in build script. - Fixed output path issues related to TeamCity continuous builds - Fixed other build issues --- builds/all.bat | 78 +-- .../Areas/ElasticEmail/ElasticEmail.csproj | 9 +- .../Frapid.Account/Frapid.Account.csproj | 2 - .../Frapid.AddressBook.csproj | 16 +- .../Frapid.Authorization.csproj | 9 +- .../Frapid.Calendar/Frapid.Calendar.csproj | 9 +- .../Areas/Frapid.Config/Frapid.Config.csproj | 2 - .../Frapid.Dashboard/Frapid.Dashboard.csproj | 2 - .../Frapid.Reports/Frapid.Reports.csproj | 9 +- .../Frapid.SchemaUpdater.csproj | 9 +- .../Frapid.WebsiteBuilder.csproj | 2 - src/Frapid.Web/Areas/Google/Google.csproj | 9 +- .../Areas/MixERP.Social/MixERP.Social.csproj | 7 +- .../Areas/SendGridMail/SendGridMail.csproj | 9 +- .../Areas/SparkPostMail/SparkPostMail.csproj | 9 +- src/Frapid.Web/Frapid.Web - Copy.csproj | 558 ------------------ src/Frapid.Web/Frapid.Web.csproj | 2 - src/Frapid.Web/Packages/i18n/en.yaml | 411 +------------ src/Templates/MVCProject/MVCProject.csproj | 9 +- 19 files changed, 64 insertions(+), 1097 deletions(-) delete mode 100644 src/Frapid.Web/Frapid.Web - Copy.csproj diff --git a/builds/all.bat b/builds/all.bat index 83b68047..a4f02fd8 100644 --- a/builds/all.bat +++ b/builds/all.bat @@ -6,204 +6,204 @@ xcopy "%~dp0..\src\Frapid.Web\Resources\_Configs\Assets" "%~dp0..\src\Frapid.Web if exist "../src/Frapid.Web.sln" ( @echo Building Frapid.Web - "%programfiles(x86)%\MSBuild\14.0\Bin\MSBuild.exe" /verbosity:quiet /nologo /property:Configuration=Debug ../src/Frapid.Web.sln /p:VisualStudioVersion=14.0 + "%SystemRoot%/Microsoft.Net/Framework/v4.0.30319/MSBuild.exe" /verbosity:quiet /nologo /property:Configuration=Debug ../src/Frapid.Web.sln /p:VisualStudioVersion=14.0 ) if exist "../src/Frapid.Web/Areas/Frapid.Dashboard/Frapid.Dashboard.sln" ( @echo Building Frapid Dashboard - "%programfiles(x86)%\MSBuild\14.0\Bin\MSBuild.exe" /verbosity:quiet /nologo /property:Configuration=Debug ../src/Frapid.Web/Areas/Frapid.Dashboard/Frapid.Dashboard.sln /p:VisualStudioVersion=14.0 + "%SystemRoot%/Microsoft.Net/Framework/v4.0.30319/MSBuild.exe" /verbosity:quiet /nologo /property:Configuration=Debug ../src/Frapid.Web/Areas/Frapid.Dashboard/Frapid.Dashboard.sln /p:VisualStudioVersion=14.0 ) if exist "../src/Frapid.Web/Areas/Frapid.WebsiteBuilder/Frapid.WebsiteBuilder.sln" ( @echo Building WebsiteBuilder Module - "%programfiles(x86)%\MSBuild\14.0\Bin\MSBuild.exe" /verbosity:quiet /nologo /property:Configuration=Debug ../src/Frapid.Web/Areas/Frapid.WebsiteBuilder/Frapid.WebsiteBuilder.sln /p:VisualStudioVersion=14.0 + "%SystemRoot%/Microsoft.Net/Framework/v4.0.30319/MSBuild.exe" /verbosity:quiet /nologo /property:Configuration=Debug ../src/Frapid.Web/Areas/Frapid.WebsiteBuilder/Frapid.WebsiteBuilder.sln /p:VisualStudioVersion=14.0 ) if exist "../src/Frapid.Web/Areas/Frapid.AddressBook/Frapid.AddressBook.sln" ( @echo Building AddressBook nuget.exe restore "../src/Frapid.Web/Areas/Frapid.AddressBook/Frapid.AddressBook.sln" - "%programfiles(x86)%\MSBuild\14.0\Bin\MSBuild.exe" /verbosity:quiet /nologo /property:Configuration=Debug ../src/Frapid.Web/Areas/Frapid.AddressBook/Frapid.AddressBook.sln /p:VisualStudioVersion=14.0 + "%SystemRoot%/Microsoft.Net/Framework/v4.0.30319/MSBuild.exe" /verbosity:quiet /nologo /property:Configuration=Debug ../src/Frapid.Web/Areas/Frapid.AddressBook/Frapid.AddressBook.sln /p:VisualStudioVersion=14.0 ) if exist "../src/Frapid.Web/Areas/Google/Google.sln" ( @echo Building Google Integration for Frapid - "%programfiles(x86)%\MSBuild\14.0\Bin\MSBuild.exe" /verbosity:quiet /nologo /property:Configuration=Debug ../src/Frapid.Web/Areas/Google/Google.sln /p:VisualStudioVersion=14.0 + "%SystemRoot%/Microsoft.Net/Framework/v4.0.30319/MSBuild.exe" /verbosity:quiet /nologo /property:Configuration=Debug ../src/Frapid.Web/Areas/Google/Google.sln /p:VisualStudioVersion=14.0 ) if exist "../src/Frapid.Web/Areas/Frapid.Calendar/Frapid.Calendar.sln" ( @echo Building Calendar - "%programfiles(x86)%\MSBuild\14.0\Bin\MSBuild.exe" /verbosity:quiet /nologo /property:Configuration=Debug ../src/Frapid.Web/Areas/Frapid.Calendar/Frapid.Calendar.sln /p:VisualStudioVersion=14.0 + "%SystemRoot%/Microsoft.Net/Framework/v4.0.30319/MSBuild.exe" /verbosity:quiet /nologo /property:Configuration=Debug ../src/Frapid.Web/Areas/Frapid.Calendar/Frapid.Calendar.sln /p:VisualStudioVersion=14.0 ) if exist "../src/Frapid.Web/Areas/Frapid.Core/Frapid.Core.sln" ( @echo Building Core Module - "%programfiles(x86)%\MSBuild\14.0\Bin\MSBuild.exe" /verbosity:quiet /nologo /property:Configuration=Debug ../src/Frapid.Web/Areas/Frapid.Core/Frapid.Core.sln /p:VisualStudioVersion=14.0 + "%SystemRoot%/Microsoft.Net/Framework/v4.0.30319/MSBuild.exe" /verbosity:quiet /nologo /property:Configuration=Debug ../src/Frapid.Web/Areas/Frapid.Core/Frapid.Core.sln /p:VisualStudioVersion=14.0 ) if exist "../src/Frapid.Web/Areas/Frapid.Config/Frapid.Config.sln" ( @echo Building Config Module - "%programfiles(x86)%\MSBuild\14.0\Bin\MSBuild.exe" /verbosity:quiet /nologo /property:Configuration=Debug ../src/Frapid.Web/Areas/Frapid.Config/Frapid.Config.sln /p:VisualStudioVersion=14.0 + "%SystemRoot%/Microsoft.Net/Framework/v4.0.30319/MSBuild.exe" /verbosity:quiet /nologo /property:Configuration=Debug ../src/Frapid.Web/Areas/Frapid.Config/Frapid.Config.sln /p:VisualStudioVersion=14.0 ) if exist "../src/Frapid.Web/Areas/Frapid.Reports/Frapid.Reports.sln" ( @echo Building Frapid Reporting Module - "%programfiles(x86)%\MSBuild\14.0\Bin\MSBuild.exe" /verbosity:quiet /nologo /property:Configuration=Debug ../src/Frapid.Web/Areas/Frapid.Reports/Frapid.Reports.sln /p:VisualStudioVersion=14.0 + "%SystemRoot%/Microsoft.Net/Framework/v4.0.30319/MSBuild.exe" /verbosity:quiet /nologo /property:Configuration=Debug ../src/Frapid.Web/Areas/Frapid.Reports/Frapid.Reports.sln /p:VisualStudioVersion=14.0 ) if exist "../src/Frapid.Web/Areas/MixERP.Social/MixERP.Social.sln" ( @echo Building MixERP.Social Module - "%programfiles(x86)%\MSBuild\14.0\Bin\MSBuild.exe" /verbosity:quiet /nologo /property:Configuration=Debug ../src/Frapid.Web/Areas/MixERP.Social/MixERP.Social.sln /p:VisualStudioVersion=14.0 + "%SystemRoot%/Microsoft.Net/Framework/v4.0.30319/MSBuild.exe" /verbosity:quiet /nologo /property:Configuration=Debug ../src/Frapid.Web/Areas/MixERP.Social/MixERP.Social.sln /p:VisualStudioVersion=14.0 ) if exist "../src/Frapid.Web/Areas/Frapid.Authorization/Frapid.Authorization.sln" ( @echo Building Frapid Authorization Module - "%programfiles(x86)%\MSBuild\14.0\Bin\MSBuild.exe" /verbosity:quiet /nologo /property:Configuration=Debug ../src/Frapid.Web/Areas/Frapid.Authorization/Frapid.Authorization.sln /p:VisualStudioVersion=14.0 + "%SystemRoot%/Microsoft.Net/Framework/v4.0.30319/MSBuild.exe" /verbosity:quiet /nologo /property:Configuration=Debug ../src/Frapid.Web/Areas/Frapid.Authorization/Frapid.Authorization.sln /p:VisualStudioVersion=14.0 ) if exist "../src/Frapid.Web/Areas/Frapid.Account/Frapid.Account.sln" ( @echo Building Account Module - "%programfiles(x86)%\MSBuild\14.0\Bin\MSBuild.exe" /verbosity:quiet /nologo /property:Configuration=Debug ../src/Frapid.Web/Areas/Frapid.Account/Frapid.Account.sln /p:VisualStudioVersion=14.0 + "%SystemRoot%/Microsoft.Net/Framework/v4.0.30319/MSBuild.exe" /verbosity:quiet /nologo /property:Configuration=Debug ../src/Frapid.Web/Areas/Frapid.Account/Frapid.Account.sln /p:VisualStudioVersion=14.0 ) if exist "../src/Frapid.Web/Areas/Frapid.Forms/Frapid.Forms.sln" ( @echo Building Forms Module -"%programfiles(x86)%\MSBuild\14.0\Bin\MSBuild.exe" /verbosity:quiet /nologo /property:Configuration=Debug ../src/Frapid.Web/Areas/Frapid.Forms/Frapid.Forms.sln /p:VisualStudioVersion=14.0 +"%SystemRoot%/Microsoft.Net/Framework/v4.0.30319/MSBuild.exe" /verbosity:quiet /nologo /property:Configuration=Debug ../src/Frapid.Web/Areas/Frapid.Forms/Frapid.Forms.sln /p:VisualStudioVersion=14.0 ) if exist "../src/Frapid.Web/Areas/MixERP.Forums/MixERP.Forums.sln" ( @echo Building Forums Module - "%programfiles(x86)%\MSBuild\14.0\Bin\MSBuild.exe" /verbosity:quiet /nologo /property:Configuration=Debug ../src/Frapid.Web/Areas/MixERP.Forums/MixERP.Forums.sln /p:VisualStudioVersion=14.0 + "%SystemRoot%/Microsoft.Net/Framework/v4.0.30319/MSBuild.exe" /verbosity:quiet /nologo /property:Configuration=Debug ../src/Frapid.Web/Areas/MixERP.Forums/MixERP.Forums.sln /p:VisualStudioVersion=14.0 ) if exist "../src/Frapid.Web/Areas/MixERP.Helpdesk/MixERP.Helpdesk.sln" ( @echo Building Helpdesk Module - "%programfiles(x86)%\MSBuild\14.0\Bin\MSBuild.exe" /verbosity:quiet /nologo /property:Configuration=Debug ../src/Frapid.Web/Areas/MixERP.Helpdesk/MixERP.Helpdesk.sln /p:VisualStudioVersion=14.0 + "%SystemRoot%/Microsoft.Net/Framework/v4.0.30319/MSBuild.exe" /verbosity:quiet /nologo /property:Configuration=Debug ../src/Frapid.Web/Areas/MixERP.Helpdesk/MixERP.Helpdesk.sln /p:VisualStudioVersion=14.0 ) if exist "../src/Frapid.Web/Areas/MixERP.Finance/MixERP.Finance.sln" ( @echo Building Finance Module - "%programfiles(x86)%\MSBuild\14.0\Bin\MSBuild.exe" /verbosity:quiet /nologo /property:Configuration=Debug ../src/Frapid.Web/Areas/MixERP.Finance/MixERP.Finance.sln /p:VisualStudioVersion=14.0 + "%SystemRoot%/Microsoft.Net/Framework/v4.0.30319/MSBuild.exe" /verbosity:quiet /nologo /property:Configuration=Debug ../src/Frapid.Web/Areas/MixERP.Finance/MixERP.Finance.sln /p:VisualStudioVersion=14.0 ) if exist "../src/Frapid.Web/Areas/MixERP.HRM/MixERP.HRM.sln" ( @echo Building HRM Module - "%programfiles(x86)%\MSBuild\14.0\Bin\MSBuild.exe" /verbosity:quiet /nologo /property:Configuration=Debug ../src/Frapid.Web/Areas/MixERP.HRM/MixERP.HRM.sln /p:VisualStudioVersion=14.0 + "%SystemRoot%/Microsoft.Net/Framework/v4.0.30319/MSBuild.exe" /verbosity:quiet /nologo /property:Configuration=Debug ../src/Frapid.Web/Areas/MixERP.HRM/MixERP.HRM.sln /p:VisualStudioVersion=14.0 ) if exist "../src/Frapid.Web/Areas/MixERP.Inventory/MixERP.Inventory.sln" ( @echo Building Inventory Module - "%programfiles(x86)%\MSBuild\14.0\Bin\MSBuild.exe" /verbosity:quiet /nologo /property:Configuration=Debug ../src/Frapid.Web/Areas/MixERP.Inventory/MixERP.Inventory.sln /p:VisualStudioVersion=14.0 + "%SystemRoot%/Microsoft.Net/Framework/v4.0.30319/MSBuild.exe" /verbosity:quiet /nologo /property:Configuration=Debug ../src/Frapid.Web/Areas/MixERP.Inventory/MixERP.Inventory.sln /p:VisualStudioVersion=14.0 ) if exist "../src/Frapid.Web/Areas/MixERP.Purchases/MixERP.Purchases.sln" ( @echo Building Purchase Module - "%programfiles(x86)%\MSBuild\14.0\Bin\MSBuild.exe" /verbosity:quiet /nologo /property:Configuration=Debug ../src/Frapid.Web/Areas/MixERP.Purchases/MixERP.Purchases.sln /p:VisualStudioVersion=14.0 + "%SystemRoot%/Microsoft.Net/Framework/v4.0.30319/MSBuild.exe" /verbosity:quiet /nologo /property:Configuration=Debug ../src/Frapid.Web/Areas/MixERP.Purchases/MixERP.Purchases.sln /p:VisualStudioVersion=14.0 ) if exist "../src/Frapid.Web/Areas/MixERP.Sales/MixERP.Sales.sln" ( @echo Building Sales Module - "%programfiles(x86)%\MSBuild\14.0\Bin\MSBuild.exe" /verbosity:quiet /nologo /property:Configuration=Debug ../src/Frapid.Web/Areas/MixERP.Sales/MixERP.Sales.sln /p:VisualStudioVersion=14.0 + "%SystemRoot%/Microsoft.Net/Framework/v4.0.30319/MSBuild.exe" /verbosity:quiet /nologo /property:Configuration=Debug ../src/Frapid.Web/Areas/MixERP.Sales/MixERP.Sales.sln /p:VisualStudioVersion=14.0 ) if exist "../src/Frapid.Web/Areas/MixERP.Production/MixERP.Production.sln" ( @echo Building Production Module - "%programfiles(x86)%\MSBuild\14.0\Bin\MSBuild.exe" /verbosity:quiet /nologo /property:Configuration=Debug ../src/Frapid.Web/Areas/MixERP.Production/MixERP.Production.sln /p:VisualStudioVersion=14.0 + "%SystemRoot%/Microsoft.Net/Framework/v4.0.30319/MSBuild.exe" /verbosity:quiet /nologo /property:Configuration=Debug ../src/Frapid.Web/Areas/MixERP.Production/MixERP.Production.sln /p:VisualStudioVersion=14.0 ) if exist "../src/Frapid.Web/Areas/CineSys/CineSys.sln" ( @echo Building CineSys Module - "%programfiles(x86)%\MSBuild\14.0\Bin\MSBuild.exe" /verbosity:quiet /nologo /property:Configuration=Debug ../src/Frapid.Web/Areas/CineSys/CineSys.sln /p:VisualStudioVersion=14.0 + "%SystemRoot%/Microsoft.Net/Framework/v4.0.30319/MSBuild.exe" /verbosity:quiet /nologo /property:Configuration=Debug ../src/Frapid.Web/Areas/CineSys/CineSys.sln /p:VisualStudioVersion=14.0 ) if exist "../src/Frapid.Web/Areas/CineSys.FoodCourt/CineSys.FoodCourt.sln" ( @echo Building CineSys.FoodCourt Module - "%programfiles(x86)%\MSBuild\14.0\Bin\MSBuild.exe" /verbosity:quiet /nologo /property:Configuration=Debug ../src/Frapid.Web/Areas/CineSys.FoodCourt/CineSys.FoodCourt.sln /p:VisualStudioVersion=14.0 + "%SystemRoot%/Microsoft.Net/Framework/v4.0.30319/MSBuild.exe" /verbosity:quiet /nologo /property:Configuration=Debug ../src/Frapid.Web/Areas/CineSys.FoodCourt/CineSys.FoodCourt.sln /p:VisualStudioVersion=14.0 ) if exist "../src/Frapid.Web/Areas/CineSys.GateKeeper/CineSys.GateKeeper.sln" ( @echo Building CineSys.GateKeeper Module - "%programfiles(x86)%\MSBuild\14.0\Bin\MSBuild.exe" /verbosity:quiet /nologo /property:Configuration=Debug ../src/Frapid.Web/Areas/CineSys.GateKeeper/CineSys.GateKeeper.sln /p:VisualStudioVersion=14.0 + "%SystemRoot%/Microsoft.Net/Framework/v4.0.30319/MSBuild.exe" /verbosity:quiet /nologo /property:Configuration=Debug ../src/Frapid.Web/Areas/CineSys.GateKeeper/CineSys.GateKeeper.sln /p:VisualStudioVersion=14.0 ) if exist "../src/Frapid.Web/Areas/Frapid.CafeSys/Frapid.CafeSys.sln" ( @echo Building Frapid.CafeSys Module - "%programfiles(x86)%\MSBuild\14.0\Bin\MSBuild.exe" /verbosity:quiet /nologo /property:Configuration=Debug ../src/Frapid.Web/Areas/Frapid.CafeSys/Frapid.CafeSys.sln /p:VisualStudioVersion=14.0 + "%SystemRoot%/Microsoft.Net/Framework/v4.0.30319/MSBuild.exe" /verbosity:quiet /nologo /property:Configuration=Debug ../src/Frapid.Web/Areas/Frapid.CafeSys/Frapid.CafeSys.sln /p:VisualStudioVersion=14.0 ) if exist "../src/Frapid.Web/Areas/Frapid.RecoveryManager/Frapid.RecoveryManager.sln" ( @echo Building Frapid.RecoveryManager Module - "%programfiles(x86)%\MSBuild\14.0\Bin\MSBuild.exe" /verbosity:quiet /nologo /property:Configuration=Debug ../src/Frapid.Web/Areas/Frapid.RecoveryManager/Frapid.RecoveryManager.sln /p:VisualStudioVersion=14.0 + "%SystemRoot%/Microsoft.Net/Framework/v4.0.30319/MSBuild.exe" /verbosity:quiet /nologo /property:Configuration=Debug ../src/Frapid.Web/Areas/Frapid.RecoveryManager/Frapid.RecoveryManager.sln /p:VisualStudioVersion=14.0 ) if exist "../src/Frapid.Web/Areas/MixERP.CountryPacks.Nepal/MixERP.CountryPacks.Nepal.sln" ( @echo Building MixERP.CountryPacks.Nepal Module - "%programfiles(x86)%\MSBuild\14.0\Bin\MSBuild.exe" /verbosity:quiet /nologo /property:Configuration=Debug ../src/Frapid.Web/Areas/MixERP.CountryPacks.Nepal/MixERP.CountryPacks.Nepal.sln /p:VisualStudioVersion=14.0 + "%SystemRoot%/Microsoft.Net/Framework/v4.0.30319/MSBuild.exe" /verbosity:quiet /nologo /property:Configuration=Debug ../src/Frapid.Web/Areas/MixERP.CountryPacks.Nepal/MixERP.CountryPacks.Nepal.sln /p:VisualStudioVersion=14.0 ) if exist "../src/Frapid.Web/Areas/SendGridMail/SendGridMail.sln" ( @echo Building SendGridMail Module - "%programfiles(x86)%\MSBuild\14.0\Bin\MSBuild.exe" /verbosity:quiet /nologo /property:Configuration=Debug ../src/Frapid.Web/Areas/SendGridMail/SendGridMail.sln /p:VisualStudioVersion=14.0 + "%SystemRoot%/Microsoft.Net/Framework/v4.0.30319/MSBuild.exe" /verbosity:quiet /nologo /property:Configuration=Debug ../src/Frapid.Web/Areas/SendGridMail/SendGridMail.sln /p:VisualStudioVersion=14.0 ) if exist "../src/Frapid.Web/Areas/ElasticEmail/ElasticEmail.sln" ( @echo Building ElasticEmail Module - "%programfiles(x86)%\MSBuild\14.0\Bin\MSBuild.exe" /verbosity:quiet /nologo /property:Configuration=Debug ../src/Frapid.Web/Areas/ElasticEmail/ElasticEmail.sln /p:VisualStudioVersion=14.0 + "%SystemRoot%/Microsoft.Net/Framework/v4.0.30319/MSBuild.exe" /verbosity:quiet /nologo /property:Configuration=Debug ../src/Frapid.Web/Areas/ElasticEmail/ElasticEmail.sln /p:VisualStudioVersion=14.0 ) REM if exist "../src/Frapid.Web/Areas/MailjetApp/MailjetApp.sln" ( REM @echo Building MailjetApp Module - REM "%programfiles(x86)%\MSBuild\14.0\Bin\MSBuild.exe" /verbosity:quiet /nologo /property:Configuration=Debug ../src/Frapid.Web/Areas/MailjetApp/MailjetApp.sln /p:VisualStudioVersion=14.0 + REM "%SystemRoot%/Microsoft.Net/Framework/v4.0.30319/MSBuild.exe" /verbosity:quiet /nologo /property:Configuration=Debug ../src/Frapid.Web/Areas/MailjetApp/MailjetApp.sln /p:VisualStudioVersion=14.0 REM ) if exist "../src/Frapid.Web/Areas/SparkPostMail/SparkPostMail.sln" ( @echo Building SparkPostMail Module - "%programfiles(x86)%\MSBuild\14.0\Bin\MSBuild.exe" /verbosity:quiet /nologo /property:Configuration=Debug ../src/Frapid.Web/Areas/SparkPostMail/SparkPostMail.sln /p:VisualStudioVersion=14.0 + "%SystemRoot%/Microsoft.Net/Framework/v4.0.30319/MSBuild.exe" /verbosity:quiet /nologo /property:Configuration=Debug ../src/Frapid.Web/Areas/SparkPostMail/SparkPostMail.sln /p:VisualStudioVersion=14.0 ) if exist "../src/Frapid.Web/Areas/TheSmsCentral/TheSmsCentral.sln" ( @echo Building TheSmsCentral Module - "%programfiles(x86)%\MSBuild\14.0\Bin\MSBuild.exe" /verbosity:quiet /nologo /property:Configuration=Debug ../src/Frapid.Web/Areas/TheSmsCentral/TheSmsCentral.sln /p:VisualStudioVersion=14.0 + "%SystemRoot%/Microsoft.Net/Framework/v4.0.30319/MSBuild.exe" /verbosity:quiet /nologo /property:Configuration=Debug ../src/Frapid.Web/Areas/TheSmsCentral/TheSmsCentral.sln /p:VisualStudioVersion=14.0 ) if exist "../src/Frapid.Web/Areas/MixCBS.Banking/MixCBS.Banking.sln" ( @echo Building MixCBS.Banking Module - "%programfiles(x86)%\MSBuild\14.0\Bin\MSBuild.exe" /verbosity:quiet /nologo /property:Configuration=Debug ../src/Frapid.Web/Areas/MixCBS.Banking/MixCBS.Banking.sln /p:VisualStudioVersion=14.0 + "%SystemRoot%/Microsoft.Net/Framework/v4.0.30319/MSBuild.exe" /verbosity:quiet /nologo /property:Configuration=Debug ../src/Frapid.Web/Areas/MixCBS.Banking/MixCBS.Banking.sln /p:VisualStudioVersion=14.0 ) if exist "../src/Frapid.Web/Areas/MixCBS.Deposits/MixCBS.Deposits.sln" ( @echo Building MixCBS.Deposits Module - "%programfiles(x86)%\MSBuild\14.0\Bin\MSBuild.exe" /verbosity:quiet /nologo /property:Configuration=Debug ../src/Frapid.Web/Areas/MixCBS.Deposits/MixCBS.Deposits.sln /p:VisualStudioVersion=14.0 + "%SystemRoot%/Microsoft.Net/Framework/v4.0.30319/MSBuild.exe" /verbosity:quiet /nologo /property:Configuration=Debug ../src/Frapid.Web/Areas/MixCBS.Deposits/MixCBS.Deposits.sln /p:VisualStudioVersion=14.0 ) if exist "../src/Frapid.Web/Areas/MixCBS.Lendings/MixCBS.Lendings.sln" ( @echo Building MixCBS.Lendings Module - "%programfiles(x86)%\MSBuild\14.0\Bin\MSBuild.exe" /verbosity:quiet /nologo /property:Configuration=Debug ../src/Frapid.Web/Areas/MixCBS.Lendings/MixCBS.Lendings.sln /p:VisualStudioVersion=14.0 + "%SystemRoot%/Microsoft.Net/Framework/v4.0.30319/MSBuild.exe" /verbosity:quiet /nologo /property:Configuration=Debug ../src/Frapid.Web/Areas/MixCBS.Lendings/MixCBS.Lendings.sln /p:VisualStudioVersion=14.0 ) if exist "../src/Frapid.Web/Areas/MixERP.Discovery/MixERP.Discovery.sln" ( @echo Building MixERP Discovery Module - "%programfiles(x86)%\MSBuild\14.0\Bin\MSBuild.exe" /verbosity:quiet /nologo /property:Configuration=Debug ../src/Frapid.Web/Areas/MixERP.Discovery/MixERP.Discovery.sln /p:VisualStudioVersion=14.0 + "%SystemRoot%/Microsoft.Net/Framework/v4.0.30319/MSBuild.exe" /verbosity:quiet /nologo /property:Configuration=Debug ../src/Frapid.Web/Areas/MixERP.Discovery/MixERP.Discovery.sln /p:VisualStudioVersion=14.0 ) if exist "../src/Frapid.Web/Areas/Salesific.CRM/Salesific.CRM.sln" ( @echo Building Salesific CRM Module - "%programfiles(x86)%\MSBuild\14.0\Bin\MSBuild.exe" /verbosity:quiet /nologo /property:Configuration=Debug ../src/Frapid.Web/Areas/Salesific.CRM/Salesific.CRM.sln /p:VisualStudioVersion=14.0 + "%SystemRoot%/Microsoft.Net/Framework/v4.0.30319/MSBuild.exe" /verbosity:quiet /nologo /property:Configuration=Debug ../src/Frapid.Web/Areas/Salesific.CRM/Salesific.CRM.sln /p:VisualStudioVersion=14.0 ) if exist "../src/Frapid.Web/Areas/MixERP.Office/MixERP.Office.sln" ( @echo Building MixERP Office Module - "%programfiles(x86)%\MSBuild\14.0\Bin\MSBuild.exe" /verbosity:quiet /nologo /property:Configuration=Debug ../src/Frapid.Web/Areas/MixERP.Office/MixERP.Office.sln /p:VisualStudioVersion=14.0 + "%SystemRoot%/Microsoft.Net/Framework/v4.0.30319/MSBuild.exe" /verbosity:quiet /nologo /property:Configuration=Debug ../src/Frapid.Web/Areas/MixERP.Office/MixERP.Office.sln /p:VisualStudioVersion=14.0 ) if exist "../src/Frapid.Web/Areas/Frapid.SchemaUpdater/Frapid.SchemaUpdater.sln" ( @echo Building MixERP Frapid.SchemaUpdater Module - "%programfiles(x86)%\MSBuild\14.0\Bin\MSBuild.exe" /verbosity:quiet /nologo /property:Configuration=Release ../src/Frapid.Web/Areas/Frapid.SchemaUpdater/Frapid.SchemaUpdater.sln /p:VisualStudioVersion=14.0 + "%SystemRoot%/Microsoft.Net/Framework/v4.0.30319/MSBuild.exe" /verbosity:quiet /nologo /property:Configuration=Release ../src/Frapid.Web/Areas/Frapid.SchemaUpdater/Frapid.SchemaUpdater.sln /p:VisualStudioVersion=14.0 ) diff --git a/src/Frapid.Web/Areas/ElasticEmail/ElasticEmail.csproj b/src/Frapid.Web/Areas/ElasticEmail/ElasticEmail.csproj index 88b0670b..35e8ed93 100644 --- a/src/Frapid.Web/Areas/ElasticEmail/ElasticEmail.csproj +++ b/src/Frapid.Web/Areas/ElasticEmail/ElasticEmail.csproj @@ -29,7 +29,7 @@ true full false - bin\ + ..\..\bin\ DEBUG;TRACE prompt 4 @@ -37,7 +37,7 @@ pdbonly true - bin\ + ..\..\bin\ TRACE prompt 4 @@ -176,8 +176,6 @@ $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - @@ -195,9 +193,6 @@ - - start xcopy /y /r "$(ProjectDir)\bin\*.dll" "$(ProjectDir)..\..\bin" - This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. diff --git a/src/Frapid.Web/Areas/Frapid.Account/Frapid.Account.csproj b/src/Frapid.Web/Areas/Frapid.Account/Frapid.Account.csproj index 603ba408..a0f72960 100644 --- a/src/Frapid.Web/Areas/Frapid.Account/Frapid.Account.csproj +++ b/src/Frapid.Web/Areas/Frapid.Account/Frapid.Account.csproj @@ -258,8 +258,6 @@ $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - diff --git a/src/Frapid.Web/Areas/Frapid.AddressBook/Frapid.AddressBook.csproj b/src/Frapid.Web/Areas/Frapid.AddressBook/Frapid.AddressBook.csproj index 9e0c5052..96b3d328 100644 --- a/src/Frapid.Web/Areas/Frapid.AddressBook/Frapid.AddressBook.csproj +++ b/src/Frapid.Web/Areas/Frapid.AddressBook/Frapid.AddressBook.csproj @@ -29,7 +29,7 @@ true full false - bin\ + ..\..\bin\ DEBUG;TRACE prompt 4 @@ -37,7 +37,7 @@ pdbonly true - bin\ + ..\..\bin\ TRACE prompt 4 @@ -184,8 +184,6 @@ $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - @@ -203,9 +201,6 @@ - - start xcopy /y /r "$(ProjectDir)\bin\*.dll" "$(ProjectDir)..\..\bin" - This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. @@ -213,11 +208,4 @@ - \ No newline at end of file diff --git a/src/Frapid.Web/Areas/Frapid.Authorization/Frapid.Authorization.csproj b/src/Frapid.Web/Areas/Frapid.Authorization/Frapid.Authorization.csproj index 95b70970..f003e652 100644 --- a/src/Frapid.Web/Areas/Frapid.Authorization/Frapid.Authorization.csproj +++ b/src/Frapid.Web/Areas/Frapid.Authorization/Frapid.Authorization.csproj @@ -30,7 +30,7 @@ true full false - bin\ + ..\..\bin\ DEBUG;TRACE prompt 4 @@ -38,7 +38,7 @@ pdbonly true - bin\ + ..\..\bin\ TRACE prompt 4 @@ -182,8 +182,6 @@ $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - @@ -201,9 +199,6 @@ - - start xcopy /y /r "$(ProjectDir)\bin\*.dll" "$(ProjectDir)..\..\bin" - This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. diff --git a/src/Frapid.Web/Areas/Frapid.Calendar/Frapid.Calendar.csproj b/src/Frapid.Web/Areas/Frapid.Calendar/Frapid.Calendar.csproj index 2464f552..67ae3c2d 100644 --- a/src/Frapid.Web/Areas/Frapid.Calendar/Frapid.Calendar.csproj +++ b/src/Frapid.Web/Areas/Frapid.Calendar/Frapid.Calendar.csproj @@ -30,7 +30,7 @@ true full false - bin\ + ..\..\bin\ DEBUG;TRACE prompt 4 @@ -38,7 +38,7 @@ pdbonly true - bin\ + ..\..\bin\ TRACE prompt 4 @@ -231,8 +231,6 @@ $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - @@ -250,9 +248,6 @@ - - start xcopy /y /r "$(ProjectDir)\bin\*.dll" "$(ProjectDir)..\..\bin" - This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. diff --git a/src/Frapid.Web/Areas/Frapid.Config/Frapid.Config.csproj b/src/Frapid.Web/Areas/Frapid.Config/Frapid.Config.csproj index dba98710..db467781 100644 --- a/src/Frapid.Web/Areas/Frapid.Config/Frapid.Config.csproj +++ b/src/Frapid.Web/Areas/Frapid.Config/Frapid.Config.csproj @@ -185,8 +185,6 @@ $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - diff --git a/src/Frapid.Web/Areas/Frapid.Dashboard/Frapid.Dashboard.csproj b/src/Frapid.Web/Areas/Frapid.Dashboard/Frapid.Dashboard.csproj index 17259d70..a502a26d 100644 --- a/src/Frapid.Web/Areas/Frapid.Dashboard/Frapid.Dashboard.csproj +++ b/src/Frapid.Web/Areas/Frapid.Dashboard/Frapid.Dashboard.csproj @@ -210,8 +210,6 @@ $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - diff --git a/src/Frapid.Web/Areas/Frapid.Reports/Frapid.Reports.csproj b/src/Frapid.Web/Areas/Frapid.Reports/Frapid.Reports.csproj index b06445c6..210cbef6 100644 --- a/src/Frapid.Web/Areas/Frapid.Reports/Frapid.Reports.csproj +++ b/src/Frapid.Web/Areas/Frapid.Reports/Frapid.Reports.csproj @@ -30,7 +30,7 @@ true full false - bin\ + ..\..\bin\ DEBUG;TRACE prompt 4 @@ -38,7 +38,7 @@ pdbonly true - bin\ + ..\..\bin\ TRACE prompt 4 @@ -253,8 +253,6 @@ $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - @@ -272,9 +270,6 @@ - - start xcopy /y /r "$(ProjectDir)\bin\*.dll" "$(ProjectDir)..\..\bin" - This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. diff --git a/src/Frapid.Web/Areas/Frapid.SchemaUpdater/Frapid.SchemaUpdater.csproj b/src/Frapid.Web/Areas/Frapid.SchemaUpdater/Frapid.SchemaUpdater.csproj index 9f88a0dd..5975fa10 100644 --- a/src/Frapid.Web/Areas/Frapid.SchemaUpdater/Frapid.SchemaUpdater.csproj +++ b/src/Frapid.Web/Areas/Frapid.SchemaUpdater/Frapid.SchemaUpdater.csproj @@ -29,7 +29,7 @@ true full false - bin\ + ..\..\bin\ DEBUG;TRACE prompt 4 @@ -37,7 +37,7 @@ pdbonly true - bin\ + ..\..\bin\ TRACE prompt 4 @@ -216,8 +216,6 @@ $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - @@ -235,9 +233,6 @@ - - start xcopy /y /r "$(ProjectDir)\bin\*.dll" "$(ProjectDir)..\..\bin" - This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. diff --git a/src/Frapid.Web/Areas/Frapid.WebsiteBuilder/Frapid.WebsiteBuilder.csproj b/src/Frapid.Web/Areas/Frapid.WebsiteBuilder/Frapid.WebsiteBuilder.csproj index 8898e780..8368f7e3 100644 --- a/src/Frapid.Web/Areas/Frapid.WebsiteBuilder/Frapid.WebsiteBuilder.csproj +++ b/src/Frapid.Web/Areas/Frapid.WebsiteBuilder/Frapid.WebsiteBuilder.csproj @@ -369,8 +369,6 @@ $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - diff --git a/src/Frapid.Web/Areas/Google/Google.csproj b/src/Frapid.Web/Areas/Google/Google.csproj index c123a7dc..5bbd8a30 100644 --- a/src/Frapid.Web/Areas/Google/Google.csproj +++ b/src/Frapid.Web/Areas/Google/Google.csproj @@ -29,7 +29,7 @@ true full false - bin\ + ..\..\bin\ DEBUG;TRACE prompt 4 @@ -37,7 +37,7 @@ pdbonly true - bin\ + ..\..\bin\ TRACE prompt 4 @@ -162,8 +162,6 @@ $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - @@ -181,9 +179,6 @@ - - start xcopy /y /r "$(ProjectDir)\bin\*.dll" "$(ProjectDir)..\..\bin" - This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. diff --git a/src/Frapid.Web/Areas/MixERP.Social/MixERP.Social.csproj b/src/Frapid.Web/Areas/MixERP.Social/MixERP.Social.csproj index 5a491d34..73fe2254 100644 --- a/src/Frapid.Web/Areas/MixERP.Social/MixERP.Social.csproj +++ b/src/Frapid.Web/Areas/MixERP.Social/MixERP.Social.csproj @@ -30,7 +30,7 @@ true full false - bin\ + ..\..\bin\ DEBUG;TRACE prompt 4 @@ -194,8 +194,6 @@ $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - @@ -213,9 +211,6 @@ - - start xcopy /y /r "$(ProjectDir)\bin\*.dll" "$(ProjectDir)..\..\bin" - This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. diff --git a/src/Frapid.Web/Areas/SendGridMail/SendGridMail.csproj b/src/Frapid.Web/Areas/SendGridMail/SendGridMail.csproj index b2d57a86..44313f9a 100644 --- a/src/Frapid.Web/Areas/SendGridMail/SendGridMail.csproj +++ b/src/Frapid.Web/Areas/SendGridMail/SendGridMail.csproj @@ -29,7 +29,7 @@ true full false - bin\ + ..\..\bin\ DEBUG;TRACE prompt 4 @@ -37,7 +37,7 @@ pdbonly true - bin\ + ..\..\bin\ TRACE prompt 4 @@ -183,8 +183,6 @@ $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - @@ -202,9 +200,6 @@ - - start xcopy /y /r "$(ProjectDir)\bin\*.dll" "$(ProjectDir)..\..\bin" - This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. diff --git a/src/Frapid.Web/Areas/SparkPostMail/SparkPostMail.csproj b/src/Frapid.Web/Areas/SparkPostMail/SparkPostMail.csproj index e1fd9434..4887c6c3 100644 --- a/src/Frapid.Web/Areas/SparkPostMail/SparkPostMail.csproj +++ b/src/Frapid.Web/Areas/SparkPostMail/SparkPostMail.csproj @@ -29,7 +29,7 @@ true full false - bin\ + ..\..\bin\ DEBUG;TRACE prompt 4 @@ -37,7 +37,7 @@ pdbonly true - bin\ + ..\..\bin\ TRACE prompt 4 @@ -174,8 +174,6 @@ $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - @@ -193,9 +191,6 @@ - - start xcopy /y /r "$(ProjectDir)\bin\*.dll" "$(ProjectDir)..\..\bin" - This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. diff --git a/src/Frapid.Web/Frapid.Web - Copy.csproj b/src/Frapid.Web/Frapid.Web - Copy.csproj deleted file mode 100644 index 2cf42cce..00000000 --- a/src/Frapid.Web/Frapid.Web - Copy.csproj +++ /dev/null @@ -1,558 +0,0 @@ - - - - - - - Debug - AnyCPU - - - 2.0 - {77C7D586-FEE9-40E2-A1C4-699EF4B0A1F3} - {349c5851-65df-11da-9384-00065b846f21};{fae04ec0-301f-11d3-bf4b-00c04f79efbc} - Library - Properties - Frapid.Web - Frapid.Web - v4.6 - false - true - - - - - - - - - - - true - full - false - bin\ - DEBUG;TRACE - prompt - 4 - - - pdbonly - true - bin\ - TRACE - prompt - 4 - - - - ..\packages\Antlr.3.5.0.2\lib\Antlr3.Runtime.dll - True - - - ..\packages\Common.Logging.3.3.1\lib\net40\Common.Logging.dll - True - - - ..\packages\Common.Logging.Core.3.3.1\lib\net40\Common.Logging.Core.dll - True - - - False - ..\packages\MvcDonutCaching.1.3.0\lib\net40\DevTrends.MvcDonutCaching.dll - - - ..\packages\EcmaScript.Net.1.0.1.0\lib\net20\EcmaScript.NET.dll - True - - - ..\packages\Microsoft.AspNet.Identity.Core.2.2.1\lib\net45\Microsoft.AspNet.Identity.Core.dll - True - - - ..\packages\Microsoft.AspNet.Identity.Owin.2.2.1\lib\net45\Microsoft.AspNet.Identity.Owin.dll - True - - - ..\packages\Microsoft.AspNet.SignalR.Core.2.2.1\lib\net45\Microsoft.AspNet.SignalR.Core.dll - True - - - ..\packages\Microsoft.AspNet.SignalR.SystemWeb.2.2.1\lib\net45\Microsoft.AspNet.SignalR.SystemWeb.dll - True - - - ..\packages\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.1.0.2\lib\net45\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.dll - True - - - - ..\packages\Microsoft.IdentityModel.Logging.1.1.0\lib\net451\Microsoft.IdentityModel.Logging.dll - True - - - ..\packages\Microsoft.IdentityModel.Tokens.5.1.0\lib\net451\Microsoft.IdentityModel.Tokens.dll - True - - - ..\packages\Microsoft.Owin.3.0.1\lib\net45\Microsoft.Owin.dll - True - - - ..\packages\Microsoft.Owin.Cors.3.0.1\lib\net45\Microsoft.Owin.Cors.dll - True - - - ..\packages\Microsoft.Owin.Host.SystemWeb.3.0.1\lib\net45\Microsoft.Owin.Host.SystemWeb.dll - True - - - ..\packages\Microsoft.Owin.Security.3.0.1\lib\net45\Microsoft.Owin.Security.dll - True - - - ..\packages\Microsoft.Owin.Security.Cookies.3.0.1\lib\net45\Microsoft.Owin.Security.Cookies.dll - True - - - ..\packages\Microsoft.Owin.Security.Facebook.3.0.1\lib\net45\Microsoft.Owin.Security.Facebook.dll - True - - - ..\packages\Microsoft.Owin.Security.Google.3.0.1\lib\net45\Microsoft.Owin.Security.Google.dll - True - - - ..\packages\Microsoft.Owin.Security.Jwt.3.0.1\lib\net45\Microsoft.Owin.Security.Jwt.dll - True - - - ..\packages\Microsoft.Owin.Security.MicrosoftAccount.3.0.1\lib\net45\Microsoft.Owin.Security.MicrosoftAccount.dll - True - - - ..\packages\Microsoft.Owin.Security.OAuth.3.0.1\lib\net45\Microsoft.Owin.Security.OAuth.dll - True - - - ..\packages\Microsoft.Owin.Security.Twitter.3.0.1\lib\net45\Microsoft.Owin.Security.Twitter.dll - True - - - ..\packages\Microsoft.Web.Infrastructure.1.0.0.0\lib\net40\Microsoft.Web.Infrastructure.dll - True - - - ..\packages\Newtonsoft.Json.10.0.3\lib\net45\Newtonsoft.Json.dll - True - - - ..\packages\Owin.1.0\lib\net40\Owin.dll - True - - - ..\packages\Quartz.2.4.1\lib\net40\Quartz.dll - True - - - ..\packages\Serilog.2.3.0\lib\net46\Serilog.dll - True - - - ..\packages\Serilog.Sinks.File.3.1.1\lib\net45\Serilog.Sinks.File.dll - True - - - ..\packages\Serilog.Sinks.RollingFile.3.2.0\lib\net45\Serilog.Sinks.RollingFile.dll - True - - - ..\packages\StackExchange.Redis.StrongName.1.1.608\lib\net46\StackExchange.Redis.StrongName.dll - True - - - - - - - - - - - ..\packages\System.IdentityModel.Tokens.Jwt.4.0.2.206221351\lib\net45\System.IdentityModel.Tokens.Jwt.dll - True - - - - - ..\packages\Microsoft.AspNet.WebApi.Client.5.2.3\lib\net45\System.Net.Http.Formatting.dll - True - - - - - - ..\packages\Microsoft.AspNet.Cors.5.2.3\lib\net45\System.Web.Cors.dll - True - - - ..\packages\Microsoft.AspNet.WebPages.3.2.3\lib\net45\System.Web.Helpers.dll - True - - - ..\packages\Microsoft.AspNet.WebApi.Core.5.2.3\lib\net45\System.Web.Http.dll - True - - - ..\packages\Microsoft.AspNet.WebApi.Owin.5.2.3\lib\net45\System.Web.Http.Owin.dll - True - - - ..\packages\Microsoft.AspNet.WebApi.WebHost.5.2.3\lib\net45\System.Web.Http.WebHost.dll - True - - - ..\packages\Microsoft.AspNet.Mvc.5.2.3\lib\net45\System.Web.Mvc.dll - True - - - ..\packages\Microsoft.AspNet.Web.Optimization.1.1.3\lib\net40\System.Web.Optimization.dll - True - - - ..\packages\Microsoft.AspNet.Razor.3.2.3\lib\net45\System.Web.Razor.dll - True - - - ..\packages\Microsoft.AspNet.WebPages.3.2.3\lib\net45\System.Web.WebPages.dll - True - - - ..\packages\Microsoft.AspNet.WebPages.3.2.3\lib\net45\System.Web.WebPages.Deployment.dll - True - - - ..\packages\Microsoft.AspNet.WebPages.3.2.3\lib\net45\System.Web.WebPages.Razor.dll - True - - - - - - - - - - - - - ..\packages\WebGrease.1.6.0\lib\WebGrease.dll - True - - - ..\packages\YUICompressor.NET.2.7.0.0\lib\NET20\Yahoo.Yui.Compressor.dll - True - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Designer - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Designer - - - Web.config - - - Web.config - - - - - - - - - - {ef3d84f8-3d64-45d7-9050-3ae204f5aa72} - Frapid.ApplicationState - - - {0361910A-7773-4EE9-861B-FFC5636D82D1} - Frapid.Areas - - - {4e863154-9d48-4023-bb76-8405a98bcaff} - Frapid.AssetBundling - - - {8993ad31-c303-4ca0-92d9-c100585a78e5} - Frapid.Backups - - - {ca3c3d39-6775-4234-b343-38f0724adcf8} - Frapid.Configuration - - - {9BEA3809-B6D5-4025-AE7E-868E5E7E9C76} - Frapid.DataAccess - - - {e2c5690c-ef80-4afa-8107-5e58a936b15f} - Frapid.DbPolicy - - - {a4dee358-3203-425c-80e9-8eba0a01b73f} - Frapid.Framework - - - {88DFDF57-A52B-4D71-A0C4-BEF1A3839506} - Frapid.i18n - - - {BFFE76A6-7E9D-42FA-AB3A-108BD2125923} - Frapid.Installer - - - {9408fede-8a04-460d-8fd9-1c710c1baaeb} - Frapid.Messaging - - - {EF3BDE7C-A3D5-493A-8817-BF47DF9CAE47} - Frapid.TokenManager - - - {BA48911F-16A7-4CC7-A04C-6559BAE1F89F} - Frapid.WebApi - - - - 10.0 - $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - - - - - - - - - - - False - True - 51255 - / - http://localhost:51255/ - False - True - https://localhost - False - - - - - - - - - - - - This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. - - - - - - \ No newline at end of file diff --git a/src/Frapid.Web/Frapid.Web.csproj b/src/Frapid.Web/Frapid.Web.csproj index 2cf42cce..04153339 100644 --- a/src/Frapid.Web/Frapid.Web.csproj +++ b/src/Frapid.Web/Frapid.Web.csproj @@ -515,8 +515,6 @@ $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - diff --git a/src/Frapid.Web/Packages/i18n/en.yaml b/src/Frapid.Web/Packages/i18n/en.yaml index c5404671..3eb14c7d 100644 --- a/src/Frapid.Web/Packages/i18n/en.yaml +++ b/src/Frapid.Web/Packages/i18n/en.yaml @@ -1,7 +1,5 @@ AbsenteeismReason: "Absenteeism Reason" -AccessDenied: "Access is denied." AccessDeniedCannotWithdrawSomeoneElseTransaction: "Access is denied. You cannot withdraw someone else's transaction." -AccessedOn: "Accessed On" AccessIsDenied: "Access is denied" AccessTokenId: "Access Token Id" AccessTypeId: "Access Type Id" @@ -24,7 +22,6 @@ AccountReconciliation: "Account Reconciliation" AccountStatement: "Account Statement" AccountVerification: "Account Verification" Action: "Action" -ActionId: "Action Id" Actions: "Actions" Actual: "Actual" Add: "Add" @@ -35,12 +32,9 @@ AddANewTheme: "Add a New Theme" AddCategory: "Add Category" AddedOn: "Added On" AddEvent: "Add Event" -AddExpenses: "Add Expenses" AddFundGiftCards: "Add Fund to Gift Cards" AddFundsGiftCard: "Add Funds to Gift Card" AddGiftCardFund: "Add Gift Card Fund" -AdditionalInfo: "Additional Info" -AdditionalRawMaterials: "Additional Raw Materials" AddNew: "Add New" AddNewAdjustment: "Add New Adjustment" AddNewBlogPost: "Add a New Blog Post" @@ -67,16 +61,13 @@ AddressBook: "AddressBook" AddressInformation: "Address Information" AddressLine1: "Address Line 1" AddressLine2: "Address Line 2" -AddScraps: "Add Scraps" AddTax: "Add Tax" -AddToRestoreSet: "Add to Restore Set" AdminEmail: "Admin Email" Advice: "Advice" AfterField: "After Field" Agendas: "Agendas" Alarm: "Alarm" Alias: "Alias" -AllBookingsExceptVipHaveBeenCancelledForThisShow: "All bookings except VIP have been cancelled for this show." AllContacts: "All Contacts" AllDay: "All Day" AllGiftCards: "All Gift Cards" @@ -89,16 +80,11 @@ AllowPurchase: "Allow Purchase" AllowRegistration: "Allow Registration" AllowSales: "Allow Sales" AllowTransactionPosting: "Allow Transaction Posting" -AllSeats: "All Seats" AllStories: "All Stories" -AllTables: "All Tables" -AlsoKnownAs: "Also Known As" Amount: "Amount" AmountInCurrency: "Amount In Currency" AmountInLocalCurrency: "Amount In Local Currency" And: "And" -Anusuchi7: "Anusuchi 7" -AnusuchiSeven: "Anusuchi 7" App: "App" AppDependencyId: "App Dependency Id" AppId: "App Id" @@ -106,7 +92,6 @@ ApplicationId: "Application Id" ApplicationName: "Application Name" ApplicationUrl: "Application Url" AppliedOn: "Applied On" -Apply: "Apply" AppName: "App Name" ApprovalMemo: "Approval Memo" Approve: "Approve" @@ -114,10 +99,7 @@ ApprovedBy: "Approved By" ApproveTransaction: "Approve Transaction" AppSecret: "App Secret" AreYouSure: "Are you sure?" -AreYouSureYouWantCancelAllBookings: "Are you sure you want to cancel all bookings?" AreYouSureYouWantDeleteTab: "Are you sure you want to delete this tab?" -AreYouSureYouWantToDeleteFileFromRestoreSet: "Are you sure you want to delete this file from the restore set?" -Arrangement: "Arrangement" AssetId: "Asset Id" AssetName: "Asset Name" AssociatedApp: "Associated App" @@ -125,7 +107,6 @@ AssociatedMenuId: "Associated Menu Id" AssociatedPriceTypeCode: "Associated Price Type Code" AssociatedPriceTypeId: "Associated Price Type Id" AssociatedPriceTypeName: "Associated Price Type Name" -AssociatedScreenId: "Associated Screen Id" AssociatedUser: "Associated User" AssociatedUserId: "Associated User Id" Attach: "Attach" @@ -143,10 +124,6 @@ AttributeName: "Attribute Name" Attributes: "Attributes" AttributeValue: "Attribute Value" Audience: "Audience" -AudioLanguage: "Audio Language" -AuditFileOffset: "Audit File Offset" -AuditReport: "Audit Report" -AuditTime: "Audit Time" AuditTs: "Audit Ts" AuditUserId: "Audit User Id" Author: "Author" @@ -164,13 +141,6 @@ AutoVerificationPolicy: "Auto Verification Policy" AutoVerificationPolicyId: "Auto Verification Policy Id" Awesome: "Awesome !" Back: "Back" -BackHome: "Back to Home" -BackupAndRecovery: "Backup & Recovery" -BackupCompletedSuccessfully: "Backup completed successfully." -BackupDatabase: "Backup Database" -BackupList: "Backup List" -BackupListWelcomeMessage: "Welcome to frapid database backup utility. Depending on your configuration settings, you might be able to download the following backups. If you are unable to download these backups, please access your web server and find the backup on the path:" -BackupWillBePlacedOn: "Your backup will be placed on {0}" BadRequest: "Bad Request" Balance: "Balance" BalanceSheet: "Balance Sheet" @@ -191,11 +161,6 @@ BankReferenceNumber: "Bank Reference Number" BankTransactionCode: "Bank Transaction Code" BankTypeId: "Bank Type Id" BankTypeName: "Bank Type Name" -Banner: "Banner" -Banner2: "Banner 2" -Banner3: "Banner 3" -Banner4: "Banner 4" -Banner5: "Banner 5" Barcode: "Barcode" BaseCurrency: "Base Currency" BaseQuantity: "Base Quantity" @@ -203,16 +168,10 @@ BaseUnitCode: "Base Unit Code" BaseUnitId: "Base Unit Id" BaseUnitName: "Base Unit Name" BaseUrl: "Base Url" -BatchDiscount: "Batch Discount" BatchNumber: "Batch Number" -BatchTotal: "Batch Total" BeforeField: "Before Field" BeganOn: "Began On" -BeginningCash: "Beginning Cash" BeginsFrom: "Begins From" -BillNo: "Bill No" -BillOfMaterial: "Bill of Material" -BillOfMaterials: "Bill of Materials" BirthDay: "Birth Day" Blog: "Blog" BlogCategoryId: "Blog Category Id" @@ -221,14 +180,9 @@ BlogDescription: "Blog Description" BlogId: "Blog Id" Blogs: "Blogs" BlogTitle: "Blog Title" -BodCash: "Bod Cash" BODCash: "BOD Cash" -BodCashId: "Bod Cash Id" -BomCannotBeItsOwnChild: "A BOM cannot be its own child." BomCode: "Bom Code" BomComponentId: "Bom Component Id" -BomComponents: "BOM Components" -BomFinishedGoodId: "Bom Finished Good Id" BomFinishGoodId: "Bom Finish Good Id" BomId: "Bom Id" BomName: "Bom Name" @@ -236,15 +190,8 @@ BomType: "Bom Type" BomTypeCode: "Bom Type Code" BomTypeId: "Bom Type Id" BomTypeName: "Bom Type Name" -BomTypes: "BOM Types" Book: "Book" BookDate: "Book Date" -BookedBy: "Booked By" -BookedOn: "Booked On" -BookingId: "Booking Id" -BookingInformation: "Booking Information" -BookTickets: "Book Tickets" -BoxOfficeSales: "Box Office Sales" BrandCode: "Brand Code" BrandId: "Brand Id" BrandName: "Brand Name" @@ -257,19 +204,10 @@ ByCash: "By Cash" Calendar: "Calendar" CalendarNotificationEmailSubject: "Calendar Event Reminder: {0} at {1}" Cancel: "Cancel" -CancelBookings: "Cancel Bookings" Canceled: "Canceled" CanceledOn: "Canceled On" -CancelInvoice: "Cancel Invoice" CancellationReason: "Cancellation Reason" Cancelled: "Cancelled" -CancelledBy: "Cancelled By" -CancelledOn: "Cancelled On" -CancelledTransactions: "Cancelled Transactions" -CancelProduction: "Cancel Production" -CancelThisProcess: "Cancel This Process" -CancelTicket: "Cancel Ticket" -CancelTicketing: "Cancel Ticketing" CancelWithdrawTransaction: "Cancel/Withdraw Transaction" CanExpire: "Can Expire" CannotAddItemBecausePriceIsZero: "Cannot add item because the price is zero." @@ -280,9 +218,6 @@ CannotDeleteBecauseEventsUnderCategory: "Cannot delete this item because there a CannotDeleteThemeBecauseOfError: "Cannot delete this theme because of an error." CannotFindPostgreSQLBackupDirectory: "Cannot find a suitable directory to create a PostgreSQL DB Backup." CannotFindThemeDirectoryCheckLogs: "Cannot find the theme directory. Check application logs for more information." -CannotMergeBookingUnderDiffrentAddresses: "Cannot merge booking under diffrent addresses." -CannotMergeBookingUnderDiffrentNames: "Cannot merge booking under diffrent names." -CannotMergeBookingUnderDiffrentPhones: "Cannot merge booking under diffrent phones." CannotRemoveThemeInUse: "Access is denied. You cannot remove this theme because it is in use." CannotSave: "Cannot Save" CannotValidateYourFile: "Cannot Validate Your File" @@ -311,11 +246,7 @@ CashFlowSetup: "Cash Flow Setup" CashFlowSetupId: "Cash Flow Setup Id" CashFlowSetups: "Cash Flow Setups" CashFlowStatement: "Cash Flow Statement" -Cashier: "Cashier" -CashierClosing: "Cashier Closing" -CashierClosingReport: "Cashier Closing Report" CashierCode: "Cashier Code" -CashierCodeUpper: "CASHIER CODE" CashierId: "Cashier Id" CashierLoginInfoId: "Cashier Login Info Id" Cashiers: "Cashiers" @@ -326,7 +257,6 @@ CashRepositoryId: "Cash Repository Id" CashRepositoryName: "Cash Repository Name" CashTender: "Cash Tender" CashTransactionCannotContainBankTransactionDetails: "A cash transaction cannot contain bank transaction details." -Categories: "Categories" Category: "Category" CategoryAlias: "Category Alias" CategoryId: "Category Id" @@ -338,7 +268,6 @@ Change: "Change" ChangeContrast: "Change Contrast" ChangeMyPassword: "Change My Password" ChangePassword: "Change Password" -ChangeShow: "Change Show" ChangeStatusTo: "Change Status To" ChartOfAccounts: "Chart of Accounts" Check: "Check" @@ -358,28 +287,21 @@ CheckNumber: "Check Number" Checkout: "Checkout" CheckoutDetailId: "Checkout Detail Id" CheckoutId: "Checkout Id" -CheckoutSummary: "Checkout Summary" CheckOutTime: "Check Out Time" Cheque: "Check" -Cinema: "Cinema" -CinemaShowDate: "Cinema Show Date" City: "City" Claims: "Claims" -ClassType: "Class Type" Clear: "Clear" ClearFilters: "Clear Filters" ClearScreen: "Clear Screen" -ClearTvScreen: "Clear TV Screen" ClientToken: "Client Token" Close: "Close" Closed: "Closed" ClosedOut: "Closed Out Report" CloseThisTooltip: "Close This Tooltip" -ClosingCash: "Closing Cash" ClosingCashId: "Closing Cash Id" ClosingSummary: "Closing Summary" Cls: "Cls" -Code: "Code" CogsCalculationMethod: "Cogs Calculation Method" Coins: "Coins" CollectedBankInstrumentCode: "Collected Bank Instrument Code" @@ -406,13 +328,10 @@ Completed: "Completed" CompletedBy: "Completed By" CompletedDateTime: "Completed Date Time" CompletedOn: "Completed On" -CompletedOrders: "Completed Orders" CompletesOn: "Completes On" -CompleteThisOrder: "Complete This Order" ComponentBomId: "Component Bom Id" ComponentId: "Component Id" ComponentItemId: "Component Item Id" -ComponentOrBom: "Component/BOM" CompoundUnitId: "Compound Unit Id" CompoundUnitsOfMeasure: "Compound Units of Measure" Condition: "Condition" @@ -433,7 +352,6 @@ ConfirmFileDelete: "Are you sure you want to delete the following file? {0}" ConfirmPassword: "Confirm Password" ConfirmPasswordDoesNotMatch: "Confirm password does not match with the supplied password" -ConfirmPasswordDoesNotMatchWithSuppliedPassword: "Confirm password does not match with supplied password." ConfirmRegistrationAtSite: "Confirm your registration at {0}." ConfirmThemeDelete: "Are you sure you want to delete the \"\" theme?" ContactAddressLine1: "Contact Address Line 1" @@ -449,8 +367,6 @@ ContactId: "Contact Id" ContactInformation: "Contact Information" ContactLastName: "Contact Last Name" ContactMiddleName: "Contact Middle Name" -ContactName: "Contact Name" -ContactNumber: "Contact Number" ContactPerson: "Contact Person" ContactPhone: "Contact Phone" ContactPhoneNumbers: "Contact Phone Numbers" @@ -476,7 +392,6 @@ ConvertedToHomeCurrency: "Converted to Home Currency" ConvertOrder: "Convert to Order" ConvertSales: "Convert to Sales" CookieMessage: "We use cookies in our website. Please read the terms of service before you create an account." -CoolDownTime: "Cool Down Time" CoolDownTimeInMinutes: "Cool Down Time In Minutes" CostCenter: "Cost Center" CostCenterCode: "Cost Center Code" @@ -484,9 +399,6 @@ CostCenterId: "Cost Center Id" CostCenterName: "Cost Center Name" CostCenters: "Cost Centers" CostFactor: "Cost Factor" -CostFactorCannotGreterThanHundred: "Cost factor cannot be greter than 100." -CostFactorMustHundred: "Cost factor must be 100." -CostFactorTotalProductionCostDivideIntoFinishedGoods: "Cost factor is total production cost to be divided (in percentage) into finished goods." CostOfGoodsSold: "Cost Of Goods Sold" CostOfGoodsSoldAccountId: "Cost Of Goods Sold Account Id" CostOfSaleId: "Cost Of Sale Id" @@ -521,11 +433,9 @@ CouldNotUploadThemeInvalidExtension: "Could not upload theme because the uploade Count: "Count" Counter: "Counter" CounterCode: "Counter Code" -CounterCodeUpper: "COUNTER CODE" CounterId: "Counter Id" CounterName: "Counter Name" Counters: "Counters" -Countries: "Countries" Country: "Country" CountryCode: "Country Code" CountryId: "Country Id" @@ -553,7 +463,6 @@ CreateNewBlogPost: "Create a New Blog Post" CreateNewDashboardConsole: "Create a New Dashboard Console" CreateNewPage: "Create a New Page" CreateNewReminder: "Create a New Reminder" -CreateNewUser: "Create a New User" CreateTheme: "Create Theme" CreateYourAccountOnOurSite: "Create your account on our site." Credit: "Credit" @@ -577,7 +486,6 @@ CurrencyCode: "Currency Code" CurrencyId: "Currency Id" CurrencyName: "Currency Name" CurrencySymbol: "Currency Symbol" -Current: "Current" CurrentArea: "CurrentArea" CurrentAssetId: "Current Asset Id" CurrentAssetName: "Current Asset Name" @@ -598,7 +506,6 @@ CustomerContacts: "Customer Contacts" CustomerId: "Customer Id" CustomerLoyalty: "Customer Loyalty" CustomerName: "Customer Name" -CustomerPan: "Customer Pan" CustomerPaysFee: "Customer Pays Fee" CustomerPaysFees: "Customer Pays Fees" CustomerReceipts: "Customer Receipts" @@ -614,11 +521,8 @@ CustomFields: "Custom Fields" CustomFieldSetupId: "Custom Field Setup Id" CycleDurationInHour: "Cycle Duration In Hour" Dashboard: "Dashboard" -DashboardUpper: "DASHBOARD" -Database: "Database" DataImport: "Data Import" DataType: "Data Type" -Date: "Date" DateOfBirth: "Date Of Birth" Day: "Day" DayId: "Day Id" @@ -635,16 +539,12 @@ DefaultEmploymentStatusCodeId: "Default Employment Status Code Id" DefaultOffice: "Default Office" DefultRole: "Defult Role" DelayInMinutes: "Delay In Minutes" -DelayThisProcess: "Delay This Process" Delete: "Delete" DeleteContact: "Delete Contact" Deleted: "Deleted" DeletedBy: "Deleted By" DeletedOn: "Deleted On" -DeletedRecords: "Deleted Records" -DeletedRecordsReport: "Deleted Records Report" DeleteFirstSelectedCategory: "Delete the First Selected Category" -DeleteItem: "Delete Item" DeleteTheme: "Delete Theme" DeleteThisChecklist: "Delete This Checklist" DeleteThisEvent: "Delete This Event" @@ -672,7 +572,6 @@ Department: "Department" DepartmentCode: "Department Code" DepartmentId: "Department Id" DepartmentName: "Department Name" -Departments: "Departments" DependsOn: "Depends On" Description: "Description" DesiredResignDate: "Desired Resign Date" @@ -680,13 +579,9 @@ DestinationStoreId: "Destination Store Id" DetailedPaymentReport: "Detailed Payment Report" Details: "Details" Difference: "Difference" -Differential: "Differential" DirectCostId: "Direct Cost Id" DirectCostName: "Direct Cost Name" -Directors: "Directors" DisallowAccess: "Disallow Access" -Disassamble: "Disassamble" -Disassemble: "Disassemble" DisassemblyDetailId: "Disassembly Detail Id" DisassemblyExpensesId: "Disassembly Expenses Id" DisassemblyId: "Disassembly Id" @@ -700,10 +595,6 @@ DisplayContactForm: "Display Contact Form" DisplayEmail: "Display Email" DisplayName: "Display Name" DisplayReminderOtherUsers: "Display This Reminder to Other Users" -DistributorCode: "Distributor Code" -DistributorId: "Distributor Id" -DistributorName: "Distributor Name" -Distributors: "Distributors" DividendsPaidId: "Dividends Paid Id" DividendsPaidName: "Dividends Paid Name" DividendsReceivedId: "Dividends Received Id" @@ -715,14 +606,11 @@ DomainId: "Domain Id" DomainName: "Domain Name" DoNotShareWithOtherUsers: "Do not share with other users" DontRepeat: "Don't Repeat" -Download: "Download" DownloadAndInstall: "Download and Install" DownloadExcel: "Download Excel" -DownloadLatestBackup: "Download the latest backup." DownloadPdf: "Download PDF" DownloadText: "Download Text" DownloadThemeFrom: "Download Theme From" -DownloadThisBackup: "Download this backup" DownloadWord: "Download Word" DownloadXml: "Download XML" DrAccount: "Dr Account" @@ -784,7 +672,6 @@ EmploymentStatusCodeName: "Employment Status Code Name" EmploymentStatuses: "Employment Statuses" EmploymentStatusId: "Employment Status Id" EmploymentStatusName: "Employment Status Name" -EmptySeat: "Empty Seat" Enabled: "Enabled" EnableTicketPrinting: "Enable Ticket Printing" EndDate: "End Date" @@ -793,28 +680,22 @@ EndsOn: "Ends On" EnterAmount: "Enter Amount" EnterCategoryName: "Enter Category Name" EnterDescriptionReminder: "Enter Description for Reminder" -EnterDetailsToContinue: "Enter Details to Continue" EnterDiscount: "Enter Discount" EnteredBy: "Entered By" EnterEventTitle: "Enter Event Title" EnterGiftCardNumber: "Enter a Gift Card Number" -EnterInvoiceNumber: "Enter Invoice Number" EnterLocation: "Enter Location" EnterNewBookDate: "Enter New Book Date" EnterNote: "Enter Note" EnterQuantity: "Enter Quantity" EnterRateDiscount: "Enter Rate of Discount" -EnterReasonToCancelInvoice: "Enter Reason to Cancel the Invoice" -EnterSchemaName: "Enter Schema Name" EnterSubject: "Enter Subject" -EnterTableName: "Enter Table Name" EnterTransactionId: "Enter Transaction Id" EnterUrl: "Enter Url" EnterYourEmailAddress: "Enter Your Email Address" EnterYourEmailAddressAgain: "Enter Your Email Address Again" EnterYourEmailAddressToUnsubscribe: "Enter your email address to unsubscribe" EnterYourMessage: "Enter Your Message" -EnterYourPinToContinue: "Enter your PIN to continue" Entity: "Entity" EntityAccessGroupPolicy: "Entity Access - Group Policy" EntityAccessPolicy: "Entity Access Policy" @@ -822,9 +703,7 @@ EntityAccessPolicyId: "Entity Access Policy Id" EntityName: "Entity Name" EOD: "EOD" EODBegunSaveYourWork: "

Please close this window and save your existing work before you will be signed off automatically.

" -EodCash: "EOD Cash" EODCash: "EOD Cash" -EodCashId: "Eod Cash Id" EODConsole: "EOD Console" EODOperationBegunNow: "EOD operation has begun now." EODProcessing: "EOD Processing" @@ -838,7 +717,6 @@ ErrorEncounteredDuringSave: "Error encountered during save." EventDate: "Event Date" EventId: "Event Id" EventsAndSchedules: "Events & Schedules" -EventTime: "Event Time" EventTimestamp: "Event Timestamp" EventUserId: "Event User Id" ExchangeRate: "Exchange Rate" @@ -863,9 +741,7 @@ ExpectedFrom: "Expected From" ExpectedTo: "Expected To" ExpenseId: "Expense Id" ExpenseName: "Expense Name" -ExpensesAccount: "Expenses A/C" ExpensesInProgressId: "Expenses In Progress Id" -ExpensesOnDisassamble: "Expenses On Disassamble" ExpensesTitle: "Expenses Title" Experiences: "Experiences" ExpiresOn: "Expires On" @@ -892,7 +768,6 @@ FactoryAddress: "Factory Address" Fax: "Fax" FaxNumbers: "Fax Numbers" FbUserId: "Fb User Id" -Fdt: "Fdt" FeedId: "Feed Id" Female: "Female" FieldLabel: "Field Label" @@ -907,9 +782,6 @@ FileManager: "File Manager" FileName: "File Name" FileOrDirectoryNotFound: "File or directory could not be found." FilePath: "File Path" -FilmFormatId: "Film Format Id" -FilmFormatName: "Film Format Name" -FilmFormats: "Film Formats" Filter: "Filter" FilterAndValue: "Filter And Value" FilterCondition: "Filter Condition" @@ -926,8 +798,6 @@ FinancialExpenseName: "Financial Expense Name" FinancialIncomeId: "Financial Income Id" FinancialIncomeName: "Financial Income Name" FindDuplicates: "Find Duplicates" -FinishedGoods: "Finished Goods" -FinishedGoodsStore: "Finished Goods Store" FinishedGoodStore: "Finished Good Store" FinishedGoodStoreId: "Finished Good Store Id" First: "First" @@ -948,8 +818,6 @@ Flag: "Flag" FlagRemoved: "Flag was removed." FlagSaved: "Flag was saved." FolderName: "Folder Name" -Food: "Food" -FoodCourt: "Food Court" ForDate: "For Date" ForeignCurrencyCode: "Foreign Currency Code" ForgotYourPassword: "Forgot Your Password?" @@ -981,15 +849,10 @@ FromEmailAddress: "From Email Address" FromLocalHardDrive: "From Local Hard Drive" FromName: "From Name" FromNumber: "From Number" -FullBackup: "Full Backup" Gender: "Gender" GenderCode: "Gender Code" GenderName: "Gender Name" GeneralInformation: "General Information" -GenreCode: "Genre Code" -GenreId: "Genre Id" -GenreName: "Genre Name" -Genres: "Genres" GetMeOutOfHere: "Get Me out of Here" GiftCard: "Gift Card" GiftCardBalance: "Gift Card Balance" @@ -1037,12 +900,10 @@ HardOfHearing: "Hard Of Hearing" HasChild: "Has Child" HasVat: "Has Vat" Header: "Header" -Help: "Help" HereIsALinkIThinkYouMightLikeToKnowAbout: "Here is a link I think you might like to know about:" Hide: "Hide" HideForNow: "Hide for Now" Hits: "Hits" -Home: "Home" HomePage: "Home Page" HomePhone: "Home Phone" HopeToSeeYouSoon: "Hope to see you soon." @@ -1051,7 +912,6 @@ Hour: "Hour" HourlyCost: "Hourly Cost" Hours: "hours" HoursBeforeSchedule: "hours before the schedule" -HowToRestoreDatabaseManually: "How to Restore My Database in Frapid Manually?" HRM: "HRM" Hundred: "100" HundredthName: "Hundredth Name" @@ -1071,8 +931,6 @@ Import: "Import" ImportContactsFromVcard: "Import Contacts from a vCard File" ImportData: "Import Data" ImportedNItems: "Successfully imported {0} items." -ImporterName: "Importer Name" -ImporterNumber: "Importer Number" ImportFailed: "Import Failed!" ImportTransactions: "Import Transactions" ImportTransactionsDescription: "You can bulk import journal transaction from a CSV file into MixERP. Click \"Export Template\" button to download a CSV template file. Create a file that matches with the export template. Import the CSV file." @@ -1093,7 +951,6 @@ InitializeEODProcessing: "Initialize EOD Processing" InstallationDate: "Installation Date" Institution: "Institution" InstrumentCode: "Instrument Code" -InsufficientAmount: "Insufficient Amount." InsufficientBalanceInCashRepository: "Insufficient balance in cash repository." Integrations: "Integrations" InterestExpenseId: "Interest Expense Id" @@ -1112,7 +969,6 @@ InvalidDate: "Invalid Date" InvalidFile: "Invalid File" InvalidFileExtension: "Invalid file extension." InvalidFileName: "Invalid file name." -InvalidModalState: "Invalid modal state." InvalidModelData: "Invalid model data." InvalidPathCheckLog: "Invalid path. Check the log for more details." InvalidPathCheckLogs: "Invalid path. Check the log for more details." @@ -1136,7 +992,6 @@ InventoryDailyReport: "Inventory Daily Report" InventoryItems: "Inventory Items" InventorySetup: "Inventory Setup" InventorySetupWarning: "Please proceed with extreme caution. Do not change anything here before consulting with your CPA first." -InventorySummary: "Inventory Summary" InventorySystem: "Inventory System" InventoryTransfer: "Inventory Transfer" InventoryTransferDeliveryDetailId: "Inventory Transfer Delivery Detail Id" @@ -1145,22 +1000,17 @@ InventoryTransferRequestDetailId: "Inventory Transfer Request Detail Id" InventoryTransferRequestId: "Inventory Transfer Request Id" InventoryTransfers: "Inventory Transfers" InventoryTransferVerification: "Inventory Transfer Verification" -Invoice: "Invoice" -InvoiceInvalid: "The invoice #{0} is invalid." InvoiceNumber: "Invoice Number" InvoiceNumberAbbreviated: "Inv#" -InvoicePrintInfoId: "Invoice Print Info Id" IpAddress: "Ip Address" IsActive: "Is Active" IsAdministrator: "Is Administrator" -IsAdult: "Is Adult" IsAlcoholic: "Is Alcoholic" IsAphonic: "Is Aphonic" IsAutistic: "Is Autistic" IsBlog: "Is Blog" IsCancelled: "Is Cancelled" IsCognitivelyDisabled: "Is Cognitively Disabled" -IsColumnPermission: "Is Column Permission" IsComplete: "Is Complete" IsCompleted: "Is Completed" IsComponent: "Is Component" @@ -1172,8 +1022,6 @@ IsDefaultAdmin: "Is Default Admin" IsDraft: "Is Draft" IsFlatAmount: "Is Flat Amount" IsFlatDiscount: "Is Flat Discount" -IsForeignMovie: "Is Foreign Movie" -IsFree: "Is Free" IsHomepage: "Is Homepage" IsInventoryTransaction: "Is Inventory Transaction" IsLegallyRecognizedMarriage: "Is Legally Recognized Marriage" @@ -1191,8 +1039,6 @@ IsRawMaterial: "Is Raw Material" IsSales: "Is Sales" IsSmoker: "Is Smoker" IssuedBy: "Issued By" -IssuedItemsAgainstOrder: "Issued Items Against Order" -IssueMethod: "Issue Method" IssueMethodCode: "Issue Method Code" IssueMethodId: "Issue Method Id" IssueMethodName: "Issue Method Name" @@ -1202,7 +1048,6 @@ IsTemplate: "Is Template" IsTest: "Is Test" IsTransactionNode: "Is Transaction Node" IsVariantOf: "Is Variant Of" -IsVipBooking: "Is Vip Booking" Item: "Item" ItemCode: "Item Code" ItemCostPriceId: "Item Cost Price Id" @@ -1214,7 +1059,6 @@ ItemGroups: "Item Groups" ItemId: "Item Id" ItemName: "Item Name" ItemSellingPriceId: "Item Selling Price Id" -ItemsToProduce: "Item(s) to Produce" ItemTypeCode: "Item Type Code" ItemTypeId: "Item Type Id" ItemTypeName: "Item Type Name" @@ -1240,9 +1084,7 @@ KanbanCode: "Kanban Code" KanbanDetailId: "Kanban Detail Id" KanbanId: "KanbanId" KanbanName: "KanbanName" -Kanbans: "Kanbans" KanbanView: "Kanban View" -Key: "Key" KeyName: "Key Name" Kind: "Kind" LandingUrl: "Landing Url" @@ -1263,7 +1105,6 @@ LateFeeId: "Late Fee Id" LateFeeName: "Late Fee Name" LateFeePostingFrequencyId: "Late Fee Posting Frequency Id" LateFeeTranId: "Late Fee Tran Id" -LaunchUpper: "LAUNCH" LayoutManager: "Layout Manager" LCCredit: "LC Credit" LCDebit: "LC Debit" @@ -1283,14 +1124,11 @@ LeaveTypeCode: "Leave Type Code" LeaveTypeId: "Leave Type Id" LeaveTypeName: "Leave Type Name" LeaveTypes: "Leave Types" -Legends: "Legends" Less: "Less" LetsDoAgain: "Lets do this again" LetsGo: "Let's Go!" LiabilityId: "Liability Id" LiabilityName: "Liability Name" -Life: "Life" -LifeInDays: "Life In Days" LifetimeCapacity: "Lifetime Capacity" LIFO: "LIFO (Last In/First Out)" Like: "Like" @@ -1305,14 +1143,12 @@ Loading: "Loading" LoadingItems: "Loading items" LoadOlderStories: "Load Older Stories" LocalCurrencyCode: "Local Currency Code" -LocateDatebaseBackupFile: "Locate the database backup file." Location: "Location" LoginDate: "Login Date" LoginId: "Login Id" LoginTimestamp: "Login Timestamp" Logo: "Logo" LogOff: "Log Off" -Logout: "Logout" LongTermLiabilityId: "Long Term Liability Id" LongTermLiabilityName: "Long Term Liability Name" LowInventoryProducts: "Low Inventory Products" @@ -1331,10 +1167,8 @@ Male: "Male" ManageCategories: "Manage Categories" ManagedBy: "Managed By" ManageFilters: "Manage Filters" -Manufacture: "Manufacture" Manufacturer: "Manufacturer" ManufacturingId: "Manufacturing Id" -ManufacturingInfo: "Manufacturing Info #" ManufacturingSummaryId: "Manufacturing Summary Id" MaritalStatus: "Marital Status" MaritalStatusCode: "Marital Status Code" @@ -1342,7 +1176,6 @@ MaritalStatuses: "Marital Statuses" MaritalStatusId: "Marital Status Id" MaritalStatusName: "Marital Status Name" MarkAllAsRead: "Mark All as Read" -MarkAsCompleted: "Mark as Completed" Markdown: "Markdown" MasterStatementReference: "Master Statement Reference" MaterialStore: "Material Store" @@ -1372,8 +1205,6 @@ Message: "Message" MiddleName: "Middle Name" MinimumPurchaseAmount: "Minimum Purchase Amount" MinimumSalary: "Minimum Salary" -Mins: "mins" -Minutes: "minutes" MixERPSocialApp: "MixERP Social App" MobileNumbers: "Mobile Numbers" ModelNumber: "Model Number" @@ -1384,19 +1215,6 @@ MonthsOnChosenDate: "Month(s), On a Chosen Date" MonthsOnChosenDay: "Month(s), On a Chosen Day" MonthStartDate: "Month Start Date" More: "More" -Movie: "Movie" -MovieCategoryCode: "Movie Category Code" -MovieCategoryId: "Movie Category Id" -MovieCategoryName: "Movie Category Name" -MovieCode: "Movie Code" -MovieDate: "Movie Date" -MovieGenres: "Movie Genres" -MovieId: "Movie Id" -MovieName: "Movie Name" -MovieRatingCode: "Movie Rating Code" -MovieRatingId: "Movie Rating Id" -MovieRatingName: "Movie Rating Name" -Movies: "Movies" MyProfilePicture: "My Profile Picture" Name: "Name" NamedFilter: "Filter: {0}." @@ -1415,26 +1233,20 @@ NickName: "Nick Name" NMinutes: "{0} minute(s)." No: "No" NoAccountWithThisEmail: "We do not have an account with this email address." -NoBackupToRestore: "No backup to restore." -NoComponentsDefined: "No components defined." NoDocumentFound: "No document(s) found." NoDontDeleteThisTheme: "No, Don't Delete This Theme" NoEmailProcessorDefined: "No email processor defined." NoFileWasUploaded: "No file was uploaded." -NoFinishedGoodsDefined: "No finished good(s) defined." NoFormFound: "No instance of form was found." NoMoreStoriesToDisplay: "No more stories to display." None: "None" NonOperatingIncomeId: "Non Operating Income Id" NonOperatingIncomeName: "Non Operating Income Name" -NonTaxablePrice: "Non Taxable Price" NonTaxableSales: "Non Taxable Sales" NontaxableTotal: "Nontaxable Total" -NoRawMaterialsDefined: "No raw material(s) defined." NoReminderSet: "No reminder was set" NormallyDebit: "Normally Debit" -NoSuchTicketFound: "No such ticket found." -NotApplicable: "N/A" +NotApplicable: "Not Applicable" Note: "Note" NotEnoughBalanceCashRepository: "Not enough balance in the cash repository" Notes: "Notes" @@ -1446,8 +1258,6 @@ Notifications: "Notifications" NotificationStatusId: "Notification Status Id" NotImplemented: "Not implemented" NotSpecified: "Not Specified" -Object: "Object" -ObjectId: "Object Id" ObjectName: "Object Name" OfAllTime: "Of All Time" Office: "Office" @@ -1458,16 +1268,13 @@ OfficeHours: "Office Hours" OfficeId: "Office Id" OfficeName: "Office Name" Offices: "Offices" -OfficialWebsite: "Official Website" Ok: "OK" OK: "OK" Okay: "Okay" OldPassword: "Old Password" On: "On" OnCredit: "On Credit" -One: "1" -OneHundred: "100" -OneThousand: "1000" +One: "One" OnlyASingleFileMayBeUploaded: "Only a single file may be uploaded." OnlyMe: "Only Me" OnThe: "On the" @@ -1488,31 +1295,21 @@ OrderActionId: "Order Action Id" OrderActionName: "Order Action Name" OrderDate: "Order Date" OrderDetailId: "Order Detail Id" -OrderedBy: "Ordered By" OrderEventId: "Order Event Id" OrderId: "Order Id" OrderKanbanDetailId: "Order Kanban Detail Id" -OrderName: "Order Name" OrderProgressId: "Order Progress Id" -OrderRawMaterialId: "Order Raw Material Id" -OrdersInProcess: "Orders in Process" -OrdersInQueue: "Orders in Queue" -OrdersProgress: "Orders Progress" OrderStatus: "Order Status" OrderStatusCode: "Order Status Code" -OrderStatuses: "Order Statuses" OrderStatusId: "Order Status Id" OrderStatusName: "Order Status Name" -OrderType: "Order Type" OrderTypeCode: "Order Type Code" OrderTypeId: "Order Type Id" OrderTypeName: "Order Type Name" -OrderTypes: "Order Types" Organization: "Organization" OrganizationalUnit: "Organizational Unit" OrganizationName: "Organization Name" OriginalFileName: "Original File Name" -OriginalLanguage: "Original Language" Other: "Other" OtherAssetId: "Other Asset Id" OtherAssetName: "Other Asset Name" @@ -1523,9 +1320,7 @@ OvertimeHours: "Overtime Hours" PageN: "Page {0}" PaidAmountInAboveCurrency: "Paid Amount (In Above Currency)" PaidCurrency: "Paid Currency" -Pan: "PAN" PanNumber: "Pan Number" -PanNumberMustNineDigitFormat: "PAN number must be in 9 digit format." Parent: "Parent" ParentAccount: "Parent Account" ParentAccountId: "Parent Account Id" @@ -1545,7 +1340,6 @@ ParentPlantId: "Parent Plant Id" ParentWorkCenter: "Parent Work Center" ParentWorkCenterDepartmentId: "Parent Work Center Department Id" ParentWorkCenterId: "Parent Work Center Id" -PassageSeatPosition: "Passage Seat Position" Password: "Password" PasswordNotChangedRecheckExistingPassword: "Sorry, we could not change your password. Could you please check your existing password and try again?" PasswordReset: "Password Reset" @@ -1554,7 +1348,6 @@ PasswordValidationMessage: "Password should contain at least 6 characters with o PasswordWasChanged: "Password Was Changed" PathNotFound: "The path to file was not found." PathToFileOrDirectoryInvalid: "Path to the file or directory is invalid." -PayableAccount: "Payable A/C" PayableAccountId: "Payable Account Id" PayableAccountName: "Payable Account Name" PayByCheck: "Pay by Check" @@ -1573,7 +1366,6 @@ PaymentCardName: "Payment Card Name" PaymentChecklist: "Payment Checklist #" PaymentId: "Payment Id" PaymentJournalSummary: "Payment Journal Summary Report" -PaymentMode: "Payment Mode" Payments: "Payments" PaymentTerm: "Payment Term" PaymentTermCode: "Payment Term Code" @@ -1590,8 +1382,6 @@ Periodic: "Periodic" PeronsalInformation: "Peronsal Information" Perpetual: "Perpetual" Phone: "Phone" -Phone1: "Phone 1" -Phone2: "Phone 2" PhoneCell: "Phone Cell" PhoneEmergency: "Phone Emergency" PhoneEmergency2: "Phone Emergency 2" @@ -1601,18 +1391,14 @@ PhoneNumbers: "Phone Numbers" PhoneOfficeExtension: "Phone Office Extension" Photo: "Photo" PhysicalCount: "Physical Count" -Pin: "PIN" PinCode: "Pin Code" Plant: "Plant" PlantCode: "Plant Code" PlantId: "Plant Id" PlantName: "Plant Name" -Plants: "Plants" PleaseAllowPopupsToViewThisFile: "Please allow popups to view this file." -PleaseBeAwareYouCannotUndoActionOnceYouCancelTicket: "Please be aware that you cannot undo this action once you cancel the ticket." PleaseConfirmYourRegistration: "Please Confirm Your Registration" PleaseConfirmYourRegistrationMessage: "

Thank you for registering! A confirmation email has been sent to your email address. Please click on the link in that email to activate your account.

" -PleaseDoNotSelectIncompatiableSeatTypes: "Please do not select incompatiable seat types." PleaseEnterBankName: "Please enter the bank name." PleaseEnterCategoryName: "Please enter a category name." PleaseEnterCheckDate: "Please enter the check date." @@ -1620,13 +1406,11 @@ PleaseEnterCheckNumber: "Please enter the check number." PleaseEnterCodeNewItemVariant: "Please enter a code of the new item variant." PleaseEnterGiftCardNumber: "Please enter the gift card number." PleaseEnterMessage: "Please enter a message." -PleaseEnterName: "Please enter a name" PleaseEnterNameNewItemVariant: "Please enter a name for the new item variant." PleaseEnterSubject: "Please enter a subject." PleaseFindAttachedDocument: "Please find the attached document." PleaseNote: "Please Note" PleaseSelectAtLeastOneContact: "Please select at least one contact." -PleaseSelectAtLeastOneSeat: "Please select at least one seat." PleaseSelectAttribute: "Please select an attribute." PleaseSelectCategoryColor: "Please select a category color." PleaseSelectCategoryToEdit: "Please select a category to edit." @@ -1637,7 +1421,6 @@ PleaseSelectPaymentTerm: "Please select a payment term." PleaseSelectStore: "Please select a store!" PleaseSelectSupplier: "Please select a supplier." PleaseSelectTab: "Please select a tab." -PleaseTryAgain: "Please try again" PleaseWait: "Please wait" PoBox: "Po Box" Position: "Position" @@ -1648,7 +1431,6 @@ PostedByName: "Posted By Name" PostedDate: "Posted Date" PostedOn: "Posted On" PostTransaction: "Post Transaction" -PoweredBy: "Powered By" PreferredSupplierId: "Preferred Supplier Id" Prefix: "Prefix" Previous: "Previous" @@ -1658,20 +1440,8 @@ PriceTypeCode: "Price Type Code" PriceTypeId: "Price Type Id" PriceTypeName: "Price Type Name" PriceTypes: "Price Types" -Pricing: "Pricing" -PricingId: "Pricing Id" -Pricings: "Pricings" -PricingType: "Pricing Type" -PricingTypeCode: "Pricing Type Code" -PricingTypeId: "Pricing Type Id" -PricingTypeName: "Pricing Type Name" -PricingTypes: "Pricing Types" Print: "Print" -Printed: "Printed" -PrintedOn: "Printed On" PrintThisReport: "Print This Report" -Priorities: "Priorities" -Priority: "Priority" PriorityCode: "Priority Code" PriorityId: "Priority Id" PriorityName: "Priority Name" @@ -1680,24 +1450,8 @@ Private: "Private" PrivateOnly: "Private Only" ProceedWithCaution: "Proceed With Caution!" ProcessingYourCSVFile: "Processing your CSV file." -Produce: "Produce" ProducedItemId: "Produced Item Id" -ProducedItems: "Produced Items" ProducedQuantity: "Produced Quantity" -Producers: "Producers" -Production: "Production" -ProductionCompany: "Production Company" -ProductionCompleted: "Production completed " -ProductionCosts: "Production Costs" -ProductionCostsAnalysis: "Production Costs Analysis" -ProductionFinishedNowProceedingNext: "{0} on Production #{1} ({2}) was finished. Now proceeding to {3}{4}." -ProductionFinishedPleaseCompleteProduction: "{0} on Production #{1} ({2}) was finished. Please complete this production" -ProductionOrderCreated: "Production order #{0} was created." -ProductionOrderNumber: "Production Order Number" -ProductionOrders: "Production Orders" -ProductionOrderStatus: "Production Order Status" -ProductionPlant: "Production Plant" -ProductsCostAnalysis: "Products Cost Analysis" ProfileLink: "Profile Link" ProfileName: "Profile Name" ProfileUrl: "Profile Url" @@ -1712,7 +1466,6 @@ Publisher: "Publisher" PublishOn: "Publish On" Purchase: "Purchase" PurchaseAccountId: "Purchase Account Id" -PurchaseBook: "Purchase Book" PurchaseChecklist: "Purchase Checklist" PurchaseDate: "Purchase Date" PurchaseDiscountAccountId: "Purchase Discount Account Id" @@ -1726,8 +1479,6 @@ PurchaseOrderChecklist: "Purchase Order Checklist" PurchaseOrders: "Purchase Orders" PurchaseQuotationChecklist: "Purchase Quotation Checklist" PurchaseQuotations: "Purchase Quotations" -PurchaseRegister: "Purchase Register" -PurchaseRegisterReport: "Purchase Register Report" PurchaseReturn: "Purchase Return" PurchaseReturnChecklist: "Purchase Return Checklist" PurchaseReturnId: "Purchase Return Id" @@ -1745,11 +1496,7 @@ QuotationDetailId: "Quotation Detail Id" QuotationId: "Quotation Id" QuotationStatus: "Quotation Status" Rate: "Rate" -Rated: "Rated" Rating: "Rating" -Ratings: "Ratings" -RawMaterials: "Raw Materials" -RawMaterialStore: "Raw Material Store" RawMaterialStoreId: "Raw Material Store Id" ReadMore: "Read More" Reason: "Reason" @@ -1797,7 +1544,6 @@ RegistrationId: "Registration Id" RegistrationNumber: "Registration Number" RegistrationOfficeId: "Registration Office Id" RegistrationRoleId: "Registration Role Id" -RegularTicketCharge: "Regular Ticket Charge" Reject: "Reject" Rejected: "Rejected" RejectedByUserId: "Rejected By User Id" @@ -1806,10 +1552,8 @@ RejectionReason: "Rejection Reason" RejectTransaction: "Reject Transaction" RelationshipOfficerContactNumber: "Relationship Officer Contact Number" RelationshipOfficerName: "Relationship Officer Name" -ReleaseDate: "Release Date" ReleasedOn: "Released On" Reload: "Reload" -Remarks: "Remarks" Remind10MinutesBefore: "10 Minutes Before" Remind15MinutesBefore: "15 Minutes Before" Remind1DayBefore: "1 Day Before" @@ -1825,8 +1569,6 @@ RemindMeAbout: "Remind Me About" RemindMeLeast: "Remind Me at Least" RemindMeNMinutesBefore: "Remind me minutes before." RemoveAsDefault: "Remove As Default" -RemoveClear: "Remove/Clear" -RemoveRow: "Remove Row" ReorderLevel: "Reorder Level" ReorderQuantity: "Reorder Quantity" ReorderUnitId: "Reorder Unit Id" @@ -1843,11 +1585,6 @@ RequestDate: "Request Date" RequestedOn: "Requested On" RequestId: "Request Id" RequestingImport: "Requesting import. This may take several minutes to complete." -Reserved: "Reserved" -ReservedAndSoldSeat: "Reserved and Sold Seat" -ReservedAndSoldSeatVip: "Reserved and Sold Seat(VIP)" -ReservedSeat: "Reserved Seat" -ReservedSeatVip: "Reserved Seat(VIP)" ResetAccountInstructions: "To reset your password, enter the email address which is registered in our website. We will send you an email on your email address with instructions to help you reset your password." ResetEmailSent: "Reset Email Sent" ResetEmailSentMessage: "

We have sent reset instructions on your email address. Please follow the link on that email to reset your account.

" @@ -1859,11 +1596,6 @@ ResignationId: "Resignation Id" Resignations: "Resignations" ResourceId: "Resource Id" Responsive: "Responsive" -RestoreBackupFileUsingSqlServerManagementStudio: "Restore the backup file using SQL Server Management Studio 2008 or higher." -RestoreConsole: "Restore Console" -RestoreConsoleWarningMessage: "

This action can cause the existing database to halt on rescue mode, thus making it useless. The existing database will be overwritten by the restore process. In order to restore the database, we will need to forcefully close all existing connections. To prevent possible data loss, please make sure that no one else is using the system right now.

" -RestoreDatabase: "Restore Database" -RestoredPleaseLogOffNowLogInBackAgain: "Restored. Please log off now and log in back again." RetainedEarningId: "Retained Earning Id" RetainedEarningName: "Retained Earning Name" RetainedEarningsStatement: "Retained Earnings Statement" @@ -1876,7 +1608,6 @@ ReturnToWebsite: "Return to Website" ReturnTransactionMasterId: "Return Transaction Master Id" RevenueId: "Revenue Id" RevenueName: "Revenue Name" -Revision: "Revision" RevisionCode: "Revision Code" RevisionNumber: "Revision Number" Revoked: "Revoked" @@ -1900,20 +1631,13 @@ RoutingName: "Routing Name" RoutingSequenceCode: "Routing Sequence Code" RoutingSequenceId: "Routing Sequence Id" RoutingSequenceName: "Routing Sequence Name" -RoutingSequences: "Routing Sequences" RoutingTypeCode: "Routing Type Code" RoutingTypeId: "Routing Type Id" RoutingTypeName: "Routing Type Name" -RoutingTypes: "Routing Types" -RowOrder: "Row Order" -RuntimeInMinutes: "Runtime In Minutes" SalaryPayableId: "Salary Payable Id" SalaryPayableName: "Salary Payable Name" Sales: "Sales" SalesAccountId: "Sales Account Id" -SalesBook: "Sales Book" -SalesBookReport: "Sales Book Report" -SalesByCashier: "Sales by Cashier" SalesByOffice: "Sales by Office" SalesChecklist: "Sales Checklist #" SalesCoupons: "Sales Coupons" @@ -1935,7 +1659,6 @@ SalesQuotationId: "Sales Quotation Id" SalesQuotations: "Sales Quotations" SalesReceipt: "Sales Receipt" SalesReceipts: "Sales Receipts" -SalesRegister: "Sales Register" SalesReturn: "Sales Return #" SalesReturnAccountId: "Sales Return Account Id" SalesReturnChecklist: "Sales Return Checklist #" @@ -1952,53 +1675,31 @@ SaveOrder: "Save Order" SaveThisFilter: "Save This Filter" SaveThisPage: "Save This Page" SayHi: "Say Hi" -ScheduleDate: "Schedule Date" ScheduledOn: "Scheduled On" -Schema: "Schema" Scope: "Scope" Score: "Score" ScrapId: "Scrap Id" -Screen: "Screen" -ScreenCode: "Screen Code" -ScreenId: "Screen Id" -ScreenName: "Screen Name" -Screens: "Screens" Search: "Search ..." SearchCategory: "Search Category" SearchCustomer: "Search Customer" SearchGiftCard: "Search Gift Card" SearchResults: "Search Results" -Seat: "Seat" -SeatingArrangement: "Seating Arrangement" -SeatingArrangementCode: "Seating Arrangement Code" -SeatingArrangementId: "Seating Arrangement Id" -SeatingArrangementName: "Seating Arrangement Name" -SeatNumber: "Seat No" -Seats: "Seats" -SeatType: "Seat Type" -SeatTypeCode: "Seat Type Code" -SeatTypeId: "Seat Type Id" -SeatTypeName: "Seat Type Name" -SeatTypes: "Seat Types" Second: "Second" SeenBy: "Seen By" Select: "Select" SelectAccount: "Select Account" SelectAColumn: "Select a Column" SelectAFilter: "Select a Filter" -SelectAll: "Select All" SelectAndClose: "Select & Close" SelectAnOffice: "Select an Office" SelectApi: "Select API" SelectARole: "Select a Role" SelectAUser: "Select a User" -SelectCashier: "Select Cashier" SelectCategory: "Select Category" SelectCostCenter: "Select Cost Center" SelectCustomer: "Select Customer" SelectDebitAccount: "Select Debit Account" SelectedRole: "Selected Role(s)" -SelectedSeat: "Selected Seat" SelectedUsers: "Selected User(s)" SelectItem: "Select Item" SelectLanguage: "Select Language" @@ -2009,13 +1710,11 @@ SelectStore: "Select Store" SelectSupplier: "Select Supplier" SelectTheme: "Select Theme" SelectType: "Select Type" -SelectUser: "Select a User" SelectUsers: "Select Users" SelectVariant: "Select Variant" SelectWidget: "Select a Widget" SelectWidgetConsole: "Select a Widget Console" SelfVerificationLimit: "Self Verification Limit" -Sell: "Sell" SellingPrice: "Selling Price" SellingPriceId: "Selling Price Id" SellingPriceIncludesTax: "Selling Price Includes Tax" @@ -2029,19 +1728,12 @@ SendTextMessage: "Send Text Message" SendThisOnEmail: "Send this on email" SendTo: "Send To" SeoDescription: "Seo Description" -Sequence: "Sequence" SequenceNumber: "Sequence Number" -Sequences: "Sequences" SerialNumber: "Serial Number" SerialNumberId: "Serial Number Id" ServerError: "Server returned an error response. Please try again later." -ServerInstance: "Server Instance" -ServerPrincipal: "Server Principal" -ServerPrincipalId: "Server Principal Id" ServiceEndDate: "Service End Date" ServiceEndedOn: "Service Ended On" -SessionId: "Session Id" -SessionServerPrincipal: "Session Server Principal" SetPassword: "Set Password" Setup: "Setup" SetupAndConfiguration: "Setup & Configuration" @@ -2066,25 +1758,17 @@ ShipperName: "Shipper Name" Shippers: "Shippers" ShippingCharge: "Shipping Charge" ShippingExpenseAccountId: "Shipping Expense Account Id" -ShortName: "Short Name" Show: "Show" -ShowCode: "Show Code" ShowCompact: "Show Compact" -ShowDate: "Show Date" -ShowId: "Show Id" ShowItems: "Show Items" ShowLess: "Show Less" ShowMore: "Show More" -ShowName: "Show Name" ShowNotifications: "Show Notifications" ShowPreviousComments: "Show Previous Comments" -Shows: "Shows" -ShowSummary: "Show Summary" SignIn: "Sign In" SignMeUp: "Sign Me Up" SignOut: "Sign Out" SignUp: "Sign Up" -Size: "Size" SmsNotification: "SMS Notification" SMTP: "SMTP" SmtpConfigId: "Smtp Config Id" @@ -2099,33 +1783,21 @@ SocialLogin: "Social Login" SocialNetworkId: "Social Network Id" SocialNetworkName: "Social Network Name" SocialNetworks: "Social Networks" -Sold: "Sold" -SoldSeat: "Sold Seat" SomethingWentWrong: "Something went wrong. :(" -SorryYouCannotCancelInvoice: "Sorry, you cannot cancel this invoice." Sort: "Sort" SstNumber: "Sst Number" -Stars: "Stars" -Start: "Start" StartDate: "Start Date" StartDateTime: "Start Date Time" StartedBy: "Started By" StartedOn: "Started On" -StartedProductionOrderBomSequenceExpectedCompletion: "{0} started the production order #{1} ({2}). BOM: {3}. Sequence: {4}. Expected completion: {5}." -StartHour: "Start Hour" -StartManufacturing: "Start Manufacturing" -StartMinute: "Start Minute" StartsAt: "Starts At" StartsFrom: "Starts From" -StartYourIisWebServer: "Start your IIS Web Server." State: "State" -Statement: "Statement" StatementReference: "Statement Reference" Status: "Status" StatusCode: "Status Code" StatusCodeId: "Status Code Id" StatusCodeName: "Status Code Name" -StopIisWebServer: "Stop IIS Web Server." StopRecurrenceWhenDateIs: "Stop Recurrence When the Date Is" Store: "Store" StoreCode: "Store Code" @@ -2137,7 +1809,6 @@ StoreTypeCode: "Store Type Code" StoreTypeId: "Store Type Id" StoreTypeName: "Store Type Name" StoreTypes: "Store Types" -Storyline: "Storyline" Street: "Street" Subject: "Subject" SubmittedAmount: "Submitted Amount" @@ -2152,7 +1823,6 @@ Subscriptions: "Subscriptions" SubscriptionType: "Subscription Type" SubscriptionWelcomeEmail: "Subscription Welcome Email" SubTotal: "Sub Total" -Succeeded: "Succeeded" Success: "Success" SuccessfullyProcessedYourFile: "Successfully processed your file." SuccessfullySavedCompiledCssFile: "Successfully saved compiled css file." @@ -2176,11 +1846,7 @@ SupplierwiseCostPrices: "Supplierwise Cost Prices" SupportEmail: "Support Email" Symbol: "Symbol" SyncNow: "Sync Now" -SystemAudit: "System Audit" -SystemAuditLogReport: "SystemAuditLogReport" -SystemAudits: "System Audits" SysType: "Sys Type" -TableInfo: "Table Info" TableName: "Table Name" TableNotFound: "The table was not found." TableSchema: "Table Schema" @@ -2190,28 +1856,16 @@ TagId: "Tag Id" Tags: "Tags" TagsDescription: "Comma separated list of tags." Target: "Target" -TargetDatabasePrincipal: "Target Database Principal" -TargetDatabasePrincipalId: "Target Database Principal Id" -TargetServerPrincipal: "Target Server Principal" -TargetServerPrincipalId: "Target Server Principal Id" TaskCompletedSuccessfully: "Task completed successfully." -TaskCompletedSuccessfullyRefreshView: "Task Completed Successfully. Refresh View?" TaskCompletedSuccessfullyReturnToView: "Task completed successfully. Return to view?" Tasks: "Tasks" Tax: "Tax" -TaxableAmount: "Taxable Amount" -TaxableExport: "Taxable Export" -TaxablePurchase: "Taxable Purchase" TaxableTotal: "Taxable Total" -TaxExemptPurchasePrice: "Tax Exempt Purchase Price" -TaxExemptSales: "Tax Exempt Sales" TaxRate: "Tax Rate" -TaxRegistrationNumber: "Tax Registration Number" TaxSetupId: "Tax Setup Id" Telephone: "Telephone" TelephoneNumbers: "Telephone Number(s)" Telephones: "Telephones" -Television: "Television" Ten: "10" Tenant: "Tenant" Tender: "Tender" @@ -2222,13 +1876,10 @@ Terms: "Terms" TermsAndConditions: "Terms & Conditions" TermsConditions: "Terms & Conditions" TermsOfServiceUrl: "Terms Of Service Url" -ThankYou: "Thank You" ThankYouForContactingUs: "Thank you for contacting us." -ThankYouForLoggingOut: "Thank you for logging out." ThankYouForRegistering: "

Thank you registering on our website. Your account has been successfully activated.

" ThankYouForUnsubscribing: "Thank you for unsubscribing." ThankYourForSubscribingToSite: "Thank you for subscribing to {0}" -TheInvoiceCancelled: "The invoice was cancelled." ThemeConvertedBy: "Theme Converted By" ThemeConvertedByTitle: "If this theme was ported from another platform, enter the name of the person or company who converted this theme to frapid." ThemeDeleteWarning: "You are about to delete the selected theme. Doing this will permanently delete the theme and associated files." @@ -2238,28 +1889,19 @@ TheRequestedPageDoesNotExist: "The requested page does not exist." TheTicketCouldNotBeFound: "The ticket {0} could not be found." Third: "Third" ThisCustomerDoesNotHaveDefaultCurrency: "This customer does not have a default currency." -ThisEvening: "This Evening" +ThisEvening: "this evening" ThisFieldIsRequired: "This field is required." ThisMonth: "This Month" ThisOffice: "This Office" ThisSupplierDoesNotHaveDefaultCurrency: "This supplier does not have a default currency!" Thousand: "1000" Thursday: "Thursday" -Ticketing: "Ticketing" -TicketingCounterUpper: "TICKETING COUNTER" -TicketPrice: "Ticket Price" -TicketSales: "Ticket Sales" -Time: "Time" TimeInMinutes: "Time In Minutes" TimeZone: "Time Zone" Title: "Title" -TitleAddress: "Address: {0}. " -TitleName: "Name: {0}. " -TitlePhone: "Phone: {0}. " To: "To" Today: "Today" TodayBeginningCash: "Today's Beginning Cash" -TodaysBeginningCash: "Today's Beginning Cash" ToggleView: "Toggle View" Token: "Token" TokenId: "Token Id" @@ -2272,23 +1914,15 @@ Total: "Total" TotalAmount: "Total Amount" TotalAssets: "Total Assets" TotalCashSales: "Total Cash Sales" -TotalCostFactorMustHundredPercent: "Total Cost Factor must be 100%." -TotalCostFactorNotHundredPercente: "Total of cost factor is not 100%." TotalCycles: "Total Cycles" TotalDays: "Total Days" TotalDiscount: "Total Discount" TotalDiscountAmount: "Total Discount Amount" TotalDueAmountInBaseCurrency: "Total Due Amount (In Base Currency)" TotalLiabilities: "Total Liabilities" -TotalNumberOfSeatsSold: "Total Number of Seats Sold" -TotalNumberOfShows: "Total Number of Shows" -TotalPrints: "Total Prints" -TotalPurchaseAmount: "Total Purchase Amount" TotalSales: "Total Sales" TotalSalesTax: "Total Sales Tax" -TotalSeats: "Total Seats" TotalUsage: ":Total Usage" -TotalWorkTime: "Total Work Time" TotalYears: "Total Years" ToUserId: "To User Id" TranCode: "Tran Code" @@ -2313,16 +1947,12 @@ TransactionWithdrawalInformation: "

When you withdraw a transaction, it won't TranType: "Tran Type" TrialBalance: "Trial Balance" Tuesday: "Tuesday" -TvOne: "TV1" -TvTwo: "TV2" TweetThisLink: "Tweet this link" Twenty: "20" TwentyFive: "25" Two: "2" Twohundred: "200" -TwoHundred: "200" TwohundredFifty: "250" -TwoHundredFifty: "250" Type: "Type" UnderlyingType: "Underlying Type" Unit: "Unit" @@ -2355,10 +1985,8 @@ UploadAFile: "Upload a File" UploadAnotherFile: "Awesome! Upload another file." UploadATheme: "Upload a Theme" UploadAvatar: "Upload Avatar" -UploadBackup: "Upload Backup" UploadInvalidTryAgain: "Your upload is of invalid file type \"{0}\". Please try again." UploadNewDocument: "Upload a New Document" -UploadOneBackupFileToRestore: "Please upload only one backup file to restore." UploadProfilePicture: "Upload Profile Picture" UploadYourProfilePicture: "Upload Your Profile Picture" Url: "Url" @@ -2366,15 +1994,10 @@ Use: "Use" UsePosCheckoutScreen: "Use Pos Checkout Screen" User: "User" UserAgent: "User Agent" -UserAuditReport: "User Audit Report" -UserAudits: "User Audits" UserCommentedOnThePostYoureFollowing: "{0} commented on the post you're following.

{1}
" -UserDefinedEventId: "User Defined Event Id" -UserDefinedInformation: "User Defined Information" UserEntityAccessPolicy: "User Entity Access Policy" UserId: "User Id" UserManagement: "User Management" -UserManual: "User Manual" Username: "Username" UserName: "User Name" UserPolicy: "User Policy" @@ -2394,7 +2017,6 @@ VariantCode: "Variant Code" VariantId: "Variant Id" VariantName: "Variant Name" Variants: "Variants" -Vat: "Vat" Verification: "Verification" VerificationLimit: "Verification Limit" VerificationPolicy: "Verification Policy" @@ -2408,30 +2030,22 @@ VerifiedByUserId: "Verified By User Id" VerifiedOn: "Verified On" VerifierName: "Verifier Name" Verify: "Verify" -VerifyBillsOfMaterials: "Verify Bills Of Materials" -VerifyBom: "Verify BOM" VerifyContract: "Verify Contracts" VerifyContracts: "Verify Contracts" -VerifyDisassemble: "Verify Disassemble" VerifyExit: "Verify Exit" VerifyExits: "Verify Exits" VerifyGiftCardFund: "Verify Gift Card Fund" VerifyLeaveApplication: "Verify Leave Application" VerifyLeaveApplications: "Verify Leave Applications" -VerifyProductionOrders: "Verify Production Orders" VerifyResignation: "Verify Resignation" VerifyResignations: "Verify Resignations" VerifyTermination: "Verify Termination" VerifyTerminations: "Verify Terminations" VersionNumber: "Version Number" ViaCheck: "Via Check" -VideoFormatCode: "Video Format Code" -VideoFormatId: "Video Format Id" -VideoFormatName: "Video Format Name" View: "View" ViewAdjustment: "View Adjustment" ViewAdjustments: "View Adjustments" -ViewBackups: "View Backups" ViewBlogPosts: "View Blog Posts" ViewContents: "View Contents" ViewErrors: "View Errors" @@ -2440,8 +2054,6 @@ ViewJournalEntries: "View Journal Entries" ViewOpeningInventories: "View Opening Inventories" ViewOpeningInventoryAdvice: "View Opening Inventory Advice" ViewOrder: "View Order" -ViewOrderDetails: "View Order Details" -ViewOrderInProgress: "View Order in Progress" ViewPayment: "View Payment" ViewPayments: "View Payments" ViewPurchaseInvoice: "View Purchase Invoice" @@ -2463,11 +2075,8 @@ ViewSalesReturns: "View Sales Returns" ViewSubscriptions: "View Subscriptions" ViewTransfer: "View Transfer" ViewTransfers: "View Transfers" -Vip: "VIP" -WarmUpTime: "Warm up Time" WarmUpTimeInMinutes: "Warm Up Time In Minutes" Warning: "Warning" -WarningIrreversibleAction: "Warning: Irreversible Action" WasAbsent: "Was Absent" WasPresent: "Was Present" Website: "Website" @@ -2483,14 +2092,11 @@ WeekDayName: "Week Day Name" Weeks: "Week(s)" WeFailedToImport: "We failed to import the file you uploaded." Welcome: "Welcome" -WelcomeBack: "Welcome back" WelcomeEmail: "Welcome Email" WelcomeEmail3rdParty: "Welcome Email (3rd Party)" -WelcomeToDbBackupUtility: "Welcome to frapid database backup utility." WelcometToSite: "Welcome to {0}." WeOnlyHaveInInventory: "We only have {0} {1} in inventory" WeWillMissYou: "We will miss you!" -WhatsGoingOn: "Whats Going on?" WhatsOnYourMind: "What's on your mind?" WhichBank: "Which Bank?" WhichDayOfMonth: "Which Day of Month?" @@ -2499,41 +2105,32 @@ WidgetArea: "Widget Area" WipAccountId: "Wip Account Id" WithDisabilities: "With Disabilities" WithdrawalReason: "Why do you want to withdraw this transaction?" -WithdrawThisOrder: "Withdraw This Order" WorkCenter: "Work Center" -WorkCenterCapacity: "Work Center Capacity" WorkCenterCapacityId: "Work Center Capacity Id" WorkCenterCode: "Work Center Code" WorkCenterCostCode: "Work Center Cost Code" WorkCenterCostId: "Work Center Cost Id" WorkCenterCostName: "Work Center Cost Name" -WorkCenterCosts: "Work Center Costs" WorkCenterDepartmentCode: "Work Center Department Code" WorkCenterDepartmentId: "Work Center Department Id" WorkCenterDepartmentName: "Work Center Department Name" WorkCenterId: "Work Center Id" WorkCenterName: "Work Center Name" -WorkCenters: "Work Centers" -WorkInProgressStore: "Work in Progress Store" WorkInProgressStoreId: "Work In Progress Store Id" WorkTimeInMinutes: "Work Time In Minutes" -Writers: "Writers" -Year: "Year" Yes: "Yes" YesPlease: "Yes Please" You: "You" YouAreNowUnsubscribedOnSite: "You are now unsubscribed on {0}." YouDontHaveAnyNotification: "You don't have any notification." YouHaventLeftNoteYet: "You haven't left a note yet." -YouMayAlsoEditBeginningCashLater: "You may also edit the beginning cash later" +YouMayAlsoEditBeginningCashLater: "you may also edit the beginning cash later" YouMayEditBeginningCashLater: "you may also edit the beginning cash later" -YourBoxOfficeSalesFor: "Your Box Office Sales for" YourCashSales: "Your Cash Sales" YourName: "Your Name" YourPasswordResetLinkForSite: "Your password reset link for {0}." YourPasswordWasChangedSuccessfully: "Your password was changed successfully." YourSalesFor: "Your Sales for" -ZeroRatedSalesExport: "Zero Rated Sales(Export)" Zipcode: "Zipcode" ZipCode: "Zip Code" ZoomIn: "Zoom In" diff --git a/src/Templates/MVCProject/MVCProject.csproj b/src/Templates/MVCProject/MVCProject.csproj index 7879b017..99f7dff0 100644 --- a/src/Templates/MVCProject/MVCProject.csproj +++ b/src/Templates/MVCProject/MVCProject.csproj @@ -29,7 +29,7 @@ true full false - bin\ + ..\..\bin\ DEBUG;TRACE prompt 4 @@ -155,9 +155,7 @@ $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)
- + @@ -174,9 +172,6 @@ - - start xcopy /y /r "$(ProjectDir)\bin\*.dll" "$(ProjectDir)..\..\bin" - This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. From 9848bd14d58ce075c7352ed99b435ac2ea8af13c Mon Sep 17 00:00:00 2001 From: bi od Date: Sun, 12 May 2019 02:45:54 +0545 Subject: [PATCH 12/18] Bug fixes: - Database schema updater error message was not helpful if a wrong site name was specified. - Fixed issue of MemoryCacheFactory and dynamic object. - Added timeout feature in DbServer. - Fixed a bug of policy validator which always returned false if MemoryCache was used. - Fixed an issue which generated run-time errors on Frapid console installer when trying to delete tenant directory for cleanup. - Fixed an issue of Frapid console installer related to timeouts. --- src/Frapid.Web.sln | 31 +- src/Frapid.Web/Areas/.gitignore | 5 - .../Frapid.SchemaUpdater.csproj | 6 + .../Frapid.SchemaUpdater.sln | 7 +- .../Areas/Frapid.SchemaUpdater/Updater.cs | 18 +- src/Frapid.Web/Frapid.Web.csproj | 15 +- src/Frapid.Web/Packages/i18n/en.yaml | 411 +++++++++++++++++- .../CacheFactory/MemoryCacheFactory.cs | 23 +- .../DbServer/PostgreSQL.cs | 5 +- .../DbServer/SqlServer.cs | 4 +- .../Frapid.DbPolicy/PolicyValidator.cs | 7 +- src/Libraries/Frapid.Framework/FileHelper.cs | 28 +- .../Frapid.Installer/DAL/SqlServer.cs | 25 +- .../Frapid.Installer/Tenant/Uninstaller.cs | 2 +- 14 files changed, 536 insertions(+), 51 deletions(-) diff --git a/src/Frapid.Web.sln b/src/Frapid.Web.sln index f17e8bdd..6a110632 100644 --- a/src/Frapid.Web.sln +++ b/src/Frapid.Web.sln @@ -1,12 +1,20 @@  Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 14 -VisualStudioVersion = 14.0.25420.1 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.28803.352 MinimumVisualStudioVersion = 10.0.40219.1 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Frapid.Web", "Frapid.Web\Frapid.Web.csproj", "{77C7D586-FEE9-40E2-A1C4-699EF4B0A1F3}" -EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Core", "Core", "{0DFA1BB9-74FE-4C63-B8AF-0B312ED992F6}" EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Modules", "Modules", "{23C8FECB-C7F3-4FF1-B2FF-8B296420C8CB}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Console", "Console", "{1FB0A4E1-7F94-4FCB-A26B-312A7A3B5036}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tests", "Tests", "{4B708D47-066F-402E-839A-1318B4AE9009}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tests", "Tests", "{F4AC123C-9618-4915-B69B-C8319D7AFE6F}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Frapid.Web", "Frapid.Web\Frapid.Web.csproj", "{77C7D586-FEE9-40E2-A1C4-699EF4B0A1F3}" +EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Frapid.Configuration", "Libraries\Frapid.Configuration\Frapid.Configuration.csproj", "{CA3C3D39-6775-4234-B343-38F0724ADCF8}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Frapid.DataAccess", "Libraries\Frapid.DataAccess\Frapid.DataAccess.csproj", "{9BEA3809-B6D5-4025-AE7E-868E5E7E9C76}" @@ -19,8 +27,6 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Frapid.Areas", "Libraries\F EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Frapid.Installer", "Libraries\Frapid.Installer\Frapid.Installer.csproj", "{BFFE76A6-7E9D-42FA-AB3A-108BD2125923}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Modules", "Modules", "{23C8FECB-C7F3-4FF1-B2FF-8B296420C8CB}" -EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Frapid.ApplicationState", "Libraries\Frapid.ApplicationState\Frapid.ApplicationState.csproj", "{EF3D84F8-3D64-45D7-9050-3AE204F5AA72}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Frapid.DbPolicy", "Libraries\Frapid.DbPolicy\Frapid.DbPolicy.csproj", "{E2C5690C-EF80-4AFA-8107-5E58A936B15F}" @@ -33,20 +39,14 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Frapid.TokenManager", "Libr EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "frapid", "Libraries\Frapid.CommandLine\frapid.csproj", "{CD47926F-7148-49A1-AD08-A96B74A3A5F6}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Console", "Console", "{1FB0A4E1-7F94-4FCB-A26B-312A7A3B5036}" -EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Frapid.Backups", "Libraries\Frapid.Backups\Frapid.Backups.csproj", "{8993AD31-C303-4CA0-92D9-C100585A78E5}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tests", "Tests", "{4B708D47-066F-402E-839A-1318B4AE9009}" -EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Frapid.Framework.Tests", "Libraries\Tests\Frapid.Framework.Tests\Frapid.Framework.Tests.csproj", "{10258887-3CB5-4877-848B-7D7C45F516D2}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Frapid.Configuration.Tests", "Libraries\Tests\Frapid.Configuration.Tests\Frapid.Configuration.Tests.csproj", "{3946F2A8-A530-47CA-A080-A17510F05FD0}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Frapid.TokenManager.Tests", "Libraries\Tests\Frapid.TokenManager.Tests\Frapid.TokenManager.Tests.csproj", "{2A4373DC-DF0F-4119-A8C2-C7CCF16EF314}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tests", "Tests", "{F4AC123C-9618-4915-B69B-C8319D7AFE6F}" -EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Frapid.Areas.Tests", "Libraries\Tests\Frapid.Areas.Tests\Frapid.Areas.Tests.csproj", "{4DF49869-7BB8-42B1-87AC-C5A5F0B87C54}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Frapid.ApplicationState.Tests", "Libraries\Frapid.ApplicationState.Tests\Frapid.ApplicationState.Tests.csproj", "{2D50273B-17BE-4DD4-B747-02884BBACF3A}" @@ -236,6 +236,8 @@ Global HideSolutionNode = FALSE EndGlobalSection GlobalSection(NestedProjects) = preSolution + {4B708D47-066F-402E-839A-1318B4AE9009} = {0DFA1BB9-74FE-4C63-B8AF-0B312ED992F6} + {F4AC123C-9618-4915-B69B-C8319D7AFE6F} = {23C8FECB-C7F3-4FF1-B2FF-8B296420C8CB} {CA3C3D39-6775-4234-B343-38F0724ADCF8} = {0DFA1BB9-74FE-4C63-B8AF-0B312ED992F6} {9BEA3809-B6D5-4025-AE7E-868E5E7E9C76} = {0DFA1BB9-74FE-4C63-B8AF-0B312ED992F6} {A4DEE358-3203-425C-80E9-8EBA0A01B73F} = {0DFA1BB9-74FE-4C63-B8AF-0B312ED992F6} @@ -249,14 +251,15 @@ Global {EF3BDE7C-A3D5-493A-8817-BF47DF9CAE47} = {0DFA1BB9-74FE-4C63-B8AF-0B312ED992F6} {CD47926F-7148-49A1-AD08-A96B74A3A5F6} = {1FB0A4E1-7F94-4FCB-A26B-312A7A3B5036} {8993AD31-C303-4CA0-92D9-C100585A78E5} = {23C8FECB-C7F3-4FF1-B2FF-8B296420C8CB} - {4B708D47-066F-402E-839A-1318B4AE9009} = {0DFA1BB9-74FE-4C63-B8AF-0B312ED992F6} {10258887-3CB5-4877-848B-7D7C45F516D2} = {4B708D47-066F-402E-839A-1318B4AE9009} {3946F2A8-A530-47CA-A080-A17510F05FD0} = {4B708D47-066F-402E-839A-1318B4AE9009} {2A4373DC-DF0F-4119-A8C2-C7CCF16EF314} = {4B708D47-066F-402E-839A-1318B4AE9009} - {F4AC123C-9618-4915-B69B-C8319D7AFE6F} = {23C8FECB-C7F3-4FF1-B2FF-8B296420C8CB} {4DF49869-7BB8-42B1-87AC-C5A5F0B87C54} = {F4AC123C-9618-4915-B69B-C8319D7AFE6F} {2D50273B-17BE-4DD4-B747-02884BBACF3A} = {F4AC123C-9618-4915-B69B-C8319D7AFE6F} {4E863154-9D48-4023-BB76-8405A98BCAFF} = {23C8FECB-C7F3-4FF1-B2FF-8B296420C8CB} {86545C4A-5202-4368-B013-EA37615CBD8E} = {0DFA1BB9-74FE-4C63-B8AF-0B312ED992F6} EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {2BD31D9F-E23A-49DD-A27C-B6B9ACE38848} + EndGlobalSection EndGlobal diff --git a/src/Frapid.Web/Areas/.gitignore b/src/Frapid.Web/Areas/.gitignore index 85d1d110..c94e8a70 100644 --- a/src/Frapid.Web/Areas/.gitignore +++ b/src/Frapid.Web/Areas/.gitignore @@ -1,6 +1,3 @@ -/Ticketing -/TheSmsCentral - MixCBS.Banking MixCBS.Deposits MixCBS.Lendings @@ -10,5 +7,3 @@ MixERP.Office NplRemit Salesific.CRM MixERP.Discovery -/MailjetApp -/InitiativeNepal \ No newline at end of file diff --git a/src/Frapid.Web/Areas/Frapid.SchemaUpdater/Frapid.SchemaUpdater.csproj b/src/Frapid.Web/Areas/Frapid.SchemaUpdater/Frapid.SchemaUpdater.csproj index 5975fa10..8763f578 100644 --- a/src/Frapid.Web/Areas/Frapid.SchemaUpdater/Frapid.SchemaUpdater.csproj +++ b/src/Frapid.Web/Areas/Frapid.SchemaUpdater/Frapid.SchemaUpdater.csproj @@ -24,6 +24,11 @@ + + + + + 12.0 true @@ -240,6 +245,7 @@ + -->-- src/Frapid.Web/Areas/Frapid.Account/db/SQL Server/1.1.update/src/99.ownership.sql --<--<-- -IF NOT EXISTS -( - SELECT * FROM sys.database_principals - WHERE name = 'frapid_db_user' -) +IF(IS_ROLEMEMBER ('db_owner') = 1) BEGIN -CREATE USER frapid_db_user FROM LOGIN frapid_db_user; + IF NOT EXISTS + ( + SELECT * FROM sys.database_principals + WHERE name = 'frapid_db_user' + ) + BEGIN + CREATE USER frapid_db_user FROM LOGIN frapid_db_user; + END END + GO -EXEC sp_addrolemember @rolename = 'db_owner', @membername = 'frapid_db_user' +IF(IS_ROLEMEMBER ('db_owner') = 1) +BEGIN + EXEC sp_addrolemember @rolename = 'db_owner', @membername = 'frapid_db_user' +END + GO -IF NOT EXISTS -( - SELECT * FROM sys.database_principals - WHERE name = 'report_user' -) +IF(IS_ROLEMEMBER ('db_owner') = 1) BEGIN -CREATE USER report_user FROM LOGIN report_user; + IF NOT EXISTS + ( + SELECT * FROM sys.database_principals + WHERE name = 'report_user' + ) + BEGIN + CREATE USER report_user FROM LOGIN report_user; + END END + GO -EXEC sp_addrolemember @rolename = 'db_datareader', @membername = 'report_user' +IF(IS_ROLEMEMBER ('db_owner') = 1) +BEGIN + EXEC sp_addrolemember @rolename = 'db_datareader', @membername = 'report_user' +END + GO diff --git a/src/Frapid.Web/Areas/Frapid.Account/db/SQL Server/1.1.update/src/99.ownership.sql b/src/Frapid.Web/Areas/Frapid.Account/db/SQL Server/1.1.update/src/99.ownership.sql index 4c475bed..d45b3902 100644 --- a/src/Frapid.Web/Areas/Frapid.Account/db/SQL Server/1.1.update/src/99.ownership.sql +++ b/src/Frapid.Web/Areas/Frapid.Account/db/SQL Server/1.1.update/src/99.ownership.sql @@ -1,27 +1,43 @@ -IF NOT EXISTS -( - SELECT * FROM sys.database_principals - WHERE name = 'frapid_db_user' -) +IF(IS_ROLEMEMBER ('db_owner') = 1) BEGIN -CREATE USER frapid_db_user FROM LOGIN frapid_db_user; + IF NOT EXISTS + ( + SELECT * FROM sys.database_principals + WHERE name = 'frapid_db_user' + ) + BEGIN + CREATE USER frapid_db_user FROM LOGIN frapid_db_user; + END END + GO -EXEC sp_addrolemember @rolename = 'db_owner', @membername = 'frapid_db_user' +IF(IS_ROLEMEMBER ('db_owner') = 1) +BEGIN + EXEC sp_addrolemember @rolename = 'db_owner', @membername = 'frapid_db_user' +END + GO -IF NOT EXISTS -( - SELECT * FROM sys.database_principals - WHERE name = 'report_user' -) +IF(IS_ROLEMEMBER ('db_owner') = 1) BEGIN -CREATE USER report_user FROM LOGIN report_user; + IF NOT EXISTS + ( + SELECT * FROM sys.database_principals + WHERE name = 'report_user' + ) + BEGIN + CREATE USER report_user FROM LOGIN report_user; + END END + GO -EXEC sp_addrolemember @rolename = 'db_datareader', @membername = 'report_user' +IF(IS_ROLEMEMBER ('db_owner') = 1) +BEGIN + EXEC sp_addrolemember @rolename = 'db_datareader', @membername = 'report_user' +END + GO diff --git a/src/Frapid.Web/Areas/Frapid.Account/db/SQL Server/1.x/1.0/account-blank.sql b/src/Frapid.Web/Areas/Frapid.Account/db/SQL Server/1.x/1.0/account-blank.sql index 4cba7d3e..f69dde29 100644 --- a/src/Frapid.Web/Areas/Frapid.Account/db/SQL Server/1.x/1.0/account-blank.sql +++ b/src/Frapid.Web/Areas/Frapid.Account/db/SQL Server/1.x/1.0/account-blank.sql @@ -1622,10 +1622,16 @@ WHERE account.logins.deleted = 0; GO -->-->-- src/Frapid.Web/Areas/Frapid.Account/db/SQL Server/1.x/1.0/src/99.ownership.sql --<--<-- -EXEC sp_addrolemember @rolename = 'db_owner', @membername = 'frapid_db_user' +IF(IS_ROLEMEMBER ('db_owner') = 1) +BEGIN + EXEC sp_addrolemember @rolename = 'db_owner', @membername = 'frapid_db_user'; +END GO -EXEC sp_addrolemember @rolename = 'db_datareader', @membername = 'report_user' +IF(IS_ROLEMEMBER ('db_owner') = 1) +BEGIN + EXEC sp_addrolemember @rolename = 'db_datareader', @membername = 'report_user' +END GO DECLARE @proc sysname diff --git a/src/Frapid.Web/Areas/Frapid.Account/db/SQL Server/1.x/1.0/src/99.ownership.sql b/src/Frapid.Web/Areas/Frapid.Account/db/SQL Server/1.x/1.0/src/99.ownership.sql index 2fb7d9fa..485e0ac8 100644 --- a/src/Frapid.Web/Areas/Frapid.Account/db/SQL Server/1.x/1.0/src/99.ownership.sql +++ b/src/Frapid.Web/Areas/Frapid.Account/db/SQL Server/1.x/1.0/src/99.ownership.sql @@ -1,7 +1,13 @@ -EXEC sp_addrolemember @rolename = 'db_owner', @membername = 'frapid_db_user' +IF(IS_ROLEMEMBER ('db_owner') = 1) +BEGIN + EXEC sp_addrolemember @rolename = 'db_owner', @membername = 'frapid_db_user'; +END GO -EXEC sp_addrolemember @rolename = 'db_datareader', @membername = 'report_user' +IF(IS_ROLEMEMBER ('db_owner') = 1) +BEGIN + EXEC sp_addrolemember @rolename = 'db_datareader', @membername = 'report_user' +END GO DECLARE @proc sysname diff --git a/src/Frapid.Web/Areas/Frapid.Account/db/SQL Server/account-blank-1.1.update.sql b/src/Frapid.Web/Areas/Frapid.Account/db/SQL Server/account-blank-1.1.update.sql index 4c701b7a..bcd9a304 100644 --- a/src/Frapid.Web/Areas/Frapid.Account/db/SQL Server/account-blank-1.1.update.sql +++ b/src/Frapid.Web/Areas/Frapid.Account/db/SQL Server/account-blank-1.1.update.sql @@ -82,30 +82,46 @@ GO -->-->-- src/Frapid.Web/Areas/Frapid.Account/db/SQL Server/1.1.update/src/99.ownership.sql --<--<-- -IF NOT EXISTS -( - SELECT * FROM sys.database_principals - WHERE name = 'frapid_db_user' -) +IF(IS_ROLEMEMBER ('db_owner') = 1) BEGIN -CREATE USER frapid_db_user FROM LOGIN frapid_db_user; + IF NOT EXISTS + ( + SELECT * FROM sys.database_principals + WHERE name = 'frapid_db_user' + ) + BEGIN + CREATE USER frapid_db_user FROM LOGIN frapid_db_user; + END END + GO -EXEC sp_addrolemember @rolename = 'db_owner', @membername = 'frapid_db_user' +IF(IS_ROLEMEMBER ('db_owner') = 1) +BEGIN + EXEC sp_addrolemember @rolename = 'db_owner', @membername = 'frapid_db_user' +END + GO -IF NOT EXISTS -( - SELECT * FROM sys.database_principals - WHERE name = 'report_user' -) +IF(IS_ROLEMEMBER ('db_owner') = 1) BEGIN -CREATE USER report_user FROM LOGIN report_user; + IF NOT EXISTS + ( + SELECT * FROM sys.database_principals + WHERE name = 'report_user' + ) + BEGIN + CREATE USER report_user FROM LOGIN report_user; + END END + GO -EXEC sp_addrolemember @rolename = 'db_datareader', @membername = 'report_user' +IF(IS_ROLEMEMBER ('db_owner') = 1) +BEGIN + EXEC sp_addrolemember @rolename = 'db_datareader', @membername = 'report_user' +END + GO diff --git a/src/Frapid.Web/Areas/Frapid.Account/db/SQL Server/account-blank.sql b/src/Frapid.Web/Areas/Frapid.Account/db/SQL Server/account-blank.sql index 4cba7d3e..f69dde29 100644 --- a/src/Frapid.Web/Areas/Frapid.Account/db/SQL Server/account-blank.sql +++ b/src/Frapid.Web/Areas/Frapid.Account/db/SQL Server/account-blank.sql @@ -1622,10 +1622,16 @@ WHERE account.logins.deleted = 0; GO -->-->-- src/Frapid.Web/Areas/Frapid.Account/db/SQL Server/1.x/1.0/src/99.ownership.sql --<--<-- -EXEC sp_addrolemember @rolename = 'db_owner', @membername = 'frapid_db_user' +IF(IS_ROLEMEMBER ('db_owner') = 1) +BEGIN + EXEC sp_addrolemember @rolename = 'db_owner', @membername = 'frapid_db_user'; +END GO -EXEC sp_addrolemember @rolename = 'db_datareader', @membername = 'report_user' +IF(IS_ROLEMEMBER ('db_owner') = 1) +BEGIN + EXEC sp_addrolemember @rolename = 'db_datareader', @membername = 'report_user' +END GO DECLARE @proc sysname diff --git a/src/Frapid.Web/Areas/Frapid.AddressBook/db/SQL Server/2.x/2.0/addressbook-blank.sql b/src/Frapid.Web/Areas/Frapid.AddressBook/db/SQL Server/2.x/2.0/addressbook-blank.sql index 4bc10aae..3cb8c4a4 100644 --- a/src/Frapid.Web/Areas/Frapid.AddressBook/db/SQL Server/2.x/2.0/addressbook-blank.sql +++ b/src/Frapid.Web/Areas/Frapid.AddressBook/db/SQL Server/2.x/2.0/addressbook-blank.sql @@ -113,10 +113,16 @@ EXECUTE auth.create_app_menu_policy -->-->-- src/Frapid.Web/Areas/Frapid.AddressBook/db/Sql Server/2.x/2.0/src/99.ownership.sql --<--<-- -EXEC sp_addrolemember @rolename = 'db_owner', @membername = 'frapid_db_user' +IF(IS_ROLEMEMBER ('db_owner') = 1) +BEGIN + EXEC sp_addrolemember @rolename = 'db_owner', @membername = 'frapid_db_user'; +END GO -EXEC sp_addrolemember @rolename = 'db_datareader', @membername = 'report_user' +IF(IS_ROLEMEMBER ('db_owner') = 1) +BEGIN + EXEC sp_addrolemember @rolename = 'db_datareader', @membername = 'report_user' +END GO DECLARE @proc sysname diff --git a/src/Frapid.Web/Areas/Frapid.AddressBook/db/SQL Server/2.x/2.0/src/99.ownership.sql b/src/Frapid.Web/Areas/Frapid.AddressBook/db/SQL Server/2.x/2.0/src/99.ownership.sql index 2fb7d9fa..485e0ac8 100644 --- a/src/Frapid.Web/Areas/Frapid.AddressBook/db/SQL Server/2.x/2.0/src/99.ownership.sql +++ b/src/Frapid.Web/Areas/Frapid.AddressBook/db/SQL Server/2.x/2.0/src/99.ownership.sql @@ -1,7 +1,13 @@ -EXEC sp_addrolemember @rolename = 'db_owner', @membername = 'frapid_db_user' +IF(IS_ROLEMEMBER ('db_owner') = 1) +BEGIN + EXEC sp_addrolemember @rolename = 'db_owner', @membername = 'frapid_db_user'; +END GO -EXEC sp_addrolemember @rolename = 'db_datareader', @membername = 'report_user' +IF(IS_ROLEMEMBER ('db_owner') = 1) +BEGIN + EXEC sp_addrolemember @rolename = 'db_datareader', @membername = 'report_user' +END GO DECLARE @proc sysname diff --git a/src/Frapid.Web/Areas/Frapid.AddressBook/db/SQL Server/addressbook-blank.sql b/src/Frapid.Web/Areas/Frapid.AddressBook/db/SQL Server/addressbook-blank.sql index 4bc10aae..3cb8c4a4 100644 --- a/src/Frapid.Web/Areas/Frapid.AddressBook/db/SQL Server/addressbook-blank.sql +++ b/src/Frapid.Web/Areas/Frapid.AddressBook/db/SQL Server/addressbook-blank.sql @@ -113,10 +113,16 @@ EXECUTE auth.create_app_menu_policy -->-->-- src/Frapid.Web/Areas/Frapid.AddressBook/db/Sql Server/2.x/2.0/src/99.ownership.sql --<--<-- -EXEC sp_addrolemember @rolename = 'db_owner', @membername = 'frapid_db_user' +IF(IS_ROLEMEMBER ('db_owner') = 1) +BEGIN + EXEC sp_addrolemember @rolename = 'db_owner', @membername = 'frapid_db_user'; +END GO -EXEC sp_addrolemember @rolename = 'db_datareader', @membername = 'report_user' +IF(IS_ROLEMEMBER ('db_owner') = 1) +BEGIN + EXEC sp_addrolemember @rolename = 'db_datareader', @membername = 'report_user' +END GO DECLARE @proc sysname diff --git a/src/Frapid.Web/Areas/Frapid.Authorization/db/SQL Server/1.x/1.0/auth-blank.sql b/src/Frapid.Web/Areas/Frapid.Authorization/db/SQL Server/1.x/1.0/auth-blank.sql index 23ddb2d5..487da4ea 100644 --- a/src/Frapid.Web/Areas/Frapid.Authorization/db/SQL Server/1.x/1.0/auth-blank.sql +++ b/src/Frapid.Web/Areas/Frapid.Authorization/db/SQL Server/1.x/1.0/auth-blank.sql @@ -1058,10 +1058,16 @@ EXECUTE auth.create_api_access_policy '{Admin}', @office_id, '', '{*}', 1; GO -->-->-- src/Frapid.Web/Areas/Frapid.Authorization/db/SQL Server/1.x/1.0/src/99.ownership.sql --<--<-- -EXEC sp_addrolemember @rolename = 'db_owner', @membername = 'frapid_db_user' +IF(IS_ROLEMEMBER ('db_owner') = 1) +BEGIN + EXEC sp_addrolemember @rolename = 'db_owner', @membername = 'frapid_db_user'; +END GO -EXEC sp_addrolemember @rolename = 'db_datareader', @membername = 'report_user' +IF(IS_ROLEMEMBER ('db_owner') = 1) +BEGIN + EXEC sp_addrolemember @rolename = 'db_datareader', @membername = 'report_user' +END GO DECLARE @proc sysname diff --git a/src/Frapid.Web/Areas/Frapid.Authorization/db/SQL Server/1.x/1.0/src/99.ownership.sql b/src/Frapid.Web/Areas/Frapid.Authorization/db/SQL Server/1.x/1.0/src/99.ownership.sql index 2fb7d9fa..485e0ac8 100644 --- a/src/Frapid.Web/Areas/Frapid.Authorization/db/SQL Server/1.x/1.0/src/99.ownership.sql +++ b/src/Frapid.Web/Areas/Frapid.Authorization/db/SQL Server/1.x/1.0/src/99.ownership.sql @@ -1,7 +1,13 @@ -EXEC sp_addrolemember @rolename = 'db_owner', @membername = 'frapid_db_user' +IF(IS_ROLEMEMBER ('db_owner') = 1) +BEGIN + EXEC sp_addrolemember @rolename = 'db_owner', @membername = 'frapid_db_user'; +END GO -EXEC sp_addrolemember @rolename = 'db_datareader', @membername = 'report_user' +IF(IS_ROLEMEMBER ('db_owner') = 1) +BEGIN + EXEC sp_addrolemember @rolename = 'db_datareader', @membername = 'report_user' +END GO DECLARE @proc sysname diff --git a/src/Frapid.Web/Areas/Frapid.Authorization/db/SQL Server/auth-blank.sql b/src/Frapid.Web/Areas/Frapid.Authorization/db/SQL Server/auth-blank.sql index 23ddb2d5..487da4ea 100644 --- a/src/Frapid.Web/Areas/Frapid.Authorization/db/SQL Server/auth-blank.sql +++ b/src/Frapid.Web/Areas/Frapid.Authorization/db/SQL Server/auth-blank.sql @@ -1058,10 +1058,16 @@ EXECUTE auth.create_api_access_policy '{Admin}', @office_id, '', '{*}', 1; GO -->-->-- src/Frapid.Web/Areas/Frapid.Authorization/db/SQL Server/1.x/1.0/src/99.ownership.sql --<--<-- -EXEC sp_addrolemember @rolename = 'db_owner', @membername = 'frapid_db_user' +IF(IS_ROLEMEMBER ('db_owner') = 1) +BEGIN + EXEC sp_addrolemember @rolename = 'db_owner', @membername = 'frapid_db_user'; +END GO -EXEC sp_addrolemember @rolename = 'db_datareader', @membername = 'report_user' +IF(IS_ROLEMEMBER ('db_owner') = 1) +BEGIN + EXEC sp_addrolemember @rolename = 'db_datareader', @membername = 'report_user' +END GO DECLARE @proc sysname diff --git a/src/Frapid.Web/Areas/Frapid.Calendar/db/SQL Server/2.x/2.0/calendar-blank.sql b/src/Frapid.Web/Areas/Frapid.Calendar/db/SQL Server/2.x/2.0/calendar-blank.sql index 343f1ae4..b1db52ea 100644 --- a/src/Frapid.Web/Areas/Frapid.Calendar/db/SQL Server/2.x/2.0/calendar-blank.sql +++ b/src/Frapid.Web/Areas/Frapid.Calendar/db/SQL Server/2.x/2.0/calendar-blank.sql @@ -124,10 +124,16 @@ GO -->-->-- src/Frapid.Web/Areas/Frapid.Calendar/db/Sql Server/2.x/2.0/src/99.ownership.sql --<--<-- -EXEC sp_addrolemember @rolename = 'db_owner', @membername = 'frapid_db_user' +IF(IS_ROLEMEMBER ('db_owner') = 1) +BEGIN + EXEC sp_addrolemember @rolename = 'db_owner', @membername = 'frapid_db_user'; +END GO -EXEC sp_addrolemember @rolename = 'db_datareader', @membername = 'report_user' +IF(IS_ROLEMEMBER ('db_owner') = 1) +BEGIN + EXEC sp_addrolemember @rolename = 'db_datareader', @membername = 'report_user' +END GO DECLARE @proc sysname diff --git a/src/Frapid.Web/Areas/Frapid.Calendar/db/SQL Server/2.x/2.0/src/99.ownership.sql b/src/Frapid.Web/Areas/Frapid.Calendar/db/SQL Server/2.x/2.0/src/99.ownership.sql index 2fb7d9fa..485e0ac8 100644 --- a/src/Frapid.Web/Areas/Frapid.Calendar/db/SQL Server/2.x/2.0/src/99.ownership.sql +++ b/src/Frapid.Web/Areas/Frapid.Calendar/db/SQL Server/2.x/2.0/src/99.ownership.sql @@ -1,7 +1,13 @@ -EXEC sp_addrolemember @rolename = 'db_owner', @membername = 'frapid_db_user' +IF(IS_ROLEMEMBER ('db_owner') = 1) +BEGIN + EXEC sp_addrolemember @rolename = 'db_owner', @membername = 'frapid_db_user'; +END GO -EXEC sp_addrolemember @rolename = 'db_datareader', @membername = 'report_user' +IF(IS_ROLEMEMBER ('db_owner') = 1) +BEGIN + EXEC sp_addrolemember @rolename = 'db_datareader', @membername = 'report_user' +END GO DECLARE @proc sysname diff --git a/src/Frapid.Web/Areas/Frapid.Calendar/db/SQL Server/calendar-blank.sql b/src/Frapid.Web/Areas/Frapid.Calendar/db/SQL Server/calendar-blank.sql index 343f1ae4..b1db52ea 100644 --- a/src/Frapid.Web/Areas/Frapid.Calendar/db/SQL Server/calendar-blank.sql +++ b/src/Frapid.Web/Areas/Frapid.Calendar/db/SQL Server/calendar-blank.sql @@ -124,10 +124,16 @@ GO -->-->-- src/Frapid.Web/Areas/Frapid.Calendar/db/Sql Server/2.x/2.0/src/99.ownership.sql --<--<-- -EXEC sp_addrolemember @rolename = 'db_owner', @membername = 'frapid_db_user' +IF(IS_ROLEMEMBER ('db_owner') = 1) +BEGIN + EXEC sp_addrolemember @rolename = 'db_owner', @membername = 'frapid_db_user'; +END GO -EXEC sp_addrolemember @rolename = 'db_datareader', @membername = 'report_user' +IF(IS_ROLEMEMBER ('db_owner') = 1) +BEGIN + EXEC sp_addrolemember @rolename = 'db_datareader', @membername = 'report_user' +END GO DECLARE @proc sysname diff --git a/src/Frapid.Web/Areas/Frapid.Config/db/SQL Server/1.x/1.0/config.sql b/src/Frapid.Web/Areas/Frapid.Config/db/SQL Server/1.x/1.0/config.sql index bb23af97..8709fc26 100644 --- a/src/Frapid.Web/Areas/Frapid.Config/db/SQL Server/1.x/1.0/config.sql +++ b/src/Frapid.Web/Areas/Frapid.Config/db/SQL Server/1.x/1.0/config.sql @@ -514,10 +514,16 @@ GO -->-->-- src/Frapid.Web/Areas/Frapid.Config/db/SQL Server/1.x/1.0/src/99.ownership.sql --<--<-- -EXEC sp_addrolemember @rolename = 'db_owner', @membername = 'frapid_db_user' +IF(IS_ROLEMEMBER ('db_owner') = 1) +BEGIN + EXEC sp_addrolemember @rolename = 'db_owner', @membername = 'frapid_db_user'; +END GO -EXEC sp_addrolemember @rolename = 'db_datareader', @membername = 'report_user' +IF(IS_ROLEMEMBER ('db_owner') = 1) +BEGIN + EXEC sp_addrolemember @rolename = 'db_datareader', @membername = 'report_user' +END GO DECLARE @proc sysname diff --git a/src/Frapid.Web/Areas/Frapid.Config/db/SQL Server/1.x/1.0/src/99.ownership.sql b/src/Frapid.Web/Areas/Frapid.Config/db/SQL Server/1.x/1.0/src/99.ownership.sql index 2fb7d9fa..485e0ac8 100644 --- a/src/Frapid.Web/Areas/Frapid.Config/db/SQL Server/1.x/1.0/src/99.ownership.sql +++ b/src/Frapid.Web/Areas/Frapid.Config/db/SQL Server/1.x/1.0/src/99.ownership.sql @@ -1,7 +1,13 @@ -EXEC sp_addrolemember @rolename = 'db_owner', @membername = 'frapid_db_user' +IF(IS_ROLEMEMBER ('db_owner') = 1) +BEGIN + EXEC sp_addrolemember @rolename = 'db_owner', @membername = 'frapid_db_user'; +END GO -EXEC sp_addrolemember @rolename = 'db_datareader', @membername = 'report_user' +IF(IS_ROLEMEMBER ('db_owner') = 1) +BEGIN + EXEC sp_addrolemember @rolename = 'db_datareader', @membername = 'report_user' +END GO DECLARE @proc sysname diff --git a/src/Frapid.Web/Areas/Frapid.Config/db/SQL Server/config.sql b/src/Frapid.Web/Areas/Frapid.Config/db/SQL Server/config.sql index bb23af97..8709fc26 100644 --- a/src/Frapid.Web/Areas/Frapid.Config/db/SQL Server/config.sql +++ b/src/Frapid.Web/Areas/Frapid.Config/db/SQL Server/config.sql @@ -514,10 +514,16 @@ GO -->-->-- src/Frapid.Web/Areas/Frapid.Config/db/SQL Server/1.x/1.0/src/99.ownership.sql --<--<-- -EXEC sp_addrolemember @rolename = 'db_owner', @membername = 'frapid_db_user' +IF(IS_ROLEMEMBER ('db_owner') = 1) +BEGIN + EXEC sp_addrolemember @rolename = 'db_owner', @membername = 'frapid_db_user'; +END GO -EXEC sp_addrolemember @rolename = 'db_datareader', @membername = 'report_user' +IF(IS_ROLEMEMBER ('db_owner') = 1) +BEGIN + EXEC sp_addrolemember @rolename = 'db_datareader', @membername = 'report_user' +END GO DECLARE @proc sysname diff --git a/src/Frapid.Web/Areas/Frapid.Dashboard/Frapid.Dashboard.csproj b/src/Frapid.Web/Areas/Frapid.Dashboard/Frapid.Dashboard.csproj index a502a26d..70dacce5 100644 --- a/src/Frapid.Web/Areas/Frapid.Dashboard/Frapid.Dashboard.csproj +++ b/src/Frapid.Web/Areas/Frapid.Dashboard/Frapid.Dashboard.csproj @@ -25,6 +25,11 @@ + + + + + 12.0
true @@ -234,6 +239,7 @@
+ -->-- src/Frapid.Web/Areas/Frapid.SchemaUpdater/db/SQL Server/1.x/1.0/src/99.ownership.sql --<--<-- -EXEC sp_addrolemember @rolename = 'db_owner', @membername = 'frapid_db_user' +IF(IS_ROLEMEMBER ('db_owner') = 1) +BEGIN + EXEC sp_addrolemember @rolename = 'db_owner', @membername = 'frapid_db_user'; +END GO -EXEC sp_addrolemember @rolename = 'db_datareader', @membername = 'report_user' +IF(IS_ROLEMEMBER ('db_owner') = 1) +BEGIN + EXEC sp_addrolemember @rolename = 'db_datareader', @membername = 'report_user' +END GO DECLARE @proc sysname diff --git a/src/Frapid.Web/Areas/Frapid.SchemaUpdater/db/SQL Server/updater.sql b/src/Frapid.Web/Areas/Frapid.SchemaUpdater/db/SQL Server/updater.sql index 40b4a122..db14adc0 100644 --- a/src/Frapid.Web/Areas/Frapid.SchemaUpdater/db/SQL Server/updater.sql +++ b/src/Frapid.Web/Areas/Frapid.SchemaUpdater/db/SQL Server/updater.sql @@ -28,10 +28,16 @@ EXECUTE auth.create_app_menu_policy GO -->-->-- src/Frapid.Web/Areas/Frapid.SchemaUpdater/db/SQL Server/1.x/1.0/src/99.ownership.sql --<--<-- -EXEC sp_addrolemember @rolename = 'db_owner', @membername = 'frapid_db_user' +IF(IS_ROLEMEMBER ('db_owner') = 1) +BEGIN + EXEC sp_addrolemember @rolename = 'db_owner', @membername = 'frapid_db_user'; +END GO -EXEC sp_addrolemember @rolename = 'db_datareader', @membername = 'report_user' +IF(IS_ROLEMEMBER ('db_owner') = 1) +BEGIN + EXEC sp_addrolemember @rolename = 'db_datareader', @membername = 'report_user' +END GO DECLARE @proc sysname diff --git a/src/Frapid.Web/Areas/Frapid.WebsiteBuilder/db/SQL Server/1.x/1.0/src/99.ownership.sql b/src/Frapid.Web/Areas/Frapid.WebsiteBuilder/db/SQL Server/1.x/1.0/src/99.ownership.sql index 2fb7d9fa..485e0ac8 100644 --- a/src/Frapid.Web/Areas/Frapid.WebsiteBuilder/db/SQL Server/1.x/1.0/src/99.ownership.sql +++ b/src/Frapid.Web/Areas/Frapid.WebsiteBuilder/db/SQL Server/1.x/1.0/src/99.ownership.sql @@ -1,7 +1,13 @@ -EXEC sp_addrolemember @rolename = 'db_owner', @membername = 'frapid_db_user' +IF(IS_ROLEMEMBER ('db_owner') = 1) +BEGIN + EXEC sp_addrolemember @rolename = 'db_owner', @membername = 'frapid_db_user'; +END GO -EXEC sp_addrolemember @rolename = 'db_datareader', @membername = 'report_user' +IF(IS_ROLEMEMBER ('db_owner') = 1) +BEGIN + EXEC sp_addrolemember @rolename = 'db_datareader', @membername = 'report_user' +END GO DECLARE @proc sysname diff --git a/src/Frapid.Web/Areas/Frapid.WebsiteBuilder/db/SQL Server/1.x/1.0/website-blank.sql b/src/Frapid.Web/Areas/Frapid.WebsiteBuilder/db/SQL Server/1.x/1.0/website-blank.sql index 36f31292..a3f20683 100644 --- a/src/Frapid.Web/Areas/Frapid.WebsiteBuilder/db/SQL Server/1.x/1.0/website-blank.sql +++ b/src/Frapid.Web/Areas/Frapid.WebsiteBuilder/db/SQL Server/1.x/1.0/website-blank.sql @@ -715,10 +715,16 @@ EXECUTE auth.create_api_access_policy '{Admin}', @office_id, 'website.configurat -->-->-- src/Frapid.Web/Areas/Frapid.WebsiteBuilder/db/SQL Server/1.x/1.0/src/99.ownership.sql --<--<-- -EXEC sp_addrolemember @rolename = 'db_owner', @membername = 'frapid_db_user' +IF(IS_ROLEMEMBER ('db_owner') = 1) +BEGIN + EXEC sp_addrolemember @rolename = 'db_owner', @membername = 'frapid_db_user'; +END GO -EXEC sp_addrolemember @rolename = 'db_datareader', @membername = 'report_user' +IF(IS_ROLEMEMBER ('db_owner') = 1) +BEGIN + EXEC sp_addrolemember @rolename = 'db_datareader', @membername = 'report_user' +END GO DECLARE @proc sysname diff --git a/src/Frapid.Web/Areas/Frapid.WebsiteBuilder/db/SQL Server/website-blank.sql b/src/Frapid.Web/Areas/Frapid.WebsiteBuilder/db/SQL Server/website-blank.sql index 36f31292..a3f20683 100644 --- a/src/Frapid.Web/Areas/Frapid.WebsiteBuilder/db/SQL Server/website-blank.sql +++ b/src/Frapid.Web/Areas/Frapid.WebsiteBuilder/db/SQL Server/website-blank.sql @@ -715,10 +715,16 @@ EXECUTE auth.create_api_access_policy '{Admin}', @office_id, 'website.configurat -->-->-- src/Frapid.Web/Areas/Frapid.WebsiteBuilder/db/SQL Server/1.x/1.0/src/99.ownership.sql --<--<-- -EXEC sp_addrolemember @rolename = 'db_owner', @membername = 'frapid_db_user' +IF(IS_ROLEMEMBER ('db_owner') = 1) +BEGIN + EXEC sp_addrolemember @rolename = 'db_owner', @membername = 'frapid_db_user'; +END GO -EXEC sp_addrolemember @rolename = 'db_datareader', @membername = 'report_user' +IF(IS_ROLEMEMBER ('db_owner') = 1) +BEGIN + EXEC sp_addrolemember @rolename = 'db_datareader', @membername = 'report_user' +END GO DECLARE @proc sysname diff --git a/src/Frapid.Web/Areas/MixERP.Social/db/SQL Server/2.x/2.0/social-blank.sql b/src/Frapid.Web/Areas/MixERP.Social/db/SQL Server/2.x/2.0/social-blank.sql index 6ffb1833..6e273466 100644 --- a/src/Frapid.Web/Areas/MixERP.Social/db/SQL Server/2.x/2.0/social-blank.sql +++ b/src/Frapid.Web/Areas/MixERP.Social/db/SQL Server/2.x/2.0/social-blank.sql @@ -508,10 +508,16 @@ WHERE social.liked_by.unliked = 0; GO -->-->-- src/Frapid.Web/Areas/MixERP.Social/db/Sql Server/2.x/2.0/src/99.ownership.sql --<--<-- -EXEC sp_addrolemember @rolename = 'db_owner', @membername = 'frapid_db_user' +IF(IS_ROLEMEMBER ('db_owner') = 1) +BEGIN + EXEC sp_addrolemember @rolename = 'db_owner', @membername = 'frapid_db_user'; +END GO -EXEC sp_addrolemember @rolename = 'db_datareader', @membername = 'report_user' +IF(IS_ROLEMEMBER ('db_owner') = 1) +BEGIN + EXEC sp_addrolemember @rolename = 'db_datareader', @membername = 'report_user' +END GO DECLARE @proc sysname diff --git a/src/Frapid.Web/Areas/MixERP.Social/db/SQL Server/2.x/2.0/src/99.ownership.sql b/src/Frapid.Web/Areas/MixERP.Social/db/SQL Server/2.x/2.0/src/99.ownership.sql index 2fb7d9fa..485e0ac8 100644 --- a/src/Frapid.Web/Areas/MixERP.Social/db/SQL Server/2.x/2.0/src/99.ownership.sql +++ b/src/Frapid.Web/Areas/MixERP.Social/db/SQL Server/2.x/2.0/src/99.ownership.sql @@ -1,7 +1,13 @@ -EXEC sp_addrolemember @rolename = 'db_owner', @membername = 'frapid_db_user' +IF(IS_ROLEMEMBER ('db_owner') = 1) +BEGIN + EXEC sp_addrolemember @rolename = 'db_owner', @membername = 'frapid_db_user'; +END GO -EXEC sp_addrolemember @rolename = 'db_datareader', @membername = 'report_user' +IF(IS_ROLEMEMBER ('db_owner') = 1) +BEGIN + EXEC sp_addrolemember @rolename = 'db_datareader', @membername = 'report_user' +END GO DECLARE @proc sysname diff --git a/src/Frapid.Web/Areas/MixERP.Social/db/SQL Server/social-blank.sql b/src/Frapid.Web/Areas/MixERP.Social/db/SQL Server/social-blank.sql index 6ffb1833..6e273466 100644 --- a/src/Frapid.Web/Areas/MixERP.Social/db/SQL Server/social-blank.sql +++ b/src/Frapid.Web/Areas/MixERP.Social/db/SQL Server/social-blank.sql @@ -508,10 +508,16 @@ WHERE social.liked_by.unliked = 0; GO -->-->-- src/Frapid.Web/Areas/MixERP.Social/db/Sql Server/2.x/2.0/src/99.ownership.sql --<--<-- -EXEC sp_addrolemember @rolename = 'db_owner', @membername = 'frapid_db_user' +IF(IS_ROLEMEMBER ('db_owner') = 1) +BEGIN + EXEC sp_addrolemember @rolename = 'db_owner', @membername = 'frapid_db_user'; +END GO -EXEC sp_addrolemember @rolename = 'db_datareader', @membername = 'report_user' +IF(IS_ROLEMEMBER ('db_owner') = 1) +BEGIN + EXEC sp_addrolemember @rolename = 'db_datareader', @membername = 'report_user' +END GO DECLARE @proc sysname diff --git a/src/Frapid.Web/Controllers/AssetsController.cs b/src/Frapid.Web/Controllers/AssetsController.cs index 2d52efb3..7bc29330 100644 --- a/src/Frapid.Web/Controllers/AssetsController.cs +++ b/src/Frapid.Web/Controllers/AssetsController.cs @@ -4,8 +4,7 @@ using Frapid.Areas; using Frapid.Areas.Caching; using Frapid.AssetBundling; -using Frapid.Configuration; -using Frapid.Framework.Extensions; +using Frapid.Configuration.Models; using Frapid.Framework.StaticContent; using Serilog; @@ -16,8 +15,8 @@ public sealed class AssetsController : BaseController { private bool IsDevelopment() { - string value = ConfigurationManager.GetConfigurationValue("ParameterConfigFileLocation", "IsDevelopment"); - return value.Or("").ToUpperInvariant().StartsWith("T"); + var parameter = Parameter.Get(); + return parameter.IsDevelopment ?? false; } diff --git a/src/Frapid.Web/Controllers/EasyInstallController.cs b/src/Frapid.Web/Controllers/EasyInstallController.cs new file mode 100644 index 00000000..980b27ad --- /dev/null +++ b/src/Frapid.Web/Controllers/EasyInstallController.cs @@ -0,0 +1,133 @@ +using System.Web.Hosting; +using System.Web.Mvc; +using Frapid.Configuration.TenantServices; +using Frapid.Web.ViewModels; +using System.IO; +using System.Net; +using System.Net.Mime; +using System.Text; +using Newtonsoft.Json; +using System; +using Frapid.Web.Models; +using Frapid.Web.Models.Helpers; + +namespace Frapid.Web.Controllers +{ + public class EasyInstallController : Controller + { + private ActionResult Failed(string message, HttpStatusCode statusCode) + { + this.Response.StatusCode = (int)statusCode; + return this.Json(message, MediaTypeNames.Text.Plain, Encoding.UTF8, JsonRequestBehavior.AllowGet); + } + private ActionResult OK(string message) + { + this.Response.StatusCode = 200; + return this.Json(message, MediaTypeNames.Text.Plain, Encoding.UTF8, JsonRequestBehavior.AllowGet); + } + + [Route("easy-install")] + public ActionResult Index() + { + bool easyInstall = System.Configuration.ConfigurationManager.AppSettings["EasyInstall"].ToLowerInvariant() == "true"; + + if (!easyInstall) + { + return this.Failed("Access is denied. In order to use this feature, please enter a key named EasyInstall with value true on Web.config/AppSettings.", System.Net.HttpStatusCode.Conflict); + } + + if (!Directory.Exists(HostingEnvironment.MapPath("~/Resources/_Configs"))) + { + return this.Failed("Cannot continue. The configuration template directory: /Resources/_Configs was not found.", System.Net.HttpStatusCode.Conflict); + } + + var model = EasyInstallConfigFile.Get(); + + if (model == null) + { + model = new InstallViewModel + { + DomainName = this.Request.Url.Host, + DatabaseName = ByConvention.ConvertToTenantName(this.Request.Url.Host), + SqlServer = new SqlServerConfig(), + PostgreSQL = new PostgreSQLConfig() + }; + } + + return this.View("~/Views/EasyInstall.cshtml", model); + } + + [Route("easy-install")] + [HttpPut] + public ActionResult Save(InstallViewModel model) + { + EasyInstallModel.Save(model); + return this.OK("Configuration saved."); + } + + [Route("easy-install/test-redis")] + [HttpPut] + public ActionResult TestRedis() + { + string result = EasyInstallModel.TestRedis(); + + if (result.StartsWith("Error")) + { + return this.Failed(result, HttpStatusCode.InternalServerError); + } + + return this.OK(result); + } + + [Route("easy-install/test-sql-server")] + [HttpPut] + public ActionResult TestSqlServer() + { + string result = EasyInstallModel.TestSqlServer(); + + if (result.StartsWith("Error")) + { + return this.Failed(result, HttpStatusCode.InternalServerError); + } + + return this.OK(result); + } + + [Route("easy-install/test-postgresql")] + [HttpPut] + public ActionResult TestPostgreSQL() + { + string result = EasyInstallModel.TestPostgreSQL(); + + if (result.StartsWith("Error")) + { + return this.Failed(result, HttpStatusCode.InternalServerError); + } + + return this.OK(result); + } + + [Route("easy-install/test-permission")] + [HttpPut] + public ActionResult TestPermission() + { + var result = EasyInstallModel.TestPermission(); + return this.OK(JsonConvert.SerializeObject(result)); + } + + [Route("easy-install/write-config")] + [HttpPost] + public ActionResult WriteConfig() + { + try + { + var result = EasyInstallModel.WriteConfig(); + return this.OK(JsonConvert.SerializeObject(result)); + } + catch (Exception ex) + { + return this.Failed("Error: " + ex.Message, HttpStatusCode.InternalServerError); + } + } + } +} \ No newline at end of file diff --git a/src/Frapid.Web/Frapid.Web.csproj b/src/Frapid.Web/Frapid.Web.csproj index 62079020..04da0513 100644 --- a/src/Frapid.Web/Frapid.Web.csproj +++ b/src/Frapid.Web/Frapid.Web.csproj @@ -54,6 +54,9 @@ ..\packages\Antlr.3.5.0.2\lib\Antlr3.Runtime.dll True + + ..\packages\BCrypt-Official.0.1.109\lib\BCrypt.Net.dll + ..\packages\Common.Logging.3.3.1\lib\net40\Common.Logging.dll True @@ -143,6 +146,7 @@ ..\packages\Microsoft.Owin.Security.Twitter.3.0.1\lib\net45\Microsoft.Owin.Security.Twitter.dll True + ..\packages\Microsoft.Web.Infrastructure.1.0.0.0\lib\net40\Microsoft.Web.Infrastructure.dll True @@ -151,6 +155,9 @@ ..\packages\Newtonsoft.Json.10.0.3\lib\net45\Newtonsoft.Json.dll True + + ..\packages\Npgsql.3.1.9\lib\net451\Npgsql.dll + ..\packages\Owin.1.0\lib\net40\Owin.dll True @@ -267,10 +274,12 @@ + + @@ -280,8 +289,19 @@ + + + + + + + + + + +
@@ -289,6 +309,7 @@ + @@ -448,6 +469,8 @@ Web.config + + diff --git a/src/Frapid.Web/Hubs/EasyInstallerHub.cs b/src/Frapid.Web/Hubs/EasyInstallerHub.cs new file mode 100644 index 00000000..766178b6 --- /dev/null +++ b/src/Frapid.Web/Hubs/EasyInstallerHub.cs @@ -0,0 +1,94 @@ +using Frapid.Configuration; +using Frapid.Configuration.TenantServices; +using Frapid.Installer; +using Frapid.Installer.Helpers; +using Microsoft.AspNet.SignalR; +using Serilog; +using System; +using System.Linq; + +namespace Frapid.Web.Hubs +{ + public sealed class EasyInstallerHub: Hub + { + private string GetDomain() + { + string url = this.Context.Request.Url.Authority; + var extractor = new DomainNameExtractor(Log.Logger); + return extractor.GetDomain(url); + } + + public void Install() + { + if (!this.IsValidRequest()) + { + this.Clients.Caller.getNotification("Access is denied."); + return; + } + + string domain = this.GetDomain(); + var approved = new ApprovedDomainSerializer(); + var installed = new InstalledDomainSerializer(); + + if (!approved.GetMemberSites().Any(x => x.Equals(domain))) + { + this.OnError(this, "Domain not found."); + return; + } + var setup = approved.Get().FirstOrDefault(x => x.GetSubtenants().Contains(domain.ToLowerInvariant())); + + this.Do(setup); + } + + private void Do(ApprovedDomain site) + { + string url = site.DomainName; + InstallerLog.Verbose($"Installing frapid on domain {url}."); + + try + { + var installer = new Installer.Tenant.Installer(url, false); + + installer.Notification += delegate (object sender, string message) + { + if (message.StartsWith("Error")) + { + this.OnError(sender, message); + } + else + { + this.OnNotification(sender, message); + } + }; + + installer.InstallAsync().GetAwaiter().GetResult(); + + DbInstalledDomains.AddAsync(site).GetAwaiter().GetResult(); + new InstalledDomainSerializer().Add(site); + } + catch (Exception ex) + { + InstallerLog.Error("Could not install frapid on {url} due to errors. Exception: {Exception}", url, ex); + throw; + } + + } + + private void OnError(object sender, string message) + { + this.Clients.Caller.getEasyInstallerError(message); + } + + private void OnNotification(object sender, string message) + { + this.Clients.Caller.getEasyInstallerNotification(message); + } + + private bool IsValidRequest() + { + bool easyInstall = System.Configuration.ConfigurationManager.AppSettings["EasyInstall"].ToLowerInvariant() == "true"; + return easyInstall; + } + + } +} \ No newline at end of file diff --git a/src/Frapid.Web/LICENSE.txt b/src/Frapid.Web/LICENSE.txt new file mode 100644 index 00000000..d2109f08 --- /dev/null +++ b/src/Frapid.Web/LICENSE.txt @@ -0,0 +1,14 @@ +Copyright (c) 2006 Damien Miller (jBCrypt) +Copyright (c) 2013 Ryan D. Emerle (.Net port) + +Permission to use, copy, modify, and distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. \ No newline at end of file diff --git a/src/Frapid.Web/Models/EasyInstallModel.cs b/src/Frapid.Web/Models/EasyInstallModel.cs new file mode 100644 index 00000000..6c3d746c --- /dev/null +++ b/src/Frapid.Web/Models/EasyInstallModel.cs @@ -0,0 +1,44 @@ +using Frapid.Web.ViewModels; +using System.Collections.Generic; +using Frapid.Web.Models.Helpers; + +namespace Frapid.Web.Models +{ + public static class EasyInstallModel + { + public static string WriteConfig() + { + var model = EasyInstallConfigFile.Get(); + return ConfigWriter.WriteConfig(model); + } + + public static List TestPermission() + { + var directoriesToTest = new[] { "/Resource/", "/Resources", "/Tenants", "/Backups" }; + return FilePermissionHelper.TestPermission(directoriesToTest); + } + public static string TestPostgreSQL() + { + var model = EasyInstallConfigFile.Get(); + + return PostgreSQLConnectionTester.Test(model.PostgreSQL); + } + public static string TestSqlServer() + { + var model = EasyInstallConfigFile.Get(); + return SqlServerConnectionTester.Test(model.SqlServer); + } + + public static string TestRedis() + { + var model = EasyInstallConfigFile.Get(); + return RedisConnectionTester.Test(model.RedisConnectionString); + } + + public static void Save(InstallViewModel model) + { + EasyInstallConfigFile.Save(model); + } + } + +} \ No newline at end of file diff --git a/src/Frapid.Web/Models/Helpers/ConfigWriter.cs b/src/Frapid.Web/Models/Helpers/ConfigWriter.cs new file mode 100644 index 00000000..d2bb62fb --- /dev/null +++ b/src/Frapid.Web/Models/Helpers/ConfigWriter.cs @@ -0,0 +1,70 @@ +using Frapid.Web.ViewModels; +using Microsoft.VisualBasic.FileIO; +using Newtonsoft.Json; +using System.IO; +using System.Text; +using System.Web.Hosting; + +namespace Frapid.Web.Models.Helpers +{ + internal static class ConfigWriter + { + private static void WriteFile(object item, string path) + { + string contents = JsonConvert.SerializeObject(item, Formatting.Indented); + File.WriteAllText(HostingEnvironment.MapPath(path), contents, new UTF8Encoding(false)); + } + + + internal static string WriteConfig(InstallViewModel model) + { + string pathToConfigTemplateDirectory = HostingEnvironment.MapPath("~/Resources/_Configs"); + string pathToConfigDirectory = HostingEnvironment.MapPath("~/Resources/Configs"); + + + if (!Directory.Exists(pathToConfigDirectory)) + { + FileSystem.CopyDirectory(pathToConfigTemplateDirectory, pathToConfigDirectory); + } + + WriteFile(model.SqlServer, "~/Resources/Configs/SQLServer.json"); + WriteFile(model.PostgreSQL, "~/Resources/Configs/PostgreSQL.json"); + + WriteFile(new[] + { + new + { + model.DbProvider, + model.DomainName, + model.DatabaseName, + EnforceSsl = false, + CdnDomain = "", + Synonyms = new string[] { }, + BackupDirectory = "", + BackupDirectoryIsFixedPath = false, + AdminEmail = model.ApplicationUser, + BcryptedAdminPassword = PasswordManager.GetHashedPassword(model.ApplicationUser, model.ApplicationUserPassword) + } + }, "~/Resources/Configs/DomainsApproved.json"); + + WriteFile(new + { + Cultures = "en", + ApplicationLogDirectory = @"C:\frapid-logs", + MinimumLogLevel = "Information", + BackupScheduleUTC = "0, 15", + EodScheduleUTC = "0, 5", + model.DefaultCacheType, + IsDevelopment = true + }, "~/Resources/Configs/Parameters.json"); + + WriteFile(new + { + ConfigString = model.RedisConnectionString + }, "~/Resources/Configs/RedisConfig.json"); + + return "OK"; + } + + } +} diff --git a/src/Frapid.Web/Models/Helpers/EasyInstallConfigFile.cs b/src/Frapid.Web/Models/Helpers/EasyInstallConfigFile.cs new file mode 100644 index 00000000..28b98480 --- /dev/null +++ b/src/Frapid.Web/Models/Helpers/EasyInstallConfigFile.cs @@ -0,0 +1,29 @@ +using Frapid.Web.ViewModels; +using Newtonsoft.Json; +using System.IO; +using System.Text; +using System.Web.Hosting; + +namespace Frapid.Web.Models.Helpers +{ + internal static class EasyInstallConfigFile + { + private static string path = HostingEnvironment.MapPath("~/Resource/Temp/EasyInstall.json"); + internal static InstallViewModel Get() + { + if (!File.Exists(path)) + { + return null; + } + + string contents = File.ReadAllText(path, new UTF8Encoding(false)); + return JsonConvert.DeserializeObject(contents); + } + + internal static void Save(InstallViewModel model) + { + string contents = JsonConvert.SerializeObject(model, Formatting.Indented); + File.WriteAllText(path, contents, new UTF8Encoding(false)); + } + } +} diff --git a/src/Frapid.Web/Models/Helpers/FilePermissionHelper.cs b/src/Frapid.Web/Models/Helpers/FilePermissionHelper.cs new file mode 100644 index 00000000..db0a9cac --- /dev/null +++ b/src/Frapid.Web/Models/Helpers/FilePermissionHelper.cs @@ -0,0 +1,55 @@ +using System.Collections.Generic; +using System.IO; +using System.Web.Hosting; + +namespace Frapid.Web.Models.Helpers +{ + internal static class FilePermissionHelper + { + private static bool IsDirectoryWritable(string dirPath, bool throwIfFails = false) + { + try + { + using (FileStream fs = File.Create( + Path.Combine( + dirPath, + Path.GetRandomFileName() + ), + 1, + FileOptions.DeleteOnClose) + ) + { } + return true; + } + catch + { + if (throwIfFails) + throw; + else + return false; + } + } + + internal static List TestPermission(string[] directoriesToTest) + { + var result = new List(); + + foreach (var directoryToTest in directoriesToTest) + { + string directory = HostingEnvironment.MapPath(directoryToTest); + bool hasPermission = IsDirectoryWritable(directory); + + if (hasPermission) + { + result.Add($"OK: Directory {directoryToTest} is writable"); + } + else + { + result.Add($"Error: Can't write to the directory {directoryToTest}"); + } + } + + return result; + } + } +} diff --git a/src/Frapid.Web/Models/Helpers/PasswordManager.cs b/src/Frapid.Web/Models/Helpers/PasswordManager.cs new file mode 100644 index 00000000..0470d8a8 --- /dev/null +++ b/src/Frapid.Web/Models/Helpers/PasswordManager.cs @@ -0,0 +1,11 @@ +namespace Frapid.Web.Models.Helpers +{ + internal static class PasswordManager + { + internal static string GetHashedPassword(string userName, string plainPassword) + { + string salt = BCrypt.Net.BCrypt.GenerateSalt(10); + return BCrypt.Net.BCrypt.HashPassword(userName + plainPassword, salt); + } + } +} diff --git a/src/Frapid.Web/Models/Helpers/PostgreSQLConnectionTester.cs b/src/Frapid.Web/Models/Helpers/PostgreSQLConnectionTester.cs new file mode 100644 index 00000000..08b81726 --- /dev/null +++ b/src/Frapid.Web/Models/Helpers/PostgreSQLConnectionTester.cs @@ -0,0 +1,43 @@ +using Frapid.Web.ViewModels; +using Npgsql; +using System; + +namespace Frapid.Web.Models.Helpers +{ + internal static class PostgreSQLConnectionTester + { + internal static string Test(PostgreSQLConfig config) + { + var builder = new NpgsqlConnectionStringBuilder + { + Host = config.Server, + Port = config.Port, + Pooling = config.EnablePooling, + MinPoolSize = config.MinPoolSize, + MaxPoolSize = config.MaxPoolSize, + Username = config.SuperUserId, + Password = config.SuperUserPassword + }; + + + using (var connection = new NpgsqlConnection(builder.ConnectionString)) + { + using (var command = new NpgsqlCommand("SELECT 1;", connection)) + { + try + { + connection.Open(); + command.ExecuteNonQuery(); + } + catch (Exception ex) + { + return "Error: " + ex.Message; + } + + } + } + + return "Connection to PostgreSQL was successful."; + } + } +} diff --git a/src/Frapid.Web/Models/Helpers/RedisConnectionTester.cs b/src/Frapid.Web/Models/Helpers/RedisConnectionTester.cs new file mode 100644 index 00000000..d06fd477 --- /dev/null +++ b/src/Frapid.Web/Models/Helpers/RedisConnectionTester.cs @@ -0,0 +1,24 @@ +using StackExchange.Redis; +using System; + +namespace Frapid.Web.Models.Helpers +{ + internal static class RedisConnectionTester + { + internal static string Test(string connectionString) + { + try + { + var Redis = ConnectionMultiplexer.Connect(connectionString); + Redis.PreserveAsyncOrder = false; + } + catch (Exception ex) + { + return "Error: " + ex.Message; + } + + return "Connection to Redis was successful."; + } + + } +} diff --git a/src/Frapid.Web/Models/Helpers/SqlServerConnectionTester.cs b/src/Frapid.Web/Models/Helpers/SqlServerConnectionTester.cs new file mode 100644 index 00000000..4adc4021 --- /dev/null +++ b/src/Frapid.Web/Models/Helpers/SqlServerConnectionTester.cs @@ -0,0 +1,52 @@ +using Frapid.Web.ViewModels; +using System; +using System.Data.SqlClient; + +namespace Frapid.Web.Models.Helpers +{ + internal static class SqlServerConnectionTester + { + internal static string Test(SqlServerConfig config) + { + var builder = new SqlConnectionStringBuilder + { + DataSource = config.Server, + NetworkLibrary = config.NetworkLibrary, + Pooling = config.EnablePooling, + MinPoolSize = config.MinPoolSize, + MaxPoolSize = config.MaxPoolSize + }; + + if (config.TrustedSuperUserConnection) + { + builder.IntegratedSecurity = true; + } + else + { + builder.UserID = config.SuperUserId; + builder.Password = config.SuperUserPassword; + } + + + using (var connection = new SqlConnection(builder.ConnectionString)) + { + using (var command = new SqlCommand("SELECT 1;", connection)) + { + try + { + connection.Open(); + command.ExecuteNonQuery(); + } + catch (Exception ex) + { + return "Error: " + ex.Message; + } + + } + } + + return "Connection to SQL Server was successful."; + } + + } +} diff --git a/src/Frapid.Web/Resources/_Configs/Parameters.config b/src/Frapid.Web/Resources/_Configs/Parameters.config deleted file mode 100644 index f9a525bc..00000000 --- a/src/Frapid.Web/Resources/_Configs/Parameters.config +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - \ No newline at end of file diff --git a/src/Frapid.Web/Resources/_Configs/PostgreSQL.config b/src/Frapid.Web/Resources/_Configs/PostgreSQL.config deleted file mode 100644 index dd369581..00000000 --- a/src/Frapid.Web/Resources/_Configs/PostgreSQL.config +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/Frapid.Web/Resources/_Configs/RblServers.config b/src/Frapid.Web/Resources/_Configs/RblServers.config deleted file mode 100644 index 83722e3b..00000000 --- a/src/Frapid.Web/Resources/_Configs/RblServers.config +++ /dev/null @@ -1,91 +0,0 @@ -cbl.abuseat.org -b.barracudacentral.org -bb.barracudacentral.org -ubl.unsubscore.com -dyna.spamrats.com -db.wpbl.info -sbl.nszones.com -bl.nszones.com -dnsbl.abuse.ch -dnsbl.anticaptcha.net -l2.apews.org -duinv.aupads.org -rsbl.aupads.org -ips.backscatterer.org -bl.blocklist.de -dnsbl.cobion.com -bogons.cymru.com -dnsrbl.org -spamtrap.drbl.drand.net -dnsbl.dronebl.org -spamsources.fabel.dk -truncate.gbudb.net -msgid.bl.gweep.ca -proxy.bl.gweep.ca -relays.bl.gweep.ca -hil.habeas.com -blocked.hilli.dk -dnsbl.inps.de -rbl.iprange.net -dialup.blacklist.jippg.org -mail-abuse.blacklist.jippg.org -black.junkemailfilter.com -dnsbl.justspam.org -dnsbl.kempt.net -blacklist.sci.kun.nl -spamguard.leadmon.net -dialups.mail-abuse.org -relays.mail-abuse.org -bl.mailspike.net -ix.dnsbl.manitu.net -rbl.megarbl.net -no-more-funn.moensted.dk -relays.nether.net -dev.null.dk -spam.olsentech.net -dnsbl.antispam.or.id -pss.spambusters.org.ar -cblless.anti-spam.org.cn -bad.psky.me -list.quorum.to -access.redhawk.org -all.s5h.net -rbl.schulte.org -exitnodes.tor.dnsbl.sectoor.de -korea.services.net -rbl.snark.net -block.dnsbl.sorbs.net -dnsbl.sorbs.net -dul.dnsbl.sorbs.net -escalations.dnsbl.sorbs.net -http.dnsbl.sorbs.net -misc.dnsbl.sorbs.net -new.dnsbl.sorbs.net -new.spam.dnsbl.sorbs.net -old.dnsbl.sorbs.net -recent.dnsbl.sorbs.net -recent.spam.dnsbl.sorbs.net -safe.dnsbl.sorbs.net -smtp.dnsbl.sorbs.net -socks.dnsbl.sorbs.net -spam.dnsbl.sorbs.net -web.dnsbl.sorbs.net -zombie.dnsbl.sorbs.net -bl.spamcannibal.org -bl.spamcop.net -zen.spamhaus.org -noptr.spamrats.com -spam.spamrats.com -srnblack.surgate.net -cart00ney.surriel.com -psbl.surriel.com -bl.tiopan.com -dnsbl.tornevall.org -opm.tornevall.org -dnsbl-1.uceprotect.net -dnsbl-2.uceprotect.net -dnsbl-3.uceprotect.net -intruders.docs.uu.se -dialups.visi.com -all.rbl.webiron.net -blackholes.wirehub.net \ No newline at end of file diff --git a/src/Frapid.Web/Resources/_Configs/Reports.config b/src/Frapid.Web/Resources/_Configs/Reports.config deleted file mode 100644 index fee428e1..00000000 --- a/src/Frapid.Web/Resources/_Configs/Reports.config +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/src/Frapid.Web/Resources/_Configs/SQLServer.config b/src/Frapid.Web/Resources/_Configs/SQLServer.config deleted file mode 100644 index 92855a9e..00000000 --- a/src/Frapid.Web/Resources/_Configs/SQLServer.config +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/Frapid.Web/ViewModels/InstallViewModel.cs b/src/Frapid.Web/ViewModels/InstallViewModel.cs new file mode 100644 index 00000000..5a705c2c --- /dev/null +++ b/src/Frapid.Web/ViewModels/InstallViewModel.cs @@ -0,0 +1,23 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Web; + +namespace Frapid.Web.ViewModels +{ + public class InstallViewModel + { + public string DomainName { get; set; } + public string DbProvider { get; set; } + public string DatabaseName { get; set; } + public bool SkipDatabaseCreation { get; set; } = true; + public string DefaultCacheType { get; set; } = "InProc"; + public string RedisConnectionString { get; set; } = "localhost"; + public string ApplicationUser { get; set; } + public string ApplicationUserPassword { get; set; } + public string ConfirmApplicationUserPassword { get; set; } + + public SqlServerConfig SqlServer { get; set; } + public PostgreSQLConfig PostgreSQL { get; set; } + } +} \ No newline at end of file diff --git a/src/Frapid.Web/ViewModels/PostgreSQLConfig.cs b/src/Frapid.Web/ViewModels/PostgreSQLConfig.cs new file mode 100644 index 00000000..6914555f --- /dev/null +++ b/src/Frapid.Web/ViewModels/PostgreSQLConfig.cs @@ -0,0 +1,21 @@ +namespace Frapid.Web.ViewModels +{ + public class PostgreSQLConfig + { + public string Server { get; set; } + public int Port { get; set; } = 5432; + public string MetaDatabase { get; set; } = "postgres"; + public bool EnablePooling { get; set; } = true; + public int MinPoolSize { get; set; } = 1; + public int MaxPoolSize { get; set; } = 100; + public string SuperUserId { get; set; } = "postgres"; + public string SuperUserPassword { get; set; } + public bool TrustedSuperUserConnection { get; set; } + public string UserId { get; set; } + public string Password { get; set; } + public string ReportUserId { get; set; } + public string ReportUserPassword { get; set; } + public string PostgreSQLBinDirectory { get; set; } + public string DatabaseBackupDirectory { get; set; } = "/Backups/"; + } +} \ No newline at end of file diff --git a/src/Frapid.Web/ViewModels/SqlServerConfig.cs b/src/Frapid.Web/ViewModels/SqlServerConfig.cs new file mode 100644 index 00000000..0bd28976 --- /dev/null +++ b/src/Frapid.Web/ViewModels/SqlServerConfig.cs @@ -0,0 +1,22 @@ +namespace Frapid.Web.ViewModels +{ + public class SqlServerConfig + { + public string Server { get; set; } = "localhost"; + public int Port { get; set; } = 0; + public string MetaDatabase { get; set; } = "master"; + public bool EnablePooling { get; set; } = true; + public int MinPoolSize { get; set; } = 1; + public int MaxPoolSize { get; set; } = 100; + public string SuperUserId { get; set; } = "sa"; + public string SuperUserPassword { get; set; } + public bool TrustedSuperUserConnection { get; set; } = true; + + public string NetworkLibrary { get; set; } = "dbmssocn"; + public string UserId { get; set; } + public string Password { get; set; } + public string ReportUserId { get; set; } + public string ReportUserPassword { get; set; } + public string DatabaseBackupDirectory { get; set; } = "/Backups/"; + } +} \ No newline at end of file diff --git a/src/Frapid.Web/Views/EasyInstall.cshtml b/src/Frapid.Web/Views/EasyInstall.cshtml new file mode 100644 index 00000000..0f928a48 --- /dev/null +++ b/src/Frapid.Web/Views/EasyInstall.cshtml @@ -0,0 +1,755 @@ +@model Frapid.Web.ViewModels.InstallViewModel + +@{ + + Layout = null; +} + + + + + + + Installation + + + + + + + + + +
+
+ + + + + +
+
+
+
Frapid Easy Installer
+

Welcome to Frapid Easy install. Check out the configuration options.

+
+
+ Save -> Saves your settings but does not apply them. +
+
Permission -> Checks the directory permission on the server, the directories where Frapid needs write access to.
+
Configs --> List of configuration parameters you need to setup.
+
Write Config --> Writes your config to the website before you can actually create a site.
+
Create Site --> Creates your website according to your configuration data.
+
+ + +
+ +
+ + + + + + + + + +
+
+
+
+
Console
+ +
+
+
+ +
+
+
    +
    +
    +
    +
    +
    +
    +
    +
    + + + + diff --git a/src/Frapid.Web/Views/web.config b/src/Frapid.Web/Views/web.config new file mode 100644 index 00000000..abdbabf1 --- /dev/null +++ b/src/Frapid.Web/Views/web.config @@ -0,0 +1,44 @@ + + + + + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/Frapid.Web/Web.config b/src/Frapid.Web/Web.config index 9deba831..f019d525 100644 --- a/src/Frapid.Web/Web.config +++ b/src/Frapid.Web/Web.config @@ -10,10 +10,9 @@ - - + diff --git a/src/Frapid.Web/db/SQL Server/1.1.update/core-blank-1.1.update.sql b/src/Frapid.Web/db/SQL Server/1.1.update/core-blank-1.1.update.sql index a85b85ba..049d0348 100644 --- a/src/Frapid.Web/db/SQL Server/1.1.update/core-blank-1.1.update.sql +++ b/src/Frapid.Web/db/SQL Server/1.1.update/core-blank-1.1.update.sql @@ -32,30 +32,46 @@ GO -->-->-- src/Frapid.Web/db/SQL Server/1.1.update/src/99.ownership.sql --<--<-- -IF NOT EXISTS -( - SELECT * FROM sys.database_principals - WHERE name = 'frapid_db_user' -) +IF(IS_ROLEMEMBER ('db_owner') = 1) BEGIN -CREATE USER frapid_db_user FROM LOGIN frapid_db_user; + IF NOT EXISTS + ( + SELECT * FROM sys.database_principals + WHERE name = 'frapid_db_user' + ) + BEGIN + CREATE USER frapid_db_user FROM LOGIN frapid_db_user; + END END + GO -EXEC sp_addrolemember @rolename = 'db_owner', @membername = 'frapid_db_user' +IF(IS_ROLEMEMBER ('db_owner') = 1) +BEGIN + EXEC sp_addrolemember @rolename = 'db_owner', @membername = 'frapid_db_user' +END + GO -IF NOT EXISTS -( - SELECT * FROM sys.database_principals - WHERE name = 'report_user' -) +IF(IS_ROLEMEMBER ('db_owner') = 1) BEGIN -CREATE USER report_user FROM LOGIN report_user; + IF NOT EXISTS + ( + SELECT * FROM sys.database_principals + WHERE name = 'report_user' + ) + BEGIN + CREATE USER report_user FROM LOGIN report_user; + END END + GO -EXEC sp_addrolemember @rolename = 'db_datareader', @membername = 'report_user' +IF(IS_ROLEMEMBER ('db_owner') = 1) +BEGIN + EXEC sp_addrolemember @rolename = 'db_datareader', @membername = 'report_user' +END + GO diff --git a/src/Frapid.Web/db/SQL Server/1.1.update/src/99.ownership.sql b/src/Frapid.Web/db/SQL Server/1.1.update/src/99.ownership.sql index 4c475bed..d45b3902 100644 --- a/src/Frapid.Web/db/SQL Server/1.1.update/src/99.ownership.sql +++ b/src/Frapid.Web/db/SQL Server/1.1.update/src/99.ownership.sql @@ -1,27 +1,43 @@ -IF NOT EXISTS -( - SELECT * FROM sys.database_principals - WHERE name = 'frapid_db_user' -) +IF(IS_ROLEMEMBER ('db_owner') = 1) BEGIN -CREATE USER frapid_db_user FROM LOGIN frapid_db_user; + IF NOT EXISTS + ( + SELECT * FROM sys.database_principals + WHERE name = 'frapid_db_user' + ) + BEGIN + CREATE USER frapid_db_user FROM LOGIN frapid_db_user; + END END + GO -EXEC sp_addrolemember @rolename = 'db_owner', @membername = 'frapid_db_user' +IF(IS_ROLEMEMBER ('db_owner') = 1) +BEGIN + EXEC sp_addrolemember @rolename = 'db_owner', @membername = 'frapid_db_user' +END + GO -IF NOT EXISTS -( - SELECT * FROM sys.database_principals - WHERE name = 'report_user' -) +IF(IS_ROLEMEMBER ('db_owner') = 1) BEGIN -CREATE USER report_user FROM LOGIN report_user; + IF NOT EXISTS + ( + SELECT * FROM sys.database_principals + WHERE name = 'report_user' + ) + BEGIN + CREATE USER report_user FROM LOGIN report_user; + END END + GO -EXEC sp_addrolemember @rolename = 'db_datareader', @membername = 'report_user' +IF(IS_ROLEMEMBER ('db_owner') = 1) +BEGIN + EXEC sp_addrolemember @rolename = 'db_datareader', @membername = 'report_user' +END + GO diff --git a/src/Frapid.Web/db/SQL Server/1.x/1.0/core-blank.sql b/src/Frapid.Web/db/SQL Server/1.x/1.0/core-blank.sql index 619e5baa..9d82c9ec 100644 --- a/src/Frapid.Web/db/SQL Server/1.x/1.0/core-blank.sql +++ b/src/Frapid.Web/db/SQL Server/1.x/1.0/core-blank.sql @@ -1405,30 +1405,46 @@ GO -->-->-- src/Frapid.Web/db/SQL Server/1.x/1.0/src/99.ownership.sql --<--<-- -IF NOT EXISTS -( - SELECT * FROM sys.database_principals - WHERE name = 'frapid_db_user' -) +IF(IS_ROLEMEMBER ('db_owner') = 1) BEGIN -CREATE USER frapid_db_user FROM LOGIN frapid_db_user; + IF NOT EXISTS + ( + SELECT * FROM sys.database_principals + WHERE name = 'frapid_db_user' + ) + BEGIN + CREATE USER frapid_db_user FROM LOGIN frapid_db_user; + END END + GO -EXEC sp_addrolemember @rolename = 'db_owner', @membername = 'frapid_db_user' +IF(IS_ROLEMEMBER ('db_owner') = 1) +BEGIN + EXEC sp_addrolemember @rolename = 'db_owner', @membername = 'frapid_db_user' +END + GO -IF NOT EXISTS -( - SELECT * FROM sys.database_principals - WHERE name = 'report_user' -) +IF(IS_ROLEMEMBER ('db_owner') = 1) BEGIN -CREATE USER report_user FROM LOGIN report_user; + IF NOT EXISTS + ( + SELECT * FROM sys.database_principals + WHERE name = 'report_user' + ) + BEGIN + CREATE USER report_user FROM LOGIN report_user; + END END + GO -EXEC sp_addrolemember @rolename = 'db_datareader', @membername = 'report_user' +IF(IS_ROLEMEMBER ('db_owner') = 1) +BEGIN + EXEC sp_addrolemember @rolename = 'db_datareader', @membername = 'report_user' +END + GO diff --git a/src/Frapid.Web/db/SQL Server/1.x/1.0/src/99.ownership.sql b/src/Frapid.Web/db/SQL Server/1.x/1.0/src/99.ownership.sql index 4c475bed..d45b3902 100644 --- a/src/Frapid.Web/db/SQL Server/1.x/1.0/src/99.ownership.sql +++ b/src/Frapid.Web/db/SQL Server/1.x/1.0/src/99.ownership.sql @@ -1,27 +1,43 @@ -IF NOT EXISTS -( - SELECT * FROM sys.database_principals - WHERE name = 'frapid_db_user' -) +IF(IS_ROLEMEMBER ('db_owner') = 1) BEGIN -CREATE USER frapid_db_user FROM LOGIN frapid_db_user; + IF NOT EXISTS + ( + SELECT * FROM sys.database_principals + WHERE name = 'frapid_db_user' + ) + BEGIN + CREATE USER frapid_db_user FROM LOGIN frapid_db_user; + END END + GO -EXEC sp_addrolemember @rolename = 'db_owner', @membername = 'frapid_db_user' +IF(IS_ROLEMEMBER ('db_owner') = 1) +BEGIN + EXEC sp_addrolemember @rolename = 'db_owner', @membername = 'frapid_db_user' +END + GO -IF NOT EXISTS -( - SELECT * FROM sys.database_principals - WHERE name = 'report_user' -) +IF(IS_ROLEMEMBER ('db_owner') = 1) BEGIN -CREATE USER report_user FROM LOGIN report_user; + IF NOT EXISTS + ( + SELECT * FROM sys.database_principals + WHERE name = 'report_user' + ) + BEGIN + CREATE USER report_user FROM LOGIN report_user; + END END + GO -EXEC sp_addrolemember @rolename = 'db_datareader', @membername = 'report_user' +IF(IS_ROLEMEMBER ('db_owner') = 1) +BEGIN + EXEC sp_addrolemember @rolename = 'db_datareader', @membername = 'report_user' +END + GO diff --git a/src/Frapid.Web/db/SQL Server/core-blank-1.1.update.sql b/src/Frapid.Web/db/SQL Server/core-blank-1.1.update.sql index a85b85ba..049d0348 100644 --- a/src/Frapid.Web/db/SQL Server/core-blank-1.1.update.sql +++ b/src/Frapid.Web/db/SQL Server/core-blank-1.1.update.sql @@ -32,30 +32,46 @@ GO -->-->-- src/Frapid.Web/db/SQL Server/1.1.update/src/99.ownership.sql --<--<-- -IF NOT EXISTS -( - SELECT * FROM sys.database_principals - WHERE name = 'frapid_db_user' -) +IF(IS_ROLEMEMBER ('db_owner') = 1) BEGIN -CREATE USER frapid_db_user FROM LOGIN frapid_db_user; + IF NOT EXISTS + ( + SELECT * FROM sys.database_principals + WHERE name = 'frapid_db_user' + ) + BEGIN + CREATE USER frapid_db_user FROM LOGIN frapid_db_user; + END END + GO -EXEC sp_addrolemember @rolename = 'db_owner', @membername = 'frapid_db_user' +IF(IS_ROLEMEMBER ('db_owner') = 1) +BEGIN + EXEC sp_addrolemember @rolename = 'db_owner', @membername = 'frapid_db_user' +END + GO -IF NOT EXISTS -( - SELECT * FROM sys.database_principals - WHERE name = 'report_user' -) +IF(IS_ROLEMEMBER ('db_owner') = 1) BEGIN -CREATE USER report_user FROM LOGIN report_user; + IF NOT EXISTS + ( + SELECT * FROM sys.database_principals + WHERE name = 'report_user' + ) + BEGIN + CREATE USER report_user FROM LOGIN report_user; + END END + GO -EXEC sp_addrolemember @rolename = 'db_datareader', @membername = 'report_user' +IF(IS_ROLEMEMBER ('db_owner') = 1) +BEGIN + EXEC sp_addrolemember @rolename = 'db_datareader', @membername = 'report_user' +END + GO diff --git a/src/Frapid.Web/db/SQL Server/core-blank.sql b/src/Frapid.Web/db/SQL Server/core-blank.sql index 619e5baa..9d82c9ec 100644 --- a/src/Frapid.Web/db/SQL Server/core-blank.sql +++ b/src/Frapid.Web/db/SQL Server/core-blank.sql @@ -1405,30 +1405,46 @@ GO -->-->-- src/Frapid.Web/db/SQL Server/1.x/1.0/src/99.ownership.sql --<--<-- -IF NOT EXISTS -( - SELECT * FROM sys.database_principals - WHERE name = 'frapid_db_user' -) +IF(IS_ROLEMEMBER ('db_owner') = 1) BEGIN -CREATE USER frapid_db_user FROM LOGIN frapid_db_user; + IF NOT EXISTS + ( + SELECT * FROM sys.database_principals + WHERE name = 'frapid_db_user' + ) + BEGIN + CREATE USER frapid_db_user FROM LOGIN frapid_db_user; + END END + GO -EXEC sp_addrolemember @rolename = 'db_owner', @membername = 'frapid_db_user' +IF(IS_ROLEMEMBER ('db_owner') = 1) +BEGIN + EXEC sp_addrolemember @rolename = 'db_owner', @membername = 'frapid_db_user' +END + GO -IF NOT EXISTS -( - SELECT * FROM sys.database_principals - WHERE name = 'report_user' -) +IF(IS_ROLEMEMBER ('db_owner') = 1) BEGIN -CREATE USER report_user FROM LOGIN report_user; + IF NOT EXISTS + ( + SELECT * FROM sys.database_principals + WHERE name = 'report_user' + ) + BEGIN + CREATE USER report_user FROM LOGIN report_user; + END END + GO -EXEC sp_addrolemember @rolename = 'db_datareader', @membername = 'report_user' +IF(IS_ROLEMEMBER ('db_owner') = 1) +BEGIN + EXEC sp_addrolemember @rolename = 'db_datareader', @membername = 'report_user' +END + GO diff --git a/src/Frapid.Web/packages.config b/src/Frapid.Web/packages.config index 4e8176fc..89f180c7 100644 --- a/src/Frapid.Web/packages.config +++ b/src/Frapid.Web/packages.config @@ -1,6 +1,7 @@  + @@ -43,6 +44,7 @@ + diff --git a/src/Frapid.Web/scripts/frapid/utilities/validator.js b/src/Frapid.Web/scripts/frapid/utilities/validator.js index 93e6e61c..204f4f15 100644 --- a/src/Frapid.Web/scripts/frapid/utilities/validator.js +++ b/src/Frapid.Web/scripts/frapid/utilities/validator.js @@ -18,7 +18,11 @@ }; var isValid = true; - var requiredFieldMessage = translate("ThisFieldIsRequired"); + var requiredFieldMessage = "This field is required"; + + if (typeof (window.translate) === "function") { + requiredFieldMessage = window.translate("ThisFieldIsRequired"); + }; this.logError = function (message) { console.log(message); diff --git a/src/Libraries/Frapid.Areas/Caching/FrapidOutputCahce.cs b/src/Libraries/Frapid.Areas/Caching/FrapidOutputCahce.cs index 4fc272d2..af426c5e 100644 --- a/src/Libraries/Frapid.Areas/Caching/FrapidOutputCahce.cs +++ b/src/Libraries/Frapid.Areas/Caching/FrapidOutputCahce.cs @@ -225,15 +225,13 @@ public override void OnActionExecuting(ActionExecutingContext filterContext) } // We have a cached version on the server side - if (cachedItem != null) + if (cachedItem != null && cachedItem.Content != null) { // We inject the previous result into the MVC pipeline // The MVC action won't execute as we injected the previous cached result. filterContext.Result = new ContentResult { - Content = - this.DonutHoleFiller.ReplaceDonutHoleContent(cachedItem.Content, filterContext, - this.CacheSettings.Options), + Content = this.DonutHoleFiller.ReplaceDonutHoleContent(cachedItem.Content, filterContext, this.CacheSettings.Options), ContentType = cachedItem.ContentType }; } diff --git a/src/Libraries/Frapid.Areas/DnsSpamLookupHelper.cs b/src/Libraries/Frapid.Areas/DnsSpamLookupHelper.cs index 1806fe12..d16e85ad 100644 --- a/src/Libraries/Frapid.Areas/DnsSpamLookupHelper.cs +++ b/src/Libraries/Frapid.Areas/DnsSpamLookupHelper.cs @@ -13,12 +13,12 @@ internal static class DnsSpamLookupHelper private static string[] GetRblServers(string tenant) { //Check RBL server list in tenant directory. - string path = PathMapper.MapPath($"/Tenants/{tenant}/Configs/RblServers.config"); + string path = PathMapper.MapPath($"/Tenants/{tenant}/Configs/RblServers.ini"); if (!File.Exists(path)) { //Fallback to shared RBL server list. - path = PathMapper.MapPath($"/Resources/Configs/RblServers.config"); + path = PathMapper.MapPath($"/Resources/Configs/RblServers.ini"); } if (path == null || diff --git a/src/Libraries/Frapid.Backups/DbServer.cs b/src/Libraries/Frapid.Backups/DbServer.cs index 381ad263..129d21b0 100644 --- a/src/Libraries/Frapid.Backups/DbServer.cs +++ b/src/Libraries/Frapid.Backups/DbServer.cs @@ -1,6 +1,5 @@ -using Frapid.Configuration; -using Frapid.Configuration.Db; -using Frapid.Framework.Extensions; +using Frapid.Configuration.Db; +using Frapid.Configuration.DTO; namespace Frapid.Backups { @@ -9,13 +8,34 @@ public sealed class DbServer public DbServer(string tenant) { this.Tenant = tenant; - this.ProviderName = this.GetConfig("ProviderName"); - this.BinDirectory = this.GetConfig("PostgreSQLBinDirectory"); - this.DatabaseBackupDirectory = this.GetConfig("DatabaseBackupDirectory"); - this.HostName = this.GetConfig("Server"); - this.PortNumber = this.GetConfig("Port").To(); - this.UserId = this.GetConfig("UserId"); - this.Password = this.GetConfig("Password"); + + string provider = DbProvider.GetProviderName(tenant); + + if (provider.ToUpperInvariant().Equals("NPGSQL")) + { + var config = PostgreSQLConfig.Get(); + + this.ProviderName = provider; + this.BinDirectory = config.PostgreSQLBinDirectory; + this.DatabaseBackupDirectory = config.DatabaseBackupDirectory; + this.HostName = config.Server; + this.PortNumber = config.Port ?? 5432; + this.UserId = config.UserId; + this.Password = config.Password; + } + + if (provider.ToUpperInvariant().Equals("SYSTEM.DATA.SQLCLIENT")) + { + var config = SqlServerConfig.Get(); + + this.ProviderName = provider; + this.DatabaseBackupDirectory = config.DatabaseBackupDirectory; + this.HostName = config.Server; + this.PortNumber = config.Port ?? 0; + this.UserId = config.UserId; + this.Password = config.Password; + } + this.Validate(); } @@ -30,14 +50,6 @@ public DbServer(string tenant) public int PortNumber { get; set; } public string UserId { get; set; } - private string GetConfig(string key) - { - string path = DbProvider.GetDbConfigurationFilePath(this.Tenant); - path = PathMapper.MapPath(path); - - return ConfigurationManager.ReadConfigurationValue(path, key); - } - public void Validate() { this.IsValid = true; diff --git a/src/Libraries/Frapid.Configuration/CacheConfig.cs b/src/Libraries/Frapid.Configuration/CacheConfig.cs index 516719a8..57ba9263 100644 --- a/src/Libraries/Frapid.Configuration/CacheConfig.cs +++ b/src/Libraries/Frapid.Configuration/CacheConfig.cs @@ -1,10 +1,14 @@ -namespace Frapid.Configuration +using Frapid.Configuration.Models; +using Frapid.Framework.Extensions; + +namespace Frapid.Configuration { public static class CacheConfig { public static string GetDefaultCacheType() { - return ConfigurationManager.GetConfigurationValue("ParameterConfigFileLocation", "DefaultCacheType"); + var parameter = Parameter.Get(); + return parameter.DefaultCacheType.Or("InProc"); } } } \ No newline at end of file diff --git a/src/Libraries/Frapid.Configuration/DTO/PostgreSQLConfig.cs b/src/Libraries/Frapid.Configuration/DTO/PostgreSQLConfig.cs new file mode 100644 index 00000000..b2a7d103 --- /dev/null +++ b/src/Libraries/Frapid.Configuration/DTO/PostgreSQLConfig.cs @@ -0,0 +1,29 @@ +using Frapid.Configuration.Extensions; + +namespace Frapid.Configuration.DTO +{ + + public sealed class PostgreSQLConfig + { + public string Server { get; set; } + public int? Port { get; set; } = 5432; + public string MetaDatabase { get; set; } + public bool? EnablePooling { get; set; } = true; + public int? MinPoolSize { get; set; } = 1; + public int? MaxPoolSize { get; set; } = 100; + public string SuperUserId { get; set; } + public string SuperUserPassword { get; set; } + public bool? TrustedSuperUserConnection { get; set; } = false; + public string UserId { get; set; } + public string Password { get; set; } + public string ReportUserId { get; set; } + public string ReportUserPassword { get; set; } + public string PostgreSQLBinDirectory { get; set; } + public string DatabaseBackupDirectory { get; set; } + public int? Timeout { get; set; } = 120; + public static PostgreSQLConfig Get() + { + return "~/Resources/Configs/PostgreSQL.json".PathToJson(); + } + } +} diff --git a/src/Libraries/Frapid.Configuration/DTO/SqlServerConfig.cs b/src/Libraries/Frapid.Configuration/DTO/SqlServerConfig.cs new file mode 100644 index 00000000..5d2697d6 --- /dev/null +++ b/src/Libraries/Frapid.Configuration/DTO/SqlServerConfig.cs @@ -0,0 +1,29 @@ +using Frapid.Configuration.Extensions; + +namespace Frapid.Configuration.DTO +{ + public sealed class SqlServerConfig + { + public string Server { get; set; } + public int? Port { get; set; } = 0; + public string MetaDatabase { get; set; } + public bool? EnablePooling { get; set; } + public int? MinPoolSize { get; set; } = 1; + public int? MaxPoolSize { get; set; } = 100; + public string SuperUserId { get; set; } + public string SuperUserPassword { get; set; } + public bool? TrustedSuperUserConnection { get; set; } = false; + public string NetworkLibrary { get; set; } + public string UserId { get; set; } + public string Password { get; set; } + public string ReportUserId { get; set; } + public string ReportUserPassword { get; set; } + public string DatabaseBackupDirectory { get; set; } + public int? Timeout { get; set; } = 120; + + public static SqlServerConfig Get() + { + return "~/Resources/Configs/SQLServer.json".PathToJson(); + } + } +} diff --git a/src/Libraries/Frapid.Configuration/Db/DatabaseFactory.cs b/src/Libraries/Frapid.Configuration/Db/DatabaseFactory.cs new file mode 100644 index 00000000..ca68440a --- /dev/null +++ b/src/Libraries/Frapid.Configuration/Db/DatabaseFactory.cs @@ -0,0 +1,19 @@ +using Frapid.Mapper.Database; + +namespace Frapid.Configuration.Db +{ + public sealed class DatabaseFactory + { + public DatabaseFactory(MapperDb db) + { + this.Db = db; + } + + private MapperDb Db { get; } + + public MapperDb GetDatabase() + { + return this.Db; + } + } +} \ No newline at end of file diff --git a/src/Libraries/Frapid.Configuration/Db/DbProvider.cs b/src/Libraries/Frapid.Configuration/Db/DbProvider.cs index 97106ded..f0211573 100644 --- a/src/Libraries/Frapid.Configuration/Db/DbProvider.cs +++ b/src/Libraries/Frapid.Configuration/Db/DbProvider.cs @@ -1,28 +1,13 @@ using System.Data.Common; using System.Data.SqlClient; -using System.IO; +using Frapid.Configuration.DTO; using Frapid.Mapper.Database; using Frapid.Mapper.Types; using MySql.Data.MySqlClient; using Npgsql; -using Serilog; namespace Frapid.Configuration.Db { - public sealed class DatabaseFactory - { - public DatabaseFactory(MapperDb db) - { - this.Db = db; - } - - private MapperDb Db { get; } - - public MapperDb GetDatabase() - { - return this.Db; - } - } public static class DbProvider { @@ -37,19 +22,6 @@ public static string GetProviderName(string tenant) return site.DbProvider; } - public static string GetDbConfigurationFilePath(string tenant) - { - string provider = GetProviderName(tenant); - string path = "/Resources/Configs/PostgreSQL.config"; - - if (!provider.ToUpperInvariant().Equals("NPGSQL")) - { - path = "/Resources/Configs/SQLServer.config"; - } - - return path; - } - public static string GetMetaDatabase(string tenant) { if (string.IsNullOrWhiteSpace(tenant)) @@ -58,23 +30,28 @@ public static string GetMetaDatabase(string tenant) } string provider = GetProviderName(tenant); - string path = GetDbConfigurationFilePath(tenant); - string meta = "postgres"; + string meta = string.Empty; - if (!provider.ToUpperInvariant().Equals("NPGSQL")) + if (provider.ToUpperInvariant().Equals("NPGSQL")) { - meta = "master"; - } - - path = PathMapper.MapPath(path); + var config = PostgreSQLConfig.Get(); + meta = config.MetaDatabase; - if (File.Exists(path)) - { - meta = ConfigurationManager.ReadConfigurationValue(path, "MetaDatabase"); + if (string.IsNullOrWhiteSpace(meta)) + { + meta = "postgres"; + } } - else + + if (provider.ToUpperInvariant().Equals("SYSTEM.DATA.SQLCLIENT")) { - Log.Warning($"The meta database for provider '{provider}' could not be determined because the configuration file '{path}' does not exist. Returned value '{meta}' by convention."); + var config = SqlServerConfig.Get(); + meta = config.MetaDatabase; + + if (string.IsNullOrWhiteSpace(meta)) + { + meta = "master"; + } } return meta; diff --git a/src/Libraries/Frapid.Configuration/DbServer/PostgreSQL.cs b/src/Libraries/Frapid.Configuration/DbServer/PostgreSQL.cs index 4c15f43f..7444f9d0 100644 --- a/src/Libraries/Frapid.Configuration/DbServer/PostgreSQL.cs +++ b/src/Libraries/Frapid.Configuration/DbServer/PostgreSQL.cs @@ -1,100 +1,64 @@ using Frapid.Configuration.Db; -using Frapid.Framework.Extensions; +using Frapid.Configuration.DTO; +using Frapid.Mapper.Extensions; using Npgsql; namespace Frapid.Configuration.DbServer { public class PostgreSQL : IDbServer { - public PostgreSQL() - { - this.ConfigFile = PathMapper.MapPath("/Resources/Configs/PostgreSQL.config"); - } - - public string ConfigFile { get; set; } - public string GetConnectionString(string tenant, string database = "", string userId = "", string password = "") { - string host = ConfigurationManager.ReadConfigurationValue(this.ConfigFile, "Server"); - - if (string.IsNullOrWhiteSpace(database)) - { - database = ConfigurationManager.ReadConfigurationValue(this.ConfigFile, "Database"); - } + var config = PostgreSQLConfig.Get(); if (string.IsNullOrWhiteSpace(userId)) { - userId = ConfigurationManager.ReadConfigurationValue(this.ConfigFile, "UserId"); + userId = config.UserId; } if (string.IsNullOrWhiteSpace(password)) { - password = ConfigurationManager.ReadConfigurationValue(this.ConfigFile, "Password"); + password = config.Password; } - bool enablePooling = ConfigurationManager.ReadConfigurationValue(this.ConfigFile, "EnablePooling").ToUpperInvariant().Equals("TRUE"); - int port = ConfigurationManager.ReadConfigurationValue(this.ConfigFile, "Port").To(); - int minPoolSize = ConfigurationManager.ReadConfigurationValue(this.ConfigFile, "MinPoolSize").To(); - int maxPoolSize = ConfigurationManager.ReadConfigurationValue(this.ConfigFile, "MaxPoolSize").To(); - return this.GetConnectionString(tenant, host, database, userId, password, port, enablePooling, minPoolSize, maxPoolSize); + return this.GetConnectionString(tenant, config.Server, database, userId, password, config.Port ?? 5432, config.EnablePooling ?? true, config.MinPoolSize ?? 1, config.MaxPoolSize ?? 100); } public string GetReportUserConnectionString(string tenant, string database = "") { - if (string.IsNullOrWhiteSpace(database)) - { - database = ConfigurationManager.ReadConfigurationValue(this.ConfigFile, "Database"); - } - - string userId = ConfigurationManager.ReadConfigurationValue(this.ConfigFile, "ReportUserId"); - string password = ConfigurationManager.ReadConfigurationValue(this.ConfigFile, "ReportUserPassword"); - - return this.GetConnectionString(tenant, database, userId, password); + var config = PostgreSQLConfig.Get(); + return this.GetConnectionString(tenant, database, config.ReportUserId, config.ReportUserPassword); } public string ProviderName => "Npgsql"; public string GetSuperUserConnectionString(string tenant, string database = "") { - if (string.IsNullOrWhiteSpace(database)) - { - database = ConfigurationManager.ReadConfigurationValue(this.ConfigFile, "Database"); - } - - string host = ConfigurationManager.ReadConfigurationValue(this.ConfigFile, "Server"); - string userId = ConfigurationManager.ReadConfigurationValue(this.ConfigFile, "SuperUserId"); - string password = ConfigurationManager.ReadConfigurationValue(this.ConfigFile, "SuperUserPassword"); - - bool trusted = ConfigurationManager.ReadConfigurationValue(this.ConfigFile, "TrustedSuperUserConnection").ToUpperInvariant().Equals("TRUE"); - bool enablePooling = ConfigurationManager.ReadConfigurationValue(this.ConfigFile, "EnablePooling").ToUpperInvariant().Equals("TRUE"); - int port = ConfigurationManager.ReadConfigurationValue(this.ConfigFile, "Port").To(); - int minPoolSize = ConfigurationManager.ReadConfigurationValue(this.ConfigFile, "MinPoolSize").To(); - int maxPoolSize = ConfigurationManager.ReadConfigurationValue(this.ConfigFile, "MaxPoolSize").To(); - int timeout = ConfigurationManager.ReadConfigurationValue(this.ConfigFile, "Timeout").To(60*5);//5 minutes default timeout + var config = PostgreSQLConfig.Get(); var builder = new NpgsqlConnectionStringBuilder { - Host = host, - Port = port, + Host = config.Server, + Port = config.Port ?? 5432, Database = database, - Pooling = enablePooling, - MinPoolSize = minPoolSize, - MaxPoolSize = maxPoolSize, + Pooling = config.EnablePooling ?? true, + MinPoolSize = config.MinPoolSize ?? 1, + MaxPoolSize = config.MaxPoolSize ?? 100, ApplicationName = "Frapid", - CommandTimeout = timeout, - InternalCommandTimeout = timeout + CommandTimeout = config.Timeout ?? 120, + InternalCommandTimeout = config.Timeout ?? 120 }; - if (trusted) + if (config.TrustedSuperUserConnection.To(false)) { builder.IntegratedSecurity = true; } else { - builder.Username = userId; - builder.Password = password; + builder.Username = config.SuperUserId; + builder.Password = config.SuperUserPassword; } return builder.ConnectionString; @@ -102,8 +66,8 @@ public string GetSuperUserConnectionString(string tenant, string database = "") public string GetMetaConnectionString(string tenant) { - string database = ConfigurationManager.ReadConfigurationValue(this.ConfigFile, "MetaDatabase"); - return this.GetConnectionString(tenant, database); + var config = PostgreSQLConfig.Get(); + return this.GetConnectionString(tenant, config.MetaDatabase); } public string GetConnectionString(string tenant, string host, string database, string username, string password, int port, bool enablePooling = true, int minPoolSize = 0, int maxPoolSize = 100, string networkLibrary = "") diff --git a/src/Libraries/Frapid.Configuration/DbServer/SqlServer.cs b/src/Libraries/Frapid.Configuration/DbServer/SqlServer.cs index 09a3b616..a19d1805 100644 --- a/src/Libraries/Frapid.Configuration/DbServer/SqlServer.cs +++ b/src/Libraries/Frapid.Configuration/DbServer/SqlServer.cs @@ -1,107 +1,68 @@ using System.Data.SqlClient; +using Frapid.Configuration.DTO; using Frapid.Framework.Extensions; namespace Frapid.Configuration.DbServer { public class SqlServer : IDbServer { - public SqlServer() - { - this.ConfigFile = PathMapper.MapPath("/Resources/Configs/SQLServer.config"); - } - - public string ConfigFile { get; set; } - public string GetConnectionString(string tenant, string database = "", string userId = "", string password = "") { - string host = ConfigurationManager.ReadConfigurationValue(this.ConfigFile, "Server"); - - if (string.IsNullOrWhiteSpace(database)) - { - database = ConfigurationManager.ReadConfigurationValue(this.ConfigFile, "Database"); - } + var config = SqlServerConfig.Get(); if (string.IsNullOrWhiteSpace(userId)) { - userId = ConfigurationManager.ReadConfigurationValue(this.ConfigFile, "UserId"); + userId = config.UserId; } if (string.IsNullOrWhiteSpace(password)) { - password = ConfigurationManager.ReadConfigurationValue(this.ConfigFile, "Password"); + password = config.Password; } - bool enablePooling = ConfigurationManager.ReadConfigurationValue(this.ConfigFile, "EnablePooling").ToUpperInvariant().Equals("TRUE"); - int port = ConfigurationManager.ReadConfigurationValue(this.ConfigFile, "Port").To(); - int minPoolSize = ConfigurationManager.ReadConfigurationValue(this.ConfigFile, "MinPoolSize").To(); - int maxPoolSize = ConfigurationManager.ReadConfigurationValue(this.ConfigFile, "MaxPoolSize").To(); - string networkLibrary = ConfigurationManager.ReadConfigurationValue(this.ConfigFile, "NetworkLibrary"); - return this.GetConnectionString(tenant, host, database, userId, password, port, enablePooling, minPoolSize, maxPoolSize, networkLibrary); + return this.GetConnectionString(tenant, config.Server, database, userId, password, config.Port ?? 0, config.EnablePooling ?? true, config.MinPoolSize ?? 1, config.MaxPoolSize ?? 100, config.NetworkLibrary); } public string GetReportUserConnectionString(string tenant, string database = "") { - if (string.IsNullOrWhiteSpace(database)) - { - database = ConfigurationManager.ReadConfigurationValue(this.ConfigFile, "Database"); - } - - string userId = ConfigurationManager.ReadConfigurationValue(this.ConfigFile, "ReportUserId"); - string password = ConfigurationManager.ReadConfigurationValue(this.ConfigFile, "ReportUserPassword"); - - - return this.GetConnectionString(tenant, database, userId, password); + var config = SqlServerConfig.Get(); + return this.GetConnectionString(tenant, database, config.ReportUserId, config.ReportUserPassword); } public string ProviderName => "System.Data.SqlClient"; public string GetSuperUserConnectionString(string tenant, string database = "") { - if (string.IsNullOrWhiteSpace(database)) - { - database = ConfigurationManager.ReadConfigurationValue(this.ConfigFile, "Database"); - } - - string host = ConfigurationManager.ReadConfigurationValue(this.ConfigFile, "Server"); - string userId = ConfigurationManager.ReadConfigurationValue(this.ConfigFile, "SuperUserId"); - string password = ConfigurationManager.ReadConfigurationValue(this.ConfigFile, "SuperUserPassword"); + var config = SqlServerConfig.Get(); - bool trusted = ConfigurationManager.ReadConfigurationValue(this.ConfigFile, "TrustedSuperUserConnection").ToUpperInvariant().Equals("TRUE"); - bool enablePooling = ConfigurationManager.ReadConfigurationValue(this.ConfigFile, "EnablePooling").ToUpperInvariant().Equals("TRUE"); - int port = ConfigurationManager.ReadConfigurationValue(this.ConfigFile, "Port").To(); - int minPoolSize = ConfigurationManager.ReadConfigurationValue(this.ConfigFile, "MinPoolSize").To(); - int maxPoolSize = ConfigurationManager.ReadConfigurationValue(this.ConfigFile, "MaxPoolSize").To(); - string networkLibrary = ConfigurationManager.ReadConfigurationValue(this.ConfigFile, "NetworkLibrary"); - int timeout = ConfigurationManager.ReadConfigurationValue(this.ConfigFile, "Timeout").To(60*5);//5 minutes + string dataSource = config.Server; - string dataSource = host; - - if (port > 0) + if (config.Port > 0) { - dataSource += ", " + port; + dataSource += ", " + config.Port; } var builder = new SqlConnectionStringBuilder { DataSource = dataSource, InitialCatalog = database, - Pooling = enablePooling, - MinPoolSize = minPoolSize, - MaxPoolSize = maxPoolSize, + Pooling = config.EnablePooling ?? true, + MinPoolSize = config.MinPoolSize ?? 1, + MaxPoolSize = config.MaxPoolSize ?? 100, ApplicationName = "Frapid", - NetworkLibrary = networkLibrary, - ConnectTimeout = timeout + NetworkLibrary = config.NetworkLibrary, + ConnectTimeout = config.Timeout ?? 120 }; - if (trusted) + if (config.TrustedSuperUserConnection.To(false)) { builder.IntegratedSecurity = true; } else { - builder.UserID = userId; - builder.Password = password; + builder.UserID = config.SuperUserId; + builder.Password = config.SuperUserPassword; } return builder.ConnectionString; @@ -109,8 +70,9 @@ public string GetSuperUserConnectionString(string tenant, string database = "") public string GetMetaConnectionString(string tenant) { - string database = ConfigurationManager.ReadConfigurationValue(this.ConfigFile, "MetaDatabase"); - return this.GetConnectionString(tenant, database); + var config = SqlServerConfig.Get(); + + return this.GetConnectionString(tenant, config.MetaDatabase); } public string GetConnectionString(string tenant, string host, string database, string username, string password, int port, bool enablePooling = true, int minPoolSize = 0, int maxPoolSize = 100, string networkLibrary = "") diff --git a/src/Libraries/Frapid.Configuration/Extensions/JsonExtension.cs b/src/Libraries/Frapid.Configuration/Extensions/JsonExtension.cs new file mode 100644 index 00000000..7d45ff49 --- /dev/null +++ b/src/Libraries/Frapid.Configuration/Extensions/JsonExtension.cs @@ -0,0 +1,28 @@ +using Frapid.Framework; +using Newtonsoft.Json; +using System; +using System.IO; +using System.Text; + +namespace Frapid.Configuration.Extensions +{ + public static class JsonExtension + { + public static T PathToJson(this string path, bool mapPath = true) + { + if(mapPath) + { + path = PathMapper.MapPath(path); + } + + if (File.Exists(path)) + { + string contents = File.ReadAllText(path, new UTF8Encoding(false)); + var config = JsonConvert.DeserializeObject(contents, JsonHelper.GetJsonSerializerSettings()); + return config; + } + + return (T)Activator.CreateInstance(typeof(T)); + } + } +} diff --git a/src/Libraries/Frapid.Configuration/Frapid.Configuration.csproj b/src/Libraries/Frapid.Configuration/Frapid.Configuration.csproj index 4b5b0994..5502ae00 100644 --- a/src/Libraries/Frapid.Configuration/Frapid.Configuration.csproj +++ b/src/Libraries/Frapid.Configuration/Frapid.Configuration.csproj @@ -64,12 +64,17 @@ + + + + + diff --git a/src/Libraries/Frapid.Configuration/Models/Installable.cs b/src/Libraries/Frapid.Configuration/Models/Installable.cs index 3a43c181..9825851a 100644 --- a/src/Libraries/Frapid.Configuration/Models/Installable.cs +++ b/src/Libraries/Frapid.Configuration/Models/Installable.cs @@ -1,7 +1,6 @@ using System; using System.Collections.Generic; using System.Linq; -using Frapid.Mapper.Database; using Newtonsoft.Json; namespace Frapid.Configuration.Models diff --git a/src/Libraries/Frapid.Configuration/Models/Parameter.cs b/src/Libraries/Frapid.Configuration/Models/Parameter.cs new file mode 100644 index 00000000..a348b770 --- /dev/null +++ b/src/Libraries/Frapid.Configuration/Models/Parameter.cs @@ -0,0 +1,20 @@ +using Frapid.Configuration.Extensions; + +namespace Frapid.Configuration.Models +{ + public class Parameter + { + public string Cultures { get; set; } + public string ApplicationLogDirectory { get; set; } + public string MinimumLogLevel { get; set; } + public string BackupScheduleUTC { get; set; } + public string DefaultCacheType { get; set; } + public string EodScheduleUTC { get; set; } + public bool? IsDevelopment { get; set; } + + public static Parameter Get() + { + return "~/Resources/Configs/Parameters.json".PathToJson(); + } + } +} \ No newline at end of file diff --git a/src/Libraries/Frapid.Configuration/TenantServices/ByConvention.cs b/src/Libraries/Frapid.Configuration/TenantServices/ByConvention.cs index c2c85bb6..e31d9b1c 100644 --- a/src/Libraries/Frapid.Configuration/TenantServices/ByConvention.cs +++ b/src/Libraries/Frapid.Configuration/TenantServices/ByConvention.cs @@ -40,10 +40,10 @@ public string GetTenantName(string domain, string or) } Log.Verbose($"Tenant found for domain \"{domain}\". Tenant domain: \"{tenant.DomainName}\"."); - return this.ConvertToTenantName(tenant.DomainName); + return ConvertToTenantName(tenant.DomainName); } - return this.ConvertToTenantName(domain); + return ConvertToTenantName(domain); } public string GetDomainName(string tenant) @@ -65,7 +65,7 @@ public string GetDomainName(string tenant) return string.Empty; } - private string ConvertToTenantName(string domain) + public static string ConvertToTenantName(string domain) { domain = domain.Split(':').FirstOrDefault() ?? domain; return domain.Replace(".", "_"); diff --git a/src/Libraries/Frapid.Installer/AppInstaller.cs b/src/Libraries/Frapid.Installer/AppInstaller.cs index 1e71735d..f20e665a 100644 --- a/src/Libraries/Frapid.Installer/AppInstaller.cs +++ b/src/Libraries/Frapid.Installer/AppInstaller.cs @@ -8,13 +8,14 @@ using Frapid.DataAccess; using Frapid.Framework; using Frapid.Installer.DAL; -using Frapid.Installer.Helpers; using Frapid.Installer.Tenant; namespace Frapid.Installer { public class AppInstaller { + public event EventHandler Notification; + public AppInstaller(string tenant, string database, bool withoutSample, Installable installable) { this.Tenant = tenant; @@ -30,7 +31,14 @@ public AppInstaller(string tenant, string database, bool withoutSample, Installa public async Task HasSchemaAsync(string database) { - return await Store.HasSchemaAsync(this.Tenant, database, this.Installable.DbSchema).ConfigureAwait(false); + var store = new Store(); + + store.Notification += delegate (object sender, string message) + { + this.Notify(sender, message); + }; + + return await store.HasSchemaAsync(this.Tenant, database, this.Installable.DbSchema).ConfigureAwait(false); } public async Task InstallAsync() @@ -45,7 +53,7 @@ public async Task InstallAsync() await new AppInstaller(this.Tenant, this.Database, this.WithoutSample, dependency).InstallAsync().ConfigureAwait(false); } - InstallerLog.Verbose($"Installing module {this.Installable.ApplicationName}."); + this.Notify($"Installing module {this.Installable.ApplicationName}."); await this.CreateSchemaAsync().ConfigureAwait(false); await this.CreateMyAsync().ConfigureAwait(false); @@ -83,7 +91,7 @@ protected async Task CreateSchemaAsync() if (this.Installable.IsMeta) { - InstallerLog.Verbose($"Creating database of {this.Installable.ApplicationName} under meta database {Factory.GetMetaDatabase(this.Database)}."); + this.Notify($"Creating database of {this.Installable.ApplicationName} under meta database {Factory.GetMetaDatabase(this.Database)}."); database = Factory.GetMetaDatabase(this.Database); } @@ -95,11 +103,11 @@ protected async Task CreateSchemaAsync() if (await this.HasSchemaAsync(database).ConfigureAwait(false)) { - InstallerLog.Verbose($"Skipped {this.Installable.ApplicationName} schema ({this.Installable.DbSchema}) creation because it already exists."); + this.Notify($"Skipped {this.Installable.ApplicationName} schema ({this.Installable.DbSchema}) creation because it already exists."); return; } - InstallerLog.Verbose($"Creating schema {this.Installable.DbSchema}"); + this.Notify($"Creating schema {this.Installable.DbSchema}"); string db = this.Installable.BlankDbPath; @@ -112,7 +120,7 @@ protected async Task CreateSchemaAsync() //Manually override sample data installation if (!this.WithoutSample) { - InstallerLog.Verbose($"Creating sample data of {this.Installable.ApplicationName}."); + this.Notify($"Creating sample data of {this.Installable.ApplicationName}."); db = this.Installable.SampleDbPath; path = PathMapper.MapPath(db); await this.RunSqlAsync(database, database, path).ConfigureAwait(false); @@ -124,11 +132,17 @@ private async Task RunSqlAsync(string tenant, string database, string fromFile) { try { - await Store.RunSqlAsync(tenant, database, fromFile).ConfigureAwait(false); + var store = new Store(); + store.Notification += delegate (object sender, string message) + { + this.Notify(sender, message); + }; + + await store.RunSqlAsync(tenant, database, fromFile).ConfigureAwait(false); } catch (Exception ex) { - InstallerLog.Verbose($"{ex.Message}"); + this.Notify($"Error: {ex.Message}"); throw; } } @@ -166,8 +180,19 @@ protected void CreateOverride() return; } - InstallerLog.Verbose($"Creating overide. Source: {source}, desitation: {destination}."); + this.Notify($"Creating overide. Source: {source}, desitation: {destination}."); FileHelper.CopyDirectory(source, destination); } + + private void Notify(string message) + { + this.Notify(this, message); + } + + private void Notify(object sender, string message) + { + var notificationReceived = this.Notification; + notificationReceived?.Invoke(this, message); + } } } \ No newline at end of file diff --git a/src/Libraries/Frapid.Installer/DAL/IStore.cs b/src/Libraries/Frapid.Installer/DAL/IStore.cs index b69570b6..90619ed2 100644 --- a/src/Libraries/Frapid.Installer/DAL/IStore.cs +++ b/src/Libraries/Frapid.Installer/DAL/IStore.cs @@ -1,14 +1,18 @@ -using System.Threading.Tasks; +using System; +using System.Threading.Tasks; namespace Frapid.Installer.DAL { public interface IStore { + event EventHandler Notification; string ProviderName { get; } Task CreateDbAsync(string tenant); Task HasDbAsync(string tenant, string database); Task HasSchemaAsync(string tenant, string database, string schema); Task RunSqlAsync(string tenant, string database, string fromFile); Task CleanupDbAsync(string tenant, string database); + + void Notify(object sender, string message); } } \ No newline at end of file diff --git a/src/Libraries/Frapid.Installer/DAL/PostgreSQL.cs b/src/Libraries/Frapid.Installer/DAL/PostgreSQL.cs index 054424f9..64116ea0 100644 --- a/src/Libraries/Frapid.Installer/DAL/PostgreSQL.cs +++ b/src/Libraries/Frapid.Installer/DAL/PostgreSQL.cs @@ -1,4 +1,5 @@ -using System.Globalization; +using System; +using System.Globalization; using System.IO; using System.Text; using System.Threading.Tasks; @@ -13,6 +14,8 @@ public sealed class PostgreSQL : IStore { public string ProviderName { get; } = "Npgsql"; + public event EventHandler Notification; + public async Task CreateDbAsync(string tenant) { string sql = "CREATE DATABASE {0} WITH ENCODING='UTF8' TEMPLATE=template0 LC_COLLATE='C' LC_CTYPE='C';"; @@ -103,5 +106,11 @@ FOREACH _schema IN ARRAY _schemas string connectionString = FrapidDbServer.GetSuperUserConnectionString(tenant, database); await Factory.ExecuteAsync(connectionString, database, sql).ConfigureAwait(false); } + + public void Notify(object sender, string message) + { + var notificationReceived = this.Notification; + notificationReceived?.Invoke(sender, message); + } } } \ No newline at end of file diff --git a/src/Libraries/Frapid.Installer/DAL/SqlServer.cs b/src/Libraries/Frapid.Installer/DAL/SqlServer.cs index 86a7a147..a5444c05 100644 --- a/src/Libraries/Frapid.Installer/DAL/SqlServer.cs +++ b/src/Libraries/Frapid.Installer/DAL/SqlServer.cs @@ -19,6 +19,8 @@ public sealed class SqlServer: IStore { public string ProviderName { get; } = "System.Data.SqlClient"; + public event EventHandler Notification; + public async Task CreateDbAsync(string tenant) { string sql = "CREATE DATABASE [{0}];"; @@ -124,7 +126,7 @@ FROM @queries if (message != null) { - InstallerLog.Information($"Could not completely clean database \"{tenant}\" due to dependency issues. Trying again."); + this.Notify(this, $"Could not completely clean database \"{tenant}\" due to dependency issues. Trying again."); await CleanupDbAsync(tenant, database).ConfigureAwait(false); } } @@ -165,5 +167,11 @@ private async Task RunScriptAsync(SqlConnection connection, string sql) } } } + + public void Notify(object sender, string message) + { + var notificationReceived = this.Notification; + notificationReceived?.Invoke(sender, message); + } } } \ No newline at end of file diff --git a/src/Libraries/Frapid.Installer/DAL/Store.cs b/src/Libraries/Frapid.Installer/DAL/Store.cs index dea069a6..8f33e4d8 100644 --- a/src/Libraries/Frapid.Installer/DAL/Store.cs +++ b/src/Libraries/Frapid.Installer/DAL/Store.cs @@ -7,8 +7,10 @@ namespace Frapid.Installer.DAL { - public static class Store + public class Store { + public event EventHandler Notification; + private static IStore GetDbServer(string tenant) { var site = TenantConvention.GetSite(tenant); @@ -33,29 +35,70 @@ private static IStore GetDbServer(string tenant) return new PostgreSQL(); } - public static async Task CreateDbAsync(string tenant) + public async Task CreateDbAsync(string tenant) { - await GetDbServer(tenant).CreateDbAsync(tenant).ConfigureAwait(false); + var db = GetDbServer(tenant); + + db.Notification += delegate (object sender, string message) + { + this.Notify(sender, message); + }; + + await db.CreateDbAsync(tenant).ConfigureAwait(false); } - public static async Task HasDbAsync(string tenant, string dbName) + public async Task HasDbAsync(string tenant, string dbName) { - return await GetDbServer(tenant).HasDbAsync(tenant, dbName).ConfigureAwait(false); + var db = GetDbServer(tenant); + + db.Notification += delegate (object sender, string message) + { + this.Notify(sender, message); + }; + + return await db.HasDbAsync(tenant, dbName).ConfigureAwait(false); } - public static async Task HasSchemaAsync(string tenant, string database, string schema) + public async Task HasSchemaAsync(string tenant, string database, string schema) { - return await GetDbServer(tenant).HasSchemaAsync(tenant, database, schema).ConfigureAwait(false); + var db = GetDbServer(tenant); + + db.Notification += delegate (object sender, string message) + { + this.Notify(sender, message); + }; + + return await db.HasSchemaAsync(tenant, database, schema).ConfigureAwait(false); } - public static async Task RunSqlAsync(string tenant, string database, string fromFile) + public async Task RunSqlAsync(string tenant, string database, string fromFile) { - await GetDbServer(tenant).RunSqlAsync(tenant, database, fromFile).ConfigureAwait(false); + var db = GetDbServer(tenant); + + db.Notification += delegate (object sender, string message) + { + this.Notify(sender, message); + }; + + await db.RunSqlAsync(tenant, database, fromFile).ConfigureAwait(false); + } + + public async Task CleanupDbAsync(string tenant, string database) + { + var db = GetDbServer(tenant); + + db.Notification += delegate (object sender, string message) + { + this.Notify(sender, message); + }; + + await db.CleanupDbAsync(tenant, database).ConfigureAwait(false); } - public static async Task CleanupDbAsync(string tenant, string database) + public void Notify(object sender, string message) { - await GetDbServer(tenant).CleanupDbAsync(tenant, database).ConfigureAwait(false); + var notificationReceived = this.Notification; + notificationReceived?.Invoke(sender, message); } } } \ No newline at end of file diff --git a/src/Libraries/Frapid.Installer/DbInspector.cs b/src/Libraries/Frapid.Installer/DbInspector.cs index 82d7e8d2..ec81126b 100644 --- a/src/Libraries/Frapid.Installer/DbInspector.cs +++ b/src/Libraries/Frapid.Installer/DbInspector.cs @@ -1,4 +1,5 @@ -using System.Linq; +using System; +using System.Linq; using System.Threading.Tasks; using Frapid.Configuration; using Frapid.Installer.DAL; @@ -7,6 +8,8 @@ namespace Frapid.Installer { public class DbInspector { + public event EventHandler Notification; + public DbInspector(string tenant, string database) { this.Tenant = tenant; @@ -18,7 +21,14 @@ public DbInspector(string tenant, string database) public async Task HasDbAsync() { - return await Store.HasDbAsync(this.Tenant, this.Database).ConfigureAwait(false); + var store = new Store(); + + store.Notification += delegate(object sender, string message) + { + this.Notify(sender, message); + }; + + return await store.HasDbAsync(this.Tenant, this.Database).ConfigureAwait(false); } public bool IsWellKnownDb() @@ -27,5 +37,10 @@ public bool IsWellKnownDb() var domains = serializer.Get(); return domains.Any(domain => TenantConvention.GetTenant(domain.DomainName) == this.Tenant); } + public void Notify(object sender, string message) + { + var notificationReceived = this.Notification; + notificationReceived?.Invoke(sender, message); + } } } \ No newline at end of file diff --git a/src/Libraries/Frapid.Installer/DbInstaller.cs b/src/Libraries/Frapid.Installer/DbInstaller.cs index e5f7f654..367d4dda 100644 --- a/src/Libraries/Frapid.Installer/DbInstaller.cs +++ b/src/Libraries/Frapid.Installer/DbInstaller.cs @@ -1,14 +1,16 @@ -using System.Threading.Tasks; -using Frapid.Configuration; +using System; +using System.Threading.Tasks; using Frapid.Configuration.Db; +using Frapid.Configuration.Models; using Frapid.Framework.Extensions; using Frapid.Installer.DAL; -using Frapid.Installer.Helpers; namespace Frapid.Installer { public sealed class DbInstaller { + public event EventHandler Notification; + public DbInstaller(string domain) { this.Tenant = domain; @@ -18,9 +20,8 @@ public DbInstaller(string domain) private static bool IsDevelopment() { - string path = PathMapper.MapPath("~/Resources/Configs/Parameters.config"); - string value = ConfigurationManager.ReadConfigurationValue(path, "IsDevelopment"); - return value.Or("").ToUpperInvariant().StartsWith("T"); + var parameters = Parameter.Get(); + return parameters.IsDevelopment.To(false); } @@ -35,25 +36,24 @@ public async Task InstallAsync() { if (IsDevelopment()) { - InstallerLog.Verbose("Cleaning up the database."); + this.Notify(this, "Cleaning up the database."); await this.CleanUpDbAsync().ConfigureAwait(true); } else { - InstallerLog.Information("Warning: database already exists. Please remove the database first."); - InstallerLog.Verbose($"No need to create database \"{this.Tenant}\" because it already exists."); + this.Notify(this, "Warning: database already exists. Please remove the database first."); + this.Notify(this, $"No need to create database \"{this.Tenant}\" because it already exists."); } } if (!isWellKnown) { - InstallerLog.Verbose( - $"Cannot create a database under the name \"{this.Tenant}\" because the name is not a well-known tenant name."); + this.Notify(this, $"Cannot create a database under the name \"{this.Tenant}\" because the name is not a well-known tenant name."); } if (!hasDb && isWellKnown) { - InstallerLog.Information($"Creating database \"{this.Tenant}\"."); + this.Notify(this, $"Creating database \"{this.Tenant}\"."); await this.CreateDbAsync().ConfigureAwait(false); return true; } @@ -63,12 +63,30 @@ public async Task InstallAsync() private async Task CreateDbAsync() { - await Store.CreateDbAsync(this.Tenant).ConfigureAwait(false); + var store = new Store(); + store.Notification += delegate (object sender, string message) + { + this.Notify(sender, message); + }; + + await store.CreateDbAsync(this.Tenant).ConfigureAwait(false); } private async Task CleanUpDbAsync() { - await Store.CleanupDbAsync(this.Tenant, this.Tenant).ConfigureAwait(false); + var store = new Store(); + store.Notification += delegate (object sender, string message) + { + this.Notify(sender, message); + }; + + await store.CleanupDbAsync(this.Tenant, this.Tenant).ConfigureAwait(false); + } + + private void Notify(object sender, string message) + { + var notificationReceived = this.Notification; + notificationReceived?.Invoke(sender, message); } } } \ No newline at end of file diff --git a/src/Libraries/Frapid.Installer/Tenant/Installer.cs b/src/Libraries/Frapid.Installer/Tenant/Installer.cs index cb42da53..c07d1bf5 100644 --- a/src/Libraries/Frapid.Installer/Tenant/Installer.cs +++ b/src/Libraries/Frapid.Installer/Tenant/Installer.cs @@ -10,6 +10,7 @@ namespace Frapid.Installer.Tenant public sealed class Installer { public static List InstalledApps; + public event EventHandler Notification; public Installer(string url, bool withoutSample) { @@ -26,25 +27,60 @@ public async Task InstallAsync() string tenant = TenantConvention.GetTenant(this.Url); - InstallerLog.Verbose($"Creating database {tenant}."); + this.Notify($"Creating database {tenant}."); var db = new DbInstaller(tenant); + + db.Notification += delegate (object sender, string message) + { + this.Notify(sender, message); + }; + await db.InstallAsync().ConfigureAwait(false); - InstallerLog.Verbose("Getting installables."); + this.Notify("Getting installables."); var installables = Installables.GetInstallables(tenant); foreach (var installable in installables) { try { - await new AppInstaller(tenant, tenant, this.WithoutSample, installable).InstallAsync().ConfigureAwait(false); + var installer = new AppInstaller(tenant, tenant, this.WithoutSample, installable); + + installer.Notification += delegate(object sender, string message) + { + this.Notify(sender, message); + }; + + await installer.InstallAsync().ConfigureAwait(false); } catch (Exception ex) { - InstallerLog.Error(ex.Message); - InstallerLog.Error($"Could not install module {installable.ApplicationName}."); + this.Notify("Error: " + ex.Message); + this.Notify($"Error: Could not install module {installable.ApplicationName}."); } } + + this.Notify("OK"); + } + + private void Notify(string message) + { + this.Notify(this, message); + } + + private void Notify(object sender, string message) + { + if(message.StartsWith("Error")) + { + InstallerLog.Error(message); + } + else + { + InstallerLog.Verbose(message); + } + + var notificationReceived = this.Notification; + notificationReceived?.Invoke(sender, message); } } } \ No newline at end of file diff --git a/src/Libraries/Frapid.Installer/Tenant/Uninstaller.cs b/src/Libraries/Frapid.Installer/Tenant/Uninstaller.cs index 95ef2ebb..93c43596 100644 --- a/src/Libraries/Frapid.Installer/Tenant/Uninstaller.cs +++ b/src/Libraries/Frapid.Installer/Tenant/Uninstaller.cs @@ -1,3 +1,4 @@ +using System; using System.IO; using System.Threading.Tasks; using Frapid.Configuration; @@ -9,6 +10,8 @@ namespace Frapid.Installer.Tenant { public class Uninstaller { + public event EventHandler Notification; + public Uninstaller(string url) { this.Url = url; @@ -22,7 +25,7 @@ public async Task UnInstallAsync() { var context = FrapidHttpContext.GetCurrent(); - if(context != null) + if (context != null) { throw new UninstallException(Resources.DeletingWebsiteIsNotAllowed); } @@ -36,7 +39,7 @@ private void CleanupTenantDirectory() { string pathToTenant = PathMapper.MapPath($"/Tenants/{this.Tenant}"); - if(Directory.Exists(pathToTenant)) + if (Directory.Exists(pathToTenant)) { FileHelper.DeleteDirectoryRecursively(pathToTenant); } @@ -44,7 +47,18 @@ private void CleanupTenantDirectory() private async Task CleanupDbAsync() { - await Store.CleanupDbAsync(this.Tenant, this.Tenant).ConfigureAwait(false); + var store = new Store(); + store.Notification += delegate (object sender, string message) + { + this.Notify(sender, message); + }; + + await store.CleanupDbAsync(this.Tenant, this.Tenant).ConfigureAwait(false); + } + public void Notify(object sender, string message) + { + var notificationReceived = this.Notification; + notificationReceived?.Invoke(sender, message); } } } \ No newline at end of file diff --git a/src/Libraries/Frapid.TokenManager/Config.cs b/src/Libraries/Frapid.TokenManager/Config.cs index 879e25ad..ef2e8b9d 100644 --- a/src/Libraries/Frapid.TokenManager/Config.cs +++ b/src/Libraries/Frapid.TokenManager/Config.cs @@ -16,7 +16,12 @@ public static JObject Get() if (string.IsNullOrWhiteSpace(path) || !File.Exists(path)) { - return new JObject(); + return JsonConvert.DeserializeObject(@"{ + 'PrivateKey': 'Frapid', + 'HashAlgorithm': 'HS512', + 'TokenIssuerName': 'Frapid', + 'TokenValidHours': 24 + }"); } string contents = File.ReadAllText(path, Encoding.UTF8); diff --git a/src/Libraries/Frapid.i18n/Command/PackResources.cs b/src/Libraries/Frapid.i18n/Command/PackResources.cs index 528b3d33..afe8178e 100644 --- a/src/Libraries/Frapid.i18n/Command/PackResources.cs +++ b/src/Libraries/Frapid.i18n/Command/PackResources.cs @@ -8,6 +8,7 @@ using frapid; using frapid.Commands; using Frapid.Configuration; +using Frapid.Configuration.Models; using Frapid.Framework.Extensions; using YamlDotNet.Serialization; @@ -73,9 +74,8 @@ public override async Task ExecuteCommandAsync() } else { - string pathToConfig = Path.Combine(PathMapper.PathToRootDirectory, "Resources", "Configs", "Parameters.config"); - string cultures = ConfigurationManager.ReadConfigurationValue(pathToConfig, "Cultures"); - languages = cultures.Split(',').Select(x => x.Trim()).ToList(); + var parameter = Parameter.Get(); + languages = parameter.Cultures.Split(',').Select(x => x.Trim()).ToList(); } foreach (string language in languages) diff --git a/src/packages/BCrypt-Official.0.1.109/.signature.p7s b/src/packages/BCrypt-Official.0.1.109/.signature.p7s new file mode 100644 index 0000000000000000000000000000000000000000..0e41fecfcd367e03ab4d993127bc52be51372115 GIT binary patch literal 9461 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 Jy#(Ub{{dC?n*jg- literal 0 HcmV?d00001 diff --git a/src/packages/BCrypt-Official.0.1.109/content/LICENSE.txt b/src/packages/BCrypt-Official.0.1.109/content/LICENSE.txt new file mode 100644 index 00000000..d2109f08 --- /dev/null +++ b/src/packages/BCrypt-Official.0.1.109/content/LICENSE.txt @@ -0,0 +1,14 @@ +Copyright (c) 2006 Damien Miller (jBCrypt) +Copyright (c) 2013 Ryan D. Emerle (.Net port) + +Permission to use, copy, modify, and distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. \ No newline at end of file diff --git a/src/packages/BCrypt-Official.0.1.109/lib/BCrypt.Net.XML b/src/packages/BCrypt-Official.0.1.109/lib/BCrypt.Net.XML new file mode 100644 index 00000000..926661ab --- /dev/null +++ b/src/packages/BCrypt-Official.0.1.109/lib/BCrypt.Net.XML @@ -0,0 +1,201 @@ + + + + BCrypt.Net + + + + Exception for signalling parse errors. + + + Default constructor. + + + Initializes a new instance of . + The message. + + + Initializes a new instance of . + The message. + The inner exception. + + + Initializes a new instance of . + The information. + The context. + + + BCrypt implementation. + + + BCrypt implements OpenBSD-style Blowfish password hashing using the scheme described in + "A Future- + Adaptable Password Scheme" by Niels Provos and David Mazieres. + + + This password hashing system tries to thwart off-line password cracking using a + computationally-intensive hashing algorithm, based on Bruce Schneier's Blowfish cipher. + The work factor of the algorithm is parameterised, so it can be increased as computers + get faster. + + + Usage is really simple. To hash a password for the first time, call the method with a random salt, like this: + + string pw_hash = BCrypt.HashPassword(plain_password); + + To check whether a plaintext password matches one that has been hashed previously, + use the method: + + + if (BCrypt.Verify(candidate_password, stored_hash)) + Console.WriteLine("It matches"); + else + Console.WriteLine("It does not match"); + + + The method takes an optional parameter (workFactor) that + determines the computational complexity of the hashing: + + + string strong_salt = BCrypt.GenerateSalt(10); + string stronger_salt = BCrypt.GenerateSalt(12); + + + The amount of work increases exponentially (2^workFactor), so each increment is twice + as much work. The default workFactor is 10, and the valid range is 4 to 31. + + + + + + Hash a string using the OpenBSD bcrypt scheme and a salt generated by . + + Just an alias for HashPassword. + The string to hash. + The hashed string. + + + + Hash a string using the OpenBSD bcrypt scheme and a salt generated by . + + Just an alias for HashPassword. + The string to hash. + The log2 of the number of rounds of hashing to apply - the work + factor therefore increases as 2^workFactor. + The hashed string. + + + + Hash a password using the OpenBSD bcrypt scheme and a salt generated by . + + The password to hash. + The hashed password. + + + + Hash a password using the OpenBSD bcrypt scheme and a salt generated by using the given . + + The password to hash. + The log2 of the number of rounds of hashing to apply - the work + factor therefore increases as 2^workFactor. + The hashed password. + + + Hash a password using the OpenBSD bcrypt scheme. + Thrown when one or more arguments have unsupported or + illegal values. + The password to hash. + the salt to hash with (perhaps generated using BCrypt.gensalt). + The hashed password + + + + Generate a salt for use with the method. + + The log2 of the number of rounds of hashing to apply - the work + factor therefore increases as 2**workFactor. + A base64 encoded salt value. + + + + Generate a salt for use with the method + selecting a reasonable default for the number of hashing rounds to apply. + + A base64 encoded salt value. + + + + Verifies that the hash of the given matches the provided + + + The text to verify. + The previously-hashed password. + true if the passwords match, false otherwise. + + + + Encode a byte array using bcrypt's slightly-modified base64 encoding scheme. Note that this + is *not* compatible with the standard MIME-base64 encoding. + + Thrown when one or more arguments have unsupported or + illegal values. + The byte array to encode. + The number of bytes to encode. + Base64-encoded string. + + + + Decode a string encoded using bcrypt's base64 scheme to a byte array. Note that this is *not* + compatible with the standard MIME-base64 encoding. + + Thrown when one or more arguments have unsupported or + illegal values. + The string to decode. + The maximum bytes to decode. + The decoded byte array. + + + + Look up the 3 bits base64-encoded by the specified character, range-checking against + conversion table. + + The base64-encoded value. + The decoded value of x. + + + Blowfish encipher a single 64-bit block encoded as two 32-bit halves. + An array containing the two 32-bit half blocks. + The position in the array of the blocks. + + + Cycically extract a word of key material. + The string to extract the data from. + [in,out] The current offset. + The next word of material from data. + + + Initializes the Blowfish key schedule. + + + Key the Blowfish cipher. + The key byte array. + + + + Perform the "enhanced key schedule" step described by Provos and Mazieres in "A Future- + Adaptable Password Scheme" http://www.openbsd.org/papers/bcrypt-paper.ps. + + Salt byte array. + Input byte array. + + + Perform the central hashing step in the bcrypt scheme. + Thrown when one or more arguments have unsupported or + illegal values. + The input byte array to hash. + The salt byte array to hash with. + The binary logarithm of the number of rounds of hashing to apply. + A byte array containing the hashed result. + + + diff --git a/src/packages/BCrypt-Official.0.1.109/lib/BCrypt.Net.dll b/src/packages/BCrypt-Official.0.1.109/lib/BCrypt.Net.dll new file mode 100644 index 0000000000000000000000000000000000000000..836ed21a6d00a8fc787e21dea7fff619f53e4975 GIT binary patch literal 14848 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 Nc) Date: Mon, 20 May 2019 00:47:08 +0545 Subject: [PATCH 17/18] Fixed a compile error in Reporting Config. --- src/Frapid.Web/Areas/Frapid.Reports/DTO/Config.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Frapid.Web/Areas/Frapid.Reports/DTO/Config.cs b/src/Frapid.Web/Areas/Frapid.Reports/DTO/Config.cs index 2c1a5b99..d069ca07 100644 --- a/src/Frapid.Web/Areas/Frapid.Reports/DTO/Config.cs +++ b/src/Frapid.Web/Areas/Frapid.Reports/DTO/Config.cs @@ -1,4 +1,4 @@ -using Frapid.Framework.Extensions; +using Frapid.Configuration.Extensions; namespace Frapid.Reports.DTO { From f0e9180c10fef291db0981e7e3287bb82a7ec67b Mon Sep 17 00:00:00 2001 From: bi od Date: Mon, 20 May 2019 01:12:02 +0545 Subject: [PATCH 18/18] Removed wrong license file. --- src/Frapid.Web/LICENSE.txt | 14 -------------- 1 file changed, 14 deletions(-) delete mode 100644 src/Frapid.Web/LICENSE.txt diff --git a/src/Frapid.Web/LICENSE.txt b/src/Frapid.Web/LICENSE.txt deleted file mode 100644 index d2109f08..00000000 --- a/src/Frapid.Web/LICENSE.txt +++ /dev/null @@ -1,14 +0,0 @@ -Copyright (c) 2006 Damien Miller (jBCrypt) -Copyright (c) 2013 Ryan D. Emerle (.Net port) - -Permission to use, copy, modify, and distribute this software for any -purpose with or without fee is hereby granted, provided that the above -copyright notice and this permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF -OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. \ No newline at end of file