コード例 #1
0
        private FacadeClass Create(JObject fields, NfDbConnection connection, NfDbTransaction transaction)
        {
            var facade = FacadeObjectFactory.CreateIndividual();

            // Copy the JObject fields into the FacadeClass
            facade.Merge(fields);

            // Try to add them to the database
            var error = facade.Insert(connection, transaction);

            // Throw on error
            if (error != null && error.HasError)
            {
                throw new ApplicationException(error.Message);
            }

            // Tell NetForum we are done with this operation so it can do any background tasks
            // Neccessity of this varies by Facade Object
            facade.ProcessRoundTripEvents(connection, transaction);

            // Reload it so all the computed/denormalized fields are present
            facade.CurrentKey = facade.GetValue("cst_key");
            facade.SelectByKey(connection, transaction);

            return(facade);
        }
コード例 #2
0
        public IHttpActionResult Put(Guid id, [FromBody] JObject fields)
        {
            JObject result;

            using (var connection = DataUtils.GetConnection())
                using (var transaction = connection.BeginTransaction())
                    using (var facade = FacadeObjectFactory.CreateIndividual())
                    {
                        facade.CurrentKey = id.ToString();
                        facade.SelectByKey(connection, transaction);

                        facade.Merge(fields);

                        facade.Update(connection, transaction);

                        facade.LoadRelatedData(connection, transaction);
                        facade.ProcessRoundTripEvents(connection, transaction);

                        result = GetFields(facade);

                        transaction.Commit();
                    }

            return(Json(result));
        }
コード例 #3
0
        // GET api/<controller>
        public IEnumerable <Hashtable> Get()
        {
            // Make sure the user is logged in
            if (CustomerKey == null || Individual == null || string.IsNullOrEmpty(Individual.CurrentKey))
            {
                throw new HttpResponseException(HttpStatusCode.Unauthorized);
            }

            // This could be passed in via a query string (compared against a whitelist), or derived from the object model
            var columns = new string[] { "cst_recno", "ind_first_name", "ind_last_name", "ind_badge_name", "eml_address", "adr_city", "adr_line1", "adr_post_code", "adr_state" };

            // Using a real data model is preferable
            var result = new List <Hashtable>();

            using (FacadeClass facade = FacadeObjectFactory.CreateIndividual()) // Re-use the facade to reduce memory usage
                using (var connection = DataUtils.GetConnection())
                    using (var transaction = connection.BeginTransaction(System.Data.IsolationLevel.ReadUncommitted))

                        // In a real-world application, you wouldn't dump your whole database
                        // Ideally a high-level filter would be applied (i.e. adr_state in this case), with pagination
                        // Any more specific filtering (city, zip, radius) could be done client-side
                        // Adding a caching mechanism would increase performance
                        using (var cmd = new NfDbCommand(@"
SELECT
    ind_cst_key
FROM
    co_customer (NOLOCK)
    JOIN co_individual (NOLOCK) ON ind_cst_key = cst_key AND ind_delete_flag = 0
WHERE
    cst_delete_flag = 0
", connection, transaction))
                            using (var reader = cmd.ExecuteReader())
                            {
                                while (reader.HasRows && reader.Read())
                                {
                                    facade.CurrentKey = ((Guid)reader.GetValue(0)).ToString();
                                    facade.SelectByKey(connection, transaction);

                                    // Using a real data model is preferable
                                    var record = new Hashtable();

                                    foreach (var col in columns)
                                    {
                                        // Using GetValueNative so booleans and numeric data types come over to JSON as their proper data types
                                        record[col] = facade.GetValueNative(col);
                                    }

                                    result.Add(record);

                                    // Clear facade values between loop iterations
                                    facade.ClearValues();
                                }
                            }

            return(result);
        }
コード例 #4
0
        // GET: api/mb_membership/5
        public IHttpActionResult Get(Guid id)
        {
            using (var connection = DataUtils.GetConnection())
                using (var transaction = connection.BeginTransaction())
                    using (var facade = FacadeObjectFactory.CreateMembership())
                    {
                        facade.CurrentKey = id.ToString();
                        facade.SelectByKey(connection, transaction);

                        var fields = GetFields(facade);

                        return(Json(fields));
                    }
        }
コード例 #5
0
        public IHttpActionResult Get()
        {
            var currentUserName = Config.CurrentUserName;
            var userOptions     = Config.UserOptions;
            var currentUserKey  = Config.CurrentUserKey;
            var session         = Config.Session;

            var identity = (ClaimsIdentity)User.Identity;
            var usr_code = identity.Claims.FirstOrDefault(claim => claim.Type == "usr_code")?.Value;

            if (string.IsNullOrEmpty(usr_code))
            {
                return(BadRequest("Cannot find usr_code"));
            }

            var results = new JArray();

            using (var connection = DataUtils.GetConnection())
                using (var transaction = connection.BeginTransaction())
                    using (var cmd = new NfDbCommand("SELECT usr_cst_key FROM fw_user WHERE usr_code = @usr_code AND usr_delete_flag = 0", connection, transaction))
                    {
                        cmd.Parameters.AddWithValue("@usr_code", usr_code);

                        var result = cmd.ExecuteScalar();

                        if (result is Guid cst_key)
                        {
                            using (var facade = FacadeObjectFactory.CreateIndividual())
                            {
                                facade.CurrentKey = cst_key.ToString();
                                facade.SelectByKey(connection, transaction);

                                // Suggest using a facade-to-model mapping solution here instead
                                var fields = GetFields(facade);

                                results.Add(fields);
                            }
                        }
                    }

            return(Json(results));
        }
コード例 #6
0
        private FacadeClass Existing(string eml_address, NfDbConnection connection, NfDbTransaction transaction)
        {
            // Quick and dirty duplicate check by email address
            using (var cmd = new NfDbCommand("SELECT cst_key FROM co_customer WHERE cst_delete_flag = 0 AND cst_type = 'Individual' AND cst_eml_address_dn = @eml_address", connection, transaction))
            {
                cmd.Parameters.AddWithValue("@eml_address", eml_address);

                var result = cmd.ExecuteScalar();

                // If a match was found
                if (result is Guid cst_key)
                {
                    // Instanciate a facade and pull down their record
                    var facade = FacadeObjectFactory.CreateIndividual();
                    facade.CurrentKey = cst_key.ToString();
                    facade.SelectByKey(connection, transaction);
                    return(facade);
                }
            }

            return(null);
        }
コード例 #7
0
        // GET: api/mb_membership
        /// <summary>
        /// Get a list of memberships, filtered by a where condition
        /// </summary>
        /// <param name="where">JSON encoded list of fields to search the database for</param>
        /// <remarks>
        /// ?where={ "field1": "value", "field2": { "eq": "value }, "field3": { "gt": 5 }, "field4": "IS NULL" }
        /// </remarks>
        /// <returns>List of memberships</returns>
        public IHttpActionResult Get([FromUri] string where)
        {
            JArray  results     = new JArray();
            JObject whereFields = null;
            Dictionary <string, object> searchFields = new Dictionary <string, object>();

            try
            {
                whereFields = JObject.Parse(where);
            }
            catch (Exception)
            {
            }

            if (whereFields != null)
            {
                using (var facade = FacadeObjectFactory.CreateMembership())
                {
                    // Quick and dirty field validation
                    var verify = new Regex(@"^[a-z0-9_]+$");

                    foreach (var pair in whereFields)
                    {
                        if (!verify.IsMatch(pair.Key))
                        {
                            continue;
                        }

                        if (pair.Value == null)
                        {
                            continue;
                        }

                        var field = facade.GetField(pair.Key);
                        var parts = pair.Key.Split('_');

                        if (field == null)
                        {
                            continue;
                        }

                        if (parts[0] != "mbr" && parts[0] != "mbt")
                        {
                            continue;
                        }

                        searchFields.Add(pair.Key, pair.Value);
                    }
                }
            }

            // Add top just for sanity reasons
            var SQL = @"SELECT TOP 100 mbr_key FROM mb_membership JOIN mb_member_type ON mbt_key = mbr_mbt_key AND mbt_delete_flag = 0 WHERE mbr_delete_flag = 0";

            using (var connection = DataUtils.GetConnection())
                using (var transaction = connection.BeginTransaction())
                    using (var cmd = new NfDbCommand(SQL, connection, transaction))
                    {
                        foreach (var field in searchFields.Keys)
                        {
                            cmd.CommandText += Environment.NewLine + $" AND [{field}]";

                            var search = searchFields[field];

                            if (search is JObject searchOperation)
                            {
                                if (searchOperation.Count != 1)
                                {
                                    continue;
                                }

                                var op = (JProperty)searchOperation.First;

                                switch (op.Name)
                                {
                                case "eq":
                                    SearchUtils.JTokenParse(cmd, op.Value, field, "=");
                                    break;

                                case "ne":
                                    SearchUtils.JTokenParse(cmd, op.Value, field, "!=");
                                    break;

                                case "gt":
                                    SearchUtils.JTokenParse(cmd, op.Value, field, ">");
                                    break;

                                case "ge":
                                    SearchUtils.JTokenParse(cmd, op.Value, field, ">=");
                                    break;

                                case "lt":
                                    SearchUtils.JTokenParse(cmd, op.Value, field, "<");
                                    break;

                                case "le":
                                    SearchUtils.JTokenParse(cmd, op.Value, field, "<=");
                                    break;
                                }
                            }
                            else if (search is JToken searchValue)
                            {
                                SearchUtils.JTokenParse(cmd, searchValue, field, "=");
                            }
                        }

                        using (var reader = cmd.ExecuteReader())
                        {
                            while (reader.Read())
                            {
                                Guid mbr_key = reader.GetGuid(0);

                                using (var facade = FacadeObjectFactory.CreateMembership())
                                {
                                    facade.CurrentKey = mbr_key.ToString();
                                    facade.SelectByKey(connection, transaction);

                                    // Suggest using a facade-to-model mapping solution here instead
                                    var fields = GetFields(facade);

                                    results.Add(fields);
                                }
                            }
                        }
                    }

            return(Json(results));
        }