carte-server 0.0.9 → 0.0.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 2f6b43e925dea02cd986b8267fd5bf77d8ff88ef
4
- data.tar.gz: df37f4fd415e613d6ae5af207c9db1f620c9e049
3
+ metadata.gz: c9924e7dfa9f1be40fac1767395cb53f4855c016
4
+ data.tar.gz: 79e9aaf3531ef5494142426b88ef6838a5886532
5
5
  SHA512:
6
- metadata.gz: 5db00e8726f2a0a85986436437d857b9698d9ca92fa11c912bde8accaaff01dc7397b05d6a7c8dc6ae35c8ab431ae1a9c1edd863055158ddb3997b92b14dcd86
7
- data.tar.gz: 06100017a72c998eafd854b558273c6b7b533170a7180163edff5105542a023878c62893db087a64f123c55ee252ec92880a400573ecb251e92742dd6a5040a0
6
+ metadata.gz: f5845160a604995b0ea42460a4b34bb66d5fe0ef2203ba94c341046ea23cd78b31cd70a68b75feeec9dfbb9928e63b954843e9510ae147f9d973d6e28a47183e
7
+ data.tar.gz: a2c858d32f6fe6b28aae28fbe1e63e8d91ef643c813b7fc3d1f1bfaef3d9a9d3e7ace4b445937ef090c48c273ef92fb539555bdf76e5e9427876230a54675636
@@ -32,4 +32,5 @@ Gem::Specification.new do |spec|
32
32
  spec.add_dependency "activesupport"
33
33
  spec.add_dependency "haml"
34
34
  spec.add_dependency "mongoid-simple-tags"
35
+ spec.add_dependency "mongoid-geospatial"
35
36
  end
@@ -1,4 +1,7 @@
1
-
1
+ Backbone = require('backbone')
2
2
  module.exports =
3
+ reload: ()->
4
+ Backbone.history.loadUrl()
5
+
3
6
  isMobile: ()->
4
7
  /(iPhone|iPod|iPad).*AppleWebKit/i.test(navigator.userAgent)
@@ -1,5 +1,6 @@
1
1
  Backbone = require('backbone')
2
2
  config = require('../../shared/config.json')
3
+ querystring = require('querystring')
3
4
 
4
5
  module.exports = class Card extends Backbone.Model
5
6
  idAttribute: 'title'
@@ -14,7 +15,7 @@ module.exports = class Card extends Backbone.Model
14
15
  url = '/api/cards.json'
15
16
  else
16
17
  console.log 'url is not new'
17
- url = '/api/cards/' + @get('title') + '.json'
18
+ url = '/api/cards/' + encodeURIComponent(@get('title')) + '.json'
18
19
  if config.api_path
19
20
  url = config.api_path + url
20
21
  url
@@ -37,7 +37,7 @@ module.exports = React.createClass
37
37
  title = 'search: ' + cards.query.title + ' (' + title + ')' if cards.query.title
38
38
  title += ' - ' + config.title
39
39
  document.title = title
40
- <List key='list' cards={cards} showNav=true />
40
+ <List key='list' router={@props.router} cards={cards} showNav=true />
41
41
  when "show"
42
42
  console.log 'show'
43
43
  cards = new CardCollection()
@@ -4,6 +4,7 @@ React = require('react')
4
4
  Edit = require('./edit')
5
5
  CardModel = require('../models/card')
6
6
  ModalTrigger = require('react-bootstrap/lib/ModalTrigger')
7
+ helpers = require('../helpers')
7
8
  config = require('../../shared/config.json')
8
9
 
9
10
  module.exports = React.createClass
@@ -36,10 +37,10 @@ module.exports = React.createClass
36
37
  <nav className="navbar navbar-default" style={{padding:"0px",backgroundColor:"white",marginBottom:"5px"}}>
37
38
  <div className="container-fluid">
38
39
  <div className="navbar-header">
39
- <a className="navbar-brand" href={if config.icon_link then config.icon_link else "#/"} style={{paddingTop:"10px"}}>
40
+ <a className="navbar-brand" onClick={helpers.reload} href={if config.icon_link then config.icon_link else "#/"} style={{paddingTop:"10px"}}>
40
41
  <img alt="Brand" src="/images/icon.png" width="30" height="30" />
41
42
  </a>
42
- <a className="navbar-brand" href="#/">
43
+ <a className="navbar-brand" onClick={helpers.reload} href="#/">
43
44
  {config.title}
44
45
  </a>
45
46
  </div>
@@ -1,5 +1,6 @@
1
1
  # @cjsx React.DOM
2
2
  $ = require('jquery')
3
+ Backbone = require('backbone')
3
4
  React = require('react')
4
5
  Cards = require('./cards')
5
6
  CardCollection = require('../models/cards')
@@ -17,27 +18,22 @@ module.exports = React.createClass
17
18
  nextProps.cards.on 'sync', @forceUpdate.bind(@, null)
18
19
 
19
20
  atozParam: ()->
20
- query = $.extend {}, @props.cards.query
21
- query = $.extend query, {sort: 'title', order: 'asc', page: 1}
22
- delete query.seed
23
- $.param(query)
21
+ @queryParam {sort: 'title', order: 'asc', page: 1}, []
24
22
 
25
23
  latestParam: ()->
26
- query = $.extend {}, @props.cards.query
27
- query = $.extend query, {sort: 'updated_at', order: 'desc', page: 1}
28
- delete query.seed
29
- $.param(query)
24
+ @queryParam {sort: 'updated_at', order: 'desc', page: 1}, []
30
25
 
31
26
  randomParam: ()->
32
- query = $.extend {}, @props.cards.query
33
- query = $.extend query, {order: 'random', page: 1, seed: new Date().getTime()}
34
- delete query.sort
35
- delete query.page
36
- $.param(query)
27
+ @queryParam {order: 'random'}, ['sort', 'page']
37
28
 
38
29
  tagParam: (tag)->
30
+ @queryParam {tag: tag}, ['seed']
31
+
32
+ queryParam: (param, deleteKeys)->
39
33
  query = $.extend {}, @props.cards.query
40
- query = $.extend query, {tags: tag}
34
+ query = $.extend query, param
35
+ for key in deleteKeys
36
+ delete query[key]
41
37
  $.param(query)
42
38
 
43
39
  render: ->
@@ -47,9 +43,9 @@ module.exports = React.createClass
47
43
  <div className="row">
48
44
  <div className="col-sm-6" style={{padding:"0px"}}>
49
45
  <ul className="nav nav-pills">
50
- <li><a href={"#/?" + @atozParam()} style={{padding:'6px 12px',fontWeight: if @props.cards.query.sort == 'title' and @props.cards.query.order != 'random' then 'bold' else 'normal'}}>A to Z</a></li>
51
- <li><a href={"#/?" + @latestParam()} style={{padding:'6px 12px',fontWeight: if @props.cards.query.sort == 'updated_at' and @props.cards.query.order != 'random' then 'bold' else 'normal'}}>Latest</a></li>
52
- <li><a href={"#/?" + @randomParam()} style={{padding:'6px 12px',fontWeight: if @props.cards.query.order == 'random' then 'bold' else 'normal'}}>Random</a></li>
46
+ <li><a onClick={helpers.reload} href={"#/?" + @atozParam()} style={{padding:'6px 12px',fontWeight: if @props.cards.query.sort == 'title' and @props.cards.query.order != 'random' then 'bold' else 'normal'}}>A to Z</a></li>
47
+ <li><a onClick={helpers.reload} href={"#/?" + @latestParam()} style={{padding:'6px 12px',fontWeight: if @props.cards.query.sort == 'updated_at' and @props.cards.query.order != 'random' then 'bold' else 'normal'}}>Latest</a></li>
48
+ <li><a onClick={helpers.reload} href={"#/?" + @randomParam()} style={{padding:'6px 12px',fontWeight: if @props.cards.query.order == 'random' then 'bold' else 'normal'}}>Random</a></li>
53
49
  {
54
50
  if @props.cards.query.tags
55
51
  @props.cards.query.tags.split(',').map (tag)=>
@@ -64,7 +60,7 @@ module.exports = React.createClass
64
60
  <li>
65
61
  {
66
62
  if @props.cards.page
67
- <a href={"#/?" + @randomParam()} style={{padding:'6px 12px'}}>
63
+ <a onClick={helpers.reload} href={"#/?" + @randomParam()} style={{padding:'6px 12px'}}>
68
64
  <i className="glyphicon glyphicon-refresh" />
69
65
  </a>
70
66
  else
@@ -1,6 +1,8 @@
1
1
  # @cjsx React.DOM
2
+ Backbone = require('backbone')
2
3
  $ = require('jquery')
3
4
  React = require('react')
5
+ helpers = require('../helpers')
4
6
 
5
7
  module.exports = React.createClass
6
8
  displayName: 'Pagination'
@@ -29,7 +31,7 @@ module.exports = React.createClass
29
31
  <li style={width:'4.0em',textAlign:'center'}>
30
32
  {
31
33
  if @props.cards.page
32
- <a href={"#/?" + @pageParam(@props.cards.page.current)} style={{padding:'6px 12px'}}>
34
+ <a href={"#/?" + @pageParam(@props.cards.page.current)} onClick={helpers.reload} style={{padding:'6px 12px'}}>
33
35
  {@props.cards.page.current} / {@props.cards.page.total}
34
36
  </a>
35
37
  else
@@ -4,6 +4,7 @@ require 'mongoid'
4
4
  require 'mongoid_auto_increment_id'
5
5
  require 'will_paginate_mongoid'
6
6
  require 'mongoid-simple-tags'
7
+ require 'mongoid/geospatial'
7
8
  require 'carte/server/validators'
8
9
  require 'carte/server/models'
9
10
 
@@ -14,6 +15,7 @@ module Carte
14
15
  include Carte::Server::Models
15
16
 
16
17
  configure do
18
+ set :protection, :except => :path_traversal
17
19
  set :views, File.join(File.dirname(__FILE__), 'server/views')
18
20
  set :public_folder, 'public'
19
21
  set :script_path, '/app.js'
@@ -29,18 +31,19 @@ module Carte
29
31
  order = (params[:order] && %w(asc desc random).include?(params[:order])) ? params[:order] : 'desc'
30
32
  sort = (params[:sort] && %w(title created_at updated_at).include?(params[:sort])) ? params[:sort] : 'updated_at'
31
33
  if order == 'random'
32
- return Card.sample(9)
34
+ cards = Card.random
35
+ else
36
+ cards = Card.send(order, sort)
33
37
  end
34
- cards = Card.send(order, sort)
35
38
  if title = params[:title]
36
- cards = cards.any_of({title: /#{title}/})
39
+ cards = cards.any_of({title: /#{title}/i})
37
40
  end
38
41
  if params[:tags]
39
42
  tags = params[:tags].split(',')
40
43
  cards = cards.tagged_with_all(tags)
41
44
  end
42
45
  if content = params[:content]
43
- cards = cards.any_of({content: /#{content}/})
46
+ cards = cards.any_of({content: /#{content}/i})
44
47
  end
45
48
  cards = cards.paginate(per_page: 9, page: params[:page])
46
49
  end
@@ -6,10 +6,12 @@ module Carte
6
6
  include Mongoid::Timestamps
7
7
  include Mongoid::Attributes::Dynamic
8
8
  include Mongoid::Document::Taggable
9
+ include Mongoid::Geospatial
9
10
 
10
11
  field :title, type: String
11
12
  field :new_title, type: String
12
13
  field :content, type: String
14
+ field :random_point, type: Point, spatial: true
13
15
 
14
16
  index({title: 1}, {unique: true, name: "title_index"})
15
17
 
@@ -38,9 +40,13 @@ module Carte
38
40
  self.new_title = nil
39
41
  end
40
42
  end
43
+
44
+ before_create do
45
+ self.random_point = [Random.rand, 0]
46
+ end
41
47
 
42
- def self.sample(size=1)
43
- self.in(id: (1..self.count).to_a.sample(size))
48
+ def self.random
49
+ self.near(random_point: [Random.rand, 0])
44
50
  end
45
51
 
46
52
  def lefts(size=1)
@@ -44,4 +44,17 @@ namespace :carte do
44
44
  task :reset do
45
45
  Card.delete_all
46
46
  end
47
+
48
+ desc 'create indexes'
49
+ task :create_indexes do
50
+ Card.create_indexes
51
+ end
52
+
53
+ desc 'update random point'
54
+ task :update_random do
55
+ Card.all.each do |card|
56
+ card.random_point = [Random.rand, 0]
57
+ card.save!
58
+ end
59
+ end
47
60
  end
@@ -2,6 +2,6 @@ require 'sinatra/base'
2
2
 
3
3
  module Carte
4
4
  class Server < Sinatra::Base
5
- VERSION = "0.0.9"
5
+ VERSION = "0.0.10"
6
6
  end
7
7
  end
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "carte-client",
3
3
  "description": "something like dictionary, wiki, or information card",
4
- "version": "0.0.9",
4
+ "version": "0.0.10",
5
5
  "main": "lib/carte.coffee",
6
6
  "scripts": {
7
7
  "test": "echo \"Error: no test specified\" && exit 1"
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: carte-server
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.9
4
+ version: 0.0.10
5
5
  platform: ruby
6
6
  authors:
7
7
  - tily
@@ -192,6 +192,20 @@ dependencies:
192
192
  - - '>='
193
193
  - !ruby/object:Gem::Version
194
194
  version: '0'
195
+ - !ruby/object:Gem::Dependency
196
+ name: mongoid-geospatial
197
+ requirement: !ruby/object:Gem::Requirement
198
+ requirements:
199
+ - - '>='
200
+ - !ruby/object:Gem::Version
201
+ version: '0'
202
+ type: :runtime
203
+ prerelease: false
204
+ version_requirements: !ruby/object:Gem::Requirement
205
+ requirements:
206
+ - - '>='
207
+ - !ruby/object:Gem::Version
208
+ version: '0'
195
209
  description: something like dictionary, wiki, or information card
196
210
  email:
197
211
  - tidnlyam@gmail.com