Skip to content

Commit

Permalink
Merge pull request #34 from gaetanfl/payment_data_sources
Browse files Browse the repository at this point in the history
Payment data sources
  • Loading branch information
yanndegat authored Jun 5, 2018
2 parents 4631eb4 + 73497ee commit bd505b6
Show file tree
Hide file tree
Showing 3 changed files with 291 additions and 0 deletions.
138 changes: 138 additions & 0 deletions ovh/data_source_ovh_bankaccount.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,138 @@
package ovh

import (
"fmt"
"regexp"
"sort"

"github.com/hashicorp/terraform/helper/schema"
)

type BankAccount struct {
Description string `json:"description"`
Default bool `json:"defaultPaymentMean"`
State string `json:"state"`
Id int `json:"id"`
ValidationDocumentLink string `json:"validationDocumentLink"`
UniqueReference string `json:"uniqueReference"`
CreationDate string `json:"creationDate"`
MandateSignatureDate string `json:"mandateSignatureDate"`
OwnerName string `json:"ownerName"`
OwnerAddress string `json:"ownerAddress"`
Iban string `json:"iban"`
Bic string `json:"bic"`
}

func dataSourceBankAccount() *schema.Resource {
return &schema.Resource{
Read: dataSourceBankAccountRead,
Schema: map[string]*schema.Schema{
"description_regexp": &schema.Schema{
Type: schema.TypeString,
ForceNew: true,
Optional: true,
Default: ".*",
},
"use_default": &schema.Schema{
Type: schema.TypeBool,
ForceNew: true,
Optional: true,
Default: false,
},
"use_oldest": &schema.Schema{
Type: schema.TypeBool,
ForceNew: true,
Optional: true,
Default: false,
},
"state": &schema.Schema{
Type: schema.TypeString,
Optional: true,
Computed: true,
},
// Computed
"description": &schema.Schema{
Type: schema.TypeString,
Computed: true,
},
"default": &schema.Schema{
Type: schema.TypeBool,
Computed: true,
},
},
}
}

func dataSourceBankAccountRead(d *schema.ResourceData, meta interface{}) error {
config := meta.(*Config)
state, state_ok := d.GetOk("state")
description_regexp := regexp.MustCompile(d.Get("description_regexp").(string))
use_oldest := d.Get("use_oldest").(bool)
use_default := d.Get("use_default").(bool)
var the_bank_account *BankAccount
var bank_account_ids []int
endpoint := "/me/paymentMean/bankAccount"
if state_ok {
endpoint = fmt.Sprintf("%s?state=%s", endpoint, state)
}
err := config.OVHClient.Get(
endpoint,
&bank_account_ids,
)

if err != nil {
return fmt.Errorf("Error getting Bank Account list:\n\t %q", err)
}
filtered_bank_accounts := []*BankAccount{}
for _, account_id := range bank_account_ids {
bank_account := BankAccount{}
err = config.OVHClient.Get(
fmt.Sprintf("/me/paymentMean/bankAccount/%d", account_id),
&bank_account,
)
if err != nil {
return fmt.Errorf("Error getting Bank Account %d:\n\t %q", account_id, err)
}
if use_default && bank_account.Default == false {
continue
}
if !description_regexp.MatchString(bank_account.Description) {
continue
}
filtered_bank_accounts = append(filtered_bank_accounts, &bank_account)
}
if len(filtered_bank_accounts) < 1 {
return fmt.Errorf("Your query returned no results. Please change your search criteria and try again.")
}
if len(filtered_bank_accounts) > 1 {
if use_oldest {
sort.Slice(filtered_bank_accounts, func(i, j int) bool {
return (*filtered_bank_accounts[i]).CreationDate < (*filtered_bank_accounts[j]).CreationDate
})
the_bank_account = filtered_bank_accounts[0]
}
if use_default {
match := false
for _, bank_account := range filtered_bank_accounts {
if (*bank_account).Default {
match = true
the_bank_account = bank_account
break
}
}
if match == false {
return fmt.Errorf("Your query returned no results. Please change your search criteria and try again.")
}
}
}
if len(filtered_bank_accounts) == 1 {
the_bank_account = filtered_bank_accounts[0]
}
// Set data
d.Set("description", (*the_bank_account).Description)
d.Set("state", (*the_bank_account).State)
d.Set("default", (*the_bank_account).Default)

d.SetId(fmt.Sprintf("%d", (*the_bank_account).Id))
return nil
}
151 changes: 151 additions & 0 deletions ovh/data_source_ovh_creditcard.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,151 @@
package ovh

import (
"fmt"
"regexp"
"sort"

"github.com/hashicorp/terraform/helper/schema"
)

type CreditCard struct {
Description string `json:"description"`
Number string `json:"number"`
Expiration string `json:"expirationDate"`
Default bool `json:"defaultPaymentMean"`
State string `json:"state"`
ThreeDSValidated bool `json:"threeDsValidated"`
Id int `json:"id"`
Type string `json:"type"`
}

func dataSourceCreditCard() *schema.Resource {
return &schema.Resource{
Read: dataSourceCreditCardRead,
Schema: map[string]*schema.Schema{
"description_regexp": &schema.Schema{
Type: schema.TypeString,
ForceNew: true,
Optional: true,
Default: ".*",
},
"use_default": &schema.Schema{
Type: schema.TypeBool,
ForceNew: true,
Optional: true,
Default: false,
},
"use_last_to_expire": &schema.Schema{
Type: schema.TypeBool,
ForceNew: true,
Optional: true,
Default: false,
},
"states": &schema.Schema{
Type: schema.TypeSet,
Elem: &schema.Schema{
Type: schema.TypeString,
},
Optional: true,
},
// Computed
"description": &schema.Schema{
Type: schema.TypeString,
Computed: true,
},
"state": &schema.Schema{
Type: schema.TypeString,
Computed: true,
},
"default": &schema.Schema{
Type: schema.TypeBool,
Computed: true,
},
},
}
}

func dataSourceCreditCardRead(d *schema.ResourceData, meta interface{}) error {
config := meta.(*Config)
states_val, states_ok := d.GetOk("states")
description_regexp := regexp.MustCompile(d.Get("description_regexp").(string))
use_last_to_expire := d.Get("use_last_to_expire").(bool)
use_default := d.Get("use_default").(bool)
var the_credit_card *CreditCard
var states []interface{}
if states_ok {
states = states_val.(*schema.Set).List()
}
var credit_card_ids []int
err := config.OVHClient.Get(
"/me/paymentMean/creditCard",
&credit_card_ids,
)

if err != nil {
return fmt.Errorf("Error getting Credit Cards list:\n\t %q", err)
}
filtered_credit_cards := []*CreditCard{}
for _, card_id := range credit_card_ids {
credit_card := CreditCard{}
err = config.OVHClient.Get(
fmt.Sprintf("/me/paymentMean/creditCard/%d", card_id),
&credit_card,
)
if err != nil {
return fmt.Errorf("Error getting Credit Card %d:\n\t %q", card_id, err)
}
if use_default && credit_card.Default == false {
continue
}
if states_ok {
match := false
for _, wanted_state := range states {
if credit_card.State == wanted_state {
match = true
break
}
}
if !match {
continue
}
}
if !description_regexp.MatchString(credit_card.Description) {
continue
}
filtered_credit_cards = append(filtered_credit_cards, &credit_card)
}
if len(filtered_credit_cards) < 1 {
return fmt.Errorf("Your query returned no results. Please change your search criteria and try again.")
}
if len(filtered_credit_cards) > 1 {
if use_last_to_expire {
sort.Slice(filtered_credit_cards, func(i, j int) bool {
return (*filtered_credit_cards[i]).Expiration > (*filtered_credit_cards[j]).Expiration
})
the_credit_card = filtered_credit_cards[0]
}
if use_default {
match := false
for _, credit_card := range filtered_credit_cards {
if (*credit_card).Default {
match = true
the_credit_card = credit_card
break
}
}
if match == false {
return fmt.Errorf("Your query returned no results. Please change your search criteria and try again.")
}
}
}
if len(filtered_credit_cards) == 1 {
the_credit_card = filtered_credit_cards[0]
}
// Set data
d.Set("description", (*the_credit_card).Description)
d.Set("state", (*the_credit_card).State)
d.Set("default", (*the_credit_card).Default)
d.SetId(fmt.Sprintf("%d", (*the_credit_card).Id))
return nil
}
2 changes: 2 additions & 0 deletions ovh/provider.go
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,8 @@ func Provider() terraform.ResourceProvider {
// New naming schema (issue #23)
"ovh_cloud_region": dataSourcePublicCloudRegion(),
"ovh_cloud_regions": dataSourcePublicCloudRegions(),
"ovh_credit_card": dataSourceCreditCard(),
"ovh_bank_account": dataSourceBankAccount(),
// Legacy naming schema (new datasources should not be added here)
"ovh_publiccloud_region": dataSourcePublicCloudRegion(),
"ovh_publiccloud_regions": dataSourcePublicCloudRegions(),
Expand Down

0 comments on commit bd505b6

Please sign in to comment.