Skip to content

Instantly share code, notes, and snippets.

@dvliman
Created October 2, 2014 15:16
Show Gist options
  • Save dvliman/6eb410b190c6a60fa1c3 to your computer and use it in GitHub Desktop.
Save dvliman/6eb410b190c6a60fa1c3 to your computer and use it in GitHub Desktop.
backernews.js
"use strict";
var ApplicationConfiguration = function() {
var applicationModuleName = "backer-news",
applicationModuleVendorDependencies = ["ngResource", "ngCookies", "ngAnimate", "ngTouch", "ngSanitize", "ui.router", "ui.bootstrap", "ui.utils"],
registerModule = function(moduleName, dependencies) {
angular.module(moduleName, dependencies || []), angular.module(applicationModuleName).requires.push(moduleName)
};
return {
applicationModuleName: applicationModuleName,
applicationModuleVendorDependencies: applicationModuleVendorDependencies,
registerModule: registerModule
}
}();
angular.module(ApplicationConfiguration.applicationModuleName, ApplicationConfiguration.applicationModuleVendorDependencies), angular.module(ApplicationConfiguration.applicationModuleName).config(["$locationProvider", function($locationProvider) {
$locationProvider.hashPrefix("!")
}]), angular.element(document).ready(function() {
"#_=_" === window.location.hash && (window.location.hash = "#!"), angular.bootstrap(document, [ApplicationConfiguration.applicationModuleName])
}), ApplicationConfiguration.registerModule("articles"), ApplicationConfiguration.registerModule("core"), ApplicationConfiguration.registerModule("users"), angular.module("articles").run(["Menus", function(Menus) {
Menus.addMenuItem("topbar", "Add a project", "articles/create", "articles/create")
}]), angular.module("articles").config(["$stateProvider", function($stateProvider) {
$stateProvider.state("listArticles", {
url: "/",
templateUrl: "modules/articles/views/list-articles.client.view.html"
}).state("createArticle", {
url: "/articles/create",
templateUrl: "modules/articles/views/create-article.client.view.html"
}).state("viewArticle", {
url: "/articles/:articleId",
templateUrl: "modules/articles/views/view-article.client.view.html"
}).state("editArticle", {
url: "/articles/:articleId/edit",
templateUrl: "modules/articles/views/edit-article.client.view.html"
})
}]), angular.module("articles").controller("ArticlesController", ["$scope", "$window", "$http", "$stateParams", "$location", "Authentication", "Articles", function($scope, $window, $http, $stateParams, $location, Authentication, Articles) {
$scope.authentication = Authentication, $scope.contentLoaded = !1, $scope.initFunc = function() {
$scope.tab0Class = "active", $scope.articleFilter = "live", console.log($scope.tab), $scope.find()
}, $scope.myPagingFunction = function() {}, $scope.loader = {
loading: !1
}, $scope.create = function() {
var article = new Articles({
url: this.url
});
article.$save(function(response) {
$location.path("articles/" + response._id), $scope.url = ""
}, function(errorResponse) {
$scope.error = errorResponse.data.message, $scope.loader.loading = !1
})
}, $scope.testUrl = function() {
function scrapeIt() {
$http.post("/scrape", article).success(function() {
$scope.find(), $location.path("/")
}).error(function(data) {
$scope.error = data.message, $scope.url = "", $scope.loader.loading = !1
})
}
$scope.loader.loading = !0;
var theUrl = this.url.split("?")[0],
article = new Articles({
url: theUrl
});
theUrl.indexOf("kickstarter") > -1 ? (console.log("KS !"), scrapeIt()) : theUrl.indexOf("indiegogo") > -1 ? (console.log("indiegogo !"), scrapeIt()) : ($scope.error = "Please enter a Kickstarter or Indiegogo project", $scope.loader.loading = !1), console.log(article)
}, $scope.goToArticle = function(article) {
$location.path("/articles/" + article._id)
}, $scope.voteArticle = function(article) {
$http.post("/vote/" + article._id).success(function(data) {
article.voteTotal = data.voteTotal
}).error(function() {})
}, $scope.remove = function(article) {
if (article) {
article.$remove();
for (var i in $scope.articles) $scope.articles[i] === article && $scope.articles.splice(i, 1)
} else $scope.article.$remove(function() {
$location.path("articles")
})
}, $scope.update = function() {
var article = $scope.article;
article.$update(function() {
$location.path("articles/" + article._id)
}, function(errorResponse) {
$scope.error = errorResponse.data.message
})
}, $scope.showMore = !1, $scope.filter = {
end: {
$gte: Date.now()
}
}, $scope.tabChanged = function(arg) {
$scope.tab0Class = "inactive", $scope.tab1Class = "inactive", $scope.tab2Class = "inactive", $scope.articleFilter = arg, $scope.articles = [], "live" === arg ? $scope.tab0Class = "active" : "recent" === arg ? $scope.tab1Class = "active" : "all" === arg && ($scope.tab2Class = "active"), $scope.find()
}, $scope.find = function() {
var skipNum = 0,
options = {
limit: 10,
skip: 0,
articleFilter: $scope.articleFilter
};
if ("undefined" != typeof $scope.articles) {
skipNum = $scope.articles.length, options.skip = skipNum;
var newArticles = Articles.query(options, function(data) {
console.log("success"), console.log(data), $scope.showMore = data.length < options.limit ? !1 : !0;
for (var i = 0; i < newArticles.length; i++) $scope.articles.push(newArticles[i]);
console.log($scope.articles)
})
} else $scope.articles = Articles.query(options, function(data) {
$scope.showMore = data.length < options.limit ? !1 : !0
})
}, $scope.fbShare = function() {
FB.ui({
method: "share",
href: "http://backernews.com/articles/" + $scope.article._id
}, function(response) {
response && !response.error_code || console.log("Error while posting.")
})
}, $scope.findOne = function() {
$scope.article = Articles.get({
articleId: $stateParams.articleId
}, function(data) {
$scope.shareUrl = "http://backernews.com/#!/articles/" + data._id, $scope.shareUrlEsc = escape("http://backernews.com/#!/articles/" + data._id), $scope.twPost = escape(data.shortUrl.length > 0 ? "Check this #crowdfunding project on @backer_news " + data.shortUrl : "Check this #crowdfunding project on @backer_news http://backernews.com/#!/articles/" + data._id), $scope.imgUrlEsc = escape(data.image), $scope.contentLoaded = !0, $window.document.getElementById("FBDescr").setAttribute("content", data.title), $window.document.getElementById("FBUrl").setAttribute("content", $scope.shareUrl), $window.document.getElementById("FBImg").setAttribute("content", data.image), console.log(data)
})
}
}]), angular.module("articles").directive("disqus", ["$window", function($window) {
return console.log("disqus dir"), {
restrict: "E",
scope: {
disqus_shortname: "@disqusShortname",
disqus_identifier: "@disqusIdentifier",
disqus_title: "@disqusTitle",
disqus_url: "@disqusUrl",
disqus_category_id: "@disqusCategoryId",
disqus_disable_mobile: "@disqusDisableMobile",
readyToBind: "@"
},
template: '<div id="disqus_thread"></div><a href="http://disqus.com" class="dsq-brlink">comments powered by <span class="logo-disqus">Disqus</span></a>',
link: function(scope) {
if ("undefined" == typeof scope.disqus_identifier || "undefined" == typeof scope.disqus_url) throw "Please ensure that the `disqus-identifier` and `disqus-url` attributes are both set.";
scope.$watch("readyToBind", function(isReady) {
if (angular.isDefined(isReady) || (isReady = "true"), scope.$eval(isReady))
if ($window.disqus_shortname = scope.disqus_shortname, $window.disqus_identifier = scope.disqus_identifier, $window.disqus_title = scope.disqus_title, $window.disqus_url = scope.disqus_url, $window.disqus_category_id = scope.disqus_category_id, $window.disqus_disable_mobile = scope.disqus_disable_mobile, $window.DISQUS) $window.DISQUS.reset({
reload: !0,
config: function() {
this.page.identifier = scope.disqus_identifier, this.page.url = scope.disqus_url, this.page.title = scope.disqus_title
}
});
else {
var dsq = document.createElement("script");
dsq.type = "text/javascript", dsq.async = !0, dsq.src = "//" + scope.disqus_shortname + ".disqus.com/embed.js", (document.getElementsByTagName("head")[0] || document.getElementsByTagName("body")[0]).appendChild(dsq)
}
})
}
}
}]), angular.module("articles").factory("Articles", ["$resource", function($resource) {
return $resource("articles/:articleId", {
articleId: "@_id"
}, {
update: {
method: "PUT"
}
})
}]), angular.module("core").config(["$stateProvider", "$urlRouterProvider", function($stateProvider, $urlRouterProvider) {
$urlRouterProvider.otherwise("/"), $stateProvider.state("home", {
url: "/",
templateUrl: "modules/core/views/home.client.view.html"
})
}]), angular.module("core").controller("HeaderController", ["$scope", "Authentication", "Menus", function($scope, Authentication, Menus) {
$scope.authentication = Authentication, $scope.isCollapsed = !1, $scope.menu = Menus.getMenu("topbar"), $scope.toggleCollapsibleMenu = function() {
$scope.isCollapsed = !$scope.isCollapsed
}, $scope.$on("$stateChangeSuccess", function() {
$scope.isCollapsed = !1
})
}]), angular.module("core").controller("HomeController", ["$scope", "Authentication", function($scope, Authentication) {
$scope.authentication = Authentication
}]), angular.module("core").service("Menus", [function() {
this.defaultRoles = ["*"], this.menus = {};
var shouldRender = function(user) {
if (!user) return this.isPublic;
if (~this.roles.indexOf("*")) return !0;
for (var userRoleIndex in user.roles)
for (var roleIndex in this.roles)
if (this.roles[roleIndex] === user.roles[userRoleIndex]) return !0;
return !1
};
this.validateMenuExistance = function(menuId) {
if (menuId && menuId.length) {
if (this.menus[menuId]) return !0;
throw new Error("Menu does not exists")
}
throw new Error("MenuId was not provided")
}, this.getMenu = function(menuId) {
return this.validateMenuExistance(menuId), this.menus[menuId]
}, this.addMenu = function(menuId, isPublic, roles) {
return this.menus[menuId] = {
isPublic: isPublic || !1,
roles: roles || this.defaultRoles,
items: [],
shouldRender: shouldRender
}, this.menus[menuId]
}, this.removeMenu = function(menuId) {
this.validateMenuExistance(menuId), delete this.menus[menuId]
}, this.addMenuItem = function(menuId, menuItemTitle, menuItemURL, menuItemType, menuItemUIRoute, isPublic, roles, position) {
return this.validateMenuExistance(menuId), this.menus[menuId].items.push({
title: menuItemTitle,
link: menuItemURL,
menuItemType: menuItemType || "item",
menuItemClass: menuItemType,
uiRoute: menuItemUIRoute || "/" + menuItemURL,
isPublic: null === isPublic || "undefined" == typeof isPublic ? this.menus[menuId].isPublic : isPublic,
roles: null === roles || "undefined" == typeof roles ? this.menus[menuId].roles : roles,
position: position || 0,
items: [],
shouldRender: shouldRender
}), this.menus[menuId]
}, this.addSubMenuItem = function(menuId, rootMenuItemURL, menuItemTitle, menuItemURL, menuItemUIRoute, isPublic, roles, position) {
this.validateMenuExistance(menuId);
for (var itemIndex in this.menus[menuId].items) this.menus[menuId].items[itemIndex].link === rootMenuItemURL && this.menus[menuId].items[itemIndex].items.push({
title: menuItemTitle,
link: menuItemURL,
uiRoute: menuItemUIRoute || "/" + menuItemURL,
isPublic: null === isPublic || "undefined" == typeof isPublic ? this.menus[menuId].items[itemIndex].isPublic : isPublic,
roles: null === roles || "undefined" == typeof roles ? this.menus[menuId].items[itemIndex].roles : roles,
position: position || 0,
shouldRender: shouldRender
});
return this.menus[menuId]
}, this.removeMenuItem = function(menuId, menuItemURL) {
this.validateMenuExistance(menuId);
for (var itemIndex in this.menus[menuId].items) this.menus[menuId].items[itemIndex].link === menuItemURL && this.menus[menuId].items.splice(itemIndex, 1);
return this.menus[menuId]
}, this.removeSubMenuItem = function(menuId, submenuItemURL) {
this.validateMenuExistance(menuId);
for (var itemIndex in this.menus[menuId].items)
for (var subitemIndex in this.menus[menuId].items[itemIndex].items) this.menus[menuId].items[itemIndex].items[subitemIndex].link === submenuItemURL && this.menus[menuId].items[itemIndex].items.splice(subitemIndex, 1);
return this.menus[menuId]
}, this.addMenu("topbar")
}]), angular.module("users").config(["$httpProvider", function($httpProvider) {
$httpProvider.interceptors.push(["$q", "$location", "Authentication", function($q, $location, Authentication) {
return {
responseError: function(rejection) {
switch (rejection.status) {
case 401:
Authentication.user = null, $location.path("signin");
break;
case 403:
}
return $q.reject(rejection)
}
}
}])
}]), angular.module("users").config(["$stateProvider", function($stateProvider) {
$stateProvider.state("profile", {
url: "/settings/profile",
templateUrl: "modules/users/views/settings/edit-profile.client.view.html"
}).state("password", {
url: "/settings/password",
templateUrl: "modules/users/views/settings/change-password.client.view.html"
}).state("accounts", {
url: "/settings/accounts",
templateUrl: "modules/users/views/settings/social-accounts.client.view.html"
}).state("signup", {
url: "/signup",
templateUrl: "modules/users/views/authentication/signup.client.view.html"
}).state("signin", {
url: "/signin",
templateUrl: "modules/users/views/authentication/signin.client.view.html"
}).state("forgot", {
url: "/password/forgot",
templateUrl: "modules/users/views/password/forgot-password.client.view.html"
}).state("reset-invlaid", {
url: "/password/reset/invalid",
templateUrl: "modules/users/views/password/reset-password-invalid.client.view.html"
}).state("reset-success", {
url: "/password/reset/success",
templateUrl: "modules/users/views/password/reset-password-success.client.view.html"
}).state("reset", {
url: "/password/reset/:token",
templateUrl: "modules/users/views/password/reset-password.client.view.html"
})
}]), angular.module("users").controller("AuthenticationController", ["$scope", "$http", "$location", "Authentication", function($scope, $http, $location, Authentication) {
$scope.authentication = Authentication, $scope.authentication.user && $location.path("/"), $scope.signup = function() {
$http.post("/auth/signup", $scope.credentials).success(function(response) {
$scope.authentication.user = response, $location.path("/")
}).error(function(response) {
$scope.error = response.message
})
}, $scope.signin = function() {
$http.post("/auth/signin", $scope.credentials).success(function(response) {
$scope.authentication.user = response, $location.path("/")
}).error(function(response) {
$scope.error = response.message
})
}
}]), angular.module("users").controller("PasswordController", ["$scope", "$stateParams", "$http", "$location", "Authentication", function($scope, $stateParams, $http, $location, Authentication) {
$scope.authentication = Authentication, $scope.authentication.user && $location.path("/"), $scope.askForPasswordReset = function() {
$scope.success = $scope.error = null, $http.post("/auth/forgot", $scope.credentials).success(function(response) {
$scope.credentials = null, $scope.success = response.message
}).error(function(response) {
$scope.credentials = null, $scope.error = response.message
})
}, $scope.resetUserPassword = function() {
$scope.success = $scope.error = null, $http.post("/auth/reset/" + $stateParams.token, $scope.passwordDetails).success(function(response) {
$scope.passwordDetails = null, Authentication.user = response, $location.path("/password/reset/success")
}).error(function(response) {
$scope.error = response.message
})
}
}]), angular.module("users").controller("SettingsController", ["$scope", "$http", "$location", "Users", "Authentication", function($scope, $http, $location, Users, Authentication) {
$scope.user = Authentication.user, $scope.user || $location.path("/"), $scope.hasConnectedAdditionalSocialAccounts = function() {
for (var i in $scope.user.additionalProvidersData) return !0;
return !1
}, $scope.isConnectedSocialAccount = function(provider) {
return $scope.user.provider === provider || $scope.user.additionalProvidersData && $scope.user.additionalProvidersData[provider]
}, $scope.removeUserSocialAccount = function(provider) {
$scope.success = $scope.error = null, $http.delete("/users/accounts", {
params: {
provider: provider
}
}).success(function(response) {
$scope.success = !0, $scope.user = Authentication.user = response
}).error(function(response) {
$scope.error = response.message
})
}, $scope.updateUserProfile = function(isValid) {
if (isValid) {
$scope.success = $scope.error = null;
var user = new Users($scope.user);
user.$update(function(response) {
$scope.success = !0, Authentication.user = response
}, function(response) {
$scope.error = response.data.message
})
} else $scope.submitted = !0
}, $scope.changeUserPassword = function() {
$scope.success = $scope.error = null, $http.post("/users/password", $scope.passwordDetails).success(function() {
$scope.success = !0, $scope.passwordDetails = null
}).error(function(response) {
$scope.error = response.message
})
}
}]), angular.module("users").factory("Authentication", [function() {
var _this = this;
return _this._data = {
user: window.user
}, _this._data
}]), angular.module("users").factory("Users", ["$resource", function($resource) {
return $resource("users", {}, {
update: {
method: "PUT"
}
})
}]);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment