ilyalehchylin/educats-xamarin

View on GitHub
source/EduCATS/Networking/AppServices/AppServices.cs

Summary

Maintainability
B
4 hrs
Test Coverage
using System.Threading.Tasks;
using EduCATS.Data.Models;
using EduCATS.Demo;
using EduCATS.Helpers.Json;
using EduCATS.Networking.Models.Eemc;
using EduCATS.Networking.Models.Login;
using EduCATS.Networking.Models.SaveMarks.Practicals;
using EduCATS.Networking.Models.Testing;
using Newtonsoft.Json;

namespace EduCATS.Networking.AppServices
{
    /// <summary>
    /// Network services helper.
    /// </summary>
    public static partial class AppServices
    {
        /// <summary>
        /// Authorize request.
        /// </summary>
        /// <param name="username">Username.</param>
        /// <param name="password">Password.</param>
        /// <returns>User data.</returns>
        public static async Task<object> Login(string username, string password)
        {
            if (AppDemo.Instance.CheckDemoAccount(username, password)) {
                return AppDemo.Instance.GetDemoResponse(AppDemoType.Login);
            }

            var userCreds = new UserCredentials {
                Username = username,
                Password = password
            };

            var body = JsonController.ConvertObjectToJson(userCreds);
            return await AppServicesController.Request(Links.Login, body);
        }

        public static async Task<object> LoginEducatsBy(string username, string password)
        {
            return await AppServicesController.Request(Links.LoginTest);
        }

        /// <summary>
        /// Fetch profile information request.
        /// </summary>
        /// <param name="username">Username.</param>
        /// <returns>User profile data.</returns>
        public static async Task<object> GetProfileInfo(string username)
        {
            var body = getUserLoginBody(username);
            return await AppServicesController.Request(Links.GetProfileInfo, body, AppDemoType.ProfileInfo);
        }

        /// <summary>
        /// Fetch account delete request.
        /// </summary>
        public static async Task<object> DeleteAccount()
        {
            var body = "";
            return await AppServicesController.Request(Links.DeleteAccount, body);
        }

        /// <summary>
        /// Fetch news request.
        /// </summary>
        /// <param name="username">Username.</param>
        /// <returns>News data.</returns>
        public static async Task<object> GetNews(string username)
        {
            var body = getUserLoginBody(username);
            return await AppServicesController.Request(Links.GetNews, body, AppDemoType.News);
        }

        /// <summary>
        /// Fetch subjects request.
        /// </summary>
        /// <param name="username">Username.</param>
        /// <returns>Subjects data.</returns>
        public static async Task<object> GetProfileInfoSubjects(string username)
        {
            var body = getUserLoginBody(username);
            
            if (Servers.Current == Servers.EduCatsBntuAddress)
                return await AppServicesController.Request(Links.GetProfileInfoSubjects, body, AppDemoType.ProfileInfoSubjects);
            else
                return await AppServicesController.Request(Links.GetProfileInfoSubjectsTest, AppDemoType.ProfileInfoSubjectsTest);
        }

        /// <summary>
        /// Fetch lecturers request.
        /// </summary>
        /// <param name="subjectId">SubjectId.</param>
        /// <returns>Data lectures.</returns>
        public static async Task<object> GetInfoLecturers(int subjectId)
        {
            return await AppServicesController.Request(Links.GetInfoLectures + $"{subjectId}", AppDemoType.InfoLecturers);
        }

        /// <summary>
        /// Fetch calendar data request.
        /// </summary>
        /// <param name="username">Username.</param>
        /// <returns>Calendar data.</returns>
        public static async Task<object> GetProfileInfoCalendar(string username)
        {
            var body = getUserLoginBody(username);
            return await AppServicesController.Request(Links.GetProfileInfoCalendar, body, AppDemoType.ProfileInfoCalendar);
        }

        /// <summary>
        /// Fetch calendar data request.
        /// </summary>
        /// <param name="username">Username.</param>
        /// <returns>Calendar data.</returns>
        public static async Task<object> GetSchedule(string date)
        {
            return await AppServicesController.Request(Links.GetSchedule + $"dateStart={date}&dateEnd={date}", AppDemoType.Schedule);
        }

        /// <summary>
        /// Fetch statistics request.
        /// </summary>
        /// <param name="subjectId">Subject ID.</param>
        /// <param name="groupId">Group ID.</param>
        /// <returns>Statistics data.</returns>
        public static async Task<object> GetStatistics(int subjectId, int groupId)
        {
            return await AppServicesController.Request(
                $"{Links.GetStatistics}?subjectID={subjectId}&groupID={groupId}",
                AppDemoType.Statistics);
        }

        /// <summary>
        /// Fetch statistics request.
        /// </summary>
        /// <param name="subjectId">Subject ID.</param>
        /// <param name="groupId">Group ID.</param>
        /// <returns>Statistics data.</returns>
        public static async Task<object> GetPractTestStatistics(int subjectId, int groupId)
        {
            return await AppServicesController.Request(
                $"{Links.GetPracticialsTest}subjectID={subjectId}&groupID={groupId}",
                AppDemoType.PracticalTestStatistics);
        }

        public static async Task<object> GetPractTestStatistics(int subjectId)
        {
            return await AppServicesController.Request(
                $"{Links.GetPracticals}{subjectId}",
                AppDemoType.PracticalTestStatistics);
        }

        public static async Task<object> GetPracticials(int subjectId, int groupId)
        {
            var groupItems = new GroupAndSubjModel();
            groupItems.GroupId = groupId;
            groupItems.SubjectId = subjectId;
            var body = JsonConvert.SerializeObject(groupItems);
            return await AppServicesController.Request(
                $"{Servers.EduCatsByAddress + Links.GetParticialsMarks}", body);
        }

        /// <summary>
        /// Fetch statistics request.
        /// </summary>
        /// <param name="subjectId">Subject ID.</param>
        /// <param name="groupId">Group ID.</param>
        /// <returns>Statistics data.</returns>
        public static async Task<object> GetTestStatistics(int subjectId, int groupId)
        {
            return await AppServicesController.Request(
                $"{Servers.EduCatsByAddress + Links.GetLabsCalendarData}subjectId={subjectId}&groupId={groupId}");
        }

        /// <summary>
        /// Fetch groups request.
        /// </summary>
        /// <param name="subjectId">Subject ID.</param>
        /// <returns>Group data.</returns>
        public static async Task<object> GetOnlyGroups(int subjectId)
        {
            return await AppServicesController.Request($"{Links.GetOnlyGroups}/{subjectId}");
        }

        /// <summary>
        /// Fetch groups data.
        /// </summary>
        /// <param name="subjectId">Subject ID.</param>
        /// <returns>Group data.</returns>
        public static async Task<object> GetGroupsData()
        {
            return await AppServicesController.Request($"{Links.GetGroupsData}");
        }

        /// <summary>
        /// Fetch laboratory works data request.
        /// </summary>
        /// <param name="subjectId">Subject ID.</param>
        /// <param name="groupId">Group ID.</param>
        /// <returns>Laboratory works data.</returns>
        public static async Task<object> GetLabs(int subjectId, int groupId)
        {
            return await AppServicesController.Request(
                $"{Links.GetLabsTest}subjectID={subjectId}&groupID={groupId}",
                AppDemoType.LabsResults);
        }

        public static async Task<object> GetLabs(int subjectId)
        {
            return await AppServicesController.Request(
                $"{Links.GetLabs}{subjectId}",
                AppDemoType.Labs);
        }
        /// <summary>
        /// Fetch lectures data request.
        /// </summary>
        /// <param name="subjectId">Subject ID.</param>
        /// <param name="groupId">Group ID.</param>
        /// <returns>Lectures data.</returns>
        public static async Task<object> GetLectures(int subjectId, int groupId)
        {
            return await AppServicesController.Request(
                $"{Links.GetLectures}?subjectID={subjectId}&groupID={groupId}");
        }

        public static async Task<object> GetLecturesEducatsBy(int subjectId, int groupId)
        {
            string link = Servers.EduCatsByAddress + Links.GetLecturesCalendarData + "subjectId=" + subjectId + "&groupId=" + groupId;
            return await AppServicesController.Request(link);
        }

        /// <summary>
        /// Fetch tests request.
        /// </summary>
        /// <param name="subjectId">Subject ID.</param>
        /// <param name="userId">User ID.</param>
        /// <returns>List of test data.</returns>
        public static async Task<object> GetAvailableTests(int subjectId, int userId)
        {
            return await AppServicesController.Request(
                $"{Links.GetAvailableTests}?subjectId={subjectId}&userId={userId}",
                AppDemoType.AvailableTests);
        }

        /// <summary>
        /// Get test information request.
        /// </summary>
        /// <param name="testId">Test ID.</param>
        /// <returns>Test details data.</returns>
        public static async Task<object> GetTest(int testId)
        {
            return await AppServicesController.Request($"{Links.GetTest}?id={testId}", AppDemoType.Test);
        }

        /// <summary>
        /// Fetch next question request.
        /// </summary>
        /// <param name="testId">Test ID.</param>
        /// <param name="questionNumber">Question number.</param>
        /// <param name="userId">User ID.</param>
        /// <returns>Test question data.</returns>
        public static async Task<object> GetNextQuestion(int testId, int questionNumber, int userId)
        {
            return await AppServicesController.Request(
                $"{Links.GetNextQuestion}?testId={testId}&questionNumber={questionNumber}&excludeCorrectnessIndicator=false&userId={userId}",
                AppDemoType.TestNextQuestion);
        }

        /// <summary>
        /// Answer question request.
        /// </summary>
        /// <param name="answer">Answer data.</param>
        /// <returns>String. <c>"Ok"</c>, for example.</returns>
        public static async Task<object> AnswerQuestionAndGetNext(TestAnswerPostModel answer)
        {
            var body = JsonController.ConvertObjectToJson(answer);
            return await AppServicesController.Request($"{Links.AnswerQuestionAndGetNext}", body, AppDemoType.TestAnswerAndGetNext);
        }

        /// <summary>
        /// Fetch test answers request.
        /// </summary>
        /// <param name="userId">User ID.</param>
        /// <param name="testId">Test ID.</param>
        /// <returns>List of results data.</returns>
        public static async Task<object> GetUserAnswers(int userId, int testId)
        {
            return await AppServicesController.Request(
                $"{Links.GetUserAnswers}?studentId={userId}&testId={testId}",
                AppDemoType.TestUserAnswers);
        }

        public static async Task<object> GetUserAnswers(int testId)
        {
            return await AppServicesController.Request(
                    $"{Links.GetResultTest}?testId={testId}",
                    AppDemoType.TestUserAnswersExtended);
        }
        

        /// <summary>
        /// Fetch Electronic Educational Methodological Complexes
        /// root concepts request.
        /// </summary>
        /// <param name="userId">User ID.</param>
        /// <param name="subjectId">Subject ID.</param>
        /// <returns>Root concept data.</returns>
        public static async Task<object> GetRootConcepts(string userId, string subjectId)
        {
            var body = new RootConceptsPostModel(userId, subjectId);
            var bodyString = JsonController.ConvertObjectToJson(body);
            return await AppServicesController.Request($"{Links.GetRootConcepts}", bodyString, AppDemoType.RootConcepts);
        }

        public static async Task<object> GetRootConcepts(string subjectId)
        {
            return await AppServicesController.Request(
                    $"{Links.GetRootConceptsTest}?subjectId={subjectId}",
                    AppDemoType.RootConcepts);
        }

        /// <summary>
        /// Fetch Electronic Educational Methodological Complexes
        /// concept tree request.
        /// </summary>
        /// <param name="elementId">Root element ID.</param>
        /// <returns>Concept data.</returns>
        public static async Task<object> GetConceptTree(int elementId)
        {
            return await AppServicesController.Request(
                $"{Links.GetConceptTree}?elementId={elementId}",
                AppDemoType.ConceptTree);
        }

        /// <summary>
        /// Fetch Electronic Educational Methodological Complexes
        /// concept cascade request.
        /// </summary>
        /// <param name="elementId">Root element ID.</param>
        /// <returns>Concept data.</returns>
        public static async Task<object> GetConceptCascade(int elementId)
        {
            return await AppServicesController.Request(
                $"{Links.GetConceptCascade}?parenttId={elementId}", AppDemoType.ConceptTreeTest);
        }


        /// <summary>
        /// Fetch files request.
        /// </summary>
        /// <param name="subjectId">Subject ID.</param>
        /// <returns>Files data.</returns>
        public static async Task<object> GetFiles(int subjectId)
        {
            if (Servers.Current == Servers.EduCatsBntuAddress)
                return await AppServicesController.Request($"{Links.GetFiles}?subjectId={subjectId}", AppDemoType.Files);
            else
                return await AppServicesController.Request($"{Links.GetFilesTest}?subjectId={subjectId}", AppDemoType.FilesTest);
        }

        /// <summary>
        /// Fetch recommendations (adaptive learning) request.
        /// </summary>
        /// <param name="subjectId">Subject ID.</param>
        /// <param name="userId">User ID.</param>
        /// <returns>List of recommendations data.</returns>
        public static async Task<object> GetRecommendations(int subjectId, int userId)
        {
            return await AppServicesController.Request(
                $"{Links.GetRecomendations}?subjectId={subjectId}&studentId={userId}", AppDemoType.Recommendations);
        }

        /// Fetch files details request.
        /// </summary>
        /// <param name="subjectId">Subject ID.</param>
        /// <returns>Files data.</returns>
        public static async Task<object> GetFilesDetails(string uri)
        {
            return await AppServicesController.Request($"{Links.GetFilesDetails}?values=[{uri}]&deleteValues=DELETE", AppDemoType.FilesDetailsTest);
        }

        public static async Task<object> GetGroupInfo(string groupName)
        {
            return await AppServicesController.Request(
                $"{Links.GetGroupInfo}{groupName}");
        }

        /// <summary>
        /// Get body for authorize request.
        /// </summary>
        /// <param name="username">Username.</param>
        /// <returns>Json user body.</returns>
        static string getUserLoginBody(string username)
        {
            var userLogin = new UserLoginModel {
                UserLogin = username
            };

            return JsonController.ConvertObjectToJson(userLogin);
        }
    }
}