public async Task <ActionResult <bool> > Set([FromRoute] string name, [FromBody] AccessUpdatePackage accessPack) { if (accessPack == null) { return(BadRequest("Missing body parameter: AccessUpdatePack")); } var table = GetTable(name); if (table == null) { return(NotFound()); } if (table is IDBLogTable) { return(Forbid("History is Readonly!")); } var accessColumn = table.AccessKey; if (accessColumn == null) { return(BadRequest($"Table {table} is not Accessable!")); } var temp = new AccessValue(accessPack.Items); using (var transaction = new DBTransaction(table.Connection, CurrentUser)) { try { foreach (var id in accessPack.Ids) { var value = table.LoadItemById(id, DBLoadParam.Load, null, transaction); if (value == null) { transaction.Rollback(); return(NotFound()); } if (!accessColumn.Access.GetFlag(AccessType.Admin, CurrentUser) && !value.Access.GetFlag(AccessType.Admin, CurrentUser) && !table.Access.GetFlag(AccessType.Admin, CurrentUser)) { transaction.Rollback(); return(Forbid()); } value.Access = temp; await value.Save(transaction); } transaction.Commit(); return(true); } catch (Exception ex) { transaction.Rollback(); return(BadRequest(ex)); } } }
public override object ParseValue(object value, object dataSource, Type valueType) { temp = null; if (value is IAccessable) { temp = (AccessValue)((IAccessable)value).Access; } if (value is AccessValue) { temp = (AccessValue)value; } if (value is byte[]) { temp = new AccessValue(); temp.Read((byte[])value); } if (temp != null) { return(temp); } return(base.ParseValue(value, dataSource, valueType)); }
public async void Generate(DBConnection connection) { Assert.AreEqual(true, connection.CheckConnection(), $"Connection Fail!"); schema = DBSchema.Generate(GetType().Assembly, SchemaName); Assert.IsNotNull(schema, "Attribute Generator Fail. On Schema"); Assert.IsNotNull(Employer.DBTable, "Attribute Generator Fail. On Employer Table"); Assert.IsNotNull(Position.DBTable, "Attribute Generator Fail. On Position Table"); var idColumn = Employer.DBTable.Columns["id"]; Assert.IsNotNull(idColumn, "Attribute Generator Fail. On Column Employer Id"); var positionColumn = Employer.DBTable.Columns["positionid"]; Assert.IsNotNull(positionColumn, "Attribute Generator Fail. On Column Employer Position"); Assert.IsNotNull(positionColumn.ReferenceTable, "Attribute Generator Fail. On Column Employer Position Reference"); schema.Connection = connection; schema.DropDatabase(); schema.CreateDatabase(); var result = schema.GetTablesInfo(connection.Schema, EmployerTableName); Assert.IsTrue(result.Count() == 1, "Generate Sql Table / Get Information Fail."); result = schema.GetTablesInfo(connection.Schema, PositionTableName); Assert.IsTrue(result.Count() == 1, "Generate Sql Table / Get Information Fail."); //Insert var employer = new Employer() { Identifier = $"{1:8}", Lodar = true, Age = 40, Height = 180, LongId = 120321312321L, Weight = 123.12333F, DWeight = 123.1233433424434D, Salary = 231323.32M, Name = "Ivan", Access = new AccessValue(new[] { new AccessItem(AccessValue.Groups.First(i => i.Id == 1), AccessType.Read), new AccessItem(AccessValue.Groups.First(i => i.Id == 2), AccessType.Admin), new AccessItem(AccessValue.Groups.First(i => i.Id == 3), AccessType.Create) }) }; Assert.AreEqual(employer.Type, EmployerType.Type2, "Default Value & Enum"); employer.GenerateId(); Assert.NotNull(employer.Id, "Id Generator Fail"); await employer.Save(); var qresult = schema.Connection.ExecuteQResult($"select * from {EmployerTableName}"); Assert.AreEqual(1, qresult.Values.Count, "Insert sql Fail"); Assert.AreEqual(employer.Id, qresult.Get(0, "id"), "Insert sql Fail Int"); Assert.AreEqual(employer.Identifier, qresult.Get(0, "identifier"), "Insert sql Fail String"); Assert.AreEqual((int?)employer.Type, qresult.Get(0, "typeid"), "Insert sql Fail Enum"); Assert.AreEqual(employer.Age, qresult.Get(0, "age"), "Insert sql Fail Byte"); Assert.AreEqual(employer.Height, qresult.Get(0, "height"), "Insert sql Fail Short"); Assert.AreEqual(employer.LongId, qresult.Get(0, "longid"), "Insert sql Fail Long"); Assert.AreEqual(employer.Weight, qresult.Get(0, "weight"), "Insert sql Fail Float"); Assert.AreEqual(employer.DWeight, qresult.Get(0, "dweight"), "Insert sql Fail Double"); Assert.AreEqual(employer.Salary, qresult.Get(0, "salary"), "Insert sql Fail Decimal"); var lodar = qresult.Get(0, "lodar").ToString(); Assert.IsTrue(lodar == "1" || lodar == "True", "Insert sql Fail Bool"); Assert.IsInstanceOf <byte[]>(qresult.Get(0, "group_access"), "Insert sql Fail Byte Array"); var accessValue = new AccessValue((byte[])qresult.Get(0, "group_access")); Assert.AreEqual(3, accessValue.Items.Count(), "Insert sql Fail Byte Array"); Assert.AreEqual(true, accessValue.Items.ElementAt(0).Read, "Insert sql Fail Byte Array"); Assert.AreEqual(true, accessValue.Items.ElementAt(1).Admin, "Insert sql Fail Byte Array"); Assert.AreEqual(false, accessValue.Items.ElementAt(2).Delete, "Insert sql Fail Byte Array"); Employer.DBTable.Clear(); Assert.AreEqual(0, Employer.DBTable.Count, "Clear table Fail"); //Insert Several Position.DBTable.Add(new Position() { Code = "1", Name = "First Position" }); Position.DBTable.Add(new Position() { Code = "2", Name = "Second Position" }); var position = new Position() { Id = 0, Code = "3", Name = "Group Position" }; position.Attach(); var sposition = new Position() { Code = "4", Parent = position, Name = "Sub Group Position" }; sposition.Attach(); //Select from internal Index Position.DBTable.Add(new Position() { Code = "t1", Name = "Null Index" }); Position.DBTable.Add(new Position() { Code = "t2", Name = "Null Index" }); Position.DBTable.Add(new Position() { Code = "t3", Name = "Null Index" }); var nullIds = Position.DBTable.Select(Position.DBTable.PrimaryKey, CompareType.Is, null).ToList(); Assert.AreEqual(6, nullIds.Count, "Select by null Fail"); await Position.DBTable.Save(); Position.DBTable.Clear(); var positions = Position.DBTable.Load(); Assert.AreEqual(7, positions.Count(), "Insert/Read several Fail"); //GetById employer = Employer.DBTable.LoadById(1); Assert.IsNotNull(employer, "GetById Fail"); position = Position.DBTable.LoadById(4); Assert.IsNotNull(position, "GetById Fail"); //Update employer.Position = position; await employer.Save(); qresult = schema.Connection.ExecuteQResult($"select * from {EmployerTableName}"); Assert.AreEqual(4, qresult.Get(0, "positionid"), "Update sql Fail"); connection.ExecuteQuery(@"create table test_table( id int primary key, test_date date, test_varchar varchar(512), test_numeric numeric(20,10))"); result = schema.GetTablesInfo(connection.Schema, "test_table"); schema.GenerateTablesInfo(result); var table = schema.Tables["test_table"] as DBTable <DBItem>; Assert.IsNotNull(table, "DBInformation Load Fail"); table.Load().LastOrDefault(); for (int i = 0; i < 1000; i++) { var row = table.NewItem(); row["id"] = i; row["test_date"] = DateTime.Now.AddDays(-i); row["test_varchar"] = "string value " + i; row["test_numeric"] = i / 1000M; table.Add(row); } await table.Save(); table.Clear(); int c = 0; foreach (var item in table.Load(string.Empty)) { if (++c == 5) { break; } } }
/// <summary>Сохраняет новые настройки доступа на чтение и редактирование вики-страницы.</summary> /// <param name="pid">id вики-страницы</param> /// <param name="gid">id группы, где создана страница</param> /// <param name="view">значение настройки доступа на чтение; описание значений Вы можете узнать странице, посвященной методу pages</param> /// <param name="edit">значение настройки доступа на редактирование; описание значений Вы можете узнать странице, посвященной методу pages</param> /// <returns>Ответ сервера в XML или JSON формате.</returns> private VKResponseBase saveAccess(System.Int64? pid, System.Int64? gid, AccessValue? view, AccessValue? edit) { manager.AddValueByName("@pid", pid); manager.AddValueByName("@gid", gid); manager.AddValueByName("@view", view); manager.AddValueByName("@edit", edit); return new VKResponseBase(GetResponse("saveAccess"), IsXMLResponse); }
/// <summary>Сохраняет новые настройки доступа на чтение и редактирование вики-страницы.</summary> /// <param name="pid">id вики-страницы</param> /// <param name="gid">id группы, где создана страница</param> /// <param name="view">значение настройки доступа на чтение; описание значений Вы можете узнать странице, посвященной методу pages</param> /// <param name="edit">значение настройки доступа на редактирование; описание значений Вы можете узнать странице, посвященной методу pages</param> /// <returns>Ответ сервера в XML или JSON формате.</returns> public VKResponseBase SaveAccess(System.Int64? pid, System.Int64? gid, AccessValue? view = null, AccessValue? edit = null) { return saveAccess(pid, gid, view, edit); }
/// <summary>Редактирует данные видеозаписи на странице пользователя.</summary> /// <param name="vid">id видеозаписи</param> /// <param name="oid">id владельца видеозаписи</param> /// <param name="privacy_view">приватность на просмотр видео в соответствии с форматом приватности</param> /// <param name="privacy_comment">приватность на комментирование видео в соответствии с форматом приватности</param> /// <param name="name">название видеозаписи</param> /// <param name="desc">описание видеозаписи</param> /// <returns>Ответ сервера в XML или JSON формате.</returns> public VKResponseBase Edit(Id vid, System.Int64? oid, AccessValue? privacy_view = null, AccessValue? privacy_comment = null, string name = null, string desc = null) { return edit(vid, oid, name, desc, privacy_view, privacy_comment); }
/// <summary>Возвращает адрес сервера (необходимый для</summary> /// <param name="name">название видеофайла</param> /// <param name="description">описание видеофайла</param> /// <param name="gid">Группа, в которую будет сохранён видеофайл</param> /// <param name="privacy_view">приватность на просмотр видео в соответствии с форматом приватности</param> /// <param name="privacy_comment">приватность на комментирование видео в соответствии с форматом приватности</param> /// <returns>Ответ сервера в XML или JSON формате.</returns> private VKResponseBase save(string name, string description, System.Int64? gid, AccessValue? privacy_view, AccessValue? privacy_comment) { manager.AddValueByName("@name", name); manager.AddValueByName("@description", description); manager.AddValueByName("@gid", gid); manager.AddValueByName("@privacy_view", privacy_view); manager.AddValueByName("@privacy_comment", privacy_comment); return new VKResponseBase(GetResponse("save"), IsXMLResponse); }
/// <summary>Редактирует данные видеозаписи на странице пользователя.</summary> /// <param name="vid">id видеозаписи</param> /// <param name="oid">id владельца видеозаписи</param> /// <param name="name">название видеозаписи</param> /// <param name="desc">описание видеозаписи</param> /// <param name="privacy_view">приватность на просмотр видео в соответствии с форматом приватности</param> /// <param name="privacy_comment">приватность на комментирование видео в соответствии с форматом приватности</param> /// <returns>Ответ сервера в XML или JSON формате.</returns> private VKResponseBase edit(Id vid, System.Int64? oid, string name, string desc, AccessValue? privacy_view, AccessValue? privacy_comment) { manager.AddValueByName("@vid", vid); manager.AddValueByName("@oid", oid); manager.AddValueByName("@name", name); manager.AddValueByName("@desc", desc); manager.AddValueByName("@privacy_view", privacy_view); manager.AddValueByName("@privacy_comment", privacy_comment); return new VKResponseBase(GetResponse("edit"), IsXMLResponse); }
/// <summary>Возвращает адрес сервера (необходимый для</summary> /// <param name="name">название видеофайла</param> /// <param name="gid">Группа, в которую будет сохранён видеофайл</param> /// <param name="description">описание видеофайла</param> /// <param name="privacy_view">приватность на просмотр видео в соответствии с форматом приватности</param> /// <param name="privacy_comment">приватность на комментирование видео в соответствии с форматом приватности</param> /// <returns>Ответ сервера в XML или JSON формате.</returns> public VKResponseBase Save(string name, System.Int64? gid, string description = null, AccessValue? privacy_view = null, AccessValue? privacy_comment = null) { return save(name, description, gid, privacy_view, privacy_comment); }
public void RefereshText(IUserIdentity user) { string _textCache = ""; if (_textCache?.Length == 0 && LogItem != null) { var logPrevius = LogItem.GetPrevius(); foreach (var logColumn in LogTable.GetLogColumns()) { var column = logColumn.BaseColumn; if ((column.Keys & DBColumnKeys.Stamp) == DBColumnKeys.Stamp) { continue; } var oldValue = logPrevius?.GetValue(logColumn); var newValue = LogItem.GetValue(logColumn); if (DBService.Equal(oldValue, newValue)) { continue; } var oldFormat = column.Access.GetFlag(AccessType.Read, user) ? column.FormatValue(oldValue) : "*****"; var newFormat = column.Access.GetFlag(AccessType.Read, user) ? column.FormatValue(newValue) : "*****"; if (oldValue == null && newValue != null) { _textCache += string.Format("{0}: {1}\n", column, newFormat); } else if (oldValue != null && newValue == null) { _textCache += string.Format("{0}: {1}\n", column, oldFormat); } else if (oldValue != null && newValue != null) { if ((column.Keys & DBColumnKeys.Access) == DBColumnKeys.Access) { string rez = string.Empty; var oldAcces = new AccessValue((byte[])oldValue); var newAcces = new AccessValue((byte[])newValue); foreach (var oAccess in oldAcces.Items) { var nAceess = newAcces.Get(oAccess.Group); if (nAceess.Equals(AccessItem.Empty)) { rez += string.Format("Remove {0}; ", oAccess); } else if (!nAceess.Equals(oAccess)) { rez += string.Format("Change {0}({1}{2}{3}{4}{5}{6}); ", oAccess.Group, oAccess.Read != nAceess.Read ? (nAceess.Read ? "+" : "-") + "View " : "", oAccess.Update != nAceess.Update ? (nAceess.Update ? "+" : "-") + "Edit " : "", oAccess.Create != nAceess.Create ? (nAceess.Create ? "+" : "-") + "Create " : "", oAccess.Delete != nAceess.Delete ? (nAceess.Delete ? "+" : "-") + "Delete " : "", oAccess.Admin != nAceess.Admin ? (nAceess.Admin ? "+" : "-") + "Admin " : "", oAccess.Accept != nAceess.Accept ? (nAceess.Accept ? "+" : "-") + "Accept" : ""); } } foreach (var nAccess in newAcces.Items) { var access = oldAcces.Get(nAccess.Group); if (!access.Equals(AccessItem.Empty)) { rez += string.Format("New {0}; ", nAccess); } } _textCache += string.Format("{0}: {1}", column, rez); } else if (column.DataType == typeof(string)) { var diffs = DiffResult.DiffLines(oldFormat, newFormat); var buf = new StringBuilder(); foreach (var diff in diffs) { string val = diff.Result.Trim(); if (val.Length > 0) { buf.AppendLine(string.Format("{0} {1} at {2};", diff.Type, val, diff.Index, diff.Index)); } } _textCache += string.Format("{0}: {1}\r\n", column, buf); } else { _textCache += string.Format("{0}: Old:{1} New:{2}\r\n", column, oldFormat, newFormat); } } } } }