Beispiel #1
0
 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));
 }
Beispiel #2
0
        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));
        }
Beispiel #4
0
        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);
        }