├── .gitignore ├── .nuget ├── NuGet.Config ├── NuGet.exe └── NuGet.targets ├── AngularAzureDemo.sln ├── AngularAzureDemo.v12.suo ├── AngularAzureDemo ├── AngularAzureDemo.csproj ├── AngularAzureDemo.csproj.user ├── App_Start │ ├── BundleConfig.cs │ ├── FilterConfig.cs │ ├── RouteConfig.cs │ └── WebApiConfig.cs ├── Azure │ └── TableStorage │ │ ├── ImageBlobCommentEntity.cs │ │ ├── ImageBlobEntity.cs │ │ └── UserSubscriptionEntity.cs ├── Content │ ├── bootstrap-theme.css │ ├── bootstrap-theme.min.css │ ├── bootstrap.css │ ├── bootstrap.min.css │ ├── colorpicker.css │ ├── ng-grid.css │ ├── site.css │ └── toastr.min.css ├── Controllers │ ├── AccountController.cs │ ├── HomeController.cs │ ├── ImageBlobCommentController.cs │ ├── ImageBlobController.cs │ ├── UserController.cs │ └── UserSubscriptionController.cs ├── DomainServices │ ├── ImageBlobCommentRepository.cs │ ├── ImageBlobRepository.cs │ └── UserSubscriptionRepository.cs ├── Global.asax ├── Global.asax.cs ├── IOC │ ├── IUnityInstaller.cs │ ├── UnityContainerExtensions.cs │ ├── UnityResolver.cs │ └── WebApiInstaller.cs ├── Images │ ├── Azure.png │ ├── Bootstrap.png │ ├── Info.png │ ├── ajax-loader.gif │ ├── angular.png │ ├── asp.png │ ├── banners.png │ ├── bullet.png │ ├── draw.png │ ├── drawHover.png │ ├── heroAccent.png │ ├── orderedList0.png │ ├── orderedList1.png │ ├── orderedList2.png │ ├── orderedList3.png │ ├── orderedList4.png │ ├── orderedList5.png │ ├── orderedList6.png │ ├── orderedList7.png │ ├── orderedList8.png │ ├── orderedList9.png │ ├── subscriptions.png │ ├── subscriptionsHover.png │ ├── viewAll.png │ └── viewAllHover.png ├── Models │ ├── BlobStorageResult.cs │ ├── FullImageBlobComment.cs │ ├── FullImageBlobComments.cs │ ├── ImageBlob.cs │ ├── ImageBlobCloudModel.cs │ ├── ImageBlobComment.cs │ ├── ImageBlobCommentResult.cs │ ├── User.cs │ ├── UserSubscription.cs │ ├── UserSubscriptions.cs │ └── Users.cs ├── Properties │ └── AssemblyInfo.cs ├── README.txt ├── Scripts │ ├── _references.js │ ├── angular-animate.js │ ├── angular-animate.min.js │ ├── angular-animate.min.js.map │ ├── angular-cookies.js │ ├── angular-cookies.min.js │ ├── angular-cookies.min.js.map │ ├── angular-csp.css │ ├── angular-loader.js │ ├── angular-loader.min.js │ ├── angular-loader.min.js.map │ ├── angular-mocks.js │ ├── angular-ng-grid.js │ ├── angular-resource.js │ ├── angular-resource.min.js │ ├── angular-resource.min.js.map │ ├── angular-route.js │ ├── angular-route.min.js │ ├── angular-route.min.js.map │ ├── angular-sanitize.js │ ├── angular-sanitize.min.js │ ├── angular-sanitize.min.js.map │ ├── angular-scenario.js │ ├── angular-touch.js │ ├── angular-touch.min.js │ ├── angular-touch.min.js.map │ ├── angular.js │ ├── angular.min.js │ ├── angular.min.js.map │ ├── app │ │ ├── Controllers │ │ │ ├── create.js │ │ │ ├── login.js │ │ │ ├── realTimeNotifications.js │ │ │ ├── sketcheractions.js │ │ │ ├── subscription.js │ │ │ ├── viewSingleImage.js │ │ │ └── viewall.js │ │ ├── Directives │ │ │ ├── angularAzureDemoDirectives.js │ │ │ └── drawDirective.js │ │ ├── Factories │ │ │ ├── angularAzureDemoFactories.js │ │ │ ├── imageBlobCommentFactory.js │ │ │ ├── imageBlobFactory.js │ │ │ └── userSubscriptionFactory.js │ │ ├── Services │ │ │ ├── angularAzureDemoServices.js │ │ │ ├── dialogService.js │ │ │ ├── loginService.js │ │ │ └── userService.js │ │ ├── app.js │ │ └── modules │ │ │ └── bootstrap-colorpicker-module.js │ ├── bootstrap.js │ ├── bootstrap.min.js │ ├── errors.json │ ├── i18n │ │ ├── angular-locale_af-na.js │ │ ├── angular-locale_af-za.js │ │ ├── angular-locale_af.js │ │ ├── angular-locale_am-et.js │ │ ├── angular-locale_am.js │ │ ├── angular-locale_ar-001.js │ │ ├── angular-locale_ar-ae.js │ │ ├── angular-locale_ar-bh.js │ │ ├── angular-locale_ar-dz.js │ │ ├── angular-locale_ar-eg.js │ │ ├── angular-locale_ar-iq.js │ │ ├── angular-locale_ar-jo.js │ │ ├── angular-locale_ar-kw.js │ │ ├── angular-locale_ar-lb.js │ │ ├── angular-locale_ar-ly.js │ │ ├── angular-locale_ar-ma.js │ │ ├── angular-locale_ar-om.js │ │ ├── angular-locale_ar-qa.js │ │ ├── angular-locale_ar-sa.js │ │ ├── angular-locale_ar-sd.js │ │ ├── angular-locale_ar-sy.js │ │ ├── angular-locale_ar-tn.js │ │ ├── angular-locale_ar-ye.js │ │ ├── angular-locale_ar.js │ │ ├── angular-locale_bg-bg.js │ │ ├── angular-locale_bg.js │ │ ├── angular-locale_bn-bd.js │ │ ├── angular-locale_bn-in.js │ │ ├── angular-locale_bn.js │ │ ├── angular-locale_ca-ad.js │ │ ├── angular-locale_ca-es.js │ │ ├── angular-locale_ca.js │ │ ├── angular-locale_cs-cz.js │ │ ├── angular-locale_cs.js │ │ ├── angular-locale_da-dk.js │ │ ├── angular-locale_da.js │ │ ├── angular-locale_de-at.js │ │ ├── angular-locale_de-be.js │ │ ├── angular-locale_de-ch.js │ │ ├── angular-locale_de-de.js │ │ ├── angular-locale_de-li.js │ │ ├── angular-locale_de-lu.js │ │ ├── angular-locale_de.js │ │ ├── angular-locale_el-cy.js │ │ ├── angular-locale_el-gr.js │ │ ├── angular-locale_el.js │ │ ├── angular-locale_en-as.js │ │ ├── angular-locale_en-au.js │ │ ├── angular-locale_en-bb.js │ │ ├── angular-locale_en-be.js │ │ ├── angular-locale_en-bm.js │ │ ├── angular-locale_en-bw.js │ │ ├── angular-locale_en-bz.js │ │ ├── angular-locale_en-ca.js │ │ ├── angular-locale_en-dsrt-us.js │ │ ├── angular-locale_en-dsrt.js │ │ ├── angular-locale_en-fm.js │ │ ├── angular-locale_en-gb.js │ │ ├── angular-locale_en-gu.js │ │ ├── angular-locale_en-gy.js │ │ ├── angular-locale_en-hk.js │ │ ├── angular-locale_en-ie.js │ │ ├── angular-locale_en-in.js │ │ ├── angular-locale_en-iso.js │ │ ├── angular-locale_en-jm.js │ │ ├── angular-locale_en-mh.js │ │ ├── angular-locale_en-mp.js │ │ ├── angular-locale_en-mt.js │ │ ├── angular-locale_en-mu.js │ │ ├── angular-locale_en-na.js │ │ ├── angular-locale_en-nz.js │ │ ├── angular-locale_en-ph.js │ │ ├── angular-locale_en-pk.js │ │ ├── angular-locale_en-pr.js │ │ ├── angular-locale_en-pw.js │ │ ├── angular-locale_en-sg.js │ │ ├── angular-locale_en-tc.js │ │ ├── angular-locale_en-tt.js │ │ ├── angular-locale_en-um.js │ │ ├── angular-locale_en-us.js │ │ ├── angular-locale_en-vg.js │ │ ├── angular-locale_en-vi.js │ │ ├── angular-locale_en-za.js │ │ ├── angular-locale_en-zw.js │ │ ├── angular-locale_en.js │ │ ├── angular-locale_es-419.js │ │ ├── angular-locale_es-ar.js │ │ ├── angular-locale_es-bo.js │ │ ├── angular-locale_es-cl.js │ │ ├── angular-locale_es-co.js │ │ ├── angular-locale_es-cr.js │ │ ├── angular-locale_es-do.js │ │ ├── angular-locale_es-ea.js │ │ ├── angular-locale_es-ec.js │ │ ├── angular-locale_es-es.js │ │ ├── angular-locale_es-gq.js │ │ ├── angular-locale_es-gt.js │ │ ├── angular-locale_es-hn.js │ │ ├── angular-locale_es-ic.js │ │ ├── angular-locale_es-mx.js │ │ ├── angular-locale_es-ni.js │ │ ├── angular-locale_es-pa.js │ │ ├── angular-locale_es-pe.js │ │ ├── angular-locale_es-pr.js │ │ ├── angular-locale_es-py.js │ │ ├── angular-locale_es-sv.js │ │ ├── angular-locale_es-us.js │ │ ├── angular-locale_es-uy.js │ │ ├── angular-locale_es-ve.js │ │ ├── angular-locale_es.js │ │ ├── angular-locale_et-ee.js │ │ ├── angular-locale_et.js │ │ ├── angular-locale_eu-es.js │ │ ├── angular-locale_eu.js │ │ ├── angular-locale_fa-af.js │ │ ├── angular-locale_fa-ir.js │ │ ├── angular-locale_fa.js │ │ ├── angular-locale_fi-fi.js │ │ ├── angular-locale_fi.js │ │ ├── angular-locale_fil-ph.js │ │ ├── angular-locale_fil.js │ │ ├── angular-locale_fr-be.js │ │ ├── angular-locale_fr-bf.js │ │ ├── angular-locale_fr-bi.js │ │ ├── angular-locale_fr-bj.js │ │ ├── angular-locale_fr-bl.js │ │ ├── angular-locale_fr-ca.js │ │ ├── angular-locale_fr-cd.js │ │ ├── angular-locale_fr-cf.js │ │ ├── angular-locale_fr-cg.js │ │ ├── angular-locale_fr-ch.js │ │ ├── angular-locale_fr-ci.js │ │ ├── angular-locale_fr-cm.js │ │ ├── angular-locale_fr-dj.js │ │ ├── angular-locale_fr-fr.js │ │ ├── angular-locale_fr-ga.js │ │ ├── angular-locale_fr-gf.js │ │ ├── angular-locale_fr-gn.js │ │ ├── angular-locale_fr-gp.js │ │ ├── angular-locale_fr-gq.js │ │ ├── angular-locale_fr-km.js │ │ ├── angular-locale_fr-lu.js │ │ ├── angular-locale_fr-mc.js │ │ ├── angular-locale_fr-mf.js │ │ ├── angular-locale_fr-mg.js │ │ ├── angular-locale_fr-ml.js │ │ ├── angular-locale_fr-mq.js │ │ ├── angular-locale_fr-ne.js │ │ ├── angular-locale_fr-re.js │ │ ├── angular-locale_fr-rw.js │ │ ├── angular-locale_fr-sn.js │ │ ├── angular-locale_fr-td.js │ │ ├── angular-locale_fr-tg.js │ │ ├── angular-locale_fr-yt.js │ │ ├── angular-locale_fr.js │ │ ├── angular-locale_gl-es.js │ │ ├── angular-locale_gl.js │ │ ├── angular-locale_gsw-ch.js │ │ ├── angular-locale_gsw.js │ │ ├── angular-locale_gu-in.js │ │ ├── angular-locale_gu.js │ │ ├── angular-locale_he-il.js │ │ ├── angular-locale_he.js │ │ ├── angular-locale_hi-in.js │ │ ├── angular-locale_hi.js │ │ ├── angular-locale_hr-hr.js │ │ ├── angular-locale_hr.js │ │ ├── angular-locale_hu-hu.js │ │ ├── angular-locale_hu.js │ │ ├── angular-locale_id-id.js │ │ ├── angular-locale_id.js │ │ ├── angular-locale_in.js │ │ ├── angular-locale_is-is.js │ │ ├── angular-locale_is.js │ │ ├── angular-locale_it-ch.js │ │ ├── angular-locale_it-it.js │ │ ├── angular-locale_it-sm.js │ │ ├── angular-locale_it.js │ │ ├── angular-locale_iw.js │ │ ├── angular-locale_ja-jp.js │ │ ├── angular-locale_ja.js │ │ ├── angular-locale_kn-in.js │ │ ├── angular-locale_kn.js │ │ ├── angular-locale_ko-kr.js │ │ ├── angular-locale_ko.js │ │ ├── angular-locale_ln-cd.js │ │ ├── angular-locale_ln-cg.js │ │ ├── angular-locale_ln.js │ │ ├── angular-locale_lt-lt.js │ │ ├── angular-locale_lt.js │ │ ├── angular-locale_lv-lv.js │ │ ├── angular-locale_lv.js │ │ ├── angular-locale_ml-in.js │ │ ├── angular-locale_ml.js │ │ ├── angular-locale_mr-in.js │ │ ├── angular-locale_mr.js │ │ ├── angular-locale_ms-bn.js │ │ ├── angular-locale_ms-my.js │ │ ├── angular-locale_ms.js │ │ ├── angular-locale_mt-mt.js │ │ ├── angular-locale_mt.js │ │ ├── angular-locale_nl-aw.js │ │ ├── angular-locale_nl-be.js │ │ ├── angular-locale_nl-cw.js │ │ ├── angular-locale_nl-nl.js │ │ ├── angular-locale_nl-sx.js │ │ ├── angular-locale_nl.js │ │ ├── angular-locale_no.js │ │ ├── angular-locale_or-in.js │ │ ├── angular-locale_or.js │ │ ├── angular-locale_pl-pl.js │ │ ├── angular-locale_pl.js │ │ ├── angular-locale_pt-ao.js │ │ ├── angular-locale_pt-br.js │ │ ├── angular-locale_pt-gw.js │ │ ├── angular-locale_pt-mz.js │ │ ├── angular-locale_pt-pt.js │ │ ├── angular-locale_pt-st.js │ │ ├── angular-locale_pt.js │ │ ├── angular-locale_ro-md.js │ │ ├── angular-locale_ro-ro.js │ │ ├── angular-locale_ro.js │ │ ├── angular-locale_ru-md.js │ │ ├── angular-locale_ru-ru.js │ │ ├── angular-locale_ru-ua.js │ │ ├── angular-locale_ru.js │ │ ├── angular-locale_sk-sk.js │ │ ├── angular-locale_sk.js │ │ ├── angular-locale_sl-si.js │ │ ├── angular-locale_sl.js │ │ ├── angular-locale_sq-al.js │ │ ├── angular-locale_sq.js │ │ ├── angular-locale_sr-cyrl-ba.js │ │ ├── angular-locale_sr-cyrl-me.js │ │ ├── angular-locale_sr-cyrl-rs.js │ │ ├── angular-locale_sr-cyrl.js │ │ ├── angular-locale_sr-latn-ba.js │ │ ├── angular-locale_sr-latn-me.js │ │ ├── angular-locale_sr-latn-rs.js │ │ ├── angular-locale_sr-latn.js │ │ ├── angular-locale_sr.js │ │ ├── angular-locale_sv-fi.js │ │ ├── angular-locale_sv-se.js │ │ ├── angular-locale_sv.js │ │ ├── angular-locale_sw-ke.js │ │ ├── angular-locale_sw-tz.js │ │ ├── angular-locale_sw.js │ │ ├── angular-locale_ta-in.js │ │ ├── angular-locale_ta-lk.js │ │ ├── angular-locale_ta.js │ │ ├── angular-locale_te-in.js │ │ ├── angular-locale_te.js │ │ ├── angular-locale_th-th.js │ │ ├── angular-locale_th.js │ │ ├── angular-locale_tl.js │ │ ├── angular-locale_tr-tr.js │ │ ├── angular-locale_tr.js │ │ ├── angular-locale_uk-ua.js │ │ ├── angular-locale_uk.js │ │ ├── angular-locale_ur-in.js │ │ ├── angular-locale_ur-pk.js │ │ ├── angular-locale_ur.js │ │ ├── angular-locale_vi-vn.js │ │ ├── angular-locale_vi.js │ │ ├── angular-locale_zh-cn.js │ │ ├── angular-locale_zh-hans-cn.js │ │ ├── angular-locale_zh-hans-hk.js │ │ ├── angular-locale_zh-hans-mo.js │ │ ├── angular-locale_zh-hans-sg.js │ │ ├── angular-locale_zh-hans.js │ │ ├── angular-locale_zh-hant-hk.js │ │ ├── angular-locale_zh-hant-mo.js │ │ ├── angular-locale_zh-hant-tw.js │ │ ├── angular-locale_zh-hant.js │ │ ├── angular-locale_zh-hk.js │ │ ├── angular-locale_zh-tw.js │ │ ├── angular-locale_zh.js │ │ ├── angular-locale_zu-za.js │ │ └── angular-locale_zu.js │ ├── jquery-2.1.1.intellisense.js │ ├── jquery-2.1.1.js │ ├── jquery-2.1.1.min.js │ ├── jquery-2.1.1.min.map │ ├── jquery.signalR-2.1.1.js │ ├── jquery.signalR-2.1.1.min.js │ ├── jquery.unobtrusive-ajax.js │ ├── jquery.unobtrusive-ajax.min.js │ ├── modernizr-2.7.2.js │ ├── toastr.min.js │ ├── underscore-min.js │ ├── underscore-min.map │ ├── underscore.js │ └── version.json ├── SignalR │ ├── BlobHub.cs │ └── SignalRStartup.cs ├── Views │ ├── Account │ │ └── Login.cshtml │ ├── Home │ │ ├── Create.cshtml │ │ ├── Index.cshtml │ │ ├── SketcherActions.cshtml │ │ ├── Subscriptions.cshtml │ │ ├── ViewAll.cshtml │ │ └── ViewSingleImage.cshtml │ ├── Shared │ │ ├── Error.cshtml │ │ └── _Layout.cshtml │ ├── Web.config │ └── _ViewStart.cshtml ├── Web.Debug.config ├── Web.Release.config ├── Web.config ├── favicon.ico ├── fonts │ ├── glyphicons-halflings-regular.eot │ ├── glyphicons-halflings-regular.svg │ ├── glyphicons-halflings-regular.ttf │ └── glyphicons-halflings-regular.woff └── packages.config └── TODO.txt /.gitignore: -------------------------------------------------------------------------------- 1 | obj 2 | bin 3 | packages 4 | -------------------------------------------------------------------------------- /.nuget/NuGet.Config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /.nuget/NuGet.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sachabarber/AngularAzureDemo/df62c704256ea3511cc55a748f247432d5fe0c79/.nuget/NuGet.exe -------------------------------------------------------------------------------- /AngularAzureDemo.sln: -------------------------------------------------------------------------------- 1 |  2 | Microsoft Visual Studio Solution File, Format Version 12.00 3 | # Visual Studio 2013 4 | VisualStudioVersion = 12.0.30501.0 5 | MinimumVisualStudioVersion = 10.0.40219.1 6 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AngularAzureDemo", "AngularAzureDemo\AngularAzureDemo.csproj", "{9B8BF380-7F42-4F02-8107-2C03CA88527C}" 7 | EndProject 8 | Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{8B51ACE3-94DE-4ADE-911A-9AE6AB1641D5}" 9 | ProjectSection(SolutionItems) = preProject 10 | TODO.txt = TODO.txt 11 | EndProjectSection 12 | EndProject 13 | Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = ".nuget", ".nuget", "{6C1F6182-81BD-4372-B1B2-EA369493D239}" 14 | ProjectSection(SolutionItems) = preProject 15 | .nuget\NuGet.Config = .nuget\NuGet.Config 16 | .nuget\NuGet.exe = .nuget\NuGet.exe 17 | .nuget\NuGet.targets = .nuget\NuGet.targets 18 | EndProjectSection 19 | EndProject 20 | Global 21 | GlobalSection(SolutionConfigurationPlatforms) = preSolution 22 | Debug|Any CPU = Debug|Any CPU 23 | Release|Any CPU = Release|Any CPU 24 | EndGlobalSection 25 | GlobalSection(ProjectConfigurationPlatforms) = postSolution 26 | {9B8BF380-7F42-4F02-8107-2C03CA88527C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 27 | {9B8BF380-7F42-4F02-8107-2C03CA88527C}.Debug|Any CPU.Build.0 = Debug|Any CPU 28 | {9B8BF380-7F42-4F02-8107-2C03CA88527C}.Release|Any CPU.ActiveCfg = Release|Any CPU 29 | {9B8BF380-7F42-4F02-8107-2C03CA88527C}.Release|Any CPU.Build.0 = Release|Any CPU 30 | EndGlobalSection 31 | GlobalSection(SolutionProperties) = preSolution 32 | HideSolutionNode = FALSE 33 | EndGlobalSection 34 | EndGlobal 35 | -------------------------------------------------------------------------------- /AngularAzureDemo.v12.suo: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sachabarber/AngularAzureDemo/df62c704256ea3511cc55a748f247432d5fe0c79/AngularAzureDemo.v12.suo -------------------------------------------------------------------------------- /AngularAzureDemo/AngularAzureDemo.csproj.user: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | ShowAllFiles 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | CurrentPage 13 | True 14 | False 15 | False 16 | False 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | True 26 | True 27 | 28 | 29 | 30 | 31 | -------------------------------------------------------------------------------- /AngularAzureDemo/App_Start/FilterConfig.cs: -------------------------------------------------------------------------------- 1 | using System.Web; 2 | using System.Web.Mvc; 3 | 4 | namespace AngularAzureDemo 5 | { 6 | public class FilterConfig 7 | { 8 | public static void RegisterGlobalFilters(GlobalFilterCollection filters) 9 | { 10 | filters.Add(new HandleErrorAttribute()); 11 | } 12 | } 13 | } -------------------------------------------------------------------------------- /AngularAzureDemo/App_Start/RouteConfig.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Web; 5 | using System.Web.Mvc; 6 | using System.Web.Routing; 7 | 8 | namespace AngularAzureDemo 9 | { 10 | public class RouteConfig 11 | { 12 | public static void RegisterRoutes(RouteCollection routes) 13 | { 14 | routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 15 | 16 | routes.MapRoute( 17 | name: "Default", 18 | url: "{controller}/{action}/{id}", 19 | defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } 20 | ); 21 | } 22 | } 23 | } -------------------------------------------------------------------------------- /AngularAzureDemo/App_Start/WebApiConfig.cs: -------------------------------------------------------------------------------- 1 |  2 | using AngularAzureDemo.DomainServices; 3 | 4 | using Microsoft.Practices.Unity; 5 | 6 | using Newtonsoft.Json.Serialization; 7 | using System.Linq; 8 | using System.Net.Http.Formatting; 9 | using System.Web.Http; 10 | 11 | namespace AngularAzureDemo 12 | { 13 | public static class WebApiConfig 14 | { 15 | public static void Register(HttpConfiguration config) 16 | { 17 | 18 | config.Routes.MapHttpRoute( 19 | name: "DefaultApi", 20 | routeTemplate: "api/{controller}/{id}", 21 | defaults: new { id = RouteParameter.Optional } 22 | ); 23 | 24 | 25 | 26 | // Uncomment the following line of code to enable query support for actions with an IQueryable or IQueryable return type. 27 | // To avoid processing unexpected or malicious queries, use the validation settings on QueryableAttribute to validate incoming queries. 28 | // For more information, visit http://go.microsoft.com/fwlink/?LinkId=279712. 29 | //config.EnableQuerySupport(); 30 | } 31 | } 32 | } -------------------------------------------------------------------------------- /AngularAzureDemo/Azure/TableStorage/ImageBlobCommentEntity.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Web; 5 | 6 | using Microsoft.WindowsAzure.Storage.Table; 7 | 8 | namespace AngularAzureDemo.Azure.TableStorage 9 | { 10 | public class ImageBlobCommentEntity : TableEntity 11 | { 12 | public ImageBlobCommentEntity(int userId, string userName, Guid id, Guid associatedBlobId, string comment, string createdOn) 13 | { 14 | this.PartitionKey = userId.ToString(); 15 | this.RowKey = string.Format("{0:D19}", DateTime.MaxValue.Ticks - DateTime.UtcNow.Ticks); 16 | this.Comment = comment; 17 | this.Id = id; 18 | this.UserName = userName; 19 | this.AssociatedBlobId = associatedBlobId; 20 | this.CreatedOn = createdOn; 21 | } 22 | 23 | public ImageBlobCommentEntity() { } 24 | 25 | 26 | public string Comment { get; set; } 27 | public Guid Id { get; set; } 28 | public string UserName { get; set; } 29 | public Guid AssociatedBlobId { get; set; } 30 | public string CreatedOn { get; set; } 31 | 32 | } 33 | } -------------------------------------------------------------------------------- /AngularAzureDemo/Azure/TableStorage/ImageBlobEntity.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Web; 5 | 6 | using Microsoft.WindowsAzure.Storage.Table; 7 | 8 | namespace AngularAzureDemo.Azure.TableStorage 9 | { 10 | public class ImageBlobEntity : TableEntity 11 | { 12 | public ImageBlobEntity(int userId, string userName, Guid id, string blobUrl, string title, DateTime createdOn) 13 | { 14 | this.PartitionKey = userId.ToString(); 15 | this.RowKey = string.Format("{0:D19}", DateTime.MaxValue.Ticks - DateTime.UtcNow.Ticks); 16 | this.Title = title; 17 | this.Id = id; 18 | this.UserName = userName; 19 | this.BlobUrl = blobUrl; 20 | this.CreatedOn = createdOn; 21 | } 22 | 23 | public ImageBlobEntity() { } 24 | 25 | 26 | public string Title { get; set; } 27 | public Guid Id { get; set; } 28 | public string UserName { get; set; } 29 | public string BlobUrl { get; set; } 30 | public DateTime CreatedOn { get; set; } 31 | 32 | } 33 | } -------------------------------------------------------------------------------- /AngularAzureDemo/Azure/TableStorage/UserSubscriptionEntity.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Web; 5 | 6 | using Microsoft.WindowsAzure.Storage.Table; 7 | 8 | namespace AngularAzureDemo.Azure.TableStorage 9 | { 10 | public class UserSubscriptionEntity : TableEntity 11 | { 12 | public UserSubscriptionEntity(int userId, int friendId) 13 | { 14 | this.PartitionKey = userId.ToString(); 15 | this.RowKey = friendId.ToString(); 16 | } 17 | 18 | public UserSubscriptionEntity() { } 19 | } 20 | } -------------------------------------------------------------------------------- /AngularAzureDemo/Controllers/AccountController.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Web; 5 | using System.Web.Mvc; 6 | 7 | namespace AngularAzureDemo.Controllers 8 | { 9 | public class AccountController : Controller 10 | { 11 | public ActionResult Login() 12 | { 13 | return View(); 14 | } 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /AngularAzureDemo/Controllers/HomeController.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Web; 5 | using System.Web.Mvc; 6 | 7 | namespace AngularAzureDemo.Controllers 8 | { 9 | public class HomeController : Controller 10 | { 11 | public ActionResult Index() 12 | { 13 | return View(); 14 | } 15 | 16 | public ActionResult Subscriptions() 17 | { 18 | return View(); 19 | } 20 | 21 | public ActionResult SketcherActions() 22 | { 23 | return View(); 24 | } 25 | 26 | public ActionResult Create() 27 | { 28 | return View(); 29 | } 30 | 31 | public ActionResult ViewAll() 32 | { 33 | return View(); 34 | } 35 | 36 | public ActionResult ViewSingleImage() 37 | { 38 | return View(); 39 | } 40 | 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /AngularAzureDemo/Controllers/ImageBlobController.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Threading.Tasks; 5 | using System.Web.Http; 6 | using System.Web.Mvc; 7 | 8 | using AngularAzureDemo.DomainServices; 9 | using AngularAzureDemo.Models; 10 | using AngularAzureDemo.SignalR; 11 | using Microsoft.AspNet.SignalR; 12 | 13 | 14 | namespace AngularAzureDemo.Controllers 15 | { 16 | /// 17 | /// API controller to store user images and their metadata 18 | /// 19 | public class ImageBlobController : ApiController 20 | { 21 | private readonly IImageBlobRepository imageBlobRepository; 22 | 23 | public ImageBlobController(IImageBlobRepository imageBlobRepository) 24 | { 25 | this.imageBlobRepository = imageBlobRepository; 26 | } 27 | 28 | // POST api/imageblob/.... 29 | [System.Web.Http.HttpPost] 30 | public async Task Post(ImageBlob imageBlob) 31 | { 32 | if (imageBlob == null || imageBlob.CanvasData == null) 33 | return false; 34 | 35 | // add the blob to blob storage/table storage 36 | var storedImageBlob = await imageBlobRepository.AddBlob(imageBlob); 37 | if (storedImageBlob != null) 38 | { 39 | BlobHub.SendFromWebApi(storedImageBlob); 40 | } 41 | return false; 42 | } 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /AngularAzureDemo/Controllers/UserController.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | using System.Linq; 3 | using System.Web.Http; 4 | using AngularAzureDemo.Models; 5 | 6 | namespace AngularAzureDemo.Controllers 7 | { 8 | /// 9 | /// API controller to manage users 10 | /// 11 | public class UserController : ApiController 12 | { 13 | private readonly Users users; 14 | 15 | public UserController() 16 | { 17 | users = new Users(); 18 | } 19 | 20 | // GET api/user 21 | public IEnumerable Get() 22 | { 23 | // Return a static list of people 24 | return users; 25 | } 26 | 27 | // GET api/user/5 28 | [System.Web.Http.HttpGet] 29 | public IEnumerable Get(int id) 30 | { 31 | //return static list of people which do not include the current person 32 | return users.Where(x => x.Id != id); 33 | } 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /AngularAzureDemo/Global.asax: -------------------------------------------------------------------------------- 1 | <%@ Application Codebehind="Global.asax.cs" Inherits="AngularAzureDemo.MvcApplication" Language="C#" %> 2 | -------------------------------------------------------------------------------- /AngularAzureDemo/Global.asax.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Web; 5 | using System.Web.Http; 6 | using System.Web.Mvc; 7 | using System.Web.Optimization; 8 | using System.Web.Routing; 9 | 10 | using AngularAzureDemo.DomainServices; 11 | using AngularAzureDemo.IOC; 12 | 13 | using Microsoft.Practices.Unity; 14 | 15 | namespace AngularAzureDemo 16 | { 17 | // Note: For instructions on enabling IIS6 or IIS7 classic mode, 18 | // visit http://go.microsoft.com/?LinkId=9394801 19 | 20 | public class MvcApplication : System.Web.HttpApplication 21 | { 22 | protected void Application_Start() 23 | { 24 | AreaRegistration.RegisterAllAreas(); 25 | 26 | WebApiConfig.Register(GlobalConfiguration.Configuration); 27 | FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); 28 | RouteConfig.RegisterRoutes(RouteTable.Routes); 29 | BundleConfig.RegisterBundles(BundleTable.Bundles); 30 | 31 | //IOC 32 | var container = new UnityContainer(); 33 | container.Install(new WebApiInstaller()); 34 | 35 | 36 | //set IOC resolver 37 | GlobalConfiguration.Configuration.DependencyResolver = new UnityResolver(container); 38 | } 39 | } 40 | } -------------------------------------------------------------------------------- /AngularAzureDemo/IOC/IUnityInstaller.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Web; 5 | 6 | using Microsoft.Practices.Unity; 7 | 8 | namespace AngularAzureDemo.IOC 9 | { 10 | public interface IUnityInstaller 11 | { 12 | void Install(IUnityContainer container); 13 | } 14 | } -------------------------------------------------------------------------------- /AngularAzureDemo/IOC/UnityContainerExtensions.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Web; 5 | 6 | using AngularAzureDemo.DomainServices; 7 | 8 | using Microsoft.Practices.Unity; 9 | 10 | namespace AngularAzureDemo.IOC 11 | { 12 | public static class UnityContainerExtensions 13 | { 14 | public static void Install(this IUnityContainer container, IUnityInstaller installer) 15 | { 16 | installer.Install(container); 17 | } 18 | } 19 | } -------------------------------------------------------------------------------- /AngularAzureDemo/IOC/UnityResolver.cs: -------------------------------------------------------------------------------- 1 | using Microsoft.Practices.Unity; 2 | using System; 3 | using System.Collections.Generic; 4 | using System.Web.Http.Dependencies; 5 | 6 | public class UnityResolver : IDependencyResolver 7 | { 8 | protected IUnityContainer container; 9 | 10 | public UnityResolver(IUnityContainer container) 11 | { 12 | if (container == null) 13 | { 14 | throw new ArgumentNullException("container"); 15 | } 16 | this.container = container; 17 | } 18 | 19 | public object GetService(Type serviceType) 20 | { 21 | try 22 | { 23 | return container.Resolve(serviceType); 24 | } 25 | catch (ResolutionFailedException) 26 | { 27 | return null; 28 | } 29 | } 30 | 31 | public IEnumerable GetServices(Type serviceType) 32 | { 33 | try 34 | { 35 | return container.ResolveAll(serviceType); 36 | } 37 | catch (ResolutionFailedException) 38 | { 39 | return new List(); 40 | } 41 | } 42 | 43 | public IDependencyScope BeginScope() 44 | { 45 | var child = container.CreateChildContainer(); 46 | return new UnityResolver(child); 47 | } 48 | 49 | public void Dispose() 50 | { 51 | container.Dispose(); 52 | } 53 | } -------------------------------------------------------------------------------- /AngularAzureDemo/IOC/WebApiInstaller.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Web; 5 | 6 | using AngularAzureDemo.DomainServices; 7 | 8 | using Microsoft.Practices.Unity; 9 | 10 | namespace AngularAzureDemo.IOC 11 | { 12 | public class WebApiInstaller : IUnityInstaller 13 | { 14 | public void Install(IUnityContainer container) 15 | { 16 | container.RegisterType( 17 | new HierarchicalLifetimeManager()); 18 | container.RegisterType( 19 | new HierarchicalLifetimeManager()); 20 | container.RegisterType( 21 | new HierarchicalLifetimeManager()); 22 | } 23 | } 24 | } -------------------------------------------------------------------------------- /AngularAzureDemo/Images/Azure.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sachabarber/AngularAzureDemo/df62c704256ea3511cc55a748f247432d5fe0c79/AngularAzureDemo/Images/Azure.png -------------------------------------------------------------------------------- /AngularAzureDemo/Images/Bootstrap.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sachabarber/AngularAzureDemo/df62c704256ea3511cc55a748f247432d5fe0c79/AngularAzureDemo/Images/Bootstrap.png -------------------------------------------------------------------------------- /AngularAzureDemo/Images/Info.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sachabarber/AngularAzureDemo/df62c704256ea3511cc55a748f247432d5fe0c79/AngularAzureDemo/Images/Info.png -------------------------------------------------------------------------------- /AngularAzureDemo/Images/ajax-loader.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sachabarber/AngularAzureDemo/df62c704256ea3511cc55a748f247432d5fe0c79/AngularAzureDemo/Images/ajax-loader.gif -------------------------------------------------------------------------------- /AngularAzureDemo/Images/angular.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sachabarber/AngularAzureDemo/df62c704256ea3511cc55a748f247432d5fe0c79/AngularAzureDemo/Images/angular.png -------------------------------------------------------------------------------- /AngularAzureDemo/Images/asp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sachabarber/AngularAzureDemo/df62c704256ea3511cc55a748f247432d5fe0c79/AngularAzureDemo/Images/asp.png -------------------------------------------------------------------------------- /AngularAzureDemo/Images/banners.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sachabarber/AngularAzureDemo/df62c704256ea3511cc55a748f247432d5fe0c79/AngularAzureDemo/Images/banners.png -------------------------------------------------------------------------------- /AngularAzureDemo/Images/bullet.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sachabarber/AngularAzureDemo/df62c704256ea3511cc55a748f247432d5fe0c79/AngularAzureDemo/Images/bullet.png -------------------------------------------------------------------------------- /AngularAzureDemo/Images/draw.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sachabarber/AngularAzureDemo/df62c704256ea3511cc55a748f247432d5fe0c79/AngularAzureDemo/Images/draw.png -------------------------------------------------------------------------------- /AngularAzureDemo/Images/drawHover.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sachabarber/AngularAzureDemo/df62c704256ea3511cc55a748f247432d5fe0c79/AngularAzureDemo/Images/drawHover.png -------------------------------------------------------------------------------- /AngularAzureDemo/Images/heroAccent.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sachabarber/AngularAzureDemo/df62c704256ea3511cc55a748f247432d5fe0c79/AngularAzureDemo/Images/heroAccent.png -------------------------------------------------------------------------------- /AngularAzureDemo/Images/orderedList0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sachabarber/AngularAzureDemo/df62c704256ea3511cc55a748f247432d5fe0c79/AngularAzureDemo/Images/orderedList0.png -------------------------------------------------------------------------------- /AngularAzureDemo/Images/orderedList1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sachabarber/AngularAzureDemo/df62c704256ea3511cc55a748f247432d5fe0c79/AngularAzureDemo/Images/orderedList1.png -------------------------------------------------------------------------------- /AngularAzureDemo/Images/orderedList2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sachabarber/AngularAzureDemo/df62c704256ea3511cc55a748f247432d5fe0c79/AngularAzureDemo/Images/orderedList2.png -------------------------------------------------------------------------------- /AngularAzureDemo/Images/orderedList3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sachabarber/AngularAzureDemo/df62c704256ea3511cc55a748f247432d5fe0c79/AngularAzureDemo/Images/orderedList3.png -------------------------------------------------------------------------------- /AngularAzureDemo/Images/orderedList4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sachabarber/AngularAzureDemo/df62c704256ea3511cc55a748f247432d5fe0c79/AngularAzureDemo/Images/orderedList4.png -------------------------------------------------------------------------------- /AngularAzureDemo/Images/orderedList5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sachabarber/AngularAzureDemo/df62c704256ea3511cc55a748f247432d5fe0c79/AngularAzureDemo/Images/orderedList5.png -------------------------------------------------------------------------------- /AngularAzureDemo/Images/orderedList6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sachabarber/AngularAzureDemo/df62c704256ea3511cc55a748f247432d5fe0c79/AngularAzureDemo/Images/orderedList6.png -------------------------------------------------------------------------------- /AngularAzureDemo/Images/orderedList7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sachabarber/AngularAzureDemo/df62c704256ea3511cc55a748f247432d5fe0c79/AngularAzureDemo/Images/orderedList7.png -------------------------------------------------------------------------------- /AngularAzureDemo/Images/orderedList8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sachabarber/AngularAzureDemo/df62c704256ea3511cc55a748f247432d5fe0c79/AngularAzureDemo/Images/orderedList8.png -------------------------------------------------------------------------------- /AngularAzureDemo/Images/orderedList9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sachabarber/AngularAzureDemo/df62c704256ea3511cc55a748f247432d5fe0c79/AngularAzureDemo/Images/orderedList9.png -------------------------------------------------------------------------------- /AngularAzureDemo/Images/subscriptions.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sachabarber/AngularAzureDemo/df62c704256ea3511cc55a748f247432d5fe0c79/AngularAzureDemo/Images/subscriptions.png -------------------------------------------------------------------------------- /AngularAzureDemo/Images/subscriptionsHover.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sachabarber/AngularAzureDemo/df62c704256ea3511cc55a748f247432d5fe0c79/AngularAzureDemo/Images/subscriptionsHover.png -------------------------------------------------------------------------------- /AngularAzureDemo/Images/viewAll.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sachabarber/AngularAzureDemo/df62c704256ea3511cc55a748f247432d5fe0c79/AngularAzureDemo/Images/viewAll.png -------------------------------------------------------------------------------- /AngularAzureDemo/Images/viewAllHover.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sachabarber/AngularAzureDemo/df62c704256ea3511cc55a748f247432d5fe0c79/AngularAzureDemo/Images/viewAllHover.png -------------------------------------------------------------------------------- /AngularAzureDemo/Models/BlobStorageResult.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Web; 5 | 6 | namespace AngularAzureDemo.Models 7 | { 8 | public class BlobStorageResult 9 | { 10 | public BlobStorageResult(bool storedOk, string blobUrl) 11 | { 12 | this.StoredOk = storedOk; 13 | this.BlobUrl = blobUrl; 14 | } 15 | 16 | public bool StoredOk { get; private set; } 17 | public string BlobUrl { get; private set; } 18 | } 19 | } -------------------------------------------------------------------------------- /AngularAzureDemo/Models/FullImageBlobComment.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections; 3 | using System.Collections.Generic; 4 | using System.Linq; 5 | using System.Web; 6 | 7 | using Microsoft.WindowsAzure.Storage.Table; 8 | 9 | namespace AngularAzureDemo.Models 10 | { 11 | public class FullImageBlobComment 12 | { 13 | public ImageBlob Blob { get; set; } 14 | public List Comments { get; set; } 15 | } 16 | } -------------------------------------------------------------------------------- /AngularAzureDemo/Models/FullImageBlobComments.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections; 3 | using System.Collections.Generic; 4 | using System.Linq; 5 | using System.Web; 6 | 7 | using Microsoft.WindowsAzure.Storage.Table; 8 | 9 | namespace AngularAzureDemo.Models 10 | { 11 | public class FullImageBlobComments 12 | { 13 | public FullImageBlobComments() 14 | { 15 | BlobComments = new List(); 16 | } 17 | 18 | public IList BlobComments { get; set; } 19 | } 20 | } -------------------------------------------------------------------------------- /AngularAzureDemo/Models/ImageBlob.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Web; 5 | 6 | using Microsoft.WindowsAzure.Storage.Table; 7 | 8 | namespace AngularAzureDemo.Models 9 | { 10 | public class ImageBlob 11 | { 12 | public int UserId { get; set; } 13 | public string UserName { get; set; } 14 | public Guid Id { get; set; } 15 | public string SavedBlobUrl { get; set; } 16 | public string CanvasData { get; set; } 17 | public string Title { get; set; } 18 | public DateTime CreatedOn { get; set; } 19 | public string CreatedOnPreFormatted { get; set; } 20 | 21 | 22 | } 23 | } -------------------------------------------------------------------------------- /AngularAzureDemo/Models/ImageBlobCloudModel.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Web; 5 | using Microsoft.WindowsAzure.Storage.Table; 6 | 7 | namespace AngularAzureDemo.Models 8 | { 9 | public class ImageBlobCloudModel 10 | { 11 | public bool TableExists { get; set; } 12 | public CloudTable Table { get; set; } 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /AngularAzureDemo/Models/ImageBlobComment.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections; 3 | using System.Collections.Generic; 4 | using System.Linq; 5 | using System.Web; 6 | 7 | using Microsoft.WindowsAzure.Storage.Table; 8 | 9 | namespace AngularAzureDemo.Models 10 | { 11 | public class ImageBlobComment 12 | { 13 | public string Comment { get; set; } 14 | public string UserName { get; set; } 15 | public DateTime CreatedOn { get; set; } 16 | public string CreatedOnPreFormatted { get; set; } 17 | public int UserId { get; set; } 18 | public Guid Id { get; set; } 19 | public Guid AssociatedBlobId { get; set; } 20 | } 21 | } -------------------------------------------------------------------------------- /AngularAzureDemo/Models/ImageBlobCommentResult.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Web; 5 | 6 | namespace AngularAzureDemo.Models 7 | { 8 | public class ImageBlobCommentResult 9 | { 10 | public bool SuccessfulAdd { get; set; } 11 | public ImageBlobComment Comment { get; set; } 12 | } 13 | } -------------------------------------------------------------------------------- /AngularAzureDemo/Models/User.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Web; 5 | 6 | namespace AngularAzureDemo.Models 7 | { 8 | public class User 9 | { 10 | public int Id { get; set; } 11 | public string Name { get; set; } 12 | } 13 | } -------------------------------------------------------------------------------- /AngularAzureDemo/Models/UserSubscription.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Web; 5 | 6 | using Microsoft.WindowsAzure.Storage.Table; 7 | 8 | namespace AngularAzureDemo.Models 9 | { 10 | public class UserSubscription 11 | { 12 | public int UserId { get; set; } 13 | public int FriendId { get; set; } 14 | public bool IsActive { get; set; } 15 | } 16 | } -------------------------------------------------------------------------------- /AngularAzureDemo/Models/UserSubscriptions.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections; 3 | using System.Collections.Generic; 4 | using System.Linq; 5 | using System.Web; 6 | 7 | using Microsoft.WindowsAzure.Storage.Table; 8 | 9 | namespace AngularAzureDemo.Models 10 | { 11 | public class UserSubscriptions 12 | { 13 | 14 | public UserSubscriptions() 15 | { 16 | Subscriptions = new List(); 17 | } 18 | 19 | public IList Subscriptions { get; set; } 20 | } 21 | } -------------------------------------------------------------------------------- /AngularAzureDemo/Models/Users.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | 3 | namespace AngularAzureDemo.Models 4 | { 5 | public class Users : List 6 | { 7 | public Users() 8 | { 9 | this.Add(new User{Id=1, Name="Sacha Barber"}); 10 | this.Add(new User{Id=2, Name="Adam Gril"}); 11 | this.Add(new User{Id=3, Name="James Franklin"}); 12 | this.Add(new User{Id=4, Name="Vicky Merry" }); 13 | this.Add(new User{Id=5, Name="Cena Rego"}); 14 | } 15 | } 16 | } -------------------------------------------------------------------------------- /AngularAzureDemo/Properties/AssemblyInfo.cs: -------------------------------------------------------------------------------- 1 | using System.Reflection; 2 | using System.Runtime.CompilerServices; 3 | using System.Runtime.InteropServices; 4 | 5 | // General Information about an assembly is controlled through the following 6 | // set of attributes. Change these attribute values to modify the information 7 | // associated with an assembly. 8 | [assembly: AssemblyTitle("AngularAzureDemo")] 9 | [assembly: AssemblyDescription("")] 10 | [assembly: AssemblyConfiguration("")] 11 | [assembly: AssemblyCompany("")] 12 | [assembly: AssemblyProduct("AngularAzureDemo")] 13 | [assembly: AssemblyCopyright("Copyright © 2013")] 14 | [assembly: AssemblyTrademark("")] 15 | [assembly: AssemblyCulture("")] 16 | 17 | // Setting ComVisible to false makes the types in this assembly not visible 18 | // to COM components. If you need to access a type in this assembly from 19 | // COM, set the ComVisible attribute to true on that type. 20 | [assembly: ComVisible(false)] 21 | 22 | // The following GUID is for the ID of the typelib if this project is exposed to COM 23 | [assembly: Guid("5e20e655-aec6-4a02-b71a-b984b693503e")] 24 | 25 | // Version information for an assembly consists of the following four values: 26 | // 27 | // Major Version 28 | // Minor Version 29 | // Build Number 30 | // Revision 31 | // 32 | // You can specify all the values or you can default the Revision and Build Numbers 33 | // by using the '*' as shown below: 34 | [assembly: AssemblyVersion("1.0.0.0")] 35 | [assembly: AssemblyFileVersion("1.0.0.0")] 36 | -------------------------------------------------------------------------------- /AngularAzureDemo/README.txt: -------------------------------------------------------------------------------- 1 | The default project would not compile as the package dependencies are not downloaded automatically. 2 | You need to enable nuget package restore on Visual Studio solution. To enable it 3 | 1. Right Click the Solution 4 | 2. Select 'Enable Nuget Package Restore'. 5 | 3. Build the solution. 6 | 7 | If you do not get this option please check you Pacakge Management setting. 8 | 1. Goto Tools-> Options. 9 | 2. Select 'Package Manager' from the list on the left. 10 | 3. Check the only item available under section 'Package Restore'. -------------------------------------------------------------------------------- /AngularAzureDemo/Scripts/_references.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sachabarber/AngularAzureDemo/df62c704256ea3511cc55a748f247432d5fe0c79/AngularAzureDemo/Scripts/_references.js -------------------------------------------------------------------------------- /AngularAzureDemo/Scripts/angular-cookies.min.js: -------------------------------------------------------------------------------- 1 | /* 2 | AngularJS v1.2.17 3 | (c) 2010-2014 Google, Inc. http://angularjs.org 4 | License: MIT 5 | */ 6 | (function(p,f,n){'use strict';f.module("ngCookies",["ng"]).factory("$cookies",["$rootScope","$browser",function(e,b){var c={},g={},h,k=!1,l=f.copy,m=f.isUndefined;b.addPollFn(function(){var a=b.cookies();h!=a&&(h=a,l(a,g),l(a,c),k&&e.$apply())})();k=!0;e.$watch(function(){var a,d,e;for(a in g)m(c[a])&&b.cookies(a,n);for(a in c)d=c[a],f.isString(d)||(d=""+d,c[a]=d),d!==g[a]&&(b.cookies(a,d),e=!0);if(e)for(a in d=b.cookies(),c)c[a]!==d[a]&&(m(d[a])?delete c[a]:c[a]=d[a])});return c}]).factory("$cookieStore", 7 | ["$cookies",function(e){return{get:function(b){return(b=e[b])?f.fromJson(b):b},put:function(b,c){e[b]=f.toJson(c)},remove:function(b){delete e[b]}}}])})(window,window.angular); 8 | //# sourceMappingURL=angular-cookies.min.js.map 9 | -------------------------------------------------------------------------------- /AngularAzureDemo/Scripts/angular-cookies.min.js.map: -------------------------------------------------------------------------------- 1 | { 2 | "version":3, 3 | "file":"angular-cookies.min.js", 4 | "lineCount":7, 5 | "mappings":"A;;;;;aAKC,SAAQ,CAACA,CAAD,CAASC,CAAT,CAAkBC,CAAlB,CAA6B,CAmBtCD,CAAAE,OAAA,CAAe,WAAf,CAA4B,CAAC,IAAD,CAA5B,CAAAC,QAAA,CAyBW,UAzBX,CAyBuB,CAAC,YAAD,CAAe,UAAf,CAA2B,QAAS,CAACC,CAAD,CAAaC,CAAb,CAAuB,CAAA,IACxEC,EAAU,EAD8D,CAExEC,EAAc,EAF0D,CAGxEC,CAHwE,CAIxEC,EAAU,CAAA,CAJ8D,CAKxEC,EAAOV,CAAAU,KALiE,CAMxEC,EAAcX,CAAAW,YAGlBN,EAAAO,UAAA,CAAmB,QAAQ,EAAG,CAC5B,IAAIC,EAAiBR,CAAAC,QAAA,EACjBE,EAAJ,EAA0BK,CAA1B,GACEL,CAGA,CAHqBK,CAGrB,CAFAH,CAAA,CAAKG,CAAL,CAAqBN,CAArB,CAEA,CADAG,CAAA,CAAKG,CAAL,CAAqBP,CAArB,CACA,CAAIG,CAAJ,EAAaL,CAAAU,OAAA,EAJf,CAF4B,CAA9B,CAAA,EAUAL,EAAA,CAAU,CAAA,CAKVL,EAAAW,OAAA,CASAC,QAAa,EAAG,CAAA,IACVC,CADU,CAEVC,CAFU,CAIVC,CAGJ,KAAKF,CAAL,GAAaV,EAAb,CACMI,CAAA,CAAYL,CAAA,CAAQW,CAAR,CAAZ,CAAJ,EACEZ,CAAAC,QAAA,CAAiBW,CAAjB,CAAuBhB,CAAvB,CAKJ,KAAIgB,CAAJ,GAAYX,EAAZ,CACEY,CAKA,CALQZ,CAAA,CAAQW,CAAR,CAKR,CAJKjB,CAAAoB,SAAA,CAAiBF,CAAjB,CAIL,GAHEA,CACA,CADQ,EACR,CADaA,CACb,CAAAZ,CAAA,CAAQW,CAAR,CAAA,CAAgBC,CAElB,EAAIA,CAAJ,GAAcX,CAAA,CAAYU,CAAZ,CAAd,GACEZ,CAAAC,QAAA,CAAiBW,CAAjB,CAAuBC,CAAvB,CACA,CAAAC,CAAA,CAAU,CAAA,CAFZ,CAOF,IAAIA,CAAJ,CAIE,IAAKF,CAAL,GAFAI,EAEaf,CAFID,CAAAC,QAAA,EAEJA,CAAAA,CAAb,CACMA,CAAA,CAAQW,CAAR,CAAJ,GAAsBI,CAAA,CAAeJ,CAAf,CAAtB,GAEMN,CAAA,CAAYU,CAAA,CAAeJ,CAAf,CAAZ,CAAJ,CACE,OAAOX,CAAA,CAAQW,CAAR,CADT,CAGEX,CAAA,CAAQW,CAAR,CAHF,CAGkBI,CAAA,CAAeJ,CAAf,CALpB,CAhCU,CAThB,CAEA,OAAOX,EA1BqE,CAA3D,CAzBvB,CAAAH,QAAA,CAkIW,cAlIX;AAkI2B,CAAC,UAAD,CAAa,QAAQ,CAACmB,CAAD,CAAW,CAErD,MAAO,KAWAC,QAAQ,CAACC,CAAD,CAAM,CAEjB,MAAO,CADHN,CACG,CADKI,CAAA,CAASE,CAAT,CACL,EAAQxB,CAAAyB,SAAA,CAAiBP,CAAjB,CAAR,CAAkCA,CAFxB,CAXd,KA0BAQ,QAAQ,CAACF,CAAD,CAAMN,CAAN,CAAa,CACxBI,CAAA,CAASE,CAAT,CAAA,CAAgBxB,CAAA2B,OAAA,CAAeT,CAAf,CADQ,CA1BrB,QAuCGU,QAAQ,CAACJ,CAAD,CAAM,CACpB,OAAOF,CAAA,CAASE,CAAT,CADa,CAvCjB,CAF8C,CAAhC,CAlI3B,CAnBsC,CAArC,CAAA,CAsMEzB,MAtMF,CAsMUA,MAAAC,QAtMV;", 6 | "sources":["angular-cookies.js"], 7 | "names":["window","angular","undefined","module","factory","$rootScope","$browser","cookies","lastCookies","lastBrowserCookies","runEval","copy","isUndefined","addPollFn","currentCookies","$apply","$watch","push","name","value","updated","isString","browserCookies","$cookies","get","key","fromJson","put","toJson","remove"] 8 | } 9 | -------------------------------------------------------------------------------- /AngularAzureDemo/Scripts/angular-csp.css: -------------------------------------------------------------------------------- 1 | /* Include this file in your html if you are using the CSP mode. */ 2 | 3 | @charset "UTF-8"; 4 | 5 | [ng\:cloak], [ng-cloak], [data-ng-cloak], [x-ng-cloak], 6 | .ng-cloak, .x-ng-cloak, 7 | .ng-hide { 8 | display: none !important; 9 | } 10 | 11 | ng\:form { 12 | display: block; 13 | } 14 | 15 | .ng-animate-block-transitions { 16 | transition:0s all!important; 17 | -webkit-transition:0s all!important; 18 | } 19 | 20 | /* show the element during a show/hide animation when the 21 | * animation is ongoing, but the .ng-hide class is active */ 22 | .ng-hide-add-active, .ng-hide-remove { 23 | display: block!important; 24 | } 25 | -------------------------------------------------------------------------------- /AngularAzureDemo/Scripts/angular-loader.min.js: -------------------------------------------------------------------------------- 1 | /* 2 | AngularJS v1.2.17 3 | (c) 2010-2014 Google, Inc. http://angularjs.org 4 | License: MIT 5 | */ 6 | (function(){'use strict';function d(a){return function(){var c=arguments[0],b,c="["+(a?a+":":"")+c+"] http://errors.angularjs.org/1.2.17/"+(a?a+"/":"")+c;for(b=1;b(); 23 | hubContext.Clients.All.latestBlobMessage(imageBlob); 24 | } 25 | } 26 | } -------------------------------------------------------------------------------- /AngularAzureDemo/SignalR/SignalRStartup.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using Microsoft.Owin; 3 | using Owin; 4 | 5 | [assembly: OwinStartup(typeof(AngularAzureDemo.SignalRStartup))] 6 | 7 | namespace AngularAzureDemo 8 | { 9 | public class SignalRStartup 10 | { 11 | public void Configuration(IAppBuilder app) 12 | { 13 | app.MapSignalR(); 14 | } 15 | } 16 | } -------------------------------------------------------------------------------- /AngularAzureDemo/Views/Account/Login.cshtml: -------------------------------------------------------------------------------- 1 | @{ 2 | Layout = null; 3 | } 4 | 5 | 6 |
7 |
8 |
9 |

This is a small demo app demonstrating the following technolgies all working together

10 |
11 | Responsive image 14 |
15 |
16 |
17 |
18 | 19 |
20 |
21 | 22 |
23 |

Login

24 |

Please pick a user to log in as

25 |
26 |

27 | 31 |

32 |
33 | 37 |
38 |
39 | 40 |
41 | 42 |
43 |

Logout

44 |

You are logged in as :

45 |
46 |

47 | 52 |

53 |
54 |
55 |
56 | 57 |
-------------------------------------------------------------------------------- /AngularAzureDemo/Views/Home/Create.cshtml: -------------------------------------------------------------------------------- 1 | @{ 2 | Layout = null; 3 | } 4 | 5 | 6 |
7 |
8 |

Create Actions

9 |
10 |

11 | 12 | 13 |

14 |

15 | 16 | 17 |

18 |

19 | 20 | 21 |

22 |

23 | 29 |

30 |
31 |
32 | 33 |
34 |

35 | 37 | 39 |

40 |
-------------------------------------------------------------------------------- /AngularAzureDemo/Views/Home/Index.cshtml: -------------------------------------------------------------------------------- 1 |  2 | 3 |
4 |
5 | 6 | 10 |
11 | -------------------------------------------------------------------------------- /AngularAzureDemo/Views/Home/SketcherActions.cshtml: -------------------------------------------------------------------------------- 1 | @{ 2 | Layout = null; 3 | } 4 | 5 |
6 |
7 |

Actions

8 |
9 |

Choose what you want to do with Sketcher

10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /AngularAzureDemo/Views/Home/Subscriptions.cshtml: -------------------------------------------------------------------------------- 1 | @{ 2 | Layout = null; 3 | } 4 | 5 | 6 |
7 | 8 |
9 |
10 |

Subscriptions

11 |
12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 25 | 26 | 27 |
IdNameSubscription Active
{{friendsSubscription.Id}}{{friendsSubscription.Name}}
28 |
29 |
30 |
31 |
32 | 35 |
36 |
37 |
38 |
39 | -------------------------------------------------------------------------------- /AngularAzureDemo/Views/Home/ViewAll.cshtml: -------------------------------------------------------------------------------- 1 | @{ 2 | Layout = null; 3 | } 4 | 5 | 32 | 33 | 34 | -------------------------------------------------------------------------------- /AngularAzureDemo/Views/Shared/Error.cshtml: -------------------------------------------------------------------------------- 1 | @model System.Web.Mvc.HandleErrorInfo 2 | 3 | @{ 4 | ViewBag.Title = "Error"; 5 | } 6 | 7 |
8 |

Error.

9 |

An error occurred while processing your request.

10 |
11 | -------------------------------------------------------------------------------- /AngularAzureDemo/Views/_ViewStart.cshtml: -------------------------------------------------------------------------------- 1 | @{ 2 | Layout = "~/Views/Shared/_Layout.cshtml"; 3 | } -------------------------------------------------------------------------------- /AngularAzureDemo/Web.Debug.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | 17 | 18 | 29 | 30 | -------------------------------------------------------------------------------- /AngularAzureDemo/Web.Release.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | 17 | 18 | 19 | 30 | 31 | -------------------------------------------------------------------------------- /AngularAzureDemo/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sachabarber/AngularAzureDemo/df62c704256ea3511cc55a748f247432d5fe0c79/AngularAzureDemo/favicon.ico -------------------------------------------------------------------------------- /AngularAzureDemo/fonts/glyphicons-halflings-regular.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sachabarber/AngularAzureDemo/df62c704256ea3511cc55a748f247432d5fe0c79/AngularAzureDemo/fonts/glyphicons-halflings-regular.eot -------------------------------------------------------------------------------- /AngularAzureDemo/fonts/glyphicons-halflings-regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sachabarber/AngularAzureDemo/df62c704256ea3511cc55a748f247432d5fe0c79/AngularAzureDemo/fonts/glyphicons-halflings-regular.ttf -------------------------------------------------------------------------------- /AngularAzureDemo/fonts/glyphicons-halflings-regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sachabarber/AngularAzureDemo/df62c704256ea3511cc55a748f247432d5fe0c79/AngularAzureDemo/fonts/glyphicons-halflings-regular.woff -------------------------------------------------------------------------------- /TODO.txt: -------------------------------------------------------------------------------- 1 | 1. Fix the navbar, it is staying open, when in small mode 2 | 2. find out why firefox does draw 3 | 3. Add extra property to blo that can be used for ordering in ImageBlobComment/get 4 | 5 | 6 | 7 | --------------------------------------------------------------------------------