factor/extra/webapps/user-admin/user-admin.factor

157 lines
4.4 KiB
Factor
Raw Normal View History

2008-05-24 22:49:48 -04:00
! Copyright (C) 2008 Slava Pestov.
! See http://factorcode.org/license.txt for BSD license.
USING: kernel sequences accessors namespaces combinators words
assocs db.tuples arrays splitting strings validators
html.elements
html.components
html.templates.chloe
http.server.boilerplate
http.server.auth.providers
http.server.auth.providers.db
http.server.auth.login
http.server.auth
http.server.sessions
http.server.actions
http.server ;
IN: webapps.user-admin
: admin-template ( name -- template )
"resource:extra/webapps/user-admin/" swap ".xml" 3append <chloe> ;
: words>strings ( seq -- seq' )
[ [ word-vocabulary ] [ drop ":" ] [ word-name ] tri 3append ] map ;
: strings>words ( seq -- seq' )
[ ":" split1 swap lookup ] map ;
: <user-list-action> ( -- action )
2008-05-26 01:47:27 -04:00
<page-action>
2008-05-24 22:49:48 -04:00
[ f <user> select-tuples "users" set-value ] >>init
2008-05-26 01:47:27 -04:00
"user-list" admin-template >>template ;
2008-05-24 22:49:48 -04:00
: <new-user-action> ( -- action )
2008-05-26 01:47:27 -04:00
<page-action>
2008-05-24 22:49:48 -04:00
[
2008-05-26 01:47:27 -04:00
"username" param <user> from-tuple
capabilities get words>strings "all-capabilities" set-value
2008-05-24 22:49:48 -04:00
] >>init
2008-05-26 01:47:27 -04:00
"new-user" admin-template >>template
2008-05-24 22:49:48 -04:00
[
2008-05-26 01:47:27 -04:00
capabilities get words>strings "all-capabilities" set-value
2008-05-24 22:49:48 -04:00
{
{ "username" [ v-username ] }
{ "realname" [ v-one-line ] }
{ "new-password" [ v-password ] }
{ "verify-password" [ v-password ] }
{ "email" [ [ v-email ] v-optional ] }
{ "capabilities" [ ] }
} validate-params
same-password-twice
user new "username" value >>username select-tuple
[ user-exists ] when
] >>validate
[
"username" value <user>
"realname" value >>realname
"email" value >>email
"new-password" value >>encoded-password
H{ } clone >>profile
insert-tuple
"$user-admin" f <standard-redirect>
] >>submit ;
2008-05-26 01:47:27 -04:00
: validate-username ( -- )
{ { "username" [ v-username ] } } validate-params ;
2008-05-24 22:49:48 -04:00
: <edit-user-action> ( -- action )
2008-05-26 01:47:27 -04:00
<page-action>
2008-05-24 22:49:48 -04:00
[
2008-05-26 01:47:27 -04:00
validate-username
2008-05-24 22:49:48 -04:00
2008-05-26 01:47:27 -04:00
"username" value <user> select-tuple
[ from-tuple ] [ capabilities>> words>strings "capabilities" set-value ] bi
2008-05-24 22:49:48 -04:00
2008-05-26 01:47:27 -04:00
capabilities get words>strings "all-capabilities" set-value
2008-05-24 22:49:48 -04:00
] >>init
2008-05-26 01:47:27 -04:00
"edit-user" admin-template >>template
2008-05-24 22:49:48 -04:00
[
2008-05-26 01:47:27 -04:00
capabilities get words>strings "all-capabilities" set-value
2008-05-24 22:49:48 -04:00
{
{ "username" [ v-username ] }
{ "realname" [ v-one-line ] }
{ "new-password" [ [ v-password ] v-optional ] }
{ "verify-password" [ [ v-password ] v-optional ] }
{ "email" [ [ v-email ] v-optional ] }
{ "capabilities" [ ] }
} validate-params
"new-password" "verify-password"
2008-05-26 01:47:27 -04:00
[ value empty? not ] either? [
2008-05-24 22:49:48 -04:00
same-password-twice
2008-05-26 01:47:27 -04:00
] when
2008-05-24 22:49:48 -04:00
] >>validate
[
"username" value <user> select-tuple
"realname" value >>realname
"email" value >>email
2008-05-26 01:47:27 -04:00
"new-password" value empty? [
2008-05-24 22:49:48 -04:00
"new-password" value >>encoded-password
2008-05-26 01:47:27 -04:00
] unless
2008-05-24 22:49:48 -04:00
"capabilities" value {
{ [ dup string? ] [ 1array ] }
{ [ dup array? ] [ ] }
} cond strings>words >>capabilities
update-tuple
"$user-admin" f <standard-redirect>
] >>submit ;
: <delete-user-action> ( -- action )
<action>
[
2008-05-26 01:47:27 -04:00
validate-username
2008-05-24 22:49:48 -04:00
[ <user> select-tuple 1 >>deleted update-tuple ]
[ logout-all-sessions ]
bi
"$user-admin" f <standard-redirect>
] >>submit ;
TUPLE: user-admin < dispatcher ;
SYMBOL: can-administer-users?
can-administer-users? define-capability
: <user-admin> ( -- responder )
user-admin new-dispatcher
2008-05-26 01:47:27 -04:00
<user-list-action> "list" add-main-responder
2008-05-24 22:49:48 -04:00
<new-user-action> "new" add-responder
<edit-user-action> "edit" add-responder
<delete-user-action> "delete" add-responder
<boilerplate>
2008-05-26 01:47:27 -04:00
"user-admin" admin-template >>template
2008-05-24 22:49:48 -04:00
{ can-administer-users? } <protected> ;
: make-admin ( username -- )
<user>
select-tuple
[ can-administer-users? suffix ] change-capabilities
update-tuple ;