Skip to content

Commit

Permalink
Add admin page for editing prepaids
Browse files Browse the repository at this point in the history
  • Loading branch information
phoenixeliot committed Aug 9, 2017
1 parent b19cde7 commit 7c47a0d
Show file tree
Hide file tree
Showing 8 changed files with 121 additions and 0 deletions.
1 change: 1 addition & 0 deletions app/core/Router.coffee
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,7 @@ module.exports = class CocoRouter extends Backbone.Router
'admin/base': go('admin/BaseView')
'admin/demo-requests': go('admin/DemoRequestsView')
'admin/trial-requests': go('admin/TrialRequestsView')
'admin/prepaids': go('admin/PrepaidsAdminView')
'admin/user-code-problems': go('admin/UserCodeProblemsView')
'admin/pending-patches': go('admin/PendingPatchesView')
'admin/codelogs': go('admin/CodeLogsView')
Expand Down
9 changes: 9 additions & 0 deletions app/core/api/prepaids.coffee
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,15 @@ fetchJson = require './fetch-json'

module.exports = {
url: (prepaidID, path) -> if path then "/db/prepaid/#{prepaidID}/#{path}" else "/db/prepaid/#{prepaidID}"

get: ({ prepaidID }, options) ->
fetchJson(@url(prepaidID), options)

put: ({ prepaid }, options) ->
fetchJson(@url(prepaid._id), _.assign({}, options, {
method: 'PUT',
json: prepaid
}))

addJoiner: ({ prepaidID, userID }, options={}) ->
fetchJson(@url(prepaidID, 'joiners'), _.assign {}, options, {
Expand Down
5 changes: 5 additions & 0 deletions app/styles/admin/prepaid-admin-view.sass
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
#prepaids-admin-view
.prepaid
border: 1px solid black
border-radius: 3px
padding: 15px
2 changes: 2 additions & 0 deletions app/templates/admin.jade
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,8 @@ block content
a(href="/admin/trial-requests") Trial Requests
li
a(href="/admin/user-code-problems") User Code Problems
li
a(href="/admin/prepaids") Prepaids/Licenses

h4 Analytics
ul
Expand Down
29 changes: 29 additions & 0 deletions app/templates/admin/prepaids-admin-view.jade
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
// DNT
flat-layout
.container
form(action="")
label
| Prepaid ID:
input(v-model="searchInput")
button(@click.prevent="searchForPrepaid")
| Search
.prepaid(v-for="prepaid in prepaids")
ul
li
| id: {{ prepaid._id }}
li
| creator: {{ prepaid.creator }}
li
="startDate: "
input(v-model="prepaid.startDate")
=" "
| {{ formatDate(prepaid.startDate) }}
li
="endDate: "
input(v-model="prepaid.endDate")
=" "
| {{ formatDate(prepaid.endDate) }}
li
button(@click.prevent="savePrepaid(prepaid)")
| Save prepaid
{{ savedStatus[prepaid._id] }}
43 changes: 43 additions & 0 deletions app/views/admin/PrepaidsAdminView.coffee
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
template = require 'templates/base-flat'
require('vendor/co')
api = require 'core/api'
FlatLayout = require 'core/components/FlatLayout'
store = require('core/store')

PrepaidsAdminView = Vue.extend
name: 'prepaids-admin-view'
template: require('templates/admin/prepaids-admin-view')()
components:
'flat-layout': FlatLayout
props: {}
created: ->
data: ->
searchInput: '59162c58e5816532e0e69634'
prepaids: []
savedStatus: {}
computed:
{}
methods:
formatDate: (date) ->
moment(date).format('dddd, MMM Do, YYYY, h:mma ZZ')
searchForPrepaid: co.wrap ->
prepaid = yield api.prepaids.get({ prepaidID: @searchInput })
@prepaids = [prepaid]
@savedStatus[prepaid._id] = null
savePrepaid: co.wrap (prepaid) ->
console.log "Saving prepaid:", prepaid.endDate
index = _.findIndex(@prepaids, {_id: prepaid._id})
try
result = yield api.prepaids.put({ prepaid })
console.log result
console.log "Result from PUT:", result.endDate
savedPrepaid = yield api.prepaids.get({ prepaidID: prepaid._id })
console.log "Result from GET:", savedPrepaid.endDate
Vue.set(@prepaids, index, savedPrepaid)
Vue.set(@savedStatus, prepaid._id, 'saved')
catch e
console.log e
@savedStatus[prepaid._id] = 'error'

VueWrapper = require('views/core/VueWrapper')
module.exports = VueWrapper.RootComponent(PrepaidsAdminView)
31 changes: 31 additions & 0 deletions server/middleware/prepaids.coffee
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,37 @@ module.exports =
yield delighted.checkTriggerPrepaidAdded user, req.body.type
res.status(201).send(prepaid.toObject())

# Update a prepaid manually (as an admin)
put: wrap (req, res) ->
validTypes = ['course', 'starter_license']
unless req.body.type in validTypes
throw new errors.UnprocessableEntity("Prepaid type must be one of: #{validTypes}.")
# TODO: deprecate or refactor other prepaid types

if req.body.creator
user = yield User.search(req.body.creator)
if not user
throw new errors.NotFound('User not found')
req.body.creator = user.id

prepaid = yield database.getDocFromHandle(req, Prepaid)

console.log prepaid.toObject()
prepaid.set 'startDate', req.body.startDate
prepaid.set 'endDate', req.body.endDate

database.validateDoc(prepaid)
console.log prepaid.toObject()
oldCreator = prepaid.creator
console.log req.body.creator is oldCreator+''
console.log typeof req.body.creator, typeof (oldCreator+'')
console.log typeof req.body.creator, typeof (oldCreator+'')
yield prepaid.save()
console.log prepaid.toObject()
if req.body.creator isnt (oldCreator+'')
yield delighted.checkTriggerPrepaidAdded user, req.body.type
res.status(201).send(prepaid.toObject())


redeem: wrap (req, res) ->
if not req.user?.isTeacher()
Expand Down
1 change: 1 addition & 0 deletions server/routes/index.coffee
Original file line number Diff line number Diff line change
Expand Up @@ -213,6 +213,7 @@ module.exports.setup = (app) ->
app.post('/db/starter-license-prepaid', mw.auth.checkLoggedIn(), mw.prepaids.purchaseStarterLicenses)
app.post('/db/prepaid/:handle/redeemers', mw.prepaids.redeem)
app.post('/db/prepaid/:handle/joiners', mw.prepaids.addJoiner)
app.put('/db/prepaid/:handle', mw.auth.checkHasPermission(['admin']), mw.prepaids.put)
app.delete('/db/prepaid/:handle/redeemers', mw.prepaids.revoke)

app.get('/db/products', mw.auth.checkHasUser(), mw.products.get)
Expand Down

0 comments on commit 7c47a0d

Please sign in to comment.