Exemple #1
0
        /// <typeparam name="string">A Firebase-generated new document ID</typeparam>
        public async Task <string> AddAsync <T>(T documentData) where T : class, new()
        {
            string documentJson = FirestormUtility.ToJsonDocument(documentData, "");

            byte[] postData = Encoding.UTF8.GetBytes(documentJson);

            //The URL must NOT include document name
            var uwr = await FirestormConfig.Instance.UWRPost(stringBuilder.ToString(), new (string, string)[]
Exemple #2
0
        public static string ToJsonDocument(object value, string fullDocumentPath)
        {
            var writer = new JsonWriter();

            writer.PrettyPrint = true;

            writer.WriteObjectStart();
            writer.WritePropertyName("name"); //document name
            writer.Write(fullDocumentPath);

            WriteFields(value);

            /// <summary>
            /// "fields" is not surrounded by object { } after this call
            /// </summary>
            void WriteFields(object v)
            {
                writer.WritePropertyName("fields");
                writer.WriteObjectStart();

                //REFLESIA OF ETERNITY
                if (v == null)
                {
                    throw new FirestormException($"Found null value in the object you are trying to make into a Json!");
                }

                var fields = v.GetType().GetFields(BindingFlags.Public | BindingFlags.Instance);

                foreach (var field in fields)
                {
                    //Debug.Log($"Propp {field.Name}");
                    writer.WritePropertyName(field.Name);

                    bool hasTimestampAttribute = field.GetCustomAttribute <ServerTimestamp>() != null;
                    var  fieldObject           = field.GetValue(v);

                    WriterDecision(fieldObject, hasTimestampAttribute);

                    void WriterDecision(object obj, bool timestampAttribute = false)
                    {
                        writer.WriteObjectStart();
                        var formatted = FirestormUtility.FormatForValueJson(obj);

                        switch (obj)
                        {
                        case List <object> lo:
                            writer.WritePropertyName(formatted.typeString);
                            writer.WriteObjectStart();
                            writer.WritePropertyName("values");
                            writer.WriteArrayStart();
                            foreach (object fromArray in lo)
                            {
                                //probably explode if you put List<object> in List<object>
                                WriterDecision(fromArray);
                            }
                            writer.WriteArrayEnd();
                            writer.WriteObjectEnd();
                            break;

                        case byte[] by:
                            //UnityEngine.Debug.Log($"WRITING BYTE");
                            writer.WritePropertyName(formatted.typeString);
                            writer.Write(Convert.ToBase64String((byte[])formatted.objectForJson));
                            break;

                        default:
                            if (formatted.typeString == "mapValue")
                            {
                                writer.WritePropertyName(formatted.typeString);
                                writer.WriteObjectStart();
                                WriteFields(formatted.objectForJson);
                                writer.WriteObjectEnd();
                            }
                            else
                            {
                                writer.WritePropertyName(formatted.typeString);
                                writer.WriteSmart(formatted.objectForJson);
                            }
                            break;
                        }
                        writer.WriteObjectEnd();
                    }
                }
                writer.WriteObjectEnd(); //fields
            } //WriteFields

            writer.WriteObjectEnd(); //top
            return(writer.ToString());
        }