public HttpResponseMessage GetChordByName([FromBody] GetChordByNameRequestModel model)
        {
            if (string.IsNullOrEmpty(model.ChordName))
            {
                return(new PackedResponse(HttpStatusCode.BadRequest, ApplicationConstants.ErrorMessages.ChordNameEmpty).Pack());
            }

            Chord result = new Chord();

            using (AudioDumpEntities context = new AudioDumpEntities())
            {
                model.ChordName = model.ChordName.Replace(" ", "").ToUpper();
                var chordRecord = context.T_Chord.FirstOrDefault(m => m.Chord_Name.Equals(model.ChordName) && m.Is_Valid == true);

                if (chordRecord == null)
                {
                    return(new PackedResponse(HttpStatusCode.BadRequest, ApplicationConstants.ErrorMessages.ChordDoesNotExist).Pack());
                }

                result.ChordName = chordRecord.Chord_Name;
                result.Note1     = chordRecord.Note_1;
                result.Note2     = chordRecord.Note_2;
                result.Note3     = chordRecord.Note_3;
            }

            return(new PackedResponse(HttpStatusCode.OK, Newtonsoft.Json.JsonConvert.SerializeObject(result)).PackAsJson());
        }
        public HttpResponseMessage DeleteChord([FromBody] DeleteChordRequestModel model)
        {
            if (string.IsNullOrEmpty(model.ChordName))
            {
                return(new PackedResponse(HttpStatusCode.BadRequest, ApplicationConstants.ErrorMessages.ChordNameEmpty).Pack());
            }

            try
            {
                model.ChordName = model.ChordName.Replace(" ", "").ToUpper();

                using (TransactionScope scope = new TransactionScope())
                {
                    using (AudioDumpEntities context = new AudioDumpEntities())
                    {
                        //check if chord exists in db
                        var chordRecord = context.T_Chord.FirstOrDefault(m => m.Chord_Name.Equals(model.ChordName) && m.Is_Valid == true);
                        if (chordRecord == null)
                        {
                            throw new Exception(ApplicationConstants.ErrorMessages.ChordDoesNotExist);
                        }

                        // if exist, set valid to false
                        chordRecord.Is_Valid = false;
                        context.SaveChanges();

                        //Delete audio file
                        var targetFilePath = Path.Combine(audioFileDumpPath, $@"{model.ChordName}.{chordRecord.Audio_File_Ext}");
                        if (File.Exists(targetFilePath))
                        {
                            File.Delete(targetFilePath);
                        }
                    }

                    scope.Complete();
                }
            }
            catch (Exception ex)
            {
                return(new PackedResponse(HttpStatusCode.InternalServerError, ex.Message).Pack());
            }

            return(new PackedResponse(HttpStatusCode.OK, ApplicationConstants.SuccessMessages.ChordDeleted).Pack());
        }
        public List <Chord> ListAllChords()
        {
            List <Chord> chordList = new List <Chord>();

            using (AudioDumpEntities context = new AudioDumpEntities())
            {
                chordList = context.T_Chord.Where(m => m.Is_Valid == true)
                            .Select(x =>
                                    new Chord
                {
                    ChordName = x.Chord_Name,
                    Note1     = x.Note_1,
                    Note2     = x.Note_2,
                    Note3     = x.Note_3
                }).ToList();
            }

            return(chordList);
        }
        public HttpResponseMessage DownloadAudioFileByChord([FromBody] DownloadAudioFileByChordRequestModel model)
        {
            if (string.IsNullOrEmpty(model.ChordName))
            {
                return(new PackedResponse(HttpStatusCode.BadRequest, ApplicationConstants.ErrorMessages.ChordNameEmpty).Pack());
            }

            try
            {
                model.ChordName = model.ChordName.Replace(" ", "").ToUpper();
                var audioFileExt = string.Empty;
                using (AudioDumpEntities context = new AudioDumpEntities())
                {
                    //check if chord exists in db
                    var chordRecord = context.T_Chord.FirstOrDefault(m => m.Chord_Name.Equals(model.ChordName) && m.Is_Valid == true);
                    if (chordRecord == null)
                    {
                        throw new Exception(ApplicationConstants.ErrorMessages.ChordDoesNotExist);
                    }

                    audioFileExt = chordRecord.Audio_File_Ext;
                }

                var targetFilePath = Path.Combine(audioFileDumpPath, $@"{model.ChordName}.{audioFileExt}");
                if (!File.Exists(targetFilePath))
                {
                    throw new Exception(ApplicationConstants.ErrorMessages.AudioFileDoesNotExist);
                }

                var dataBytes  = File.ReadAllBytes(targetFilePath);
                var dataStream = new MemoryStream(dataBytes);

                return(new PackedResponse(HttpStatusCode.OK, ApplicationConstants.SuccessMessages.DownloadSuccessful).PackAsDownload(dataStream, model.ChordName, audioFileExt));
            }
            catch (Exception ex)
            {
                return(new PackedResponse(HttpStatusCode.InternalServerError, ex.Message).Pack());
            }
        }
        public async Task <HttpResponseMessage> AddChord()
        {
            // Load MultipartFormDataStreamProvider
            var provider = new MultipartFormDataStreamProvider(audioFileDumpPath);
            await Request.Content.ReadAsMultipartAsync(provider);

            var addChordRequestModel = new Chord();

            //Validate data passed into API
            try
            {
                // Map form data to model
                addChordRequestModel = MapChordModel(provider);

                //Return 400 bad request if any of the notes are empty
                if (string.IsNullOrEmpty(addChordRequestModel.ChordName) || string.IsNullOrEmpty(addChordRequestModel.Note1) || string.IsNullOrEmpty(addChordRequestModel.Note2) || string.IsNullOrEmpty(addChordRequestModel.Note3))
                {
                    throw new Exception(ApplicationConstants.ErrorMessages.FieldEmpty);
                }

                ValidateChordModelNotes(addChordRequestModel);

                // Validate FileData exists
                if (provider.FileData == null || provider.FileData.Count <= 0)
                {
                    throw new Exception(ApplicationConstants.ErrorMessages.NoAudioFile);
                }
            }
            catch (Exception ex)
            {
                return(new PackedResponse(HttpStatusCode.BadRequest, ex.Message).Pack());
            }

            try
            {
                using (TransactionScope scope = new TransactionScope())
                {
                    // Save data to DB
                    using (AudioDumpEntities context = new AudioDumpEntities())
                    {
                        if (context.T_Chord.Any(m => m.Chord_Name.ToUpper().Equals(addChordRequestModel.ChordName) && m.Is_Valid == true))
                        {
                            throw new Exception(ApplicationConstants.ErrorMessages.ChordExists);
                        }

                        T_Chord newChord = new T_Chord()
                        {
                            Chord_Name = addChordRequestModel.ChordName,
                            Note_1     = addChordRequestModel.Note1,
                            Note_2     = addChordRequestModel.Note2,
                            Note_3     = addChordRequestModel.Note3,
                            Is_Valid   = true
                        };

                        newChord.Audio_File_Ext = SaveAudioFile(provider, addChordRequestModel.ChordName, true);

                        context.T_Chord.Add(newChord);
                        context.SaveChanges();
                    }

                    // Save audio file to AudioFileDump folder


                    scope.Complete(); // only complete transaction if the audioFile is properly saved
                }
            }
            catch (Exception ex)
            {
                return(new PackedResponse(HttpStatusCode.InternalServerError, ex.Message).Pack());
            }

            return(new PackedResponse(HttpStatusCode.OK, ApplicationConstants.SuccessMessages.ChordAdded).Pack());
        }
        public async Task <HttpResponseMessage> UpdateChord()
        {
            // Load MultipartFormDataStreamProvider
            var provider = new MultipartFormDataStreamProvider(audioFileDumpPath);
            await Request.Content.ReadAsMultipartAsync(provider);

            var updateChordRequestModel = new Chord();

            try
            {
                // Map form data to model
                updateChordRequestModel = MapChordModel(provider);

                ValidateChordModelNotes(updateChordRequestModel);
            }
            catch (Exception ex)
            {
                return(new PackedResponse(HttpStatusCode.BadRequest, ex.Message).Pack());
            }

            try
            {
                using (AudioDumpEntities context = new AudioDumpEntities())
                {
                    var chordRecord = context.T_Chord.FirstOrDefault(m => m.Chord_Name.Equals(updateChordRequestModel.ChordName) && m.Is_Valid == true);

                    //validate if chord exists
                    if (chordRecord == null)
                    {
                        throw new Exception(ApplicationConstants.ErrorMessages.ChordDoesNotExist);
                    }

                    if (!string.IsNullOrEmpty(updateChordRequestModel.Note1))
                    {
                        chordRecord.Note_1 = updateChordRequestModel.Note1;
                    }

                    if (!string.IsNullOrEmpty(updateChordRequestModel.Note2))
                    {
                        chordRecord.Note_2 = updateChordRequestModel.Note2;
                    }

                    if (!string.IsNullOrEmpty(updateChordRequestModel.Note3))
                    {
                        chordRecord.Note_3 = updateChordRequestModel.Note3;
                    }

                    var fileExtension = string.Empty;

                    // Check if there is a audio file for updating
                    if (provider.FileData != null && provider.FileData.Count >= 0)
                    {
                        fileExtension = SaveAudioFile(provider, updateChordRequestModel.ChordName, false);
                    }

                    if (!string.IsNullOrEmpty(fileExtension))
                    {
                        chordRecord.Audio_File_Ext = fileExtension;
                    }

                    context.SaveChanges();
                }
            }
            catch (Exception ex)
            {
                return(new PackedResponse(HttpStatusCode.InternalServerError, ex.Message).Pack());
            }

            return(new PackedResponse(HttpStatusCode.OK, ApplicationConstants.SuccessMessages.ChordUpdated).Pack());
        }