From 6a590203b8055dc88f6f1381bdbbcd1c59d6d341 Mon Sep 17 00:00:00 2001 From: yoneyan Date: Mon, 1 Mar 2021 04:43:15 +0900 Subject: [PATCH] [fix] #28 #46 #48 #50 /[support] #31 --- pkg/api/core/group/info/v0/info.go | 2 - pkg/api/core/group/network/interface.go | 93 ++++++++++++----------- pkg/api/core/group/network/v0/admin.go | 1 - pkg/api/core/group/network/v0/check.go | 60 +++++++++++---- pkg/api/core/group/network/v0/ip.go | 9 ++- pkg/api/core/group/network/v0/jpnic.go | 34 +++++---- pkg/api/core/group/network/v0/network.go | 91 +++++++++++++--------- pkg/api/core/group/network/v0/update.go | 18 ----- pkg/api/store/group/network/v0/network.go | 26 +++++-- 9 files changed, 194 insertions(+), 140 deletions(-) diff --git a/pkg/api/core/group/info/v0/info.go b/pkg/api/core/group/info/v0/info.go index 58346289..542ee939 100644 --- a/pkg/api/core/group/info/v0/info.go +++ b/pkg/api/core/group/info/v0/info.go @@ -8,7 +8,6 @@ import ( "github.com/homenoc/dsbd-backend/pkg/api/core/group/network" "github.com/homenoc/dsbd-backend/pkg/api/core/token" dbNetwork "github.com/homenoc/dsbd-backend/pkg/api/store/group/network/v0" - "log" "net/http" ) @@ -46,7 +45,6 @@ func Get(c *gin.Context) { v6 = append(v6, tmpIP.IP) } } - log.Println(tmpNetwork.Connection) if len(tmpNetwork.Connection) > 0 { for _, tmpConnection := range tmpNetwork.Connection { if *tmpConnection.Open { diff --git a/pkg/api/core/group/network/interface.go b/pkg/api/core/group/network/interface.go index 16692efc..8ca197a1 100644 --- a/pkg/api/core/group/network/interface.go +++ b/pkg/api/core/group/network/interface.go @@ -8,41 +8,42 @@ import ( ) const ( - ID = 0 - GID = 1 - Org = 2 - Open = 3 - UpdateName = 100 - UpdateDate = 102 - UpdateRoute = 103 - UpdatePlan = 104 - UpdateGID = 104 - UpdateData = 105 - UpdateAll = 110 + ID = 0 + GID = 1 + Org = 2 + Open = 3 + SearchNumber = 4 + UpdateName = 100 + UpdateDate = 102 + UpdateRoute = 103 + UpdatePlan = 104 + UpdateGID = 104 + UpdateData = 105 + UpdateAll = 110 ) type Network struct { gorm.Model - GroupID uint `json:"group_id"` - NetworkType string `json:"network_type"` - Org string `json:"org"` - OrgEn string `json:"org_en"` - Postcode string `json:"postcode"` - Address string `json:"address"` - AddressEn string `json:"address_en"` - PI *bool `json:"pi"` - ASN string `json:"asn"` - RouteV4 string `json:"route_v4"` - RouteV6 string `json:"route_v6"` - V4Name string `json:"v4_name"` - V6Name string `json:"v6_name"` - IP []IP `json:"ip"` - Connection []connection.Connection `json:"connection"` - JPNICAdmin JPNICAdmin `json:"jpnic_admin"` - JPNICTech []JPNICTech `json:"jpnic_tech"` - Plan string `json:"plan"` - Open *bool `json:"open"` - Lock *bool `json:"lock"` + GroupID uint `json:"group_id"` + NetworkType string `json:"network_type"` + NetworkComment string `json:"network_comment"` + NetworkNumber uint `json:"network_number"` + Org string `json:"org"` + OrgEn string `json:"org_en"` + Postcode string `json:"postcode"` + Address string `json:"address"` + AddressEn string `json:"address_en"` + ASN string `json:"asn"` + RouteV4 string `json:"route_v4"` + RouteV6 string `json:"route_v6"` + V4Name string `json:"v4_name"` + V6Name string `json:"v6_name"` + IP []IP `json:"ip"` + Connection []connection.Connection `json:"connection"` + JPNICAdmin JPNICAdmin `json:"jpnic_admin"` + JPNICTech []JPNICTech `json:"jpnic_tech"` + Open *bool `json:"open"` + Lock *bool `json:"lock"` } type IP struct { @@ -73,20 +74,22 @@ type JPNICTech struct { } type Input struct { - AdminID uint `json:"admin_id"` - TechID []uint `json:"tech_id"` - GroupID uint `json:"group_id"` - Org string `json:"org"` - OrgEn string `json:"org_en"` - Postcode string `json:"postcode"` - Address string `json:"address"` - AddressEn string `json:"address_en"` - RouteV4 string `json:"route_v4"` - RouteV6 string `json:"route_v6"` - PI bool `json:"pi"` - ASN string `json:"asn"` - IP *[]IPInput `json:"ip"` - Lock bool `json:"lock"` + AdminID uint `json:"admin_id"` + TechID []uint `json:"tech_id"` + GroupID uint `json:"group_id"` + NetworkType string `json:"network_type"` + NetworkComment string `json:"network_comment"` + Org string `json:"org"` + OrgEn string `json:"org_en"` + Postcode string `json:"postcode"` + Address string `json:"address"` + AddressEn string `json:"address_en"` + RouteV4 string `json:"route_v4"` + RouteV6 string `json:"route_v6"` + PI bool `json:"pi"` //廃止予定 + ASN string `json:"asn"` + IP []IPInput `json:"ip"` + Lock bool `json:"lock"` } type IPInput struct { diff --git a/pkg/api/core/group/network/v0/admin.go b/pkg/api/core/group/network/v0/admin.go index 7763cdb5..6e107b05 100644 --- a/pkg/api/core/group/network/v0/admin.go +++ b/pkg/api/core/group/network/v0/admin.go @@ -76,7 +76,6 @@ func AddAdmin(c *gin.Context) { AddressEn: input.AddressEn, RouteV4: input.RouteV4, RouteV6: input.RouteV6, - PI: &[]bool{input.PI}[0], ASN: input.ASN, Open: &[]bool{false}[0], IP: *grpIP, diff --git a/pkg/api/core/group/network/v0/check.go b/pkg/api/core/group/network/v0/check.go index e5030399..16fb94dd 100644 --- a/pkg/api/core/group/network/v0/check.go +++ b/pkg/api/core/group/network/v0/check.go @@ -7,15 +7,8 @@ import ( ) func check(input network.Input) error { - // check - if input.RouteV4 == "" && input.RouteV6 == "" { - return fmt.Errorf("no data: route(v4 or v6)") - } - if input.PI { - if input.ASN == "" { - return fmt.Errorf("no data: ASN") - } - } else { + // L2,L3 Static, L3 BGP + if input.NetworkType == "2000" || input.NetworkType == "3S00" || input.NetworkType == "3B00" { if input.Org == "" { return fmt.Errorf("no data: Org") } @@ -31,22 +24,61 @@ func check(input network.Input) error { if input.AddressEn == "" { return fmt.Errorf("no data: Address(English)") } - if len(*input.IP) == 0 { + if len(input.IP) == 0 { + return fmt.Errorf("no data: ip address data") + } + if input.AdminID == 0 { + return fmt.Errorf("no data: admin user") + } + if len(input.TechID) == 0 { + return fmt.Errorf("no data: tech user") + } + // 3B00 Service Code + if input.NetworkType == "3B00" { + if input.RouteV4 == "" && input.RouteV6 == "" { + return fmt.Errorf("no data: route information") + } + } + + } else if input.NetworkType == "IP3B" { + if input.ASN == "" { + return fmt.Errorf("no data: ASN") + } + if len(input.IP) == 0 { return fmt.Errorf("no data: ip address data") } + if input.RouteV4 == "" && input.RouteV6 == "" { + return fmt.Errorf("no data: route(v4 or v6)") + } + if input.AdminID == 0 { + return fmt.Errorf("no data: admin user") + } + if len(input.TechID) == 0 { + return fmt.Errorf("no data: tech user") + } + //} else if input.NetworkType == "ET00" { + // if input.NetworkComment == "" { + // return fmt.Errorf("no data: comment") + // } + } else { + return fmt.Errorf("no data: invalid network type") } + return nil } -func ipCheck(ip network.IPInput) error { +func ipCheck(restrict bool, ip network.IPInput) error { nowTime := time.Now() if ip.Version != 4 && ip.Version != 6 { return fmt.Errorf("invalid ip version") } - if ip.Name == "" { - return fmt.Errorf("no network name") + // 厳格な場合 + if restrict { + if ip.Name == "" { + return fmt.Errorf("no network name") + } } startDate, _ := time.Parse("2006-01-02", ip.StartDate) @@ -65,7 +97,7 @@ func ipCheck(ip network.IPInput) error { if ip.IP == "" { return fmt.Errorf("invalid ipv4 address") } - if ip.Plan == nil { + if restrict && ip.Plan == nil { return fmt.Errorf("invalid plan data") } } diff --git a/pkg/api/core/group/network/v0/ip.go b/pkg/api/core/group/network/v0/ip.go index f3f2858b..7729cdb6 100644 --- a/pkg/api/core/group/network/v0/ip.go +++ b/pkg/api/core/group/network/v0/ip.go @@ -8,8 +8,12 @@ import ( func ipProcess(input network.Input) (*[]network.IP, error) { var net []network.IP - for _, tmpIP := range *input.IP { - if err := ipCheck(tmpIP); err != nil { + for _, tmpIP := range input.IP { + restrict := true + if input.NetworkType == "IP3B" { + restrict = false + } + if err := ipCheck(restrict, tmpIP); err != nil { return nil, err } @@ -30,6 +34,5 @@ func ipProcess(input network.Input) (*[]network.IP, error) { Open: &[]bool{false}[0], }) } - return &net, nil } diff --git a/pkg/api/core/group/network/v0/jpnic.go b/pkg/api/core/group/network/v0/jpnic.go index bdb3b663..cc7db602 100644 --- a/pkg/api/core/group/network/v0/jpnic.go +++ b/pkg/api/core/group/network/v0/jpnic.go @@ -5,6 +5,7 @@ import ( "github.com/homenoc/dsbd-backend/pkg/api/core/group/network" "github.com/homenoc/dsbd-backend/pkg/api/core/user" dbUser "github.com/homenoc/dsbd-backend/pkg/api/store/user/v0" + "log" ) type jpnicHandler struct { @@ -16,35 +17,42 @@ type jpnicHandler struct { } func (jpnic *jpnicHandler) jpnicProcess() error { + log.Println(jpnic) // 入力されたユーザのGroupIDを検索 resultGroupUser := dbUser.Get(user.GID, &user.User{GroupID: jpnic.groupID}) if resultGroupUser.Err != nil { return resultGroupUser.Err } + // 管理者連絡窓口 - if jpnic.groupID != 0 { - for _, tmpUser := range resultGroupUser.User { - if tmpUser.GroupID != jpnic.admin { - return fmt.Errorf("This user have no authorization. ") - } + for _, tmpUser := range resultGroupUser.User { + if tmpUser.ID == jpnic.admin { + jpnic.jpnicAdmin = &network.JPNICAdmin{UserID: jpnic.admin, Lock: &[]bool{true}[0]} + break } } - jpnicAdmin := network.JPNICAdmin{UserID: jpnic.admin} - jpnic.jpnicAdmin = &jpnicAdmin + + // groupIDに対してJPNICAdminが見つからなかった場合 + if jpnic.jpnicAdmin == nil { + return fmt.Errorf("This user have no authorization. ") + } // 技術連絡担当者 var jpnicTech []network.JPNICTech for _, tmpTechUserID := range jpnic.tech { // ユーザの権限確認 - if jpnic.groupID != 0 { - for _, tmpUser := range resultGroupUser.User { - if tmpUser.GroupID != tmpTechUserID { - return fmt.Errorf("This user have no authorization. ") - } + for _, tmpUser := range resultGroupUser.User { + if tmpUser.ID == tmpTechUserID { + jpnicTech = append(jpnicTech, network.JPNICTech{UserID: jpnic.admin, Lock: &[]bool{true}[0]}) + break } } - jpnicTech = append(jpnicTech, network.JPNICTech{UserID: jpnic.admin}) } + + if jpnicTech == nil { + return fmt.Errorf("This user have no authorization. ") + } + jpnic.jpnicTech = &jpnicTech return nil diff --git a/pkg/api/core/group/network/v0/network.go b/pkg/api/core/group/network/v0/network.go index 6f3871ae..49ae5901 100644 --- a/pkg/api/core/group/network/v0/network.go +++ b/pkg/api/core/group/network/v0/network.go @@ -42,14 +42,8 @@ func Add(c *gin.Context) { return } - // check lock - if *result.Group.Lock { - c.JSON(http.StatusForbidden, common.Error{Error: "Lock status"}) - return - } - // check json - if err := check(input); err != nil { + if err = check(input); err != nil { c.JSON(http.StatusBadRequest, group.Result{Error: err.Error()}) return } @@ -60,43 +54,73 @@ func Add(c *gin.Context) { return } - grpIP, err := ipProcess(input) - if err != nil { - log.Println(err) - c.JSON(http.StatusBadRequest, common.Error{Error: err.Error()}) - return + var grpIP *[]network.IP + + if !(input.NetworkType == "ET00") { + grpIP, err = ipProcess(input) + if err != nil { + log.Println(err) + c.JSON(http.StatusBadRequest, common.Error{Error: err.Error()}) + return + } + } else { + grpIP = nil } jh := jpnicHandler{ - admin: input.AdminID, tech: input.TechID, groupID: result.Group.ID, jpnicAdmin: nil, jpnicTech: nil, + admin: input.AdminID, + tech: input.TechID, + groupID: result.Group.ID, + jpnicAdmin: nil, + jpnicTech: nil, } - // PIアドレスではない場合、jpnic Processを実行 - if !input.PI { + // 2000,3S00,3B00の場合 + if input.NetworkType == "2000" || input.NetworkType == "3S00" || + input.NetworkType == "3B00" || input.NetworkType == "IP3B" { if err = jh.jpnicProcess(); err != nil { - log.Println(err) c.JSON(http.StatusBadRequest, common.Error{Error: err.Error()}) return } } + resultNetwork := dbNetwork.Get(network.SearchNumber, &network.Network{GroupID: result.Group.ID}) + if resultNetwork.Err != nil { + c.JSON(http.StatusBadRequest, common.Error{Error: resultNetwork.Err.Error()}) + return + } + var number uint = 1 + log.Println(resultNetwork.Network) + for _, tmp := range resultNetwork.Network { + if tmp.NetworkNumber >= 1 { + number = tmp.NetworkNumber + 1 + } + } + + if number >= 999 { + c.JSON(http.StatusInternalServerError, common.Error{Error: "error: over number"}) + return + } + // db create for network net, err := dbNetwork.Create(&network.Network{ - GroupID: result.Group.ID, - Org: input.Org, - OrgEn: input.OrgEn, - Postcode: input.Postcode, - Address: input.Address, - AddressEn: input.AddressEn, - RouteV4: input.RouteV4, - RouteV6: input.RouteV6, - PI: &[]bool{input.PI}[0], - ASN: input.ASN, - Open: &[]bool{false}[0], - IP: *grpIP, - JPNICAdmin: *jh.jpnicAdmin, - JPNICTech: *jh.jpnicTech, - Lock: &[]bool{input.Lock}[0], + GroupID: result.Group.ID, + NetworkType: input.NetworkType, + NetworkComment: input.NetworkComment, + NetworkNumber: number, + Org: input.Org, + OrgEn: input.OrgEn, + Postcode: input.Postcode, + Address: input.Address, + AddressEn: input.AddressEn, + RouteV4: input.RouteV4, + RouteV6: input.RouteV6, + ASN: input.ASN, + Open: &[]bool{false}[0], + IP: *grpIP, + JPNICAdmin: *jh.jpnicAdmin, + JPNICTech: *jh.jpnicTech, + Lock: &[]bool{true}[0], }) if err != nil { c.JSON(http.StatusInternalServerError, common.Error{Error: err.Error()}) @@ -139,11 +163,6 @@ func Update(c *gin.Context) { return } - //if !(result.Group.Status == 211 || result.Group.Status == 221) { - // c.JSON(http.StatusUnauthorized, common.Error{Error: "error: group status"}) - // return - //} - resultNetwork := dbNetwork.Get(network.ID, &network.Network{Model: gorm.Model{ID: input.ID}}) if resultNetwork.Err != nil { c.JSON(http.StatusInternalServerError, common.Error{Error: resultNetwork.Err.Error()}) diff --git a/pkg/api/core/group/network/v0/update.go b/pkg/api/core/group/network/v0/update.go index 136c4db7..346a82ee 100644 --- a/pkg/api/core/group/network/v0/update.go +++ b/pkg/api/core/group/network/v0/update.go @@ -40,11 +40,6 @@ func replaceNetwork(replace, input network.Network) network.Network { replace.RouteV6 = input.RouteV6 } - //PI - if input.PI != replace.PI { - replace.PI = input.PI - } - //Lock if input.Lock != replace.Lock { replace.Lock = input.Lock @@ -79,11 +74,6 @@ func replaceNetwork(replace, input network.Network) network.Network { // replace.Date = input.Date //} - //Plan - if input.Plan != "" { - replace.Plan = input.Plan - } - return replace } @@ -152,18 +142,10 @@ func replaceAdminNetwork(replace, input network.Network) network.Network { // replace.Date = input.Date //} - //Plan - if input.Plan != "" { - replace.Plan = input.Plan - } - // bool //Lock replace.Lock = input.Lock - //PI - replace.PI = input.PI - //Open replace.Open = input.Open diff --git a/pkg/api/store/group/network/v0/network.go b/pkg/api/store/group/network/v0/network.go index 39bdae8f..807668f3 100644 --- a/pkg/api/store/group/network/v0/network.go +++ b/pkg/api/store/group/network/v0/network.go @@ -42,12 +42,17 @@ func Update(base int, c network.Network) error { var result *gorm.DB - if network.UpdatePlan == base { - result = db.Model(&network.Network{Model: gorm.Model{ID: c.ID}}).Update(network.Network{Plan: c.Plan}) - } else if network.UpdateData == base { + if network.UpdateData == base { result = db.Model(&network.Network{Model: gorm.Model{ID: c.ID}}).Update(network.Network{ - Org: c.Org, OrgEn: c.OrgEn, Postcode: c.Postcode, Address: c.Address, AddressEn: c.AddressEn, - RouteV4: c.RouteV4, RouteV6: c.RouteV6, PI: c.PI, ASN: c.ASN, Plan: c.Plan}) + Org: c.Org, + OrgEn: c.OrgEn, + Postcode: c.Postcode, + Address: c.Address, + AddressEn: c.AddressEn, + RouteV4: c.RouteV4, + RouteV6: c.RouteV6, + ASN: c.ASN, + }) } else if network.UpdateRoute == base { result = db.Model(&network.Network{Model: gorm.Model{ID: c.ID}}).Update(network.Network{ RouteV4: c.RouteV4, RouteV6: c.RouteV6}) @@ -61,7 +66,6 @@ func Update(base int, c network.Network) error { Postcode: c.Postcode, Address: c.Address, AddressEn: c.AddressEn, - PI: c.PI, ASN: c.ASN, V4Name: c.V4Name, V6Name: c.V6Name, @@ -99,9 +103,15 @@ func Get(base int, data *network.Network) network.ResultDatabase { } else if base == network.GID { err = db.Preload("IP").Preload("Connection").Preload("JPNICAdmin").Preload("JPNICTech"). Where("group_id = ?", data.GroupID).Find(&networkStruct).Error + } else if base == network.SearchNumber { + err = db.Where("group_id = ?", data.GroupID).Find(&networkStruct).Error } else if base == network.Open { - err = db.Preload("IP", "open = 1").Preload("Connection", "open = 1").Preload("JPNICAdmin").Preload("JPNICTech"). - Where("group_id = ? AND open = ?", data.GroupID, true).Find(&networkStruct).Error + err = db.Where("group_id = ? AND open = ?", data.GroupID, true). + Preload("IP", "open = ?", true). + Preload("Connection", "open = ?", true). + Preload("JPNICAdmin"). + Preload("JPNICTech"). + Find(&networkStruct).Error } else { log.Println("base select error") return network.ResultDatabase{Err: fmt.Errorf("(%s)error: base select\n", time.Now())}