Esempio n. 1
0
        public ActionResult <dynamic> Get()
        {
            string authorization = Request.Headers["Authorization"];
            string token         = authorization.Substring("Bearer ".Length).Trim();

            Int16     userId = _userService.GetUserId(token);
            view_user user   = _contextForView.view_user.FirstOrDefault(x => x.id == userId);

            if (user == null)
            {
                throw new MindnoteException("你不是帳號的擁有者", HttpStatusCode.NotFound);
            }
            else
            {
                return(new
                {
                    username = user.username,
                    fullname = user.full_name,
                    email = user.email,
                    phone = user.phone,
                    is_subscribed = user.is_subscribed,
                    is_next_subscribe = user.is_next_subscribe
                });
            }
        }
        public ActionResult <dynamic> Unsubscribe()
        {
            string    authorization = Request.Headers["Authorization"];
            string    token         = authorization.Substring("Bearer ".Length).Trim();
            Int32     userId        = _userService.GetUserId(token);
            view_user user          = _contextForView.view_user.FirstOrDefault(x => x.id == userId);

            if (!user.is_subscribed)
            {
                throw new MindnoteException("痾~你好像不是訂閱用戶", HttpStatusCode.ExpectationFailed);
            }

            transaction existedTransaction = _context.transaction.FirstOrDefault(x => x.id == user.transaction_id);

            if (!existedTransaction.is_next_subscribe)
            {
                throw new MindnoteException("已經取消訂閱囉~下一期我們將停止扣款");
            }

            // transaction existedTransaction = new transaction { id = user.transaction_id ?? -1 };
            // _context.Attach<transaction>(existedTransaction);

            existedTransaction.is_next_subscribe = false;
            _context.SaveChanges();

            JSONResponse json = new JSONResponse(JSONResponseStatus.OK, new { });

            return(json.toResponseObj());
        }
        public ActionResult <board> PostBoard([FromBody] dynamic body)
        {
            string authorization = Request.Headers["Authorization"];
            string token         = authorization.Substring("Bearer ".Length).Trim();
            Int32  userId        = _userService.GetUserId(token);

            view_user user = _contextForView.view_user.FirstOrDefault(x => x.id == userId);

            if (user.board_count >= 2 && !user.is_subscribed)
            {
                // throw new MindnoteException("Add board deny, because free account only have two boards. If you need to create new board, join us just pay $3 per month to subscribe our service.", HttpStatusCode.ExpectationFailed);
                throw new MindnoteException("因為免費使用者只有兩個分類可以使用,所以新增分類失敗,如果你需要更多的分類來整理筆記,一個月只需要 $ 99 元,就能使用無限多的分類,請點擊這則訊息進入到付款流程。", HttpStatusCode.ExpectationFailed);
            }

            board newBoard = new board {
                title = body.title, uniquename = body.uniquename, owner_id = userId
            };

            _context.board.Add(newBoard);
            _context.SaveChanges();

            return(_context.board.SingleOrDefault(rec => rec.id == newBoard.id));
        }
Esempio n. 4
0
        public ActionResult <dynamic> PostImages([FromBody] dynamic requestBody)
        {
            string authorization = Request.Headers["Authorization"];
            string token         = authorization.Substring("Bearer ".Length).Trim();

            Int16     userId = _userService.GetUserId(token);
            view_user user   = _contextForView.view_user.FirstOrDefault(x => x.id == userId);

            if (user == null)
            {
                throw new MindnoteException("你不是帳號的擁有者", HttpStatusCode.NotFound);
            }
            GoogleCredential gc     = GoogleCredential.FromJson(_GCSCredential);
            StorageClient    client = StorageClient.Create(gc);

            for (int i = 0; i < requestBody.base64Files.Count; i++)
            {
                //check all file content type;
                string contentType = requestBody.base64Files[i].contentType.Value;
                if (!contentType.StartsWith("image/"))
                {
                    throw new MindnoteException("你上傳了非圖片的檔案");
                }
            }

            // post to gcs
            List <dynamic> result = new List <dynamic>();

            for (int i = 0; i < requestBody.base64Files.Count; i++)
            {
                //check all file content type;
                string  base64Data       = requestBody.base64Files[i].data.Value;
                string  contentType      = requestBody.base64Files[i].contentType.Value;
                string  clientSideFlagId = requestBody.base64Files[i].clientSideFlagId != null ? requestBody.base64Files[i].clientSideFlagId.Value : "";
                decimal width            = -1;
                if (requestBody.base64Files[i].width != null)
                {
                    width = (decimal)requestBody.base64Files[i].width.Value;
                }
                decimal height = -1;
                if (requestBody.base64Files[i].height != null)
                {
                    height = (decimal)requestBody.base64Files[i].height.Value;
                }

                int nodeId = -1;
                if (requestBody.base64Files[i].nodeId != null)
                {
                    nodeId = (int)requestBody.base64Files[i].nodeId.Value;
                }
                string extensionFilename = ".jpg";
                if (contentType == "image/jpg" || contentType == "image/jpeg")
                {
                    extensionFilename = ".jpg";
                }
                else if (contentType == "image/png")
                {
                    extensionFilename = ".png";
                }
                else if (contentType == "image/gif")
                {
                    extensionFilename = ".gif";
                }
                else if (contentType == "image/bmp")
                {
                    extensionFilename = ".bmp";
                }
                else
                {
                    extensionFilename = contentType.Replace("image/", "");
                }
                string id = Guid.NewGuid().ToString("N");

                MemoryStream stream = new MemoryStream(Convert.FromBase64String(base64Data));
                Decimal      size   = stream.Length;
                if ((user.storage_usage + size) / 1024 / 1024 > 200)
                {
                    throw new MindnoteException("上傳的圖片已經超過免費使用者的上限 (200 M),只要每月 99 元,就能享有 100 倍的上傳空間", HttpStatusCode.ExpectationFailed);
                }
                else if ((user.storage_usage + size) / 1024 / 1024 / 1024 > 20)
                {
                    throw new MindnoteException("上傳的圖片已經超過付費使用者的上限 (20 G),請聯繫管理員 [email protected]", HttpStatusCode.InternalServerError);
                }
                Google.Apis.Storage.v1.Data.Object resultFromGCS = client.UploadObject(_GCSBucketName, id + extensionFilename, contentType, stream, new UploadObjectOptions()
                {
                    UserProject = _GCPProjectId,
                });
                JSONResponseStatus status = JSONResponseStatus.OK;
                if (resultFromGCS.Name == null)
                {
                    status = JSONResponseStatus.FAILED;
                }

                dynamic resultItem = new ExpandoObject();
                resultItem.status           = Enum.GetName(typeof(JSONResponseStatus), status);
                resultItem.filename         = resultFromGCS.Name;
                resultItem.clientSideFlagId = clientSideFlagId ?? "";
                resultItem.nodeId           = nodeId;
                resultItem.size             = resultFromGCS.Size;
                resultItem.width            = width;
                resultItem.height           = height;

                result.Add(resultItem);
            }

            // check gcs result and save local db
            for (int i = 0; i < result.Count; i++)
            {
                if (result[i].status == Enum.GetName(typeof(JSONResponseStatus), JSONResponseStatus.OK))
                {
                    image image = new image
                    {
                        owner_id = userId,
                        filename = result[i].filename,
                        size     = result[i].size,
                    };
                    if (result[i].width != -1)
                    {
                        image.width = result[i].width;
                    }
                    if (result[i].height != -1)
                    {
                        image.height = result[i].height;
                    }

                    if (result[i].nodeId != -1)
                    {
                        image.node_id = result[i].nodeId;
                    }

                    result[i].imageContext = image;
                    _context.image.Add(image);
                }
            }
            _context.SaveChanges();

            return(result);
        }
        async public Task <dynamic> Checkout([FromBody] dynamic requestBody)
        {
            // initialize local transaction data
            string    authorization = Request.Headers["Authorization"];
            string    token         = authorization.Substring("Bearer ".Length).Trim();
            Int16     userId        = _userService.GetUserId(token);
            view_user view_user     = _contextForView.view_user.FirstOrDefault(x => x.id == userId);

            if (view_user.is_subscribed)
            {
                throw new MindnoteException("你已經是我們的訂閱用戶", HttpStatusCode.ExpectationFailed);
            }
            transaction newTransaction = null;

            try
            {
                if (requestBody.prime != null)
                {
                    newTransaction = new transaction
                    {
                        method      = Enum.GetName(typeof(TransactionMethod), TransactionMethod.TAP_PAY),
                        owner_id    = userId,
                        status      = Enum.GetName(typeof(TransactionStatus), TransactionStatus.PENDING),
                        phone       = requestBody.phone,
                        card_holder = requestBody.card_holder,
                        email       = requestBody.email,
                        amount      = 99
                    };
                    _context.transaction.Add(newTransaction);
                    _context.SaveChanges();
                }
            }
            catch (System.Exception ex)
            {
                throw new MindnoteException("交易失敗:" + ex.Message, HttpStatusCode.InternalServerError);
            }

            // send transaction data to tap pay
            HttpClient httpClient = new HttpClient();

            var postBody = new
            {
                prime       = requestBody.prime,
                partner_key = _tapPayPartnerKey,
                merchant_id = "hahow_CTBC",
                details     = "Mindnote Subscription",
                amount      = 99,
                cardholder  = new
                {
                    phone_number = requestBody.phone,
                    name         = requestBody.card_holder,
                    email        = requestBody.email
                },
                remember = true
            };

            httpClient.DefaultRequestHeaders.Add("x-api-key", _tapPayPartnerKey);
            StringContent       httpContent = new StringContent(Newtonsoft.Json.JsonConvert.SerializeObject(postBody), Encoding.UTF8, "application/json");
            HttpResponseMessage response    = await httpClient.PostAsync(_tapPayEndpoint, httpContent);

            string resultFromTapPay = await response.Content.ReadAsStringAsync();

            dynamic resultObjFromTapPay = Newtonsoft.Json.JsonConvert.DeserializeObject(resultFromTapPay);

            // update local transaction status
            user         user = _context.user.FirstOrDefault(x => x.id == userId);
            JSONResponse result;

            if ((int)response.StatusCode == StatusCodes.Status200OK)
            {
                newTransaction.raw_data = resultFromTapPay;
                if (resultObjFromTapPay.status == 0)
                {
                    newTransaction.status = Enum.GetName(typeof(TransactionStatus), TransactionStatus.PAID);
                }
                newTransaction.paid_at = DateTime.Now;
                user.phone             = requestBody.phone;
                user.full_name         = requestBody.card_holder;
                user.email             = requestBody.email;
                _context.SaveChanges();

                if (resultObjFromTapPay.status != 0)
                {
                    throw new MindnoteException(resultObjFromTapPay.msg.Value, HttpStatusCode.InternalServerError);
                }


                result = new JSONResponse(JSONResponseStatus.OK, new
                {
                    data = resultFromTapPay
                });
                return(result.toResponseObj());
            }
            else
            {
                result = new JSONResponse(JSONResponseStatus.FAILED, new
                {
                    data = response
                });
                return(result.toResponseObj());
            }
        }