allow user to create a draft post but not publish wordpress

Use wp_insert_post_data filter. Then check the user role. If user have specific role set-up post status. ( I don’t test below script)

add_filter( 'wp_insert_post_data', 'filter_handler', '99');

function filter_handler( $data ) {
    $user = wp_get_current_user();
    $userRole = $user->roles ? $user->roles[0] : false;

    if ( $userRole === 'author') {
        $data['post_status'] = 'pending';
    }

    return $data;
}