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

167 lines
4.3 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 urls
html.forms
2008-05-24 22:49:48 -04:00
html.elements
html.components
2008-06-02 16:00:03 -04:00
furnace
furnace.boilerplate
furnace.auth.providers
furnace.auth.providers.db
furnace.auth.login
furnace.auth
furnace.actions
2008-06-17 01:10:46 -04:00
furnace.redirection
2008-06-16 04:34:17 -04:00
furnace.utilities
2008-06-02 16:00:03 -04:00
http.server
http.server.dispatchers ;
2008-05-24 22:49:48 -04:00
IN: webapps.user-admin
2008-06-02 16:00:03 -04:00
TUPLE: user-admin < dispatcher ;
2008-05-24 22:49:48 -04:00
: <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-06-02 16:00:03 -04:00
{ user-admin "user-list" } >>template ;
: init-capabilities ( -- )
capabilities get words>strings "capabilities" set-value ;
: validate-capabilities ( -- )
"capabilities" value
[ [ param empty? not ] keep set-value ] each ;
: selected-capabilities ( -- seq )
"capabilities" value [ value ] filter [ string>word ] map ;
: validate-user ( -- )
{
{ "username" [ v-username ] }
{ "realname" [ [ v-one-line ] v-optional ] }
{ "email" [ [ v-email ] v-optional ] }
} validate-params ;
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
[
"username" param <user> from-object
init-capabilities
2008-05-24 22:49:48 -04:00
] >>init
2008-06-02 16:00:03 -04:00
{ user-admin "new-user" } >>template
2008-05-24 22:49:48 -04:00
[
init-capabilities
validate-capabilities
validate-user
2008-05-26 01:47:27 -04:00
2008-05-24 22:49:48 -04:00
{
{ "new-password" [ v-password ] }
{ "verify-password" [ v-password ] }
} 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
selected-capabilities >>capabilities
2008-05-24 22:49:48 -04:00
insert-tuple
URL" $user-admin" <redirect>
2008-05-24 22:49:48 -04:00
] >>submit ;
2008-05-26 01:47:27 -04:00
: validate-username ( -- )
{ { "username" [ v-username ] } } validate-params ;
: select-capabilities ( seq -- )
[ t swap word>string set-value ] each ;
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-object ] [ capabilities>> select-capabilities ] bi
2008-05-24 22:49:48 -04:00
init-capabilities
2008-05-24 22:49:48 -04:00
] >>init
2008-06-02 16:00:03 -04:00
{ user-admin "edit-user" } >>template
2008-05-24 22:49:48 -04:00
[
"username" value <user> select-tuple
[ from-object ] [ capabilities>> select-capabilities ] bi
init-capabilities
validate-capabilities
validate-user
2008-05-26 01:47:27 -04:00
2008-05-24 22:49:48 -04:00
{
{ "new-password" [ [ v-password ] v-optional ] }
{ "verify-password" [ [ v-password ] v-optional ] }
} 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
selected-capabilities >>capabilities
2008-05-24 22:49:48 -04:00
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
update-tuple
URL" $user-admin" <redirect>
2008-05-24 22:49:48 -04:00
] >>submit ;
: <delete-user-action> ( -- action )
<action>
[
2008-05-26 01:47:27 -04:00
validate-username
2008-06-18 04:26:50 -04:00
"username" value <user> delete-tuples
URL" $user-admin" <redirect>
2008-05-24 22:49:48 -04:00
] >>submit ;
SYMBOL: can-administer-users?
can-administer-users? define-capability
: <user-admin> ( -- responder )
user-admin new-dispatcher
2008-09-27 12:38:20 -04:00
<user-list-action> "" add-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-06-02 16:00:03 -04:00
{ user-admin "user-admin" } >>template
<protected>
"administer users" >>description
{ can-administer-users? } >>capabilities ;
2008-05-24 22:49:48 -04:00
: make-admin ( username -- )
<user>
select-tuple
[ can-administer-users? suffix ] change-capabilities
update-tuple ;