예제 #1
0
        // PUT api/ideas/5
        public IHttpActionResult Put(int id, Idea idea)
        {
            if (!ModelState.IsValid)
            {
                return(BadRequest(ModelState));
            }

            if (id != idea.Id)
            {
                return(BadRequest());
            }

            if (!IdeaExists(id))
            {
                return(NotFound());
            }
            _ideaRepository.Update(idea);
            _ideaRepository.Save();

            return(Ok(idea));
        }
예제 #2
0
        public ActionResult Edit(Idea idea)
        {
            //TODO: Validation
            //TODO: Security
            //TODO: Images

            var old = _ideas.Get(idea.Id);

            old.Title       = idea.Title;
            old.Description = idea.Description;
            old.Status      = idea.Status;
            _ideas.Save();
            return(RedirectToAction("Index", idea.Id));
        }
예제 #3
0
        public ActionResult Admincomment(int id)
        {
            var idea = _ideas.Get(id);


            var user = _users.GetUserFromUserIdentity(Request.GetIdentity());

            _activities.Add(id, new AdminActivity
            {
                OldStatus = idea.Status,
                NewStatus = Request.Form["Status"],
                User      = user,
                Time      = DateTime.UtcNow
            });
            _activities.Save();

            idea.Status = Request.Form["Status"];
            _ideas.Save();

            return(Redirect("/idea/" + idea.Id));
        }
예제 #4
0
        public IdeaSecuredModule(IIdeaRepository ideas, IUserRepository users, ISettingsRepository settings, IImageRepository imageRepository)
            : base("/idea")
        {
            _ideas           = ideas;
            _settings        = settings;
            _imageRepository = imageRepository;
            _users           = users;

            this.RequiresAuthentication();

            Get["/new"] = _ =>
            {
                var m = Context.Model(string.Format("New Idea - {0}", _settings.Title));
                m.Ideas  = _ideas.GetAll();
                m.Errors = false;

                if (Request.Query["validation"] == "failed")
                {
                    m.Errors = true;
                }

                return(View["Idea/New", m]);
            };

            Get["/{id}/edit"] = parameters =>
            {
                int id   = parameters.id;
                var idea = _ideas.Get(id);

                var m = Context.Model(string.Format(Strings.IdeaSecuredModule_EditIdea, idea.Title, _settings.Title));
                m.PopularIdeas  = _ideas.GetAll();
                m.Idea          = idea;
                m.StatusChoices = _settings.IdeaStatusChoices.Split(',');
                m.Errors        = false;

                if (Request.Query["validation"] == "failed")
                {
                    m.Errors = true;
                }

                return(View["Idea/Edit", m]);
            };


            // save result of edit to database
            Post["/{id}/edit"] = parameters =>
            {
                int id = parameters.id;

                if (string.IsNullOrEmpty(Request.Form.Title) || string.IsNullOrEmpty(Request.Form.Description))
                {
                    return(Response.AsRedirect(string.Format("/idea/{0}/edit?validation=failed", id)));
                }

                var idea = _ideas.Get(id);
                if (idea == null)
                {
                    return(View["404"]);
                }

                idea.Title       = Request.Form.Title;
                idea.Description = Request.Form.Description;
                idea.Status      = Request.Form.Status;

                //Add any images
                IEnumerable <string> keys = Context.Request.Form;
                var x      = keys.Where(c => c.StartsWith("imageId"));
                var ids    = x.Select(c => Context.Request.Form[c].ToString()).Cast <string>();
                var images = ids.Select(y => _imageRepository.Get(Convert.ToInt32(y)));
                foreach (var i in images)
                {
                    if (!idea.Images.Contains(i, i))
                    {
                        idea.Images.Add(i);
                    }
                }

                _ideas.Save();

                return(Response.AsRedirect(string.Format("/idea/{0}", idea.Id)));
            };

            // save result of create to database
            Post["/new"] = _ =>
            {
                if (string.IsNullOrEmpty(Request.Form.Title) || string.IsNullOrEmpty(Request.Form.Description))
                {
                    return(Response.AsRedirect("/idea/new?validation=failed"));
                }

                var user = _users.FindBy(u => u.UserName == Context.CurrentUser.UserName).FirstOrDefault();

                if (user == null)
                {
                    return(Response.AsRedirect("/login"));
                }

                var idea = new Idea
                {
                    Author      = user,
                    Time        = DateTime.UtcNow,
                    Title       = Request.Form.Title,
                    Description = Request.Form.Description,
                    Status      = settings.IdeaStatusDefault
                };

                IEnumerable <string> keys = Context.Request.Form;

                var parameters = keys.Where(c => c.StartsWith("imageId"));
                var ids        = parameters.Select(c => Context.Request.Form[c].ToString()).Cast <string>();
                var images     = ids.Select(id => _imageRepository.Get(Convert.ToInt32(id)));
                idea.Images = images.ToList();

                //i.Images = form.Cast<string>()
                //    .Where(k => k.StartsWith("imageId"))
                //    .Select(k => _imageRepository.Get(Convert.ToInt32(form[k])))
                //    .ToList(); //is there a way to do this using Nancy?
                if (idea.Votes.Any(u => u.UserId == user.Id))
                {
                    idea.UserHasVoted = true;
                }

                ideas.Add(idea);

                return(Response.AsRedirect("/idea/" + idea.Id));
            };

            // someone else votes for the idea
            Post["/{id}/vote"] = parameters =>
            {
                var user = Context.GetCurrentUser(_users);

                if (user == null)
                {
                    return(Response.AsRedirect("/login"));
                }

                int ideaId = parameters.id;
                int votes  = ideas.Vote(ideaId, user.Id, 1);

                return(Response.AsJson(new { Status = "OK", NewVotes = votes }));
            };

            // the user decides to repeal his vote
            Post["/{id}/unvote"] = parameters =>
            {
                var user  = Context.GetCurrentUser(_users);
                int votes = ideas.Unvote(parameters.id, user.Id);

                return(Response.AsJson(new { Status = "OK", NewVotes = votes }));
            };

            Post["/{id}/delete"] = parameters =>
            {
                int id = parameters.id;
                ideas.Delete(id);
                ideas.Save();

                // TODO: test
                return(Response.AsJson(new { Status = "Error" }));
            };

            // TODO: do we want unauthenticated users to be allowed to upload posts?
            Post["/uploadimage"] = parameters =>
            {
                var user = Context.GetCurrentUser(_users);
                if (user == null)
                {
                    return(Response.AsJson(new { status = "Error" }));
                }

                var imageFile = Request.Files.FirstOrDefault();
                if (imageFile == null)
                {
                    return(null); //TODO: handle error case
                }

                var image = new Image {
                    Name = imageFile.Name
                };
                var bytes = new byte[imageFile.Value.Length];
                imageFile.Value.Read(bytes, 0, bytes.Length);
                image.ImageBits = bytes;
                imageRepository.Add(image);
                var status = new ImageFileStatus(image.Id, bytes.Length, image.Name);
                return(Response.AsJson(new[] { status }).WithHeader("Vary", "Accept"));
            };

            Delete["/deleteimage/{id}"] = parameters =>
            {
                var user = Context.GetCurrentUser(_users);
                if (user == null)
                {
                    return(Response.AsJson(new { status = "Error" }));
                }

                imageRepository.Delete(parameters.id);
                return(null);
            };
        }
예제 #5
0
        public IdeaSecuredModule(IIdeaRepository ideas, IUserRepository users, ISettingsRepository settings, IImageRepository imageRepository)
            : base("/idea")
        {
            _ideas = ideas;
            _settings = settings;
            _imageRepository = imageRepository;
            _users = users;

            this.RequiresAuthentication();

            Get["/new"] = _ =>
            {
                var m = Context.Model(string.Format("New Idea - {0}", _settings.Title));
                m.Ideas = _ideas.GetAll();
                m.Errors = false;

                if (Request.Query["validation"] == "failed")
                {
                    m.Errors = true;
                }

                return View["Idea/New", m];
            };

            Get["/{id}/edit"] = parameters =>
            {
                int id = parameters.id;
                var idea = _ideas.Get(id);

                if (idea == null)
                    return View["404"];

                if (idea.Author.UserName != Context.CurrentUser.UserName)
                    return View["404"];

                var m = Context.Model(string.Format(Strings.IdeaSecuredModule_EditIdea, idea.Title, _settings.Title));
                m.PopularIdeas = _ideas.GetAll();
                m.Idea = idea;
                m.StatusChoices = _settings.IdeaStatusChoices.Split(',');
                m.Errors = false;

                if (Request.Query["validation"] == "failed")
                {
                    m.Errors = true;
                }

                return View["Idea/Edit", m];
            };

            // save result of edit to database
            Post["/{id}/edit"] = parameters =>
            {
                int id = parameters.id;

                if (string.IsNullOrEmpty(Request.Form.Title) || string.IsNullOrEmpty(Request.Form.Description))
                {
                    return Response.AsRedirect(string.Format("/idea/{0}/edit?validation=failed", id));
                }

                var idea = _ideas.Get(id);
                if (idea == null)
                    return View["404"];

                idea.Title = Request.Form.Title;
                idea.Description = Request.Form.Description;
                idea.Status = Request.Form.Status;

                //Add any images
                IEnumerable<string> keys = Context.Request.Form;
                var x = keys.Where(c => c.StartsWith("imageId"));
                var ids = x.Select(c => Context.Request.Form[c].ToString()).Cast<string>();
                var images = ids.Select(y => _imageRepository.Get(Convert.ToInt32(y)));
                foreach (var i in images)
                {
                    if (!idea.Images.Contains(i, i))
                    {
                        idea.Images.Add(i);
                    }
                }

                _ideas.Save();

                return Response.AsRedirect(string.Format("/idea/{0}", idea.Id));
            };

            // save result of create to database
            Post["/new"] = _ =>
            {
                if (string.IsNullOrEmpty(Request.Form.Title) || string.IsNullOrEmpty(Request.Form.Description))
                {
                    return Response.AsRedirect("/idea/new?validation=failed");
                }

                var user = _users.FindBy(u => u.UserName == Context.CurrentUser.UserName).FirstOrDefault();

                if (user == null)
                    return Response.AsRedirect("/login");

                var idea = new Idea
                            {
                                Author = user,
                                Time = DateTime.UtcNow,
                                Title = Request.Form.Title,
                                Description = Request.Form.Description,
                                Status = settings.IdeaStatusDefault
                            };

                IEnumerable<string> keys = Context.Request.Form;

                var parameters = keys.Where(c => c.StartsWith("imageId"));
                var ids = parameters.Select(c => Context.Request.Form[c].ToString()).Cast<string>();
                var images = ids.Select(id => _imageRepository.Get(Convert.ToInt32(id)));
                idea.Images = images.ToList();

                //i.Images = form.Cast<string>()
                //    .Where(k => k.StartsWith("imageId"))
                //    .Select(k => _imageRepository.Get(Convert.ToInt32(form[k])))
                //    .ToList(); //is there a way to do this using Nancy?
                if (idea.Votes.Any(u => u.UserId == user.Id))
                    idea.UserHasVoted = true;

                ideas.Add(idea);

                return Response.AsRedirect("/idea/" + idea.Id);
            };

            // someone else votes for the idea
            Post["/{id}/vote"] = parameters =>
            {
                var user = Context.GetCurrentUser(_users);

                if (user == null)
                    return Response.AsRedirect("/login");

                int ideaId = parameters.id;
                int votes = ideas.Vote(ideaId, user.Id, 1);

                return Response.AsJson(new { Status = "OK", NewVotes = votes });
            };

            // the user decides to repeal his vote
            Post["/{id}/unvote"] = parameters =>
            {
                var user = Context.GetCurrentUser(_users);
                int votes = ideas.Unvote(parameters.id, user.Id);

                return Response.AsJson(new { Status = "OK", NewVotes = votes });
            };

            Post["/{id}/delete"] = parameters =>
            {
                int id = parameters.id;
                ideas.Delete(id);
                ideas.Save();

                // TODO: test
                return Response.AsJson(new { Status = "Error" });
            };

            // TODO: do we want unauthenticated users to be allowed to upload posts?
            Post["/uploadimage"] = parameters =>
            {
                var user = Context.GetCurrentUser(_users);
                if (user == null)
                    return Response.AsJson(new { status = "Error" });

                var imageFile = Request.Files.FirstOrDefault();
                if (imageFile == null)
                {
                    return null; //TODO: handle error case
                }

                var image = new Image { Name = imageFile.Name };
                var bytes = new byte[imageFile.Value.Length];
                imageFile.Value.Read(bytes, 0, bytes.Length);
                image.ImageBits = bytes;
                imageRepository.Add(image);
                var status = new ImageFileStatus(image.Id, bytes.Length, image.Name);
                return Response.AsJson(new[] { status }).WithHeader("Vary", "Accept");
            };

            Delete["/deleteimage/{id}"] = parameters =>
            {
                var user = Context.GetCurrentUser(_users);
                if (user == null)
                    return Response.AsJson(new { status = "Error" });

                imageRepository.Delete(parameters.id);
                return null;
            };
        }
예제 #6
0
        public IdeaModule(IIdeaRepository ideas, ISettingsRepository settings)
            : base("/idea")
        {
            _ideas = ideas;
            _settings = settings;

            Get["/new"] = _ => View["Idea/New", new
            {
                Title = string.Format("New Idea - {0}", _settings.Title),
                Ideas = _ideas.GetAll()
            }];

            Get["/{id}/edit"] = parameters =>
            {
                int id = parameters.id;
                var idea = _ideas.Get(id);

                if (idea == null)
                    return View["404"];

                return View["Idea/Edit", new
                {
                    Title = string.Format("Edit Idea: '{0}' - {1}", idea.Title, _settings.Title),
                    PopularIdeas = _ideas.GetAll(),
                    Idea = idea
                }];
            };

            Get["/{id}"] = parameters =>
                               {
                                   int id = parameters.id;
                                   var idea = _ideas.Get(id);
                                   if (idea == null)
                                       return View["404"];

                                   var viewModel = new IdeaViewModel(idea) { UserHasVoted = false };

                                   return View["Idea/Index",
                                       new
                                       {
                                           Title = string.Format("{0} - {1}", idea.Title, _settings.Title),
                                           Idea = viewModel,
                                           UserId = 2 // TODO: not hard-code these
                                       }];
                               };

            // save result of edit to database
            Post["/{id}/edit"] = parameters =>
            {
                int id = parameters.id;
                var idea = _ideas.Get(id);
                if (idea == null)
                    return View["404"];

                idea.Title = Request.Form.Title;
                idea.Description = Request.Form.Description;

                _ideas.Save();

                return Response.AsRedirect(string.Format("/idea/{0}", idea.Id));
            };

            // save result of create to database
            Post["/new"] = _ =>
            {
                var i = new Idea
                            {
                                Time = DateTime.UtcNow,
                                Title = Request.Form.Title,
                                Description = Request.Form.Description,
                            };

                ideas.Add(i);

                return Response.AsRedirect("/idea/" + i.Id);
            };

            // someone else votes for the idea
            Post["/{id}/vote/{userid}"] = parameters =>
            {
                int votes = ideas.Vote(parameters.id, parameters.userid, 1);

                return Response.AsJson(new
                                {
                                    Status = "OK",
                                    NewVotes = votes
                                });
            };

            // the user decides to repeal his vote
            Post["/{id}/unvote/{userid}"] = parameters =>
            {
                int votes = ideas.Unvote(parameters.id, parameters.userid);

                return Response.AsJson(new
                {
                    Status = "OK",
                    NewVotes = votes
                });
            };

            Post["/{id}/delete"] = parameters =>
            {
                int id = parameters.id;
                ideas.Delete(id);
                ideas.Save();

                // TODO: test
                return Response.AsJson(new
                {
                    Status = "Error"
                });
            };
        }
예제 #7
0
        public ApiModule(IdeastrikeContext db, IIdeaRepository ideas, IUserRepository users, Settings settings)
            : base("/api")
        {
            _settings = settings;

            Get["/ideas"] = _ => {
                return Response.AsJson(db.Ideas.Select(idea =>
                    new {
                        id = idea.Id,
                        title = idea.Title,
                        description = idea.Description,
                        time = SqlFunctions.DateDiff("s", new DateTime(1970, 1, 1), idea.Time),
                        author = new { id = idea.Author.Id, username = idea.Author.UserName },
                        vote_count = idea.Votes.Sum(vote => (int?)vote.Value) ?? 0,
                        status = idea.Status
                    }));
            };

            Get["/ideas/{id}"] = _ => {
                int id = _.id;
                var o = db.Ideas.Where(idea => idea.Id == id).Select(idea =>
                    new {
                        id = idea.Id,
                        title = idea.Title,
                        description = idea.Description,
                        time = SqlFunctions.DateDiff("s", new DateTime(1970, 1, 1), idea.Time),
                        author = new { id = idea.Author.Id, username = idea.Author.UserName },
                        vote_count = idea.Votes.Sum(vote => (int?)vote.Value) ?? 0,
                        features = idea.Features.Select(feature => new { id = feature.Id, text = feature.Text, time = SqlFunctions.DateDiff("s", new DateTime(1970, 1, 1), feature.Time) }),
                        votes = idea.Votes.Select(vote => new { user = new { id = vote.UserId, username = vote.User.UserName }, value = vote.Value })
                    }).FirstOrDefault();
                if (o == null)
                    return HttpStatusCode.NotFound;
                return Response.AsJson(o);
            };

            Get["/ideas/{id}/features"] = _ => {
                int id = _.id;
                if (!db.Ideas.Any(idea => idea.Id == id))
                    return HttpStatusCode.NotFound;
                return Response.AsJson(db.Features.Where(d => d.Idea.Id == id).Select(feature =>
                    new {
                        id = feature.Id,
                        text = feature.Text,
                        time = SqlFunctions.DateDiff("s", new DateTime(1970, 1, 1), feature.Time),
                    }));
            };

            Get["/ideas/{id}/votes"] = _ => {
                int id = _.id;
                if (!db.Ideas.Any(idea => idea.Id == id))
                    return HttpStatusCode.NotFound;
                return Response.AsJson(db.Votes.Where(d => d.IdeaId == id).Select(vote =>
                    new {
                        value = vote.Value,
                        user = new { id = vote.UserId, username = vote.User.UserName }
                    }));
            };

            Post["/activity"] = _ =>
            {
                string content;
                using (var reader = new StreamReader(Context.Request.Body))
                {
                    content = reader.ReadToEnd();
                }
                var j = JsonConvert.DeserializeObject<dynamic>(content);
                string repourl = j.repository.url.ToString();
                string reponame = j.repository.name.ToString();
                var idea = ideas
                            .Include("Activities")
                            .Where(i => i.GithubUrl == repourl || i.GithubName == reponame)
                            .FirstOrDefault();

                if (idea == null)
                    return HttpStatusCode.NotFound;

                foreach (var c in j.commits)
                {
                    string date = c.timestamp;
                    var activity = new GitHubActivity
                    {
                        Time = DateTime.Parse(date),
                        Message = c.message,
                        CommitUrl = c.url,
                        AuthorName = c.author.name,
                        GravatarUrl = GravatarExtensions.ToGravatarUrl(c.author.email.ToString(), 40),
                        Sha = c.id
                    };

                    if (!idea.Activities.OfType<GitHubActivity>().Any(a => a.Sha == activity.Sha))
                        idea.Activities.Add(activity);
                }

                ideas.Save();
                return HttpStatusCode.Accepted;
            };
        }
예제 #8
0
        public ApiModule(IdeastrikeContext db, IIdeaRepository ideas, IUserRepository users, Settings settings)
            : base("/api")
        {
            _settings = settings;

            Get["/ideas"] = _ => {
                return(Response.AsJson(db.Ideas.Select(idea =>
                                                       new {
                    id = idea.Id,
                    title = idea.Title,
                    description = idea.Description,
                    time = SqlFunctions.DateDiff("s", new DateTime(1970, 1, 1), idea.Time),
                    author = new { id = idea.Author.Id, username = idea.Author.UserName },
                    vote_count = idea.Votes.Sum(vote => (int?)vote.Value) ?? 0,
                    status = idea.Status
                })));
            };

            Get["/ideas/{id}"] = _ => {
                int id = _.id;
                var o  = db.Ideas.Where(idea => idea.Id == id).Select(idea =>
                                                                      new {
                    id          = idea.Id,
                    title       = idea.Title,
                    description = idea.Description,
                    time        = SqlFunctions.DateDiff("s", new DateTime(1970, 1, 1), idea.Time),
                    author      = new { id = idea.Author.Id, username = idea.Author.UserName },
                    vote_count  = idea.Votes.Sum(vote => (int?)vote.Value) ?? 0,
                    features    = idea.Features.Select(feature => new { id = feature.Id, text = feature.Text, time = SqlFunctions.DateDiff("s", new DateTime(1970, 1, 1), feature.Time) }),
                    votes       = idea.Votes.Select(vote => new { user = new { id = vote.UserId, username = vote.User.UserName }, value = vote.Value })
                }).FirstOrDefault();
                if (o == null)
                {
                    return(HttpStatusCode.NotFound);
                }
                return(Response.AsJson(o));
            };

            Get["/ideas/{id}/features"] = _ => {
                int id = _.id;
                if (!db.Ideas.Any(idea => idea.Id == id))
                {
                    return(HttpStatusCode.NotFound);
                }
                return(Response.AsJson(db.Features.Where(d => d.Idea.Id == id).Select(feature =>
                                                                                      new {
                    id = feature.Id,
                    text = feature.Text,
                    time = SqlFunctions.DateDiff("s", new DateTime(1970, 1, 1), feature.Time),
                })));
            };

            Get["/ideas/{id}/votes"] = _ => {
                int id = _.id;
                if (!db.Ideas.Any(idea => idea.Id == id))
                {
                    return(HttpStatusCode.NotFound);
                }
                return(Response.AsJson(db.Votes.Where(d => d.IdeaId == id).Select(vote =>
                                                                                  new {
                    value = vote.Value,
                    user = new { id = vote.UserId, username = vote.User.UserName }
                })));
            };

            Post["/activity"] = _ =>
            {
                string content;
                using (var reader = new StreamReader(Context.Request.Body))
                {
                    content = reader.ReadToEnd();
                }
                var    j        = JsonConvert.DeserializeObject <dynamic>(content);
                string repourl  = j.repository.url.ToString();
                string reponame = j.repository.name.ToString();
                var    idea     = ideas
                                  .Include("Activities")
                                  .Where(i => i.GithubUrl == repourl || i.GithubName == reponame)
                                  .FirstOrDefault();

                if (idea == null)
                {
                    return(HttpStatusCode.NotFound);
                }

                foreach (var c in j.commits)
                {
                    string date     = c.timestamp;
                    var    activity = new GitHubActivity
                    {
                        Time        = DateTime.Parse(date),
                        Message     = c.message,
                        CommitUrl   = c.url,
                        AuthorName  = c.author.name,
                        GravatarUrl = GravatarExtensions.ToGravatarUrl(c.author.email.ToString(), 40),
                        Sha         = c.id
                    };

                    if (!idea.Activities.OfType <GitHubActivity>().Any(a => a.Sha == activity.Sha))
                    {
                        idea.Activities.Add(activity);
                    }
                }

                ideas.Save();
                return(HttpStatusCode.Accepted);
            };
        }