/* * * (c) Copyright Ascensio System Limited 2010-2018 * * This program is freeware. You can redistribute it and/or modify it under the terms of the GNU * General Public License (GPL) version 3 as published by the Free Software Foundation (https://www.gnu.org/copyleft/gpl.html). * In accordance with Section 7(a) of the GNU GPL its Section 15 shall be amended to the effect that * Ascensio System SIA expressly excludes the warranty of non-infringement of any third-party rights. * * THIS PROGRAM IS DISTRIBUTED WITHOUT ANY WARRANTY; WITHOUT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY OR * FITNESS FOR A PARTICULAR PURPOSE. For more details, see GNU GPL at https://www.gnu.org/copyleft/gpl.html * * You can contact Ascensio System SIA by email at sales@onlyoffice.com * * The interactive user interfaces in modified source and object code versions of ONLYOFFICE must display * Appropriate Legal Notices, as required under Section 5 of the GNU GPL version 3. * * Pursuant to Section 7 § 3(b) of the GNU GPL you must retain the original ONLYOFFICE logo which contains * relevant author attributions when distributing the software. If the display of the logo in its graphic * form is not reasonably feasible for technical reasons, you must include the words "Powered by ONLYOFFICE" * in every copy of the program you distribute. * Pursuant to Section 7 § 3(e) we decline to grant you any rights under trademark law for use of our trademarks. * */ using System; using System.Collections.Generic; using System.Linq; using ASC.Api.CRM; using ASC.Common.Web; using ASC.CRM.ApiModels; using ASC.CRM.Core; using ASC.CRM.Core.Dao; using ASC.CRM.Core.Entities; using ASC.CRM.Core.Enums; using ASC.MessagingSystem; using ASC.Web.Api.Routing; namespace ASC.CRM.Api { public class CustomFieldsController : BaseApiController { public CustomFieldsController(CRMSecurity cRMSecurity, DaoFactory daoFactory, MessageTarget messageTarget, MessageService messageService) : base(daoFactory, cRMSecurity) { MessageTarget = messageTarget; MessageService = messageService; } public MessageService MessageService { get; } public MessageTarget MessageTarget { get; } /// /// Returns the list of descriptions for all existing user fields /// /// Type /// Get user field list /// User fields /// /// User field list /// /// [Read(@"{entityType:regex(contact|person|company|opportunity|case)}/customfield/definitions")] public IEnumerable GetCustomFieldDefinitions(string entityType) { return DaoFactory.GetCustomFieldDao().GetFieldsDescription(ToEntityType(entityType)).ConvertAll(ToCustomFieldDto); } /// /// Returns the list of all user field values using the entity type and entity ID specified in the request /// /// Type /// ID /// Get user field values /// User fields /// [Read(@"{entityType:regex(contact|person|company|opportunity|case)}/{entityid:int}/customfield")] public IEnumerable GetCustomFieldForSubject(string entityType, int entityid) { return DaoFactory.GetCustomFieldDao().GetEnityFields(ToEntityType(entityType), entityid, false).ConvertAll(ToCustomFieldBaseDto); } /// /// Sets the new user field value using the entity type, ID, field ID and value specified in the request /// /// Type /// ID /// Field ID /// Field Value /// Set user field value /// User fields /// /// User field /// [Create(@"{entityType:regex(contact|person|company|opportunity|case)}/{entityid:int}/customfield/{fieldid:int}")] public CustomFieldBaseDto SetEntityCustomFieldValue(string entityType, int entityid, int fieldid, string fieldValue) { var customField = DaoFactory.GetCustomFieldDao().GetFieldDescription(fieldid); var entityTypeStr = ToEntityType(entityType); customField.EntityID = entityid; customField.Value = fieldValue; DaoFactory.GetCustomFieldDao().SetFieldValue(entityTypeStr, entityid, fieldid, fieldValue); return ToCustomFieldBaseDto(customField); } /// /// Creates a new user field with the parameters (entity type, field title, type, etc.) specified in the request /// /// Entity type /// Field title /// /// User field value /// /// Field position /// Mask /// Create user field /// User fields /// /// User field /// /// /// /// [Create(@"{entityType:regex(contact|person|company|opportunity|case)}/customfield")] public CustomFieldDto CreateCustomFieldValue(string entityType, string label, int fieldType, int position, string mask) { if (!(CRMSecurity.IsAdmin)) throw CRMSecurity.CreateSecurityException(); var entityTypeObj = ToEntityType(entityType); var fieldID = DaoFactory.GetCustomFieldDao().CreateField(entityTypeObj, label, (CustomFieldType)fieldType, mask); var wrapper = DaoFactory.GetCustomFieldDao().GetFieldDescription(fieldID); var messageAction = GetCustomFieldCreatedAction(entityTypeObj); MessageService.Send(messageAction, MessageTarget.Create(wrapper.ID), wrapper.Label); return ToCustomFieldDto(DaoFactory.GetCustomFieldDao().GetFieldDescription(fieldID)); } /// /// Updates the selected user field with the parameters (entity type, field title, type, etc.) specified in the request /// /// User field id /// Entity type /// Field title /// /// User field value /// /// Field position /// Mask /// Updates the selected user field /// User fields /// /// User field /// /// /// /// /// /// [Update(@"{entityType:regex(contact|person|company|opportunity|case)}/customfield/{id:int}")] public CustomFieldDto UpdateCustomFieldValue(int id, string entityType, string label, int fieldType, int position, string mask) { if (id <= 0) throw new ArgumentException(); if (!DaoFactory.GetCustomFieldDao().IsExist(id)) throw new ItemNotFoundException(); var entityTypeObj = ToEntityType(entityType); var customField = new CustomField { EntityType = entityTypeObj, FieldType = (CustomFieldType)fieldType, ID = id, Mask = mask, Label = label, Position = position }; DaoFactory.GetCustomFieldDao().EditItem(customField); customField = DaoFactory.GetCustomFieldDao().GetFieldDescription(id); var messageAction = GetCustomFieldUpdatedAction(entityTypeObj); MessageService.Send(messageAction, MessageTarget.Create(customField.ID), customField.Label); return ToCustomFieldDto(customField); } /// /// Deletes the user field with the ID specified in the request /// /// Type /// Field ID /// Delete user field /// User fields /// /// /// /// User field /// [Delete(@"{entityType:regex(contact|person|company|opportunity|case)}/customfield/{fieldid:int}")] public CustomFieldDto DeleteCustomField(string entityType, int fieldid) { if (!(CRMSecurity.IsAdmin)) throw CRMSecurity.CreateSecurityException(); if (fieldid <= 0) throw new ArgumentException(); var customField = DaoFactory.GetCustomFieldDao().GetFieldDescription(fieldid); if (customField == null) throw new ItemNotFoundException(); var result = ToCustomFieldDto(customField); DaoFactory.GetCustomFieldDao().DeleteField(fieldid); var messageAction = GetCustomFieldDeletedAction(ToEntityType(entityType)); MessageService.Send(messageAction, MessageTarget.Create(customField.ID), result.Label); return result; } /// /// Updates user fields order /// /// User field ID list /// Entity type /// User fields /// /// User fields /// /// /// /// [Update(@"{entityType:regex(contact|person|company|opportunity|case)}/customfield/reorder")] public IEnumerable UpdateCustomFieldsOrder(IEnumerable fieldids, string entityType) { if (fieldids == null) throw new ArgumentException(); if (!(CRMSecurity.IsAdmin)) throw CRMSecurity.CreateSecurityException(); var customFields = new List(); foreach (var id in fieldids) { if (!DaoFactory.GetCustomFieldDao().IsExist(id)) throw new ItemNotFoundException(); customFields.Add(DaoFactory.GetCustomFieldDao().GetFieldDescription(id)); } DaoFactory.GetCustomFieldDao().ReorderFields(fieldids.ToArray()); var messageAction = GetCustomFieldsUpdatedOrderAction(ToEntityType(entityType)); MessageService.Send(messageAction, MessageTarget.Create(fieldids), customFields.Select(x => x.Label)); return customFields.Select(ToCustomFieldBaseDto); } private static CustomFieldBaseDto ToCustomFieldBaseDto(CustomField customField) { return new CustomFieldBaseDto(customField); } private CustomFieldDto ToCustomFieldDto(CustomField customField) { var result = new CustomFieldDto(customField) { RelativeItemsCount = DaoFactory.GetCustomFieldDao().GetContactLinkCount(customField.EntityType, customField.ID) }; return result; } private static MessageAction GetCustomFieldCreatedAction(EntityType entityType) { switch (entityType) { case EntityType.Contact: return MessageAction.ContactUserFieldCreated; case EntityType.Person: return MessageAction.PersonUserFieldCreated; case EntityType.Company: return MessageAction.CompanyUserFieldCreated; case EntityType.Opportunity: return MessageAction.OpportunityUserFieldCreated; case EntityType.Case: return MessageAction.CaseUserFieldCreated; default: throw new ArgumentException("Invalid entityType: " + entityType); } } private static MessageAction GetCustomFieldUpdatedAction(EntityType entityType) { switch (entityType) { case EntityType.Contact: return MessageAction.ContactUserFieldUpdated; case EntityType.Person: return MessageAction.PersonUserFieldUpdated; case EntityType.Company: return MessageAction.CompanyUserFieldUpdated; case EntityType.Opportunity: return MessageAction.OpportunityUserFieldUpdated; case EntityType.Case: return MessageAction.CaseUserFieldUpdated; default: throw new ArgumentException("Invalid entityType: " + entityType); } } private static MessageAction GetCustomFieldDeletedAction(EntityType entityType) { switch (entityType) { case EntityType.Contact: return MessageAction.ContactUserFieldDeleted; case EntityType.Person: return MessageAction.PersonUserFieldDeleted; case EntityType.Company: return MessageAction.CompanyUserFieldDeleted; case EntityType.Opportunity: return MessageAction.OpportunityUserFieldDeleted; case EntityType.Case: return MessageAction.CaseUserFieldDeleted; default: throw new ArgumentException("Invalid entityType: " + entityType); } } private static MessageAction GetCustomFieldsUpdatedOrderAction(EntityType entityType) { switch (entityType) { case EntityType.Contact: return MessageAction.ContactUserFieldsUpdatedOrder; case EntityType.Person: return MessageAction.PersonUserFieldsUpdatedOrder; case EntityType.Company: return MessageAction.CompanyUserFieldsUpdatedOrder; case EntityType.Opportunity: return MessageAction.OpportunityUserFieldsUpdatedOrder; case EntityType.Case: return MessageAction.CaseUserFieldsUpdatedOrder; default: throw new ArgumentException("Invalid entityType: " + entityType); } } } }