예제 #1
0
        public async Task <IActionResult> Create([FromBody] AccountCreateRequest request)
        {
            if (!ModelState.IsValid)
            {
                return(new StatusCodeResult((int)HttpStatusCode.BadRequest));
            }

            try
            {
                //check if account already exists
                var userName      = request.Email.Substring(0, request.Email.IndexOf("@", StringComparison.Ordinal));
                var accountExists = _accountRepository
                                    .GetByUserName(userName)
                                    != null;

                if (!accountExists)
                {
                    //generate a new api key
                    var apiKey = "ARNIS-" + Guid.NewGuid().ToString().ToUpper().Substring(0, 4);

                    //create client account
                    var account = new Account
                    {
                        UserName = userName,
                        Email    = request.Email,
                        ApiKey   = apiKey
                    };
                    await _accountRepository.Create(account);

                    //create default workspace
                    var workspace = new Workspace
                    {
                        AccountId   = account.Id,
                        Name        = "default",
                        Description = "Default workspace",
                        Owners      = new List <string> {
                            account.UserName
                        },
                        Solutions = new List <Solution>()
                    };
                    await _workspaceRepository.Create(workspace);

                    string baseUri           = "http://arnis.azurewebsites.net";
                    string accountLocation   = $"{baseUri}/{account.UserName.ToLower()}";
                    string workspaceLocation = $"{baseUri}/{account.UserName.ToLower()}/{workspace.Name.ToLower()}";

                    HttpContext.Response.StatusCode = (int)HttpStatusCode.OK;
                    HttpContext.Response.Headers.Add("Location", accountLocation);
                    var responseDto = new
                    {
                        userName = request.UserName,
                        email    = request.Email,
                        apiKey,
                        accountUri   = accountLocation,
                        workspaceUri = workspaceLocation
                    };

                    return(new OkObjectResult(responseDto));
                }
                else
                {
                    HttpContext.Response.StatusCode = (int)HttpStatusCode.BadRequest;
                    return(new ObjectResult(new
                    {
                        errorMessage = "Username already exists."
                    }));
                }
            }
            catch (Exception ex)
            {
                HttpContext.Response.StatusCode = (int)HttpStatusCode.InternalServerError;
                return(new ObjectResult(new
                {
                    errorMessage = ex.Message,
                    errorDetails = ex.ToString()
                }));
            }
        }
예제 #2
0
        public IActionResult Create([FromBody] WorkspaceCreateRequest workspaceDto)
        {
            if (!ModelState.IsValid)
            {
                return(new StatusCodeResult((int)HttpStatusCode.BadRequest));
            }

            try
            {
                //validate api key
                var account = _accountRepository
                              .GetByApiKey(workspaceDto.ApiKey);

                if (null != account)
                {
                    //find the workspace
                    var workspace = _workspaceRepository.GetByName(account.Id, workspaceDto.Name);

                    //create new workspace
                    if (null == workspace)
                    {
                        workspace = new Workspace
                        {
                            AccountId = account.Id,

                            Name        = workspaceDto.Name,
                            Description = workspaceDto.Description,
                            Owners      = workspaceDto.Owners,
                            Solutions   = workspaceDto.Solutions,
                            Logs        = workspaceDto.Logs
                        };
                        _workspaceRepository.Create(workspace);
                    }
                    //update existing workspace
                    else
                    {
                        workspace.Solutions   = workspaceDto.Solutions;
                        workspace.Logs        = workspace.Logs;
                        workspace.DateUpdated = DateTime.UtcNow;
                        _workspaceRepository.Update(workspace);
                    }

                    //process workspace statistics

                    string baseUri           = "http://arnis.azurewebsites.net";
                    string workspaceLocation = $"{baseUri}/{account.UserName.ToLower()}/{workspace.Name.ToLower()}";
                    HttpContext.Response.StatusCode = (int)HttpStatusCode.OK;
                    HttpContext.Response.Headers.Add("Location", workspaceLocation);

                    var responseDto = new
                    {
                        workspace    = workspace.Name,
                        workspaceUri = workspaceLocation
                    };

                    return(new OkObjectResult(responseDto));
                }
                else
                {
                    HttpContext.Response.StatusCode = (int)HttpStatusCode.Unauthorized;
                }
            }
            catch (Exception ex)
            {
                HttpContext.Response.StatusCode = (int)HttpStatusCode.InternalServerError;
                return(new ObjectResult(new
                {
                    errorMessage = ex.Message,
                    errorDetails = ex.ToString()
                }));
            }

            return(new StatusCodeResult((int)HttpStatusCode.BadRequest));
        }