Skip to content

Commit

Permalink
update api of corp pdf
Browse files Browse the repository at this point in the history
  • Loading branch information
zengchen1024 committed Jan 10, 2021
1 parent b51ce31 commit aab5e2d
Show file tree
Hide file tree
Showing 12 changed files with 119 additions and 98 deletions.
2 changes: 1 addition & 1 deletion controllers/access-controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ import (
const (
PermissionOwnerOfOrg = "owner of org"
PermissionIndividualSigner = "individual signer"
PermissionCorporAdmin = "corporation administrator"
PermissionCorpAdmin = "corporation administrator"
PermissionEmployeeManager = "employee manager"
)

Expand Down
2 changes: 1 addition & 1 deletion controllers/auth_on_corp_manager.go
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@ func (this *CorporationManagerController) newAccessToken(linkID string, info *db
permission := ""
switch info.Role {
case dbmodels.RoleAdmin:
permission = PermissionCorporAdmin
permission = PermissionCorpAdmin
case dbmodels.RoleManager:
permission = PermissionEmployeeManager
}
Expand Down
2 changes: 1 addition & 1 deletion controllers/base-controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -209,7 +209,7 @@ func (this *baseController) newAccessController(permission string) *accessContro
acp = &acForCodePlatformPayload{}
case PermissionIndividualSigner:
acp = &acForCodePlatformPayload{}
case PermissionCorporAdmin:
case PermissionCorpAdmin:
acp = &acForCorpManagerPayload{}
case PermissionEmployeeManager:
acp = &acForCorpManagerPayload{}
Expand Down
2 changes: 1 addition & 1 deletion controllers/corporation-manager.go
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ func (this *CorporationManagerController) Prepare() {
// reset password of manager
this.apiPrepareWithAC(
&accessController{Payload: &acForCorpManagerPayload{}},
[]string{PermissionCorporAdmin, PermissionEmployeeManager},
[]string{PermissionCorpAdmin, PermissionEmployeeManager},
)
}
}
Expand Down
131 changes: 68 additions & 63 deletions controllers/corporation-pdf.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package controllers
import (
"fmt"
"io/ioutil"
"os"
"strings"

"github.com/opensourceways/app-cla-server/conf"
Expand All @@ -17,35 +18,68 @@ type CorporationPDFController struct {
}

func (this *CorporationPDFController) Prepare() {
if getRouterPattern(&this.Controller) == "/v1/corporation-pdf" {
if this.routerPattern() == "/v1/corporation-pdf" {
// admin reviews pdf
apiPrepare(&this.Controller, []string{PermissionCorporAdmin})
this.apiPrepare(PermissionCorpAdmin)
} else {
apiPrepare(&this.Controller, []string{PermissionOwnerOfOrg})
this.apiPrepare(PermissionOwnerOfOrg)
}
}

func (this *CorporationPDFController) downloadCorpPDF(linkID, corpEmail string) *failedApiResult {
dir := util.GenFilePath(conf.AppConfig.PDFOutDir, "tmp")
s := strings.ReplaceAll(util.EmailSuffix(corpEmail), ".", "_")
name := fmt.Sprintf("%s_%s_*.pdf", linkID, s)

f, err := ioutil.TempFile(dir, name)
if err != nil {
return newFailedApiResult(500, errSystemError, err)
}
defer func() {
f.Close()
os.Remove(f.Name())
}()

pdf, merr := models.DownloadCorporationSigningPDF(linkID, corpEmail)
if merr != nil {
if merr.IsErrorOf(models.ErrNoLinkOrUnuploaed) {
return newFailedApiResult(400, errUnuploaded, merr)
}
return parseModelError(merr)
}

if _, err = f.Write(*pdf); err != nil {
return newFailedApiResult(500, errSystemError, err)
}

this.downloadFile(f.Name())
return nil
}

// @Title Upload
// @Description upload pdf of corporation signing
// @Param :org_cla_id path string true "org cla id"
// @Param :email path string true "email of corp"
// @Success 204 {int} map
// @router /:org_cla_id/:email [patch]
// @router /:link_id/:email [patch]
func (this *CorporationPDFController) Upload() {
action := "upload corp's signing pdf"
sendResp := this.newFuncForSendingFailedResp(action)
orgCLAID := this.GetString(":org_cla_id")
linkID := this.GetString(":link_id")
corpEmail := this.GetString(":email")

_, statusCode, errCode, reason := canAccessOrgCLA(&this.Controller, orgCLAID)
if reason != nil {
this.sendFailedResponse(statusCode, errCode, reason, action)
pl, fr := this.tokenPayloadBasedOnCodePlatform()
if fr != nil {
this.sendFailedResultAsResp(fr, action)
return
}
if fr := pl.isOwnerOfLink(linkID); fr != nil {
this.sendFailedResultAsResp(fr, action)
return
}

b, merr := models.IsCorpSigned(orgCLAID, corpEmail)
b, merr := models.IsCorpSigned(linkID, corpEmail)
if merr != nil {
sendResp(parseModelError(merr))
this.sendModelErrorAsResp(merr, action)
return
}
if !b {
Expand All @@ -55,71 +89,45 @@ func (this *CorporationPDFController) Upload() {

data, fr := this.readInputFile("pdf")
if fr != nil {
sendResp(fr)
this.sendFailedResultAsResp(fr, action)
return
}
if len(data) > (2 << 20) {
this.sendFailedResponse(400, util.ErrInvalidParameter, fmt.Errorf("big pdf file"), action)
this.sendFailedResponse(400, errTooBigPDF, fmt.Errorf("big pdf file"), action)
return
}

if err := models.UploadCorporationSigningPDF(orgCLAID, corpEmail, &data); err != nil {
sendResp(convertDBError1(err))
if err := models.UploadCorporationSigningPDF(linkID, corpEmail, &data); err != nil {
this.sendModelErrorAsResp(err, action)
return
}

this.sendSuccessResp("upload pdf of signature page successfully")
}

func (this *CorporationPDFController) downloadCorpPDF(linkID, corpEmail string) *failedApiResult {
dir := util.GenFilePath(conf.AppConfig.PDFOutDir, "tmp")
s := strings.ReplaceAll(util.EmailSuffix(corpEmail), ".", "_")
name := fmt.Sprintf("%s_%s_*.pdf", linkID, s)

f, err := ioutil.TempFile(dir, name)
if err != nil {
return newFailedApiResult(500, util.ErrSystemError, err)
}

pdf, err := models.DownloadCorporationSigningPDF(linkID, corpEmail)
if err != nil {
return newFailedApiResult(500, util.ErrSystemError, err)
}

_, err = f.Write(*pdf)
if err != nil {
return newFailedApiResult(500, util.ErrSystemError, err)
}

downloadFile(&this.Controller, f.Name())
return nil
}

// @Title Download
// @Description download pdf of corporation signing
// @Param :org_cla_id path string true "org cla id"
// @Param :email path string true "email of corp"
// @Success 200 {int} map
// @router /:org_cla_id/:email [get]
// @router /:link_id/:email [get]
func (this *CorporationPDFController) Download() {
rs := func(statusCode int, errCode string, reason error) {
sendResponse(&this.Controller, statusCode, errCode, reason, nil, "download corp's signing pdf")
}
action := "download corp's signing pdf"
linkID := this.GetString(":link_id")
corpEmail := this.GetString(":email")

if err := checkAPIStringParameter(&this.Controller, []string{":org_cla_id", ":email"}); err != nil {
rs(400, util.ErrInvalidParameter, err)
pl, fr := this.tokenPayloadBasedOnCodePlatform()
if fr != nil {
this.sendFailedResultAsResp(fr, action)
return
}
orgCLAID := this.GetString(":org_cla_id")

_, statusCode, errCode, reason := canAccessOrgCLA(&this.Controller, orgCLAID)
if reason != nil {
rs(statusCode, errCode, reason)
if r := pl.isOwnerOfLink(linkID); r != nil {
this.sendFailedResponse(r.statusCode, r.errCode, r.reason, action)
return
}

if fr := this.downloadCorpPDF(orgCLAID, this.GetString(":email")); fr != nil {
rs(fr.statusCode, fr.errCode, fr.reason)
if fr := this.downloadCorpPDF(linkID, corpEmail); fr != nil {
this.sendFailedResultAsResp(fr, action)
}
}

Expand All @@ -128,19 +136,16 @@ func (this *CorporationPDFController) Download() {
// @Success 200 {int} map
// @router / [get]
func (this *CorporationPDFController) Review() {
rs := func(statusCode int, errCode string, reason error) {
sendResponse(&this.Controller, statusCode, errCode, reason, nil, "download corp's signing pdf")
}
action := "download corp's signing pdf"

var ac *acForCorpManagerPayload
ac, errCode, reason := getACOfCorpManager(&this.Controller)
if reason != nil {
rs(401, errCode, reason)
pl, fr := this.tokenPayloadBasedOnCorpManager()
if fr != nil {
this.sendFailedResultAsResp(fr, action)
return
}

if fr := this.downloadCorpPDF(ac.LinkID, ac.Email); fr != nil {
rs(fr.statusCode, fr.errCode, fr.reason)
if fr := this.downloadCorpPDF(pl.LinkID, pl.Email); fr != nil {
this.sendFailedResultAsResp(fr, action)
}
}

Expand All @@ -159,7 +164,7 @@ func (this *CorporationPDFController) Preview() {
sendResponse(&this.Controller, statusCode, errCode, reason, body, "preview the unsinged pdf of corp")
}()

orgCLAID, err := fetchStringParameter(&this.Controller, ":org_cla_id")
linkID, err := fetchStringParameter(&this.Controller, ":org_cla_id")
if err != nil {
reason = err
errCode = util.ErrInvalidParameter
Expand All @@ -168,7 +173,7 @@ func (this *CorporationPDFController) Preview() {
}

var orgCLA *models.OrgCLA
orgCLA, statusCode, errCode, reason = canAccessOrgCLA(&this.Controller, orgCLAID)
orgCLA, statusCode, errCode, reason = canAccessOrgCLA(&this.Controller, linkID)
if reason != nil {
return
}
Expand Down
2 changes: 1 addition & 1 deletion controllers/employee-manager.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ type EmployeeManagerController struct {
}

func (this *EmployeeManagerController) Prepare() {
this.apiPrepare(PermissionCorporAdmin)
this.apiPrepare(PermissionCorpAdmin)
}

// @Title Post
Expand Down
2 changes: 2 additions & 0 deletions controllers/error.go
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,8 @@ const (
errEmailIsUnauthorized = "email_is_unauthorized"
errUnkownPurposeForAuth = "unkown_purpose_for_auth"
errNotYoursOrg = "not_yours_org"
errUnuploaded = "unuploaded"
errTooBigPDF = "too_big_pdf"
)

func parseModelError(err models.IModelError) *failedApiResult {
Expand Down
2 changes: 1 addition & 1 deletion controllers/util.go
Original file line number Diff line number Diff line change
Expand Up @@ -153,7 +153,7 @@ func apiPrepare(c *beego.Controller, permission []string) {
acp = &acForCodePlatformPayload{}
case PermissionIndividualSigner:
acp = &acForCodePlatformPayload{}
case PermissionCorporAdmin:
case PermissionCorpAdmin:
acp = &acForCorpManagerPayload{}
case PermissionEmployeeManager:
acp = &acForCorpManagerPayload{}
Expand Down
8 changes: 4 additions & 4 deletions dbmodels/db.go
Original file line number Diff line number Diff line change
Expand Up @@ -30,10 +30,10 @@ type ICorporationSigning interface {
GetCorpSigningDetail(linkID, email string) (*CorpSigningCreateOpt, IDBError)
GetCorpSigningBasicInfo(linkID, email string) (*CorporationSigningBasicInfo, IDBError)

UploadCorporationSigningPDF(linkID string, adminEmail string, pdf *[]byte) error
DownloadCorporationSigningPDF(linkID string, email string) (*[]byte, error)
IsCorpSigningPDFUploaded(linkID string, email string) (bool, error)
ListCorpsWithPDFUploaded(linkID string) ([]string, error)
UploadCorporationSigningPDF(linkID string, adminEmail string, pdf *[]byte) IDBError
DownloadCorporationSigningPDF(linkID string, email string) (*[]byte, IDBError)
IsCorpSigningPDFUploaded(linkID string, email string) (bool, IDBError)
ListCorpsWithPDFUploaded(linkID string) ([]string, IDBError)
}

type ICorporationManager interface {
Expand Down
27 changes: 19 additions & 8 deletions models/corporation-signing.go
Original file line number Diff line number Diff line change
Expand Up @@ -42,20 +42,31 @@ func (this *CorporationSigningCreateOption) Create(orgCLAID string) IModelError
return parseDBError(err)
}

func UploadCorporationSigningPDF(linkID string, email string, pdf *[]byte) error {
return dbmodels.GetDB().UploadCorporationSigningPDF(linkID, email, pdf)
func UploadCorporationSigningPDF(linkID string, email string, pdf *[]byte) IModelError {
err := dbmodels.GetDB().UploadCorporationSigningPDF(linkID, email, pdf)
return parseDBError(err)
}

func DownloadCorporationSigningPDF(linkID string, email string) (*[]byte, error) {
return dbmodels.GetDB().DownloadCorporationSigningPDF(linkID, email)
func DownloadCorporationSigningPDF(linkID string, email string) (*[]byte, IModelError) {
v, err := dbmodels.GetDB().DownloadCorporationSigningPDF(linkID, email)
if err == nil {
return v, nil
}

if err.IsErrorOf(dbmodels.ErrNoDBRecord) {
return v, newModelError(ErrNoLinkOrUnuploaed, err)
}
return v, parseDBError(err)
}

func IsCorpSigningPDFUploaded(linkID string, email string) (bool, error) {
return dbmodels.GetDB().IsCorpSigningPDFUploaded(linkID, email)
func IsCorpSigningPDFUploaded(linkID string, email string) (bool, IModelError) {
v, err := dbmodels.GetDB().IsCorpSigningPDFUploaded(linkID, email)
return v, parseDBError(err)
}

func ListCorpsWithPDFUploaded(linkID string) ([]string, error) {
return dbmodels.GetDB().ListCorpsWithPDFUploaded(linkID)
func ListCorpsWithPDFUploaded(linkID string) ([]string, IModelError) {
v, err := dbmodels.GetDB().ListCorpsWithPDFUploaded(linkID)
return v, parseDBError(err)
}

func ListCorpSignings(linkID, language string) ([]dbmodels.CorporationSigningSummary, IModelError) {
Expand Down
1 change: 1 addition & 0 deletions models/error.go
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@ const (
ErrNoOrgSignature ModelErrCode = "missing_org_signature"
ErrMissgingCLA ModelErrCode = "missing_cla"
ErrNoLinkOrCLAExists ModelErrCode = "no_link_or_cla_exists"
ErrNoLinkOrUnuploaed ModelErrCode = "no_link_or_unuploaded"
)

type IModelError interface {
Expand Down
Loading

0 comments on commit aab5e2d

Please sign in to comment.