namespace perl Tappy
namespace js Tappy

// @validate range 1-10000
typedef i32 account_id

// @validate length 1-8
typedef string username

// @validate regex {^[^ ]+$}
typedef string password

/*
    A structure representing an account
*/
struct account {
    1: account_id id,
    2: i32        allocation,
    3: optional bool is_admin,
}

exception insufficientResources {
    1: i16    code,
    2: string message
}

exception genericCode {
    1: i16    code,
    2: string message
}

/*
    The accounts service provides various methods to create new accounts
*/
service Accounts {
    /*
        Create a new account

        (start code)
        post {
            username: "franklin",
            password: "secretsauce"
        }
        returns {
            id: 12345,
            allocation: 94
        }
        (end)

        @rest POST /accounts
    */
    account createAccount (
        1: username username, # The username
        2: password password, # The account password @validate length 1-
        3: bool is_admin,     # @optional
    )
    throws (
        1: insufficientResources insufficient,
        2: genericCode code
    ),

    /*
        Get an account by username
        @rest GET /account/:username
    */
    account getAccount (
        1: username username
    )
    throws (
        1: genericCode code
    )
}