blob: b2f5dc5bd2dc667b99b295d00fb0e0fd3edd5d48 [file] [log] [blame]
package tc
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
import (
"time"
"github.com/apache/trafficcontrol/lib/go-tc/tovalidate"
"github.com/apache/trafficcontrol/lib/go-util"
validation "github.com/go-ozzo/ozzo-validation"
)
// AdminRoleName is the Name of the special "admin" Role.
//
// This Role must always exist; it cannot be modified or deleted, and is
// guaranteed to exist in all valid ATC environments.
const AdminRoleName = "admin"
// RoleV4 is an alias for the latest minor version for the major version 4.
type RoleV4 RoleV40
// RolesResponseV4 is a list of RoleV4 as a response.
type RolesResponseV4 struct {
Response []RoleV4 `json:"response"`
Alerts
}
// RoleResponseV4 is a RoleV4 as a response.
type RoleResponseV4 struct {
Response RoleV4 `json:"response"`
Alerts
}
// RoleV40 is the structure used to depict roles in API v4.0.
type RoleV40 struct {
Name string `json:"name" db:"name"`
Permissions []string `json:"permissions" db:"permissions"`
Description string `json:"description" db:"description"`
LastUpdated *time.Time `json:"lastUpdated,omitempty" db:"last_updated"`
}
// Validate will validate and make sure all that the fields in the supplied RoleV4 struct are semantically correct.
func (role RoleV4) Validate() error {
errs := validation.Errors{
"name": validation.Validate(role.Name, validation.Required),
"description": validation.Validate(role.Description, validation.Required),
}
return util.JoinErrs(tovalidate.ToErrors(errs))
}
// Upgrade will convert the passed in instance of Role struct into an instance of RoleV4 struct.
func (role Role) Upgrade() RoleV4 {
var roleV4 RoleV4
if role.Name != nil {
roleV4.Name = *role.Name
}
if role.Description != nil {
roleV4.Description = *role.Description
}
if role.Capabilities == nil {
roleV4.Permissions = nil
} else {
roleV4.Permissions = make([]string, len(*role.Capabilities))
copy(roleV4.Permissions, *role.Capabilities)
}
return roleV4
}
// Downgrade will convert the passed in instance of RoleV4 struct into an instance of Role struct.
func (role RoleV4) Downgrade() Role {
var downgraded Role
downgraded.Name = &role.Name
downgraded.Description = &role.Description
if len(role.Permissions) == 0 {
downgraded.Capabilities = nil
} else {
caps := make([]string, len(role.Permissions))
copy(caps, role.Permissions)
downgraded.Capabilities = &caps
}
return downgraded
}
// RolesResponse is a list of Roles as a response.
// swagger:response RolesResponse
// in: body
type RolesResponse struct {
// in: body
Response []Role `json:"response"`
Alerts
}
// RoleResponse is a single Role response for Update and Create to depict what
// changed.
// swagger:response RoleResponse
// in: body
type RoleResponse struct {
// in: body
Response Role `json:"response"`
Alerts
}
// A Role is a definition of the permissions afforded to a user with that Role.
type Role struct {
RoleV11
// Capabilities associated with the Role
//
// required: true
Capabilities *[]string `json:"capabilities" db:"-"`
}
// RoleV11 is a representation of a Role as it appeared in version 1.1 of the
// Traffic Ops API.
//
// Deprecated: Traffic Ops API version 1.1 no longer exists - the ONLY reason
// this structure still exists is because it is nested in newer structures - DO
// NOT USE THIS!
type RoleV11 struct {
// ID of the Role
//
// required: true
ID *int `json:"id" db:"id"`
// Name of the Role
//
// required: true
Name *string `json:"name" db:"name"`
// Description of the Role
//
// required: true
Description *string `json:"description" db:"description"`
// Priv Level of the Role
//
// required: true
PrivLevel *int `json:"privLevel" db:"priv_level"`
}