(function () { "use strict"; angular.module('shared') .service('Authorization', ['SiteHelper', 'ShareInAccountInfo', '_', 'memberInfo', 'Products', 'classroomInfo', 'FeatureCheck', function AuthorizationService(SiteHelper, ShareInAccountInfo, _, memberInfo, Products, classroomInfo, FeatureCheck) { var service = this; var boundByPrivilege = {}; var multipleClassroomsEnabled = FeatureCheck.isFeatureEnabled('MULTIPLE_CLASSROOMS_MODEL'); service.isUnitedStatesSubscription = studentHasUnitedStatesTlc; service.UNITED_STATES_RK_CONTENT_PRIVILEGE = "UnitedStatesTlc"; service.HOMEROOM_PRIVILEGE = "homeroom"; init(); service.studentHasPrivilege = studentHasPrivilege; service.getStudentPrivilegeChecker = getStudentPrivilegeChecker; service.studentHasSubject = studentHasSubject; service.studentWithoutPrivilegeCheckerFactory = studentWithoutPrivilegeCheckerFactory; service.studentHasResourceLicense = studentHasResourceLicense; service.getLicenseTypeForResourceCollection = getLicenseTypeForResourceCollection; service.studentWithoutResourceLicenseCheckerFactory = studentWithoutResourceLicenseCheckerFactory; function studentHasUnitedStatesTlc(){ return !memberInfo.hasInternationalTlc; } function studentHasSitePrivilege(student, siteAbbrev) { var classrooms = student.is_shared ? getStudentsTeachersAccountInfo(student).activeClassrooms : classroomInfo.activeClassrooms; if (multipleClassroomsEnabled && classrooms && Object.keys(classrooms).length > 0) { return hasClassroomSitePrivilege(student, siteAbbrev, classrooms); } else { return !student.is_shared || getStudentsTeachersAccountInfo(student).subscriptions.hasOwnProperty(siteAbbrev); } } function hasClassroomSitePrivilege(student, siteAbbrev, classrooms) { var classroom = _.findWhere(classrooms, {classroom_id: student.classroom_id}); var site = student.is_shared ? siteAbbrev : SiteHelper.siteAbbrevSubscriptionsKeyMap[siteAbbrev]; return classroom.subscriptions.hasOwnProperty(site); } function studentHasPrivilege(student, privilege) { if (FeatureCheck.isFeatureEnabled("RAZ_PLUS_WELDING")) { var hasPrivilege = boundByPrivilege[privilege](student); if (!hasPrivilege && (privilege === "rp" || privilege === "rk")) { var otherPrivilege = privilege === "rp" ? "rk" : "rp"; return boundByPrivilege[otherPrivilege](student); } return hasPrivilege; } else { return boundByPrivilege[privilege](student); } } function studentHasSubject(student, subject) { var siteAbbrev = memberInfo.subjects[subject] && memberInfo.subjects[subject].site_abbrev; if (FeatureCheck.isFeatureEnabled("RAZ_PLUS_WELDING")) { if (siteAbbrev) { return studentHasPrivilege(student, siteAbbrev); } else if (siteAbbrev === "rk") { return studentHasPrivilege(student, "rp"); } else if (siteAbbrev === "rp") { return studentHasPrivilege(student, "rk"); } else { return false; } } else { if(!siteAbbrev){ return false; } return studentHasPrivilege(student, siteAbbrev); } } function init() { _.map({ "RazKids": SiteHelper.RK_SITE_ABBREVIATION, "Reading": SiteHelper.RAZ_SITE_ABBREVIATION, "RazPlus": SiteHelper.RAZ_PLUS_SUBSCRIPTION_SITE_ABBREVIATION, "Headsprout": SiteHelper.HEADSPROUT_SITE_ABBREVIATION, "Science": SiteHelper.SAZ_SITE_ABBREVIATION, "Writing": SiteHelper.WAZ_SITE_ABBREVIATION, "Vocabulary": SiteHelper.VAZ_SITE_ABBREVIATION, "ReadyTest": SiteHelper.TR_SITE_ABBREVIATION, "ELL": SiteHelper.RAZ_ELL_SITE_ABBREVIATION, "Connected Classroom": SiteHelper.RPCC_SITE_ABBREVIATION }, function (abbrev, fnName) { boundByPrivilege[abbrev] = service["studentHas" + fnName] = function (student) { return studentHasSitePrivilege(student, abbrev) } }); boundByPrivilege[service.HOMEROOM_PRIVILEGE] = function (student) { return !student.is_shared; }; boundByPrivilege[service.UNITED_STATES_RK_CONTENT_PRIVILEGE] = function (student) { return studentHasUnitedStatesTlc() && ( studentHasPrivilege(student, SiteHelper.RK_SITE_ABBREVIATION) || studentHasPrivilege(student, SiteHelper.RAZ_PLUS_SUBSCRIPTION_SITE_ABBREVIATION) ); }; } function getStudentsTeachersAccountInfo(student) { return ShareInAccountInfo[student.homeroom_member_id.toString()]; } function getStudentPrivilegeChecker(privilege) { return privilege === true ? function () { return true; } : boundByPrivilege[privilege]; } function studentWithoutPrivilegeCheckerFactory(privilege) { var reason = "Student has no access to " + Products.getProductNameBySite(privilege); return function studentWithoutPrivilegeReason(student) { if (!studentHasPrivilege(student, privilege)) { return reason; } } } function studentHasResourceLicense(student, license_type) { switch(license_type) { case 'basic': return studentHasSitePrivilege(student, SiteHelper.RK_SITE_ABBREVIATION); case 'solution': return FeatureCheck.isFeatureEnabled("RAZ_PLUS_WELDING") ? studentHasSitePrivilege(student, SiteHelper.RAZ_PLUS_SUBSCRIPTION_SITE_ABBREVIATION) : (studentHasSitePrivilege(student, SiteHelper.RK_SITE_ABBREVIATION) && studentHasSitePrivilege(student, SiteHelper.RAZ_SITE_ABBREVIATION)); case 'science': return studentHasSitePrivilege(student, SiteHelper.SAZ_SITE_ABBREVIATION); } } function getLicenseTypeForResourceCollection(resources) { if(_.chain(resources) .pluck('license_type') .contains('solution') .value()) { return 'solution'; } else if(_.chain(resources) .pluck('license_type') .contains('science') .value()) { return 'science'; } else { return 'basic'; } } function studentWithoutResourceLicenseCheckerFactory(license_type, resource_description) { return function studentWithoutResourceLicenseReason(student) { if (!studentHasResourceLicense(student, license_type)) { return 'Student does not have access to ' + resource_description; } } } }]); })();