NAME
    CPANLists::Server - Application that runs on cpanlists.org

VERSION
    This document describes version 0.02 of CPANLists::Server (from Perl
    distribution CPANLists-Server), released on 2014-05-17.

SYNOPSIS
    You probably do not want to install this. This distribution contains the
    code to run on cpanlists.org.

    For the client program, see App::cpanlists.

DESCRIPTION
    Currently to use this module, you have to do two things. This is ugly
    and might change in the future.

    *   Set database handle at startup

         $dbh = DBI->connect(...);
         CPANLists::Server::__dbh($dbh);

    *   Set PSGI environment for each request

        Mainly so that __activity_log() can get REMOTE_ADDR etc from PSGI
        environment.

         CPANLists::Server::__env($env);

FUNCTIONS
  add_item(%args) -> [status, msg, result, meta]
    Add an item to a list.

    Arguments ('*' denotes required arguments):

    *   comment => *str*

        Comment.

        Will be interpreted as Markdown

    *   list_id* => *int*

    *   name* => *str*

        Item's name (i.e. module name/CPAN ID).

    *   rating => *int*

        Rating.

    Return value:

    Returns an enveloped result (an array).

    First element (status) is an integer containing HTTP status code (200
    means OK, 4xx caller error, 5xx function error). Second element (msg) is
    a string containing error message, or 'OK' if status is 200. Third
    element (result) is optional, the actual result. Fourth element (meta)
    is called result metadata and is optional, a hash that contains extra
    information.

  add_list_comment(%args) -> [status, msg, result, meta]
    Add a comment to a list.

    Arguments ('*' denotes required arguments):

    *   comment* => *str*

        Comment.

        Will be interpreted as Markdown

    *   list_id* => *int*

    Return value:

    Returns an enveloped result (an array).

    First element (status) is an integer containing HTTP status code (200
    means OK, 4xx caller error, 5xx function error). Second element (msg) is
    a string containing error message, or 'OK' if status is 200. Third
    element (result) is optional, the actual result. Fourth element (meta)
    is called result metadata and is optional, a hash that contains extra
    information.

  auth_user(%args) -> [status, msg, result, meta]
    Check username and password against database.

    Upon success, will return a hash of information, currently: "id" (user
    numeric ID), "email".

    Arguments ('*' denotes required arguments):

    *   password* => *str*

    *   username* => *str*

    Return value:

    Returns an enveloped result (an array).

    First element (status) is an integer containing HTTP status code (200
    means OK, 4xx caller error, 5xx function error). Second element (msg) is
    a string containing error message, or 'OK' if status is 200. Third
    element (result) is optional, the actual result. Fourth element (meta)
    is called result metadata and is optional, a hash that contains extra
    information.

  check_session(%args) -> [status, msg, result, meta]
    Check if session with certain ID exists and not expired.

    Arguments ('*' denotes required arguments):

    *   id* => *str*

    Return value:

    Returns an enveloped result (an array).

    First element (status) is an integer containing HTTP status code (200
    means OK, 4xx caller error, 5xx function error). Second element (msg) is
    a string containing error message, or 'OK' if status is 200. Third
    element (result) is optional, the actual result. Fourth element (meta)
    is called result metadata and is optional, a hash that contains extra
    information.

    Session information (any)

  create_list(%args) -> [status, msg, result, meta]
    Create a new list.

    Arguments ('*' denotes required arguments):

    *   description => *str*

        A longer (one to several paragraphs) of description.

        Will be interpreted as Markdown.

        For module lists, module names in the form of "Foo::bar" or
        "mod://Foo::bar" or "mod://foo" will be detected and added as items
        if indeed are CPAN module names.

    *   items => *array*

        List items.

        Alternatively, you can leave this empty and add items one-by-one
        using add_item().

    *   name* => *str*

        The list title.

        Examples: "Steven's most favorite modules", "Steven's favorite
        authors", "Modules to do blah", "Top ten modules you'll want for
        christmas 2014".

    *   scan_modules_from_description => *bool* (default: 0)

        Whether to scan module names from description and add them as items
        (for module lists only).

    *   tags => *array*

        Tags.

    *   type* => *str*

        List type, either m (for modules) or a (authors).

    Return value:

    Returns an enveloped result (an array).

    First element (status) is an integer containing HTTP status code (200
    means OK, 4xx caller error, 5xx function error). Second element (msg) is
    a string containing error message, or 'OK' if status is 200. Third
    element (result) is optional, the actual result. Fourth element (meta)
    is called result metadata and is optional, a hash that contains extra
    information.

  create_or_get_session(%args) -> [status, msg, result, meta]
    Arguments ('*' denotes required arguments):

    *   username* => *str*

    Return value:

    Returns an enveloped result (an array).

    First element (status) is an integer containing HTTP status code (200
    means OK, 4xx caller error, 5xx function error). Second element (msg) is
    a string containing error message, or 'OK' if status is 200. Third
    element (result) is optional, the actual result. Fourth element (meta)
    is called result metadata and is optional, a hash that contains extra
    information.

  create_user(%args) -> [status, msg, result, meta]
    Arguments ('*' denotes required arguments):

    *   email* => *str*

    *   first_name => *str*

    *   last_name => *str*

    *   note => *str*

    *   password* => *str*

    *   username* => *str*

    Return value:

    Returns an enveloped result (an array).

    First element (status) is an integer containing HTTP status code (200
    means OK, 4xx caller error, 5xx function error). Second element (msg) is
    a string containing error message, or 'OK' if status is 200. Third
    element (result) is optional, the actual result. Fourth element (meta)
    is called result metadata and is optional, a hash that contains extra
    information.

  delete_item(%args) -> [status, msg, result, meta]
    Delete an item from a list.

    Arguments ('*' denotes required arguments):

    *   list_id* => *int*

    *   name* => *str*

        Item's name (i.e. module name/CPAN ID).

    Return value:

    Returns an enveloped result (an array).

    First element (status) is an integer containing HTTP status code (200
    means OK, 4xx caller error, 5xx function error). Second element (msg) is
    a string containing error message, or 'OK' if status is 200. Third
    element (result) is optional, the actual result. Fourth element (meta)
    is called result metadata and is optional, a hash that contains extra
    information.

  delete_list(%args) -> [status, msg, result, meta]
    Delete a list.

    Arguments ('*' denotes required arguments):

    *   id* => *int*

    *   reason => *str*

        Optional reason for deletion.

    Return value:

    Returns an enveloped result (an array).

    First element (status) is an integer containing HTTP status code (200
    means OK, 4xx caller error, 5xx function error). Second element (msg) is
    a string containing error message, or 'OK' if status is 200. Third
    element (result) is optional, the actual result. Fourth element (meta)
    is called result metadata and is optional, a hash that contains extra
    information.

  delete_list_comment(%args) -> [status, msg, result, meta]
    Delete a single list comment.

    Arguments ('*' denotes required arguments):

    *   id* => *int*

    *   reason => *str*

        Optional reason for deletion.

    Return value:

    Returns an enveloped result (an array).

    First element (status) is an integer containing HTTP status code (200
    means OK, 4xx caller error, 5xx function error). Second element (msg) is
    a string containing error message, or 'OK' if status is 200. Third
    element (result) is optional, the actual result. Fourth element (meta)
    is called result metadata and is optional, a hash that contains extra
    information.

  get_bitcard_signin_url() -> [status, msg, result, meta]
    Get signin URL via BitCard API (bitcard.org).

    To signin via BitCard, first call this function. You will get login URL
    (to bitcard.org). Go to the login URL and enter your credentials.
    Afterwards, if the login is correct, you will get return URL like, which
    you need to follow:

        https://cpanlists.org/api/verify_bitcard_signin?bc_confirmed=1&...

    Either follow this URL, or pass the parameters to the
    "verify_bitcard_signin" function yourself. If signin is verified, a
    success status (200) will be returned along with session ID to use.
    Session ID can be used as password in HTTP authenticaion e.g.:

        curl -u USERNAME:SESSION_ID https://cpanlists.org/api/SOME_FUNC?PARAM1=...

    By default session ID can be used for 6 (six) months. If session is
    expired, you can signin again.

    No arguments.

    Return value:

    Returns an enveloped result (an array).

    First element (status) is an integer containing HTTP status code (200
    means OK, 4xx caller error, 5xx function error). Second element (msg) is
    a string containing error message, or 'OK' if status is 200. Third
    element (result) is optional, the actual result. Fourth element (meta)
    is called result metadata and is optional, a hash that contains extra
    information.

  get_list(%args) -> [status, msg, result, meta]
    Get details about a list.

    Arguments ('*' denotes required arguments):

    *   id* => *int*

    *   items => *bool* (default: 1)

        Whether to retrieve list's items.

    Return value:

    Returns an enveloped result (an array).

    First element (status) is an integer containing HTTP status code (200
    means OK, 4xx caller error, 5xx function error). Second element (msg) is
    a string containing error message, or 'OK' if status is 200. Third
    element (result) is optional, the actual result. Fourth element (meta)
    is called result metadata and is optional, a hash that contains extra
    information.

  get_list_comment(%args) -> [status, msg, result, meta]
    Get a single list comment.

    Arguments ('*' denotes required arguments):

    *   id* => *int*

    Return value:

    Returns an enveloped result (an array).

    First element (status) is an integer containing HTTP status code (200
    means OK, 4xx caller error, 5xx function error). Second element (msg) is
    a string containing error message, or 'OK' if status is 200. Third
    element (result) is optional, the actual result. Fourth element (meta)
    is called result metadata and is optional, a hash that contains extra
    information.

  get_user(%args) -> [status, msg, result, meta]
    Get user information either by email or username.

    Arguments ('*' denotes required arguments):

    *   email => *str*

    *   username => *str*

    Return value:

    Returns an enveloped result (an array).

    First element (status) is an integer containing HTTP status code (200
    means OK, 4xx caller error, 5xx function error). Second element (msg) is
    a string containing error message, or 'OK' if status is 200. Third
    element (result) is optional, the actual result. Fourth element (meta)
    is called result metadata and is optional, a hash that contains extra
    information.

  like_list(%args) -> [status, msg, result, meta]
    Like a list.

    You are allowed to like your own list.

    Arguments ('*' denotes required arguments):

    *   id* => *int*

        List ID.

    Return value:

    Returns an enveloped result (an array).

    First element (status) is an integer containing HTTP status code (200
    means OK, 4xx caller error, 5xx function error). Second element (msg) is
    a string containing error message, or 'OK' if status is 200. Third
    element (result) is optional, the actual result. Fourth element (meta)
    is called result metadata and is optional, a hash that contains extra
    information.

  list_items(%args) -> [status, msg, result, meta]
    List items of a list.

    Arguments ('*' denotes required arguments):

    *   list_id* => *int*

    Return value:

    Returns an enveloped result (an array).

    First element (status) is an integer containing HTTP status code (200
    means OK, 4xx caller error, 5xx function error). Second element (msg) is
    a string containing error message, or 'OK' if status is 200. Third
    element (result) is optional, the actual result. Fourth element (meta)
    is called result metadata and is optional, a hash that contains extra
    information.

  list_list_comments(%args) -> [status, msg, result, meta]
    List comments to a list.

    Arguments ('*' denotes required arguments):

    *   id => *int*

    *   list_id* => *int*

    Return value:

    Returns an enveloped result (an array).

    First element (status) is an integer containing HTTP status code (200
    means OK, 4xx caller error, 5xx function error). Second element (msg) is
    a string containing error message, or 'OK' if status is 200. Third
    element (result) is optional, the actual result. Fourth element (meta)
    is called result metadata and is optional, a hash that contains extra
    information.

  list_lists(%args) -> [status, msg, result, meta]
    List available lists.

    Arguments ('*' denotes required arguments):

    *   creator => *str*

    *   has_tags => *array*

        Only include lists containing these tags.

    *   id => *int*

    *   lacks_tags => *array*

        Only include lists not containing these tags.

    *   query => *str*

    *   result_limit => *int* (default: 5000)

        Limit number of results.

    *   type => *str*

        Filter only certain type of lists ("a" means lists of authors only,
        "m" means lists of modules only).

    Return value:

    Returns an enveloped result (an array).

    First element (status) is an integer containing HTTP status code (200
    means OK, 4xx caller error, 5xx function error). Second element (msg) is
    a string containing error message, or 'OK' if status is 200. Third
    element (result) is optional, the actual result. Fourth element (meta)
    is called result metadata and is optional, a hash that contains extra
    information.

  unlike_list(%args) -> [status, msg, result, meta]
    Unlike a list.

    Arguments ('*' denotes required arguments):

    *   id* => *int*

        List ID.

    Return value:

    Returns an enveloped result (an array).

    First element (status) is an integer containing HTTP status code (200
    means OK, 4xx caller error, 5xx function error). Second element (msg) is
    a string containing error message, or 'OK' if status is 200. Third
    element (result) is optional, the actual result. Fourth element (meta)
    is called result metadata and is optional, a hash that contains extra
    information.

  update_item(%args) -> [status, msg, result, meta]
    Update a list item.

    Arguments ('*' denotes required arguments):

    *   list_id* => *int*

    *   name* => *str*

        Item's name.

    *   new_comment => *str*

        Item's new comment.

        If not specified, comment will not be changed

    *   new_rating => *str*

        Item's new rating.

        If not specified, rating will not be changed

    Return value:

    Returns an enveloped result (an array).

    First element (status) is an integer containing HTTP status code (200
    means OK, 4xx caller error, 5xx function error). Second element (msg) is
    a string containing error message, or 'OK' if status is 200. Third
    element (result) is optional, the actual result. Fourth element (meta)
    is called result metadata and is optional, a hash that contains extra
    information.

  update_list(%args) -> [status, msg, result, meta]
    Update a list.

    Arguments ('*' denotes required arguments):

    *   id* => *int*

    *   new_description => *str*

        List's new description.

        If not specified, description will not be changed

    *   new_items => *array*

        List's new items.

        If not specified, items will not be changed

    *   new_name => *str*

        List's new name.

        If not specified, name will not be changed

    *   new_tags => *array*

        List's new tags.

        If not specified, tags will not be changed

    Return value:

    Returns an enveloped result (an array).

    First element (status) is an integer containing HTTP status code (200
    means OK, 4xx caller error, 5xx function error). Second element (msg) is
    a string containing error message, or 'OK' if status is 200. Third
    element (result) is optional, the actual result. Fourth element (meta)
    is called result metadata and is optional, a hash that contains extra
    information.

  update_list_comment(%args) -> [status, msg, result, meta]
    Update a list comment.

    Arguments ('*' denotes required arguments):

    *   id* => *int*

    *   new_comment => *str*

        Comment.

        If not specified, comment will not be replaced.

        Will be interpreted as Markdown.

    Return value:

    Returns an enveloped result (an array).

    First element (status) is an integer containing HTTP status code (200
    means OK, 4xx caller error, 5xx function error). Second element (msg) is
    a string containing error message, or 'OK' if status is 200. Third
    element (result) is optional, the actual result. Fourth element (meta)
    is called result metadata and is optional, a hash that contains extra
    information.

  verify_bitcard_signin(%args) -> [status, msg, result, meta]
    Verify URL parameters returned by BitCard.

    See "get_bitcard_signin_url" for more information on signing in via
    BitCard.

    Arguments ('*' denotes required arguments):

    *   bc_confirmed => *any*

    *   bc_email => *any*

    *   bc_fields => *any*

    *   bc_id => *any*

    *   bc_name => *any*

    *   bc_sig => *any*

    *   bc_ts => *any*

    *   bc_username => *any*

    *   bc_version => *any*

    Return value:

    Returns an enveloped result (an array).

    First element (status) is an integer containing HTTP status code (200
    means OK, 4xx caller error, 5xx function error). Second element (msg) is
    a string containing error message, or 'OK' if status is 200. Third
    element (result) is optional, the actual result. Fourth element (meta)
    is called result metadata and is optional, a hash that contains extra
    information.

    Session ID (hash) =head1 TODO

SEE ALSO
    App::cpanlists

HOMEPAGE
    Please visit the project's homepage at
    <https://metacpan.org/release/CPANLists-Server>.

SOURCE
    Source repository is at
    <https://github.com/sharyanto/perl-CPANLists-Server>.

BUGS
    Please report any bugs or feature requests on the bugtracker website
    <https://rt.cpan.org/Public/Dist/Display.html?Name=CPANLists-Server>

    When submitting a bug or request, please include a test-file or a patch
    to an existing test-file that illustrates the bug or desired feature.

AUTHOR
    Steven Haryanto <stevenharyanto@gmail.com>

COPYRIGHT AND LICENSE
    This software is copyright (c) 2014 by Steven Haryanto.

    This is free software; you can redistribute it and/or modify it under
    the same terms as the Perl 5 programming language system itself.

