initial work on adding models for starring repos.

I'm sick of using `git stash`.
This commit is contained in:
Jimmy Zelinskie 2014-11-19 14:50:56 -05:00
parent f3259c862b
commit eb956e5b7d
5 changed files with 197 additions and 16 deletions

View file

@ -9,10 +9,12 @@ from app import app, billing as stripe, authentication, avatar
from endpoints.api import (ApiResource, nickname, resource, validate_json_request, request_error,
log_action, internal_only, NotFound, require_user_admin, parse_args,
query_param, InvalidToken, require_scope, format_date, hide_if, show_if,
license_error, require_fresh_login, path_param, define_json_response)
license_error, require_fresh_login, path_param, define_json_response,
RepositoryParamResource)
from endpoints.api.subscribe import subscribe
from endpoints.common import common_login
from endpoints.api.team import try_accept_invite
from endpoints.api.repository import repo_view
from data import model
from data.billing import get_plan
@ -247,7 +249,6 @@ class User(ApiResource):
raise request_error(message='Username is already in use')
model.change_username(user, new_username)
except model.InvalidPasswordException, ex:
raise request_error(exception=ex)
@ -663,3 +664,75 @@ class UserAuthorization(ApiResource):
access_token.delete_instance(recursive=True, delete_nullable=True)
return 'Deleted', 204
@resource('/v1/user/starred')
class StarredRepositoryList(ApiResource):
""" Operations for creating and listing starred repositories. """
schemas = {
'NewStarredRepository': {
'id': 'NewStarredRepository',
'type': 'object',
'required': [
'namespace',
'repository',
],
'properties': {
'namespace': {
'type': 'string',
'description': 'Namespace in which the repository belongs',
},
'repository': {
'type': 'string',
'description': 'Repository name'
}
}
}
}
@require_scope(scopes.READ_REPO)
@nickname('listStarredRepos')
@parse_args
@query_param('page', 'Offset page number. (int)', type=int)
@query_param('limit', 'Limit on the number of results (int)', type=int)
def get(self):
""" List all starred repositories. """
page = args['page']
limit = args['limit']
starred_repos = list(get_user_starred_repositories(get_authenticated_user(), page=page, limit=limit))
return {'repositories': [repo_view(repo) for repo in starred_repos]}
@require_scope(scopes.READ_REPO)
@nickname('createStar')
@validate_json_request('NewStarredRepository')
def post(self):
""" Star a repository. """
user = get_authenticated_user()
req = request.get_json()
namespace = req['namespace']
repository = req['repository']
repo = model.get_repository(namespace, repository)
if repo:
model.star_repository(user, repo)
log_action('star_repository', user.username, namespace,
{'repo': repository, 'namespace': namespace})
return {
'namespace': namespace,
'repository': repository,
}, 201
raise NotFound()
@resource('/v1/user/starred/<repopath:repository>')
class StarredRepository(RepositoryParamResource):
""" Operations for managing a specific starred repository. """
@nickname('deleteStar')
def delete(self, namespace, repository):
user = get_authenticated_user()
repo = model.get_repository(namespace, repository)
if repo:
model.unstar_repository(user, repo)
log_action('unstar_repository', user.username, namespace,
{'repo': repository, 'namespace': namespace})
return 'Deleted', 204
raise NotFound()