private void AddField(Content content, Property expansion, ODataEntity fields, string fieldName, HttpContext httpContext, Func <Content, HttpContext, object> getFieldValue) { fields.Add(fieldName, expansion == null ? ODataReference.Create(string.Concat(GetSelfUrl(content), "/", fieldName)) : getFieldValue?.Invoke(content, httpContext)); }
protected virtual object GetJsonObject(Field field, string selfUrl, ODataRequest oDataRequest) { object data; if (field is ReferenceField) { return(ODataReference.Create(String.Concat(selfUrl, "/", field.Name))); } else if (field is BinaryField binaryField) { try { // load binary fields only if the content is finalized var binaryData = field.Content.ContentHandler.SavingState == ContentSavingState.Finalized ? (BinaryData)binaryField.GetData() : null; return(ODataBinary.Create(BinaryField.GetBinaryUrl(binaryField.Content.Id, binaryField.Name, binaryData?.Timestamp ?? default), null, binaryData?.ContentType, null)); } catch (Exception ex) { SnTrace.System.WriteError( $"Error accessing field {field.Name} of {field.Content.Path} with user {User.Current.Username}: " + ex.Message); return(null); } } else if (ODataMiddleware.DeferredFieldNames.Contains(field.Name)) { return(ODataReference.Create(String.Concat(selfUrl, "/", field.Name))); } try { data = field.GetData(); } catch (SenseNetSecurityException) { // The user does not have access to this field (e.g. cannot load // a referenced content). In this case we serve a null value. data = null; SnTrace.Repository.Write("PERMISSION warning: user {0} does not have access to field '{1}' of {2}.", User.LoggedInUser.Username, field.Name, field.Content.Path); } if (data is NodeType nodeType) { return(nodeType.Name); } if (data is RichTextFieldValue rtfValue) { return(GetRichTextOutput(field.Name, rtfValue, oDataRequest)); } return(data); }
private void AddField(Content content, List <Property> expandTree, IDictionary <string, object> fields, string fieldName, HttpContext httpContext, Func <Content, HttpContext, object> getFieldValue) { var expansion = GetExpansion(fieldName, expandTree); fields.Add(fieldName, expansion == null ? ODataReference.Create(string.Concat(GetSelfUrl(content), "/", fieldName)) : getFieldValue?.Invoke(content, httpContext)); }
internal override ODataEntity Project(Content content, HttpContext httpContext) { var fields = new ODataEntity(); var selfurl = GetSelfUrl(content); if (Request.EntityMetadata != MetadataFormat.None) { fields.Add("__metadata", GetMetadata(content, selfurl, Request.EntityMetadata, httpContext)); } IEnumerable <string> fieldNames; if (Request.HasSelect) { fieldNames = Request.Select; } else { if (IsCollectionItem) { if (_fieldNamesForPaths.ContainsKey(content.ContentHandler.ParentPath)) { fieldNames = _fieldNamesForPaths[content.ContentHandler.ParentPath]; } else { _fieldNamesForPaths[content.ContentHandler.ParentPath] = fieldNames = content.GetFieldNamesInParentTable(); } if (content.AspectFields != null && content.AspectFields.Count > 0) { fieldNames = fieldNames.Concat(content.AspectFields.Keys); } } else { fieldNames = content.Fields.Keys; } } if (Request.HasSelect) { foreach (var selectItem in Request.Select) { if (selectItem.Contains("/")) { throw new ODataException("Bad item in $select: " + selectItem, ODataExceptionCode.InvalidSelectParameter); } } } if (!Request.HasSelect) { fieldNames = fieldNames.Concat(new[] { ACTIONSPROPERTY, ISFILEPROPERTY, ODataMiddleware.ChildrenPropertyName }); } foreach (var fieldName in fieldNames) { if (fields.ContainsKey(fieldName)) { continue; } if (ODataMiddleware.DisabledFieldNames.Contains(fieldName)) { fields.Add(fieldName, null); continue; } if (IsAllowedField(content, fieldName)) { if (content.Fields.TryGetValue(fieldName, out var field)) { fields.Add(fieldName, ODataWriter.GetJsonObject(field, selfurl)); } else if (fieldName == ACTIONSPROPERTY) { fields.Add(ACTIONSPROPERTY, ODataReference.Create(String.Concat(selfurl, "/", ODataMiddleware.ActionsPropertyName))); } else if (fieldName == ISFILEPROPERTY) { fields.Add(ISFILEPROPERTY, content.Fields.ContainsKey(ODataMiddleware.BinaryPropertyName)); } else if (fieldName == ICONPROPERTY) { fields.Add(fieldName, content.Icon ?? content.ContentType.Icon); } else if (fieldName == ODataMiddleware.ChildrenPropertyName) { fields.Add(fieldName, ODataReference.Create(string.Concat(selfurl, "/", ODataMiddleware.ChildrenPropertyName))); } else { fields.Add(fieldName, null); } } else { fields.Add(fieldName, null); } } return(fields); }